2013-01-14 69 views
1

我有很多與計算rollng_mean當缺失值:使用遺漏值pandas.rolling_mean

import datetime as dt 
import pandas as pd 
import pandas.io.data as web 

stocklist = ['MSFT', 'BELG.BR'] 

# read historical prices for last 11 years 
def get_px(stock, start): 
    return web.get_data_yahoo(stock, start)['Adj Close'] 

today = dt.date.today() 
start = str(dt.date(today.year-11, today.month, today.day)) 

px = pd.DataFrame({n: get_px(n, start) for n in stocklist}) 
px.ffill() 
sma200 = pd.rolling_mean(px, 200) 

得到以下結果:

In [14]: px 
Out[14]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 2836 entries, 2002-01-14 00:00:00 to 2013-01-11 00:00:00 
Data columns: 
BELG.BR 2270 non-null values 
MSFT  2769 non-null values 
dtypes: float64(2) 

In [15]: sma200 
Out[15]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 2836 entries, 2002-01-14 00:00:00 to 2013-01-11 00:00:00 
Data columns: 
BELG.BR 689 non-null values 
MSFT  400 non-null values 
dtypes: float64(2) 

任何想法,爲什麼大多數sma200 rolling_mean值的失蹤,如何獲得完整列表?

回答

3

px.ffill()返回新的DataFrame。要修改px本身,請使用inplace = True

px.ffill(inplace = True) 
sma200 = pd.rolling_mean(px, 200) 
print(sma200) 

產生

Data columns: 
BELG.BR 2085 non-null values 
MSFT  2635 non-null values 
dtypes: float64(2) 
2

如果您打印sma200,您可能會發現很多空值或缺失值。這是因爲對於rolling_mean,默認情況下非空值的閾值高。

嘗試使用

sma200 = pd.rolling_mean(px, 200, min_periods=2) 

pandas docs

min_periods:非空數據點的閾值要求(否則結果是NA)

您也可以嘗試如果數據集缺少許多點,則更改窗口的大小。

+0

好,謝謝。任何想法爲什麼填充沒有解決這個問題? – ronnydw

+1

你需要在原地使用它,在調用'ffill'時通過'inplace = True'。 – jozzas