【发布时间】:2018-02-08 05:27:40
【问题描述】:
我有一个 DataFrame,其中包含代表组、时间和值的三列。我想计算每组内的滚动平均值、标准偏差等。现在我定义一个函数并使用apply。然而,这在非常大的数据集上非常慢。下面是函数。
def GetRollingMetrics(x, cols, windows, suffix):
for col in cols:
for win in windows:
x[col + '_' + str(win) + 'D' + '_mean' + '_' + suffix] = x.shift(1).rolling(win)[col].mean()
x[col + '_' + str(win) + 'D' + '_std' + '_' + suffix] = x.shift(1).rolling(win)[col].std()
x[col + '_' + str(win) + 'D' + '_min' + '_' + suffix] = x.shift(1).rolling(win)[col].min()
x[col + '_' + str(win) + 'D' + '_max' + '_' + suffix] = x.shift(1).rolling(win)[col].max()
return x
然后应用它,例如,我使用:
df = pd.DataFrame(np.random.randint(0,100,size=(1000000, 3)), columns=['Group','Time','Value'])
df.sort_values(by='Time', inplace=True)
df = df.groupby('Group').apply(lambda x: GetRollingMetrics(x, ['Value'], [7,14,28], 'my_suffix'))
有没有更“Pandaic”或更有效的方法来做到这一点?
【问题讨论】:
-
"Pandaic" ... :-) 另外,您想为每个列和每个窗口计算这些滚动统计信息吗?
-
好吧,在这个例子中我只有一列“值”,但我可能想为多列和多个窗口大小计算它,因此 cols 是一个列表。
-
和“Pandaic”听起来更好 - 编辑:)
-
查看jonisalonen.com/2014/…。您可以利用将方差分解为平方和和平方和:在每一步从尾部截取一个点并将新数据添加到头部。
-
您现有的方法需要多长时间?
标签: python performance function pandas dataframe