Аналог метода pandas.Series.resample для numpy для ресемплирования временного ряда

Дано

Есть временные ряды. Приведу небольшой кусочек, в рабочей задаче количество элементов может достигать миллионов. Если для решения понадобится большой кусок - напишите, я предоставлю.

import datetime

time_series = [datetime.datetime(2024, 5, 13, 2, 9, 41, 713000),
               datetime.datetime(2024, 5, 13, 2, 9, 41, 713000),
               datetime.datetime(2024, 5, 13, 2, 9, 42, 228000),
               datetime.datetime(2024, 5, 13, 2, 9, 42, 228000), 
               datetime.datetime(2024, 5, 13, 2, 9, 43, 896000), 
               datetime.datetime(2024, 5, 13, 2, 9, 45, 673000), 
               datetime.datetime(2024, 5, 13, 2, 9, 45, 673000), 
               datetime.datetime(2024, 5, 13, 2, 9, 46, 241000), 
               datetime.datetime(2024, 5, 13, 2, 9, 56, 503000), 
               datetime.datetime(2024, 5, 13, 2, 9, 56, 549000), 
               datetime.datetime(2024, 5, 13, 2, 9, 56, 582000), 
               datetime.datetime(2024, 5, 13, 2, 9, 56, 591000), 
               datetime.datetime(2024, 5, 13, 2, 9, 56, 612000), 
               datetime.datetime(2024, 5, 13, 2, 9, 56, 612000)]

Про эти ряды надо знать, что они монотонно возрастают и временные промежутки между событиями случайны.

Требуется

В частном случае: получить индексы первых и последних объектов ряда ресемплированных по произвольному периоду относительно времени самого "молодого" события (конечного события ряда).

В общем случае: применить к группам ресемплированных индексов произвольную функцию.

Решение pandas

Эта задача достаточно просто решается с помощью pandas. Я решаю так:

import pandas as pd

time_series_pandas = pd.Series(range(len(time_series)), index=time_series))
df_resample = time_series_pandas.resample('60s', origin='end').agg(first='first', last='last')

# Так как мне нужны два списка, отсортированных по убыванию, то потом еще вот так:
start, end =  df_resample[::-1].T.values.tolist()

Это решение для частного случая. Для общего случая, вместо .agg можно применить .apply c произвольной функцией.

Вопрос: а как все тоже самое, но для numpy?

Так как ряды огромные, хочется оптимизировать, и первое, что приходит в голову это заменить pandas на numpy. Поиски в интернетах дали вот такое решение, но это совсем не то, тут ресемплинг по блокам из N элементов, а у меня временной ряд. И вот такое решение (второе решение). Это уже кое что, но я пока не до конца разобрался можно ли его применить конкретно к моей частной задаче и уж точно его не получится применить к общей задаче, так как мы ограничены набором интерполяций interp1d. (UPD Стал разбираться с этим методом, он не очень, так как np.linspace не работает с datetime)

Итого

Как для временного ряда заменить метод pandas.Series.resample на функционал numpy, разумеется, с учетом того, что это должно стать существенно быстрее?


Ответы (0 шт):