在Dataframe上创建Multiindex以执行PanelOLS

时间:2016-05-15 12:30:55

标签: python pandas dataframe statistics

所以我想这个问题很简单,但我无法找到答案。我想要做的是在库存数据上运行PanelOLS。要做到这一点,我导入了2个表,一个是每周一次的股票回报,另一个是谷歌趋势的每周搜索频率,并将它们连成一个“主数据帧”。然后我循环这个操作x次,这样我的'Main Dataframe'中就有了许多不同的股票。这看起来像这样:

             Open  Close Ticker  log(weekly returns)  Search Frequency
2016-01-09  34.84  28.04   ACAD                -0.22              25.0
2016-01-16  28.46  23.78   ACAD                -0.18              26.0
2016-01-09  24.49  24.52   ABBB                 0.00              24.0
2016-01-16  24.11  20.69   ABBB                -0.15              26.0

现在我需要创建一个超过日期和自动收报机的多索引以运行回归,但它不会按照应该的方式对其进行排序,因此我得到错误:

  

NotImplementedError:仅支持2级MultiIndex。

当我包括:

for stock in stocklist:
    stock_detail_df = pd.read_csv(path, index_col=0, parse_dates=True)
    trend_df = pd.read_csv(path2, index_col=0, parse_dates=True)
    complete_df = pd.concat([stock_detail_df, trend_df], axis=1)
    master_df = master_df.append(complete_df)

master_df.reset_index(level=0, inplace=True)
master_df['Date'] = master_df['index']
master_df = master_df.drop(['index'], 1)
master_df.set_index(['Date', 'Ticker'], inplace=True)
我得到的只有:

                    Open  Close  log(weekly returns)  Search Frequency
Date       Ticker                                                     
2016-01-09 ACAD    34.84  28.04                -0.22              25.0
2016-01-16 ACAD    28.46  23.78                -0.18              26.0
2016-01-23 ACAD    24.49  24.52                 0.00              24.0
2016-01-30 ACAD    24.11  20.69                -0.15              26.0

数据框不会像以前那样改变/看起来相同,但是如果我交换'Date'和'Ticker',它确实创建了一个看起来像这样的多索引,但这不能帮助我执行回归(我有也尝试使用index.swaplevel(0,1)但只返回上面的表格:

                    Open  Close  log(weekly returns)  Search Frequency
Ticker Date                                                           
ACAD   2016-01-09  34.84  28.04                -0.22              25.0
       2016-01-16  28.46  23.78                -0.18              26.0
       2016-01-23  24.49  24.52                 0.00              24.0
       2016-01-30  24.11  20.69                -0.15              26.0

无论如何,最终产品应如下所示:

                    Open  Close  log(weekly returns)  Search Frequency
Date       Ticker                                                     
2016-01-09 ACAD    34.84  28.04                -0.22              25.0
           ABBB    10.21  11.05                -0.18              26.0
2016-01-16 ACAD    24.49  24.52                 0.00              24.0
           ABBB    11.05  15.07                -0.15              26.0

如果需要,我也会发布完整的代码,但是有很多与这个问题无关,我不想包含不必要的代码。由于我能够创建一个多索引(只是错误的顺序),我想有一个我没有看到的简单解决方案。我使用的是python 2.7和pandas 18.1

1 个答案:

答案 0 :(得分:1)

开始
df.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 4 entries, 2016-01-09 to 2016-01-16
Data columns (total 5 columns):
Open                   4 non-null float64
Close                  4 non-null float64
Ticker                 4 non-null object
log(weekly returns)    4 non-null float64
Search Frequency       4 non-null int64
dtypes: float64(3), int64(1), object(1)
memory usage: 192.0+ bytes

             Open  Close Ticker  log(weekly returns)  Search Frequency
2016-01-09  34.84  28.04   ACAD                -0.22                25
2016-01-16  28.46  23.78   ACAD                -0.18                26
2016-01-09  24.49  24.52   ABBB                 0.00                24
2016-01-16  24.11  20.69   ABBB                -0.15                26

使用

df.index.name='Date'
df.set_index('Ticker', append=True).sortlevel()

产生

                    Open  Close  log(weekly returns)  Search Frequency
Date       Ticker                                                     
2016-01-09 ABBB    24.49  24.52                 0.00                24
           ACAD    34.84  28.04                -0.22                25
2016-01-16 ABBB    24.11  20.69                -0.15                26
           ACAD    28.46  23.78                -0.18                26