Tengo un marco de datos de múltiples índices de datos de panel que muestra precios históricos a lo largo del tiempo. Lo que básicamente quiero hacer es agruparlos por su pronóstico promedio a lo largo del tiempo: alto (por encima de 0.4), medio (entre 0.2 y 0.4) y bajo (por debajo de 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  

Entonces, el primer paso que necesito averiguar es cómo crear una tabla que devuelva el valor medio de cada activo.

  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  

Luego, tengo que unirme a esta tabla recién creada y hacer coincidir el ID de activo, con la misma clasificación a lo largo del tiempo.

                      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  
3
Dick Thompson 15 nov. 2017 a las 01:11

2 respuestas

La mejor respuesta

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
3
YOBEN_S 14 nov. 2017 a las 23:19

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

Salida:

        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
2
Scott Boston 14 nov. 2017 a las 22:18