将时间序列转入面板 ...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
因为 Series
和 MultiIndex
:
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
把日期去掉,就不用打太多了。
我有一个数据框,其中包含从 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
因为 Series
和 MultiIndex
:
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
把日期去掉,就不用打太多了。