Skip to content Skip to sidebar Skip to footer

Calculating Weighted Moving Average Using Pandas Rolling Method

I calculate simple moving average: def sma(data_frame, length=15): # TODO: Be sure about default values of length. smas = data_frame.Close.rolling(window=length, center=Fal

Solution 1:

Yeah, that part of pandas really isn't very well documented. I think you might have to use rolling.apply() if you aren't using one of the standard window types. I poked at it and got this to work:

>>>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])>>>deff(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

I think that is correct. The reason for the closure there is that the signature for rolling.apply is rolling.apply(func, *args, **kwargs), so the weights get tuple-unpacked if you just send them to the function directly, unless you send them as a 1-tuple (wts,), but that's weird.

Post a Comment for "Calculating Weighted Moving Average Using Pandas Rolling Method"