熊猫 - 在分组后减去2个变量

时间:2015-07-07 05:38:30

标签: python pandas group-by

我有以下Pandas"代码"

df=pd.read_csv('option_data.csv')

In [30]:

df.head(9)
​
Out[30]:
     S    date    E   D     V
0  IBM  1/2/2008  1  10  0.1718
1  IBM  1/2/2008  1  50  0.2144
2  IBM  1/2/2008  1  90  0.2733
3  IBM  1/3/2008  1  10  0.1692
4  IBM  1/3/2008  1  50  0.2081
5  IBM  1/3/2008  1  90  0.2634
6  IBM  1/4/2008  1  10  0.1844
7  IBM  1/4/2008  1  50  0.2283
8  IBM  1/4/2008  1  90  0.2779

我希望创建一个变量,即当D = 90时V与V之间的差值,当D = 10时。第一个值是(.2733 - .1718)= .1015。示例如下:

S   date        E   D      V    Skew
IBM 1/2/2008    1   10  0.1718  
IBM 1/2/2008    1   50  0.2144  0.1015
IBM 1/2/2008    1   90  0.2733  
IBM 1/3/2008    1   10  0.1692  
IBM 1/3/2008    1   50  0.2081  0.0942
IBM 1/3/2008    1   90  0.2634  
IBM 1/4/2008    1   10  0.1844  
IBM 1/4/2008    1   50  0.2283  0.0935
IBM 1/4/2008    1   90  0.2779

最后一个变量是" Skew变量"对于第一个偏斜数,当D = 50时,作为V的百分比。所以,(0.0942-0.1015)/0.2144 = -.03405

S   date        E   D   V       Skew    pct_change_Skew
IBM 1/2/2008    1   10  0.1718      
IBM 1/2/2008    1   50  0.2144  0.1015  
IBM 1/2/2008    1   90  0.2733      
IBM 1/3/2008    1   10  0.1692      
IBM 1/3/2008    1   50  0.2081  0.0942  -0.03405
IBM 1/3/2008    1   90  0.2634      
IBM 1/4/2008    1   10  0.1844      
IBM 1/4/2008    1   50  0.2283  0.0935  -0.00001
IBM 1/4/2008    1   90  0.2779      

我的设置如下:

df = df.groupby(['S','date','E']).apply(????)

我需要执行groupby,因为有很多S(符号),日期和E值。

理想情况下,我会在每行填充新变量:

S   date        E   D     V      Skew   pct_change_Skew
IBM 1/2/2008    1   10  0.1718  0.1015  
IBM 1/2/2008    1   50  0.2144  0.1015  
IBM 1/2/2008    1   90  0.2733  0.1015  
IBM 1/3/2008    1   10  0.1692  0.0942  -0.03405
IBM 1/3/2008    1   50  0.2081  0.0942  -0.03405
IBM 1/3/2008    1   90  0.2634  0.0942  -0.03405
IBM 1/4/2008    1   10  0.1844  0.0935  -0.00001
IBM 1/4/2008    1   50  0.2283  0.0935  -0.00001
IBM 1/4/2008    1   90  0.2779  0.0935  -0.00001

如果我能够大胆地要求大熊猫和蟒蛇"直接"代码示例,它将有助于我的学习曲线。非常感谢您提供任何帮助。

约翰

1 个答案:

答案 0 :(得分:2)

计算新的' Skew'在列中,您可以执行groupby并定义自定义的apply功能。要计算pct_change,您可以使用.shift()运算符。

import pandas as pd

df

Out[31]: 
     S      date  E   D       V
0  IBM  1/2/2008  1  10  0.1718
1  IBM  1/2/2008  1  50  0.2144
2  IBM  1/2/2008  1  90  0.2733
3  IBM  1/3/2008  1  10  0.1692
4  IBM  1/3/2008  1  50  0.2081
5  IBM  1/3/2008  1  90  0.2634
6  IBM  1/4/2008  1  10  0.1844
7  IBM  1/4/2008  1  50  0.2283
8  IBM  1/4/2008  1  90  0.2779

def calculate_skew(group):
    group['Skew'] = group.loc[group.D==90, 'V'].values[0] - group.loc[group.D==10, 'V'].values[0]
    return group
# get the new Skew column
df = df.groupby(['S','date']).apply(calculate_skew)
# calculate pct_change
df['Skew_lag3'] = df.Skew.shift(3)
df['Skew_pct_change'] = (df.Skew - df.Skew_lag3)/df.Skew_lag3

Out[33]: 
     S      date  E   D       V    Skew  Skew_lag3  Skew_pct_change
0  IBM  1/2/2008  1  10  0.1718  0.1015        NaN              NaN
1  IBM  1/2/2008  1  50  0.2144  0.1015        NaN              NaN
2  IBM  1/2/2008  1  90  0.2733  0.1015        NaN              NaN
3  IBM  1/3/2008  1  10  0.1692  0.0942     0.1015          -0.0719
4  IBM  1/3/2008  1  50  0.2081  0.0942     0.1015          -0.0719
5  IBM  1/3/2008  1  90  0.2634  0.0942     0.1015          -0.0719
6  IBM  1/4/2008  1  10  0.1844  0.0935     0.0942          -0.0074
7  IBM  1/4/2008  1  50  0.2283  0.0935     0.0942          -0.0074
8  IBM  1/4/2008  1  90  0.2779  0.0935     0.0942          -0.0074