2

在计算 rollng_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 值以及如何获取完整列表吗?

4

2 回答 2

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)
于 2013-01-14T22:29:12.053 回答
2

如果你 print sma200,你可能会发现很多空值或缺失值。这是因为默认情况下,非空值数量的阈值很高rolling_mean

尝试使用

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

来自熊猫文档

min_periods:需要的非空数据点的阈值(否则结果为 NA)

如果您的数据集缺少很多点,您也可以尝试更改窗口的大小。

于 2013-01-14T22:17:57.237 回答