Calculating weighted moving average using pandas Rolling method
<p>I calculate simple moving average:</p>

<pre><code>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
</code></pre>

<p>Using the rolling function is it possible to calculate weighted moving average? As I read <a href="http://pandas.pydata.org/pandas-docs/stable/computation.html#rolling-windows" rel="nofollow">in the documentation</a>, I think that I have to pass <strong>win_type</strong> parameter. But I'm not sure which one I have to choose. </p>

<p>Here is a <a href="http://www.investopedia.com/ask/answers/071414/whats-difference-between-moving-average-and-weighted-moving-average.asp" rel="nofollow">definition</a> for weighted moving average.</p>

<p>Thanks in advance,</p>

<p>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:</p>

<pre><code>&gt;&gt;&gt; import numpy as np
&gt;&gt;&gt; import pandas as pd
&gt;&gt;&gt; d = pd.DataFrame({'a':range(10), 'b':np.random.random(size=10)})
&gt;&gt;&gt; d.b = d.b.round(2)
&gt;&gt;&gt; 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
&gt;&gt;&gt; wts = np.array([-1, 2])
&gt;&gt;&gt; def f(w):                        
        def g(x):
            return (w*x).mean()
        return g
&gt;&gt;&gt; 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
</code></pre>

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

python pandas moving-average weighted-average technical-indicator