-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathload_infra.py
108 lines (90 loc) · 3.24 KB
/
load_infra.py
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
import multiprocessing as mp
import os
import time
from simpledbf import Dbf5
import math
def obtener_infraestructura(carpeta):
estados = []
for subdir, dirs, files in os.walk(carpeta):
for file in files:
if file.endswith('.DBF'):
archivo = os.path.join(carpeta, file)
estados.append(archivo)
return estados
def procesa_columnas(columna):
if columna.endswith('_'):
return columna[:-1]
else:
return columna
def procesa_totales(diccionario):
for key, value in diccionario.items():
if type(value) == str:
diccionario[key] = int(value)
elif math.isnan(value):
diccionario[key] = None
return diccionario
def cargar_infraestructura(archivo):
start_time = time.time()
import django
django.setup()
from humanitaria.models import Entidad
dbf = Dbf5(archivo, codec='latin-1')
df = dbf.to_dataframe()
df.columns = [procesa_columnas(col) for col in df.columns]
columnas = list(df.columns)[8:-1]
for i, row in df.iterrows():
entidad = Entidad.objects.get(cve_ent=str(row['ENT']))
municipio = entidad.municipio_set.get(cve_mun=str(row['MUN']))
try:
localidad = municipio.localidad_set.get(cve_loc=str(
row['LOC']))
# En aguascalientes no hay ageb 1301 para mun 01 loc 001
try:
ageb = localidad.agebu_set.get(cve_ageb=str(
row['AGEB']))
except:
try:
ageb = municipio.agebr_set.get(cve_ageb=str(
row['AGEB']))
except:
pass
manzana = ageb.manzana_set.filter(cve_mza=str(row['MZA']))
totales_manzana = row[columnas].to_dict()
manzana.update(**procesa_totales(totales_manzana))
except:
pass
final = time.time() - start_time
return archivo, final
def paralelo_carga_infraestructura(carpeta):
start_time = time.time()
print(f"Inicio : {time.ctime()}\n")
n = mp.cpu_count()
print(f"Número de procesadores: {n}\n")
pool = mp.Pool(n)
infraestructura = obtener_infraestructura(carpeta)
results = [pool.apply_async(cargar_infraestructura, args=(i,)) for i in
infraestructura]
pool.close()
for ele in results:
s = ele.get()
print(f'Archivo: {s[0]}\nFinalizado en: {s[1]} segundos\n')
print(f"Final: {time.ctime()}\n")
final = time.time() - start_time
print(f'Procesamiento en paralelo terminado en: {final} segundos')
def secuencial_carga_infraestructura(carpeta):
start_time = time.time()
print(f"Inicio : {time.ctime()}\n")
infraestructura = obtener_infraestructura(carpeta)
results = [cargar_infraestructura(i) for i in infraestructura]
print(f"Final: {time.ctime()}\n")
print(results)
final = time.time() - start_time
print(f'Procesamiento secuencial terminado en: {final} segundos')
def carga_infraestructura(carpeta, paralelo=True):
if paralelo:
paralelo_carga_infraestructura(carpeta)
else:
secuencial_carga_infraestructura(carpeta)
if __name__ == "__main__":
folder = 'data/infraestructura'
carga_infraestructura(folder)