Estos scripts de Python automatizarán su análisis de datos

Trabajar con grandes conjuntos de datos puede ser un desafío. Aprenda a automatizar su análisis con estos sencillos scripts de Python.

Las empresas se rifan a los ingenieros con experiencia en Python - MuyPymes

Los científicos a menudo se encuentran con grandes conjuntos de datos, a veces en forma de gigabytes de datos en un solo archivo. Otras veces tendrán cientos de archivos, cada uno con una pequeña cantidad de datos. De cualquier manera, esta cantidad de datos es difícil de administrar, difícil de entender e incluso difícil de procesar para su computadora. Necesita una forma de simplificar el proceso, hacer que el conjunto de datos sea más manejable y ayudarlo a realizar un seguimiento de todo.

De eso se trata este tutorial. Estamos en el proceso de escribir scripts de Python que analizarán automáticamente todos sus datos por usted y los almacenarán con nombres de archivo significativos e intuitivos, todo mientras usamos un ejemplo del mundo real. De esta manera, sabrá que las habilidades que está desarrollando son prácticas y útiles.

La introducción al tutorial explicó los conceptos que estamos usando. Si «calentador de agua con bomba de calor», «coeficiente de rendimiento (COP)» y «mapa de rendimiento» no significan nada para usted, compruébelo.

La segunda parte presentó el conjunto de datos complementarios y dividió el conjunto de datos en varios archivos con nombres fáciles de usar.

El conjunto de datos complementario es una parte valiosa del proceso del tutorial, ya que le permite seguirlo. Puede escribir exactamente el mismo código que presentaré, ejecutar el código, ver los resultados y compararlo con los resultados que presento. )

Ahora tenemos tres archivos de datos, cada uno de los cuales contiene resultados de pruebas a una temperatura ambiente específica. En cada uno de esos archivos vemos el consumo de electricidad de la bomba de calor, la temperatura del agua en el tanque de almacenamiento y la temperatura del aire que rodea el calentador de agua.

El siguiente paso es procesar esos resultados. Necesitamos escribir un código que automáticamente dé sentido a los datos, calcule el COP de la bomba de calor y trace los datos para que podamos entenderlos visualmente.

Entonces empecemos. Al igual que con toda la programación de Python, primero debemos importar los paquetes.

¿Qué paquetes importo?

Hay varios paquetes que serán importantes para este paso. Son:

PAQUETES CLAVE PARA AUTOMATIZAR EL ANÁLISIS DE DATOS CON PYTHON

  • glob: glob es un paquete de creación de listas. Lee los archivos almacenados en una carpeta y crea una lista que los contiene todos. Dado que Python es excelente para iterar a través de listas, podemos usar glob para crear una lista de todos nuestros archivos de datos y hacer que Python los analice uno a la vez.
  • Pandas: ¿Necesito indicar la importancia de este paquete? Pandas es el estándar de oro de las herramientas de análisis de datos de Python.
  • os: os nos da acceso a los comandos del sistema operativo. Lo que suena intimidante porque potencialmente podrías arruinar tu computadora usándolo. No te preocupes; solo lo usaremos para buscar y agregar carpetas.
  • NumPy: NumPy es un gran paquete numérico que permite poderosas herramientas de análisis de datos. En este caso específico, usaremos NumPy para crear regresiones de nuestros datos.
  • Bokeh: Bokeh es una herramienta de trazado interactiva en Python. Le permite escribir código que genera gráficos automáticamente mientras analiza sus datos y brinda opciones para que el usuario interactúe con ellos. 

No usaremos Bokeh en el script para esta parte del tutorial; sin embargo, este script será la base para futuras partes del tutorial. Vale la pena importar Bokeh ahora para que no tenga que preocuparse más tarde.

Para este proyecto, necesitaremos importar la totalidad de glob, Pandas, os y NumPy mientras solo importamos ciertas funciones de Bokeh. Todos estos se pueden llamar usando el siguiente código: i

mport glob
import pandas as pd
import os
import numpy as np
from bokeh.plotting import figure, save, gridplot, output_file

Tenga en cuenta que importamos y asignamos Pandas a pd mientras asignamos NumPy a np. Esto significa que ahora podemos hacer referencia a estos paquetes escribiendo «pd» y «np» en lugar de Pandas y NumPy, respectivamente.

Ahora que hemos importado todos nuestros paquetes, el siguiente paso es crear nuestra lista global y el ciclo for para iterar secuencialmente a través de todos sus archivos. Cuando esté preparado, puede escribir código analizando cada uno de nuestros archivos de datos.

¿Cómo repito mis archivos?

