首页 > 解决方案 > Pandas 创建时间序列并将其提取到新数据帧

问题描述

具有以下简化的数据框:

Date           Name       Score       V       H       M
2018-01-01       A          5         V1      H4      M6
2018-01-01       B          3         V5      H2      M1
2018-01-01       C          4         V7      H6      M6
2018-01-01       A          4         V11     H9      M3
2018-01-01       C          2         V4      H2      M18
2018-01-02       A          4         V9      H1      M9
2018-01-02       B          1         V15     H4      M10
2018-01-02       A          3         V10     H10     M14
2018-01-03       C          5         V5      H21     M34
2018-01-04       A          3         V8      H9      M6
2018-01-04       A          4         V4      H15     M9
2018-01-04       C          2         V2      H4      M14
2018-01-04       B          5         V1      H1      M2

将上述数据框视为原始集,我进一步按日期对其进行索引,并按月重新采样。我最终想做的是为列(名称、V、H、M)中与分数相关的唯一值创建单独的时间序列(通过分组完成)。虽然我已经进行了下采样,但我预计这些列的分组唯一值中的时间序列大小不规则,并计划进行插值以处理该问题。

目标是创建多个时间序列并将其提取到一个新的数据帧中,并探索它们的相关图。例如,我将有 V1、V2、...、Vn、H1、H2、...、Hn、M1、M2、...、Mn 等的单独时间序列。

我不确定这是否应该全部捕获在一个新数据帧或基于分组的多个数据帧中。以下是时间序列输出的示例:

        Date           Score         
V1      2018-01-01      4.5
        2018-02-01      4.1
        2018-03-01      4.3
        2018-04-01      4.2
        2018-05-01      4.4

        Date           Score         
V2      2018-01-01      4.5
        2018-02-01      4.1
        2018-03-01      4.3
        2018-04-01      4.2
        2018-05-01      4.4

        Date           Score         
V3      2018-01-01      4.5
        2018-02-01      4.1
        2018-03-01      4.3
        2018-04-01      4.2
        2018-05-01      4.4

我需要帮助来实施一种有效的方法来做到这一点,并知道我是否走在正确的轨道上。上面的数据框是更大数据集的简化版本。

感谢任何帮助和指导。

标签: pythonpandasdataframetime-seriescorrelation

解决方案


您可以使用concat将列名称、V、H、M 移动到彼此下方。之后,您可以使用 填充分数tile。最后,您可以申请resample,meaninterpolate以下组:

import numpy as np

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df2 = pd.concat([df.Name, df.V, df.H, df.M]).to_frame(name='Name')
df2['Score'] = np.tile(df['Score'].values,4)
df2.groupby('Name').apply(lambda x: x.resample('M').mean().interpolate())

推荐阅读