【问题标题】:Interpolate hourly load of a selected months of a year from the same months of the previous year and the next year in python pandas?在 python pandas 中从上一年和下一年的相同月份中插入一年中选定月份的每小时负载?
【发布时间】:2021-06-30 00:47:13
【问题描述】:

我有以下三个数据框:

df1:

   date_time           system_load
01-01-2017 00:00:00    208111
01-01-2017 01:00:00    208311
01-01-2017 02:00:00    208311
01-01-2017 03:00:00    208011
  ...............       ...
31-12-2017 20:00:00    208611
31-12-2017 21:00:00    208411
31-12-2017 22:00:00    208111
31-12-2017 23:00:00    208911

df1的系统负载值没有问题。

df2:

   date_time           system_load
01-01-2018 00:00:00    208111
01-01-2018 01:00:00    208311
01-01-2018 02:00:00    208311
01-01-2018 03:00:00    208011
  ...............       ...
31-12-2018 20:00:00    209611
31-12-2018 21:00:00    209411
31-12-2018 22:00:00    209111
31-12-2018 23:00:00    209911

从 06-03-2018 20:00:00 到 24-10-2018 22:00:00 丢失 df2 的系统负载值。

df3:

   date_time           system_load
01-01-2019 00:00:00    309119
01-01-2019 01:00:00    309391
01-01-2019 02:00:00    309811
01-01-2019 03:00:00    309711
  ...............       ...
31-12-2019 20:00:00    309611
31-12-2019 21:00:00    309411
31-12-2019 22:00:00    309111
31-12-2019 23:00:00    309911

df3的系统负载值没有问题。

我想要的是使用相应的 df1 和 df3 每小时记录(06-03-2017 20:00:00 直到 24-10-2017 22:00:00)以适当的方式插入 df2 中错过的每小时记录和 06-03-2019 20:00:00 至 24-10-2019 22:00:00 分别)。根据“Pierre D”的宝贵意见,我附上了我的缩放数据。

【问题讨论】:

  • 您有具体的策略吗?当数据缺失时,您可以取相邻年份的平均值(精确为 52 周,以反映每周的季节性)。但是,您的数据样本表明 2019 年的平均值远大于 2018 年,而 2018 年的平均值与 2017 年大致相同,因此纵向变化 (diff) 与总体趋势相结合可能是更好的方法。重要的是,这完全取决于您要对结果数据做什么。
  • 感谢“Pierre D”的回复。您的想法很棒,但是考虑到 df1 值 > df2 值 > df3 值,我该如何使用 python pandas 或 python 中的任何方式来做到这一点。
  • 嗯,这只是一个问题。基本上,您需要了解一般的时间序列分布(基于有限的样本数据和术语“system_load”,可能类似于泊松分布,平均逐年缓慢增加)。由于某些日历日期,可能会有特殊事件。无论如何,一旦您了解了时间序列的一般特征,您就可以为缺失的日期生成合理的数据。所以我的问题是:从统计学上讲,您对数据还有什么了解?
  • 而更重要的问题是:你想对结果做什么?让别人误以为你一开始就没有缺失数据?...训练一个机器学习模型(然后注意窥视偏差)?
  • 感谢“Pierre D”,我正在尝试绘制我的数据并编辑我的问题,以便给我您的意见。

标签: pandas dataframe time-series


【解决方案1】:

这是一个非常基本的策略,它只使用相邻年份的数据来填充缺失值。 offset 被选为精确的 52 周,以反映可能的每周季节性。

# get the whole series together, and resample to have missing data as NaN:
s = pd.concat([df1, df2, df3])['system_load'].resample('H').asfreq()

offset = 52 * 7 * 24  # 52 weeks, 7 days/week, 24 hours/day
filler = pd.concat([s.shift(offset), s.shift(-offset)], axis=1).mean(axis=1)
out = s.where(~s.isna(), filler)

# optional: make a new df2 with the filled values
df2mod = out.truncate(
    before='2018',
    after=pd.Timestamp('2019') - pd.Timedelta(1)
).to_frame('system_load')

注意事项:

  • out 包含整个 system_load 使用相邻年份的“填充”系列。
  • 我们使用pandas.DataFrame.mean() 构建filler 系列作为相邻两年的平均值,以照顾NaN 的方式(例如,如果一年或另一年有NaN,那么平均值是唯一的非 NaN 值)。
  • 这是填充缺失数据的最基本方法之一,可能不会骗过细心的观察者。根据重建数据的预期用途,应考虑更精细的策略。数据重建是一个活跃的研究领域,文献中有复杂的方法。例如,可以使用GAN 构建一个很难与真实数据区分开来的结果系列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多