Как заполнить максимальный лимит времени (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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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