Удалите нули в кадре данных pandas, не влияя на результат вменения

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

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

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

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

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

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

PS -

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

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


person paradocslover    schedule 16.06.2020    source источник
comment
Привет, @paradoxlover. Вменение среднего значения с нулем в данных существенно повлияет на ваше вменение, поскольку количество нулей велико, и они не имеют значения, но они наверняка будут действовать как выбросы при вменении данных. Итак, я бы предложил использовать для вменения медианное значение, поскольку оно меньше отклоняется от выбросов. Вы можете обратиться к следующей ссылке, почему я предлагаю медианное значение в качестве значения наполнителя. stats.stackexchange.com/questions/143700/   -  person girijesh96    schedule 16.06.2020
comment
Кроме того, вы можете использовать сам временной ряд, чтобы найти недостающие значения.   -  person girijesh96    schedule 16.06.2020


Ответы (1)


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

person Prashant Sinha    schedule 17.06.2020
comment
Спасибо за ваш ответ. Но, к сожалению, данные доступны только за 6 месяцев. - person paradocslover; 17.06.2020
comment
Хорошо, тогда здесь невозможно использовать методы временных рядов, какой тренд и сезонность вы видите в данных? - person Prashant Sinha; 17.06.2020
comment
Временной промежуток невелик, чтобы найти какой-либо разумный тренд или сезонность !!! - person paradocslover; 17.06.2020
comment
Но меня это не беспокоит. Что меня действительно беспокоит, так это большое количество нулей в наборе данных. Это вроде избыточно и требует много места. - person paradocslover; 17.06.2020
comment
правильно, это то, что я хочу сказать, данных недостаточно для прогнозирования временных рядов. - person Prashant Sinha; 18.06.2020