Удалите нули в pandas кадре данных, не влияя на результат вменения - PullRequest
0 голосов
/ 16 июня 2020

У меня timeseries dataset с 5M rows.

В столбце есть 19.5% missing values, 80% zeroes (не go по процентным значениям - хотя это означает, что полезны только 0,5% данных, но тогда достаточно 0,5% от 5M). Теперь мне нужно вменять этот столбец.

Учитывая количество строк, требуется около 2,5 часов для KNN, чтобы вменять все это.

Чтобы сделать это быстрее, я подумал об удалении всех строк с нулевыми значениями, а затем выполнить процесс вменения. Но я чувствую, что использование 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), то с нулями значение будет средневзвешенным из 0, 10 и 9. Но если я уберу нули наивно , значение будет вычислено со средневзвешенным значением 8, 10 и 9.

Несколько приблизительных идей, которые я придумал, но не смог реализовать, были следующие:

  1. Изменение весов (используемых при вычислении средневзвешенного значения) процесса вменения KNN так, чтобы удаленные нули принимаются во внимание при вменении.
  2. Добавление столбца, в котором указано, сколько соседних нулей имеет конкретный столбец, а затем его использование для изменения процесса вменения.

Пункты 1. и 2. - это всего лишь приблизительные идеи, которые пришли мне в голову, когда я думал о том, как решить проблему, и могут помочь при ответе на ответ.

PS -

  1. Очевидно, я не загружаю данные временных рядов непосредственно в KNN. Я извлекаю month, day, et c. из столбца даты, а затем использовать это для вменения.

  2. I не требует параллельной обработки в качестве ответа , чтобы код работал быстрее. Объем данных настолько велик, что из-за большого объема оперативной памяти мой ноутбук зависает.

1 Ответ

0 голосов
/ 17 июня 2020

Давайте подумаем логически, оставим пока в стороне машинное обучение. Поскольку мы имеем дело с временными рядами, было бы хорошо, если бы вы вменяли данные со средним значением для одной и той же даты в разные годы, скажем, 2-3 года (если мы рассматриваем 2 года, то 1 год до и 1 год после год пропущенного значения), рекомендуется не использовать go дольше 3 лет. Теперь мы вычислили x. Кроме того, чтобы сделать это вычисленное значение x близким к текущим данным, используйте среднее значение x и y, y - значение линейной интерполяции. В приведенном выше примере y = (10 + 9) / 2, т. Е. Среднее значение одного значения до и одного значения после данных, которые необходимо вычислить.

...