2017-05-08 376 views
2

我一直在尝试使用pandas来计算移动平均数,但是当我使用Dataframe.rolling()。mean()时,它会复制该值。Dataframe.rolling()。意思是不计算移动平均值

stock_info['stock'].head() 
 
    Fecha    Open  High  Low   Close  Volume 
0 04-05-2007 00:00:00 234,4593 255,5703 234,3532 246,8906 6044574 
1 07-05-2007 00:00:00 246,8906 254,7023 247,855  252,1563 2953869 
2 08-05-2007 00:00:00 252,1562 250,7482 244,9617 250,1695 2007217 
3 09-05-2007 00:00:00 250,1695 249,7838 245,9261 248,3757 2329078 
4 10-05-2007 00:00:00 248,8194 248,9158 244,9617 245,6368 2138002 
stock_info['stock']['MA'] = stock_info['stock']['Close'].rolling(window=2).mean() 
 
    Fecha    Open  High  Low   Close  Volume MA 
0 04-05-2007 00:00:00 234,4593 255,5703 234,3532 246,8906 6044574 246,8906 
1 07-05-2007 00:00:00 246,8906 254,7023 247,855  252,1563 2953869 252,1563 
2 08-05-2007 00:00:00 252,1562 250,7482 244,9617 250,1695 2007217 250,1695 
3 09-05-2007 00:00:00 250,1695 249,7838 245,9261 248,3757 2329078 248,3757 
4 10-05-2007 00:00:00 248,8194 248,9158 244,9617 245,6368 2138002 245,6368 
+1

什么是'Close'列的'dtype'?从逗号分隔符,我怀疑你可能有字符串而不是数字。 –

+2

你说得对,那是该死的问题,太麻烦了。数据来自csv文件,当我设置十进制=','它无缝工作。谢谢! –

回答

4

我首先想到的是,在stock_info['stock']['Close']的值存储为字符串,而不是数字类型。在

df = pd.DataFrame({'Close': ['246,8906', '252,1563', '250,1695']}) 

试图

df['MA'] = df['Close'].rolling(window=2).mean() 

df 
Out[38]: 
     Close  MA 
0 246,8906 246,8906 
1 252,1563 252,1563 
2 250,1695 250,1695 

如发生给你。 此转换为数字值的第一,说与

df['MA'] = df['Close'].str.replace(',', '.').astype(float).rolling(window=2).mean() 

给出

df 
Out[40]: 
     Close   MA 
0 246,8906  NaN 
1 252,1563 249.52345 
2 250,1695 251.16290 

如所期望。

+0

的确,这就是发生了什么,正如Mark的评论在我的问题下面所描述的那样。 –

0

可以使用pd.rolling_mean到calcualte

例如:

df1 = pd.DataFrame([ np.random.randint(-10,10) for _ in xrange(100) ],columns =['val']) 
    val 
0 4 
1 -3 
2 -7 
3 3 
4 -10 
df1['MA'] = pd.rolling_mean(df1.val,2) 
    val MA 
0 4 NaN 
1 -3 0.5 
2 -7 -5.0 
3 3 -2.0 
4 -10 -3.5