Spec-Zone.ru › pandas 0.19

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

См. также

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

Spec-Zone.ru

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