Skip to content

Instantly share code, notes, and snippets.

@luzfcb
Last active December 18, 2017 21:21
Show Gist options
  • Save luzfcb/34e095e34157a54480205601dffb1d68 to your computer and use it in GitHub Desktop.
Save luzfcb/34e095e34157a54480205601dffb1d68 to your computer and use it in GitHub Desktop.
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)
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