Spec-Zone.ru › pandas 0.20

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, у которой ключ «on» больше или равен ключу слева.
  • Поиск «ближайший» выбирает строку в правом DataFrame, у которой ключ «on» имеет наименьшее расстояние в абсолютной величине до ключа слева.

По умолчанию используется «назад», что совместимо с версиями ниже 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 : булево

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

Новое в версии 0.19.2.

right_index : булево

Используйте индекс правого 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 : булево, по умолчанию True

  • Если True, разрешить сопоставление со значением ‘on’ (т.е. меньше или равно/больше или равно).
  • Если False, не сопоставлять значение ‘on’ (т.е., строго меньше/строго больше).

direction : ‘backward’ (по умолчанию), ‘forward’, или ‘nearest’

Выбирать поиск предшествующих, последующих или ближайших совпадений.

Новое в версии 0.20.0.

Возвращаемое значение:

merged : DataFrame

См. также

merge, merge_ordered

Примеры

>>> 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_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
   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.20.3/generated/pandas.merge_asof.html

Spec-Zone.ru

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