<p>我想不出仅仅使用新的<code>rolling</code>方法的简单解决方案。似乎唯一的方法是创建一个dataframe并用加权值创建一个新列。在</p>
<pre><code>>>> df = pd.DataFrame([1,1,1], index=pd.date_range('1/1/2000', periods=3), columns=['value'])
>>> df['weight'] = [2, 2, 2]
>>> df['weighted'] = df['value'] * df['weight']
>>> df
value weight weighted
2000-01-01 1 2 2
2000-01-02 1 2 2
2000-01-03 1 2 2
</code></pre>
<p>计算总数很简单。创建数据帧后,使用<code>rolling</code>方法和sum。使用您提供的示例,窗口的大小看起来是3。在</p>
^{pr2}$
<p>然而,计算加权平均值需要生成另一列来计算加权平均值,在该列中取<em>加权</em>列中的值并除以<em>weight</em>列中的值。这样可以确保你计算的是加权平均值,而不是加权值的平均值。。。这里差别很大。在</p>
<pre><code>>>> df_rolled['w_mean'] = df_rolled['weighted'] / df_rolled['weight']
>>> df_rolled['w_mean']
2000-01-01 NaN
2000-01-02 NaN
2000-01-03 1.0
Freq: D, Name: w_mean, dtype: float64
</code></pre>
<p>另一个检查解决方案是否有效的示例:</p>
<pre><code>>>> df['value'] = [2, 4, 6]
>>> df['weight'] = [1, 3, 5]
>>> df['weighted'] = df['value'] * df['weight']
>>> df
value weight weighted
2000-01-01 2 1 2
2000-01-02 4 3 12
2000-01-03 6 5 30
>>> df_rolled = df.rolling(3).sum()
>>> df_rolled['weighted'] # weighted sum
2000-01-01 NaN
2000-01-02 NaN
2000-01-03 44.0
Freq: D, Name: weighted, dtype: float64
>>> df_rolled['w_mean'] = df['weighted'] / df['weight']
>>> df_rolled['w_mean'] # weighted mean
2000-01-01 NaN
2000-01-02 NaN
2000-01-03 4.888889
Freq: D, Name: w_mean, dtype: float64
>>> df_rolled = df.rolling(2).sum() # window size 2
>>> df_rolled['weighted']
2000-01-01 NaN
2000-01-02 14.0
2000-01-03 42.0
Freq: D, Name: weighted, dtype: float64
>>> df_rolled['w_mean'] = df_rolled['weighted'] / df_rolled['weight']
>>> df_rolled['w_mean']
2000-01-01 NaN
2000-01-02 3.50
2000-01-03 5.25
Freq: D, Name: w_mean, dtype: float64
</code></pre>