Pandas多级索引下计算股票52周新高触发KeyError: 'goog'报错如何解决
报错原因
- 多标的拉取的雅虎财经数据返回的是双层MultiIndex列的DataFrame:第一层为行情指标(High/Open等),第二层为标的代码,因此初始读取
df['High']['goog']是合法操作。 - 你在循环中直接新增
df['52wk']列时,该列是单层列名的单列Series,仅保留日期索引,不存在标的代码层级的索引,后续执行df['52wk']['goog']时就会抛出找不到对应键的KeyError。 - 额外隐藏问题:对行情数据执行
asfreq('D')会将交易日索引转为自然日索引,和原DataFrame的交易日索引对齐时会生成大量空值,导致滚动计算结果错误。
修复代码
import pandas as pd from pandas_datareader import data as web import numpy as np tickers = ('goog', 'meta', 'aapl', 'tsla') # 原fb已更名为META,用fb无法拉取最新数据 df = web.DataReader(tickers, 'yahoo') for t in tickers: high_series = df['High'][t] # 52周交易日约为252天,无需转自然日 df[('52wk', t)] = high_series.rolling(window=252, min_periods=1).max() # 比较当前High和上期52周高用shift(1),shift(-1)是取下期值逻辑错误 df[('52weekhigh', t)] = np.where(high_series >= df[('52wk', t)].shift(1), 'True', 'False') # 查看单支标的的全量指标,示例为goog print(df.xs('goog', level=1, axis=1))
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

