Аналог метода 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
, разумеется, с учетом того, что это должно стать существенно быстрее?