Как заполнить максимальный лимит времени (GAP) для более чем 120 миллионов строк?Python

Программы на Python
Anonymous
Как заполнить максимальный лимит времени (GAP) для более чем 120 миллионов строк?

Сообщение Anonymous »

Проблема:
Я борюсь с узким местом производительности в наборе данных, содержащем более 120 миллионов строк.
Мне нужно заранее заполнить значения NaN в данных датчика, но только если промежуток времени с момента последнего действительного чтения составляет менее 5 минут.
Если разрыв больше, он должен оставаться NaN.
Стандартный groupby().apply() занимает более 40 минут, что слишком медленно для нашего конвейера.
Мой код:

Код: Выделить всё

import pandas as pd
import numpy as np

df = pd.DataFrame({
'sensor_id': [1, 1, 1, 1, 2, 2],
'timestamp': pd.to_datetime(['10:00', '10:03', '10:10', '10:11', '10:00', '10:01']),
'temp': [22.1, np.nan, np.nan, 23.0, 19.5, np.nan]
})

# This works on small data but is painfully slow on 100M rows
def limit_ffill(group):
return group['temp'].ffill(limit=1)

# df['temp'] = df.groupby('sensor_id').apply(limit_ffill)
Цель:
Для этого мне нужен векторизованный способ (или, возможно, что-то с использованием numpy или numba).
По сути:
  • Группировка по датчику.
  • Температура прямого заполнения.
  • Если current_timestamp - last_valid_timestamp > 5 минут, сбросить значение NaN.
Есть ли способ сделать это без цикла Python или тяжелого .groupby().apply()?
Существует ли векторизованный способ заполнения с ограничением по времени между группами?

Я просмотрел pd.merge_asof, но не могу понять, как заставить его работать для простой прямой заливки.

Подробнее: https://stackoverflow.com/questions/799 ... -120m-rows

Вернуться в «Python»