Eu tenho dois pl.DataFrame
s:
from datetime import date
import polars as pl
df1 = pl.DataFrame(
{
"symbol": [
"sec1", "sec1", "sec1", "sec1", "sec1", "sec1",
"sec2", "sec2", "sec2", "sec2", "sec2",
],
"date": [
date(2021, 9, 14),
date(2021, 9, 15),
date(2021, 9, 16),
date(2021, 9, 17),
date(2021, 8, 31),
date(2020, 12, 31),
date(2021, 9, 14),
date(2021, 9, 15),
date(2021, 8, 31),
date(2021, 12, 30),
date(2020, 12, 31),
],
"price": range(11),
}
)
df2 = pl.DataFrame(
{
"symbol": ["sec1", "sec2"],
"current_date": [date(2021, 9, 17), date(2021, 9, 15)],
"mtd": [date(2021, 8, 31), date(2021, 8, 31)],
"ytd": [date(2020, 12, 31), date(2020, 12, 30)],
}
)
with pl.Config(tbl_rows=-1):
print(df1)
print(df2)
shape: (11, 3)
┌────────┬────────────┬───────┐
│ symbol ┆ date ┆ price │
│ --- ┆ --- ┆ --- │
│ str ┆ date ┆ i64 │
╞════════╪════════════╪═══════╡
│ sec1 ┆ 2021-09-14 ┆ 0 │
│ sec1 ┆ 2021-09-15 ┆ 1 │
│ sec1 ┆ 2021-09-16 ┆ 2 │
│ sec1 ┆ 2021-09-17 ┆ 3 │
│ sec1 ┆ 2021-08-31 ┆ 4 │
│ sec1 ┆ 2020-12-31 ┆ 5 │
│ sec2 ┆ 2021-09-14 ┆ 6 │
│ sec2 ┆ 2021-09-15 ┆ 7 │
│ sec2 ┆ 2021-08-31 ┆ 8 │
│ sec2 ┆ 2021-12-30 ┆ 9 │
│ sec2 ┆ 2020-12-31 ┆ 10 │
└────────┴────────────┴───────┘
shape: (2, 4)
┌────────┬──────────────┬────────────┬────────────┐
│ symbol ┆ current_date ┆ mtd ┆ ytd │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ date ┆ date ┆ date │
╞════════╪══════════════╪════════════╪════════════╡
│ sec1 ┆ 2021-09-17 ┆ 2021-08-31 ┆ 2020-12-31 │
│ sec2 ┆ 2021-09-15 ┆ 2021-08-31 ┆ 2020-12-30 │
└────────┴──────────────┴────────────┴────────────┘
Preciso filtrar os preços de df1
para cada grupo com as respectivas datas de df2
. Preciso incorporar todas as colunas do tipo date
. O número dessas colunas em df2
pode não ser fixo.
Estou procurando o seguinte resultado:
shape: (11, 3)
┌────────┬────────────┬───────┐
│ symbol ┆ date ┆ price │
│ --- ┆ --- ┆ --- │
│ str ┆ date ┆ i64 │
╞════════╪════════════╪═══════╡
│ sec1 ┆ 2021-09-17 ┆ 3 │
│ sec1 ┆ 2021-08-31 ┆ 4 │
│ sec1 ┆ 2020-12-31 ┆ 5 │
│ sec2 ┆ 2021-09-15 ┆ 7 │
│ sec2 ┆ 2021-08-31 ┆ 8 │
│ sec2 ┆ 2020-12-30 ┆ 9 │
└────────┴────────────┴───────┘
Eu estava pensando em filtrar df1
por symbol
e então fazer uma operação de junção para cada date
coluna individual de df2
. Eu então concatenaria os dataframes resultantes. No entanto, provavelmente há uma solução muito mais elegante.
Você pode
unpivot
, entãojoin
:Saída: