pandas索引非日期类型时使用偏移量实现rolling滚动计算的方法
问题描述
现有如下DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]},index=[0.1,0.2,0.5,0.7,0.9])
原始输出结果:
B 0.1 0.0 0.2 1.0 0.5 2.0 0.7 NaN 0.9 4.0
需要基于数值偏移量执行滚动计算,运行df.rolling(0.3).sum()时报错:
ValueError: window must be an integer
实际业务场景涉及约10亿行数据,最终需要执行groupby().rolling()操作,上述为问题极简示例。
解决方案
该问题最优解法由GitHub用户mroeschke提供,核心逻辑是将数值型索引转换为datetime时间戳类型,即可使用pandas原生支持的时间偏移量滚动窗口,计算逻辑和数值偏移完全一致,性能适配大数据量场景,代码实现如下:
In [1]: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]},index=[0.1,0.2,0.5,0.7,0.9]) # 将数值索引转换为秒单位的时间戳 In [2]: df.index = pd.to_datetime(df.index, unit="s") # 300ms时间窗口对应0.3的数值偏移,可替换为sum等其他聚合函数 In [3]: df.rolling("300ms").mean() Out[3]: B 1970-01-01 00:00:00.100 0.0 1970-01-01 00:00:00.200 0.5 1970-01-01 00:00:00.500 2.0 1970-01-01 00:00:00.700 2.0 1970-01-01 00:00:00.900 4.0
如果需要保留原数值索引的展示形式,计算完成后可再将时间索引转换回数值类型:
df.index = df.index.astype(np.int64) / 10**9
内容的提问来源于stack exchange,提问作者user40780
相关产品推荐
相关产品推荐

