我有关于设施流量的时间趋势数据(随着时间的推移进入和释放一个设施),有差距。由于这一数据的结构,当出现缺口时,缺口前一天的“释放”是人为的(占在缺口期间释放的所有未见人员的数字),而在差距出现后的第一天的“接纳”(出于同样的原因:在缺口期间被接纳并留在设施内的任何个人在这一天将被视为“接纳”)。
以下是涉及这种数据差距的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天,日间隔(N)+1有100名招生,我想重新分配,在间隔的每一天,有20名招生,而日间隔(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
发布于 2021-04-27 20:46:15
您可以为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')
https://stackoverflow.com/questions/67290293
复制相似问题