Метод transform
Метод transform класса Resampler применяется к группам данных,
полученным в результате передискретизации временного ряда.
Он принимает пользовательскую функцию и применяет её независимо к каждой группе,
возвращая результат той же длины, что и исходный DataFrame или Series.
В отличие от agg или apply, метод transform не изменяет количество строк,
а возвращает трансформированные значения для каждой исходной строки.
Это полезно для операций нормализации, заполнения пропусков или центрирования в разрезе временных периодов.
Первым параметром передаётся функция или строка с именем встроенной функции,
вторым параметром можно указать аргументы для передачи в функцию.
Синтаксис
resampler.transform(func, *args, **kwargs)
Основные параметры:
-
func- функция, применяемая к каждой группе. Может быть именем встроенной функции (например, 'mean', 'sum') или вызываемым объектом. -
*args,**kwargs- дополнительные аргументы, передаваемые в функцию.
Пример
Создадим временной ряд с почасовыми данными и применим передискретизацию по дням с использованием transform для центрирования значений:
import pandas as pd
# Создаем временной ряд с почасовыми данными
dates = pd.date_range('2026-01-01', periods=8, freq='H')
df = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6, 7, 8]}, index=dates)
# Применяем передискретизацию по дням и вычитаем среднее за день из каждого значения
res = df.resample('D').transform(lambda x: x - x.mean())
print(res)
Результат выполнения кода:
a
2026-01-01 00:00:00 -1.5
2026-01-01 01:00:00 -0.5
2026-01-01 02:00:00 0.5
2026-01-01 03:00:00 1.5
2026-01-02 00:00:00 -1.5
2026-01-02 01:00:00 -0.5
2026-01-02 02:00:00 0.5
2026-01-02 03:00:00 1.5
Пример
Используем transform с именем встроенной функции для нормализации (вычитание медианы) в разрезе двухчасовых интервалов:
import pandas as pd
# Создаем временной ряд с получасовыми данными
dates = pd.date_range('2026-01-01', periods=6, freq='30T')
df = pd.DataFrame({'b': [10, 20, 30, 40, 50, 60]}, index=dates)
# Передискретизация по 2 часам и вычитание медианы
res = df.resample('2H').transform('median')
print(res)
Результат выполнения кода:
b
2026-01-01 00:00:00 20
2026-01-01 00:30:00 20
2026-01-01 01:00:00 20
2026-01-01 01:30:00 50
2026-01-01 02:00:00 50
2026-01-01 02:30:00 50
Пример
Применим пользовательскую функцию для заполнения пропусков средним значением в группе (передискретизация по дням):
import pandas as pd
import numpy as np
# Создаем временной ряд с пропусками
dates = pd.date_range('2026-01-01', periods=6, freq='D')
df = pd.DataFrame({'c': [1, np.nan, 3, np.nan, 5, 6]}, index=dates)
# Заполняем пропуски средним за день (в данном случае группа = один день)
res = df.resample('D').transform(lambda x: x.fillna(x.mean()))
print(res)
Результат выполнения кода:
c
2026-01-01 1.0
2026-01-02 3.0
2026-01-03 3.0
2026-01-04 5.0
2026-01-05 5.0
2026-01-06 6.0