如果你来自未来,希望
this PR
已合并。
如果你不是来自未来,希望如此
this answer
解决你的问题。
在复制粘贴上面建议的DuckDB集成并在我的真实数据中比较结果之前,我只想用polars来解决我的问题(我不是专家,但我可以跟踪正在发生的事情)。
我有一个事件列表(名称和时间戳)和一个时间窗口列表。我想计算每个时间窗口中每个事件发生的次数。
我觉得我即将得到一个正常工作的东西,但我已经被困了几个小时了:
import polars as pl
events = {
"name": ["a", "b", "a", "b", "a", "c", "b", "a", "b", "a", "b", "a", "b", "a", "b", "a", "b", "a", "b"],
"time": [0.0, 1.0, 1.5, 2.0, 2.25, 2.26, 2.45, 2.5, 3.0, 3.4, 3.5, 3.6, 3.65, 3.7, 3.8, 4.0, 4.5, 5.0, 6.0],
}
windows = {
"start_time": [1.0, 2.0, 3.0, 4.0],
"stop_time": [3.5, 2.5, 3.7, 5.0],
}
events_df = pl.DataFrame(events).sort("time").with_row_index()
windows_df = (
pl.DataFrame(windows)
.sort("start_time")
.join_asof(events_df, left_on="start_time", right_on="time", strategy="forward")
.drop("name", "time")
.rename({"index": "first_index"})
.sort("stop_time")
.join_asof(events_df, left_on="stop_time", right_on="time", strategy="backward")
.drop("name", "time")
.rename({"index": "last_index"})
)
print(windows_df)
"""
shape: (4, 4)
ââââââââââââââ¬ââââââââââââ¬ââââââââââââââ¬âââââââââââââ
â start_time â stop_time â first_index â last_index â
â --- â --- â --- â --- â
â f64 â f64 â u32 â u32 â
ââââââââââââââªââââââââââââªââââââââââââââªâââââââââââââ¡
â 2.0 â 2.5 â 3 â 7 â
â 1.0 â 3.5 â 1 â 10 â
â 3.0 â 3.7 â 8 â 13 â
â 4.0 â 5.0 â 15 â 17 â
ââââââââââââââ´ââââââââââââ´ââââââââââââââ´âââââââââââââ
"""
到目前为止,对于每个时间窗口,我都可以得到我关心的第一个和最后一个事件的索引。现在我“只”需要计算每种类型的数量。我能得到一些关于如何做到这一点的帮助吗?
我要查找的输出应该如下:
shape: (4, 5)
ââââââââââââââ¬ââââââââââââ¬ââââââ¬ââââââ¬ââââââ
â start_time â stop_time â a â b â c â
â --- â --- â --- â --- â --- â
â f64 â f64 â i64 â i64 â i64 â
ââââââââââââââªââââââââââââªââââââªââââââªââââââ¡
â 1.0 â 3.5 â 4 â 5 â 1 â
â 2.0 â 2.5 â 2 â 2 â 1 â
â 3.0 â 3.7 â 3 â 3 â 0 â
â 4.0 â 5.0 â 2 â 1 â 0 â
ââââââââââââââ´ââââââââââââ´ââââââ´ââââââ´ââââââ
我想用类似的东西
int_ranges()
,
gather()
,以及
explode()
可以给我一个包含每个时间窗口及其所有相应事件的数据帧。最后,类似
group_by()
,
count()
,以及
pivot()
可以让我找到我想要的数据帧。但我已经为此挣扎了一段时间。