Spec-Zone.ru › pandas 0.25

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

См. также

merge
merge_ordered

Примеры

>>> 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API