【发布时间】:2019-01-19 06:31:36
【问题描述】:
我正在尝试使用 pandas 构建自己的股票筛选器。 我使用晨星公司的 DataReader 获取数据。 这是我的数据结构:
- 'Close'、'Volume'、'Low'、'High' 等是列;
- “日期”是行。 我可能错了,但我选择使用“符号”(AAPL、WMLP 等)进行索引,而“日期”是索引的子级。
当我在右侧添加一些股票指标(“每日回报”、“滚动平均 20”等)的列时,我遇到了一个主要问题:而不是写一个无法进行计算的 Nan 值,因为有是没有以前的数据可以使用,python使用的是以前股票的最后一个数据。见下文 2018-07-02 WMLP 的每日回报:
df.reset_index(inplace=True)
df.set_index(['Symbol', 'Date'])
Close High Low Open Volume \
Symbol Date
AAPL 2018-07-02 187.1800 187.300 183.4200 183.8200 17731343
2018-07-03 183.9200 187.950 183.5400 187.7900 13954806
2018-07-04 183.9200 183.920 183.9200 183.9200 0
2018-07-05 185.4000 186.410 184.2800 185.2600 16604247
2018-07-06 187.9700 188.434 185.2000 185.4200 17485245
WMLP 2018-07-02 1.3700 1.520 1.3300 1.3700 9139
2018-07-03 1.4000 1.690 1.3800 1.6900 8075
2018-07-04 1.4000 1.400 1.4000 1.4000 0
2018-07-05 1.6000 1.600 1.4124 1.4124 29383
2018-07-06 1.7095 1.770 1.5200 1.6000 42599
Daily Return
Symbol Date
AAPL 2018-07-02 NaN
2018-07-03 -0.017416
2018-07-04 0.000000
2018-07-05 0.008047
2018-07-06 0.013862
WMLP 2018-07-02 -0.992712
2018-07-03 0.021898
2018-07-04 0.000000
2018-07-05 0.142857
2018-07-06 0.068437
我希望 WMLP 在 2018-07-02 的每日回报为 NaN,而无需手动强制。
我的索引方法有问题吗?或者你会建议一个更智能的数据结构来避免这个问题吗? 请注意,我知道面板已被弃用,而且我还没有学习 xarray。
编辑 根据您的要求,请在下面找到开头的其他代码:
start = '2018-07-02'
end = '2018-07-07'
WMLP = web.DataReader('WMLP', 'morningstar', start, end)
AAPL = web.DataReader('AAPL', 'morningstar', start, end)
frames = [AAPL, WMLP]
df = pd.concat(frames)
df['Daily Return'] = df['Close'].pct_change(1)
编辑:根据 Peter 的回复(有效),我尝试在开始时仅放置一次 groupby - 为了使后面的代码更简单易读:
df = df.groupby('Symbol')
df['Daily Return'] = df['Close'].pct_change(1)
df['Rolling 20'] = df['Close'].rolling(20).mean()
但是这会产生“TypeError: 'DataFrameGroupBy' object does not support item assignment”
感谢groupby 解决方案,但欢迎其他想法
【问题讨论】:
-
请张贴初始
df和用于计算rollingmean()的代码
标签: python pandas dataframe nan multi-index