salomonsky commited on
Commit
2db5d71
1 Parent(s): b6a3da8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -22
app.py CHANGED
@@ -1,9 +1,12 @@
1
  import streamlit as st
2
  import pandas as pd
3
  import random
 
4
  from faker import Faker
5
  from unidecode import unidecode
6
  from pathlib import Path
 
 
7
 
8
  faker = Faker('es_MX')
9
 
@@ -19,16 +22,17 @@ def generar_nss():
19
  return f"{random.randint(100, 999)}-{random.randint(10, 99)}-{random.randint(1000, 9999)}"
20
 
21
  def generar_correo_aleatorio():
22
- palabras_aleatorias = ["alpha", "beta", "gamma", "delta", "omega", "neutron", "photon", "comet", "nova", "quasar"]
 
23
  dominio = random.choice(["gmail.com", "hotmail.com"])
24
- return limpiar_correo(f"{random.choice(palabras_aleatorias)}{random.randint(1, 999)}@{dominio}")
25
 
26
  def limpiar_correo(correo):
27
- return unidecode(correo.replace(" ", ""))
28
 
29
  def generar_datos(cantidad, columnas, progreso):
30
  estados = ['Ciudad de Mexico', 'Jalisco', 'Nuevo Leon', 'Veracruz', 'Yucatan', 'Puebla', 'Chiapas', 'Tamaulipas', 'Queretaro', 'Coahuila']
31
- bancos, datos = ['BBVA', 'Banorte', 'Santander', 'Citibanamex', 'HSBC'], []
32
  for i in range(cantidad):
33
  estado = random.choice(estados)
34
  nombre, apellido = faker.first_name(), faker.last_name()
@@ -44,33 +48,60 @@ def generar_datos(cantidad, columnas, progreso):
44
  'Score de Credito': random.randint(300, 850) if 'Score de Credito' in columnas else None,
45
  'NSS': generar_nss() if 'NSS' in columnas else None}
46
  datos.append({k: v for k, v in fila.items() if v is not None})
47
- if i % 10000 == 0: progreso.progress(i / cantidad)
 
48
  progreso.progress(1.0)
49
  return pd.DataFrame(datos)
50
 
51
- def guardar_en_archivo(df, formato):
52
- archivo_nombre = "leads_buro." + ("csv" if formato == "CSV" else "xlsx")
53
- (df.to_csv(archivo_nombre, index=False) if formato == "CSV" else df.to_excel(archivo_nombre, index=False, engine='openpyxl'))
54
- return archivo_nombre
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
  def main():
57
  st.set_page_config(layout="wide")
58
  st.sidebar.title("Configuración")
59
- columnas = [col for col, chk in zip(["Nombre", "Telefono", "RFC", "Estado", "Direccion", "Correo Electronico", "Tarjeta", "Banco", "Score de Credito", "NSS"],
60
- [st.sidebar.checkbox(c, value=c in ["Nombre", "Telefono", "RFC", "Estado", "Score de Credito", "NSS"]) for c in ["Nombre", "Telefono", "RFC", "Estado", "Direccion", "Correo Electronico", "Tarjeta", "Banco", "Score de Credito", "NSS"]]) if chk]
61
- cantidad_registros = st.sidebar.number_input("Cantidad de registros a generar:", min_value=1, max_value=1_000_000, value=500_000)
62
  formato_descarga = st.sidebar.radio("Selecciona el formato de descarga:", ["CSV", "XLS"])
63
  if st.sidebar.button("Generar Datos"):
64
  try:
65
  progreso = st.progress(0)
