Tenho um número variável de pl.DataFrames
que compartilham algumas colunas (por exemplo, symbol
e date
). Cada um pl.DataFrame
tem um número de colunas adicionais, que não são importantes para a tarefa real.
As symbol
colunas têm exatamente o mesmo conteúdo (os str
valores diferentes existem em cada dataframe). As date
colunas são um pouco diferentes na forma como não têm exatamente as mesmas datas em cada pl.DataFrame
.
A tarefa real é encontrar as datas comuns por agrupamento (ou seja, symbol
) e filtrar cada uma pl.DataFrame
adequadamente.
Aqui estão três exemplos pl.DataFrame
:
import polars as pl
df1 = pl.DataFrame(
{
"symbol": ["AAPL"] * 4 + ["GOOGL"] * 3,
"date": [
"2023-01-01", "2023-01-02", "2023-01-03", "2023-01-04",
"2023-01-02", "2023-01-03", "2023-01-04",
],
"some_other_col": range(7),
}
)
df2 = pl.DataFrame(
{
"symbol": ["AAPL"] * 3 + ["GOOGL"] * 5,
"date": [
"2023-01-02", "2023-01-03", "2023-01-04",
"2023-01-01", "2023-01-02", "2023-01-03", "2023-01-04", "2023-01-05",
],
"another_col": range(8),
}
)
df3 = pl.DataFrame(
{
"symbol": ["AAPL"] * 4 + ["GOOGL"] * 2,
"date": [
"2023-01-02", "2023-01-03", "2023-01-04", "2023-01-05",
"2023-01-03", "2023-01-04",
],
"some_col": range(6),
}
)
DataFrame 1:
shape: (7, 3)
┌────────┬────────────┬────────────────┐
│ symbol ┆ date ┆ some_other_col │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞════════╪════════════╪════════════════╡
│ AAPL ┆ 2023-01-01 ┆ 0 │
│ AAPL ┆ 2023-01-02 ┆ 1 │
│ AAPL ┆ 2023-01-03 ┆ 2 │
│ AAPL ┆ 2023-01-04 ┆ 3 │
│ GOOGL ┆ 2023-01-02 ┆ 4 │
│ GOOGL ┆ 2023-01-03 ┆ 5 │
│ GOOGL ┆ 2023-01-04 ┆ 6 │
└────────┴────────────┴────────────────┘
DataFrame 2:
shape: (8, 3)
┌────────┬────────────┬─────────────┐
│ symbol ┆ date ┆ another_col │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞════════╪════════════╪═════════════╡
│ AAPL ┆ 2023-01-02 ┆ 0 │
│ AAPL ┆ 2023-01-03 ┆ 1 │
│ AAPL ┆ 2023-01-04 ┆ 2 │
│ GOOGL ┆ 2023-01-01 ┆ 3 │
│ GOOGL ┆ 2023-01-02 ┆ 4 │
│ GOOGL ┆ 2023-01-03 ┆ 5 │
│ GOOGL ┆ 2023-01-04 ┆ 6 │
│ GOOGL ┆ 2023-01-05 ┆ 7 │
└────────┴────────────┴─────────────┘
DataFrame 3:
shape: (6, 3)
┌────────┬────────────┬──────────┐
│ symbol ┆ date ┆ some_col │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞════════╪════════════╪══════════╡
│ AAPL ┆ 2023-01-02 ┆ 0 │
│ AAPL ┆ 2023-01-03 ┆ 1 │
│ AAPL ┆ 2023-01-04 ┆ 2 │
│ AAPL ┆ 2023-01-05 ┆ 3 │
│ GOOGL ┆ 2023-01-03 ┆ 4 │
│ GOOGL ┆ 2023-01-04 ┆ 5 │
└────────┴────────────┴──────────┘
Agora, o primeiro passo seria encontrar as datas comuns para cada symbol
.
AAPL: ["2023-01-02", "2023-01-03", "2023-01-04"]
GOOGL:["2023-01-03", "2023-01-04"]
Isso significa que cada um pl.DataFrame
precisa ser filtrado adequadamente. O resultado esperado se parece com isso:
DataFrame 1 filtered:
shape: (5, 3)
┌────────┬────────────┬────────────────┐
│ symbol ┆ date ┆ some_other_col │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞════════╪════════════╪════════════════╡
│ AAPL ┆ 2023-01-02 ┆ 1 │
│ AAPL ┆ 2023-01-03 ┆ 2 │
│ AAPL ┆ 2023-01-04 ┆ 3 │
│ GOOGL ┆ 2023-01-03 ┆ 5 │
│ GOOGL ┆ 2023-01-04 ┆ 6 │
└────────┴────────────┴────────────────┘
DataFrame 2 filtered:
shape: (5, 3)
┌────────┬────────────┬─────────────┐
│ symbol ┆ date ┆ another_col │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞════════╪════════════╪═════════════╡
│ AAPL ┆ 2023-01-02 ┆ 0 │
│ AAPL ┆ 2023-01-03 ┆ 1 │
│ AAPL ┆ 2023-01-04 ┆ 2 │
│ GOOGL ┆ 2023-01-03 ┆ 5 │
│ GOOGL ┆ 2023-01-04 ┆ 6 │
└────────┴────────────┴─────────────┘
DataFrame 3 filtered:
shape: (5, 3)
┌────────┬────────────┬──────────┐
│ symbol ┆ date ┆ some_col │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞════════╪════════════╪══════════╡
│ AAPL ┆ 2023-01-02 ┆ 0 │
│ AAPL ┆ 2023-01-03 ┆ 1 │
│ AAPL ┆ 2023-01-04 ┆ 2 │
│ GOOGL ┆ 2023-01-03 ┆ 4 │
│ GOOGL ┆ 2023-01-04 ┆ 5 │
└────────┴────────────┴──────────┘
Você pode encontrar a intersecção com junções:
E use
join
novamente para "filtrar":Você pode usar
pl.DataFrame.join()
comhow="semi
o parâmetro ":Ou você provavelmente poderia generalizar um pouco: