Python Pandas 插值:在缺失的日期范围内重新分配值
Posted
技术标签:
【中文标题】Python Pandas 插值:在缺失的日期范围内重新分配值【英文标题】:Python Pandas interpolation: redistribute value forwards over missing date range 【发布时间】:2021-07-21 05:21:42 【问题描述】:我有关于设施流量的时间趋势数据(随着时间的推移进入设施和从设施释放),但存在差距。由于该数据的结构,当出现差距时,差距前一天的“释放”人为高(占差距期间释放的所有未见个人),而差距后一天的“录取”差距是人为高的(出于同样的原因:在差距期间被接纳并留在设施中的任何个人都将在该日期显示为“接纳”)。
这是一个涉及此类数据缺口的 Pandas 系列示例(零表示 2020-01-04 到 2020-01-07 的数据缺失):
date(index) releases admissions
2020-01-01 15 23
2020-01-02 8 20
2020-01-03 50 14
2020-01-04 0 0
2020-01-05 0 0
2020-01-06 0 0
2020-01-07 0 0
2020-01-08 8 100
2020-01-09 11 19
2020-01-10 9 17
对此的可视化(忽略缺失总人口的单独线性插值)如下所示:
我想对这些数据进行平滑处理,但我不确定使用什么插值方法。我想要完成的是在日期间隙(0)-1 上重新分配“发布”,并在日期间隙(n)+1 上重新分配“录取”。例如,如果一个间隔为 4 天,并且在第 gap(n)+1 天有 100 个录取,我想重新分配,以便在间隔的每一天有 20 个录取,并且在第 gap(n) 天+1 录取被修改为显示 20。
使用上面的示例系列,重新分发将如下所示:
date(index) releases admissions
2020-01-01 15 23
2020-01-02 8 20
2020-01-03 10 14
2020-01-04 10 20
2020-01-05 10 20
2020-01-06 10 20
2020-01-07 10 20
2020-01-08 8 20
2020-01-09 11 19
2020-01-10 9 17
【问题讨论】:
【参考方案1】:您可以创建具有连续零的组 + 之前为releases
一个值,为admissions
之后一个值,然后使用transform('mean')
计算每个组的平均值:
# releases
df['releases'] = df.groupby(
df['releases'].replace(0, np.nan).notna().cumsum()
)['releases'].transform('mean')
# admissions
df['admissions'] = df.groupby(
df['admissions'].replace(0, np.nan).notna().iloc[::-1].cumsum().iloc[::-1]
)['admissions'].transform('mean')
输出:
releases admissions
date
2020-01-01 15 23
2020-01-02 8 20
2020-01-03 10 14
2020-01-04 10 20
2020-01-05 10 20
2020-01-06 10 20
2020-01-07 10 20
2020-01-08 8 20
2020-01-09 11 19
2020-01-10 9 17
更新:为了保留现有的NA
值:
# releases
df['releases_i'] = df.groupby(
df['releases'].ne(0).cumsum()
)['releases'].transform('mean')
# admissions
df['admissions_i'] = df.groupby(
df['admissions'].ne(0).iloc[::-1].cumsum().iloc[::-1]
)['admissions'].transform('mean')
【讨论】:
没有 0 --> np.nan 替换有没有办法做到这一点?上下文是这种情况发生在分组分组中,并且分组可能具有不重叠的日期前导和尾随空值,因此我只需要在实际值之间重新分配(类似于带有limit_area ='inside'的熊猫插值) . @OJT 请查看Update
中的版本是否适合您
对不起,我可能解释得不好——新的上下文试图通过 np.nans 获得均值变换,但在计算均值时将它们视为零(但不将它们转换为零,因为那么这也将在数据中的合法零上运行)。
我可以将其作为新问题打开
@OJT 对不起,我想我还没有完全关注...也许你可以提出一个新问题并分享一些例子是个好主意以上是关于Python Pandas 插值:在缺失的日期范围内重新分配值的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:返回连续缺失的工作日日期,并在数据框中缺失日期旁边分配速率
pandas使用interpolate函数并设置method参数使用不同的插值算法对缺失值进行填充
Python pandas:在groupby数据框中插入缺失日期、时间序列的行
pandas dataframe缺失值(np.nan)处理:识别缺失情况删除0值填补均值填补中位数填补加缺失标签插值填充详解及实例