Análisis de Fallas - Turbo Soplador 101_J
Librerías y su Utilidad para el Análisis de Fallas
A continuación, te presento una descripción de las librerías que se están instalando y su posible
utilidad en el contexto de análisis de fallas:
sweetviz: Esta librería genera reportes interactivos en HTML con un análisis exploratorio de datos
(EDA). Es muy útil para entender rápidamente las características de tus datos, incluyendo
estadísticas descriptivas, distribuciones, valores faltantes, correlaciones, etc.
Utilidad en Análisis de Fallas: Te ayudará a identificar patrones y anomalías en los datos
relacionados con el turbo soplador, lo cual es crucial para entender las causas de las fallas.
ydata-profiling: Similar a sweetviz, ydata-profiling también genera reportes interactivos en HTML
con un análisis exploratorio de datos. Facilita la comparación visual de diferentes variables y
conjuntos de datos.
Utilidad en Análisis de Fallas: Útil para comparar datos de funcionamiento normal del turbo
soplador con datos de fallas, y así identificar diferencias significativas.
klib: Esta librería ofrece funciones para limpiar y preprocesar datos de manera sencilla. Permite
tratar valores faltantes, eliminar duplicados, cambiar tipos de datos, etc.
Utilidad en Análisis de Fallas: Ayuda a preparar los datos para el análisis, asegurando que estén
limpios y en un formato adecuado.
seaborn: Es una librería de visualización de datos basada en matplotlib. Permite crear gráficos
estadísticos de alta calidad para explorar y comunicar los resultados del análisis.
Utilidad en Análisis de Fallas: Facilita la visualización de tendencias, correlaciones y patrones en
los datos de fallas, lo cual es esencial para la comunicación y comprensión.
prophet: Desarrollada por Facebook, esta librería está diseñada para realizar pronósticos de series
temporales. Es especialmente útil para datos con estacionalidad y tendencias.
Utilidad en Análisis de Fallas: Si tienes datos históricos de fallas, prophet podría ayudarte a
predecir futuras fallas y tomar medidas preventivas.
pyspark: Esta librería permite trabajar con Apache Spark, un framework para procesamiento de
datos a gran escala. Es útil si tienes grandes volúmenes de datos de fallas.
Utilidad en Análisis de Fallas: Si los datos del turbo soplador son muy grandes, pyspark te
permitirá analizarlos de manera eficiente.
lifelines: Esta librería está enfocada en el análisis de supervivencia, que se utiliza para modelar el
tiempo hasta que ocurre un evento (en este caso, una falla).
Utilidad en Análisis de Fallas: Permite estimar la probabilidad de falla del turbo soplador en
función del tiempo y otros factores.
neuralprophet: Es una librería para pronósticos de series temporales basada en redes neuronales.
Puede ser útil si los datos tienen patrones complejos.
Utilidad en Análisis de Fallas: Similar a prophet, pero con la capacidad de modelar patrones más
complejos en los datos de fallas.
kaleido: Esta librería permite guardar gráficos generados con Plotly en diferentes formatos (PNG,
JPEG, PDF, SVG).
Utilidad en Análisis de Fallas: Facilita la exportación de visualizaciones para su inclusión en
informes o presentaciones.
df_spark_avisos = spark.read.table(...): Esta línea lee los datos desde la tabla y los carga en un
DataFrame de Spark llamado df_spark_avisos.
#df_spark_avisos = ...: Las líneas comentadas muestran cómo podrías filtrar los datos por fecha y
eliminar duplicados, pero estas acciones no se están aplicando en este momento.
display(df_spark_avisos): Esta línea muestra los datos cargados en un formato adecuado para
Jupyter Notebooks.
Convierte el DataFrame de Spark a Pandas:
df_avisos_101 = df_spark_avisos.toPandas(): Convierte el DataFrame de Spark
df_spark_avisos a un DataFrame de Pandas df_avisos_101. Esta conversión es necesaria
para utilizar muchas de las funciones de Pandas y otras librerías de Python que no están
disponibles en Spark.
Convierte columnas a formato de fecha y hora:
df_avisos_101['FinicioAveria'] = pd.to_datetime(df_avisos_101['FinicioAveria']):
Convierte la columna 'FinicioAveria' (fecha de inicio de la avería) a formato de fecha y
hora.
df_avisos_101['FFinAveria'] = pd.to_datetime(df_avisos_101['FFinAveria']): Convierte la
columna 'FFinAveria' (fecha de fin de la avería) a formato de fecha y hora.
df_avisos_101['HinicioAveria'] = pd.to_datetime(df_avisos_101['HinicioAveria']):
Convierte la columna 'HinicioAveria' (hora de inicio de la avería) a formato de fecha y hora.
df_avisos_101['HFinAveria'] = pd.to_datetime(df_avisos_101['HFinAveria']): Convierte la
columna 'HFinAveria' (hora de fin de la avería) a formato de fecha y hora.
Muestra las primeras filas del DataFrame:
df_avisos_101.head(): Muestra las primeras 5 filas del DataFrame df_avisos_101. Esto te
permite verificar rápidamente que los datos se hayan cargado y convertido
correctamente.
Descripción del Código
1. Conteo de valores:
o conteo_1900 = (df_avisos_101['FFinAveria'] == '1900-01-01').sum(): Cuenta
cuántas veces aparece el valor '1900-01-01' en la columna 'FFinAveria'. Este valor
podría representar una fecha no registrada o un valor por defecto.
o conteo_otros = df_avisos_101.shape[0] - conteo_1900: Calcula cuántos valores
son diferentes de '1900-01-01', restando el conteo anterior al número total de
filas en el DataFrame.
2. Preparación de datos para la gráfica:
o labels = ['1900-01-01', 'Otros']: Define las etiquetas que se mostrarán en la gráfica
de pastel.
o sizes = [conteo_1900, conteo_otros]: Define los tamaños de cada porción del
pastel, correspondientes a los conteos calculados.
o colors = ['#BC955C', '#9F2241']: Define los colores que se utilizarán para cada
porción del pastel. Estos colores parecen ser parte de una paleta personalizada.
3. Función personalizada para etiquetas:
o def autopct_func(pct, all_values): ...: Define una función que se utilizará para
formatear las etiquetas dentro de las porciones del pastel. Esta función muestra
tanto el porcentaje como el número absoluto de elementos en cada porción.
4. Creación de la gráfica de pastel:
o fig, ax = plt.subplots(figsize=(8, 6)): Crea la figura y los ejes para la gráfica. Se
define el tamaño de la figura como 8x6 pulgadas.
o wedges, texts, autotexts = ax.pie(...): Crea la gráfica de pastel utilizando los datos
y parámetros definidos anteriormente. Se especifica el ángulo de inicio, los
colores, el formato de las etiquetas, el color de los bordes de las porciones, etc.
5. Formato de etiquetas internas:
o El bucle for autotext in autotexts: itera sobre las etiquetas internas (porcentajes y
números) y les aplica formato de color blanco, negrita y tamaño de fuente 12.
6. Título de la gráfica:
o plt.title(...): Define el título de la gráfica y su formato (tamaño de fuente y color).
7. Mostrar la gráfica:
o plt.show(): Muestra la gráfica en pantalla.
La gráfica de pastel muestra la proporción de dos categorías en la
columna 'FFinAveria':
1900-01-01: Representa el 35.5% de los datos, con un
total de 43 elementos. Este valor probablemente indica
una fecha no registrada o un valor por defecto en los
Reemplaza valores en 'FFinAveria':
df_avisos_101j.loc[df_avisos_101j['FFinAveria'] == pd.Timestamp('1900-01-01'),
'FFinAveria'] = df_avisos_101j['FInicioAveria']: Esta línea busca en la columna 'FFinAveria'
los valores que sean iguales a la fecha '1900-01-01' (probablemente un valor por defecto
para fechas no registradas) y los reemplaza con los valores correspondientes de la
columna 'FInicioAveria'. Esto se hace utilizando .loc para acceder a las filas y columnas
específicas y asignar los nuevos valores.
Ordena el DataFrame:
df_avisos_101j.sort_values(by='FinicioAveria', inplace=True): Esta línea ordena el
DataFrame df_avisos_101j según los valores de la columna 'FinicioAveria' (fecha de inicio
de la avería). El argumento inplace=True modifica el DataFrame original en lugar de crear
una copia.
Muestra las primeras filas:
df_avisos_101j.head(): Muestra las primeras 5 filas del DataFrame df_avisos_101j. Esto te
permite verificar rápidamente los cambios realizados y asegurarte de que los datos se
hayan modificado y ordenado correctamente.
Carga de datos de Spark:
df_spark_j101 = spark.read.table("mantenimiento.tula.j181"): Lee los datos del equipo
101-J desde una tabla de Spark llamada "mantenimiento.tula.j181" y los carga en un
DataFrame de Spark.
#df_spark_j101 = df_spark_j101.filter(...): Esta línea está comentada, pero muestra cómo
podrías filtrar los datos por fecha si fuera necesario.
display(df_spark_j101): Muestra los datos cargados en un formato adecuado para Jupyter
Notebooks.
df_spark_j101.dropDuplicates(): Elimina las filas duplicadas del DataFrame de Spark.
Conversión a Pandas:
df_101j = df_spark_j101[["fecha", "TAG_PI", "value", "tiempo"]].toPandas(): Selecciona
las columnas relevantes ("fecha", "TAG_PI", "value", "tiempo") del DataFrame de Spark y
las convierte a un DataFrame de Pandas.
Conversión de tipos de datos:
df_101j['tiempo'] = pd.to_datetime(df_101j['tiempo'], errors='coerce'): Convierte la
columna 'tiempo' a formato de fecha y hora. El argumento errors='coerce' maneja los
errores convirtiendo los valores no válidos a NaT (Not a Time).
df_101j['value'] = pd.to_numeric(df_101j['value'], errors='coerce'): Convierte la columna
'value' a formato numérico. Similarmente, errors='coerce' convierte los valores no válidos
a NaN (Not a Number).
Ordenamiento y limpieza:
df_101j = df_101j.sort_values(by="tiempo"): Ordena el DataFrame por la columna
'tiempo' (fecha y hora).
df_101j.dropna(): Elimina las filas que contienen valores faltantes (NaN o NaT).
Visualización:
df_101j.head(5): Muestra las primeras 5 filas del DataFrame para verificar los cambios.
Verificación y conversión de 'HiniAv':
if df_avisos_101j['HiniAv'].dtype != 'timedelta64[ns]':: Verifica si la columna 'HiniAv'
(hora de inicio de la avería) es de tipo Timedelta.
df_avisos_101j['HiniAv'] = df_avisos_101j['HiniAv'].apply(lambda x: x + ":00" if
len(x.split(":")) == 2 else x): Si no es Timedelta, asegura que esté en formato "hh:mm".
Añade ":00" si solo tiene horas y minutos.
df_avisos_101j['HiniAv'] = pd.to_timedelta(df_avisos_101j['HiniAv']): Convierte la
columna 'HiniAv' a tipo Timedelta.
Creación de 'tiempo_inicio':
df_avisos_101j['tiempo_inicio'] = df_avisos_101j['FInicioAveria'] +
df_avisos_101j['HiniAv']: Crea una nueva columna 'tiempo_inicio' combinando la fecha de
inicio de la avería ('FInicioAveria') y la hora de inicio ('HiniAv').
Creación de 'tiempo_fin':
df_avisos_101j['tiempo_fin'] = df_avisos_101j['FFinAveria'] +
df_avisos_101j['HFinAveria']: Crea una nueva columna 'tiempo_fin' combinando la fecha
de fin de la avería ('FFinAveria') y la hora de fin ('HFinAveria').
Conversión de 'tiempo' en df_101j:
df_101j['tiempo'] = pd.to_datetime(df_101j['tiempo']): Convierte la columna 'tiempo' a
formato datetime si no lo está ya.
Inicialización de 'tiempo_averia':
df_101j['tiempo_averia'] = None: Inicializa una nueva columna 'tiempo_averia' con
valores nulos. Esta columna probablemente se utilizará para calcular la duración de la
avería.
Asignación de información de averías:
El bucle for index, row in df_avisos_101j.iterrows(): itera sobre cada fila del DataFrame
df_avisos_101j (que contiene información detallada de las averías).
Dentro del bucle, se define una máscara mask que identifica las filas en df_101j (datos del
equipo 101-J) cuyo tiempo ('tiempo') se encuentra dentro del intervalo definido por
'tiempo_inicio' y 'tiempo_fin' de la avería actual.
Para las filas que cumplen con la condición de la máscara, se asignan los siguientes
valores:
o df_101j['tiempo_averia'] = df_101j['tiempo']: Se asigna el valor de 'tiempo' a la
columna 'tiempo_averia'.
o df_101j['QMART'] = row['QMART']: Se asigna el tipo de aviso ('QMART') de la
avería actual.
o df_101j['QMTXT'] = row['QMTXT']: Se asigna el texto descriptivo del aviso
('QMTXT') de la avería actual.
Cálculo de fechas de inicio y fin de avería:
df_101j['tiempo_averia'] = pd.to_datetime(df_101j['tiempo_averia']): Se asegura de que
la columna 'tiempo_averia' esté en formato datetime.
df_101j['FI_Averia'] = df_101j.groupby('QMART')['tiempo_averia'].transform('min'): Se
calcula la fecha de inicio de la avería ('FI_Averia') como el valor mínimo de 'tiempo_averia'
para cada grupo de avisos ('QMART').
df_101j['FF_Averia'] = df_101j.groupby('QMART')['tiempo_averia'].transform('max'): Se
calcula la fecha de fin de la avería ('FF_Averia') como el valor máximo de 'tiempo_averia'
para cada grupo de avisos ('QMART').
Verificación:
df_101j.tail(): Muestra las últimas filas del DataFrame para verificar que las columnas se
hayan agregado y calculado correctamente.
Importación de bibliotecas:
import matplotlib.pyplot as plt: Importa la biblioteca matplotlib.pyplot para crear gráficos.
import matplotlib.cm as cm: Importa el módulo cm de matplotlib para utilizar mapas de
colores predefinidos.
import numpy as np: Importa la biblioteca numpy para realizar operaciones numéricas.
Filtrado de datos:
df_filtered = df_101j[df_101j['TAG_PI'] == "TUCAB.XI_16218.PV"]: Filtra el DataFrame
df_101j para obtener solo las filas donde la columna 'TAG_PI' sea igual a
"TUCAB.XI_16218.PV". Este filtro se aplica para seleccionar los datos de una variable
específica del equipo.
Eliminación de valores nulos:
df_filtered = df_filtered.dropna(subset=['value']): Elimina las filas del DataFrame filtrado
donde la columna 'value' (valor de la variable) contenga valores nulos (NaN). Esto asegura
que solo se grafiquen datos numéricos válidos.
Creación de la figura:
plt.figure(figsize=(10, 6)): Crea una nueva figura para el gráfico con un tamaño de 10x6
pulgadas.
Graficación de los datos:
plt.plot(...): Grafica los datos de la variable "TUCAB.XI_16218.PV" a lo largo del tiempo. Se
especifica el color '#9F2241' (un color personalizado), la etiqueta "TUCAB.XI_16218.PV", el
estilo de línea '-', y el ancho de línea 2.
Identificación de intervalos de avería:
df_no_nulo = df_filtered[df_filtered['tiempo_averia'].notnull()]: Crea un nuevo DataFrame
df_no_nulo que contiene solo las filas donde la columna 'tiempo_averia' no tiene valores
nulos (NaN). Esto se hace para identificar los períodos de tiempo durante los cuales se
registró una avería.
intervals = df_no_nulo.groupby(['QMART', 'QMTXT']).agg(...): Agrupa el DataFrame
df_no_nulo por el tipo de aviso ('QMART') y la descripción del aviso ('QMTXT') y calcula las
fechas de inicio ('FI_Averia') y fin ('FF_Averia') de cada avería como los valores mínimo y
máximo de 'tiempo_averia' dentro de cada grupo.
Añadir bloques sombreados:
El bucle for idx, interval in intervals.iterrows(): itera sobre cada intervalo de avería
identificado.
Dentro del bucle, se utiliza plt.axvspan() para dibujar un rectángulo sombreado que
representa el intervalo de la avería. Se especifica el color de relleno, la transparencia
(alpha) y una etiqueta para la leyenda.
Ajustes visuales:
Se añaden título y etiquetas a los ejes del gráfico.
Se ajustan las marcas del eje x para que sean más legibles.
Se añade una cuadrícula al gráfico para facilitar la lectura de los valores.
Leyenda:
Se crea una leyenda que muestra solo un ítem para los intervalos de avería, evitando
duplicados.
Información textual de averías:
Se imprime información textual sobre cada avería, incluyendo el tipo, la descripción y las
fechas de inicio y fin.
La gráfica muestra la evolución de la variable "TUCAB.XI_1621B.PV" a lo largo del tiempo, con bloques sombreados que
indican los períodos de avería. Podemos observar lo siguiente:
Eje X (Tiempo): Muestra el tiempo en el que se registraron los datos, desde aproximadamente el 1 de junio de 2022
hasta el 15 de septiembre de 2022.
Eje Y (Vibración): Muestra los valores de la variable "TUCAB.XI_1621B.PV", que parece representar la vibración del
equipo. Los valores oscilan entre 12 y 20 unidades (la unidad específica no se indica en la gráfica).
Línea (TUCAB.XI_1621B.PV): Muestra la variación de la vibración a lo largo del tiempo. Se pueden observar
fluctuaciones y cambios en la intensidad de la vibración.
Bloques Sombreados (Intervalo de Avería): Representan los períodos de tiempo en los que se registró una avería.
La ubicación y la duración de los bloques sombreados indican cuándo ocurrieron las averías y cuánto duraron.
1. Importación de bibliotecas:
o import matplotlib.pyplot as plt: Importa la biblioteca matplotlib.pyplot para crear
gráficos.
o import matplotlib.cm as cm: Importa el módulo cm de matplotlib para utilizar
mapas de colores predefinidos.
o import numpy as np: Importa la biblioteca numpy para realizar operaciones
numéricas.
2. Iteración sobre variables únicas:
o for tag_pi in df_101j['TAG_PI'].unique():: Itera sobre cada valor único en la
columna 'TAG_PI' del DataFrame df_101j. Esto permite generar un gráfico para
cada variable (TAG_PI) del equipo.
3. Filtrado de datos:
o df_filtered = df_101j[df_101j['TAG_PI'] == tag_pi]: Filtra el DataFrame df_101j
para obtener solo las filas donde la columna 'TAG_PI' sea igual al valor actual de la
variable (tag_pi).
4. Eliminación de valores nulos:
o df_filtered = df_filtered.dropna(subset=['value']): Elimina las filas del DataFrame
filtrado donde la columna 'value' (valor de la variable) contenga valores nulos
(NaN). Esto asegura que solo se grafiquen datos numéricos válidos.
5. Creación de la figura:
o plt.figure(figsize=(10, 6)): Crea una nueva figura para el gráfico con un tamaño de
10x6 pulgadas.
6. Graficación de los datos:
o plt.plot(...): Grafica los datos de la variable actual (tag_pi) a lo largo del tiempo. Se
especifica el color '#9F2241' (un color personalizado), la etiqueta str(tag_pi), el
estilo de línea '-', y el ancho de línea 2.
El código que proporcionaste realiza las siguientes acciones:
1. Añadir bloques sombreados:
o df_no_nulo = df_filtered[df_filtered['tiempo_averia'].notnull()]: Crea un nuevo
DataFrame df_no_nulo que contiene solo las filas donde la columna
'tiempo_averia' no tiene valores nulos (NaN). Esto se hace para identificar los
períodos de tiempo durante los cuales se registró una avería.
o intervals = df_no_nulo.groupby(['QMART', 'QMTXT']).agg(...): Agrupa el DataFrame
df_no_nulo por el tipo de aviso ('QMART') y la descripción del aviso ('QMTXT') y
calcula las fechas de inicio ('FI_Averia') y fin ('FF_Averia') de cada avería como los
valores mínimo y máximo de 'tiempo_averia' dentro de cada grupo.
o El bucle for idx, interval in intervals.iterrows(): itera sobre cada intervalo de avería
identificado.
o Dentro del bucle, se utiliza plt.axvspan() para dibujar un rectángulo sombreado
que representa el intervalo de la avería. Se especifica el color de relleno, la
transparencia (alpha) y una etiqueta para la leyenda.
2. Ajustes visuales:
o Se añaden título y etiquetas a los ejes del gráfico.
o Se ajustan las marcas del eje x para que sean más legibles.
o Se añade una cuadrícula al gráfico para facilitar la lectura de los valores.
3. Leyenda:
o Se crea una leyenda que muestra solo un ítem para los intervalos de avería,
evitando duplicados.
4. Mostrar la gráfica:
o plt.tight_layout(): Ajusta los parámetros de la gráfica para que quepan dentro de
la figura.
o plt.show(): Muestra la gráfica en pantalla.
El código que proporcionaste realiza las siguientes acciones:
1. Guardar información textual de averías:
o Dentro del bucle for idx, interval in intervals.iterrows():, se guarda información
textual sobre cada avería en la lista averia_info. La información incluye el TAG_PI,
el tipo de avería (QMART), la descripción (QMTXT), y las fechas de inicio
(FI_Averia) y fin (FF_Averia).
2. Ajustes visuales:
o Se añaden título y etiquetas a los ejes del gráfico, utilizando el valor de tag_pi para
el título.
o Se ajustan las marcas del eje x para que sean horizontales (rotation=0).
o Se añade una cuadrícula al gráfico para facilitar la lectura de los valores.
3. Leyenda:
o Se crea una leyenda que muestra solo un ítem para los intervalos de avería,
evitando duplicados.
4. Ajustar la visualización:
o plt.tight_layout(): Ajusta los parámetros de la gráfica para que quepan dentro de
la figura.
5. Mostrar la gráfica:
o plt.show(): Muestra la gráfica en pantalla.
6. Mostrar información textual de averías:
o Se verifica si hay información de averías (if averia_info:) antes de imprimirla.
o Se itera sobre la lista averia_info y se imprime la información de cada avería,
incluyendo el TAG_PI, el tipo, la descripción, y las fechas de inicio y fin.
7. Guardar la gráfica (opcional):
o # plt.savefig(f'grafico_{tag_pi}.png', dpi=300): Esta línea está comentada, pero
muestra cómo podrías guardar la gráfica como un archivo PNG.
La gráfica muestra la evolución de la variable "TUCAB.XI_1621A.PV" a lo largo del tiempo, con
bloques sombreados que indican los períodos de avería. Podemos observar lo siguiente:
Eje X (Tiempo): Muestra el tiempo en el que se registraron los datos, desde
aproximadamente el 1 de junio de 2022 hasta el 15 de septiembre de 2022.
Eje Y (Valor): Muestra los valores de la variable "TUCAB.XI_1621A.PV". La unidad
específica no se indica en la gráfica, pero parece representar alguna magnitud física
relevante para el equipo. Los valores oscilan entre 9 y 14 unidades.
Línea (TUCAB.XI_1621A.PV): Muestra la variación de la variable a lo largo del tiempo. Se
pueden observar fluctuaciones y cambios en la intensidad de la variable.
Bloques Sombreados (Intervalo de Avería): Representan los períodos de tiempo en los
que se registró una avería. La ubicación y la duración de los bloques sombreados indican
cuándo ocurrieron las averías y cuánto duraron.
Flujo General del Código
1. Carga de datos:
o Se cargan los datos del equipo 101-J desde una tabla de Spark.
o Se seleccionan las columnas relevantes para el análisis.
o Se eliminan las filas duplicadas y los valores nulos.
2. Conversión y preparación de datos:
o Se convierten las columnas de fecha y hora a formatos adecuados.
o Se crea un DataFrame de Pandas para facilitar el análisis.
o Se calculan las fechas de inicio y fin de las averías.
3. Visualización y análisis:
o Se generan gráficos de series temporales para visualizar la dinámica de las
variables del equipo a lo largo del tiempo.
o Se añaden bloques sombreados para representar los períodos de avería en los
gráficos.
o Se muestra información textual sobre las averías, incluyendo el tipo, la descripción
y las fechas de inicio y fin.