data['rolling_avg_val'] = 0
future_window = '1h'
for i in range(data.shape[0]):
start_data_idx = data.index[i]
end_data_idx = start_data_idx + pd.Timedelta(future_window)
temp_avg = data['values'][start_data_idx:end_data_idx].mean()
if temp_avg == 0:
continue
data.loc[start_data_idx,'rolling_avg_val'] = temp_avg
数据框大约有 5,000,000 行,表示两周内的数据,看起来像这样,其中索引是以毫秒为单位的时间戳:
2017-04-12 12:19:04.987 0
2017-04-12 12:19:05.157 1
2017-04-12 12:19:05.297 0
2017-01-12 12:19:05.330 0
2017-04-12 12:19:05.487 0
2017-04-12 12:19:05.530 1
2017-04-12 12:19:05.640 0
2017-04-12 12:19:05.703 1
如您所见,时间戳不是均匀分布的,end_data_idx 不一定在数据帧中,但 pandas 在切片时能够获得正确的范围。我看到的一个常见解决方案是填充缺失的时间间隔,然后移动结果。但是,这会使内存爆炸,所以我尽量避免这种情况。
在我的机器上,它看起来每秒大约可以处理 800 行。有没有另一种方法来思考这个问题以获得更快的解决方案?
编辑:
预期输出:
rolling_avg
2017-04-12 12:19:04.987 0.375
2017-04-12 12:19:05.157 0.429
2017-04-12 12:19:05.297 0.333
2017-01-12 12:19:05.330 0.4
2017-04-12 12:19:05.487 0.5
2017-04-12 12:19:05.530 0.667
2017-04-12 12:19:05.640 0.5
2017-04-12 12:19:05.703 1.0
最佳答案
反向df
翻转索引符号(从单调递减到递增
滚动均值()
再次翻转索引符号
再次反转df
df2 = df[::-1]
df2.index = pd.datetime(2050,1,1) - df2.index
df2 = df2.rolling('1H').mean()
df3 = df2[::-1]
df3.index = df.index
关于python - 循环获取 pandas 时间索引数据帧的滚动 future 值,我可以让它更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46100962/