我有一个面板数据的多索引数据框,显示了一段时间内的历史价格。我基本上想要做的是将它们按时间平均预测(高于0.4),中等(0.2到0.4)和低(低于0.2)进行分组。
price yield forecast
date assetid
1/1/2017 4200 96.44 0.23 0.64
1/1/2017 408 46.3 0.6 0.4
1/1/2017 413 50.68 0.47 0.73
1/1/2017 3911 82.48 0.33 0.84
1/1/2017 7392 97.24 0.4 0.62
1/1/2017 7144 31.86 0.18 0.54
1/1/2017 8793 59.66 0.65 0.9
1/2/2017 4200 57.1 0.21 0.69
1/2/2017 408 4.76 0.86 0.16
1/2/2017 413 70.79 0.24 0.12
1/2/2017 3911 5.43 0.91 0.44
1/2/2017 7392 47.33 0.51 0.18
1/2/2017 7144 17.85 0.79 0.59
1/2/2017 8793 98.08 0.2 0.24
因此,我需要弄清楚的第一步是如何创建一个返回每个资产平均值的表。
assetid Average of forecast
408 0.73
413 0.355
3911 0.62
4200 0.22
7144 0.485
7392 0.455
8793 0.425
然后,我必须加入这个新创建的表并匹配assetid,并随着时间的推移进行相同的分类。
price yield forecast type
date assetid
1/1/2017 4200 96.44 0.23 0.64 med
1/1/2017 408 46.3 0.6 0.4 high
1/1/2017 413 50.68 0.47 0.73 med
1/1/2017 3911 82.48 0.33 0.84 med
1/1/2017 7392 97.24 0.4 0.62 high
1/1/2017 7144 31.86 0.18 0.54 low
1/1/2017 8793 59.66 0.65 0.9 high
1/2/2017 4200 57.1 0.21 0.69 med
1/2/2017 408 4.76 0.86 0.16 high
1/2/2017 413 70.79 0.24 0.12 med
1/2/2017 3911 5.43 0.91 0.44 med
1/2/2017 7392 47.33 0.51 0.18 high
1/2/2017 7144 17.85 0.79 0.59 low
1/2/2017 8793 98.08 0.2 0.24 high
答案 0 :(得分:3)
pd.cut
+ transform
df['type']=pd.cut(df.groupby(level='assetid')
.forecast
.transform('mean'),[0,0.2,0.4,np.inf],labels=['low','med','high'])
df
Out[663]:
price yield forecast type
date assetid
1/1/2017 4200 96.44 0.23 0.64 high
408 46.30 0.60 0.40 med
413 50.68 0.47 0.73 high
3911 82.48 0.33 0.84 high
7392 97.24 0.40 0.62 med
7144 31.86 0.18 0.54 high
8793 59.66 0.65 0.90 high
1/2/2017 4200 57.10 0.21 0.69 high
408 4.76 0.86 0.16 med
413 70.79 0.24 0.12 high
3911 5.43 0.91 0.44 high
7392 47.33 0.51 0.18 med
7144 17.85 0.79 0.59 high
8793 98.08 0.20 0.24 high
答案 1 :(得分:2)
让我们使用pd.cut
:
s = pd.cut(df.groupby('assetid')['forecast'].mean(),[0,.2,.4,np.inf], labels=['low','med','high'])
df['type'] = df.assetid.map(s)
print(df)
输出:
date assetid price yield forecast type
0 1/1/2017 4200 96.44 0.23 0.64 high
1 1/1/2017 408 46.30 0.60 0.40 med
2 1/1/2017 413 50.68 0.47 0.73 high
3 1/1/2017 3911 82.48 0.33 0.84 high
4 1/1/2017 7392 97.24 0.40 0.62 med
5 1/1/2017 7144 31.86 0.18 0.54 high
6 1/1/2017 8793 59.66 0.65 0.90 high
7 1/2/2017 4200 57.10 0.21 0.69 high
8 1/2/2017 408 4.76 0.86 0.16 med
9 1/2/2017 413 70.79 0.24 0.12 high
10 1/2/2017 3911 5.43 0.91 0.44 high
11 1/2/2017 7392 47.33 0.51 0.18 med
12 1/2/2017 7144 17.85 0.79 0.59 high
13 1/2/2017 8793 98.08 0.20 0.24 high