【问题标题】:Remove zeros in pandas dataframe without effecting the imputation result在不影响插补结果的情况下删除 pandas 数据框中的零
【发布时间】:2020-10-05 14:05:33
【问题描述】:

我有一个timeseries dataset5M rows

该列有19.5% missing values80% zeroes(不要按百分比值 - 虽然这意味着只有 0.5% 的数据有用,但 5M 的 0.5% 就足够了)。现在,我需要估算此列。

考虑到行数,KNN 需要大约 2.5 小时来估算整个事情。

为了加快速度,我想删除所有零值行,然后执行插补过程。但我觉得在此之后天真地使用 KNN 会导致高估(因为所有零值都消失了,并且保持邻居的数量固定,预计平均值会增加) .

那么,有没有办法:

  • 修改输入到 KNN 模型的数据

  • 去除带零的行后进行插补过程,使插补后得到的值相同或至少接近

为了更清楚地理解问题,请考虑以下虚拟数据框:


    DATE    VALUE
0   2018-01-01  0.0
1   2018-01-02  8.0
2   2018-01-03  0.0
3   2018-01-04  0.0
4   2018-01-05  0.0
5   2018-01-06  10.0
6   2018-01-07  NaN
7   2018-01-08  9.0
8   2018-01-09  0.0
9   2018-01-10  0.0

现在,如果我使用KNN (k=3),然后使用零,该值将是0109 的加权平均值。但是,如果我天真地删除零,则该值将使用8109 的加权平均值进行估算。

我想到了一些粗略的想法,但无法进行如下:

  1. 修改 KNN 插补过程的权重(用于加权平均计算),以便在插补过程中考虑移除的 0。
  2. 添加一列,说明特定列有多少个相邻零,然后以某种方式使用它来修改插补过程。

1.2. 只是我在思考如何解决问题时想到的粗略想法,可能会在回答答案时有所帮助。

PS-

  1. 显然,我没有将时间序列数据直接输入 KNN。我正在做的是从日期列中提取monthday 等,然后使用它进行估算。

  2. 不需要并行处理作为答案来使代码运行得更快。数据如此之大,以至于我的笔记本电脑占用了大量内存。

【问题讨论】:

  • 嗨,@paradoxlover。在数据中使用零的平均值进行插补将显着影响您的插补因为零的数量很高并且它们没有意义,但在插补数据时它们肯定会充当异常值。因此,我建议使用中位数进行估算,因为它对异常值的影响较小。您可以参考以下链接,为什么我建议将中值作为填充值。 stats.stackexchange.com/questions/143700/…
  • 另外,您可以使用时间序列本身来查找缺失值

标签: python pandas missing-data knn imputation


【解决方案1】:

让我们从逻辑上思考,暂时将机器学习部分放在一边。 由于我们正在处理时间序列,因此最好用不同年份同一日期的平均值估算数据,例如 2-3 年(如果我们考虑 2 年,则为 1 年前和 1 年后缺失值年份),建议不要超过 3 年。我们现在已经计算了 x。 进一步使这个计算值x接近当前数据,使用x和y的平均值,y是线性插值。 在上面的例子中,y = (10 + 9)/2,即要插补的数据前一个值和后一个值的平均值。

【讨论】:

  • 感谢您的回答。但是,不幸的是,数据只能使用 6 个月。
  • 好的,那么在这里使用时间序列技术是不可行的,您在数据中看到了什么趋势和季节性?
  • 时间跨度不是很大,找不到任何合理的趋势或季节性!!!
  • 但这不是我担心的事情。我真正担心的是数据集中存在大量零。这有点多余和占用空间。
  • 正确,就是我想说的,数据不足以做时间序列预测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2022-11-14
相关资源
最近更新 更多