Вставка пропущенных номеров в фрейм данных - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть программа, которая идеально измеряет температуру каждую секунду. Однако на самом деле этого не происходит. Иногда он пропускает секунду или прерывается на 400 секунд, а затем решает начать запись снова. Это оставляет пробелы в моем 2-n-n-фрейме данных, где в идеале n = 86400 (количество секунд в дне). Я хочу применить какое-то скользящее / скользящее среднее к нему, чтобы получить более хороший график, но если я сделаю это с «необработанными» файлами данных, количество точек данных станет меньше. Это показано здесь , смотрите ось X. Я знаю, что "хорошие данные" еще не выглядят хорошими; Я просто играю с некоторыми значениями.

Итак, я хочу реализовать метод очистки данных, который добавляет данные в фрейм данных. Я думал об этом, но не знаю, как это реализовать. Я думал об этом следующим образом:

Если индекс не равен времени, то нам нужно добавить число в момент времени = индекс. Если этот разрыв составляет только 1 значение, то среднее значение предыдущего числа и следующего числа подойдет мне. Но если оно больше, скажем, 100 секунд не хватает, то необходимо выполнить линейную функцию, которая будет постоянно увеличивать или уменьшать значение.

Итак, я думаю, тренировочный набор может быть таким:

index   time   temp 
0       0      20.10
1       1      20.20
2       2      20.20
3       4      20.10
4       100    22.30

Здесь я хотел бы получить значение для индекса 3, времени 3 и значений, отсутствующих между временем = 4 и временем = 100. Я сожалею о моих навыках форматирования, надеюсь, это понятно.

Как бы я занялся программированием этого?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Сначала вы можете установить вторые значения для фактических значений времени, как таковые:

df.index = pd.to_datetime(df['time'], unit='s')

После чего вы можете использовать встроенные в Pandas операции временных рядов для повторной выборки и заполнения пропущенных значений:

df = df.resample('s').interpolate('time')

При желании, если вы все еще хотите выполнить некоторое сглаживание, вы можете использовать для этого следующую операцию:

df.rolling(5, center=True, win_type='hann').mean()

Который будет сглаживаться с шириной в 5 элементов Окно Ханнинга . Примечание. Любое сглаживание на основе окон будет стоить вам ценных точек по краям.

Теперь ваш фрейм данных будет иметь даты и время (включая дату) в качестве индекса. Это необходимо для метода повторной выборки. Если вы хотите потерять дату, вы можете просто использовать:

df.index = df.index.time
0 голосов
/ 01 ноября 2018

Использовать слияние с полным столбцом времени, а затем interpolate:

# Create your table
time = np.array([e for e in np.arange(20) if np.random.uniform() > 0.6])
temp = np.random.uniform(20, 25, size=len(time))
temps = pd.DataFrame([time, temp]).T
temps.columns = ['time', 'temperature']

>>> temps

   time  temperature
0   4.0    21.662352
1  10.0    20.904659
2  15.0    20.345858
3  18.0    24.787389
4  19.0    20.719487

Выше приведена случайная таблица, сгенерированная с отсутствующими данными времени.

# modify it
filled = pd.Series(np.arange(temps.iloc[0,0], temps.iloc[-1, 0]+1))
filled = filled.to_frame()
filled.columns = ['time'] # Create a fully filled time column
merged = pd.merge(filled, temps, on='time', how='left') # merge it with original, time without temperature will be null
merged.temperature = merged.temperature.interpolate() # fill nulls linearly.

# Alternatively, use reindex, this does the same thing.
final = temps.set_index('time').reindex(np.arange(temps.time.min(),temps.time.max()+1)).reset_index()
final.temperature = final.temperature.interpolate()

>>> merged # or final

    time  temperature
0    4.0    21.662352
1    5.0    21.536070
2    6.0    21.409788
3    7.0    21.283505
4    8.0    21.157223
5    9.0    21.030941
6   10.0    20.904659
7   11.0    20.792898
8   12.0    20.681138
9   13.0    20.569378
10  14.0    20.457618
11  15.0    20.345858
12  16.0    21.826368
13  17.0    23.306879
14  18.0    24.787389
15  19.0    20.719487
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...