El primer paso es configurar glob. Para hacer esto, debe proporcionar a glob una ruta y un tipo de archivo (el tipo de archivo es opcional, pero todos nuestros datos están en formato .csv, por lo que queremos especificarlo para evitar incluir archivos extraños). Luego, cuando llame a glob, creará una lista de todos los archivos de ese tipo en la carpeta especificada. Puede hacer esto usando las siguientes líneas de código:

Path = r'C:\Users\YourName\Documents\AutomatingDataAnalysis\Files_IndividualTests'

Filenames = glob.glob(Path + '/*.csv')

La variable Path le dice a glob que busque en la carpeta especificada los archivos relevantes. Tenga en cuenta que la carpeta especificada anteriormente es la misma carpeta en la que guardó los archivos en la segunda parte de este tutorial .

La segunda línea llama a la función glob del paquete glob para crear una lista de todos los archivos especificados. Observe que el código hace referencia a la variable Path que especificó para indicar qué carpeta debe buscar archivos glob, seguida de un código que indica que glob debe incluir todos los archivos .csv y nada más.

Después de que se ejecute este código, glob creará una lista de todos los archivos .csv en la carpeta. Tendrá la forma [1.csv, 2. csv, 3.csv,…, n.csv]. Para aquellos que han descargado el conjunto de datos complementario y están siguiendo el tutorial, será la ruta completa para PerformanceMap_HPWH_55.csv, PerformanceMap_HPWH_70.csv y PerformanceMap_HPWH_95.csv.

Ahora que tiene una lista de archivos, el siguiente paso es crear un bucle for que recorra cada uno de estos archivos. Luego, debe abrir los archivos para poder realizar un análisis de datos en cada uno de ellos. Para hacerlo, necesita el siguiente código:

for Filename in Filenames:

    Data = pd.read_csv(Filename)

Este código itera automáticamente a través de cada entrada en la lista de nombres de archivo. Nota: la forma en que hemos escrito esto lleva a que el nombre de archivo contenga el nombre de archivo real de cada entrada en la lista. Por ejemplo, la primera vez, el nombre del archivo de bucle for contendrá la ruta completa para: PerformanceMap_HPWH_55.csv.

La segunda línea usa Pandas para leer el archivo en la memoria y lo guarda en Datos para un análisis posterior.

Ahora que el código ha localizado los archivos y los está abriendo secuencialmente, el siguiente paso es agregar código para analizar cada archivo. 

¿Cómo analizo automáticamente cada archivo?

Esto requiere una buena cantidad de conocimiento sobre el equipo del que estamos hablando además de conocer Python, así que tengan paciencia conmigo.

FILTRAR LOS DATOS PARA CONTENER SOLO LA PARTE IMPORTANTE

Para este proceso, solo nos preocupamos por los datos cuando la bomba de calor en la HPWH está activa. Las bombas de calor de estos dispositivos suelen consumir entre 400 y 600 vatios (W) dependiendo de la temperatura ambiente y del agua. Mientras tanto, las HPWH tienen dispositivos electrónicos a bordo que consumen algo de electricidad. Para filtrar los datos al segmento que nos interesa, debemos eliminar todos los datos con un consumo de electricidad inferior a 300 W, que es significativamente más alto que el consumo de energía de la electrónica de a bordo pero por debajo del consumo mínimo de la bomba de calor. Podemos hacer esto con la siguiente línea:

Data = Data[Data['P_Elec (W)'] > 300]

Esa línea restablece nuestro marco de datos para tener solo los datos donde el dispositivo consume más de 300 W. Sin embargo, eso sí afectó el índice del marco de datos, por lo que debemos restablecerlo para mantener limpio nuestro marco de datos. Podemos utilizar el siguiente código:

Data = Data.reset_index()
del Data['index']

IDENTIFICACIÓN DEL CAMBIO DE TIEMPO ENTRE MEDICIONES

No es fácil trabajar con los datos de la marca de tiempo de este conjunto de datos. Afortunadamente, gracias a la colaboración con nuestro socio de pruebas de laboratorio, sabemos que las mediciones se tomaron cada 10 segundos. Podemos crear una nueva columna en nuestro marco de datos que indique cuánto tiempo ha estado activa la prueba usando el siguiente código:

Data[‘Time Since Test Start (min)’] = Data.index * 10./60.

CÁLCULO DEL CAMBIO DE ENERGÍA ALMACENADA EN EL AGUA

Uno de los parámetros clave que impactan el COP de los HPWH es la temperatura del agua en el tanque de almacenamiento. El agua no se mezclará lo suficientemente bien como para mantener una temperatura única y constante. Por lo general, habrá agua fría en la parte inferior del tanque y agua caliente en la parte superior. Por el bien de este ejercicio, es suficiente calcular la temperatura promedio del tanque. Dado que nuestro probador de laboratorio tuvo la amabilidad de informarnos que usaron ocho mediciones de temperatura espaciadas uniformemente en todo el tanque, podemos calcular la temperatura promedio del agua usando:

