Tue. Oct 4th, 2022

Aprenda a trabajar con el método de remuestreo de Pandas, una forma genial de trabajar con datos basados ​​en el tiempo

Foto de Markus Spiske @Unsplash.com Los datos basados ​​en el tiempo son uno de los formatos de datos más comunes con los que usted, como científico de datos, probablemente haya tropezado. Ya sea en el formato de características históricas (por ejemplo, datos de clientes) o datos de series temporales, es bastante común que uno tenga que lidiar con columnas de marca de tiempo en canalizaciones de datos. Si trabaja como científico de datos en 2022, es obligatorio que sepa cómo hacerlo. para trabajar con pandas, una de las bibliotecas de Python más poderosas para manipular datos. pandasis es famoso por sus actualizaciones regulares y nuevos métodos que se adaptan a muchas tareas relacionadas con la manipulación y disputa de datos. Uno de sus métodos más famosos es el remuestreo, que le permite manejar datos basados ​​en el tiempo sin problemas. En pocas palabras, el remuestreo contiene varias funciones que lo ayudan a abordar la agrupación y agregación basadas en el tiempo de una manera realmente fluida, mejorando la velocidad y la simplicidad cuando se trabaja con columnas de fecha y hora. En el pasado, probablemente tendría que construir funciones complicadas (o incluso con errores), que tenderían a ser difíciles de mantener. Con el remuestreo que se ha ido por completo y puede jugar con las fechas en los marcos de datos de pandas con mucha facilidad. En esta publicación, exploraremos algunas cosas interesantes sobre este método y lo fácil que es aplicarlo, especialmente cuando queremos crear características basadas en el tiempo. para nuestros algoritmos de ciencia de datos. Primero, comenzaré cargando un conjunto de datos de series temporales que consta de datos meteorológicos por hora entre 2008 y 2021 en Gallipoli, Turquía, un conjunto de datos que pertenece a Meteoblue. Permítanme comenzar cargando este conjunto de datos en Python: gallipoli_data = pd.read_csv(‘../Datos meteorológicos por hora en Gallipoli (2008–2021).csv’) Veamos las primeras 10 filas del conjunto de datos:Adelanto del conjunto de datos de Gallipoli: imagen del autor Para trabajar con el remuestreo, nuestros datos deben cumplir dos condiciones: la columna que usaremos para representar el tiempo debe ser del tipo de datos de fecha y hora. Esa columna debe ir en el índice del marco de datos. convirtiendo la columna DateTime en un tipo DateTime: gallipoli_data[‘DateTime’] = pd.to_datetime(gallipoli_data[‘DateTime’]) Y pasar nuestra columna al índice del marco de datos: gallipoli_data.index = gallipoli_data[‘DateTime’]¡Nuestro marco de datos está listo! Carguemos también las bibliotecas necesarias para seguir esta publicación de blog: import pandas as pdimport numpy as npHabiendo configurado todo, ¡abordemos nuestro método de remuestreo! Comencemos con un caso de uso simple: imagine que nos gustaría obtener la temperatura promedio en Gallipoli por cada intervalo de 3 horas. Aunque simple, si intentáramos hacer esto en Python base o con un código personalizado de pandas, sería un poco engorroso ya que tendríamos que: crear algún tipo de columna que se incrementaría cada 3 horas; usar un grupo en esa columna ;Aunque esto es manejable con un par de líneas de código, una sola línea sería mejor, ¿verdad? ¿Y si ese trazador de líneas también pudiera generalizar para otros marcos de tiempo (semanas, meses, trimestres o incluso minutos)? ¡Para eso es exactamente el remuestreo! Podemos realizar una agregación rápida basada en el tiempo de los datos realmente rápido: gallipoli_data.Temperature.resample(rule = ‘3h’).mean()Aquí está el resultado del código anterior:Vuelva a muestrear usando 3h como marco de tiempo — Imagen del autor¿Qué tan genial? El método de remuestreo contiene un montón de perillas que podemos girar, como la regla o la función de agregador que estamos usando. ¿Puedes adivinar qué debemos ajustar si queremos verificar el valor máximo de la duración de la luz solar en un intervalo de 3 horas? Simplemente cambiamos mean() por max() !gallipoli_data[‘Sunshine Duration’].resample(regla = ‘3h’).max()Vuelva a muestrear usando 3h como Marco de tiempo pero usando la función Máx. — Imagen del autor Para que esto sea aún más claro y alcance el punto máximo bajo el capó del nuevo muestreo, veamos la evolución de la Duración del sol para el 2 de enero en Gallipoli:(
gallipoli_data.loc[
(gallipoli_data.DateTime >= ‘2008-01-02’)
&
(gallipoli_data.DateTime <= ‘2008-01-03’)
]
)[‘Sunshine Duration’].plot(color=’naranja oscuro’)Duración de la luz solar hasta el 2 de enero de 2008 — Imagen del autor Lo que hace Resample es agrupar datos cada tres horas aplicando lo siguiente: Desde las 9 am hasta las 12, la duración máxima de la luz solar es 60. Desde el mediodía hasta las 15 pm, la duración máxima de la luz solar es 60. Desde las 15 hasta las 18 h, la duración máxima de la luz del sol es de 38. Esto se refleja en la tabla que hemos visto arriba, compruébalo de nuevo:Vuelva a muestrear usando 3h como marco de tiempo usando la función Max — Imagen del autor Observe que el intervalo está cerrado en el lado izquierdo. Lo que significa que la fila que se relaciona con 2008-01-02 09:00:00 agrega todos los datos desde las 09:00:00 a. m. hasta las 11:59:59 a. m. Si queremos cambiar este comportamiento, debemos pasar un nuevo argumento cerrado al remuestreo: gallipoli_data[‘Sunshine Duration’].resample(regla = ‘3h’, cerrado= ‘derecha’).max()Vuelva a muestrear usando 3h como Marco de tiempo usando Máx. y Cerrado = ‘Derecha’— Imagen del autor En este caso, la misma fila 2008-01-02 09:00:00 agrega todos los datos desde las 09:00:01 am hasta las 12:00:00 amTocar las perillas de remuestreo es muy fácil. Otro argumento común que podemos querer modificar es la agregación de marcos de tiempo, por ejemplo, agregar nuestros datos por semana o mes. es posible? Veamos, a continuación. Con el argumento de la regla, ¡no solo estamos restringidos a las agregaciones horarias! Esta es una de las mejores características de la función de remuestreo. Por ejemplo, si deseamos una agregación quincenal, podemos: gallipoli_data.Temperature.resample(rule = ‘2w’).mean()Agregación de temperatura quincenal: imagen del autor El número antes de la w define la cantidad de instancias por las que queremos agrupar y la w define que queremos un marco de tiempo de una semana. ¿Puede adivinar cuál es el argumento que necesitamos pasar para agregar nuestros datos? por cada 4 meses?gallipoli_data.Temperature.resample(regla = ‘4m’).mean()Ejemplo de agregación de 4 meses: imagen por autorEn resumen, la regla controla el intervalo de tiempo por el que queremos agrupar. Algunos de los parámetros de regla más famosos que puede usar son:s para segundost para minutosh para horasw para semanasm para mesesq para trimestreOtra característica importante del remuestreo es que puede ayudarlo a crear un marco de datos más completo al dar sentido a las brechas en los datos. Por ejemplo, imagine que tendríamos un conjunto de datos de ventas por hora de una tienda: rango_de_fechas = pd.rango_de_fechas(‘1/2/2022′, periodos=24, frecuencia=’H’)
ventas = np.random.randint(100, 400, size=24)sales_data = pd.DataFrame(
Ventas,
índice = intervalo_de_fechas,
columnas = [‘Sales’]
)Encabezado del marco de datos sales_data — Imagen del autor. Eliminemos la fila de las ventas a las 10 am (imaginando que esto fue algo que realmente sucedió y que no hubo ventas en esta tienda durante este tiempo):sales_data = sales_data.drop(sales_data.iloc[10].nombre)Encabezado del marco de datos sales_data sin ventas a las 10 a.m.: imagen del autor. Si aplicamos una nueva muestra a este marco de datos, aparecerá una nueva fila con NaN: pd. DataFrame (
sales_data.Sales.resample(‘h’).mean()
)Jefe del marco de datos sales_data sin ventas a las 10 a. m. después del remuestreo: imagen del autor Esto es extremadamente útil en muchos escenarios basados ​​en el tiempo. Normalmente, si tenemos una brecha en los datos de nuestra serie temporal, queremos tener una fila que represente esa brecha y el remuestreo nos brinda una forma rápida de lograrlo. En el ejemplo anterior, incluso podemos agregar un fillna(0) para que nuestro escenario de “falta de ventas” a las 10 am sea aún más obvio:Jefe del marco de datos sales_data sin ventas a las 10 a. m. después de volver a muestrear — Imagen del autor Llenar los vacíos es algo muy común que queremos hacer cuando trabajamos con datos basados ​​en el tiempo. No solo al crear funciones, sino también como una forma de detectar errores importantes en nuestras canalizaciones de datos. ¡Gracias por tomarse el tiempo de leer esta publicación! método a fondo, ya que le ahorrará muchos dolores de cabeza durante el proceso de procesamiento de datos. Ya sea cuando estamos creando funciones basadas en el tiempo o manipulando datos de series temporales, el uso de remuestreo hace que nuestro código sea más eficiente y limpio. Como hemos discutido, este método también es útil para detectar algunas brechas inesperadas en los datos basados ​​en el tiempo, por lo que espero que pueda usar el conocimiento de esta publicación en algún momento en sus futuras canalizaciones de datos. El conjunto de datos utilizado en esta publicación está bajo CC BY 4.0 y pertenece a Meteoblue.