应用于滚动数据帧太慢(熊猫0.23.4)

时间:2018-12-17 10:11:55

标签: python pandas

我有一个数据框,其中对于多个产品的多个日期,我有一些数值要在以下位置计算滚动指标:

df = pd.DataFrame(data=data, columns=['DATE', 'PRODUCTS', 'NUMQUANTITY_1', 'NUMQUANTITY_2', ..., 'NUMQUANTITY_20'])

我正在执行以下计算:

rolling_calculations = df.groupby('CATEGORY')\
.rolling('7D', on='DATE',closed='left')\
.apply(np.nanmean, raw=True)

可以工作,但速度很慢:对于大约200万行和20 NUMQUANTITY,在我的笔记本电脑上大约需要30分钟才能计算出滚动np.nanmean。

是否有任何方法可以使此过程更快?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我认为使用熊猫内置的mean函数可以大大提高速度,尽管完整的操作可能仍需要一些时间。

开始于:

N = 1000
x = numpy.random.uniform(size=(N, 5))
dates = pandas.date_range(start='1910-01-01', freq='5T', periods=N, name='DATE')

nums = pandas.DataFrame(data=x, columns=list('ABCDE'), index=dates)
cats = pandas.DataFrame({'CATEGORY': numpy.random.choice(list('abcdefghi'), size=N)}, index=dates)

df = nums.join(cats).reset_index()
df.loc[df['A'] < 0.5, list('ABCDE')] = numpy.nan
roll = df.groupby('CATEGORY').rolling('7D', on='DATE',closed='left')

在以下情况下,性能会更好:

%%timeit
roll.mean()

# 88.1 ms ± 2.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

比:

%%timeit
roll.apply(numpy.nanmean, raw=True)

# 658 ms ± 96.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

仅检查工作,以下内容不会引发AssertionError

x = roll.mean()
y = roll.apply(numpy.nanmean, raw=True)
pandas.util.testing.assert_frame_equal(x, y)