Subida de archivos de extracción de datos inicial
Se han subido los archivos necesarios con los que se procesan las columnas de los datasets extraídos para llevar a cabo visualización y procesamiento.
This commit is contained in:
parent
622b46ec49
commit
664392516c
44
Obtener-Datos-1/columnas_info.json
Normal file
44
Obtener-Datos-1/columnas_info.json
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"estadisticas_establecimientos_juego": [
|
||||||
|
"a_o",
|
||||||
|
"provincia",
|
||||||
|
"almac_n_fiscal_no_existe_desde_el_a_o_2021_",
|
||||||
|
"almac_n_m_quinas",
|
||||||
|
"bingo",
|
||||||
|
"bar_esp_",
|
||||||
|
"bolera",
|
||||||
|
"casinos",
|
||||||
|
"camping",
|
||||||
|
"centro_de_ocio",
|
||||||
|
"caf_teatro",
|
||||||
|
"discoteca",
|
||||||
|
"bares",
|
||||||
|
"cafeter_as",
|
||||||
|
"pub",
|
||||||
|
"centro_recreativo_familiar",
|
||||||
|
"restaurante",
|
||||||
|
"sal_n_de_juego",
|
||||||
|
"casas_de_apuestas",
|
||||||
|
"c_rner_ap_",
|
||||||
|
"zona_ap_",
|
||||||
|
"almac_n_apuestas",
|
||||||
|
"total_a_31_12_",
|
||||||
|
"prov"
|
||||||
|
],
|
||||||
|
"condenas_sexo_localidad": [
|
||||||
|
"lugar_de_nacimiento_sexo_comunidades_y_ciudades_au"
|
||||||
|
],
|
||||||
|
"registro_prohibidos_juego": [
|
||||||
|
"a_o",
|
||||||
|
"altas_otras_causas",
|
||||||
|
"altas_petici_n_propia",
|
||||||
|
"bajas_otras_causas",
|
||||||
|
"bajas_petici_n_propia",
|
||||||
|
"total_en_activo_a_31_12"
|
||||||
|
],
|
||||||
|
"consumo_drogas_alcohol_esp": [
|
||||||
|
"consumo_de_alcohol",
|
||||||
|
"consumo_de_drogas_y_tipo_de_drogas",
|
||||||
|
"total"
|
||||||
|
]
|
||||||
|
}
|
||||||
19
Obtener-Datos-1/compose.yaml
Normal file
19
Obtener-Datos-1/compose.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
services:
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0
|
||||||
|
container_name: adicciones_db
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
MYSQL_DATABASE: adicciones
|
||||||
|
MYSQL_USER: user
|
||||||
|
MYSQL_PASSWORD: pass
|
||||||
|
ports:
|
||||||
|
- "3307:3306"
|
||||||
|
volumes:
|
||||||
|
- ./mysql_data:/var/lib/mysql
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
137
Obtener-Datos-1/main.py
Normal file
137
Obtener-Datos-1/main.py
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
import os
|
||||||
|
import pandas as pd
|
||||||
|
import mysql.connector
|
||||||
|
import json
|
||||||
|
import csv
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# CONFIGURACIÓN DE LA BASE DE DATOS
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
DB_CONFIG = {
|
||||||
|
"host": "localhost",
|
||||||
|
"port": 3307, # Puerto diferente al 3306 para evitar conflictos
|
||||||
|
"user": "user", # Usuario definido en docker-compose
|
||||||
|
"password": "pass", # Contraseña definida en docker-compose
|
||||||
|
"database": "adicciones"
|
||||||
|
}
|
||||||
|
|
||||||
|
DATASETS_DIR = "datasets" # Carpeta donde están los CSV
|
||||||
|
OUTPUT_FILE = "columnas_info.json" # Archivo de salida con las columnas detectadas
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# FUNCIONES AUXILIARES
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
|
def get_connection():
|
||||||
|
# Establece conexión con la base de datos MySQL
|
||||||
|
return mysql.connector.connect(**DB_CONFIG)
|
||||||
|
|
||||||
|
|
||||||
|
def sanitize_name(name: str) -> str:
|
||||||
|
# Limpia los nombres de columnas y tablas para que sean válidos en SQL
|
||||||
|
name = name.strip().lower()
|
||||||
|
name = re.sub(r"[^a-z0-9_]+", "_", name) # Solo permite letras, números y guiones bajos
|
||||||
|
return name[:50] # Limita a 50 caracteres para cumplir con el límite de MySQL
|
||||||
|
|
||||||
|
|
||||||
|
def detect_delimiter(file_path):
|
||||||
|
# Detecta automáticamente el delimitador más probable del CSV
|
||||||
|
with open(file_path, 'r', encoding='latin-1', errors='ignore') as f:
|
||||||
|
sample = f.read(2048)
|
||||||
|
try:
|
||||||
|
dialect = csv.Sniffer().sniff(sample, delimiters=";,|\t")
|
||||||
|
delim = dialect.delimiter
|
||||||
|
|
||||||
|
# Si detecta algo raro (espacios, strings largos, etc.), usamos ';' por defecto
|
||||||
|
if delim.strip() == "" or len(delim) > 1:
|
||||||
|
return ";"
|
||||||
|
return delim
|
||||||
|
|
||||||
|
except csv.Error:
|
||||||
|
return ";"
|
||||||
|
|
||||||
|
|
||||||
|
def load_csv(path, delimiter):
|
||||||
|
# Intenta leer el CSV usando varias codificaciones comunes en archivos en español
|
||||||
|
encodings = ["utf-8", "latin-1", "cp1252"]
|
||||||
|
last_error = None
|
||||||
|
|
||||||
|
for enc in encodings:
|
||||||
|
try:
|
||||||
|
return pd.read_csv(path, delimiter=delimiter, encoding=enc)
|
||||||
|
except Exception as e:
|
||||||
|
last_error = e
|
||||||
|
|
||||||
|
# Si todas las lecturas fallan, lanza el último error
|
||||||
|
raise last_error
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# PROCESO PRINCIPAL
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
|
def main():
|
||||||
|
conn = get_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
columnas_info = {}
|
||||||
|
|
||||||
|
# Recorre todos los archivos CSV en la carpeta datasets/
|
||||||
|
for filename in os.listdir(DATASETS_DIR):
|
||||||
|
if not filename.endswith(".csv"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
path = os.path.join(DATASETS_DIR, filename)
|
||||||
|
table_name = sanitize_name(os.path.splitext(filename)[0])
|
||||||
|
|
||||||
|
print(f"\n📊 Procesando: {filename} → tabla '{table_name}'")
|
||||||
|
|
||||||
|
# Detecta el delimitador del archivo
|
||||||
|
delimiter = detect_delimiter(path)
|
||||||
|
print(f" → delimitador detectado: '{delimiter}'")
|
||||||
|
|
||||||
|
# Carga el CSV probando codificaciones (UTF-8, Latin-1, CP1252)
|
||||||
|
try:
|
||||||
|
df = load_csv(path, delimiter)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Error leyendo {filename}: {e}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Limpia y normaliza los nombres de columnas
|
||||||
|
df.columns = [sanitize_name(c) for c in df.columns]
|
||||||
|
columnas_info[table_name] = list(df.columns)
|
||||||
|
|
||||||
|
# Crea la tabla en MySQL si no existe
|
||||||
|
columns_sql = ", ".join([f"`{c}` TEXT" for c in df.columns])
|
||||||
|
create_sql = f"CREATE TABLE IF NOT EXISTS `{table_name}` ({columns_sql});"
|
||||||
|
cursor.execute(create_sql)
|
||||||
|
|
||||||
|
# Inserta cada fila en la tabla
|
||||||
|
for _, row in df.iterrows():
|
||||||
|
placeholders = ", ".join(["%s"] * len(df.columns))
|
||||||
|
insert_sql = f"INSERT INTO `{table_name}` VALUES ({placeholders});"
|
||||||
|
try:
|
||||||
|
cursor.execute(insert_sql, tuple(row.astype(str).fillna("").values))
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ Error insertando fila en {table_name}: {e}")
|
||||||
|
|
||||||
|
# Confirma los cambios en la base de datos
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
# Cierra la conexión y guarda la información de columnas
|
||||||
|
cursor.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(columnas_info, f, indent=4, ensure_ascii=False)
|
||||||
|
|
||||||
|
print(f"\n✅ Proceso completado. Columnas guardadas en '{OUTPUT_FILE}'")
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# EJECUCIÓN
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
2
Obtener-Datos-1/requirements.txt
Normal file
2
Obtener-Datos-1/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pandas
|
||||||
|
mysql-connector-python
|
||||||
Loading…
Reference in New Issue
Block a user