66
- st.write(f"Generando {cantidad_registros} registros...")
67
- df = generar_datos(cantidad_registros, columnas, progreso)
68
- st.subheader("Previsualización de datos (primeros 100 registros):")
69
- st.dataframe(df.head(100))
70
- archivo_generado = guardar_en_archivo(df, formato_descarga)
71
- with open(archivo_generado, "rb") as file:
72
- st.download_button(f"Descargar {formato_descarga}", data=file, file_name=archivo_generado, mime="text/csv" if formato_descarga == "CSV" else "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
73
- st.success(f"Archivo {formato_descarga} generado y listo para descargar.")
74
- except Exception as e: st.error(f"Error durante la generación: {e}")
 
 
 
 
 
 
 
 
 
 
 
75
 
76
- if __name__ == "__main__": main()
 
 
1
  import streamlit as st
2
  import pandas as pd
3
  import random
4
+ import zipfile
5
  from faker import Faker
6
  from unidecode import unidecode
7
  from pathlib import Path
8
+ from datetime import datetime
9
+ from PyDictionary import PyDictionary
10
 
11
  faker = Faker('es_MX')
12
 
 
22
  return f"{random.randint(100, 999)}-{random.randint(10, 99)}-{random.randint(1000, 9999)}"
23
 
24
  def generar_correo_aleatorio():
25
+ diccionario = PyDictionary()
26
+ palabra = random.choice(list(diccionario.meaning("word").keys()))
27
  dominio = random.choice(["gmail.com", "hotmail.com"])
28
+ return limpiar_correo(f"{palabra}{random.randint(1, 999)}@{dominio}")
29
 
30
  def limpiar_correo(correo):
31
+ return unidecode(correo.replace(" ", "").lower())
32
 
33
  def generar_datos(cantidad, columnas, progreso):
34
  estados = ['Ciudad de Mexico', 'Jalisco', 'Nuevo Leon', 'Veracruz', 'Yucatan', 'Puebla', 'Chiapas', 'Tamaulipas', 'Queretaro', 'Coahuila']
35
+ bancos, datos = ['BBVA', 'Banorte', 'Santander', 'Citibanamex', 'HSBC', 'AMEX', 'Inbursa', 'Bancoppel'], []
36
  for i in range(cantidad):
37
  estado = random.choice(estados)
38
  nombre, apellido = faker.first_name(), faker.last_name()
 
48
  'Score de Credito': random.randint(300, 850) if 'Score de Credito' in columnas else None,
49
  'NSS': generar_nss() if 'NSS' in columnas else None}
50
  datos.append({k: v for k, v in fila.items() if v is not None})
51
+ if i % 10000 == 0:
52
+ progreso.progress(i / cantidad)
53
  progreso.progress(1.0)
54
  return pd.DataFrame(datos)
55
 
56
+ def guardar_varios_archivos(dfs, formato):
57
+ archivos = []
58
+ for i, df in enumerate(dfs):
59
+ timestamp = datetime.now().strftime("_%H%M%S")
60
+ archivo_nombre = f"leads_buro_{i+1}{timestamp}." + ("csv" if formato == "CSV" else "xlsx")
61
+ if formato == "CSV":
62
+ df.to_csv(archivo_nombre, index=False)
63
+ else:
64
+ df.to_excel(archivo_nombre, index=False, engine='openpyxl')
65
+ archivos.append(archivo_nombre)
66
+ return archivos
67
+
68
+ def crear_zip(archivos):
69
+ zip_nombre = "archivos_generados.zip"
70
+ with zipfile.ZipFile(zip_nombre, 'w') as zipf:
71
+ for archivo in archivos:
72
+ zipf.write(archivo, Path(archivo).name)
73
+ return zip_nombre
74
 
75
  def main():
76
  st.set_page_config(layout="wide")
77
  st.sidebar.title("Configuración")
78
+ opciones_columnas = ["Nombre", "Telefono", "RFC", "Estado", "Direccion", "Correo Electronico", "Tarjeta", "Banco", "Score de Credito", "NSS"]
79
+ columnas = [col for col in opciones_columnas if st.sidebar.checkbox(col, value=False)]
80
+ num_archivos = st.sidebar.slider("Número de archivos (1M registros c/u):", min_value=1, max_value=25, value=1)
81
  formato_descarga = st.sidebar.radio("Selecciona el formato de descarga:", ["CSV", "XLS"])
82
  if st.sidebar.button("Generar Datos"):
83
  try:
84
  progreso = st.progress(0)
85
+ st.write(f"Generando {num_archivos} archivo(s) de 1 millón de registros...")
86
+ dfs = []
87
+ for i in range(num_archivos):
88
+ st.write(f"Generando archivo {i+1} de {num_archivos}...")
89
+ df = generar_datos(1_000_000, columnas, progreso)
90
+ dfs.append(df)
91
+ st.subheader("Previsualización de datos (primeros 100 registros del primer archivo):")
92
+ st.dataframe(dfs[0].head(100))
93
+ archivos_generados = guardar_varios_archivos(dfs, formato_descarga)
94
+
95
+ if len(archivos_generados) > 1:
96
+ zip_nombre = crear_zip(archivos_generados)
97
+ with open(zip_nombre, "rb") as file:
98
+ st.download_button("Descargar todos en ZIP", data=file, file_name=zip_nombre, mime="application/zip")
99
+ else:
100
+ with open(archivos_generados[0], "rb") as file:
101
+ 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")
102
+ st.success("Archivos generados y listos para descargar.")
103
+ except Exception as e:
104
+ st.error(f"Error durante la generación: {e}")
105
 
106
+ if __name__ == "__main__":
107
+ main()