计算滚动大熊猫的最大差异-提高性能

时间:2018-06-27 12:13:12

标签: python pandas dataframe

我有一个只有一列的数据框。

我需要计算600秒(10分钟)内最小和最大值之间的差异平均值。或更清楚地说:

np.average(originalData[sensor1].rolling(600)
.apply(lambda mylist : (max(mylist) - min(mylist)), raw = True).dropna())

代码可以完美运行,并向我返回所需的结果。

问题是我的数据框非常大(150万行,200列),并且要花很多时间,特别是如果我想从600秒变为3600秒。

我想通过不计算每一行的差异来改进它,但是每次跳过10行,都不会显着影响结果。

含义:

  • 计算第0至600行的max(list)-min(list)
  • 计算第10行到610的max(list)-min(list)
  • 计算第20行到620的max(list)-min(list)
  • 计算第30行的max(list)-min(list)到630

这将使计算速度提高10倍(希望如此),但我不知道如何使用rolling

有什么建议吗?

编辑: muzzyq请求的样本数据:

a = np.ones(1500000)
np.average(pd.Series(a).rolling(600).
apply(lambda thing : (max(thing) - min(thing)), raw = True).dropna())

1 个答案:

答案 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