不使用pd.rolling_mean()

时间:2016-05-05 17:23:46

标签: python pandas

我知道rolling_mean()存在,但这是针对学校项目所以我试图避免使用rolling_mean()

我正在尝试在数据集系列

上使用以下函数
def run_mean(array, period):
    ret = np.cumsum(array, dtype=float)
    ret[period:] = ret[period:] - ret[:-period]
    return ret[period - 1:] / period

data['run_mean'] = run_mean(data['ratio'], 150)

但是我收到错误'ValueError:无法使用长度不同于值的切片索引器进行设置'。

使用data['run_mean'] = pd.rolling_mean(raw_data['ratio'],150)工作正常,我错过了什么?

3 个答案:

答案 0 :(得分:2)

使用NaN将初始值填充到句点。

def run_mean(array, period):  # Vector
    ret = np.cumsum(array / period, dtype=float)  # First divide by period to avoid overflow.
    ret[period:] = ret[period:] - ret[:-period]
    ret[:period - 1] = np.nan
    return ret 

run_mean(np.array(range(5)), 3)
Out[35]: array([ nan,  nan,   1.,   2.,   3.])

答案 1 :(得分:1)

引用the pandas documentation

  

Series和ndarray之间的主要区别在于Series之间的操作会根据标签自动对齐数据。因此,您可以在不考虑所涉及的系列是否具有相同标签的情况下编写计算。

这个例子应该说明发生了什么:

In [1]: import numpy as np
   ...: import pandas as pd

In [2]: a = pd.Series(np.random.random(5))

In [3]: a
Out[3]: 
0    0.740975
1    0.983654
2    0.274207
3    0.427542
4    0.874127
dtype: float64

In [4]: a[2:]
Out[4]: 
2    0.274207
3    0.427542
4    0.874127
dtype: float64

In [5]: a[:-2]
Out[5]: 
0    0.740975
1    0.983654
2    0.274207
dtype: float64

In [6]: a[2:] - a[:-2]
Out[6]: 
0    NaN
1    NaN
2    0.0
3    NaN
4    NaN
dtype: float64

In [7]: a[2:] = _

最后一个语句将产生你得到的ValueError

ret从pandas Series转换为numpy ndarray可以为您提供所需的行为。

答案 2 :(得分:1)

您在:切片中混淆了DataFrame的使用。

解决方案

您要使用的是shift()

def run_mean(array, period):
    ret = np.cumsum(array, dtype=float)
    roll = ret - ret.shift(period).fillna(0)
    return roll[(period - 1):] / period

示例设置

import pandas as pd
import numpy as np

np.random.seed(314)
df = pd.DataFrame((np.random.rand(6, 5) * 10).astype(int), columns=list('ABCDE'))

print df

   A  B  C  D  E
0  9  5  2  7  9
1  8  7  2  9  2
2  7  2  1  3  8
3  2  0  6  5  5
4  6  6  4  3  5
5  4  8  8  1  0

观察

print df[:4]

   A  B  C  D  E
0  9  5  2  7  9
1  8  7  2  9  2
2  7  2  1  3  8
3  2  0  6  5  5

print df[:-4]

   A  B  C  D  E
0  9  5  2  7  9
1  8  7  2  9  2

这些长度不一样。

示范

          A         B         C         D         E
2  8.000000  4.666667  1.666667  6.333333  6.333333
3  5.666667  3.000000  3.000000  5.666667  5.000000
4  5.000000  2.666667  3.666667  3.666667  6.000000
5  4.000000  4.666667  6.000000  3.000000  3.333333