pandas.merge_asof#

pandas.merge_asof(left, правый, на=None, left_on=None, right_on=None, left_index=False, right_index=False, by=None, left_by=None, right_by=None, суффиксы=('_x', '_y'), допуск=None, allow_exact_matches=True, направление='backward')[источник]#

shteken +

Это похоже на левое соединение, за исключением того, что мы сопоставляем по ближайшему ключу, а не по равным ключам. Оба DataFrame должны быть отсортированы по ключу.

Для каждой строки в левом DataFrame:

  • «Обратный» поиск выбирает последнюю строку в правом DataFrame, чей ключ 'on' меньше или равен ключу левого.

  • «Прямой» поиск выбирает первую строку в правом DataFrame, чей ключ 'on' больше или равен ключу левого.

  • Поиск «ближайшего» выбирает строку в правом DataFrame, чей ключ 'on' ближе всего по абсолютному расстоянию к ключу левого.

Опционально сопоставлять по эквивалентным ключам с 'by' перед поиском с 'on'.

Параметры:
leftDataFrame или именованный Series
правыйDataFrame или именованный Series
наметка

Имя поля для соединения. Должно присутствовать в обоих DataFrames. Данные ДОЛЖНЫ быть упорядочены. Кроме того, это должен быть числовой столбец, такой как дата-время, целое число или число с плавающей точкой. Должен быть указан on или left_on/right_on.

left_onметка

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

right_onметка

Имя поля для объединения в правом DataFrame.

left_indexbool

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

right_indexbool

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

byимя столбца или список имен столбцов

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

left_byимя столбца

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

right_byимя столбца

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

суффиксы2-элементная последовательность (кортеж, список, …)

Суффикс для применения к перекрывающимся именам столбцов в левой и правой стороне соответственно.

допускint или Timedelta, опционально, по умолчанию None

Выберите допуск asof в этом диапазоне; должен быть совместим с индексом слияния.

allow_exact_matchesbool, по умолчанию True
  • Если True, разрешает сопоставление с тем же значением 'on' (т.е. меньше-или-равно / больше-или-равно)

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

направление‘backward’ (по умолчанию), ‘forward’ или ‘nearest’

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

Возвращает:
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 = pd.DataFrame(
...     {
...         "time": [
...             pd.Timestamp("2016-05-25 13:30:00.023"),
...             pd.Timestamp("2016-05-25 13:30:00.023"),
...             pd.Timestamp("2016-05-25 13:30:00.030"),
...             pd.Timestamp("2016-05-25 13:30:00.041"),
...             pd.Timestamp("2016-05-25 13:30:00.048"),
...             pd.Timestamp("2016-05-25 13:30:00.049"),
...             pd.Timestamp("2016-05-25 13:30:00.072"),
...             pd.Timestamp("2016-05-25 13:30:00.075")
...         ],
...         "ticker": [
...                "GOOG",
...                "MSFT",
...                "MSFT",
...                "MSFT",
...                "GOOG",
...                "AAPL",
...                "GOOG",
...                "MSFT"
...            ],
...            "bid": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],
...            "ask": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03]
...     }
... )
>>> 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 = pd.DataFrame(
...        {
...            "time": [
...                pd.Timestamp("2016-05-25 13:30:00.023"),
...                pd.Timestamp("2016-05-25 13:30:00.038"),
...                pd.Timestamp("2016-05-25 13:30:00.048"),
...                pd.Timestamp("2016-05-25 13:30:00.048"),
...                pd.Timestamp("2016-05-25 13:30:00.048")
...            ],
...            "ticker": ["MSFT", "MSFT", "GOOG", "GOOG", "AAPL"],
...            "price": [51.95, 51.95, 720.77, 720.92, 98.0],
...            "quantity": [75, 155, 100, 100, 100]
...        }
...    )
>>> 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 мс между временем котировки и временем сделки и исключаем точные совпадения по времени. Однако prior данные будут распространяться вперед

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