У меня есть файл данных pandas DataFrame со временем как индекс (1 мин. Freq) и несколько столбцов данных. Иногда данные содержат NaN. Если это так, я хочу интерполировать только в том случае, если разрыв не превышает 5 минут. В этом случае это будет максимум 5 последовательных NaN. Данные могут выглядеть следующим образом (случаи несколько тестов, которые показывают проблемы):Интерполировать (или экстраполировать) только небольшие пробелы в pandas dataframe
import numpy as np
import pandas as pd
from datetime import datetime
start = datetime(2014,2,21,14,50)
data = pd.DataFrame(index=[start + timedelta(minutes=1*x) for x in range(0, 8)],
data={'a': [123.5, np.NaN, 136.3, 164.3, 213.0, 164.3, 213.0, 221.1],
'b': [433.5, 523.2, 536.3, 464.3, 413.0, 164.3, 213.0, 221.1],
'c': [123.5, 132.3, 136.3, 164.3] + [np.NaN]*4,
'd': [np.NaN]*8,
'e': [np.NaN]*7 + [2330.3],
'f': [np.NaN]*4 + [2763.0, 2142.3, 2127.3, 2330.3],
'g': [2330.3] + [np.NaN]*7,
'h': [2330.3] + [np.NaN]*6 + [2777.7]})
Он звучит так:
In [147]: data
Out[147]:
a b c d e f g h
2014-02-21 14:50:00 123.5 433.5 123.5 NaN NaN NaN 2330.3 2330.3
2014-02-21 14:51:00 NaN 523.2 132.3 NaN NaN NaN NaN NaN
2014-02-21 14:52:00 136.3 536.3 136.3 NaN NaN NaN NaN NaN
2014-02-21 14:53:00 164.3 464.3 164.3 NaN NaN NaN NaN NaN
2014-02-21 14:54:00 213.0 413.0 NaN NaN NaN 2763.0 NaN NaN
2014-02-21 14:55:00 164.3 164.3 NaN NaN NaN 2142.3 NaN NaN
2014-02-21 14:56:00 213.0 213.0 NaN NaN NaN 2127.3 NaN NaN
2014-02-21 14:57:00 221.1 221.1 NaN NaN 2330.3 2330.3 NaN 2777.7
Я знаю data.interpolate()
, но он имеет ряд недостатков, так как она производит этот результат, который хорош для колонн аи, но и для столбцов Fh он не по разным причинам ::
a b c d e f g \
2014-02-21 14:50:00 123.5 433.5 123.5 NaN NaN NaN 2330.3
2014-02-21 14:51:00 129.9 523.2 132.3 NaN NaN NaN 2330.3
2014-02-21 14:52:00 136.3 536.3 136.3 NaN NaN NaN 2330.3
2014-02-21 14:53:00 164.3 464.3 164.3 NaN NaN NaN 2330.3
2014-02-21 14:54:00 213.0 413.0 164.3 NaN NaN 2763.0 2330.3
2014-02-21 14:55:00 164.3 164.3 164.3 NaN NaN 2142.3 2330.3
2014-02-21 14:56:00 213.0 213.0 164.3 NaN NaN 2127.3 2330.3
2014-02-21 14:57:00 221.1 221.1 164.3 NaN 2330.3 2330.3 2330.3
h
2014-02-21 14:50:00 2330.300000
2014-02-21 14:51:00 2394.214286
2014-02-21 14:52:00 2458.128571
2014-02-21 14:53:00 2522.042857
2014-02-21 14:54:00 2585.957143
2014-02-21 14:55:00 2649.871429
2014-02-21 14:56:00 2713.785714
2014-02-21 14:57:00 2777.700000
F) зазор состоит из 4-х минут стоят NaNs в начале, тыс ey следует заменить на это значение 2763,0 (т.е. экстраполяция назад во время)
г) Разрыв больше чем за 5 минут, но все же он получает экстраполирован
ч) Разрыв больше чем за 5 минут, но все еще зазор интерполирован.
Я понимаю эти причины, конечно, я нигде не указал, что он не должен интерполировать более длинные промежутки времени, чем 5 минут. Я понимаю, что interpolate
только экстраполирует вперед во времени, но я хочу, чтобы он также экстраполировал назад во времени. Есть ли какие-либо известные методы, которые я могу использовать для своей проблемы, не изобретая колесо?
Редактировать: Метод data.interpolate
принимает входной параметр limit
, который определяет максимальное количество последовательных NaNs быть замещен с помощью интерполяции. Но это все еще интерполирует до предела, но я хочу продолжить все NaN в этом случае.
После интерполяции можно использовать метод bfill() 'backward-fill? – Zero
@JohnGalt '' bfill() '' отлично подходит для интерполяции. К сожалению, она сталкивается с той же проблемой для более длинных промежутков времени, чем 5 минут, так как она просто заполняет их. – Nras
Что вы ожидаете? Если он имеет только одно значение, он не может интерполировать значения. – Zero