【问题标题】:Multi-indexing - pandas多索引 - 熊猫
【发布时间】: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


【解决方案1】:

您可以df.groupby('Symbol'),然后将pct_change(periods=1) 应用于每个组的Close 值。从您的 MultiIndexed DataFrame df 开始:

df['Daily Return'] = df.groupby('Symbol')['Close'].apply(lambda x: x.pct_change(1))
df

                      Close     High       Low      Open    Volume  Daily Return
Symbol Date                                                                     
AAPL   2018-07-02  187.1800  187.300  183.4200  183.8200  17731343           NaN
       2018-07-03  183.9200  187.950  183.5400  187.7900  13954806     -0.017416
       2018-07-04  183.9200  183.920  183.9200  183.9200         0      0.000000
       2018-07-05  185.4000  186.410  184.2800  185.2600  16604247      0.008047
       2018-07-06  187.9700  188.434  185.2000  185.4200  17485245      0.013862
WMLP   2018-07-02    1.3700    1.520    1.3300    1.3700      9139           NaN
       2018-07-03    1.4000    1.690    1.3800    1.6900      8075      0.021898
       2018-07-04    1.4000    1.400    1.4000    1.4000         0      0.000000
       2018-07-05    1.6000    1.600    1.4124    1.4124     29383      0.142857
       2018-07-06    1.7095    1.770    1.5200    1.6000     42599      0.068437

像往常一样,可能有一个更优雅或性能更高的解决方案,但这应该适用于合理的数据大小。

【讨论】:

  • 谢谢@Peter。它确实有效。我将玩这个“groupby”以完全理解它
猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多