使用两列的百分比变化,一列移位

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