Data['Average Tank Temperature (deg F)'] = (1./8.) * (Data['T1 (deg F)'] + Data['T2 (deg F)'] + Data['T3 (deg F)'] + Data['T4 (deg F)'] + Data['T5 (deg F)'] + Data['T6 (deg F)'] + Data['T7 (deg F)'] + Data['T8 (deg F)'])

Ahora, lo que realmente nos importa aquí es cuánto cambia la temperatura promedio del tanque de un tiempo de medición a otro. De esta manera podemos identificar el cambio en la energía almacenada en el tanque y, por lo tanto, la energía agregada al agua por la bomba de calor. Podemos hacer esto usando las siguientes dos líneas de código:

Data['Previous Average Tank Temperature (deg F)'] = Data['Average Tank Temperature (deg F)'].shift(periods = 1)

Data.loc[0, 'Previous Average Tank Temperature (deg F)'] = 72.0

La primera línea usa el comando .shift de un marco de datos de pandas para crear una nueva columna en el marco de datos que contiene los datos de ‘Temperatura promedio del tanque (grados F)’, pero se desplazó una fila hacia abajo en el marco de datos. Esto crea una celda vacía en la primera fila (índice 0) que causa errores al realizar cálculos. 

La segunda línea de código rectifica esto usando .loc para llenar esta celda con 72.0. Podemos hacer esto porque nuestro amigable probador de laboratorio nos dijo que las pruebas comenzaron precisamente a 72.0 grados F cada vez.

Ahora podemos calcular el cambio en la energía almacenada en el agua entre cada dos marcas de tiempo. Para hacer esto, necesitamos conocer algunas constantes y ecuaciones:

  • Primero, la ecuación para identificar el cambio de energía en el agua en Energía = Masa * Calor_específico * (Temperatura_Final – Temperatura_Inicial).
  • En segundo lugar, sabemos que el tanque de almacenamiento del HPWH tiene capacidad para 80 galones (nuevamente, gracias a la comunicación de nuestro amigable probador de laboratorio).
  • En tercer lugar, la densidad del agua es de 8,3176 lb / gal.
  • Cuarto, el calor específico del agua es 0,998 Btu / lb-F.

Podemos juntarlo todo y calcular el cambio en la energía almacenada usando la siguiente línea:

Data['Change in Stored Energy (Btu)'] =  (80 * 8.3176) * (0.998) * (Data['Average Tank Temperature (deg F)'] - Data['Previous Average Tank Temperature (deg F)'])

Calculando el COP

El siguiente paso para analizar cada conjunto de datos es calcular el COP en función de la temperatura del agua en el tanque. El objetivo de este tutorial es identificar el COP en función tanto de la temperatura del agua como de la temperatura ambiente, y esto proporcionará una comprensión del COP en función de la temperatura del agua a cada temperatura ambiente especificada.

Para calcular el COP de la bomba de calor necesitamos realizar algunas conversiones de unidades. El consumo de electricidad se expresa actualmente en W, mientras que la energía agregada al agua se expresa actualmente en Btu / paso de tiempo. Para hacer esta conversión de unidad, usamos la relación 1 W = 3.412142 Btu / hr, luego convertimos Btu / hr a Btu / sy multiplicamos por los 10 segundos por marca de tiempo. Esto da el código:

Data['P_Elec (Btu/10s)'] = Data['P_Elec (W)'] * (3.412142/60/60) * 10

El COP es, por definición, la cantidad de calor que se agrega al agua dividida por la cantidad de electricidad consumida. Así, podemos calcularlo con:

Data['COP (-)'] = Data['Change in Stored Energy (Btu)'] / Data['P_Elec (Btu/10s)']

Generando regresiones

Ahora tenemos una tabla que muestra el COP en función de la temperatura del agua en cada uno de los tres COP especificados. Pero podemos hacerlo mejor que eso. ¿No sería bueno tener una función que podamos usar para calcular el COP, de modo que podamos ingresar la temperatura del agua e identificar el COP en consecuencia?

NumPy proporciona las herramientas para facilitar esto. Podemos usar la función NumPy “polyfit” para identificar los coeficientes de una regresión que describa el COP en función de la temperatura del agua. Es una función flexible que le permite controlar la forma de la curva especificando el orden de la función al final. Dado que el COP de una bomba de calor en función de la temperatura es una curva parabólica, necesitamos una regresión de segundo orden para este ejemplo. Así, la siguiente línea identifica los coeficientes: 

