我有以下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
如果我能够大胆地要求大熊猫和蟒蛇"直接"代码示例,它将有助于我的学习曲线。非常感谢您提供任何帮助。
约翰
答案 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