rolling_window в pandas 19 с использованием пользовательских форм

#python #pandas

#python #pandas

Вопрос:

Раньше в моем коде был pd.rolling_window(s,window=np.array(l), ….) при использовании 0.17. Новый series.rolling(window,win_type) теперь не поддерживает ничего, кроме целых чисел в window, а win_type ограничен фиксированным набором фигур.

Как я могу перенести мое старое пользовательское значение rolling_window на 0.19?

Спасибо

Ответ №1:

Кажется Rolling , потеряна функциональность пользовательского окна. К счастью, он по-прежнему сохраняет свой Rolling.apply метод.

Если вам нужно специальное значение окна, один из способов сделать это — взять любой нормализованный массив (сумма элементов = 1) и numpy.correlate (который представляет собой просто комбинированное умножение и суммирование массива) в .apply методе:

 >>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'a':[0,1,0,0,0,0],'b':[0,0,0,1,0,0]})
>>> print df
   a  b
0  0  0
1  1  0
2  0  0
3  0  1
4  0  0
5  0  0
>>> my_array = np.array([1,2,3])
>>> # Below implements a weighted mean
>>> df.rolling(len(my_array)).apply(lambda column: np.correlate(column,my_array/sum(my_array)))
          a         b
0       NaN       NaN
1       NaN       NaN
2  0.333333  0.000000
3  0.166667  0.500000
4  0.000000  0.333333
5  0.000000  0.166667
>>> # Same thing, but thanks to '[0]' we can have min_periods < len(my_array)
>>> df.rolling(len(my_array),min_periods=1).apply(lambda column: np.correlate(column,my_array/sum(my_array))[0])
          a         b
0  0.000000  0.000000
1  0.500000  0.000000
2  0.333333  0.000000
3  0.166667  0.500000
4  0.000000  0.333333
5  0.000000  0.166667
 

Редактировать: у Numpy также есть average() метод с аргументом weight. Продолжайте с этим, если просто выполняете простое средневзвешенное значение.