python - Pandas - 在 group by 后减去 2 个变量

标签 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 和 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/

相关文章:

python - 使用 Tensorboard 绘制自定义数据

python - 使用 python2.7 从 Amazon s3 读取 csv

python - SciPy 中的截断多元正态分布?

Python 正则表达式模块与 re 模块 - 模式不匹配

python - SWIG 如何在可从 Python 调用的结构中创建 typedef 函数指针

Python Pandas 数据帧 : convert local UTM time to GMT using longitude

python - 如何根据条形图的值在 matplotlib 中创建自定义图例?

mysql - 如何根据 SQL 中的条件选择组中的一行?

mysql - 检索每组中的最后一条记录 - MySQL

Mysql 行总和作为行值