Last active
December 18, 2017 21:21
-
-
Save luzfcb/34e095e34157a54480205601dffb1d68 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import pandas | |
from dateutil import parser | |
from django.conf import settings | |
#from iptu.core.models import Iptu | |
from core.models import Iptu | |
data_file = os.path.join(settings.BASE_DIR, 'iptu', 'core', 'static', 'data', 'IPTU_2017.csv') | |
def gerar_instancia_iptu(pandas_data): | |
for d in pandas_data: | |
parametros = { | |
'num_contrib': d['NUMERO DO CONTRIBUINTE'], | |
'ano_exerc': d['ANO DO EXERCICIO'], | |
'num_nl': d['NUMERO DA NL'], | |
'data_cadastro': d['DATA DO CADASTRAMENTO'], | |
'tipo_contrib_1': d['TIPO DE CONTRIBUINTE 1'], | |
'doc_contrib_1': d['CPF/CNPJ DO CONTRIBUINTE 1'], | |
'nome_contrib_1': d['NOME DO CONTRIBUINTE 1'], | |
'tipo_contrib_2': d['TIPO DE CONTRIBUINTE 2'], | |
'doc_contrib_2': d['CPF/CNPJ DO CONTRIBUINTE 2'], | |
'nome_contrib_2': d['NOME DO CONTRIBUINTE 2'], | |
'num_condominio': d['NUMERO DO CONDOMINIO'], | |
'codlog_imovel': d['CODLOG DO IMOVEL'], | |
'logradouro_imovel': d['NOME DE LOGRADOURO DO IMOVEL'], | |
'num_imovel': d['NUMERO DO IMOVEL'], | |
'complemento_imovel': d['COMPLEMENTO DO IMOVEL'], | |
'bairro_imovel': d['BAIRRO DO IMOVEL'], | |
'ref_imovel': d['REFERENCIA DO IMOVEL'], | |
'cep_imovel': d['CEP DO IMOVEL'], | |
'esq_frente': d['QUANTIDADE DE ESQUINAS/FRENTES'], | |
'fracao_ideal': d['FRACAO IDEAL'], | |
'area_terreno': ['AREA DO TERRENO'], | |
'area_contruida': d['AREA CONSTRUIDA'], | |
'area_ocupada': d['AREA OCUPADA'], | |
'valor_m2_terreno': d['VALOR DO M2 DO TERRENO'], | |
'valor_m2_construido': d['VALOR DO M2 DE CONSTRUCAO'], | |
'ano_construcao': d['ANO DA CONSTRUCAO CORRIGIDO'], | |
'qde_pavimentos': d['QUANTIDADE DE PAVIMENTOS'], | |
'testada_calculo': d['TESTADA PARA CALCULO'], | |
'tipo_uso': d['TIPO DE USO DO IMOVEL'], | |
'tipo_construcao': d['TIPO DE PADRAO DA CONSTRUCAO'], | |
'tipo_terreno': d['TIPO DE TERRENO'], | |
'fator_obsolencia': d['FATOR DE OBSOLESCENCIA'], | |
'ano_inicio_vida_contrib': d['ANO DE INICIO DA VIDA DO CONTRIBUINTE'], | |
'mes_inicio_vida_contrib': d['MES DE INICIO DA VIDA DO CONTRIBUINTE'], | |
'fase_contrib': d['FASE DO CONTRIBUINTE'] | |
} | |
yield Iptu(**parametros) | |
def create_db_iptu(arquivo): | |
chunksize = 10000 | |
data = pandas.read_csv(arquivo, delimiter=';', encoding='iso-8859-1', iterator=True, chunksize=chunksize, | |
decimal=',', converters={'FASE DO CONTRIBUINTE': int, 'DATA DO CADASTRAMENTO': parser.parse}) | |
itens_para_inserir = [] | |
acumulador = 0 | |
count = 0 | |
for instancia_iptu in gerar_instancia_iptu(data): | |
itens_para_inserir.append(instancia_iptu) | |
if count >= chunksize: | |
print("\ntotal acumulado: {}".format(acumulador)) | |
# insere no banco os objetos contidos em fields | |
# de 5000 em 5000 | |
Iptu.objects.bulk_create(itens_para_inserir, batch_size=5000) | |
#print(len(itens_para_inserir)) | |
# deleta fields, ou seja, marca para o interpretador Python | |
# remover os objetos da memoria, qnd eles não forem mais referenciados | |
del itens_para_inserir | |
# cria a lista novamente | |
itens_para_inserir = [] | |
# zero a contador | |
acumulador += count | |
count = 0 | |
count = count + 1 | |
else: | |
Iptu.objects.bulk_create(itens_para_inserir, batch_size=5000) | |
#print(len(itens_para_inserir)) | |
print("\ntotal acumulado: {}".format(acumulador)) | |
def rodar(): | |
create_db_iptu(data_file) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.db import models | |
class Iptu(models.Model): | |
num_contrib = models.CharField('nº contribuinte', max_length=12, unique=True) | |
ano_exerc = models.CharField('ano exercício', max_length=4) | |
num_nl = models.CharField('num. nl', max_length=1) | |
data_cadastro = models.DateField('data cadastramento') | |
tipo_contrib_1 = models.CharField('Tipo contribuinte 1', max_length=22) | |
doc_contrib_1 = models.CharField('CPF/CNPJ contribuinte 1', max_length=14) | |
nome_contrib_1 = models.CharField('nome contribuinte 1', max_length=255) | |
tipo_contrib_2 = models.CharField('Tipo Contribuinte 2', max_length=22, blank=True) | |
doc_contrib_2 = models.CharField('CPF/CNPJ contribuinte 2', max_length=14, blank=True) | |
nome_contrib_2 = models.CharField('nome contribuinte 2', max_length=255, blank=True) | |
num_condominio = models.CharField('nº condomínio', max_length=10) | |
codlog_imovel = models.CharField('CODLOG do imóvel', max_length=10) | |
logradouro_imovel = models.CharField('logradouro imóvel', max_length=255) | |
num_imovel = models.IntegerField('nº do imóvel') | |
complemento_imovel = models.CharField('complemento', max_length=255, blank=True) | |
bairro_imovel = models.CharField('bairro', max_length=255, blank=True) | |
ref_imovel = models.CharField('referência', max_length=255, blank=True) | |
cep_imovel = models.CharField('CEP', max_length=9) | |
esq_frente = models.IntegerField('nº esquina/frente') | |
fracao_ideal = models.FloatField('fração ideal') | |
area_terreno = models.IntegerField('area do terreno') | |
area_contruida = models.IntegerField('area construída') | |
area_ocupada = models.IntegerField('area ocupada') | |
valor_m2_terreno = models.FloatField('valor m2 terreno') | |
valor_m2_construido = models.FloatField('valor m2 construído') | |
ano_construcao = models.CharField('ano construção', max_length=4) | |
qde_pavimentos = models.IntegerField('qde pavimentos') | |
testada_calculo = models.FloatField('testada para cálculo') | |
tipo_uso = models.CharField('tipo uso', max_length=255) | |
tipo_construcao = models.CharField('tipo padrão construção', max_length=255) | |
tipo_terreno = models.CharField('tipo terreno', max_length=255) | |
fator_obsolencia = models.FloatField('fator obsolencia') | |
ano_inicio_vida_contrib = models.CharField('ano início vida contribuinte', max_length=4) | |
mes_inicio_vida_contrib = models.CharField('mês início vida contribuinte', max_length=2) | |
fase_contrib = models.IntegerField('fase contribuinte') | |
class Meta: | |
verbose_name = 'IPTU' | |
verbose_name_plural = 'IPTU' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment