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)
反向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)
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |