【问题标题】:Get sum of row differences with Pandas .diff()使用 Pandas .diff() 获取行差异的总和
【发布时间】:2020-10-26 02:47:26
【问题描述】:

我正在做一个时间序列分析,我需要计算几个属性随时间的变化。 Pandas 制作了一个简单的版本; .diff(periods=n) 函数将计算一行与前 n 行之间的差异,但是,这不是我需要的相当...

df= pd.DataFrame({'day_num': [134, 135, 136, 137],
                    'swe': [38.8, 38.9, 37.6, 36.8],
                     'prcp': [0., 0.1, 0., 0.15],
                     'flow': [2930, 3350, 3900, 4090]})

diff_3 = df.diff(periods=3)

返回:

   day_num   swe  prcp  flow
0      134  38.8  0.00  2930
1      135  38.9  0.00  3350
2      136   37.6  0.00  3900
3      137  36.8  0.15  4090

还有:

  day_num  swe  prcp    flow
0      NaN  NaN   NaN     NaN
1      NaN  NaN   NaN     NaN
2      NaN  NaN   NaN     NaN
3      3.0 -2.0  0.15  1160.0

在 swe 列(以英寸为单位的雪水当量,字面意思是特定积雪的液态水当量),指数 3 的 3 天差异为 -2.0,等于 36.8 - 38.8。但是,请注意在 3 天内有增加和减少。这意味着在这 3 天的窗口中,总共 2.1 英寸(我想要的输出)的水融化并促成了水流(流柱)。最小值 - 最大值也不起作用,因为如果我将 n 值增加到 7 或 14,很容易出现输出中未考虑的“熔化”。需要的是 n 天内单日差异的总和。我最终想将 diff_n 列合并回原始数据集。

任何想法将不胜感激。另外,这是我的第一篇文章,所以请告诉我如何改进我的格式/内容...

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    n 天内单日差异的总和

    首先,diff 连续行,然后执行 rolling sum。由于diff 之后的系列已经连续 2 行存在差异,因此对于滚动总和,我们仅提供 period-1(在我们的示例中为 3-1 = 2)。

    periods = 3
    df['swe'] = df['swe'].diff().rolling(periods-1).sum()
    

    输出:

       day_num  swe  prcp  flow
    0      134  NaN  0.00  2930
    1      135  NaN  0.10  3350
    2      136 -1.2  0.00  3900
    3      137 -2.1  0.15  4090
    

    这也相当于做后续,因为中间天的贡献最终会抵消:

    df['swe'] = df['swe'].diff(periods-1)
    

    输出:

       day_num   swe  prcp  flow  swe_using_diff  swe_using_rolling_sum
    0      134  38.8  0.00  2930             NaN                    NaN
    1      135  38.9  0.10  3350             NaN                    NaN
    2      136  37.6  0.00  3900            -1.2                   -1.2
    3      137  36.8  0.15  4090            -2.1                   -2.1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 2011-12-01
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多