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:
- Para saber más sobre esta función, consulte el artículo Función pandas.merge_asof() en Python
- Los marcos de datos deben ordenarse por clave.
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