polars.align_frames
-
Выровнять последовательность фреймов, используя общие значения одного или нескольких столбцов в качестве ключа.
Во фреймы, не содержащие заданные значения ключа, добавляются строки (в неключевых столбцах заполняемые значениями null), после чего каждый результирующий фрейм сортируется по ключу.
Исходный порядок столбцов входных фреймов не меняется, если не указано
select(в этом случае итоговый порядок столбцов определяется этим параметром). Если имеются дублирующиеся значения ключа, поведение выравнивания определяется заданной стратегией выравнивания в параметреhow(по умолчанию используется полное внешнее соединение, но если ваши данные подходят для этого, можно значительно ускорить работу, задавhow="left").Обратите внимание: эта функция не создает объединенный фрейм — в результате вы получаете столько же фреймов, сколько передали, но теперь каждый из них выровнен по ключу и содержит одинаковое количество строк.
- Параметры:
-
- frames
-
Последовательность DataFrame или LazyFrame.
- on
-
Один или несколько столбцов, уникальные значения которых будут использоваться для выравнивания фреймов.
- select
-
Необязательный выбор столбцов после выравнивания, позволяющий ограничить и/или задать порядок столбцов в возвращаемых выровненных фреймах.
- descending
-
Сортировать значения столбцов выравнивания по убыванию; может быть одним логическим значением или списком логических значений, соответствующих каждому столбцу в
on. - how
-
По умолчанию значения для выравнивания строк определяются с помощью стратегии полного внешнего соединения для всех фреймов; если известно, что первый фрейм содержит все необходимые ключи, можно задать
how="left", чтобы значительно повысить производительность.
Примеры
>>> from datetime import date >>> df1 = pl.DataFrame( ... { ... "dt": [date(2022, 9, 1), date(2022, 9, 2), date(2022, 9, 3)], ... "x": [3.5, 4.0, 1.0], ... "y": [10.0, 2.5, 1.5], ... } ... ) >>> df2 = pl.DataFrame( ... { ... "dt": [date(2022, 9, 2), date(2022, 9, 3), date(2022, 9, 1)], ... "x": [8.0, 1.0, 3.5], ... "y": [1.5, 12.0, 5.0], ... } ... ) >>> df3 = pl.DataFrame( ... { ... "dt": [date(2022, 9, 3), date(2022, 9, 2)], ... "x": [2.0, 5.0], ... "y": [2.5, 2.0], ... } ... ) >>> pl.Config.set_tbl_formatting("UTF8_FULL") # # df1 df2 df3 # shape: (3, 3) shape: (3, 3) shape: (2, 3) # ┌────────────┬─────┬──────┐ ┌────────────┬─────┬──────┐ ┌────────────┬─────┬─────┐ # │ dt ┆ x ┆ y │ │ dt ┆ x ┆ y │ │ dt ┆ x ┆ y │ # │ --- ┆ --- ┆ --- │ │ --- ┆ --- ┆ --- │ │ --- ┆ --- ┆ --- │ # │ date ┆ f64 ┆ f64 │ │ date ┆ f64 ┆ f64 │ │ date ┆ f64 ┆ f64 │ # ╞════════════╪═════╪══════╡ ╞════════════╪═════╪══════╡ ╞════════════╪═════╪═════╡ # │ 2022-09-01 ┆ 3.5 ┆ 10.0 │\ ,->│ 2022-09-02 ┆ 8.0 ┆ 1.5 │\ ,->│ 2022-09-03 ┆ 2.0 ┆ 2.5 │ # ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ \/ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ \/ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌┤ # │ 2022-09-02 ┆ 4.0 ┆ 2.5 │_/\,->│ 2022-09-03 ┆ 1.0 ┆ 12.0 │_/`-->│ 2022-09-02 ┆ 5.0 ┆ 2.0 │ # ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ /\ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ └────────────┴─────┴─────┘ # │ 2022-09-03 ┆ 1.0 ┆ 1.5 │_/ `>│ 2022-09-01 ┆ 3.5 ┆ 5.0 │-//- # └────────────┴─────┴──────┘ └────────────┴─────┴──────┘ ...Выровнять фреймы по столбцу «dt»:
>>> af1, af2, af3 = pl.align_frames( ... df1, df2, df3, on="dt" ... ) # # df1 df2 df3 # shape: (3, 3) shape: (3, 3) shape: (3, 3) # ┌────────────┬─────┬──────┐ ┌────────────┬─────┬──────┐ ┌────────────┬──────┬──────┐ # │ dt ┆ x ┆ y │ │ dt ┆ x ┆ y │ │ dt ┆ x ┆ y │ # │ --- ┆ --- ┆ --- │ │ --- ┆ --- ┆ --- │ │ --- ┆ --- ┆ --- │ # │ date ┆ f64 ┆ f64 │ │ date ┆ f64 ┆ f64 │ │ date ┆ f64 ┆ f64 │ # ╞════════════╪═════╪══════╡ ╞════════════╪═════╪══════╡ ╞════════════╪══════╪══════╡ # │ 2022-09-01 ┆ 3.5 ┆ 10.0 │----->│ 2022-09-01 ┆ 3.5 ┆ 5.0 │----->│ 2022-09-01 ┆ null ┆ null │ # ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤ # │ 2022-09-02 ┆ 4.0 ┆ 2.5 │----->│ 2022-09-02 ┆ 8.0 ┆ 1.5 │----->│ 2022-09-02 ┆ 5.0 ┆ 2.0 │ # ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤ # │ 2022-09-03 ┆ 1.0 ┆ 1.5 │----->│ 2022-09-03 ┆ 1.0 ┆ 12.0 │----->│ 2022-09-03 ┆ 2.0 ┆ 2.5 │ # └────────────┴─────┴──────┘ └────────────┴─────┴──────┘ └────────────┴──────┴──────┘ ...
Выровнять фреймы по «dt» с помощью выравнивания «left», оставив только столбцы «x» и «y»:
>>> af1, af2, af3 = pl.align_frames( ... df1, df2, df3, on="dt", select=["x", "y"], how="left" ... ) # # af1 af2 af3 # shape: (3, 3) shape: (3, 3) shape: (3, 3) # ┌─────┬──────┐ ┌─────┬──────┐ ┌──────┬──────┐ # │ x ┆ y │ │ x ┆ y │ │ x ┆ y │ # │ --- ┆ --- │ │ --- ┆ --- │ │ --- ┆ --- │ # │ f64 ┆ f64 │ │ f64 ┆ f64 │ │ f64 ┆ f64 │ # ╞═════╪══════╡ ╞═════╪══════╡ ╞══════╪══════╡ # │ 3.5 ┆ 10.0 │ │ 3.5 ┆ 5.0 │ │ null ┆ null │ # ├╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤ # │ 4.0 ┆ 2.5 │ │ 8.0 ┆ 1.5 │ │ 5.0 ┆ 2.0 │ # ├╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌┼╌╌╌╌╌╌┤ ├╌╌╌╌╌╌┼╌╌╌╌╌╌┤ # │ 1.0 ┆ 1.5 │ │ 1.0 ┆ 12.0 │ │ 2.0 ┆ 2.5 │ # └─────┴──────┘ └─────┴──────┘ └──────┴──────┘ ...
Теперь данные выровнены, и можно легко вычислить скалярное произведение построчно:
>>> (af1 * af2 * af3).fill_null(0).select(pl.sum_horizontal("*").alias("dot")) shape: (3, 1) ┌───────┐ │ dot │ │ --- │ │ f64 │ ╞═══════╡ │ 0.0 │ ├╌╌╌╌╌╌╌┤ │ 167.5 │ ├╌╌╌╌╌╌╌┤ │ 47.0 │ └───────┘
polars.align_frames(
*frames: FrameType | Iterable[FrameType],
on: str | Expr | Sequence[str] | Sequence[Expr] | Sequence[str | Expr],
how: JoinStrategy = 'full',
select: str | Expr | Sequence[str | Expr] | None = None,
descending: bool | Sequence[bool] = False,
) → list[FrameType]
© 2020 Ritchie Vink
© 2022 Polars contributors
Licensed under the MIT License.
https://docs.pola.rs/api/python/stable/reference/api/polars.align_frames.html