Manejo de ETL’s
Python
R
SQL
Automatización de Procesos ETL
En este proyecto vamos a automatizar un proceso ETL, el mismo que tiene los siguientes pasos
Extraer los: En nuestro caso utilizaremos los datos de “World Happiness report”
Transformar los datos
Cargar los datos: se los cargarara en una base de SQLite
Viaualización del dataset
Código
import pandas as pd
import sqlite3
import logging
# Configuración básica de logging
='etl_processP.log', level=logging.INFO,
logging.basicConfig(filenameformat='%(asctime)s - %(levelname)s - %(message)s')
def extract_data():
try:
= pd.read_csv('world_happiness_report.csv')
df "Extracción de datos completada con éxito.")
logging.info(return df
except Exception as e:
"Error durante la extracción de datos: %s", e)
logging.error(raise
def transform_data(df):
try:
= df.drop(columns=['Standard Error'])
df 2:].fillna(df.iloc[:,2:].mean(), inplace=True)
df.iloc[:,= df.drop_duplicates()
df 'Economy (GDP per Capita)'] = df['Economy (GDP per Capita)'] / df['Economy (GDP per Capita)'].max()
df['Happiness Level'] = df['Happiness Score'].apply(lambda x: 'High' if x > df['Happiness Score'].mean() else 'Low')
df["Transformación de datos completada con éxito.")
logging.info(return df
except Exception as e:
"Error durante la transformación de datos: %s", e)
logging.error(raise
def load_data(df):
try:
= sqlite3.connect('world_happiness.db')
conn = conn.cursor()
cursor '''
cursor.execute( CREATE TABLE IF NOT EXISTS happiness_data (
Country TEXT,
Region TEXT,
Happiness_Rank INTEGER,
Happiness_Score REAL,
GDP_per_capita REAL,
Happiness_Level TEXT
)
''')
conn.commit()'happiness_data', conn, if_exists='replace', index=False)
df.to_sql(
conn.close()"Carga de datos completada con éxito.")
logging.info(except Exception as e:
"Error durante la carga de datos: %s", e)
logging.error(raise
def etl_process():
try:
"Inicio del proceso ETL.")
logging.info(= extract_data()
data = transform_data(data)
transformed_data
load_data(transformed_data)"Proceso ETL completado con éxito.")
logging.info(except Exception as e:
"El proceso ETL falló: %s", e)
logging.critical(raise
if __name__ == "__main__":
etl_process()
Código
# Cargar las bibliotecas necesarias
#install.packages("dplyr")
#install.packages("readr")
#install.packages("DBI")
#install.packages("RSQLite")
library(dplyr)
library(readr)
library(DBI)
library(RSQLite)
# Configuración básica de logging
<- "etl_processR.log"
log_file <- function(level, message) {
log_message cat(sprintf("%s - %s - %s\n", Sys.time(), level, message), file = log_file, append = TRUE)
}
# Función para extraer datos
<- function() {
extract_data tryCatch({
<- read_csv('world_happiness_report.csv')
df log_message("INFO", "Extracción de datos completada con éxito.")
return(df)
error = function(e) {
}, log_message("ERROR", paste("Error durante la extracción de datos:", e$message))
stop(e)
})
}
# Función para transformar datos
<- function(df) {
transform_data tryCatch({
<- df %>%
df select(-`Standard Error`) %>%
mutate(across(everything(), ~ifelse(is.na(.), mean(., na.rm = TRUE), .))) %>%
distinct() %>%
mutate(`Economy (GDP per Capita)` = `Economy (GDP per Capita)` / max(`Economy (GDP per Capita)`, na.rm = TRUE)) %>%
mutate(`Happiness Level` = ifelse(`Happiness Score` > mean(`Happiness Score`, na.rm = TRUE), 'High', 'Low'))
log_message("INFO", "Transformación de datos completada con éxito.")
return(df)
error = function(e) {
}, log_message("ERROR", paste("Error durante la transformación de datos:", e$message))
stop(e)
})
}
# Función para cargar datos en SQLite
<- function(df) {
load_data tryCatch({
<- dbConnect(SQLite(), dbname = "world_happiness.db")
conn
dbExecute(conn, '
CREATE TABLE IF NOT EXISTS happiness_data (
Country TEXT,
Region TEXT,
Happiness_Rank INTEGER,
Happiness_Score REAL,
GDP_per_capita REAL,
Happiness_Level TEXT
)')
dbWriteTable(conn, "happiness_data", df, overwrite = TRUE, row.names = FALSE)
dbDisconnect(conn)
log_message("INFO", "Carga de datos completada con éxito.")
error = function(e) {
}, log_message("ERROR", paste("Error durante la carga de datos:", e$message))
stop(e)
})
}
# Función principal del proceso ETL
<- function() {
etl_process tryCatch({
log_message("INFO", "Inicio del proceso ETL.")
<- extract_data()
data <- transform_data(data)
transformed_data load_data(transformed_data)
log_message("INFO", "Proceso ETL completado con éxito.")
error = function(e) {
}, log_message("CRITICAL", paste("El proceso ETL falló:", e$message))
stop(e)
})
}
# Ejecutar el proceso ETL
if (interactive()) {
etl_process()
}