循环获取熊猫时间索引数据框的滚动未来值,我可以使其更快吗?

use*_*237 4 python numpy pandas

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
Run Code Online (Sandbox Code Playgroud)

该数据框大约有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
Run Code Online (Sandbox Code Playgroud)

如您所见,时间戳记并不是均匀分布的,并且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
Run Code Online (Sandbox Code Playgroud)

Jam*_*ang 5

反向df

翻转索引符号(从单调递减到递增

roll.mean()

再次翻转索引标志

再次反转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
Run Code Online (Sandbox Code Playgroud)