Я борюсь с узким местом производительности в наборе данных, содержащем более 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.
Существует ли векторизованный способ заполнения с ограничением по времени между группами?
Я просмотрел pd.merge_asof, но не могу понять, как заставить его работать для простой прямой заливки.
Подробнее: https://stackoverflow.com/questions/799 ... -120m-rows
Мобильная версия