我有一个只有一列的数据框。
我需要计算600秒(10分钟)内最小和最大值之间的差异的平均值。或更清楚地说:
np.average(originalData[sensor1].rolling(600)
.apply(lambda mylist : (max(mylist) - min(mylist)), raw = True).dropna())
代码可以完美运行,并向我返回所需的结果。
问题是我的数据框非常大(150万行,200列),并且要花很多时间,特别是如果我想从600秒变为3600秒。
我想通过不计算每一行的差异来改进它,但是每次跳过10行,都不会显着影响结果。
含义:
这将使计算速度提高10倍(希望如此),但我不知道如何使用rolling
有什么建议吗?
编辑: muzzyq请求的样本数据:
a = np.ones(1500000)
np.average(pd.Series(a).rolling(600).
apply(lambda thing : (max(thing) - min(thing)), raw = True).dropna())
答案 0 :(得分:0)
您可以使用resample
作为'10min'
方法,以10分钟为间隔进行分组。假设将其设置为索引,它比对大型时间序列数据使用rolling
更有效。
rng = pd.date_range('2000-01-01', periods=1_500_000, freq='S')
ts = pd.Series(np.arange(1_500_000), index=rng)
ts.head()
输出:
2000-01-01 00:00:00 0
2000-01-01 00:00:01 1
2000-01-01 00:00:02 2
2000-01-01 00:00:03 3
2000-01-01 00:00:04 4
Freq: S, dtype: int64
使用您问题中的功能
np.average(ts.resample('10min').apply(lambda mylist: (max(mylist) - min(mylist))))
输出:
599.0
只是因为我不确定100%是否希望结果看起来像什么,所以这将为您提供每10分钟间隔的范围:
result = ts.resample('10min').apply(lambda mylist: (max(mylist) - min(mylist)))
result.head()
输出:
2000-01-01 00:00:00 599
2000-01-01 00:10:00 599
2000-01-01 00:20:00 599
2000-01-01 00:30:00 599
2000-01-01 00:40:00 599
Freq: 10T, dtype: int64
在这种情况下,答案将始终为599,因为最大600秒为600,最小为1,所以600 - 1 = 599