我有以下 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 和 D=10 时的 V 之间的差值。第一个值为 (.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 时“Skew 变量”的变化,以 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(????)
我需要执行分组,因为有很多 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
如果我可以大胆地要求一个 pandas 以及一个 python“直接”代码示例,这将有助于我的学习曲线。非常感谢您对此提供的任何帮助。
约翰
最佳答案
要计算新的“倾斜”列,您可以执行 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
关于python - Pandas - 在 group by 后减去 2 个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31260534/