Я думаю, что использование функции 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)
Than:
%%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)