Spaces:
Sleeping
Sleeping
File size: 6,425 Bytes
f6bd0ed 2db5d71 ead5a43 622fa60 f6bd0ed 2db5d71 ead5a43 3fbcb34 6751d01 3fbcb34 6751d01 622fa60 6751d01 b6a3da8 e2fb9d9 b6a3da8 70c9087 b6a3da8 2db5d71 b6a3da8 622fa60 70c9087 e439f47 2db5d71 70c9087 2db5d71 70c9087 2adb419 b200ba7 13848d4 70c9087 2db5d71 622fa60 13848d4 b200ba7 70c9087 b200ba7 2db5d71 70c9087 2db5d71 70c9087 2db5d71 f6bd0ed 2db5d71 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
import streamlit as st
import pandas as pd
import random
import zipfile
from faker import Faker
from unidecode import unidecode
from pathlib import Path
from datetime import datetime
from PyDictionary import PyDictionary
faker = Faker('es_MX')
def generar_rfc(nombre, apellido, anio, mes, dia):
return f"{apellido[:2].upper()}{nombre[:2].upper()}{str(anio)[-2:]}{mes:02}{dia:02}{random.randint(10, 99)}"
def generar_telefono_por_estado(estado):
ladas = {'Ciudad de Mexico': '55', 'Jalisco': '33', 'Nuevo Leon': '81', 'Veracruz': '229', 'Yucatan': '999',
'Puebla': '222', 'Chiapas': '961', 'Tamaulipas': '834', 'Queretaro': '442', 'Coahuila': '871'}
return f"{ladas.get(estado, '55')}{random.randint(1000000, 9999999)}"
def generar_nss():
return f"{random.randint(100, 999)}-{random.randint(10, 99)}-{random.randint(1000, 9999)}"
def limpiar_correo(correo):
return unidecode(correo.replace(" ", "").lower())
def generar_correo_aleatorio():
try:
diccionario = PyDictionary()
palabra = random.choice(list(diccionario.meaning("word").keys()))
except Exception:
palabra = faker.word()
dominio = random.choice(["gmail.com", "hotmail.com"])
return limpiar_correo(f"{palabra}{random.randint(1, 999)}@{dominio}")
def generar_datos(cantidad, columnas, progreso):
try:
estados = ['Ciudad de Mexico', 'Jalisco', 'Nuevo Leon', 'Veracruz', 'Yucatan',
'Puebla', 'Chiapas', 'Tamaulipas', 'Queretaro', 'Coahuila']
bancos, datos = ['BBVA', 'Banorte', 'Santander', 'Citibanamex', 'HSBC',
'AMEX', 'Inbursa', 'Bancoppel'], []
for i in range(cantidad):
estado = random.choice(estados)
nombre, apellido = faker.first_name(), faker.last_name()
dia, mes, anio = faker.date_of_birth().day, faker.date_of_birth().month, faker.date_of_birth().year
fila = {'Nombre': f"{nombre} {apellido}" if 'Nombre' in columnas else None,
'RFC': generar_rfc(nombre, apellido, anio, mes, dia) if 'RFC' in columnas else None,
'Telefono': generar_telefono_por_estado(estado) if 'Telefono' in columnas else None,
'Estado': estado if 'Estado' in columnas else None,
'Direccion': faker.address() if 'Direccion' in columnas else None,
'Correo Electronico': generar_correo_aleatorio() if 'Correo Electronico' in columnas else None,
'Tarjeta': ''.join([str(random.randint(0, 9)) for _ in range(16)]) if 'Tarjeta' in columnas else None,
'Banco': random.choice(bancos) if 'Banco' in columnas else None,
'Score de Credito': random.randint(300, 850) if 'Score de Credito' in columnas else None,
'NSS': generar_nss() if 'NSS' in columnas else None}
datos.append({k: v for k, v in fila.items() if v is not None})
if i % max(1, cantidad // 100) == 0: # Actualiza progreso proporcionalmente
progreso.progress(i / cantidad)
progreso.progress(1.0)
return pd.DataFrame(datos)
except Exception as e:
raise RuntimeError(f"Error al generar datos: {e}")
def guardar_varios_archivos(dfs, formato):
archivos = []
try:
for i, df in enumerate(dfs):
timestamp = datetime.now().strftime("_%H%M%S")
archivo_nombre = f"leads_buro_{i+1}{timestamp}." + ("csv" if formato == "CSV" else "xlsx")
if formato == "CSV":
df.to_csv(archivo_nombre, index=False)
else:
df.to_excel(archivo_nombre, index=False, engine='openpyxl')
archivos.append(archivo_nombre)
return archivos
except Exception as e:
raise RuntimeError(f"Error al guardar archivos: {e}")
def crear_zip(archivos):
try:
zip_nombre = "archivos_generados.zip"
with zipfile.ZipFile(zip_nombre, 'w') as zipf:
for archivo in archivos:
zipf.write(archivo, Path(archivo).name)
for archivo in archivos: # Limpia archivos temporales
Path(archivo).unlink(missing_ok=True)
return zip_nombre
except Exception as e:
raise RuntimeError(f"Error al crear archivo ZIP: {e}")
def main():
st.set_page_config(layout="wide")
st.sidebar.title("Configuraci贸n")
opciones_columnas = ["Nombre", "Telefono", "RFC", "Estado", "Direccion",
"Correo Electronico", "Tarjeta", "Banco", "Score de Credito", "NSS"]
columnas = [col for col in opciones_columnas if st.sidebar.checkbox(col, value=False)]
num_archivos = st.sidebar.slider("N煤mero de archivos (1M registros c/u):", min_value=1, max_value=25, value=1)
formato_descarga = st.sidebar.radio("Selecciona el formato de descarga:", ["CSV", "XLS"])
if st.sidebar.button("Generar Datos"):
try:
if not columnas:
st.error("Debe seleccionar al menos una columna.")
return
progreso = st.progress(0)
st.write(f"Generando {num_archivos} archivo(s) de 1 mill贸n de registros...")
dfs = [generar_datos(1_000_000, columnas, progreso) for _ in range(num_archivos)]
st.subheader("Previsualizaci贸n de datos (primeros 100 registros del primer archivo):")
st.dataframe(dfs[0].head(100))
archivos_generados = guardar_varios_archivos(dfs, formato_descarga)
if len(archivos_generados) > 1:
zip_nombre = crear_zip(archivos_generados)
with open(zip_nombre, "rb") as file:
st.download_button("Descargar todos en ZIP", data=file, file_name=zip_nombre, mime="application/zip")
else:
with open(archivos_generados[0], "rb") as file:
st.download_button(f"Descargar {formato_descarga}", data=file,
file_name=archivos_generados[0],
mime="text/csv" if formato_descarga == "CSV" else
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
st.success("Archivos generados y listos para descargar.")
except Exception as e:
st.error(f"Error durante la generaci贸n: {e}")
if __name__ == "__main__":
main() |