我有一个框架(事件),我想加入到另一个框架(fr),加入日期和符号.不一定有任何日期重叠.事件中的日期将仅与fr中相同或更晚日期的首次发生匹配,因此如果事件日期为2010—12—01,则将在相同日期加入,如果不存在,则将在下一个可用日期(2010—12—02)加入.

我已经try 使用search_sorted和join_asof来完成这一点,但我想按Symbol列分组,而且这不是一个正确的连接.这只适用于单个符号.

fr = pl.DataFrame(
    {
        'Symbol': ['A']*5,
        'Date': ['2010-08-29', '2010-09-01', '2010-09-05',
                 '2010-11-30', '2010-12-02'],
    }
).with_columns(pl.col('Date').str.strptime(pl.Date, '%Y-%m-%d')).with_row_index().set_sorted("Date")

events = pl.DataFrame(
    {
         'Symbol': ['A']*3,
         'Earnings_Date': ['2010-06-01', '2010-09-01', '2010-12-01'],
         'Event': [1, 4, 7],
     }
).with_columns(pl.col('Earnings_Date').str.strptime(pl.Date, '%Y-%m-%d')).set_sorted("Earnings_Date")

idx = fr["Date"].search_sorted(events["Earnings_Date"], "left")

fr = fr.with_columns(
    pl.when(
        pl.col("index").is_in(idx)
    )
    .then(True)
    .otherwise(False)
    .alias("Earnings")
)

fr = fr.join_asof(events, by="Symbol", left_on="Date", right_on="Earnings_Date")
fr = fr.with_columns(
    pl.when(
       pl.col("Earnings") == True
    )
    .then(pl.col("Event"))
    .otherwise(False)
    .alias("Event")
)

推荐答案

这听起来像你在正确的轨道上使用pl.DataFrame.join_asof.为了按符号分组,可以使用by参数.

(
    fr
    .join_asof(
        events,
        left_on="Date", right_on="Earnings_Date",
        by="Symbol",
    )
)
shape: (5, 5)
┌───────┬────────┬────────────┬───────────────┬───────┐
│ index ┆ Symbol ┆ Date       ┆ Earnings_Date ┆ Event │
│ ---   ┆ ---    ┆ ---        ┆ ---           ┆ ---   │
│ u32   ┆ str    ┆ date       ┆ date          ┆ i64   │
╞═══════╪════════╪════════════╪═══════════════╪═══════╡
│ 0     ┆ A      ┆ 2010-08-29 ┆ 2010-06-01    ┆ 1     │
│ 1     ┆ A      ┆ 2010-09-01 ┆ 2010-09-01    ┆ 4     │
│ 2     ┆ A      ┆ 2010-09-05 ┆ 2010-09-01    ┆ 4     │
│ 3     ┆ A      ┆ 2010-11-30 ┆ 2010-09-01    ┆ 4     │
│ 4     ┆ A      ┆ 2010-12-02 ┆ 2010-12-01    ┆ 7     │
└───────┴────────┴────────────┴───────────────┴───────┘

我知道你希望每个项目都匹配at most once.我不认为这是不可能的join_asof.但是,我们可以将所有等于前一行的事件行设置为Null.为此,可以使用pl.when().then()构造.

(
    fr
    .join_asof(
        events,
        left_on="Date", right_on="Earnings_Date",
        by="Symbol",
    )
    .with_columns(
        pl.when(
            pl.col("Earnings_Date", "Event").is_first_distinct()
        ).then(
            pl.col("Earnings_Date", "Event")
        ).over("Symbol")
    )
)
shape: (5, 5)
┌───────┬────────┬────────────┬───────────────┬───────┐
│ index ┆ Symbol ┆ Date       ┆ Earnings_Date ┆ Event │
│ ---   ┆ ---    ┆ ---        ┆ ---           ┆ ---   │
│ u32   ┆ str    ┆ date       ┆ date          ┆ i64   │
╞═══════╪════════╪════════════╪═══════════════╪═══════╡
│ 0     ┆ A      ┆ 2010-08-29 ┆ 2010-06-01    ┆ 1     │
│ 1     ┆ A      ┆ 2010-09-01 ┆ 2010-09-01    ┆ 4     │
│ 2     ┆ A      ┆ 2010-09-05 ┆ null          ┆ null  │
│ 3     ┆ A      ┆ 2010-11-30 ┆ null          ┆ null  │
│ 4     ┆ A      ┆ 2010-12-02 ┆ 2010-12-01    ┆ 7     │
└───────┴────────┴────────────┴───────────────┴───────┘

Python相关问答推荐

滚动和,句号来自Pandas列

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

如何记录脚本输出

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

在Python中动态计算范围

Pandas DataFrame中行之间的差异

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

如何在Python中使用另一个数据框更改列值(列表)

在Python中使用if else或使用regex将二进制数据如111转换为001""

Python全局变量递归得到不同的结果

Flask运行时无法在Python中打印到控制台

Pandas—堆栈多索引头,但不包括第一列

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

提取数组每行的非零元素

如何将相同组的值添加到嵌套的Pandas Maprame的倒数第二个索引级别

在round函数中使用列值

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

为什么按下按钮后屏幕的 colored颜色 保持不变?

Pandas 删除只有一种类型的值的行,重复或不重复

如何在基于时间的数据帧中添加计算值