Spec-Zone.ru › pandas 0.24

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

New in version 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 в качестве ключа объединения.

New in version 0.19.2.

right_index : boolean

Используйте индекс правого DataFrame в качестве ключа объединения.

New in version 0.19.2.

by : column name or list of column names

Сопоставить по этим столбцам перед выполнением операции слияния.

left_by : column name

Имена полей для сопоставления в левом DataFrame.

New in version 0.19.2.

right_by : column name

Имена полей для сопоставления в правом DataFrame.

New in version 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’

Метод поиска (предыдущий, последующий или ближайший).

New in version 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.24.2/reference/api/pandas.merge_asof.html

Spec-Zone.ru

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