Spec-Zone.ru › pandas 0.21

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 : имя поля

Имя поля для объединения. Должно быть найдено в обоих DataFrame. Данные ДОЛЖНЫ быть упорядоченными. Кроме того, это должен быть числовой столбец, например, datetimelike, целочисленный или с плавающей запятой. Необходимо указать 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» (т.е. строго меньше / строго больше)

direction : ‘backward’ (по умолчанию), ‘forward’ или ‘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  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.21.1/generated/pandas.merge_asof.html

Spec-Zone.ru

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