python - 循环获取 pandas 时间索引数据帧的滚动 future 值,我可以让它更快吗?

标签 python pandas numpy

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/

相关文章:

python - 表现各种numpy花式索引方法,也与numba

python - 如何使用Numpy解决Type Error

python - 在 python 中分组字典键值

python - 重新排序多索引 Pandas 数据框

python - Pandas DataFrame 到以元组为键和值的字典

python - 球体体积内点的规则分布

python - NumPy:比较两个数组中的元素

python - 如何在两个列表中形成匹配元素的列表(包括重复项)?

python - 如何使用 Plotly 绘制循环的局部变量

python - 如何在所有列上使用 RobustScaler?