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值填补均值填补中位数填补加缺失标签插值填充详解及实例

数据分析缺失值处理(Missing Values)——删除法填充法插值法

根据 max 和 min 填写缺失的日期 pandas