以周期为参数的列之间的滚动差异

Rolling difference between columns with period as parameter

我有一个数据框:

df = pd.DataFrame({ 
    'BU': ['Total', 'Total', 'Total', 'ABC', 'ABC', 'ABC'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    '1Q16': [100, 120, 200, 200, 190, 210],
    '2Q16': [120, 120, 100, 200, 190, 210],
    '3Q16': [200, 250, 450, 120, 180, 190],
    '4Q16': [150, 850, 790, 410, 170, 990],
    '1Q17': [120, 240, 790, 10, 170, 990],
    '2Q17': [110, 140, 650, 50, 100, 120]})

我想要新的列,列之间有滚动差异。所以我想要年度差异,也就是说,2016 年第 1 季度和 2017 年第 1 季度的收入差异。我也想要季度之间的差异。列之间的句点应该是参数。

我知道如何通过应用 pct_change 函数来获取百分比变化。

df_qtrs_YoY = df[['1Q16', '2Q16', '3Q16', '4Q16', '1Q17', '2Q17']].pct_change(periods=4, axis=1).dropna(1)

我也可以这样做吗?我的数据集很大。因此,矢量化解决方案可能效果最好。输出应如下所示:

df1 = pd.DataFrame({ 
    'BU': ['Total', 'Total', 'Total', 'ABC', 'ABC', 'ABC'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    '1Q17': [20, 140, 590, -190, -20, 0],
    '2Q17': [-10, 20, -30, -150, -90, -90]})

也许您正在寻找 .diff() 函数?

diff_qtrs_YoY = df[["1Q16", "2Q16", "3Q16", "4Q16", "1Q17", "2Q17"]].diff(
    periods=4, axis=1
)
print(df_qtrs_YoY)

打印:

   1Q16  2Q16  3Q16  4Q16   1Q17   2Q17
0   NaN   NaN   NaN   NaN   20.0  -10.0
1   NaN   NaN   NaN   NaN  120.0   20.0
2   NaN   NaN   NaN   NaN  590.0  550.0
3   NaN   NaN   NaN   NaN -190.0 -150.0
4   NaN   NaN   NaN   NaN  -20.0  -90.0
5   NaN   NaN   NaN   NaN  780.0  -90.0

或每个季度之间:

print(
    df[["1Q16", "2Q16", "3Q16", "4Q16", "1Q17", "2Q17"]].diff(periods=1, axis=1)
)

   1Q16   2Q16   3Q16   4Q16   1Q17   2Q17
0   NaN   20.0   80.0  -50.0  -30.0  -10.0
1   NaN    0.0  130.0  600.0 -610.0 -100.0
2   NaN -100.0  350.0  340.0    0.0 -140.0
3   NaN    0.0  -80.0  290.0 -400.0   40.0
4   NaN    0.0  -10.0  -10.0    0.0  -70.0
5   NaN    0.0  -20.0  800.0    0.0 -870.0