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)[source] -
Выполнить слияние asof. Это похоже на левое соединение, за исключением того, что мы подбираем ближайший ключ, а не равные ключи.
Для каждой строки в левой таблице DataFrame мы выбираем последнюю строку в правой таблице DataFrame, у которой ключ ‘on’ меньше или равен ключу левой таблицы. Обе таблицы DataFrame должны быть отсортированы по ключу.
Необязательно подбирать эквивалентные ключи с помощью ‘by’ перед поиском ближайшего совпадения с ‘on’.
Добавлен в версии 0.19.0.
Параметры: left : DataFrame
right : DataFrame
on : метка
Имя поля для объединения. Должно быть найдено в обеих таблицах DataFrame. Данные ДОЛЖНЫ быть упорядочены. Кроме того, это должен быть числовой столбец, например, datetimelike, integer или float. Должен быть задан on или left_on/right_on.
left_on : метка
Имя поля для объединения в левой таблице DataFrame.
right_on : метка
Имя поля для объединения в правой таблице DataFrame.
left_index : boolean
Использовать индекс левой таблицы DataFrame в качестве ключа объединения.
Добавлен в версии 0.19.2.
right_index : boolean
Использовать индекс правой таблицы DataFrame в качестве ключа объединения.
Добавлен в версии 0.19.2.
by : имя столбца или список имён столбцов
Сопоставить по этим столбцам перед выполнением операции слияния.
left_by : имя столбца
Имена полей для сопоставления в левой таблице DataFrame.
Добавлен в версии 0.19.2.
right_by : имя столбца
Имена полей для сопоставления в правой таблице DataFrame.
Добавлен в версии 0.19.2.
suffixes : последовательность длины 2 (кортеж, список, ...)
Суффикс, применяемый к перекрывающимся именам столбцов в левой и правой частях соответственно
tolerance : целое число или Timedelta, необязательно, по умолчанию None
выбирает asof-допуск в этом диапазоне; должен быть совместим с индексом слияния.
allow_exact_matches : boolean, по умолчанию True
- Если True, разрешает совпадение одного и того же значения ‘on’ (т. е. меньше или равно)
- Если False, не совпадает с тем же значением ‘on’ (т. е. строго меньше)
Возвращает: merged : DataFrame
См. также
Примеры
>>> left a left_val 0 1 a 1 5 b 2 10 c>>> 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_ordered(), хотя он не такой эффективный.>>> (pd.merge_ordered(left, right, on='a') ... .ffill() ... .drop_duplicates(['left_val']) ... ) a left_val right_val 0 1 a 1.0 3 5 b 3.0 6 10 c 7.0Мы также можем использовать индексированные DataFrames.
>>> left left_val 1 a 5 b 10 c
>>> 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 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
© 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.19.2/generated/pandas.merge_asof.html