Pandas创建并提取时间序列到新的datafram

2024-09-29 01:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

具有以下简化的数据帧:

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

将上面的数据帧作为原始集,我进一步按日期索引了它,并在每月的级别上重新采样。我最终想做的是为列(Name,V,H,M)中与分数相关的惟一值创建单独的timeseries(通过分组完成)。虽然我已经减少了抽样,但我预计这些列的分组唯一值的时间序列大小不规则,并计划通过插值来处理这一问题。在

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

我不确定这是应该在一个新的数据帧中捕获还是基于分组的多个数据帧中捕获。以下是timeseries输出的示例:

^{pr2}$

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

感谢任何帮助和指导。在


Tags: 数据nameh2h1h4v2v4v1
2条回答

我在熊猫身上试过这个。我试图使用一个双melt,但是this SO post解释说不能这样做,所以我不得不(1)melt(stack)在不包括Score列的列上给出df_modmelt,然后(b)附加一个新列,它只是Scorebased on this idea的重复版本——本质上,同一列被重复(垂直连接)n次:我使用(len(df_modmelt)/len(df))来完成这个操作。这是合理的,因为在熔化之后,我没有更改行顺序,因此熔融数据帧df_modmelt中的每个块的顺序与原始数据相同,并且附加Scores列保留了Scores列与其他列之间的关联。那就用^{} with ^{} and ^{}。在

在第二个月的代码中添加了一些示例数据

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

代码

^{pr2}$

这是输出

   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

编辑

最后一行pd.offsets.MonthBegin(1)只是返回这个月的第一个日期。在

编辑2

每个请求获取关于df_finalunique values in the ^{} column之间相关性的附加信息-请参阅有用的链接here

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的输出

print(df_pivot)
value        H1  H10  H11  H15   H2  H21        H4   H5   H6   H7   H9
Date                                                                  
2018-01-01  4.5  3.0  NaN  4.0  2.5  5.0  2.666667  NaN  4.0  NaN  3.5
2018-02-01  NaN  NaN  4.0  NaN  NaN  NaN       NaN  2.0  NaN  5.0  NaN

print(df_pivot.corr())
value  H1  H10  H11  H15  H2  H21  H4  H5  H6  H7  H9
value                                                
H1    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H10   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H11   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H15   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H2    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H21   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H4    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H5    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H6    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H7    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H9    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN

您可以使用concat将列Name、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())

相关问题 更多 >