熊猫创建时间序列并将其提取到新数据框中

时间:2018-11-04 17:55:31

标签: python pandas dataframe time-series correlation

具有以下简化的数据框:

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

我需要帮助以有效的方式来执行此操作,并了解我是否处在正确的轨道上。上面的数据框是较大数据集的简化版本。

感谢所有帮助和指导。

2 个答案:

答案 0 :(得分:1)

您可以使用concat将“名称”,“ V”,“ H”,“ M”列彼此之间移动。之后,您可以用tile填写分数。最后,您可以将resamplemeaninterpolate应用于类似以下的组:

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())

答案 1 :(得分:1)

我用熊猫melt尝试过。我试图使用双melt,但是this SO post解释说不能这样做,所以我不得不(1)在melt列以外的列上使用Score(堆栈)给df_modmelt,然后(b)追加一个新列,该列只是Scorebased on this idea的重复版本-本质上,同一列已被重复(垂直串联){{1 }}次:我使用n进行了此操作。这是有道理的,因为在融化之后,我没有更改行顺序,因此融化的数据帧(len(df_modmelt)/len(df))中的每个块与原始数据的顺序相同,并且附加df_modmelt列可以保留Scores列和其他列。然后只需使用Grouper with key='Date' and freq='M'

这是示例代码(我在示例数据中附加了3行以获取第2个月的一些值)

Scores

代码

df['Date'] = pd.to_datetime(df['Date'])

         Date Name  Score    V    H    M
0  2018-01-01    A      5   V1   H4   M6
1  2018-01-01    B      3   V5   H2   M1
2  2018-01-01    C      4   V7   H6   M6
3  2018-01-01    A      4  V11   H9   M3
4  2018-01-01    C      2   V4   H2  M18
5  2018-01-02    A      4   V9   H1   M9
6  2018-01-02    B      1  V15   H4  M10
7  2018-01-02    A      3  V10  H10  M14
8  2018-01-03    C      5   V5  H21  M34
9  2018-01-04    A      3   V8   H9   M6
10 2018-01-04    A      4   V4  H15   M9
11 2018-01-04    C      2   V2   H4  M14
12 2018-01-04    B      5   V1   H1   M2
13 2018-02-01    A      4   V5  H11   M9
14 2018-02-01    C      2   V7   H5  M14
15 2018-02-02    B      5   V1   H7   M2

这是输出

cols = ['V','H','M','Name']
df_modmelt = (df[['Date']+cols]
                .melt(id_vars=['Date'],
                    var_name='column',
                    value_name='value'))
df_modmelt['Score'] = (pd.concat([df['Score']]*(len(df_modmelt)/len(df)))
                        .reset_index(drop=True))
df_final = (df_modmelt
        .groupby(['column','value', pd.Grouper(key='Date', freq='M')])['Score']
        .mean()
        .reset_index(drop=False))
df_final['Date'] = df_final['Date'].dt.floor('d') - pd.offsets.MonthBegin(1)
print(df_final)

修改

最后一行 column value Date Score 0 H H1 2018-01-01 4.500000 1 H H10 2018-01-01 3.000000 2 H H11 2018-02-01 4.000000 3 H H15 2018-01-01 4.000000 4 H H2 2018-01-01 2.500000 5 H H21 2018-01-01 5.000000 6 H H4 2018-01-01 2.666667 7 H H5 2018-02-01 2.000000 8 H H6 2018-01-01 4.000000 9 H H7 2018-02-01 5.000000 10 H H9 2018-01-01 3.500000 11 M M1 2018-01-01 3.000000 12 M M10 2018-01-01 1.000000 13 M M14 2018-01-01 2.500000 14 M M14 2018-02-01 2.000000 15 M M18 2018-01-01 2.000000 16 M M2 2018-01-01 5.000000 17 M M2 2018-02-01 5.000000 18 M M3 2018-01-01 4.000000 19 M M34 2018-01-01 5.000000 20 M M6 2018-01-01 4.000000 21 M M9 2018-01-01 4.000000 22 M M9 2018-02-01 4.000000 23 Name A 2018-01-01 3.833333 24 Name A 2018-02-01 4.000000 25 Name B 2018-01-01 3.000000 26 Name B 2018-02-01 5.000000 27 Name C 2018-01-01 3.250000 28 Name C 2018-02-01 2.000000 29 V V1 2018-01-01 5.000000 30 V V1 2018-02-01 5.000000 31 V V10 2018-01-01 3.000000 32 V V11 2018-01-01 4.000000 33 V V15 2018-01-01 1.000000 34 V V2 2018-01-01 2.000000 35 V V4 2018-01-01 3.000000 36 V V5 2018-01-01 4.000000 37 V V5 2018-02-01 4.000000 38 V V7 2018-01-01 4.000000 39 V V7 2018-02-01 2.000000 40 V V8 2018-01-01 3.000000 41 V V9 2018-01-01 4.000000 仅返回该月的第一天。

编辑2

每个请求以获取有关pd.offsets.MonthBegin(1)的{​​{3}}之间的相关性的其他信息-请参见有用的链接unique values in the value column

df_final

for c in ['Name','H']: df_pivot = (df_final[df_final.value.isin(df[c].unique().tolist())] .pivot_table(index='Date', columns='value', values='Score')) 列的输出

Name

print(df_pivot) value A B C Date 2018-01-01 3.833333 3.0 3.25 2018-02-01 4.000000 5.0 2.00 print(df_pivot.corr()) value A B C value A 1.0 1.0 -1.0 B 1.0 1.0 -1.0 C -1.0 -1.0 1.0 列的输出

H