Coefficients = np.polyfit(Data[‘Average Tank Temperature (deg F)’], Data[‘COP (-)’], 2)

Podemos usar la función NumPy «poly1d» para crear una regresión usando esos coeficientes con:

Regression = np.poly1d(Coefficients)

Ahora puede identificar el COP de la bomba de calor a una temperatura de agua específica usando esta regresión. Recuerde que la regresión solo se genera para una temperatura del aire específica, por lo que solo estime el COP utilizando la regresión para la temperatura del aire correcta. 

(Crear un mapa de rendimiento en 2-d es el objetivo final de este tutorial, pero todavía no lo hemos logrado).

Podemos identificar el COP a una temperatura de agua especificada llamando a la función y usando la temperatura del agua como entrada. Por ejemplo, si desea encontrar el COP cuando la temperatura del agua es de 72 ° F, puede ingresar:

COP_72 = Regression(72.0)

¿Cómo guardo estos resultados?

Los datos se pueden guardar usando las mismas técnicas que hemos estado usando . Necesitamos que: 

  1. Asegúrese de que haya disponible una carpeta para los resultados analizados. 
  2.  Cree un nuevo nombre de archivo que indique claramente lo que contiene el archivo.
  3.  Guardar los datos.

En este caso, queremos guardar los datos en un nuevo archivo llamado «Analizado». Debe estar en la misma carpeta de datos y usarse para mostrar los resultados del análisis. Podemos hacer esto con el siguiente código:

Folder = Path + '\Analyzed'

if not os.path.exists(Folder):

   os.makedirs(Folder)

La primera línea crea la ruta de la nueva carpeta. Agrega ‘\ Analizado’ a la ruta existente actualmente e indica que está buscando una carpeta llamada «Analizada» dentro de la carpeta actual. La segunda línea determina si esa carpeta ya existe o no. Si no es así, la tercera línea lo crea.

Después de eso, necesitamos establecer los nombres de archivo tanto para el conjunto de datos como para los coeficientes. Podemos hacer esto combinando lo que ya tenemos con una subsección de las cadenas. Podemos usar índices de cadenas para identificar la parte del nombre del archivo que queremos conservar. 

Por ejemplo, la sección del nombre del archivo para el primer archivo que dice «PerformanceMap_HPWH_50» indica claramente lo que contiene el archivo. Como sabemos que los últimos cuatro caracteres de los nombres de los archivos son ‘.csv’, podemos aislar esa sección de la cadena usando los índices [-26: -4]. En otras palabras, queremos que los caracteres de la cadena vayan del «26 al último» al «cuarto al último» sin incluir el cuarto al último.

A continuación, podemos personalizar un poco los nombres de los archivos. Es decir, podemos indicar que queremos que el nombre del archivo de datos indique que contiene datos analizados, y queremos que el nombre del archivo de coeficientes indique que contiene coeficientes. Podemos escribir el nombre del archivo para ambos archivos usando las siguientes líneas:

Filename_Test = Folder + '\\' + Filename[-26:-4] + '_Analyzed.csv'

Filename_Coefficients = Folder + '\Coefficients_' +  Filename[-6:]

Luego simplemente guardamos los archivos. Podemos guardar los datos analizados con la función Pandas .to_csv y podemos guardar los coeficientes con la función NumPy .tofile de la siguiente manera:

Data.to_csv(Filename_Test, index = False)

Coefficients.tofile(Filename_Coefficients, sep = ‘,’)

Tenga en cuenta que la línea que guarda los conjuntos de datos index = False. Esto significa que el índice del marco de datos no se guardará al guardar la tabla. También tenga en cuenta que la función .tofile de NumPy requiere que especifique un separador. En este caso, estamos usando una coma, como se especifica con el código sep = ‘,’.

¿Cómo verifico mi trabajo?

Hay una enorme cantidad de cosas que podrían haber salido mal en este punto del proceso. Quizás el probador de laboratorio cometió algunos errores al realizar los experimentos. Quizás se rompió un instrumento. Tal vez haya un error tipográfico en el código o una conversión de unidad incorrecta.

Es imperativo asegurarse de que ninguno de estos problemas, o cualquier otro, ocurra durante el proceso. Por lo tanto, el siguiente paso en el proceso es verificar el conjunto de datos en busca de errores. Cubriremos esto en el siguiente paso del tutorial. 

FUENTE: https://builtin.com/data-science/python-automate-data-analysis

Otras entradas que pueden interesarte

Mauricio Valderrama Escrito por:

2 comentarios

  1. Mario
    12 septiembre, 2021
    Responder

    Excelente contenido.

  2. Lio
    12 septiembre, 2021
    Responder

    Buenas recomendaciones, muchas gracias.

Deja una respuesta

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