новичок в Polars, прошу помощи в понимании того, почему часть композиции функции для выражения в приведенном ниже фрагменте .with_columns() должна выполняться именно в этом конкретном порядке.
В частности, я не понимаю, почему необходим вызов .first() и (учитывая, что он кажется необходимым), почему он должен идти перед вызовом .over("instance").
(Цель кода — вычислить коэффициент, на который значение каждого экземпляра отличается от значения того же экземпляра в категории A; да, результат не имеет значения для строк в категории A.)
Для изучения я попробовал изменить порядок на [...].over("instance").first()[...], который мне кажется более интуитивным, но затем получил ShapeError. Я также попробовал .item() вместо .first(), что кажется лучше, поскольку гарантирует, что существует только одно значение - гарантия, которую мне бы хотелось иметь - но, к сожалению, .item() можно вызывать только в DataFrame, а не внутри выражения. (Есть ли способ включить такую гарантию «встроенно» в выражение?) Я прочитал документацию по каждой из функций, но у меня возникли проблемы с концептуальным объединением всего этого.
новичок в Polars, прошу помощи в понимании того, почему часть композиции функции для выражения в приведенном ниже фрагменте .with_columns() должна выполняться именно в этом конкретном порядке. В частности, я не понимаю, почему необходим вызов .first() и (учитывая, что он кажется необходимым), почему он должен идти перед вызовом .over("instance"). (Цель кода — вычислить коэффициент, на который значение каждого экземпляра отличается от значения того же экземпляра в категории A; да, результат не имеет значения для строк в категории A.) [code]>>> df = pl.DataFrame({"category": ["A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D"], "instance": [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4], "value": [7,444,0,99,50,60,70,80,90,80,70,60,50,60,70,80]}) >>> df shape: (16, 3) ┌──────────┬──────────┬───────┐ │ category ┆ instance ┆ value │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞══════════╪══════════╪═══════╡ │ A ┆ 1 ┆ 7 │ │ A ┆ 2 ┆ 444 │ │ A ┆ 3 ┆ 0 │ │ A ┆ 4 ┆ 99 │ │ B ┆ 1 ┆ 50 │ │ B ┆ 2 ┆ 60 │ │ B ┆ 3 ┆ 70 │ │ B ┆ 4 ┆ 80 │ │ C ┆ 1 ┆ 90 │ │ C ┆ 2 ┆ 80 │ │ C ┆ 3 ┆ 70 │ │ C ┆ 4 ┆ 60 │ │ D ┆ 1 ┆ 50 │ │ D ┆ 2 ┆ 60 │ │ D ┆ 3 ┆ 70 │ │ D ┆ 4 ┆ 80 │ └──────────┴──────────┴───────┘ >>> df.with_columns( ... ( ... pl.col("value") ... .filter(pl.col("category") == "A") ... .first() ... .over("instance") ... / pl.col("value") ... ).alias("factor") ... ) shape: (16, 4) ┌──────────┬──────────┬───────┬──────────┐ │ category ┆ instance ┆ value ┆ factor │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ f64 │ ╞══════════╪══════════╪═══════╪══════════╡ │ A ┆ 1 ┆ 7 ┆ 1.0 │ │ A ┆ 2 ┆ 444 ┆ 1.0 │ │ A ┆ 3 ┆ 0 ┆ NaN │ │ A ┆ 4 ┆ 99 ┆ 1.0 │ │ B ┆ 1 ┆ 50 ┆ 0.14 │ │ B ┆ 2 ┆ 60 ┆ 7.4 │ │ B ┆ 3 ┆ 70 ┆ 0.0 │ │ B ┆ 4 ┆ 80 ┆ 1.2375 │ │ C ┆ 1 ┆ 90 ┆ 0.077778 │ │ C ┆ 2 ┆ 80 ┆ 5.55 │ │ C ┆ 3 ┆ 70 ┆ 0.0 │ │ C ┆ 4 ┆ 60 ┆ 1.65 │ │ D ┆ 1 ┆ 50 ┆ 0.14 │ │ D ┆ 2 ┆ 60 ┆ 7.4 │ │ D ┆ 3 ┆ 70 ┆ 0.0 │ │ D ┆ 4 ┆ 80 ┆ 1.2375 │ └──────────┴──────────┴───────┴──────────┘ >>> [/code] Для изучения я попробовал изменить порядок на [...].over("instance").first()[...], который мне кажется более интуитивным, но затем получил ShapeError. Я также попробовал .item() вместо .first(), что кажется лучше, поскольку гарантирует, что существует только одно значение - гарантия, которую мне бы хотелось иметь - но, к сожалению, .item() можно вызывать только в DataFrame, а не внутри выражения. (Есть ли способ включить такую гарантию «встроенно» в выражение?) Я прочитал документацию по каждой из функций, но у меня возникли проблемы с концептуальным объединением всего этого.