Combinar dos Pandas DataFrames en función de la fecha y hora más cercana

En este artículo, discutiremos cómo fusionar Pandas DataFrame en función de la fecha y hora más cercana. Para aprender a fusionar DataFrames primero, debe aprender cómo crear un DataFrame para eso, debe consultar el artículo Creación de un Pandas DataFrame . Después de crear DataFrames, es necesario fusionarlos y fusionar el Dataframe, hay una función llamada merge_asof() cuando se trata de escribir esto, entonces se puede escribir como:

pandas.merge_asof(left, right, on=Ninguno, left_on=Ninguno, right_on=Ninguno, left_index=Falso, right_index=False, by=Ninguno, left_by=Ninguno, right_by=Ninguno, sufijos=(‘_x’, ‘_y’ ), tolerancia=Ninguna, allow_exact_matches=Verdadero, dirección=’hacia atrás’)

Nota:

Enfoque paso a paso

Paso 1: importar la biblioteca de pandas

Para completar esta tarea, debemos importar la biblioteca llamada Pandas.

import pandas as pd

Paso 2: crea el marco de datos

En este paso, tenemos que crear DataFrames usando la función “pd.DataFrame()”. En esto, creamos 2 marcos de datos, uno se llama a la izquierda y otro se llama a la derecha porque nuestro último objetivo es fusionar 2 marcos de datos en función de la fecha y hora más cercana. Se puede escribir como:

izquierda = pd.DataFrame( {

       “hora”: [pd.Marca de tiempo(“2020-03-25 13:30:00.023”),

           pd.Timestamp(“2020-03-25 13:30:00.023”),

           pd.Timestamp(“2020-03-25 13:30:00.030”),

           pd.Timestamp(“2020-03-25 13:30:00.041”),

           pd.Timestamp(“2020-03-25 13:30:00.048”),

           pd.Timestamp(“2020-03-25 13:30:00.049”),

           pd.Timestamp(“2020-03-25 13:30:00.072”),

           pd.Timestamp(“2020-03-25 13:30:00.075”)

       ],

       «ticker»: [«GOOG»,»MSFT»,»MSFT»,»MSFT»,»GOOG»,»AAPL»,»GOOG»,»MSFT»],

          “oferta”: [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],

          “pedir”: [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03]

   })

derecha = pd.DataFrame( {

          «tiempo»: [

              pd.Timestamp(“2020-03-25 13:30:00.023”),

              pd.Timestamp(“2020-03-25 13:30:00.038”),

              pd.Timestamp(“2020-03-25 13:30:00.048”),

              pd.Timestamp(“2020-03-25 13:30:00.048”),

              pd.Timestamp(“2020-03-25 13:30:00.048”)

          ],

          «ticker»: [«MSFT», «MSFT», «GOOG», «GOOG», «AAPL»],

          “precio”: [51,95, 51,95, 720,77, 720,92, 98,0],

          “cantidad”: [75, 155, 100, 100, 100]

      })

Paso 3: combine los marcos de datos e imprímalos

En este paso, los marcos de datos se fusionarán utilizando la función «pd.merge_asof()». El resultado de la función merge_asof() se almacena en una variable y luego la variable se imprime usando «print()».

Python3

# Importing the required package
import pandas as pd
 
