为 DataDrama 中的列创建列表值

Make list values to columns in DataDrama

我偶然发现了这个问题,几个小时都找不到解决方案。基本上我有以下两个列表,我希望将其转换为我的最终解决方案:一个数据框,其中日期作为索引,每个工具作为一个列,该列中具有相应的值。

在我的第一个列表中,我有以下结构:

[  Instrument                  Date
 0     IWVL.L  2017-12-29T00:00:00Z
 1     IWVL.L  2017-12-28T00:00:00Z
 2     IWVL.L  2017-12-27T00:00:00Z
 3     IWVL.L  2017-12-22T00:00:00Z
 4     IWVL.L  2017-12-21T00:00:00Z
 5     IWVL.L  2017-12-20T00:00:00Z,   Instrument                  Date
 0     IWMO.L  2017-12-29T00:00:00Z
 1     IWMO.L  2017-12-28T00:00:00Z
 2     IWMO.L  2017-12-27T00:00:00Z
 3     IWMO.L  2017-12-22T00:00:00Z
 4     IWMO.L  2017-12-21T00:00:00Z
 5     IWMO.L  2017-12-20T00:00:00Z,

等等(共100条)。

我的第二个列表具有以下结构:

[  Instrument  Total Return
 0     IWVL.L      0.405743
 1     IWVL.L     -0.031201
 2     IWVL.L      0.046824
 3     IWVL.L     -0.140274
 4     IWVL.L      0.375469
 5     IWVL.L      0.156691,   Instrument  Total Return
 0     IWMO.L      0.294196
 1     IWMO.L      0.080300
 2     IWMO.L     -0.080235
 3     IWMO.L     -0.213504
 4     IWMO.L      0.321285
 5     IWMO.L     -0.120337,

现在我想要一个结构,它将 日期作为索引 并将 工具作为单独的列(第一列:IWVL.K,第二列: IWMO.L,依此类推)。 然后按列列出特定日期的总计 Return 的值。看起来像这样(前两种乐器的片段):

               IWVL.L    IWMO.L  ...
Date                        
2017-12-29  0.405743    0.294196 ...    
2017-12-28  -0.031201   0.080300 ...    
2017-12-27  0.046824    -0.080235 ...       

如果有人能在这里提供帮助,我们会很高兴。

哦,除夕快乐!

如果你的两个列表是 l1l2,并且如果元素是 1-1 对应的,那么你的解决方案会简化,使用 concat 和随后的 pivot 操作。

i = pd.concat(l1, ignore_index=True)
j = pd.concat(l2, ignore_index=True)
df = pd.concat([i, j[['Total Return']]], axis=1)\
       .pivot('Date', 'Instrument', 'Total Return')
df

Instrument              IWMO.L    IWVL.L
Date                                    
2017-12-20T00:00:00Z -0.120337  0.156691
2017-12-21T00:00:00Z  0.321285  0.375469
2017-12-22T00:00:00Z -0.213504 -0.140274
2017-12-27T00:00:00Z -0.080235  0.046824
2017-12-28T00:00:00Z  0.080300 -0.031201
2017-12-29T00:00:00Z  0.294196  0.405743

详情

首先,我们连接每个列表中的每个数据框 -

i = pd.concat(l1, ignore_index=True)
i.head()

  Instrument                  Date
0     IWVL.L  2017-12-29T00:00:00Z
1     IWVL.L  2017-12-28T00:00:00Z
2     IWVL.L  2017-12-27T00:00:00Z
3     IWVL.L  2017-12-22T00:00:00Z
4     IWVL.L  2017-12-21T00:00:00Z

j = pd.concat(l2, ignore_index=True)
j.head()

  Instrument  Total Return
0     IWVL.L      0.405743
1     IWVL.L     -0.031201
2     IWVL.L      0.046824
3     IWVL.L     -0.140274
4     IWVL.L      0.375469

现在,由于每个条目直接对应,只需将它们水平连接起来即可。我们只想要第二个中的 'Total Return' 列,因此相应地切出一个数据框列 -

k = j[['Total Return']]
k.head()

   Total Return
0      0.405743
1     -0.031201
2      0.046824
3     -0.140274
4      0.375469

合并 ki -

v = pd.concat([i, k], axis=1)

   Instrument                  Date  Total Return
0      IWVL.L  2017-12-29T00:00:00Z      0.405743
1      IWVL.L  2017-12-28T00:00:00Z     -0.031201
2      IWVL.L  2017-12-27T00:00:00Z      0.046824
3      IWVL.L  2017-12-22T00:00:00Z     -0.140274
4      IWVL.L  2017-12-21T00:00:00Z      0.375469
5      IWVL.L  2017-12-20T00:00:00Z      0.156691
6      IWMO.L  2017-12-29T00:00:00Z      0.294196
7      IWMO.L  2017-12-28T00:00:00Z      0.080300
8      IWMO.L  2017-12-27T00:00:00Z     -0.080235
9      IWMO.L  2017-12-22T00:00:00Z     -0.213504
10     IWMO.L  2017-12-21T00:00:00Z      0.321285
11     IWMO.L  2017-12-20T00:00:00Z     -0.120337

现在,最后一步是 "pivot" 操作。我们怎么知道转向?这只是重塑数据的一个奇特名称。您希望一列成为结果中的索引,另一列成为结果中的列,最后一列成为值。这正是对旋转操作的描述(并且与 SQL 旋转惯用语非常相似)。

v.pivot(index='Date', columns='Instrument', values='Total Return')

Instrument              IWMO.L    IWVL.L
Date                                    
2017-12-20T00:00:00Z -0.120337  0.156691
2017-12-21T00:00:00Z  0.321285  0.375469
2017-12-22T00:00:00Z -0.213504 -0.140274
2017-12-27T00:00:00Z -0.080235  0.046824
2017-12-28T00:00:00Z  0.080300 -0.031201
2017-12-29T00:00:00Z  0.294196  0.405743

可以在此处找到更多信息 -