【问题标题】:Pivot time series into panel ...python将时间序列旋转到面板中...python
【发布时间】:2018-10-19 08:10:29
【问题描述】:

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

                 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
           ...

无法让它工作。我试图堆叠数据框,但随后我将日期作为索引,将投资组合作为第二个“变量”。由于需要指定太多变量,因此我无法使用 pivot ......

有人知道怎么做吗?

亲切的问候,杰斯珀。

【问题讨论】:

  • 我觉得面板不是个好主意,因为现在是deprecated
  • 嗨 - 是的,我写了“面板”来指示我最终需要得到的数据的整体结构,不一定是熊猫功能。最后我需要一个数据框。
  • 不确定预期的输出 - 您需要 3 列吗?

标签: python dataframe time-series panel


【解决方案1】:

我认为你需要unstackSeriesMultiIndex

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

【讨论】:

    【解决方案2】:

    虽然前面的答案更优雅 - 您可以执行以下操作:

    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

    去掉日期,就不用输入太多了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2016-10-20
      • 2016-09-26
      • 2021-03-07
      相关资源
      最近更新 更多