# Creating the DataFrame of left side
left = pd.DataFrame({
   
    "time": [pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.030"),
             pd.Timestamp("2020-03-25 13:30:00.041"),
             pd.Timestamp("2020-03-25 13:30:00.048"),
             pd.Timestamp("2020-03-25 13:30:00.049"),
             pd.Timestamp("2020-03-25 13:30:00.072"),
             pd.Timestamp("2020-03-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]
})
 
# Creating the Dataframe of right side
right = pd.DataFrame({
    "time": [
        pd.Timestamp("2020-03-25 13:30:00.023"),
        pd.Timestamp("2020-03-25 13:30:00.038"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-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]
})
 
# Applying merge_asof on data and store it
# in a variable
merged_dataframe = pd.merge_asof(right, left, on="time",
                                 by="ticker")
 
# print the variable
print(merged_dataframe)

Producción : 

Ejemplo 1: ahora cambiamos la posición del marco de datos izquierdo y derecho en la función merge_asof.

Python3

# Importing the required package
import pandas as pd
# Creating the DataFrame of left side
left = pd.DataFrame({
    "time": [pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.030"),
             pd.Timestamp("2020-03-25 13:30:00.041"),
             pd.Timestamp("2020-03-25 13:30:00.048"),
             pd.Timestamp("2020-03-25 13:30:00.049"),
             pd.Timestamp("2020-03-25 13:30:00.072"),
             pd.Timestamp("2020-03-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]
})
 
# Creating the Dataframe of right side
right = pd.DataFrame({
    "time": [
        pd.Timestamp("2020-03-25 13:30:00.023"),
        pd.Timestamp("2020-03-25 13:30:00.038"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-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]
})
 
# Applying merge_asof on data and store it
# in a variable
merged_dataframe = pd.merge_asof(left, right, on="time",
                                 by="ticker")
 
# print the variable
print(merged_dataframe)

Producción: 

Nota: Entonces, está claro a partir de nuestras 2 salidas que cuando colocamos el DataFrame derecho en primer lugar, el número de filas en la salida es 5 igual al número de filas en el DataFrame derecho y cuando el DataFrame izquierdo se coloca en primer lugar entonces el número de filas en la salida es igual al número de filas en el DataFrame izquierdo. Si observamos ambas salidas y las comparamos, podemos decir fácilmente que merge_asof() es similar a la combinación izquierda, excepto que hacemos coincidir la clave más cercana en lugar de las claves iguales.

Ejemplo 2: solo calculamos dentro de los 2 ms entre la hora cotizada y la hora de negociación.

Python3

# Importing the required package
import pandas as pd
 
# Creating the DataFrame of left side
left = pd.DataFrame({
    "time": [pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.030"),
             pd.Timestamp("2020-03-25 13:30:00.041"),
             pd.Timestamp("2020-03-25 13:30:00.048"),
             pd.Timestamp("2020-03-25 13:30:00.049"),
             pd.Timestamp("2020-03-25 13:30:00.072"),
             pd.Timestamp("2020-03-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]
})
 
# Creating the Dataframe of right side
right = pd.DataFrame({
    "time": [
        pd.Timestamp("2020-03-25 13:30:00.023"),
        pd.Timestamp("2020-03-25 13:30:00.038"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-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]
})
 
# Applying merge_asof on data and store it
# in a variable
merged_dataframe = pd.merge_asof(left, right, on="time", by="ticker",
                                 tolerance=pd.Timedelta("2ms"))
 
# print the variable
print(merged_dataframe)

Producción : 

Ejemplo 3: solo calculamos dentro de los 10 ms entre la hora cotizada y la hora de negociación, y excluimos las coincidencias exactas a tiempo. Sin embargo, los datos anteriores se propagarán hacia adelante.

Python3

# Importing the required package
import pandas as pd
 
# Creating the DataFrame of left side
left = pd.DataFrame({
    "time": [pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.030"),
             pd.Timestamp("2020-03-25 13:30:00.041"),
             pd.Timestamp("2020-03-25 13:30:00.048"),
             pd.Timestamp("2020-03-25 13:30:00.049"),
             pd.Timestamp("2020-03-25 13:30:00.072"),
             pd.Timestamp("2020-03-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]
})
 
# Creating the Dataframe of right side
right = pd.DataFrame({
    "time": [
        pd.Timestamp("2020-03-25 13:30:00.023"),
        pd.Timestamp("2020-03-25 13:30:00.038"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-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]
})
 
# Applying merge_asof on data and store it
# in a variable
merged_dataframe = pd.merge_asof(left, right, on="time", by="ticker",
                                 tolerance=pd.Timedelta("2ms"),
                                 allow_exact_matches=False)
 
# print the variable
print(merged_dataframe)

Producción : 

Ejemplo 4: Cuando se usa el mismo DataFrame en ambos lugares. En este Dataframe izquierdo se usa en ambos lados.

Python3

# Importing the required package
import pandas as pd
 
# Creating the DataFrame of left side
left = pd.DataFrame({
    "time": [pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.023"),
             pd.Timestamp("2020-03-25 13:30:00.030"),
             pd.Timestamp("2020-03-25 13:30:00.041"),
             pd.Timestamp("2020-03-25 13:30:00.048"),
             pd.Timestamp("2020-03-25 13:30:00.049"),
             pd.Timestamp("2020-03-25 13:30:00.072"),
             pd.Timestamp("2020-03-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]
})
 
# Creating the Dataframe of right side
right = pd.DataFrame({
    "time": [
        pd.Timestamp("2020-03-25 13:30:00.023"),
        pd.Timestamp("2020-03-25 13:30:00.038"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-25 13:30:00.048"),
        pd.Timestamp("2020-03-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]
})
 
# Applying merge_asof on data and store it
# in a variable
merged_dataframe = pd.merge_asof(left, left, on="time",
                                 by="ticker")
 
# print the variable
print(merged_dataframe)

Producción :  

Creó el mismo marco de datos en 2 marcos, uno se indica como x y otro se crea como y, es decir, bid_x, bid_y, ask_x, ask_y.

Publicación traducida automáticamente

Artículo escrito por deepanshu_rustagi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *