将时间序列转入面板 ...python

Pivot time series into panel ...python

我有一个数据框,其中包含从 1932-02-29 到 2018-07-31 每月观察的 25 个投资组合(ME1_BM1、ME1_BM2 等)的时间序列。前四个观察结果如下所示:

                 ME1_BM1     ME1_BM2  ...
Date
1932-02-29       2.11875     1.28388
1932-03-31       2.18567     1.24275
...

日期列设置为索引。我需要为其他东西准备数据,所以我需要将数据转换成这样:

ME1_BM1    1932-02-29    2.11875
           1932-03-31    2.18567
           ...
ME1_BM2    1932-02-29    1.28388
           1932-03-31    1.24275
           ...

无法使其工作。我试图堆叠数据框,但随后我将日期作为索引,将投资组合作为第二个 "variable"。因为我需要指定太多变量,所以我没有使用 pivot ......

有人知道怎么做吗?

亲切的问候,杰斯珀。

我想你需要 unstack 因为 SeriesMultiIndex:

s = df.unstack()
print (s)
         Date      
ME1_BM1  1932-02-29    2.11875
         1932-03-31    2.18567
ME1_BM2  1932-02-29    1.28388
         1932-03-31    1.24275
dtype: float64

如果想要 3 列 DataFrame 添加 reset_index:

df1 = df.unstack().reset_index()
df1.columns = ['portfolio','date','val']
print (df1)
  portfolio        date      val
0   ME1_BM1  1932-02-29  2.11875
1   ME1_BM1  1932-03-31  2.18567
2   ME1_BM2  1932-02-29  1.28388
3   ME1_BM2  1932-03-31  1.24275

尽管之前的答案更优雅 - 您可以执行以下操作:

df = df.reset_index() # so date is not index anymore

融化投资组合:

df2 = pd.melt(df, id_vars=["Date"], value_vars=['ME1_BM1','ME1_BM2'])

应用分组依据:

df2.groupby(["variable", "Date"])["value"].max()

显然,您可以更改列名,使其看起来更整洁。

您也可以只收集所有专栏 df.columns

把日期去掉,就不用打太多了。