使用两列的百分比变化,一列移位
Percentage change using two columns, one shifted
我有一个包含以下列的数据框:
member (float64), datetime (datetime64[ns]), var1(float64), var2(float64)
如何计算 var1 和 1 步滞后 var2 的每个元素之间的百分比变化,每个成员都这样做?结果应创建为新列。
var1 var2 member datetime expected new column
131.255 137.032 1 2017-02-02 09:15:00 n/a
129.700 131.193 1 2017-02-02 09:20:00 -0.05351 ((129.7-137.032)/137.032)
新列将以 var1[1]-var2[0]/var2[0]
per "member" 开头。
我尝试过的唯一方法是创建两个数据透视表并计算每个元素的差异,但我认为应该有更有效的矢量化方法吗?
非常感谢。
这是使用 pd.Series.shift
的一种方式:
df['ratio'] = (df['var1'] / df['var2'].shift()) - 1
print(df)
var1 var2 member ratio
0 131.255 137.032 1 NaN
1 129.700 131.193 1 -0.053506
如果您需要对每个成员进行计算,您需要提供更大的数据样本,并准确地向我们展示您想要的更大数据集的输出。
对数据进行排序,使属于同一成员的行彼此相邻。
df = df.sort_values(['member', 'datetime'])
为每组成员创建一个 shifted var2 数组
shifted = df.groupby('member').var2.shift() # the default shifts by 1, which is needed here
使用移位数组分配新列进行计算
df['newcol'] = (df.var1 - shifted) / shifted
这会添加额外的列
var1 var2 member datetime newcol
0 131.255 137.032 1 2017-02-02 09:15:00 NaN
1 129.700 131.193 1 2017-02-02 09:20:00 -0.053506
或者,在 1 行中完成:
df['newcol'] = df.var1/df.groupby('member').var2.shift()-1
我有一个包含以下列的数据框:
member (float64), datetime (datetime64[ns]), var1(float64), var2(float64)
如何计算 var1 和 1 步滞后 var2 的每个元素之间的百分比变化,每个成员都这样做?结果应创建为新列。
var1 var2 member datetime expected new column
131.255 137.032 1 2017-02-02 09:15:00 n/a
129.700 131.193 1 2017-02-02 09:20:00 -0.05351 ((129.7-137.032)/137.032)
新列将以 var1[1]-var2[0]/var2[0]
per "member" 开头。
我尝试过的唯一方法是创建两个数据透视表并计算每个元素的差异,但我认为应该有更有效的矢量化方法吗?
非常感谢。
这是使用 pd.Series.shift
的一种方式:
df['ratio'] = (df['var1'] / df['var2'].shift()) - 1
print(df)
var1 var2 member ratio
0 131.255 137.032 1 NaN
1 129.700 131.193 1 -0.053506
如果您需要对每个成员进行计算,您需要提供更大的数据样本,并准确地向我们展示您想要的更大数据集的输出。
对数据进行排序,使属于同一成员的行彼此相邻。
df = df.sort_values(['member', 'datetime'])
为每组成员创建一个 shifted var2 数组
shifted = df.groupby('member').var2.shift() # the default shifts by 1, which is needed here
使用移位数组分配新列进行计算
df['newcol'] = (df.var1 - shifted) / shifted
这会添加额外的列
var1 var2 member datetime newcol
0 131.255 137.032 1 2017-02-02 09:15:00 NaN
1 129.700 131.193 1 2017-02-02 09:20:00 -0.053506
或者,在 1 行中完成:
df['newcol'] = df.var1/df.groupby('member').var2.shift()-1