pandas.merge_asof
-
pandas.merge_asof(left, right, on=None, left_on=None, right_on=None, left_index=False, right_index=False, by=None, left_by=None, right_by=None, suffixes=('_x', '_y'), tolerance=None, allow_exact_matches=True, direction='backward')[source] -
Выполнить слияние asof. Это похоже на левое соединение, за исключением того, что мы сопоставляем по ближайшему ключу, а не по равным ключам.
Оба DataFrame должны быть отсортированы по ключу.
Для каждой строки в левом DataFrame:
- Поиск «назад» выбирает последнюю строку в правом DataFrame, ключ «on» которой меньше или равен ключу левого DataFrame.
- Поиск «вперед» выбирает первую строку в правом DataFrame, ключ «on» которой больше или равен ключу левого DataFrame.
- Поиск «ближайший» выбирает строку в правом DataFrame, ключ «on» которой находится в пределах наименьшего абсолютного расстояния до ключа левого DataFrame.
По умолчанию используется «назад», и это совместимо с версиями ниже 0.20.0. Параметр direction был добавлен в версии 0.20.0 и вводит «вперед» и «ближайший».
Дополнительно можно сопоставить эквивалентные ключи с помощью «by» перед поиском с помощью «on».
Введено в версии 0.19.0.
Параметры: -
left : DataFrame -
right : DataFrame -
on : label -
Имя поля для объединения. Должно присутствовать в обоих DataFrame. Данные ДОЛЖНЫ быть отсортированы. Кроме того, это должен быть числовой столбец, такой как datetimelike, целое число или число с плавающей точкой. Необходимо указать On или left_on/right_on.
-
left_on : label -
Имя поля для объединения в левом DataFrame.
-
right_on : label -
Имя поля для объединения в правом DataFrame.
-
left_index : boolean -
Использовать индекс левого DataFrame в качестве ключа объединения.
Введено в версии 0.19.2.
-
right_index : boolean -
Использовать индекс правого DataFrame в качестве ключа объединения.
Введено в версии 0.19.2.
-
by : column name or list of column names -
Сопоставлять по этим столбцам перед выполнением операции слияния.
-
left_by : column name -
Имена полей для сопоставления в левом DataFrame.
Введено в версии 0.19.2.
-
right_by : column name -
Имена полей для сопоставления в правом DataFrame.
Введено в версии 0.19.2.
-
suffixes : 2-length sequence (tuple, list, …) -
Суффикс, применяемый к совпадающим именам столбцов в левой и правой части соответственно.
-
tolerance : integer or Timedelta, optional, default None -
Выбор допущения asof в этом диапазоне; должно быть совместимо с индексом объединения.
-
allow_exact_matches : boolean, default True -
- Если True, разрешить сопоставление с тем же значением «on» (т.е. меньше или равно / больше или равно)
- Если False, не сопоставлять с тем же значением «on» (т.е. строго меньше / строго больше)
-
direction : ‘backward’ (default), ‘forward’, or ‘nearest’ -
Выбирать предыдущие, последующие или ближайшие соответствия.
Введено в версии 0.20.0.
Возвращает: -
merged : DataFrame
См. также
Примеры
>>> left = pd.DataFrame({'a': [1, 5, 10], 'left_val': ['a', 'b', 'c']}) >>> left a left_val 0 1 a 1 5 b 2 10 c>>> right = pd.DataFrame({'a': [1, 2, 3, 6, 7], ... 'right_val': [1, 2, 3, 6, 7]}) >>> right a right_val 0 1 1 1 2 2 2 3 3 3 6 6 4 7 7>>> pd.merge_asof(left, right, on='a') a left_val right_val 0 1 a 1 1 5 b 3 2 10 c 7>>> pd.merge_asof(left, right, on='a', allow_exact_matches=False) a left_val right_val 0 1 a NaN 1 5 b 3.0 2 10 c 7.0>>> pd.merge_asof(left, right, on='a', direction='forward') a left_val right_val 0 1 a 1.0 1 5 b 6.0 2 10 c NaN>>> pd.merge_asof(left, right, on='a', direction='nearest') a left_val right_val 0 1 a 1 1 5 b 6 2 10 c 7Мы также можем использовать DataFrame с индексами.
>>> left = pd.DataFrame({'left_val': ['a', 'b', 'c']}, index=[1, 5, 10]) >>> left left_val 1 a 5 b 10 c>>> right = pd.DataFrame({'right_val': [1, 2, 3, 6, 7]}, ... index=[1, 2, 3, 6, 7]) >>> right right_val 1 1 2 2 3 3 6 6 7 7>>> pd.merge_asof(left, right, left_index=True, right_index=True) left_val right_val 1 a 1 5 b 3 10 c 7
Вот пример реальных временных рядов
>>> quotes time ticker bid ask 0 2016-05-25 13:30:00.023 GOOG 720.50 720.93 1 2016-05-25 13:30:00.023 MSFT 51.95 51.96 2 2016-05-25 13:30:00.030 MSFT 51.97 51.98 3 2016-05-25 13:30:00.041 MSFT 51.99 52.00 4 2016-05-25 13:30:00.048 GOOG 720.50 720.93 5 2016-05-25 13:30:00.049 AAPL 97.99 98.01 6 2016-05-25 13:30:00.072 GOOG 720.50 720.88 7 2016-05-25 13:30:00.075 MSFT 52.01 52.03>>> trades time ticker price quantity 0 2016-05-25 13:30:00.023 MSFT 51.95 75 1 2016-05-25 13:30:00.038 MSFT 51.95 155 2 2016-05-25 13:30:00.048 GOOG 720.77 100 3 2016-05-25 13:30:00.048 GOOG 720.92 100 4 2016-05-25 13:30:00.048 AAPL 98.00 100По умолчанию мы берем asof котировок
>>> pd.merge_asof(trades, quotes, ... on='time', ... by='ticker') time ticker price quantity bid ask 0 2016-05-25 13:30:00.023 MSFT 51.95 75 51.95 51.96 1 2016-05-25 13:30:00.038 MSFT 51.95 155 51.97 51.98 2 2016-05-25 13:30:00.048 GOOG 720.77 100 720.50 720.93 3 2016-05-25 13:30:00.048 GOOG 720.92 100 720.50 720.93 4 2016-05-25 13:30:00.048 AAPL 98.00 100 NaN NaNМы делаем asof только в пределах 2 мс между временем котировки и временем сделки
>>> pd.merge_asof(trades, quotes, ... on='time', ... by='ticker', ... tolerance=pd.Timedelta('2ms')) time ticker price quantity bid ask 0 2016-05-25 13:30:00.023 MSFT 51.95 75 51.95 51.96 1 2016-05-25 13:30:00.038 MSFT 51.95 155 NaN NaN 2 2016-05-25 13:30:00.048 GOOG 720.77 100 720.50 720.93 3 2016-05-25 13:30:00.048 GOOG 720.92 100 720.50 720.93 4 2016-05-25 13:30:00.048 AAPL 98.00 100 NaN NaNМы выполняем asof только в пределах 10 мс между временем котировки и временем сделки, и исключаем точное совпадение во времени. Однако данные до будут распространяться вперед
>>> pd.merge_asof(trades, quotes, ... on='time', ... by='ticker', ... tolerance=pd.Timedelta('10ms'), ... allow_exact_matches=False) time ticker price quantity bid ask 0 2016-05-25 13:30:00.023 MSFT 51.95 75 NaN NaN 1 2016-05-25 13:30:00.038 MSFT 51.95 155 51.97 51.98 2 2016-05-25 13:30:00.048 GOOG 720.77 100 NaN NaN 3 2016-05-25 13:30:00.048 GOOG 720.92 100 NaN NaN 4 2016-05-25 13:30:00.048 AAPL 98.00 100 NaN NaN
© 2008–2012, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
Licensed under the 3-clause BSD License.
https://pandas.pydata.org/pandas-docs/version/0.25.0/reference/api/pandas.merge_asof.html