salomonsky commited on
Commit
70c9087
verified
1 Parent(s): 1a9d56b

Update app.py

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