具有以下简化的数据框:
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
我需要帮助以有效的方式来执行此操作,并了解我是否处在正确的轨道上。上面的数据框是较大数据集的简化版本。
感谢所有帮助和指导。
答案 0 :(得分:1)
您可以使用concat
将“名称”,“ V”,“ H”,“ M”列彼此之间移动。之后,您可以用tile
填写分数。最后,您可以将resample
,mean
和interpolate
应用于类似以下的组:
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)追加一个新列,该列只是Score
列based 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