2015-01-29 3 views
1

У меня есть пара данных с отметкой времени, значения и качества. Флаг значения и качества отсутствует для некоторых временных меток и должен быть заполнен зависимостью от окружающих данных. Т.е.Заполнение отсутствующих данных различными способами

  • Если флаги качества на действительных данных Брекетинга данные NaN различны, то установить значение качества и флаг к такому же, как ряд брекетинга с самым высоким качеством флагом. В приведенном ниже примере первый набор NaN будет заменен на qf = 3 и value = 3.
  • Если флаги качества одинаковы, то интерполируйте значение между двумя допустимыми значениями с обеих сторон. В этом примере второй набор NaNs будет заменен QF = 1 и V = 6 и 9.

Код:

import datetime 
import pandas as pd 

start = datetime.strptime("2004-01-01 00:00","%Y-%m-%d %H:%M") 
end = datetime.strptime("2004-01-01 03:00","%Y-%m-%d %H:%M") 
df = pd.DataFrame(\ 
    data = {'v' : [1,2,'NaN','NaN','NaN',3,2,1,5,3,'NaN','NaN',12,43,23,12,32,12,12],\ 
      'qf': [1,1,'NaN','NaN','NaN',3,1,5,1,1,'NaN','NaN',1,3,4,2,1,1,1]},\ 
    index = pd.date_range(start, end,freq="10min")) 

Я попытался решить эту проблему, находя ряды НС и прокручивая их, чтобы исправить первый критерий, затем используя интерполяцию, чтобы решить вторую. Тем не менее, это очень медленно, поскольку я работаю с большим набором.

ответ

0

Один из подходов состоит в том, чтобы делать все возможные заполнения, а затем выбирать между ними по мере необходимости. После выполнения df = df.astype(float) в случае необходимости (ваш пример использует строку "NaN"), что-то, как это должно работать:

is_null = df.qf.isnull() 
fill_down = df.ffill() 
fill_up = df.bfill() 

df.loc[is_null & (fill_down.qf > fill_up.qf)] = fill_down 
df.loc[is_null & (fill_down.qf < fill_up.qf)] = fill_up 
df = df.interpolate() 

Это делает больше работы, чем это необходимо, но это легко увидеть, что он делает, и работа, которую он делает do векторизован и так происходит довольно быстро. В версии вашего набора данных, расширенной до ~ 10M строк (с такой же плотностью нулей), она берет ~ 6s на моем старом ноутбуке. В зависимости от ваших требований, которые могут быть достаточными.

+0

Спасибо, что сделал трюк. – swashbuckle

Смежные вопросы