#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. Продолжайте с этим, если просто выполняете простое средневзвешенное значение.