Расчет взвешенного скользящего среднего с использованием метода pandas Rolling

Рассчитываю простую скользящую среднюю:

def sma(data_frame, length=15):
    # TODO: Be sure about default values of length.
    smas = data_frame.Close.rolling(window=length, center=False).mean()
    return smas

Можно ли рассчитать средневзвешенное скользящее среднее с помощью скользящей функции? Читая в документации, я думаю, что необходимо передать параметр win_type. Но я не уверен, что мне выбрать.

Вот определение взвешенной скользящей средней.

Заранее спасибо,


person anilca    schedule 28.09.2016    source источник
comment
Взгляните на np.average, который поддерживает вес предоставлена.   -  person Nickil Maveli    schedule 28.09.2016
comment
Я бы написал о проблеме на Github. Документация действительно вводит в заблуждение. предполагает, что можно пройти пользовательские веса, но он не объясняет, как это сделать, и в репозитории нет примеров, где это было бы сделано.   -  person dangom    schedule 28.09.2016


Ответы (1)


Да, эта часть панд действительно не очень хорошо документирована. Я думаю, вам, возможно, придется использовать Rolling.apply (), если вы не используете один из стандартных типов окон. Я ткнул в него и заставил это работать:

>>> import numpy as np
>>> import pandas as pd
>>> d = pd.DataFrame({'a':range(10), 'b':np.random.random(size=10)})
>>> d.b = d.b.round(2)
>>> d
   a     b
0  0  0.28
1  1  0.70
2  2  0.28
3  3  0.99
4  4  0.72
5  5  0.43
6  6  0.71
7  7  0.75
8  8  0.61
9  9  0.14
>>> wts = np.array([-1, 2])
>>> def f(w):                        
        def g(x):
            return (w*x).mean()
        return g
>>> d.rolling(window=2).apply(f(wts))
     a      b
0  NaN    NaN
1  1.0  0.560
2  1.5 -0.070
3  2.0  0.850
4  2.5  0.225
5  3.0  0.070
6  3.5  0.495 
7  4.0  0.395
8  4.5  0.235
9  5.0 -0.165

Думаю, это правильно. Причина закрытия в том, что подпись для roll.apply rolling.apply(func, *args, **kwargs), поэтому веса распаковываются по кортежу, если вы просто отправляете их в функцию напрямую, если вы не отправляете их как 1-кортеж (wts,), но это странно.

person Dthal    schedule 28.09.2016