def relatorio_risco_mercado():

    import pandas as pd
    import pymysql as db
    import logging
    import datetime

    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from var.scripts.relatorio_encadeado.relatorio_risco_mercado.relatorio import relatorio

    #Define Variáveis iniciais
    dt_base = get_data_ultimo_dia_util_mes_anterior()
    dt_base = dt_base[0] + '-' + dt_base[1] + '-' + dt_base[2]
    dt_base = '2016-11-30'
    logger = logging.getLogger(__name__)

    cnpj_hdi = get_global_var("cnpj_hdi")

    #Conecta DB
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    #Busca lista dos fundos de primeiro nivel na carteira da HDI
    query = 'select * from projeto_inv.xml_header where cnpjcpf="' + cnpj_hdi + '" and dtposicao=' + '"' + dt_base + '";'
    df = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    if len(df) == 0:
        query = 'select * from projeto_inv.xml_header where cnpj="' + cnpj_hdi + '" and dtposicao=' + '"' + dt_base + '";'
        df = pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")

    df = df.sort(['cnpj', 'cnpjcpf', 'data_bd'], ascending=[True, True, False])
    df = df.drop_duplicates(subset=['cnpj', 'cnpjcpf'], take_last=False)
    df = df.reset_index(level=None,
                        drop=False,
                        inplace=False,
                        col_level=0,
                        col_fill='')
    del df['index']

    #Utiliza o header da carteira da HDI como chave para a query da lista
    header_id_carteira_fundos = df.get_value(0, 'header_id').astype(str)
    lista_query = 'SELECT cnpj from projeto_inv.lista_fundos where data_bd=(select max(data_bd) from projeto_inv.lista_fundos where header_id="' + header_id_carteira_fundos + '");'
    lista_cnpj = pd.read_sql(lista_query, con=connection)
    lista = lista_cnpj['cnpj'].tolist()
    horario_bd = datetime.datetime.today()

    for cnpj in lista:
        relatorio(dt_base, cnpj, horario_bd)
示例#2
0
def tabelas_xml_final():

    import pandas as pd
    import pymysql as db
    import numpy as np
    import datetime
    import logging
    from pandas import ExcelWriter
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dt_base = datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2]))

    # Diretório de save de planilhas
    save_path_verificacao_xmls = full_path_from_database(
        'get_output_quadro419') + 'verificacao_xmls.xlsx'

    # Diretório de dependencias
    depend_path_caracteristica_contratos = full_path_from_database(
        'excels') + 'caracteristica_contratos.xlsx'

    # ----Leitura do HEADER para pegar a data de referencia do relatório
    # Informações XML
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT * FROM projeto_inv.xml_header_org'
    xml_header = pd.read_sql(query, con=connection)
    logger.info("Salvando base de dados")

    # Seleção última carga com a data da posicao
    xml_header = xml_header[xml_header.dtposicao == dt_base]
    xml_header = xml_header[xml_header.data_bd == max(xml_header.data_bd)]

    horario_bd = datetime.datetime.today()

    xml_header = xml_header[['header_id']].copy()
    xml_header['marker'] = 1

    # ----Preenchimento RENDA VARIÁVEL
    # Informações XML
    query = 'SELECT * FROM projeto_inv.xml_acoes_org'
    xml_acoes = pd.read_sql(query, con=connection)
    logger.info("Salvando base de dados")

    # Seleção última carga
    xml_acoes = xml_acoes.merge(xml_header, on=['header_id'])
    xml_acoes = xml_acoes[xml_acoes.marker == 1].copy()
    xml_acoes = xml_acoes[xml_acoes.data_bd == max(xml_acoes.data_bd)]

    del xml_acoes['id_xml_acoes']
    del xml_acoes['data_bd']
    del xml_acoes['pu_regra_xml']
    del xml_acoes['mtm_regra_xml']
    del xml_acoes['data_referencia']
    del xml_acoes['marker']

    # --MTM Mercado
    query = 'SELECT * FROM projeto_inv.bovespa_cotahist'
    base_bovespa_virgem = pd.read_sql(query, con=connection)
    logger.info("Salvando base de dados")

    base_bovespa = base_bovespa_virgem[
        base_bovespa_virgem.data_pregao <= dt_base]
    base_bovespa = base_bovespa.sort(['codigo_isin', 'data_pregao', 'data_bd'],
                                     ascending=[True, False, False])
    base_bovespa = base_bovespa.drop_duplicates(subset=['codigo_isin'],
                                                take_last=False)
    base_bovespa = base_bovespa[['codigo_isin', 'preco_medio', 'data_pregao']]
    base_bovespa = base_bovespa.rename(
        columns={
            'codigo_isin': 'isin',
            'preco_medio': 'pu_regra_xml',
            'data_pregao': 'data_referencia'
        })

    xml_acoes = xml_acoes.merge(base_bovespa, on=['isin'], how='left')
    xml_acoes['mtm_regra_xml'] = xml_acoes['pu_regra_xml'] * (
        xml_acoes['qtdisponivel'] + xml_acoes['qtgarantia'])
    xml_acoes['data_bd'] = horario_bd

    # Carrega na base
    logger.info("Salvando base de dados - xml_acoes")
    pd.io.sql.to_sql(xml_acoes,
                     name='xml_acoes',
                     con=connection,
                     if_exists="append",
                     flavor='mysql',
                     index=0)

    # ----Preenchimento Futuros
    # ----TABELA XML
    query = 'select * from projeto_inv.xml_futuros_org'
    xml_futuros = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    xml_futuros = xml_futuros.merge(xml_header, on=['header_id'])
    xml_futuros = xml_futuros[xml_futuros.marker == 1].copy()
    xml_futuros = xml_futuros[xml_futuros.data_bd == max(xml_futuros.data_bd)]

    del xml_futuros['id_xml_futuros']
    del xml_futuros['pu_regra_xml']
    del xml_futuros['mtm_regra_xml']
    del xml_futuros['data_referencia']
    del xml_futuros['marker']

    # Criação da coluna ref
    xml_futuros['ref'] = xml_futuros['ativo'] + xml_futuros['serie']

    # Retira coluna de data da carga
    del xml_futuros['data_bd']

    # -----\TABELA BMF
    query = 'SELECT * FROM projeto_inv.bmf_ajustes_pregao'
    bmf_ajustes_pregao = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    bmf_ajustes_pregao = bmf_ajustes_pregao.sort(
        ['mercadoria', 'data_referencia', 'data_bd'],
        ascending=[True, True, True])

    # Seleciona data de referência igual ou menor à do relatório
    bmf_ajustes_pregao = bmf_ajustes_pregao[
        bmf_ajustes_pregao.data_referencia <= dt_base]

    # Seleciona a última data para cada contrato
    bmf_ajustes_pregao = bmf_ajustes_pregao.drop_duplicates(
        subset=['mercadoria', 'vencimento'], take_last=True)

    # Seleciona a coluna ref - XXX referencia à mercadoria
    bmf_ajustes_pregao['ref'] = bmf_ajustes_pregao['mercadoria'].str[0:3]

    # Retira coluna de data da carga
    del bmf_ajustes_pregao['data_bd']

    # ----TABELA TAMANHO DO CONTRATO
    tamanho_contrato = pd.read_excel(depend_path_caracteristica_contratos,
                                     header=0,
                                     skiprows=1)
    logger.info("Arquivos lidos com sucesso")

    tamanho_contrato.columns = ['ref', 'moeda', 'tamanho']

    tamanho_contrato['ref'] = tamanho_contrato['ref'].str.replace(' ', '')

    base_input = bmf_ajustes_pregao.merge(tamanho_contrato,
                                          on=['ref'],
                                          how='left')
    base_input = base_input.where(base_input.notnull(), None)

    base_input['ref'] = base_input['ref'] + base_input['vencimento']

    # ----UNIÃO DAS TABELAS
    xml_futuros = xml_futuros.merge(base_input, on=['ref'], how='left')
    xml_futuros = xml_futuros.sort(['ref'])

    # Criação da coluna pu_mercado - NÃO CONSIDERA O TAMANHO DO CONTRATO
    xml_futuros = xml_futuros.rename(
        columns={'preco_ajuste_atual': 'pu_regra_xml'})

    # Criação da coluna mtm_mercado
    xml_futuros['mtm_regra_xml'] = xml_futuros['pu_regra_xml'] * xml_futuros[
        'quantidade'] * xml_futuros['tamanho']

    # Retira colunas não necessárias
    del xml_futuros['ref']
    del xml_futuros['id_bmf_ajustes_pregao']
    del xml_futuros['mercadoria']
    del xml_futuros['vencimento']
    del xml_futuros['preco_ajuste_anterior']
    del xml_futuros['variacao']
    del xml_futuros['valor_ajuste_por_contrato']
    del xml_futuros['moeda']
    del xml_futuros['tamanho']

    # Cria coluna com a data da carga
    xml_futuros['data_bd'] = datetime.datetime.today()

    # Carrega na base
    logger.info("Salvando base de dados - xml_futuros")
    pd.io.sql.to_sql(xml_futuros,
                     name='xml_futuros',
                     con=connection,
                     if_exists="append",
                     flavor='mysql',
                     index=0)

    # ----Preenchimento Cotas
    # ----TABELA XML
    query = 'SELECT * FROM projeto_inv.xml_cotas_org'
    xml_cotas = pd.read_sql(query, con=connection)
    logger.info("Salvando base de dados")

    xml_cotas = xml_cotas.merge(xml_header, on=['header_id'])
    xml_cotas = xml_cotas[xml_cotas.marker == 1].copy()
    xml_cotas = xml_cotas[xml_cotas.data_bd == max(xml_cotas.data_bd)]
    xml_cotas['data_referencia'] = dt_base
    del xml_cotas['id_xml_cotas']
    del xml_cotas['pu_regra_xml']
    del xml_cotas['data_bd']

    # ----TABELA CVM_COTAS
    query = 'SELECT * FROM projeto_inv.cvm_cotas'
    cvm_cotas = pd.read_sql(query, con=connection)
    logger.info("Salvando base de dados")

    cvm_cotas = cvm_cotas.sort(['cnpj_fundo', 'dt_ref', 'data_bd'],
                               ascending=[True, True, False])
    cvm_cotas = cvm_cotas.drop_duplicates(['cnpj_fundo', 'dt_ref'],
                                          take_last=False)

    # ----TABELA FIDCs
    query = 'SELECT * FROM projeto_inv.fidc_cotas'
    fidc_cotas = pd.read_sql(query, con=connection)
    logger.info("Salvando base de dados")

    fidc_cotas = fidc_cotas.sort(['codigo_isin', 'dt_ref', 'data_bd'],
                                 ascending=[True, True, False])
    fidc_cotas = fidc_cotas.drop_duplicates(['codigo_isin', 'dt_ref'],
                                            take_last=False)

    # ----Preenchimento com as informações - CVM_COTAS
    # Seleção das colunas necessárias
    cvm_cotas = cvm_cotas[['cnpj_fundo', 'dt_ref', 'quota']].copy()

    # Renomeação da chave cnpj_fundos
    cvm_cotas = cvm_cotas.rename(columns={
        'cnpj_fundo': 'cnpjfundo',
        'dt_ref': 'data_referencia'
    })

    # União
    xml_cotas = xml_cotas.merge(cvm_cotas,
                                on=['cnpjfundo', 'data_referencia'],
                                how='left')

    # ----Preenchimento com as informações - CVM_FIDC
    # Seleção das colunas necessárias
    fidc_cotas = fidc_cotas[['codigo_isin', 'dt_ref', 'cota']].copy()

    # Renomeação da chave cnpj_fundos
    fidc_cotas = fidc_cotas.rename(columns={
        'codigo_isin': 'isin',
        'dt_ref': 'data_referencia'
    })

    # União
    xml_cotas = xml_cotas.merge(fidc_cotas,
                                on=['isin', 'data_referencia'],
                                how='left')

    # ----PREENCHIMENTO XML
    # Preenchimento do PU
    xml_cotas['pu_regra_xml'] = np.where(xml_cotas['quota'].notnull(),
                                         xml_cotas['quota'], xml_cotas['cota'])
    xml_cotas['pu_regra_xml'] = np.where(xml_cotas['pu_regra_xml'].isnull(),
                                         xml_cotas['puposicao'],
                                         xml_cotas['pu_regra_xml'])

    # Cálculo do MTM
    xml_cotas['mtm_regra_xml'] = xml_cotas['pu_regra_xml'] * (
        xml_cotas['qtdisponivel'] + xml_cotas['qtgarantia'])

    # ----Carregamento na base
    xml_cotas['data_bd'] = horario_bd

    del xml_cotas['marker']
    del xml_cotas['cota']
    del xml_cotas['quota']

    logger.info("Salvando base de dados - xml_cotas")
    pd.io.sql.to_sql(xml_cotas,
                     name='xml_cotas',
                     con=connection,
                     if_exists="append",
                     flavor='mysql',
                     index=0)

    # ----Outras tabelas
    lista = [
        'outrasdespesas', 'caixa', 'corretagem', 'despesas', 'partplanprev',
        'provisao', 'ima_geral', 'ima_imab', 'ima_imac', 'ima_imas',
        'ima_irfm', 'opcoesacoes', 'opcoesderiv', 'opcoesflx', 'swap',
        'termorv', 'termorf', 'header'
    ]

    horario_bd = datetime.datetime.today()
    for i in range(len(lista)):
        query = 'select * from projeto_inv.xml_' + lista[i] + '_org'
        tabela = pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")

        if (len(tabela) != 0):
            print('xml_' + lista[i])
            tabela = tabela.merge(xml_header, on=['header_id'])
            tabela = tabela[tabela.marker == 1].copy()
            if 'pu_regra_xml' in tabela.columns:
                tabela['pu_regra_xml'] = tabela['puposicao']
            if 'mtm_regra_xml' in tabela.columns:
                tabela['mtm_regra_xml'] = tabela['puposicao']
            if 'mtm_ativo_regra_xml' in tabela.columns:
                tabela['mtm_ativo_regra_xml'] = tabela['vlmercadoativo']
            if 'mtm_passivo_regra_xml' in tabela.columns:
                tabela['mtm_passivo_regra_xml'] = tabela['vlmercadopassivo']
            if ('data_referencia' in tabela.columns) & (len(tabela) != 0):
                tabela['data_referencia'] = dt_base
            tabela['data_bd'] = horario_bd
            id_xml = 'id_xml_' + lista[i]
            if id_xml in tabela.columns:
                del tabela[id_xml]
                del tabela['marker']

            logger.info("Salvando base de dados")
            pd.io.sql.to_sql(tabela,
                             name='xml_' + lista[i],
                             con=connection,
                             if_exists="append",
                             flavor='mysql',
                             index=0)

    writer = ExcelWriter(save_path_verificacao_xmls)

    lista = [
        'outrasdespesas', 'caixa', 'corretagem', 'despesas', 'partplanprev',
        'provisao', 'ima_geral', 'ima_imab', 'ima_imac', 'ima_imas',
        'ima_irfm', 'opcoesacoes', 'opcoesderiv', 'opcoesflx', 'swap',
        'termorv', 'termorf', 'header', 'debenture', 'titpublico',
        'titprivado', 'acoes', 'cotas', 'futuros'
    ]

    for i in range(len(lista)):
        query = 'select * from projeto_inv.xml_' + lista[i]
        tabela = pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")

        if len(tabela) != 0:
            tabela = tabela[tabela.data_bd == max(tabela.data_bd)].copy()
        tabela.to_excel(writer, lista[i])

    writer.save()
    logger.info("Arquivos salvos com sucesso")

    #Fecha conexão
    connection.close()
示例#3
0
def resumo_var():

    import pandas as pd
    import pymysql as db
    import openpyxl
    import logging

    from openpyxl.styles import Font, Color, Border, Side, PatternFill, Alignment
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior

    global header_id_carteira
    global header_id_carteira_fundos
    global header_nome
    global cnpj_fundo
    global id_relatorio_qo

    logger = logging.getLogger(__name__)
    end = full_path_from_database("get_output_var")+'Relatorios/'
    cnpj_hdi=get_global_var("cnpj_hdi")
    dt_base = get_data_ultimo_dia_util_mes_anterior()
    dt_base = dt_base[0]+'-'+dt_base[1]+'-'+dt_base[2]
    #dt_base = '2016-11-30'

    logger.info("Conectando no Banco de dados")
    connection=db.connect('localhost',user='******',passwd='root', db='projeto_inv', use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    tabela_resumo_var = pd.DataFrame(columns=['cnpj','nome','pl','var_normal','var_estressado','perc_var_norm','perc_var_stress'])
    tabela_resumo_credito = pd.DataFrame(columns=['cnpj','nome','pl','pl_cred','perc_esp','rtg_medio'])

    #Gera lista dos CNPJs na carteira HDI
    #Busca lista dos fundos de primeiro nivel na carteira da HDI

    query='select * from projeto_inv.xml_header where cnpjcpf="' + cnpj_hdi +'" and dtposicao='+'"'+dt_base+'";'
    df=pd.read_sql(query, con=connection)

    if len(df)==0:
        query='select * from projeto_inv.xml_header where cnpj="' + cnpj_hdi +'" and dtposicao='+'"'+dt_base+'";'
        df = pd.read_sql(query, con=connection)

    df=df.sort(['cnpj', 'cnpjcpf','data_bd'], ascending=[True, True, False])
    df=df.drop_duplicates(subset=['cnpj', 'cnpjcpf'], take_last=False)
    df=df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
    del df['index']

    header_id_carteira_fundos=df.get_value(0,'header_id').astype(str) #Utiliza o header da carteira da HDI como chave para a query da lista


    lista_query='SELECT cnpj from projeto_inv.lista_fundos where data_bd=(select max(data_bd) from projeto_inv.lista_fundos where header_id="'+header_id_carteira_fundos+'");'
    lista_cnpj=pd.read_sql(lista_query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    lista=lista_cnpj['cnpj'].tolist()
    lista_query_fidc='SELECT * from projeto_inv.lista_fidc where data_bd=(select max(data_bd) from projeto_inv.lista_fidc where header_id="'+header_id_carteira_fundos+'");'
    lista_fidc=pd.read_sql(lista_query_fidc, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    lista_fidc=lista_fidc['cnpj'].tolist()

    for cnpj in lista:

        #Busca do id_relatorio_quaid419
        query='select * from projeto_inv.xml_header where cnpjcpf="' + cnpj +'" and dtposicao='+'"'+dt_base+'";'
        df=pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")
        if len(df) == 0:
            query = 'select * from projeto_inv.xml_header where cnpj="' + cnpj +'" and dtposicao='+'"'+dt_base+'";'
            df = pd.read_sql(query, con=connection)
            logger.info("Leitura do banco de dados executada com sucesso")
        df = df.sort(['cnpj', 'cnpjcpf','data_bd'], ascending=[True, True, False])
        df = df.drop_duplicates(subset=['cnpj', 'cnpjcpf'], take_last=False)
        df = df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
        del df['index']

        header_id_carteira=df.get_value(0,'header_id').astype(str)
        header_nome=df.get_value(0,'nome')
        cnpj_fundo=cnpj

        #quadro de operaçoes
        query='select a.* from projeto_inv.xml_quadro_operacoes a right join (select header_id, max(data_bd) as data_bd from projeto_inv.xml_quadro_operacoes where header_id='+header_id_carteira+' group by 1) b on a.header_id=b.header_id and a.data_bd=b.data_bd;'
        qo=pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")
        id_relatorio_qo=str(qo['id_relatorio_qo'][0])
        if cnpj==cnpj_hdi:
            id_relatorio_qo_hdi=id_relatorio_qo

    #    id_relatorio_qo = "50"
        query='select a.* from projeto_inv.quaid_419 a right join (select id_relatorio_qo, tipo_relatorio, max(data_bd) as data_bd from projeto_inv.quaid_419 where id_relatorio_qo='+id_relatorio_qo+' and tipo_relatorio="G" group by 1,2) b on a.id_relatorio_qo=b.id_relatorio_qo and a.tipo_relatorio=b.tipo_relatorio and a.data_bd=b.data_bd;'
        quaid_419=pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")
        quaid_419=quaid_419[quaid_419.EMFMULTIPLOFATOR==0]    #Se tem linha duplicada, mais de um fator de risco, pega apenas a referente ao indexador principal
        id_quaid_419_df=quaid_419[['id_relatorio_quaid419']]
        id_relatorio_quaid419=id_quaid_419_df.get_value(0,'id_relatorio_quaid419').astype(str)
        #print(cnpj,id_relatorio_qo,id_relatorio_quaid419)

        #Patrimônio líquido
        #Informações de PL
        pl_qo=qo[qo.produto!='Futuro']
        pl_info=sum(pl_qo['mtm_info'])

        #Risco de Mercado - VaR
        query='select a.* from projeto_inv.var a right join (select id_relatorio_quaid419, tipo_var, vertice, tipo_alocacao, tipo_segmento, norm_stress, max(data_bd) as data_bd from projeto_inv.var where id_relatorio_quaid419='+str(id_relatorio_quaid419)+' and tipo_var="Total" and vertice="Total" and tipo_alocacao="Total" and tipo_segmento="Total" and norm_stress = "normal" group by 1,2,3,4,5,6) b on a.id_relatorio_quaid419=b.id_relatorio_quaid419 and a.tipo_var=b.tipo_var and a.tipo_alocacao=b.tipo_alocacao and a.tipo_segmento=b.tipo_segmento and a.norm_stress = b.norm_stress and a.data_bd=b.data_bd; '
        resumo_var_normal=pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")
        resumo_var_normal = resumo_var_normal[['id_relatorio_quaid419','var']].copy()
        resumo_var_normal = resumo_var_normal.rename(columns={'var':'var_normal'})

        query='select a.* from projeto_inv.var a right join (select id_relatorio_quaid419, tipo_var, vertice, tipo_alocacao, tipo_segmento, norm_stress, max(data_bd) as data_bd from projeto_inv.var where id_relatorio_quaid419='+str(id_relatorio_quaid419)+' and tipo_var="Total" and vertice="Total" and tipo_alocacao="Total" and tipo_segmento="Total" and norm_stress = "estressado" group by 1,2,3,4,5,6) b on a.id_relatorio_quaid419=b.id_relatorio_quaid419 and a.tipo_var=b.tipo_var and a.tipo_alocacao=b.tipo_alocacao and a.tipo_segmento=b.tipo_segmento and a.norm_stress = b.norm_stress and a.data_bd=b.data_bd; '
        resumo_var_estressado=pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")
        resumo_var_estressado = resumo_var_estressado[['id_relatorio_quaid419','var']].copy()
        resumo_var_estressado = resumo_var_estressado.rename(columns={'var':'var_estressado'})

        resumo_var = pd.merge(resumo_var_normal,resumo_var_estressado,left_on=['id_relatorio_quaid419'],right_on=['id_relatorio_quaid419'],how='left')
        resumo_var['cnpj'] = cnpj
        resumo_var['nome'] = header_nome
        resumo_var['pl'] = pl_info
        resumo_var['perc_var_norm'] = resumo_var['var_normal']/pl_info
        resumo_var['perc_var_stress'] = resumo_var['var_estressado']/pl_info
        del resumo_var['id_relatorio_quaid419']

        #Risco de Crédito - Percentual de perda esperada e rating médio da carteira
        query='select a.* from projeto_inv.resumo_credito a right join (select cnpj, max(data_bd) as data_bd from projeto_inv.resumo_credito where cnpj='+cnpj+' group by 1) b on a.cnpj = b.cnpj and a.data_bd=b.data_bd; '
        resumo_credito=pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")

        #União das tabelas
        tabela_resumo_var = tabela_resumo_var.append(resumo_var)
        if len(resumo_credito)>0:
            resumo_credito['pl'] = pl_info
            tabela_resumo_credito = tabela_resumo_credito.append(resumo_credito)

    #FIDCS e FIP
    #Cria dataframe com a exposicao dos FIDCs (busca a informação no quadro consolidado)
    tabela_fidc=pd.DataFrame()

    for cnpj in lista_fidc:
        quadro_fidc=pd.read_sql('select mtm_info, cnpjfundo_1nivel, fundo, isin from projeto_inv.xml_quadro_operacoes where data_bd=(select max(data_bd) from projeto_inv.xml_quadro_operacoes where header_id="'+header_id_carteira_fundos+'") and cnpjfundo_1nivel="'+cnpj+'" and header_id="'+header_id_carteira_fundos+'";', con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")
        tabela_fidc=tabela_fidc.append(quadro_fidc)

    lista_isin=tabela_fidc['isin'].tolist()

    #Extrai o valor do id do quadro 419 da HDI
    id_quadro419=pd.read_sql('SELECT id_relatorio_quaid419 FROM projeto_inv.quaid_419 where data_bd=(select max(data_bd) from projeto_inv.quaid_419 where id_relatorio_qo="'+id_relatorio_qo_hdi+'" and tipo_relatorio="G") and id_relatorio_qo="'+id_relatorio_qo_hdi+'";', con=connection)
    id_quadro419=id_quadro419.get_value(0,'id_relatorio_quaid419').astype(str)

    #Extrai os valores de VaR de cada um dos ISINs presentes na lista_isin
    var_fidc=pd.DataFrame()

    for isin in lista_isin:
        var_fidc_bd=pd.read_sql('SELECT var, vertice from projeto_inv.var where data_bd=(select max(data_bd) from projeto_inv.var where id_relatorio_quaid419="'+id_quadro419+'" and norm_stress="normal") and vertice="'+isin+'" and id_relatorio_quaid419="'+id_quadro419+'" and tipo_var="Marginal" and tipo_alocacao="Total" and tipo_segmento="Total" and norm_stress="normal";', con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")
        var_fidc=var_fidc.append(var_fidc_bd)

    #Fecha conexão
    connection.close()

    var_fidc=pd.merge(var_fidc, tabela_fidc, left_on=['vertice'], right_on=['isin'], how='inner')
    var_fidc['var']=var_fidc['var']*var_fidc['mtm_info']
    var_fidc['VaR Estressado (R$)']=var_fidc['var']*1.14566452
    var_fidc['VaR (%PL)']=var_fidc['var']/var_fidc['mtm_info']
    var_fidc['VaR Estressado (%PL)']=var_fidc['VaR Estressado (R$)']/var_fidc['mtm_info']
    var_fidc=var_fidc.rename(columns={'var':'VaR (R$)', 'mtm_info':'Patrimônio Líquido (R$)', 'fundo':'Nome do Fundo', 'cnpjfundo_1nivel':'CNPJ'})
    var_fidc=var_fidc[['CNPJ', 'Nome do Fundo', 'Patrimônio Líquido (R$)', 'VaR (R$)', 'VaR Estressado (R$)', 'VaR (%PL)', 'VaR Estressado (%PL)']].copy()

    #Geração do relatorio
    writer = pd.ExcelWriter(end+'relatorio_risco_resumo_'+dt_base+'.xlsx', engine='xlsxwriter')
    workbook = writer.book
    numero_float = workbook.add_format({'num_format': '#,##0', 'bold': False})
    percent = workbook.add_format({'num_format': '0.0000%', 'bold': False})
    percent1 = workbook.add_format({'num_format': '0%', 'bold': False})

    #VaR
    var = pd.DataFrame(columns=['CNPJ','Nome do Fundo','Patromônio Líquido (R$)','VaR (R$)','VaR Estressado (R$)','VaR (%PL)','VaR Estressado (%PL)'])
    var['CNPJ'] = tabela_resumo_var['cnpj']
    var['Nome do Fundo'] = tabela_resumo_var['nome']
    var['Patromônio Líquido (R$)'] = tabela_resumo_var['pl']
    var['VaR (R$)'] = tabela_resumo_var['var_normal']
    var['VaR Estressado (R$)'] = tabela_resumo_var['var_estressado']
    var['VaR (%PL)'] = tabela_resumo_var['var_normal']/tabela_resumo_var['pl']
    var['VaR Estressado (%PL)'] = tabela_resumo_var['var_estressado']/tabela_resumo_var['pl']

    tabela_pl = tabela_resumo_var[['cnpj','pl']].copy()

    var.to_excel(writer,index=False, sheet_name='Resumo VaR', startrow =3, startcol=1)
    logger.info("Arquivo salvo com sucesso")

    tamanho=len(var)

    var_fidc.to_excel(writer,index=False, sheet_name='Resumo VaR', startrow =(7+tamanho), startcol=1)
    logger.info("Arquivo salvo com sucesso")

    worksheet = writer.sheets['Resumo VaR']
    worksheet.set_column('D:D', 12, numero_float)
    worksheet.set_column('E:E', 12, numero_float)
    worksheet.set_column('F:F', 12, numero_float)
    worksheet.set_column('G:G', 12, percent)
    worksheet.set_column('H:H', 12, percent)

    #Credito
    credito = pd.DataFrame(columns=['CNPJ','Nome do Fundo','Patromônio Líquido Crédito (R$)','Perda Esperada (R$)','Perda Esperada (%PL - Crédito)','Rating Médio do Fundo'])
    credito['CNPJ'] = tabela_resumo_credito['cnpj']
    credito['Nome do Fundo'] = tabela_resumo_credito['nome']
    credito['Patromônio Líquido Crédito (R$)'] = tabela_resumo_credito['pl_cred']
    credito['Perda Esperada (R$)'] = tabela_resumo_credito['pl']*tabela_resumo_credito['perc_esp']
    credito['Perda Esperada (%PL - Crédito)'] = tabela_resumo_credito['pl']*tabela_resumo_credito['perc_esp']/tabela_resumo_credito['pl_cred']
    credito['Rating Médio do Fundo'] = tabela_resumo_credito['rtg_medio']
    credito.to_excel(writer,index=False, sheet_name='Resumo Crédito', startrow =3, startcol=1)
    logger.info("Arquivo salvo com sucesso")

    worksheet = writer.sheets['Resumo Crédito']
    worksheet.set_column('D5:E30', 12, numero_float)
    worksheet.set_column('F5:F30', 12, percent1)

    writer.save()

    #Formatação resumo
    wb = openpyxl.load_workbook(end+'relatorio_risco_resumo_'+dt_base+'.xlsx')

    #####FORMATOS
    #Fonte
    fontObj1=Font(name='Calibri', bold=True, size =24,color='404040')
    fontObj2=Font(name='Calibri', bold=False, size =11,color='404040')

    #Borda
    borderObj1=Border(bottom=Side(border_style='double'),top=Side(border_style='thin'))
    borderObj2=Border()

    #Cor
    colorObj1=PatternFill(patternType='solid', fgColor=Color('FFE600'))

    #Alinhamento
    alinObj1=Alignment(vertical='center',horizontal='center')
    alinObj2=Alignment(vertical='center',horizontal='left')
    alinObj3=Alignment(vertical='center',horizontal='right')

    sheet1=wb.get_sheet_by_name('Resumo VaR')

    #Retira as gridlines
    sheet1.sheet_view.showGridLines = False

    #Formatação tamanho das linhas
    sheet1.row_dimensions[1].height = 90

    #Formata cor da fonte de todas as células
    for row in sheet1.range('B2:H50'):
        for cell in row:
            cell.font=fontObj2

    #Formata o título
    sheet1.merge_cells('B2:H2')
    sheet1['B2']='Resumo VaR'
    sheet1['B2'].font=fontObj1
    sheet1['B2'].alignment=alinObj2

    sheet1.merge_cells('B'+str(6+tamanho)+':H'+str(6+tamanho))#Tabela FIDC
    sheet1['B'+str(6+tamanho)]='Resumo VaR FIDCs'
    sheet1['B'+str(6+tamanho)].font=fontObj1
    sheet1['B'+str(6+tamanho)].alignment=alinObj2

    for row in sheet1.range('B2:H2'):
        for cell in row:
            cell.border=borderObj1

    for row in sheet1.range('B'+str(6+tamanho)+':H'+str(6+tamanho)):#Tabela FIDC
        for cell in row:
            cell.border=borderObj1

    #Formata os headers da tabela
    for row in sheet1.range('B4:H4'):
        for cell in row:
            cell.fill=colorObj1
            cell.border=borderObj2

    for row in sheet1.range('B'+str(8+tamanho)+':H'+str(8+tamanho)):#Tabela FIDC
        for cell in row:
            cell.fill=colorObj1
            cell.border=borderObj2

    #Formatação tamanho das colunas
    sheet1.column_dimensions['A'].width = 2
    sheet1.column_dimensions['B'].width = 20
    sheet1.column_dimensions['C'].width = 70
    sheet1.column_dimensions['D'].width = 30
    sheet1.column_dimensions['E'].width = 20
    sheet1.column_dimensions['F'].width = 30
    sheet1.column_dimensions['G'].width = 25
    sheet1.column_dimensions['H'].width = 25

    ##CRÉDTIO
    sheet1=wb.get_sheet_by_name('Resumo Crédito')

    #Retira as gridlines
    sheet1.sheet_view.showGridLines = False

    #Formatação tamanho das linhas
    sheet1.row_dimensions[1].height = 90

    #Formata cor da fonte de todas as células
    for row in sheet1.range('B2:G30'):
       for cell in row:
           cell.font=fontObj2

    #Formata o título
    sheet1.merge_cells('B2:G2')
    sheet1['B2']='Resumo Crédito'
    sheet1['B2'].font=fontObj1
    sheet1['B2'].alignment=alinObj2

    for row in sheet1.range('B2:G2'):
       for cell in row:
           cell.border=borderObj1

    #Formata os headers da tabela
    for row in sheet1.range('B4:G4'):
       for cell in row:
           cell.fill=colorObj1
           cell.border=borderObj2

    #Formatação tamanho das colunas
    sheet1.column_dimensions['A'].width = 2
    sheet1.column_dimensions['B'].width = 20
    sheet1.column_dimensions['C'].width = 70
    sheet1.column_dimensions['D'].width = 30
    sheet1.column_dimensions['E'].width = 20
    sheet1.column_dimensions['F'].width = 30
    sheet1.column_dimensions['G'].width = 25

    wb.save(end+dt_base+' relatorio_resumo.xlsx')
示例#4
0
def xml_parser():

    import pandas as pd
    import xmltodict
    import glob
    import pymysql as db
    import numpy as np
    import datetime#,time
    import logging

    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from quadro90.scripts.xml_parser.dic_tabela import dic_tabela

    logger = logging.getLogger(__name__)

    # Retorna um array (ano, mes e dia) referente ao útimo dia útil do mês anterior configurado no banco de dados
    array_data = get_data_ultimo_dia_util_mes_anterior()

    #Diretório com os arquivos do cliente:
    full_path = full_path_from_database("xml_dir")
    xml_dir = full_path+'ano_'+array_data[0]+'/'+'XML_'+str(array_data[0])+str(array_data[1])+str(array_data[2])
    #xml_dir = full_path_from_database("xml_dir")

    # Diretório de saída dos arquivos:
    output_path = full_path_from_database("get_output_quadro90")

    logger.info("Conectando no Banco de dados")

    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv')

    logger.info("Conexão com DB executada com sucesso")

    logger.info("Tratando dados")

    # Função para transformar os dados para forma tabular
    query= 'select max(header_id) as header_id from projeto_inv.xml_header_org';

    logger.info("Lendo DB")

    qtde=pd.read_sql(query, con=connection)
    if qtde['header_id'][0]==None:
        n_header_id=0
    else:
        n_header_id=qtde.get_value(0,'header_id')+1

    lista_tabelas=[
    'header',
    'partplanprev',
    'titpublico',
    'titprivado',
    'debenture',
    'acoes',
    'opcoesacoes',
    'opcoesderiv',
    'opcoesflx',
    'termorv',
    'termorf',
    'futuros',
    'swap',
    'caixa',
    'cotas',
    'despesas',
    'outrasdespesas',
    'provisao',
    'corretagem']

    ## Criação das tabelas
    for x in lista_tabelas:
        globals()['tabela_%s' % x] = pd.DataFrame() #cria tabelas usando como nome tabela_+"string de lista_tabelas"

    ## Leitura XML
    horario_bd = datetime.datetime.now()
    horario_bd = horario_bd.strftime("%Y-%m-%d %H:%M:%S")

    lista_arquivos= glob.glob(xml_dir + '/*.*')

    for arquivo in lista_arquivos:
        xml=open(arquivo, "r")
        original_doc= xml.read()
        xmlFundo=xmltodict.parse(original_doc)

        #Encontra índice para separar o nome do arquivo
        start_string=arquivo.index('XML_'+str(array_data[0])+str(array_data[1])+str(array_data[2]))

        logger.info("Lendo XML "+arquivo[(start_string+13):])

        header_id=len(tabela_header)
        try:
            endereco=xmlFundo['arquivoposicao_4_01']['fundo']
        except:
            endereco=xmlFundo['arquivoposicao_4_01']['carteira']

        for item in endereco:
            for x in range(len(lista_tabelas)):#utiliza range para x ser indice da lista, tornando o uso do if possivel
                if item == lista_tabelas[x]:
                    y=x
                    x=lista_tabelas[x]#x recebe a string em lista tabelas, para acessar os dataframes com os nomes contidos em lista tabelas
                    globals()['tabela_%s' % x]=dic_tabela(endereco, lista_tabelas[y], globals()['tabela_%s' % x], header_id)

    #Trara os NaN
    for y in range(len(lista_tabelas)):
        x=lista_tabelas[y]
        globals()['tabela_%s' % x] = globals()['tabela_%s' % x].replace('', np.nan)
        globals()['tabela_%s' % x] = globals()['tabela_%s' % x].where((pd.notnull(globals()['tabela_%s' % x])), None)

    #Data do relatório
    dt_base = globals()['tabela_%s' % 'header']['dtposicao']
    dt_base = dt_base.drop_duplicates()
    dt_base = dt_base.iloc[0]
    dt_base_str = str(dt_base).replace('-','')

    for y in range(len(lista_tabelas)):
        x=lista_tabelas[y]
        if len(globals()['tabela_%s' % x])!=0:
            #print(x,'###',globals()['tabela_%s' % x].columns)
            globals()['tabela_%s' % x].loc[len(x),'data_bd'] = None
            globals()['tabela_%s' % x]['data_bd'] = globals()['tabela_%s' % x]['data_bd'].fillna(horario_bd)

            try:
                globals()['tabela_%s' % x]['header_id'] = globals()['tabela_%s' % x]['header_id']+n_header_id
                globals()['tabela_%s' % x]['header_id'] = globals()['tabela_%s' % x]['header_id'].astype(int)
            except:
                pass
                #print(x)

        if ((x=='titpublico')|(x=='titprivado')|(x=='debenture')):
            try:
                globals()['tabela_%s' % x]['header_id_aux'] = globals()['tabela_%s' % x]['header_id'].astype(str)
                globals()['tabela_%s' % x]['index_col'] = globals()['tabela_%s' % x].index.values
                globals()['tabela_%s' % x]['index_col'] = globals()['tabela_%s' % x]['index_col'].astype(str)
                globals()['tabela_%s' % x]['id_papel'] = dt_base_str +'_'+globals()['tabela_%s' % x]['index_col']+'_'+globals()['tabela_%s' % x]['header_id_aux']
                del globals()['tabela_%s' % x]['index_col']
                del globals()['tabela_%s' % x]['header_id_aux']
            except:
                pass
                #print(x)

    logger.info("Corrigindo tabela Título Privado")
    col='titprivado'

    if len(globals()['tabela_%s' % col]) != 0:
        aux = globals()['tabela_%s' % col][['id_papel', 'isin']][
            globals()['tabela_%s' % col]['isin'].isin(['************', 'BR**********'])].copy()
        aux['idx'] = np.linspace(0, len(aux) - 1, len(aux))
        aux['idx'] = aux['idx'].astype(int)
        aux['idx'] = aux['idx'].astype(str)
        aux['isin_novo'] = 'TIT000_BR' + aux['idx']
        aux['isin_novo'] = aux['isin_novo'].str.zfill(13)
        aux['isin_novo'] = aux['isin_novo'].str.split('_')
        aux['isin_novo'] = aux['isin_novo'].str[1] + aux['isin_novo'].str[0]

        del aux['isin']
        del aux['idx']

        globals()['tabela_%s' % col] = globals()['tabela_%s' % col].merge(aux, on=['id_papel'], how='left')
        globals()['tabela_%s' % col]['isin'] = np.where(globals()['tabela_%s' % col]['isin_novo'].notnull(),
                                                        globals()['tabela_%s' % col]['isin_novo'],
                                                        globals()['tabela_%s' % col]['isin'])

        del globals()['tabela_%s' % col]['isin_novo']

    logger.info("Corrigindo tabela debenture")
    col = 'debenture'

    if len(globals()['tabela_%s' % col]) != 0:
        aux = globals()['tabela_%s' % col][['id_papel', 'isin']][globals()['tabela_%s' % col]['isin'].isin(['************', 'BR**********'])].copy()
        aux['idx'] = np.linspace(0, len(aux) - 1, len(aux))
        aux['idx'] = aux['idx'].astype(int)
        aux['idx'] = aux['idx'].astype(str)
        aux['isin_novo'] = 'TIT000_BR' + aux['idx']
        aux['isin_novo'] = aux['isin_novo'].str.zfill(13)
        aux['isin_novo'] = aux['isin_novo'].str.split('_')
        aux['isin_novo'] = aux['isin_novo'].str[1] + aux['isin_novo'].str[0]

        del aux['isin']
        del aux['idx']

        globals()['tabela_%s' % col] = globals()['tabela_%s' % col].merge(aux, on=['id_papel'], how='left')
        globals()['tabela_%s' % col]['isin'] = np.where(globals()['tabela_%s' % col]['isin_novo'].notnull(),globals()['tabela_%s' % col]['isin_novo'],globals()['tabela_%s' % col]['isin'])

        del globals()['tabela_%s' % col]['isin_novo']

    x = 'header'
    globals()['tabela_%s' % x]['cnpj'] = globals()['tabela_%s' % x]['cnpj'].fillna(0)
    globals()['tabela_%s' % x]['cnpj'] = globals()['tabela_%s' % x]['cnpj'].astype(str)
    globals()['tabela_%s' % x]['cnpj'] = globals()['tabela_%s' % x]['cnpj'].str.zfill(14)

    logger.info("Salvando fundos")
    globals()['tabela_%s' % x][['cnpj','nome']].to_excel(output_path+'fundos.xlsx')

    for y in range(len(lista_tabelas)):
        x = lista_tabelas[y]
        globals()['tabela_%s' % x].to_excel(output_path+'tabela_'+lista_tabelas[y]+'_'+dt_base_str+'.xlsx', encoding='utf-8', index=True, index_label="id")

        logger.info("Salvando tabela " + x + " no banco de dados")
        pd.io.sql.to_sql(globals()['tabela_%s' % x], name='xml_'+lista_tabelas[y]+'_org', con=connection,if_exists="append", flavor='mysql', index=0)

    logger.info("Base de dados salva com sucesso")
    connection.close()
示例#5
0
def bmf_numeraca_ajustes_cadastro():

    import pandas as pd
    import datetime
    import pymysql as db
    import logging

    from pandas import ExcelWriter
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Diretório de dependencias
    depend_path_carat = full_path_from_database('excels') + 'caracteristicas.xlsx'
    depend_path_bullet_B0 = full_path_from_database('excels') + 'bullet_12meses.xlsx'
    depend_path_bullet_B1 = full_path_from_database('excels') + '12meses_bullet.xlsx'

    # Diretório de save de planilhas
    xlsx_path = full_path_from_database('get_output_quadro419') + 'controle_titprivado.xlsx'

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    #dtbase = ['2016','11','30']
    dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]

    manual = pd.read_excel(depend_path_carat)
    logger.info("Arquivos lidos com sucesso")

    horario_bd = datetime.datetime.now()

    writer = ExcelWriter(xlsx_path)

    #Leitura e tratamento das tabelas

    # ----Leitura da base numeraca

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT t.* FROM (SELECT codigo_isin, MAX(data_bd) AS max_data FROM bmf_numeraca GROUP BY codigo_isin ) AS m INNER JOIN bmf_numeraca AS t ON t.codigo_isin = m.codigo_isin AND t.data_bd = m.max_data'
    titprivado_bmf = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    # ----Tratamento da tabela bmf


    logger.info("Tratando dados")
    # Criação do flag 'O' - existe na numeraca
    titprivado_bmf['flag'] = 'O'

    # Remove duplicatas
    titprivado_bmf = titprivado_bmf.sort(['codigo_isin', 'data_bd'], ascending=[True, True])
    titprivado_bmf = titprivado_bmf.drop_duplicates(subset=['codigo_isin'], take_last=True)

    # Deleta colunas não necessárias
    del titprivado_bmf['data_bd']

    # ----Leitura da tabela xml

    query = 'SELECT * FROM projeto_inv.xml_titprivado_org '
    titprivado_xml = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    # Seleciona última carga com dtposicao = data_base
    titprivado_xml['dtrel'] = titprivado_xml['id_papel'].str.split('_')
    titprivado_xml['dtrel'] = titprivado_xml['dtrel'].str[0]

    titprivado_xml = titprivado_xml[titprivado_xml.dtrel == dtbase_concat].copy()
    titprivado_xml = titprivado_xml[titprivado_xml.data_bd == max(titprivado_xml.data_bd)]

    query = 'SELECT * FROM projeto_inv.xml_header_org '
    header_xml = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    # Seleciona última carga com dtposicao = data_base
    header_xml = header_xml[
        header_xml.dtposicao == datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2]))].copy()
    header_xml = header_xml[header_xml.data_bd == max(header_xml.data_bd)]

    # ----Tratamento da tabela xml

    # Renomeação de colunas
    titprivado_xml = titprivado_xml.rename(columns={'isin': 'codigo_isin', 'indexador': 'indexador_xml'})

    # Seleção das colunas necessárias
    titprivado_xml = titprivado_xml[['codigo_isin',
                                     'codativo',
                                     'dtemissao',
                                     'dtoperacao',
                                     'dtvencimento',
                                     'puemissao',
                                     'coupom',
                                     'indexador_xml',
                                     'percindex',
                                     'id_papel']]

    # ----Criação da tabela xml + numeraca

    # Constrói base xml+numeraca
    titprivado = pd.merge(titprivado_xml, titprivado_bmf, left_on=['codigo_isin'], right_on=['codigo_isin'], how='left')

    # Cria a coluna com a data da carga
    titprivado['data_bd'] = horario_bd

    # Arruma os NaN
    titprivado = titprivado.where((pd.notnull(titprivado)), None)

    # Seleciona e salva na bd as características não alteradas
    titprivado_original_bmf = titprivado[titprivado.flag.notnull()].copy()

    # Reseta o indice do data_frame
    titprivado = titprivado.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='')
    titprivado_original_bmf = titprivado_original_bmf.reset_index(level=None, drop=True, inplace=False, col_level=0,
                                                                  col_fill='')
    # Deleta columnas não existentes na bd bmf_numeraca
    del titprivado_original_bmf['puemissao']
    del titprivado_original_bmf['percindex']
    del titprivado_original_bmf['dtvencimento']
    del titprivado_original_bmf['dtemissao']
    del titprivado_original_bmf['coupom']
    del titprivado_original_bmf['indexador_xml']
    del titprivado_original_bmf['codativo']

    # Contatena tabelas
    titprivado_original_bmf['id_papel'] = titprivado_original_bmf['id_papel'] + '_' + titprivado_original_bmf['flag']

    logger.info("Salvando base de dados - titprivado_caracteristicas")
    pd.io.sql.to_sql(titprivado_original_bmf, name='titprivado_caracteristicas', con=connection, if_exists="append",
                     flavor='mysql', index=False)
    logger.info("Salvando base de dados - titprivado_caracteristicas")

    #Fecha conexão
    connection.close()

    del titprivado_original_bmf

    #Manipulação das informações cadastrais

    # Verificação dos papéis não existentes na numeraca
    erros = titprivado[titprivado.flag.isnull()].copy()
    erros.to_excel(writer, 'fora_numeraca')

    # Criação de informações  - fonte: xml - ASSUME BULLET, joga fora papéis já vencidos
    idx = titprivado[(titprivado.flag.isnull()) & (titprivado.dtvencimento >= datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2])))].index.tolist()

    titprivado['data_emissao'][idx] = titprivado['dtemissao'][idx]
    titprivado['data_expiracao'][idx] = titprivado['dtvencimento'][idx]
    titprivado['data_primeiro_pagamento_juros'][idx] = titprivado['data_expiracao'][idx]
    titprivado['valor_nominal'][idx] = titprivado['puemissao'][idx]
    titprivado['indexador'][idx] = titprivado['indexador_xml'][idx]
    titprivado['percentual_indexador'][idx] = titprivado['percindex'][idx]
    titprivado['taxa_juros'][idx] = titprivado['coupom'][idx]
    titprivado['ano_expiracao'][idx] = titprivado['data_expiracao'][idx].astype(str)
    titprivado['ano_expiracao'][idx] = titprivado['ano_expiracao'][idx].str.split('-')
    titprivado['ano_expiracao'][idx] = titprivado['ano_expiracao'][idx].str[0].astype(int)
    titprivado['flag'][idx] = 'C0'

    erros = titprivado[titprivado.flag == 'C0'].copy()
    erros.to_excel(writer, 'criados_0')

    # Criação de informações  - fonte: fluxo manual

    manual['data_primeiro_pagamento_juros1'] = pd.to_datetime(manual['data_primeiro_pagamento_juros1']).dt.date

    titprivado = titprivado.merge(manual, on=['codigo_isin'], how='left')

    idx = titprivado[titprivado.taxa_juros1.notnull()].index.tolist()

    titprivado['cod_frequencia_juros'][idx] = titprivado['cod_frequencia_juros1'][idx]
    titprivado['data_primeiro_pagamento_juros'][idx] = titprivado['data_primeiro_pagamento_juros1'][idx]
    titprivado['valor_nominal'][idx] = titprivado['valor_nominal1'][idx]
    titprivado['indexador'][idx] = titprivado['indexador1'][idx]
    titprivado['percentual_indexador'][idx] = titprivado['percentual_indexador1'][idx]
    titprivado['taxa_juros'][idx] = titprivado['taxa_juros1'][idx]
    titprivado['tipo_ativo'][idx] = titprivado['tipo_ativo1'][idx]
    titprivado['flag'][idx] = 'C1'

    del titprivado['cod_frequencia_juros1']
    del titprivado['data_primeiro_pagamento_juros1']
    del titprivado['valor_nominal1']
    del titprivado['indexador1']
    del titprivado['percentual_indexador1']
    del titprivado['taxa_juros1']
    del titprivado['tipo_ativo1']

    erros = titprivado[titprivado.flag == 'C1'].copy()
    erros.to_excel(writer, 'criados_1')

    # Manipulação V - Preenche valor nominal com info do xml

    # Papéis que tem informação diferente do xml
    titprivado['flag'][(titprivado.flag != 'C0') & (titprivado.flag != 'C1')] = 'V'
    titprivado['valor_nominal'][titprivado.flag == 'V'] = titprivado['puemissao'][titprivado.flag == 'V']

    erros = titprivado[titprivado.flag == 'V'].copy()
    erros.to_excel(writer, 'valor_nominal')

    # Manipulação I - Preenche percentual indexador com info do xml

    # Caso o percentual_indexador seja missing, preenche com a inforção do xml
    titprivado['flag'][
        (titprivado.flag != 'C0') & (titprivado.flag != 'C1') & (titprivado.percentual_indexador.isnull())] = 'I'
    titprivado['percentual_indexador'][titprivado.flag == 'I'] = titprivado['percindex'][titprivado.flag == 'I']

    erros = titprivado[titprivado.flag == 'I'].copy()
    erros.to_excel(writer, 'percentual_indexador')

    # Manipulação J0 - Preenche taxa de juros com info do xml, quando percentual indexador = 100

    # Caso o taxa_juros seja missing, preenche com a inforção do xml
    titprivado['flag'][(titprivado.flag != 'C0') & (titprivado.flag != 'C1') & (
    titprivado.taxa_juros.isnull() & (titprivado.percentual_indexador == 100))] = 'J0'
    titprivado['taxa_juros'][(titprivado.flag == 'J0')] = titprivado['coupom'][(titprivado.flag == 'J0')]

    erros = titprivado[titprivado.flag == 'J0'].copy()
    erros.to_excel(writer, 'taxa_juros_0')

    # Manipulação J0 - Preenche taxa de juros com info do xml, quando percentual indexador != 100

    # Caso o taxa_juros seja missing, preenche com a inforção do xml
    titprivado['flag'][(titprivado.flag != 'C0') & (titprivado.flag != 'C1') & (
    titprivado.taxa_juros.isnull() & (titprivado.percentual_indexador != 100))] = 'J1'
    titprivado['taxa_juros'][titprivado.flag == 'J1'] = 0

    erros = titprivado[titprivado.flag == 'J1'].copy()
    erros.to_excel(writer, 'taxa_juros_1')

    ###############################################################################
    # Missing data_primeiro_pagamento_juros
    #
    # No programa de fluxo, fiz uma modificação para os papéis que tinham código de frequência.
    # Coloquei a data de primeiro pagamento como sendo a próxima após a data de emissão depois de um período correspondente ao código de frequência de juros
    ###############################################################################

    # Caso o papel tenha um código de frequência de juros, preenche a primeira data de pagamento com a primeira data depois do periodo considerando o cod_frequencia_juros
    # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='B')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='B')] + pd.DateOffset(years=2)
    titprivado['flag'][(titprivado.flag != 'C') & (
    (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'B'))] = 'D'
    # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='A')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='A')] + pd.DateOffset(years=1)
    titprivado['flag'][(titprivado.flag != 'C') & (
    (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'A'))] = 'D'
    # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='S')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='S')] + pd.DateOffset(months=6)
    titprivado['flag'][(titprivado.flag != 'C') & (
    (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'S'))] = 'D'
    # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='Q')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='Q')] + pd.DateOffset(months=3)
    titprivado['flag'][(titprivado.flag != 'C') & (
    (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'Q'))] = 'D'
    # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='M')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='M')] + pd.DateOffset(months=1)
    titprivado['flag'][(titprivado.flag != 'C') & (
    (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'M'))] = 'D'
    # titprivado['data_primeiro_pagamento_juros'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='W')] = titprivado['data_emissao'][(titprivado.data_primeiro_pagamento_juros.isnull())&(titprivado.cod_frequencia_juros=='W')] + pd.DateOffset(days=7)
    titprivado['flag'][(titprivado.flag != 'C') & (
    (titprivado.data_primeiro_pagamento_juros.isnull()) & (titprivado.cod_frequencia_juros == 'W'))] = 'D'

    erros = titprivado[titprivado.flag == 'D'].copy()
    erros.to_excel(writer, 'data_primeiro_pagamento_juros')

    # Faz substituição do código de frequência de juros para os isins especificados no excel
    # Lista de papéis na transformação: JUROS '' bullet -> 'A' anual
    isin_list = pd.read_excel(depend_path_bullet_B0)
    logger.info("Arquivos lidos com sucesso")

    titprivado = titprivado.merge(isin_list, on=['codigo_isin'], how='left')
    titprivado['cod_frequencia_juros'][titprivado.flag_err == 1] = 'A'
    titprivado['flag'][titprivado.flag_err == 1] = 'B0'
    del titprivado['flag_err']

    erros = titprivado[titprivado.flag == 'B0'].copy()
    erros.to_excel(writer, 'cod_frequencia_juros_bullet')

    # Lista de papéis na transformação: JUROS '' bullet -> 'A' anual
    isin_list = pd.read_excel(depend_path_bullet_B1)
    logger.info("Arquivos lidos com sucesso")

    titprivado = titprivado.merge(isin_list, on=['codigo_isin'], how='left')
    titprivado['cod_frequencia_juros'][titprivado.flag_err == 1] = None
    titprivado['flag'][titprivado.flag_err == 1] = 'B1'
    del titprivado['flag_err']

    erros = titprivado[titprivado.flag == 'B1'].copy()
    erros.to_excel(writer, 'cod_frequencia_juros_12meses')

    # Correção ultra-manual
    titprivado['valor_nominal'][titprivado.codigo_isin == 'BRBCXGDP00J9'] = 2062500.0
    titprivado['flag'][titprivado.codigo_isin == 'BRBCXGDP00J9'] = 'M'
    titprivado['valor_nominal'][titprivado.codigo_isin == 'BRCSCSDP0075'] = 1000000.0
    titprivado['flag'][titprivado.codigo_isin == 'BRCSCSDP0075'] = 'M'
    titprivado['percentual_indexador'][titprivado.codigo_isin == 'BRBCEFC01JQ9'] = 102.5
    titprivado['flag'][titprivado.codigo_isin == 'BRBCEFC01JQ9'] = 'M'
    titprivado['percentual_indexador'][titprivado.codigo_isin == 'BRBITALFID01'] = 100.0
    titprivado['flag'][titprivado.codigo_isin == 'BRBITALFID01'] = 'M'
    titprivado['ano_expiracao'][titprivado.codigo_isin == 'BRBPNMLFI0L5'] = 2018
    titprivado['flag'][titprivado.codigo_isin == 'BRBPNMLFI0L5'] = 'M'
    titprivado['ano_expiracao'][titprivado.codigo_isin == 'BRFTORDP0045'] = 2017
    titprivado['flag'][titprivado.codigo_isin == 'BRFTORDP0045'] = 'M'
    titprivado['ano_expiracao'][titprivado.codigo_isin == '************'] = 2017
    titprivado['flag'][titprivado.codigo_isin == '************'] = 'M'
    titprivado['tipo_ativo'][titprivado.codigo_isin == 'BRMULTCC0016'] = 'C'
    titprivado['flag'][titprivado.codigo_isin == 'BRMULTCC0016'] = 'M'

    erros = titprivado[titprivado.flag == 'M'].copy()
    erros.to_excel(writer, 'manual')

    # Finalização
    # Retira papéis que estão fora da numeraca e que não foram criados
    titprivado = titprivado[titprivado.flag.notnull()].copy()

    # Coloca o flag bo id_papel
    titprivado['id_papel'] = titprivado['id_papel'] + '_' + titprivado['flag']

    # Todos os papéis
    titprivado.to_excel(writer, 'todos')

    # Salva excel com todas as abas
    logger.info("Arquivos salvos com sucesso")
    writer.save()

    # Deleta columnas não existentes na bd bmf_numeraca
    del titprivado['puemissao']
    del titprivado['percindex']
    del titprivado['dtvencimento']
    del titprivado['dtemissao']
    del titprivado['coupom']
    del titprivado['indexador_xml']
    del titprivado['codativo']

    # Salvar informacoes alteradas no banco de dados
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - titprivado_caracteristicas")
    pd.io.sql.to_sql(titprivado, name='titprivado_caracteristicas', con=connection, if_exists="append", flavor='mysql',
                     index=False)

    # Fecha conexão
    connection.close()
def matriz_gerencial_2():

    import pymysql as db
    import datetime
    import numpy as np
    import pandas as pd
    import logging
    import pickle

    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from var.scripts.matriz_gerencial.definicao_lambda import definicao_lambda
    from var.scripts.matriz_gerencial.definicao_nome import definicao_nome

    #Define variáveis:
    logger = logging.getLogger(__name__)
    save_path = full_path_from_database("get_output_var")
    retornos_path = full_path_from_database("pickles")
    # data_final = '2016-11-30'
    # dt_base = '20161130'
    # data_inicial = "2010-03-31"

    dt_base = get_data_ultimo_dia_util_mes_anterior()
    data_final = str(dt_base[0]) + '-' + str(dt_base[1]) + '-' + str(
        dt_base[2])
    dt_base = dt_base[0] + dt_base[1] + dt_base[2]

    data_inicial = get_global_var("dt_ini_matriz_gerencial_2")
    data_inicial = str(data_inicial[0:4]) + '-' + str(
        data_inicial[4:6]) + '-' + str(data_inicial[6:8])

    lambda_geral = definicao_lambda('outro')  #lambda_geral = 0.95

    retornos = open(retornos_path + 'matriz_gerencial_retornos' + ".pkl", "w")

    # Conecta no DB
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Tratando dados")
    ## Cálculo da matriz de correlação
    matriz_correlacao = retornos.corr()
    matriz_correlacao.fillna(0, inplace=True)

    variancias_manual = pd.read_excel(
        full_path_from_database("get_output_var") + 'variancias_' + dt_base +
        '.xlsx')

    #COMO QUE EU COLOCO NO FORMATO QUE ESTAVAM VINDO AS VARIANCIAS ANTES?
    variancias = variancias_manual.values
    desvio_padrao = np.sqrt(variancias)
    desvio_padrao = np.squeeze(desvio_padrao)

    ## Cálculo da matriz de covariância
    matriz_diagonal = np.diag(desvio_padrao)
    matriz_covariancias = np.dot(matriz_diagonal,
                                 np.dot(matriz_correlacao, matriz_diagonal))

    ## Salvar no banco de dados
    base_final = pd.DataFrame()

    for linha in range(len(retornos.columns)):
        for coluna in range(linha + 1):
            resultado = {}
            if isinstance(retornos.columns[linha],
                          tuple) and len(retornos.columns[linha]) > 2:
                resultado["linha"] = definicao_nome(
                    retornos.columns[linha][1]) + "_" + str(
                        retornos.columns[linha][2])
            else:
                resultado["linha"] = definicao_nome(retornos.columns[linha])
            if isinstance(retornos.columns[coluna],
                          tuple) and len(retornos.columns[coluna]) > 2:
                resultado["coluna"] = definicao_nome(
                    retornos.columns[coluna][1]) + "_" + str(
                        retornos.columns[coluna][2])
            else:
                resultado["coluna"] = definicao_nome(retornos.columns[coluna])
            resultado["valor"] = matriz_covariancias[linha][coluna]
            base_final = base_final.append(resultado, ignore_index=True)

    max(base_final["valor"])
    base_final["data_bd"] = datetime.datetime.now()
    base_final["data_inicial"] = data_inicial
    base_final["data_final"] = data_final
    base_final["horizonte"] = "dia"
    base_final["lambda"] = lambda_geral

    # TESTE SE VETOR VEM ZERADO
    ## Inserir "matriz_id"

    matriz_id = pd.read_sql_query(
        'SELECT max(matriz_id) as matriz_id FROM matriz_gerencial', connection)
    if matriz_id['matriz_id'][0] == None:
        matriz_id_valor = 0
    else:
        matriz_id_valor = matriz_id.get_value(0, 'matriz_id').astype(int) + 1

    base_final["matriz_id"] = matriz_id_valor

    ### Salvar no BD
    logger.info("Salvando base de dados")
    pd.io.sql.to_sql(base_final,
                     name='matriz_gerencial',
                     con=connection,
                     if_exists="append",
                     flavor='mysql',
                     index=0,
                     chunksize=5000)

    new_matriz_id = pd.read_sql_query(
        'select matriz_id from matriz_gerencial where data_bd = ( SELECT MAX(data_bd) from matriz_gerencial	) group by matriz_id',
        connection)
    new_matriz_id = new_matriz_id['matriz_id'].iloc[0]

    cur = connection.cursor(db.cursors.DictCursor)
    query = 'update generator_global_variables set variable_value = ' + str(
        new_matriz_id) + ' where variable_name = ' + '\'matriz_id\''

    logger.info("Atualizando matriz_id na base de dados")
    cur.execute(query)
    connection.commit()
    logger.info("Base de dados atualizada com sucesso")
    connection.close()

    base_final.to_excel(save_path + 'matriz_gerencial_' + str(data_final) +
                        '.xlsx')
    logger.info("Arquivo Matriz Gerencial salvo com sucesso")
    retornos.to_excel(save_path + 'retornos_mensal_' + str(data_final) +
                      '.xlsx')
    logger.info("Arquivo Retornos mensais salvo com sucesso")
示例#7
0
def fluxo_titprivado():

    import pandas as pd
    import datetime
    import numpy as np
    import pymysql as db
    import logging
    from pandas.tseries.offsets import DateOffset
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior

    logger = logging.getLogger(__name__)

    # Diretório de save de planilhas
    xlsx_path_fluxo_debenture = full_path_from_database(
        "get_output_quadro419") + 'controle_fluxo_debentures.xlsx'

    #Diretório de save de planilhas
    save_path_fluxo_A = full_path_from_database(
        "get_output_quadro419") + 'bmf_fluxo_titprivado_A.xlsx'
    save_path_fluxo_B = full_path_from_database(
        "get_output_quadro419") + 'bmf_fluxo_titprivado_B.xlsx'
    save_path_fluxo_M = full_path_from_database(
        "get_output_quadro419") + 'bmf_fluxo_titprivado_M.xlsx'
    save_path_fluxo_Q = full_path_from_database(
        "get_output_quadro419") + 'bmf_fluxo_titprivado_Q.xlsx'
    save_path_fluxo_S = full_path_from_database(
        "get_output_quadro419") + 'bmf_fluxo_titprivado_S.xlsx'
    save_path_fluxo_W = full_path_from_database(
        "get_output_quadro419") + 'bmf_fluxo_titprivado_W.xlsx'
    save_path_fluxo_titprivado = full_path_from_database(
        "get_output_quadro419") + 'fluxo_titprivado.xlsx'

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    #dtbase = ['2016','11','30']
    dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]

    #2 - Cria conexão e importação: base de dados fluxo_titprivado

    #Conexão com Banco de Dados
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT * FROM projeto_inv.titprivado_caracteristicas WHERE data_expiracao > ' + '"' + dtbase_concat + '";'
    bmf_numeraca = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #3 - Preparação da base
    logger.info("Tratando dados")

    #Seleciona dados da última carga da data de relatório
    bmf_numeraca['dtrel'] = bmf_numeraca['id_papel'].str.split('_')
    bmf_numeraca['dtrel'] = bmf_numeraca['dtrel'].str[0]

    bmf_numeraca = bmf_numeraca[bmf_numeraca.dtrel == dtbase_concat].copy()
    bmf_numeraca = bmf_numeraca[bmf_numeraca.data_bd == max(
        bmf_numeraca.data_bd)]

    del bmf_numeraca['dtrel']

    bmf_numeraca = bmf_numeraca.reset_index(level=None,
                                            drop=True,
                                            inplace=False,
                                            col_level=0,
                                            col_fill='').copy()

    titprivado = bmf_numeraca.copy()

    #Guarda lista de todos os papéis para verificar no final se há papel faltando no fluxo
    lista_all = bmf_numeraca[['id_papel', 'codigo_isin']].copy()
    lista_all = lista_all.drop_duplicates(subset=['id_papel'])

    #excluir debêntures
    titprivado = titprivado[titprivado.tipo_ativo != 'DBS']
    #excluir debêntures conversíveis em ações ordinárias
    titprivado = titprivado[titprivado.tipo_ativo != 'DBO']
    #excluir debêntures conversíveis em ações preferenciais
    titprivado = titprivado[titprivado.tipo_ativo != 'DBP']
    #excluir debênures miscelâneas
    titprivado = titprivado[titprivado.tipo_ativo != 'DBM']

    #excluir títulos puúblicos
    titprivado = titprivado[titprivado.tipo_ativo != 'NTB']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTC']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTF']
    titprivado = titprivado[titprivado.tipo_ativo != 'LF']
    titprivado = titprivado[titprivado.tipo_ativo != 'LTN']
    titprivado = titprivado[titprivado.tipo_ativo != 'NI']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTP']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTA']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTD']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTE']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTH']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTJ']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTL']
    titprivado = titprivado[titprivado.tipo_ativo != 'NT']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTM']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTR']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTS']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTT']
    titprivado = titprivado[titprivado.tipo_ativo != 'NTU']

    #existem sujeiras na base de dados em relação a data de vencimento (expiracao), os quais são acima de 2100
    ano = datetime.datetime.now().year
    prazo_maximo = 80 + ano

    problema_cadastro = titprivado[
        titprivado.ano_expiracao.astype(float) > prazo_maximo]
    titprivado = titprivado[
        titprivado.ano_expiracao.astype(float) < prazo_maximo]

    titprivado = titprivado.reset_index(level=None,
                                        drop=True,
                                        inplace=False,
                                        col_level=0,
                                        col_fill='')

    titprivado = titprivado[[
        'codigo_isin', 'codigo_cetip', 'tipo_ativo', 'data_emissao',
        'data_expiracao', 'valor_nominal', 'taxa_juros', 'indexador',
        'percentual_indexador', 'cod_frequencia_juros',
        'data_primeiro_pagamento_juros', 'id_bmf_numeraca', 'flag', 'id_papel',
        'dtoperacao'
    ]].copy()

    #Caso o papel tenha um código de frequência de juros, preenche a primeira data de pagamento com a primeira data depois do periodo considerando o cod_frequencia_juros

    titprivado['data_emissao'] = pd.to_datetime(titprivado['data_emissao'])
    titprivado['data_primeiro_pagamento_juros'] = pd.to_datetime(
        titprivado['data_primeiro_pagamento_juros'])
    titprivado['data_expiracao'] = pd.to_datetime(titprivado['data_expiracao'])

    idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) &
                     (titprivado.cod_frequencia_juros == 'B')].index.tolist()
    for i in idx:
        titprivado['data_primeiro_pagamento_juros'][
            idx] = titprivado['data_emissao'][idx] + DateOffset(years=2)

    print(titprivado['data_primeiro_pagamento_juros'][idx])

    idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) &
                     (titprivado.cod_frequencia_juros == 'A')].index.tolist()
    for i in idx:
        titprivado['data_primeiro_pagamento_juros'][
            idx] = titprivado['data_emissao'][idx] + DateOffset(years=1)

    print(titprivado['data_primeiro_pagamento_juros'][idx])

    idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) &
                     (titprivado.cod_frequencia_juros == 'S')].index.tolist()
    for i in idx:
        titprivado['data_primeiro_pagamento_juros'][
            idx] = titprivado['data_emissao'][idx] + DateOffset(months=6)

    print(titprivado['data_primeiro_pagamento_juros'][idx])

    idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) &
                     (titprivado.cod_frequencia_juros == 'Q')].index.tolist()
    for i in idx:
        titprivado['data_primeiro_pagamento_juros'][
            idx] = titprivado['data_emissao'][idx] + DateOffset(months=3)

    print(titprivado['data_primeiro_pagamento_juros'][idx])

    idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) &
                     (titprivado.cod_frequencia_juros == 'M')].index.tolist()
    for i in idx:
        titprivado['data_primeiro_pagamento_juros'][
            idx] = titprivado['data_emissao'][idx] + DateOffset(months=1)

    print(titprivado['data_primeiro_pagamento_juros'][idx])

    idx = titprivado[(titprivado.data_primeiro_pagamento_juros.isnull()) &
                     (titprivado.cod_frequencia_juros == 'W')].index.tolist()
    for i in idx:
        titprivado['data_primeiro_pagamento_juros'][
            idx] = titprivado['data_emissao'][idx] + DateOffset(days=7)

    #A - ANUAL; B - BI-ANUAL; M – MENSAL; N - NÃO APLICÁVEL; Q – TRIMESTRAL; S – SEMESTRAL; W - SEMANAL X – OUTROS

    #Trasnforma papéis sem data de expiração em BULLET
    titprivado['data_primeiro_pagamento_juros'][
        titprivado.data_primeiro_pagamento_juros.isnull(
        )] = titprivado['data_expiracao'][
            titprivado.data_primeiro_pagamento_juros.isnull()]

    titprivado['data_primeiro_pagamento_juros'] = pd.to_datetime(
        titprivado['data_primeiro_pagamento_juros']).dt.date
    titprivado['data_emissao'] = pd.to_datetime(
        titprivado['data_emissao']).dt.date
    titprivado['data_expiracao'] = pd.to_datetime(
        titprivado['data_expiracao']).dt.date

    #Correção indexador
    titprivado['indexador'][titprivado.indexador == 'IAP'] = 'IPCA'
    titprivado['indexador'][titprivado.indexador == 'CDI'] = 'DI1'

    titprivado['cod_frequencia_juros'][titprivado.data_expiracao == titprivado.
                                       data_primeiro_pagamento_juros] = None

    bmf_fluxo_titprivado_A = pd.DataFrame(columns=[
        'codigo_isin', 'codigo_cetip', 'tipo_ativo', 'data_emissao',
        'data_expiracao', 'valor_nominal', 'taxa_juros', 'indexador',
        'percentual_indexador', 'cod_frequencia_juros',
        'data_primeiro_pagamento_juros', 'id_bmf_numeraca', 'data_bd',
        'dt_ref', 'flag', 'id_papel', 'dtoperacao'
    ])

    bmf_fluxo_titprivado_B = bmf_fluxo_titprivado_A.copy()
    bmf_fluxo_titprivado_S = bmf_fluxo_titprivado_A.copy()
    bmf_fluxo_titprivado_Q = bmf_fluxo_titprivado_A.copy()
    bmf_fluxo_titprivado_M = bmf_fluxo_titprivado_A.copy()
    bmf_fluxo_titprivado_W = bmf_fluxo_titprivado_A.copy()

    data_bd = datetime.datetime.now()

    #4 - Gera fluxo de papéis cod_frequencia_juros = "A": ANUAL

    titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'A')
                                & (titprivado.data_primeiro_pagamento_juros !=
                                   titprivado.data_expiracao)].copy()
    titprivado_aux = titprivado_aux.reset_index(level=None,
                                                drop=True,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')

    i1 = 0
    for i in range(0, len(titprivado_aux)):
        qtde = 0
        vencto = pd.to_datetime(
            titprivado_aux['data_primeiro_pagamento_juros'][i])

        #Criar o intervalo de tempo
        fatormensal = 12
        fatordiario = 0

        #Preenche o fluxo
        bmf_fluxo_titprivado_A.loc[i + i1] = [
            titprivado_aux['codigo_isin'][i],
            titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i],
            titprivado_aux['data_emissao'][i],
            titprivado_aux['data_expiracao'][i],
            titprivado_aux['valor_nominal'][i],
            titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i],
            titprivado_aux['percentual_indexador'][i],
            titprivado_aux['cod_frequencia_juros'][i],
            titprivado_aux['data_primeiro_pagamento_juros'][i],
            titprivado_aux['id_bmf_numeraca'][i], data_bd,
            titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i],
            titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i]
        ]

        i1 = i1 + 1
        temp = titprivado_aux['data_expiracao'][i]
        while (pd.to_datetime(temp) > vencto
               ):  #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))):
            qtde = qtde + 1
            temp = titprivado_aux['data_expiracao'][i] - DateOffset(
                months=fatormensal * qtde, days=fatordiario * qtde)
            temp = datetime.date(temp.year, temp.month, temp.day)
            bmf_fluxo_titprivado_A.loc[i + i1] = [
                titprivado_aux['codigo_isin'][i],
                titprivado_aux['codigo_cetip'][i],
                titprivado_aux['tipo_ativo'][i],
                titprivado_aux['data_emissao'][i],
                titprivado_aux['data_expiracao'][i],
                titprivado_aux['valor_nominal'][i],
                titprivado_aux['taxa_juros'][i],
                titprivado_aux['indexador'][i],
                titprivado_aux['percentual_indexador'][i],
                titprivado_aux['cod_frequencia_juros'][i],
                titprivado_aux['data_primeiro_pagamento_juros'][i],
                titprivado_aux['id_bmf_numeraca'][i], data_bd, temp,
                titprivado_aux['flag'][i], titprivado_aux['id_papel'][i],
                titprivado_aux['dtoperacao'][i]
            ]
            i1 = i1 + 1

    bmf_fluxo_titprivado_A.to_excel(save_path_fluxo_A)

    #5 - Gera fluxo de papéis cod_frequencia_juros = "B": BIANUAL
    titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'B')
                                & (titprivado.data_primeiro_pagamento_juros !=
                                   titprivado.data_expiracao)].copy()
    titprivado_aux = titprivado_aux.reset_index(level=None,
                                                drop=True,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')

    i1 = 0
    for i in range(0, len(titprivado_aux)):
        qtde = 0
        vencto = pd.to_datetime(
            titprivado_aux['data_primeiro_pagamento_juros'][i])

        #Criar o intervalo de tempo
        fatormensal = 24
        fatordiario = 0

        #Preenche o fluxo
        bmf_fluxo_titprivado_B.loc[i + i1] = [
            titprivado_aux['codigo_isin'][i],
            titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i],
            titprivado_aux['data_emissao'][i],
            titprivado_aux['data_expiracao'][i],
            titprivado_aux['valor_nominal'][i],
            titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i],
            titprivado_aux['percentual_indexador'][i],
            titprivado_aux['cod_frequencia_juros'][i],
            titprivado_aux['data_primeiro_pagamento_juros'][i],
            titprivado_aux['id_bmf_numeraca'][i], data_bd,
            titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i],
            titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i]
        ]

        i1 = i1 + 1
        temp = titprivado_aux['data_expiracao'][i]
        while (pd.to_datetime(temp) > vencto
               ):  #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))):
            qtde = qtde + 1
            temp = titprivado_aux['data_expiracao'][i] - DateOffset(
                months=fatormensal * qtde, days=fatordiario * qtde)
            temp = datetime.date(temp.year, temp.month, temp.day)
            bmf_fluxo_titprivado_B.loc[i + i1] = [
                titprivado_aux['codigo_isin'][i],
                titprivado_aux['codigo_cetip'][i],
                titprivado_aux['tipo_ativo'][i],
                titprivado_aux['data_emissao'][i],
                titprivado_aux['data_expiracao'][i],
                titprivado_aux['valor_nominal'][i],
                titprivado_aux['taxa_juros'][i],
                titprivado_aux['indexador'][i],
                titprivado_aux['percentual_indexador'][i],
                titprivado_aux['cod_frequencia_juros'][i],
                titprivado_aux['data_primeiro_pagamento_juros'][i],
                titprivado_aux['id_bmf_numeraca'][i], data_bd, temp,
                titprivado_aux['flag'][i], titprivado_aux['id_papel'][i],
                titprivado_aux['dtoperacao'][i]
            ]
            i1 = i1 + 1

    bmf_fluxo_titprivado_B.to_excel(save_path_fluxo_B)

    #6 - Gera fluxo de papéis cod_frequencia_juros = "M": MENSAL
    titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'M')
                                & (titprivado.data_primeiro_pagamento_juros !=
                                   titprivado.data_expiracao)].copy()
    titprivado_aux = titprivado_aux.reset_index(level=None,
                                                drop=True,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')

    i1 = 0
    for i in range(0, len(titprivado_aux)):
        qtde = 0
        vencto = pd.to_datetime(
            titprivado_aux['data_primeiro_pagamento_juros'][i])

        #Criar o intervalo de tempo
        fatormensal = 1
        fatordiario = 0

        #Preenche o fluxo
        bmf_fluxo_titprivado_M.loc[i + i1] = [
            titprivado_aux['codigo_isin'][i],
            titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i],
            titprivado_aux['data_emissao'][i],
            titprivado_aux['data_expiracao'][i],
            titprivado_aux['valor_nominal'][i],
            titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i],
            titprivado_aux['percentual_indexador'][i],
            titprivado_aux['cod_frequencia_juros'][i],
            titprivado_aux['data_primeiro_pagamento_juros'][i],
            titprivado_aux['id_bmf_numeraca'][i], data_bd,
            titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i],
            titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i]
        ]

        i1 = i1 + 1
        temp = titprivado_aux['data_expiracao'][i]
        while (pd.to_datetime(temp) > vencto
               ):  #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))):
            qtde = qtde + 1
            temp = titprivado_aux['data_expiracao'][i] - DateOffset(
                months=fatormensal * qtde, days=fatordiario * qtde)
            temp = datetime.date(temp.year, temp.month, temp.day)
            bmf_fluxo_titprivado_M.loc[i + i1] = [
                titprivado_aux['codigo_isin'][i],
                titprivado_aux['codigo_cetip'][i],
                titprivado_aux['tipo_ativo'][i],
                titprivado_aux['data_emissao'][i],
                titprivado_aux['data_expiracao'][i],
                titprivado_aux['valor_nominal'][i],
                titprivado_aux['taxa_juros'][i],
                titprivado_aux['indexador'][i],
                titprivado_aux['percentual_indexador'][i],
                titprivado_aux['cod_frequencia_juros'][i],
                titprivado_aux['data_primeiro_pagamento_juros'][i],
                titprivado_aux['id_bmf_numeraca'][i], data_bd, temp,
                titprivado_aux['flag'][i], titprivado_aux['id_papel'][i],
                titprivado_aux['dtoperacao'][i]
            ]
            i1 = i1 + 1

    bmf_fluxo_titprivado_M.to_excel(save_path_fluxo_M)

    #7 - Gera fluxo de papéis cod_frequencia_juros = "Q": TRIMESTRAL
    titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'Q')
                                & (titprivado.data_primeiro_pagamento_juros !=
                                   titprivado.data_expiracao)].copy()
    titprivado_aux = titprivado_aux.reset_index(level=None,
                                                drop=True,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')

    i1 = 0
    for i in range(0, len(titprivado_aux)):
        qtde = 0
        vencto = pd.to_datetime(
            titprivado_aux['data_primeiro_pagamento_juros'][i])

        #Criar o intervalo de tempo
        fatormensal = 3
        fatordiario = 0

        #Preenche o fluxo
        bmf_fluxo_titprivado_Q.loc[i + i1] = [
            titprivado_aux['codigo_isin'][i],
            titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i],
            titprivado_aux['data_emissao'][i],
            titprivado_aux['data_expiracao'][i],
            titprivado_aux['valor_nominal'][i],
            titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i],
            titprivado_aux['percentual_indexador'][i],
            titprivado_aux['cod_frequencia_juros'][i],
            titprivado_aux['data_primeiro_pagamento_juros'][i],
            titprivado_aux['id_bmf_numeraca'][i], data_bd,
            titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i],
            titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i]
        ]

        i1 = i1 + 1
        temp = titprivado_aux['data_expiracao'][i]
        while (pd.to_datetime(temp) > vencto
               ):  #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))):
            qtde = qtde + 1
            temp = titprivado_aux['data_expiracao'][i] - DateOffset(
                months=fatormensal * qtde, days=fatordiario * qtde)
            temp = datetime.date(temp.year, temp.month, temp.day)
            bmf_fluxo_titprivado_Q.loc[i + i1] = [
                titprivado_aux['codigo_isin'][i],
                titprivado_aux['codigo_cetip'][i],
                titprivado_aux['tipo_ativo'][i],
                titprivado_aux['data_emissao'][i],
                titprivado_aux['data_expiracao'][i],
                titprivado_aux['valor_nominal'][i],
                titprivado_aux['taxa_juros'][i],
                titprivado_aux['indexador'][i],
                titprivado_aux['percentual_indexador'][i],
                titprivado_aux['cod_frequencia_juros'][i],
                titprivado_aux['data_primeiro_pagamento_juros'][i],
                titprivado_aux['id_bmf_numeraca'][i], data_bd, temp,
                titprivado_aux['flag'][i], titprivado_aux['id_papel'][i],
                titprivado_aux['dtoperacao'][i]
            ]
            i1 = i1 + 1

    bmf_fluxo_titprivado_Q.to_excel(save_path_fluxo_Q)

    #8 - Gera fluxo de papéis cod_frequencia_juros = "S": SEMESTRAL
    titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'S')
                                & (titprivado.data_primeiro_pagamento_juros !=
                                   titprivado.data_expiracao)].copy()
    titprivado_aux = titprivado_aux.reset_index(level=None,
                                                drop=True,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')

    i1 = 0
    for i in range(0, len(titprivado_aux)):
        qtde = 0
        vencto = pd.to_datetime(
            titprivado_aux['data_primeiro_pagamento_juros'][i])

        #Criar o intervalo de tempo
        fatormensal = 6
        fatordiario = 0

        #Preenche o fluxo
        bmf_fluxo_titprivado_S.loc[i + i1] = [
            titprivado_aux['codigo_isin'][i],
            titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i],
            titprivado_aux['data_emissao'][i],
            titprivado_aux['data_expiracao'][i],
            titprivado_aux['valor_nominal'][i],
            titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i],
            titprivado_aux['percentual_indexador'][i],
            titprivado_aux['cod_frequencia_juros'][i],
            titprivado_aux['data_primeiro_pagamento_juros'][i],
            titprivado_aux['id_bmf_numeraca'][i], data_bd,
            titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i],
            titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i]
        ]

        i1 = i1 + 1
        temp = titprivado_aux['data_expiracao'][i]
        while (pd.to_datetime(temp) > vencto
               ):  #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))):
            qtde = qtde + 1
            temp = titprivado_aux['data_expiracao'][i] - DateOffset(
                months=fatormensal * qtde, days=fatordiario * qtde)
            temp = datetime.date(temp.year, temp.month, temp.day)
            bmf_fluxo_titprivado_S.loc[i + i1] = [
                titprivado_aux['codigo_isin'][i],
                titprivado_aux['codigo_cetip'][i],
                titprivado_aux['tipo_ativo'][i],
                titprivado_aux['data_emissao'][i],
                titprivado_aux['data_expiracao'][i],
                titprivado_aux['valor_nominal'][i],
                titprivado_aux['taxa_juros'][i],
                titprivado_aux['indexador'][i],
                titprivado_aux['percentual_indexador'][i],
                titprivado_aux['cod_frequencia_juros'][i],
                titprivado_aux['data_primeiro_pagamento_juros'][i],
                titprivado_aux['id_bmf_numeraca'][i], data_bd, temp,
                titprivado_aux['flag'][i], titprivado_aux['id_papel'][i],
                titprivado_aux['dtoperacao'][i]
            ]
            i1 = i1 + 1

    bmf_fluxo_titprivado_S.to_excel(save_path_fluxo_S)

    #9 - Gera fluxo de papéis cod_frequencia_juros = "W": SEMANAL
    titprivado_aux = titprivado[(titprivado['cod_frequencia_juros'] == 'W')
                                & (titprivado.data_primeiro_pagamento_juros !=
                                   titprivado.data_expiracao)].copy()
    titprivado_aux = titprivado_aux.reset_index(level=None,
                                                drop=True,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')

    i1 = 0
    for i in range(0, len(titprivado_aux)):
        qtde = 0
        vencto = pd.to_datetime(
            titprivado_aux['data_primeiro_pagamento_juros'][i])

        #Criar o intervalo de tempo
        fatormensal = 0
        fatordiario = 7

        #Preenche o fluxo
        bmf_fluxo_titprivado_W.loc[i + i1] = [
            titprivado_aux['codigo_isin'][i],
            titprivado_aux['codigo_cetip'][i], titprivado_aux['tipo_ativo'][i],
            titprivado_aux['data_emissao'][i],
            titprivado_aux['data_expiracao'][i],
            titprivado_aux['valor_nominal'][i],
            titprivado_aux['taxa_juros'][i], titprivado_aux['indexador'][i],
            titprivado_aux['percentual_indexador'][i],
            titprivado_aux['cod_frequencia_juros'][i],
            titprivado_aux['data_primeiro_pagamento_juros'][i],
            titprivado_aux['id_bmf_numeraca'][i], data_bd,
            titprivado_aux['data_expiracao'][i], titprivado_aux['flag'][i],
            titprivado_aux['id_papel'][i], titprivado_aux['dtoperacao'][i]
        ]

        i1 = i1 + 1
        temp = titprivado_aux['data_expiracao'][i]
        while (pd.to_datetime(temp) > vencto
               ):  #(pd.to_datetime(titprivado_aux['data_expiracao'][i]))):
            qtde = qtde + 1
            temp = titprivado_aux['data_expiracao'][i] - DateOffset(
                months=fatormensal * qtde, days=fatordiario * qtde)
            temp = datetime.date(temp.year, temp.month, temp.day)
            bmf_fluxo_titprivado_W.loc[i + i1] = [
                titprivado_aux['codigo_isin'][i],
                titprivado_aux['codigo_cetip'][i],
                titprivado_aux['tipo_ativo'][i],
                titprivado_aux['data_emissao'][i],
                titprivado_aux['data_expiracao'][i],
                titprivado_aux['valor_nominal'][i],
                titprivado_aux['taxa_juros'][i],
                titprivado_aux['indexador'][i],
                titprivado_aux['percentual_indexador'][i],
                titprivado_aux['cod_frequencia_juros'][i],
                titprivado_aux['data_primeiro_pagamento_juros'][i],
                titprivado_aux['id_bmf_numeraca'][i], data_bd, temp,
                titprivado_aux['flag'][i], titprivado_aux['id_papel'][i],
                titprivado_aux['dtoperacao'][i]
            ]
            i1 = i1 + 1

    bmf_fluxo_titprivado_W.to_excel(save_path_fluxo_W)

    #10 - Gera fluxo de papéis cod_frequencia_juros = OUTROS, NÃO APLICAVEIS, BULLET
    #cod_frequencia_juros
    #A - ANUAL; B - BI-ANUAL; M – MENSAL; N - NÃO APLICÁVEL; Q – TRIMESTRAL; S – SEMESTRAL; W - SEMANAL X – OUTROS
    del titprivado_aux

    titprivado_aux = titprivado[
        titprivado['cod_frequencia_juros'] != 'A'].copy()
    titprivado_aux = titprivado_aux[
        titprivado_aux['cod_frequencia_juros'] != 'B'].copy()
    titprivado_aux = titprivado_aux[
        titprivado_aux['cod_frequencia_juros'] != 'M'].copy()
    titprivado_aux = titprivado_aux[
        titprivado_aux['cod_frequencia_juros'] != 'Q'].copy()
    titprivado_aux = titprivado_aux[
        titprivado_aux['cod_frequencia_juros'] != 'S'].copy()
    titprivado_aux = titprivado_aux[
        titprivado_aux['cod_frequencia_juros'] != 'W'].copy()
    titprivado_aux = titprivado_aux.reset_index(level=None,
                                                drop=True,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')

    bmf_fluxo_titprivado_aux = pd.DataFrame(columns=[
        'codigo_isin', 'codigo_cetip', 'tipo_ativo', 'data_emissao',
        'data_expiracao', 'valor_nominal', 'taxa_juros', 'indexador',
        'percentual_indexador', 'cod_frequencia_juros',
        'data_primeiro_pagamento_juros', 'id_bmf_numeraca', 'data_bd',
        'dt_ref', 'flag', 'id_papel', 'dtoperacao'
    ])

    bmf_fluxo_titprivado_aux['codigo_isin'] = titprivado_aux['codigo_isin']
    bmf_fluxo_titprivado_aux['codigo_cetip'] = titprivado_aux['codigo_cetip']
    bmf_fluxo_titprivado_aux['tipo_ativo'] = titprivado_aux['tipo_ativo']
    bmf_fluxo_titprivado_aux['data_emissao'] = titprivado_aux['data_emissao']
    bmf_fluxo_titprivado_aux['data_expiracao'] = titprivado_aux[
        'data_expiracao']
    bmf_fluxo_titprivado_aux['valor_nominal'] = titprivado_aux['valor_nominal']
    bmf_fluxo_titprivado_aux['taxa_juros'] = titprivado_aux['taxa_juros']
    bmf_fluxo_titprivado_aux['indexador'] = titprivado_aux['indexador']
    bmf_fluxo_titprivado_aux['percentual_indexador'] = titprivado_aux[
        'percentual_indexador']
    bmf_fluxo_titprivado_aux['cod_frequencia_juros'] = titprivado_aux[
        'cod_frequencia_juros']
    bmf_fluxo_titprivado_aux['data_primeiro_pagamento_juros'] = titprivado_aux[
        'data_expiracao']
    bmf_fluxo_titprivado_aux['id_bmf_numeraca'] = titprivado_aux[
        'id_bmf_numeraca']
    bmf_fluxo_titprivado_aux['data_bd'] = data_bd
    bmf_fluxo_titprivado_aux['dt_ref'] = titprivado_aux['data_expiracao']
    bmf_fluxo_titprivado_aux['flag'] = titprivado_aux['flag']
    bmf_fluxo_titprivado_aux['id_papel'] = titprivado_aux['id_papel']
    bmf_fluxo_titprivado_aux['dtoperacao'] = titprivado_aux['dtoperacao']

    bmf_fluxo_titprivado = bmf_fluxo_titprivado_aux.copy()
    bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_A)
    bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_B)
    bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_S)
    bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_Q)
    bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_M)
    bmf_fluxo_titprivado = bmf_fluxo_titprivado.append(bmf_fluxo_titprivado_W)
    del bmf_fluxo_titprivado_aux

    bmf_fluxo_titprivado['dif'] = bmf_fluxo_titprivado[
        'dt_ref'] - bmf_fluxo_titprivado['data_primeiro_pagamento_juros']
    bmf_fluxo_titprivado['dif'] = bmf_fluxo_titprivado['dif'] / np.timedelta64(
        1, 'D')
    bmf_fluxo_titprivado['dif'] = bmf_fluxo_titprivado['dif'].astype(int)

    bmf_fluxo_titprivado = bmf_fluxo_titprivado[(bmf_fluxo_titprivado.dif >
                                                 -6)]
    del bmf_fluxo_titprivado['dif']

    bmf_fluxo_titprivado['juros_tipo'] = 'liquidate'
    bmf_fluxo_titprivado['percentual_juros'] = 1
    bmf_fluxo_titprivado['index_tipo'] = 'liquidate'
    bmf_fluxo_titprivado['percentual_index'] = 1
    bmf_fluxo_titprivado['tipo'] = 'vna'

    bmf_fluxo_titprivado['tipo_capitalizacao'] = 'Exponencial'
    bmf_fluxo_titprivado['dt_inicio_rentab'] = bmf_fluxo_titprivado[
        'data_emissao']
    bmf_fluxo_titprivado['juros_cada'] = bmf_fluxo_titprivado['codigo_isin']
    bmf_fluxo_titprivado['juros_cada'] = None
    bmf_fluxo_titprivado['juros_cada'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'A'] = 12
    bmf_fluxo_titprivado['juros_cada'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'B'] = 24
    bmf_fluxo_titprivado['juros_cada'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'S'] = 6
    bmf_fluxo_titprivado['juros_cada'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'M'] = 1
    bmf_fluxo_titprivado['juros_cada'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'Q'] = 3
    bmf_fluxo_titprivado['juros_cada'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'W'] = 7
    bmf_fluxo_titprivado['juros_cada'][
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'A')
        & (bmf_fluxo_titprivado.cod_frequencia_juros != 'B') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'S') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'M') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'Q') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'W')] = 0
    bmf_fluxo_titprivado['juros_unidade'] = bmf_fluxo_titprivado['codigo_isin']
    bmf_fluxo_titprivado['juros_unidade'] = None
    bmf_fluxo_titprivado['juros_unidade'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'A'] = 'MES'
    bmf_fluxo_titprivado['juros_unidade'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'B'] = 'MES'
    bmf_fluxo_titprivado['juros_unidade'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'S'] = 'MES'
    bmf_fluxo_titprivado['juros_unidade'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'M'] = 'MES'
    bmf_fluxo_titprivado['juros_unidade'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'Q'] = 'MES'
    bmf_fluxo_titprivado['juros_unidade'][
        bmf_fluxo_titprivado.cod_frequencia_juros == 'W'] = 'DIA'
    bmf_fluxo_titprivado['juros_cada'][
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'A')
        & (bmf_fluxo_titprivado.cod_frequencia_juros != 'B') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'S') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'M') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'Q') &
        (bmf_fluxo_titprivado.cod_frequencia_juros != 'W')] = None
    bmf_fluxo_titprivado['juros_dc_du'] = 252
    bmf_fluxo_titprivado['indexador_dc_du'] = 252

    #Inverte a coluna codigo_isin pela id_papel
    bmf_fluxo_titprivado['codigo_isin_temp'] = bmf_fluxo_titprivado[
        'codigo_isin']
    bmf_fluxo_titprivado['codigo_isin'] = bmf_fluxo_titprivado['id_papel']
    bmf_fluxo_titprivado['id_papel'] = bmf_fluxo_titprivado['codigo_isin_temp']

    #Premissa: toda vez que paga juros, paga principal
    bmf_fluxo_amort = bmf_fluxo_titprivado[bmf_fluxo_titprivado['juros_tipo']
                                           == 'liquidate'].copy()
    quantidade = bmf_fluxo_amort[[
        'codigo_isin', 'data_emissao', 'data_expiracao', 'juros_tipo'
    ]].groupby(['codigo_isin', 'data_emissao',
                'data_expiracao']).agg(['count'])
    quantidade = quantidade.reset_index(level=None,
                                        drop=False,
                                        inplace=False,
                                        col_level=0,
                                        col_fill='')
    qtde_amort = pd.DataFrame(columns=[
        'codigo_isin', 'data_emissao', 'data_expiracao', 'qtde_amortizacao'
    ])

    qtde_amort['codigo_isin'] = quantidade['codigo_isin']
    qtde_amort['data_emissao'] = quantidade['data_emissao']
    qtde_amort['data_expiracao'] = quantidade['data_expiracao']
    qtde_amort['qtde_amortizacao'] = quantidade['juros_tipo']
    qtde_amort['juros_tipo'] = 'liquidate'
    qtde_amort['perc_amortizacao'] = 1 / qtde_amort['qtde_amortizacao'] * 100
    del qtde_amort['qtde_amortizacao']

    bmf_fluxo_titprivado = bmf_fluxo_titprivado.merge(
        qtde_amort,
        on=['codigo_isin', 'data_emissao', 'data_expiracao', 'juros_tipo'],
        how='left')

    bmf_fluxo_titprivado['perc_amortizacao'][
        (bmf_fluxo_titprivado.tipo_ativo == 'LH') |
        (bmf_fluxo_titprivado.tipo_ativo == 'LFI') |
        (bmf_fluxo_titprivado.tipo_ativo == 'LFN') |
        (bmf_fluxo_titprivado.tipo_ativo == 'C') |
        (bmf_fluxo_titprivado.tipo_ativo == 'CDB') |
        (bmf_fluxo_titprivado.tipo_ativo == 'DP')] = 0
    bmf_fluxo_titprivado['perc_amortizacao'][
        (bmf_fluxo_titprivado.dt_ref == bmf_fluxo_titprivado.data_expiracao)
        & ((bmf_fluxo_titprivado.tipo_ativo == 'LH')
           | (bmf_fluxo_titprivado.tipo_ativo == 'LFI')
           | (bmf_fluxo_titprivado.tipo_ativo == 'LFN')
           | (bmf_fluxo_titprivado.tipo_ativo == 'C')
           | (bmf_fluxo_titprivado.tipo_ativo == 'CDB')
           | (bmf_fluxo_titprivado.tipo_ativo == 'DP'))] = 1

    #Reinverte a coluna codigo_isin pela id_papel
    bmf_fluxo_titprivado['codigo_isin_temp'] = bmf_fluxo_titprivado[
        'codigo_isin']
    bmf_fluxo_titprivado['codigo_isin'] = bmf_fluxo_titprivado['id_papel']
    bmf_fluxo_titprivado['id_papel'] = bmf_fluxo_titprivado['codigo_isin_temp']

    bmf_fluxo_titprivado = bmf_fluxo_titprivado.sort(['id_papel', 'dt_ref'],
                                                     ascending=[True, True])

    del bmf_fluxo_titprivado['codigo_isin_temp']

    lista_final = bmf_fluxo_titprivado[['id_papel', 'codigo_isin']].copy()
    lista_final = lista_final.drop_duplicates(subset=['id_papel'])
    lista_final['marker'] = 1
    lista = lista_all.merge(lista_final,
                            on=['id_papel', 'codigo_isin'],
                            how='left')

    #Salvar no MySQL
    logger.info("Salvando base de dados - fluxo_titprivado")
    pd.io.sql.to_sql(bmf_fluxo_titprivado,
                     name='fluxo_titprivado',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexão
    connection.close()

    bmf_fluxo_titprivado.to_excel(save_path_fluxo_titprivado)
示例#8
0
def matriz_gerencial_1():

    import pymysql as db
    import datetime
    import numpy as np
    import pandas as pd
    import logging
    import pickle

    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import get_global_var

    #Define variáveis:
    logger = logging.getLogger(__name__)
    save_path = full_path_from_database("get_output_var")
    dt_base = get_data_ultimo_dia_util_mes_anterior()
    data_final = str(dt_base[0]) + '-' + str(dt_base[1]) + '-' + str(
        dt_base[2])
    #data_final = '2016-11-30'
    dt_base = dt_base[0] + dt_base[1] + dt_base[2]
    #dt_base = '20161130'
    data_inicial = "2010-03-31"
    retornos_path = full_path_from_database("pickles")

    #################################################################################################################
    # VARIÁVEL PRECISA SER PARAMETRIZADA DE ACORDO COM O CÓDIGO GERADO NO SCRIPT 17-XML_QUADRO_OPERACOES_NAO_ORG.PY
    id_relatorio_quaid419 = get_global_var("id_qua419")
    #id_relatorio_quaid419 = '3650' # para novembro
    #################################################################################################################

    #Cotas cujo histórico é ruim
    lista_fundos_excluidos = [
        'BRBVEPCTF002', 'BRFCLGCTF007', 'BRFCLGCTF015', 'BROLGSCTF005',
        'BRSNGSCTF002', 'BRMBVACTF007', 'BRINSBCTF020', 'BRVCCDCTF000'
    ]

    #Definição Lambdas
    lista_lambdas = {
        'PRE': 92,
        'DIC': 94,
        'DIM': 85,
        'DP': 73,
        'TP': 97,
        "TR": 97,
        "IPCA": 94,
        "IGPM": 86,
        "Dólar": 78,
        "Bovespa": 95,
        "ICB": 95
    }

    #Ajuste datas
    data_inicial = datetime.datetime.strptime(data_inicial, "%Y-%m-%d").date()
    data_final = datetime.datetime.strptime(data_final, "%Y-%m-%d").date()

    #Conecta no DB
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    #start_time = time.time()
    #matriz_teste = pd.read_sql_query('SELECT t.* FROM ( SELECT codigo_isin, MAX(data_bd) AS max_data FROM bmf_numeraca GROUP BY codigo_isin ) AS m INNER JOIN bmf_numeraca AS t ON t.codigo_isin = m.codigo_isin AND t.data_bd = m.max_data', connection)
    #elapsed_time = time.time() - start_time
    #print (elapsed_time)

    logger.info("Tratando dados")
    # Consulta valores das séries
    dados_curvas = pd.read_sql_query(
        'SELECT * FROM projeto_inv.curva_ettj_vertices_fixos', connection)
    dados_bacen = pd.read_sql_query('SELECT * FROM projeto_inv.bacen_series',
                                    connection)
    dados_cotas1 = pd.read_sql_query(
        'SELECT * FROM projeto_inv.valoreconomico_cotas', connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Remove duplicados
    dados_cotas1 = dados_cotas1.sort(['cota', 'dt_ref', 'data_bd'],
                                     ascending=[True, True, True])
    dados_cotas1 = dados_cotas1.drop_duplicates(subset=['cota', 'dt_ref'],
                                                take_last=True)

    data_bd = dados_cotas1['data_bd'].iloc[0]

    #Remove duplicados
    dados_bacen = dados_bacen.sort(['data_referencia', 'codigo', 'data_bd'],
                                   ascending=[True, True, True])
    dados_bacen = dados_bacen.drop_duplicates(
        subset=['codigo', 'data_referencia'], take_last=True)

    #Lê arquivo BRSND2CTF000.xlsx
    dados_cotas = pd.read_excel(
        full_path_from_database("excels") + 'BRSND2CTF000.xlsx')
    logger.info("Arquivos lidos com sucesso")

    logger.info("Tratando dados")

    dados_cotas['dt_ref'] = dados_cotas['dt_ref'].astype(str)
    dados_cotas['dt_ref'] = dados_cotas['dt_ref'].str.split('/')
    dados_cotas['ano'] = dados_cotas['dt_ref'].str[2]
    dados_cotas['mes'] = dados_cotas['dt_ref'].str[1]
    dados_cotas['dia'] = dados_cotas['dt_ref'].str[0]
    dados_cotas['dt_ref'] = pd.to_datetime('20' + dados_cotas['ano'] +
                                           dados_cotas['mes'] +
                                           dados_cotas['dia']).dt.date
    del dados_cotas['ano']
    del dados_cotas['mes']
    dados_cotas['data_bd'] = None
    dados_cotas['data_bd'] = dados_cotas['data_bd'].fillna(data_bd)
    dados_cotas = dados_cotas.append(dados_cotas1)
    dados_cotas = dados_cotas.drop_duplicates(subset=['isin_fundo', 'dt_ref'])

    ## Filtrar datas para estimativa
    dados_curvas = dados_curvas[(dados_curvas["dt_ref"] < data_final)
                                & (dados_curvas["dt_ref"] > data_inicial)]
    dados_bacen = dados_bacen[(dados_bacen["data_referencia"] < data_final) &
                              (dados_bacen["data_referencia"] > data_inicial)]
    dados_cotas = dados_cotas[(dados_cotas["dt_ref"] < data_final)
                              & (dados_cotas["dt_ref"] > data_inicial)]

    #Ajusta o nome de duas colunas
    dados_bacen['nome'] = np.where(dados_bacen['codigo'] == 7,
                                   'Bovespa - índice', dados_bacen['nome'])
    dados_bacen['nome'] = np.where(dados_bacen['codigo'] == 1,
                                   'Dólar comercial (venda)',
                                   dados_bacen['nome'])

    #Tira os índices mensais
    dados_bacen = dados_bacen[dados_bacen['frequencia'] != "M"].copy()

    dados_cotas_chamber = dados_cotas[dados_cotas['isin_fundo'].isin(
        lista_fundos_excluidos)].copy()
    dados_cotas_chamber['codigo'] = 7
    dados_cotas_chamber = dados_cotas_chamber[['isin_fundo', 'codigo']].copy()
    dados_cotas_chamber = dados_cotas_chamber.drop_duplicates()

    chamber_corr = dados_bacen[dados_bacen['codigo'] == 7].copy()

    dados_cotas_chamber = pd.merge(chamber_corr,
                                   dados_cotas_chamber,
                                   right_on=['codigo'],
                                   left_on=['codigo'],
                                   how='left')

    dados_cotas_chamber['nome'] = dados_cotas_chamber['isin_fundo']

    for i in lista_fundos_excluidos:
        dados_cotas_chamber['codigo'] = np.where(
            dados_cotas_chamber['nome'].isin([i]), np.random.rand(),
            dados_cotas_chamber['codigo'])

    dados_cotas_chamber['codigo'] = dados_cotas_chamber['codigo'] * 100000
    dados_cotas_chamber['codigo'] = dados_cotas_chamber['codigo'].astype(int)

    del dados_cotas_chamber['isin_fundo']

    dados_bacen = dados_bacen.append(dados_cotas_chamber)
    dados_cotas = dados_cotas[~dados_cotas['isin_fundo'].
                              isin(lista_fundos_excluidos)].copy()

    #Leitura e tratamento das variancias da bmfbovespa - seleciona apenas as ações da carteira
    dados_vol_bmf = pd.read_excel(
        full_path_from_database("bvmf") + 'volatilidade_bmf_' + dt_base +
        '.xlsx')
    logger.info("Arquivos lidos com sucesso")

    dados_vol_bmf.columns = [
        'codigo_negociacao', 'nome_empresa', 'preco_fechamento', 'ewma_anual'
    ]

    acoes_ibov = pd.read_excel(
        full_path_from_database("bvmf") + 'Composição_ibovespa_' + dt_base +
        '.xlsx')
    logger.info("Arquivos lidos com sucesso")

    acoes_ibov.columns = ['codigo', '1', '2', '3', '4']
    acoes_ibov['codigo'] = acoes_ibov['codigo']

    quaid_419 = pd.read_sql_query(
        'SELECT * from projeto_inv.quaid_419 where id_relatorio_quaid419=' +
        str(id_relatorio_quaid419) + ' and FTRCODIGO = "AA1"', connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    quaid_419 = quaid_419[quaid_419['data_bd'] == max(quaid_419['data_bd'])]
    quaid_419 = quaid_419.rename(columns={
        'EMFCODCUSTODIA': 'codigo',
        'EMFCODISIN': '2'
    })
    quaid_419 = quaid_419[['codigo', '2']].copy()

    acoes_ibov = acoes_ibov.append(quaid_419)

    lista_acoes = acoes_ibov['codigo'].unique()

    dados_vol_bmf = dados_vol_bmf[dados_vol_bmf.codigo_negociacao.isin(
        lista_acoes)].copy()

    dados_vol_bmf['codigo'] = 7

    del dados_vol_bmf['nome_empresa']
    del dados_vol_bmf['preco_fechamento']
    del dados_vol_bmf['ewma_anual']

    chamber_corr = dados_bacen[dados_bacen['codigo'] == 7].copy()

    dados_vol_bmf = pd.merge(chamber_corr,
                             dados_vol_bmf,
                             right_on=['codigo'],
                             left_on=['codigo'],
                             how='left')
    dados_vol_bmf['nome'] = dados_vol_bmf['codigo_negociacao'] + '_1'

    for i in lista_acoes:
        dados_vol_bmf['codigo'] = np.where(
            dados_vol_bmf['nome'].isin([i + '_1']), np.random.rand(),
            dados_vol_bmf['codigo'])

    dados_vol_bmf['codigo'] = dados_vol_bmf['codigo'] * 100000
    dados_vol_bmf['codigo'] = dados_vol_bmf['codigo'].astype(int)

    del dados_vol_bmf['codigo_negociacao']

    dados_bacen = dados_bacen.append(dados_vol_bmf)

    ## Lista de séries do Bacen a ser utlizada
    aux1 = dados_vol_bmf[['codigo', 'nome']].copy()
    aux1 = aux1.drop_duplicates()
    aux2 = dados_cotas_chamber[['codigo', 'nome']].copy()
    aux2 = aux2.drop_duplicates()
    aux2 = aux2.append(aux1)
    lista_series_bacen = aux2['codigo'].tolist()

    #lista_series_bacen = lista_series_bacen.tolist()
    n_len = len(lista_series_bacen)
    lista_series_bacen.insert(n_len, 1)
    n_len = len(lista_series_bacen)
    lista_series_bacen.insert(n_len, 7)

    ## Ajuste para variáveis virarem colunas
    tabela_ajustada = pd.pivot_table(dados_curvas,
                                     index=["dt_ref"],
                                     columns=["indexador_cod", "prazo"],
                                     values=["tx_spot_ano"])

    ## Ajuste data Cupom Cambial (de 252 para 360)
    nova_lista = []
    for i in range(len(tabela_ajustada.columns)):
        if tabela_ajustada.columns[i][1] == "DP":
            resultado = (tabela_ajustada.columns[i][0], "DP",
                         int(tabela_ajustada.columns[i][2] * (360 / 252.)))
        else:
            resultado = tabela_ajustada.columns[i]
        nova_lista.append(resultado)

    tabela_ajustada.columns = nova_lista

    ## Ajuste data para PU
    tabela_pu = tabela_ajustada
    for coluna in tabela_ajustada.columns:
        periodo = coluna[2]
        taxa = coluna[1]
        if taxa == "DP":
            fator_data = (periodo / 360.)
        else:
            fator_data = (periodo / 252.)
        tabela_pu[coluna] = 100 / ((1 + tabela_ajustada[coluna])**fator_data)

    #Guarda valores para a proxy das cotas
    proxy_cotas = dados_bacen[['data_referencia', 'codigo',
                               'valor']][dados_bacen["codigo"] == 7].copy()

    teste = tabela_pu
    for serie in lista_series_bacen:
        try:
            dados_serie = dados_bacen[dados_bacen["codigo"] == serie]
            dados_serie = dados_serie.drop_duplicates(
                subset=['data_referencia', 'codigo'])
            teste = pd.merge(teste,
                             dados_serie[["valor", "data_referencia"]],
                             left_index=True,
                             right_on=["data_referencia"],
                             how="left")
            teste.rename(columns={'valor': dados_serie["nome"].iloc[0]},
                         inplace=True)
            teste.index = teste["data_referencia"]
            del teste["data_referencia"]
        except:
            pass

    #Ajustar a proxy das cotas - Ibovespa - serie historica que esta no bacen
    dados_cotas_proxy = pd.DataFrame(columns=['codigo', 'isin_fundo'])
    dados_cotas_proxy1 = []

    lista_isin_fundo = dados_cotas['isin_fundo'].unique()
    for i in lista_isin_fundo:
        dados_cotas_proxy1.append(i)

    dados_cotas_proxy['isin_fundo'] = dados_cotas_proxy1
    dados_cotas_proxy['codigo'] = 7

    #Dropa duplicatas bacen
    proxy_cotas = proxy_cotas.drop_duplicates(
        subset=['data_referencia', 'codigo'])
    proxy_cotas.columns = ['dt_ref', 'codigo', 'cota']

    dados_cotas_proxy = pd.merge(dados_cotas_proxy,
                                 proxy_cotas,
                                 left_on=['codigo'],
                                 right_on=['codigo'],
                                 how='left')
    dados_cotas = dados_cotas_proxy[['dt_ref', 'isin_fundo', 'cota']].copy()

    tabela_cotas = pd.pivot_table(dados_cotas,
                                  index=["dt_ref"],
                                  columns=["isin_fundo"],
                                  values=["cota"])

    teste = teste.merge(tabela_cotas, left_index=True, right_index=True)

    ## Preencher datas vazias com o último valor disponível
    teste.fillna(method='pad', inplace=True)

    ## Preencher o histórico de nan com o primeiro valor da série
    teste.fillna(method='bfill', inplace=True)

    ## Cálculo do retorno diário
    retornos = teste.pct_change()

    ## Retirar primeira observação NaN
    retornos = retornos[1:]

    aux = retornos**2
    aux.to_excel(save_path + 'retornos' + str(data_final) + '.xlsx')
    logger.info("Arquivos salvos com sucesso")

    connection.close()

    pickle_file = open(retornos_path + 'matriz_gerencial_retornos' + ".pkl",
                       "w")
    pickle.dump(retornos, pickle_file)
    pickle_file.close()
示例#9
0
def titpublico_final_pv_ettj():

    import pandas as pd
    import pymysql as db
    import numpy as np
    import datetime
    import logging
    from findt import FinDt
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_global_var

    logger = logging.getLogger(__name__)

    #----Declaração de constantes

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()

    # Auxiliar para pegar vna existente na base - versão dummie
    dt_vna = get_global_var(dt_vna)
    dt_vna = datetime.date(int(dt_vna[0:4]), int(dt_vna[4:6]), int(dt_vna[6:8]))
    # Quando tiver vna da data de posicao
    # dt_vna = dt_base

    dt_base = datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2]))

    # Diretório de save de planilhas
    save_path_tpf_fluxo_final = full_path_from_database('get_output_quadro419') + 'tpf_fluxo_final.xlsx'

    feriados_sheet = full_path_from_database('feriados_nacionais') + 'feriados_nacionais.csv'

    #----Leitura do HEADER para pegar a data de referencia do relatório

    #Informações XML
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'select * from projeto_inv.xml_header_org'
    xml_header = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    xml_header = xml_header[xml_header.dtposicao == dt_base].copy()
    xml_header = xml_header[xml_header.data_bd == max(xml_header.data_bd)].copy()

    horario_bd = datetime.datetime.today()

    #----Seleção da tabela xml_titpublico

    # Seleção da tabela de TITPUBLICO
    query = 'SELECT * FROM projeto_inv.xml_titpublico_org'
    tpf_xml = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    aux = xml_header[['dtposicao','header_id']].copy()
    aux['marcador'] = 1

    #Seleção da carga mais recente referente à data base do relatório
    tpf_xml = tpf_xml.merge(aux,on=['header_id'],how='left')
    tpf_xml = tpf_xml[tpf_xml.marcador==1]
    tpf_xml = tpf_xml[tpf_xml.data_bd==max(tpf_xml.data_bd)]

    #Mudança de formato
    tpf_xml['codativo'] = tpf_xml['codativo'].fillna(0)
    tpf_xml['codativo'] = tpf_xml['codativo'].astype(int)

    del tpf_xml['data_bd']
    del tpf_xml['marcador']
    del tpf_xml['pu_mercado']
    del tpf_xml['mtm_mercado']
    del tpf_xml['pu_curva']
    del tpf_xml['mtm_curva']
    del tpf_xml['pu_regra_xml']
    del tpf_xml['mtm_regra_xml']
    del tpf_xml['data_referencia']

    #----Marcação na curva

    #Seleção dos inputs e chaves
    tpf_curva = tpf_xml[['codativo','dtvencimento','dtposicao','dtoperacao','coupom','id_papel']].copy()

    #Mudanças necessárias de formato
    tpf_curva['coupom'] = tpf_curva['coupom'].astype(float)

    #Data de referência da posição
    tpf_curva['data_posicao_curva'] = dt_base

    fluxo = pd.read_sql('select * from projeto_inv.anbima_fluxo_tpf;', con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    fluxo = fluxo.sort(['titulo','dt_vencto', 'dt_ref', 'data_bd'], ascending=[True, True, True, False])
    fluxo = fluxo.drop_duplicates(subset=['titulo', 'dt_vencto', 'dt_ref'], take_last=False)
    fluxo = fluxo.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='')
    fluxo = fluxo.rename(columns={'dt_vencto':'dtvencimento','cod_selic':'codativo'})

    #Retirada de colunas não utilizadas
    del fluxo['titulo']
    del fluxo['dt_emissao']
    del fluxo['cupom']
    del fluxo['dt_vencto2']
    del fluxo['data_bd']

    #Seleção do fluxo futuro à data da posição
    fluxo = fluxo[fluxo.dt_ref>=dt_base].copy()

    #Chamada de valores de VNA
    query = 'SELECT * FROM projeto_inv.anbima_vna'
    vna_virgem = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    vna = vna_virgem.sort(['codigo_selic','data_referencia','data_bd'], ascending=[True, False, False])
    vna = vna.drop_duplicates(subset=['codigo_selic','data_referencia'], take_last=False)
    vna = vna.reset_index(level=None, drop=True, inplace=False, col_level=0, col_fill='')
    vna = vna.rename(columns={'codigo_selic':'codativo'})

    #Mudança de formato

    #Seleção vna na data da posição
    vna = vna[vna.data_referencia==dt_vna].copy()

    #Retirada de colunas não utilizadas
    del vna['id_anbima_vna']
    del vna['titulo']
    del vna['data_referencia']
    del vna['data_bd']

    #Agregação do vna à tabela fluxo
    fluxo = fluxo.merge(vna,on=['codativo'],how='left')
    fluxo['vna'] = fluxo['vna'].fillna(1000.0)

    #Agregaçào do fluxo à tabela tpf_curva
    tpf_curva = pd.merge(tpf_curva,fluxo,right_on=['codativo','dtvencimento'], left_on=['codativo','dtvencimento'], how='left')

    #Criação da lista de datas para trazer o fv a vp
    #Começa a contar a partir da data da posição
    dt_min = dt_base
    tpf_curva['dt_ref']=pd.to_datetime(tpf_curva['dt_ref'])
    dt_max = max(tpf_curva['dt_ref'])
    dt_max = dt_max.to_datetime()
    dt_max=dt_max.date()

    dt_ref = pd.date_range(start=dt_min, end=dt_max, freq='D').date
    serie_dias = pd.DataFrame(columns=['dt_ref'])
    serie_dias['dt_ref'] = dt_ref

    per = FinDt.DatasFinanceiras(dt_min, dt_max, path_arquivo=feriados_sheet)
    du = pd.DataFrame(columns=['dt_ref'])
    du['dt_ref'] = per.dias(3)
    du['du_flag'] = 1

    serie_dias = serie_dias.merge(du,on=['dt_ref'],how='left')
    serie_dias['du_flag'] = serie_dias['du_flag'].fillna(0)
    serie_dias['prazo_du'] = np.cumsum(serie_dias['du_flag']) - 1

    del serie_dias['du_flag']

    #Agregação da tabela serie_dias à tpf_curva
    tpf_curva['dt_ref'] = tpf_curva['dt_ref'].dt.date
    tpf_curva = tpf_curva.merge(serie_dias,on=['dt_ref'],how='left')

    #Cálculo do pv
    tpf_curva['pv'] = tpf_curva['fv']*tpf_curva['vna']/(1+tpf_curva['coupom']/100)**(tpf_curva['prazo_du']/252)
    tpf_curva['pv'] = np.where(tpf_curva['codativo']==210100,tpf_curva['fv']*tpf_curva['vna'],tpf_curva['pv'])

    #Cálculo da marcação na curva
    y = tpf_curva[['id_papel','pv']].groupby(['id_papel']).agg(['sum'])
    y = y.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
    y1 = pd.DataFrame(columns=['id_papel','pu_curva'])
    y1['id_papel'] = y['id_papel']
    y1['pu_curva'] = y['pv']

    tpf_curva = tpf_curva.merge(y1,on=['id_papel'],how='left')

    #Seleção das colunas necessárias
    tpf_curva = tpf_curva[['id_anbima_fluxo_tpf','id_papel','codativo','dtvencimento','dtoperacao','data_posicao_curva','pu_curva','fv','prazo_du']].copy()

    #----Informações de mercado
    #--Cria a base de valores marcados a mercado
    query = 'SELECT * FROM projeto_inv.anbima_tpf'
    base_anbima_virgem = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    base_anbima = base_anbima_virgem[base_anbima_virgem.dt_referencia<=dt_base]
    base_anbima = base_anbima[['cod_selic','dt_vencto','pu','dt_referencia','dt_carga','tx_indicativa']].copy()
    base_anbima = base_anbima.sort(['cod_selic','dt_vencto','dt_referencia','dt_carga'],ascending=[True,True,False,False])
    base_anbima = base_anbima.drop_duplicates(subset=['cod_selic','dt_vencto'],take_last=False)
    base_anbima = base_anbima[base_anbima.dt_referencia==dt_base].copy()
    base_anbima = base_anbima.rename(columns = {'cod_selic':'codativo','dt_vencto':'dtvencimento','dt_referencia':'data_referencia','pu':'pu_mercado'})

    del base_anbima['dt_carga']

    #----União das colunas de marcação a mercado e marcação na curva

    tpf = tpf_curva.merge(base_anbima,on=['codativo','dtvencimento'],how='left')

    del tpf['codativo']
    del tpf['dtvencimento']
    del tpf['dtoperacao']

    tpf_xml = tpf_xml.merge(tpf,on=['id_papel'],how='left')

    tpf_full = tpf_xml.copy()

    tpf_xml = tpf_xml.drop_duplicates(subset=['id_papel'])

    #Seção Compromisso
    tpf_xml['pu_mercado'] = np.where(tpf_xml['dtretorno'].notnull(),tpf_xml['puposicao'],tpf_xml['pu_mercado'])
    tpf_xml['pu_curva'] = np.where(tpf_xml['dtretorno'].notnull(),tpf_xml['puposicao'],tpf_xml['pu_curva'])

    tpf_xml['mtm_curva'] = tpf_xml['pu_curva']*(tpf_xml['qtdisponivel'] + tpf_xml['qtgarantia'])
    tpf_xml['mtm_mercado'] = tpf_xml['pu_mercado']*(tpf_xml['qtdisponivel'] + tpf_xml['qtgarantia'])

    tpf_xml['pu_regra_xml'] = np.where(tpf_xml['caracteristica']=='V',tpf_xml['pu_curva'],tpf_xml['pu_mercado'])
    tpf_xml['mtm_regra_xml'] = np.where(tpf_xml['caracteristica']=='V',tpf_xml['mtm_curva'],tpf_xml['mtm_mercado'])

    tpf_xml['data_bd'] = horario_bd

    del tpf_xml['id_xml_titpublico']
    del tpf_xml['dtposicao']
    del tpf_xml['data_posicao_curva']
    del tpf_xml['fv']
    del tpf_xml['prazo_du']
    del tpf_xml['id_anbima_fluxo_tpf']
    del tpf_xml['tx_indicativa']

    logger.info("Salvando base de dados - xml_titpublico")
    pd.io.sql.to_sql(tpf_xml, name='xml_titpublico', con=connection, if_exists='append', flavor='mysql', index=0)

    #----Trazer fv das LTN a vp, calcular o perc_mtm , DV100 e Duration
    #Fator de desconto
    dia = str(dt_base.day)
    if len(dia) == 1:
        dia = '0'+dia
    mes = str(dt_base.month)
    if len(mes) == 1:
        mes = '0'+mes
    ano = str(dt_base.year)

    #dt_base_str = ano + '-' + mes + '-' + dia

    tpf_full['indexador'] = np.where(tpf_full['indexador']=='IAP','IPCA',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['indexador']=='IGP','IGP',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['codativo'].isin([760100,760199]),'IPCA',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['codativo'].isin([770100]),'IGP',tpf_full['indexador'])
    tpf_full['indexador'] = np.where(tpf_full['codativo'].isin([210100]),'PRE',tpf_full['indexador'])

    tpf_pv = tpf_full.copy()

    #Cálculo dos fatores de desconto, normal e estressado
    dt_base = str(dt_base)
    query = 'SELECT * FROM projeto_inv.curva_ettj_interpol_' + ano + '_' + mes + ' where day(dt_ref) = ' + dia + ' AND indexador_cod in("PRE","DIM","DIC");'
    ettj = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Seleciona a última carga
    ettj = ettj.sort(['indexador_cod','dt_ref', 'data_bd'], ascending = [True,False,False])
    ettj = ettj.drop_duplicates(subset=['prazo','tx_spot', 'tx_spot_ano','tx_termo_dia','indexador_cod'], take_last=False)
    ettj['indexador']=np.where(ettj['indexador_cod']=='DIC','IPCA',np.where(ettj['indexador_cod']=='DIM', 'IGP',np.where(ettj['indexador_cod']=='SLP','SEL','PRE')))
    ettj=ettj.rename(columns={'prazo': 'prazo_du'})
    ettj_filtro=ettj[['prazo_du', 'tx_spot', 'tx_spot_ano', 'indexador']]

    tpf_pv = tpf_pv[tpf_pv.prazo_du>=0].copy()
    tpf_pv = tpf_pv.merge(ettj_filtro,on=['indexador','prazo_du'],how='left')
    tpf_pv['tx_spot'] =  tpf_pv['tx_spot'].fillna(0)
    tpf_pv['tx_spot_ano'] =  tpf_pv['tx_spot_ano'].fillna(0)
    tpf_pv['fator_desconto'] = 1/(1+tpf_pv['tx_spot'])
    tpf_pv['fator_desconto_DV100'] = 1/(1+tpf_pv['tx_spot_ano']+0.01)**(tpf_pv['prazo_du']/252)
    tpf_pv['pv'] = tpf_pv['fv']*tpf_pv['fator_desconto']
    tpf_pv['pv_DV100'] = tpf_pv['fv']*tpf_pv['fator_desconto_DV100']

    total_pv = tpf_pv[['id_papel', 'pv','fv']].copy()
    total_pv = total_pv.groupby(['id_papel']).sum().reset_index()
    total_pv = total_pv.rename(columns={'pv': 'pv_sum','fv':'fv_sum'})

    tpf_pv = tpf_pv.merge(total_pv, on=['id_papel'], how='left')
    tpf_pv['perc_mtm'] = tpf_pv['pv']/tpf_pv['pv_sum']
    tpf_pv['perc_mtm_DV100'] = tpf_pv['pv_DV100']/tpf_pv['pv_sum']

    #Cálculo do DV100
    tpf_pv['DV100_fluxo'] = (tpf_pv['perc_mtm'] - tpf_pv['perc_mtm_DV100'])*tpf_pv['pu_mercado']

    DV100 = tpf_pv[['id_papel', 'DV100_fluxo']].copy()
    DV100 = DV100.groupby(['id_papel']).sum().reset_index()
    DV100 = DV100.rename(columns={'DV100_fluxo':'DV100'})
    tpf_pv = tpf_pv.merge(DV100, on=['id_papel'], how='left')

    #Cálculo da Duration
    tpf_pv['fluxo_ponderado'] = tpf_pv['perc_mtm']*tpf_pv['prazo_du']

    duration = tpf_pv[['id_papel', 'fluxo_ponderado']].copy()
    duration = duration.groupby(['id_papel']).sum().reset_index()
    duration = duration.rename(columns={'fluxo_ponderado':'duration'})
    tpf_pv = tpf_pv.merge(duration, on=['id_papel'], how='left')

    #Normalizando para encaixar com as colunas de titprivado
    tpf_pv['fluxo_ponderado'] = tpf_pv['fluxo_ponderado']*tpf_pv['pu_mercado']
    tpf_pv['fv'] = tpf_pv['fv']*tpf_pv['pu_mercado']/tpf_pv['fv_sum']

    del tpf_pv['pv_sum']
    del tpf_pv['fv_sum']
    del tpf_pv['DV100_fluxo']
    del tpf_pv['perc_mtm_DV100']
    del tpf_pv['tx_indicativa']

    tpf_pv = tpf_pv.rename(columns={'isin':'codigo_isin','pu_mercado':'mtm','data_fim':'dt_ref'})
    tpf_pv['data_mtm'] = dt_base
    tpf_pv['data_negociacao'] = tpf_pv['data_referencia']
    tpf_pv['ano_mtm'] = dt_base[0:4]
    tpf_pv['mes_mtm'] = dt_base[5:7]
    tpf_pv['dia_mtm'] = dt_base[8:10]
    tpf_pv['indexador'] = np.where(tpf_pv['codativo'].isin([210100]),'SEL',tpf_pv['indexador'])

    #Seleção das colunas finais
    tpf_pv = tpf_pv[['id_anbima_fluxo_tpf',
                     'id_papel',
                     'codigo_isin',
                     'codativo',
                     'dtvencimento',
                     'prazo_du',
                     'fv',
                     'indexador',
                     'tx_spot',
                     'fator_desconto',
                     'fator_desconto_DV100',
                     'pv',
                     'pv_DV100',
                     'perc_mtm',
                     'DV100',
                     'fluxo_ponderado',
                     'duration',
                     'mtm',
                     'data_mtm',
                     'ano_mtm',
                     'mes_mtm',
                     'dia_mtm',
                     'data_negociacao']].copy()


    #Cria o flag de tipo_ativo T(ítulo) P(úblico) F(eferal)
    tpf_pv['tipo_ativo'] = 'TPF'
    tpf_pv['data_bd'] = horario_bd
    tpf_pv = tpf_pv.sort(['codigo_isin','codativo','prazo_du'],ascending=[True,True,True])
    tpf_pv = tpf_pv.drop_duplicates(subset=['codigo_isin','codativo','dtvencimento','prazo_du'],take_last=True)

    #Coloca na base mtmt_renda_fixa

    logger.info("Salvando base de dados - mtm_renda_fixa")
    pd.io.sql.to_sql(tpf_pv, name='mtm_renda_fixa', con=connection,if_exists="append", flavor='mysql', index=0)

    #Fecha conexão
    connection.close()

    tpf_pv.to_excel(save_path_tpf_fluxo_final)
def mtm_curva_titprivado():

    import datetime, time
    import pandas as pd
    import numpy as np
    import pymysql as db
    import logging

    from pandas import ExcelWriter
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_global_var

    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]

    # Diretório de save de planilhas
    save_path_puposicao = full_path_from_database(
        'get_output_quadro419') + 'puposicao_final.xlsx'
    save_path_titprivado_perc = full_path_from_database(
        'get_output_quadro419') + 'titprivado_perc.xlsx'

    tol = float(get_global_var("tol"))
    writer = ExcelWriter(save_path_puposicao)

    # 1 - Leitura e criação de tabelas
    # Informações do cálculo de MTM
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'select * from projeto_inv.mtm_titprivado'
    #query = "SELECT * tipo_ativo FROM mtm_titprivado WHERE tipo_ativo <> 'DBS' AND tipo_ativo <> 'CTF'"
    mtm_titprivado0 = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    logger.info("Tratando dados")
    mtm_titprivado = mtm_titprivado0.copy()

    # Tira debentures
    mtm_titprivado = mtm_titprivado[(mtm_titprivado.tipo_ativo != 'DBS')
                                    & (mtm_titprivado.tipo_ativo != 'CTF')]
    mtm_titprivado['dtrel'] = mtm_titprivado['id_papel'].str.split('_')
    mtm_titprivado['dtrel'] = mtm_titprivado['dtrel'].str[0]
    mtm_titprivado = mtm_titprivado[mtm_titprivado.dtrel ==
                                    dtbase_concat].copy()
    mtm_titprivado = mtm_titprivado[mtm_titprivado.data_bd == max(
        mtm_titprivado.data_bd)]

    del mtm_titprivado['dtrel']
    mtm_titprivado = mtm_titprivado.rename(columns={
        'data_fim': 'dt_ref',
        'dtoperacao': 'dtoperacao_mtm'
    })
    mtm_titprivado['dt_ref'] = pd.to_datetime(mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = np.where(
        mtm_titprivado['indexador'] == 'DI1',
        mtm_titprivado['dt_ref'] + pd.DateOffset(months=0, days=1),
        mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = mtm_titprivado['dt_ref'].dt.date

    # Altera o nome do id_papel para levar em consideração o flag
    mtm_titprivado['id_papel_old'] = mtm_titprivado['id_papel']
    mtm_titprivado['id_papel'] = mtm_titprivado['id_papel_old'].str.split('_')
    mtm_titprivado['id_papel'] = mtm_titprivado['id_papel'].str[0] + '_' + mtm_titprivado['id_papel'].str[1] + '_' + \
                                 mtm_titprivado['id_papel'].str[2]

    # Retuira papéis com valor nominal zerado ou vazio
    mtm_titprivado = mtm_titprivado[
        (mtm_titprivado.valor_nominal.notnull())
        & (mtm_titprivado.valor_nominal != 0)].copy()

    del mtm_titprivado['data_bd']

    # Informações XML
    query = 'SELECT * FROM projeto_inv.xml_titprivado_org'
    xml_titprivado = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    xml_titprivado['dtrel'] = xml_titprivado['id_papel'].str.split('_')
    xml_titprivado['dtrel'] = xml_titprivado['dtrel'].str[0]
    xml_titprivado = xml_titprivado[xml_titprivado.dtrel ==
                                    dtbase_concat].copy()
    xml_titprivado = xml_titprivado[xml_titprivado.data_bd == max(
        xml_titprivado.data_bd)]

    del xml_titprivado['data_bd']
    del xml_titprivado['dtrel']

    original = xml_titprivado.copy()

    del xml_titprivado['indexador']

    # mtm_titprivado.to_excel(save_path+'checa_id.xlsx')

    titprivado1 = mtm_titprivado.copy()
    # Criação da tabela mtm + xml
    titprivado = xml_titprivado.merge(mtm_titprivado,
                                      on=['id_papel'],
                                      how='left')

    # Criação da coluna de data de referencia da posição
    titprivado['data_referencia'] = titprivado['id_papel'].str[0:8]
    titprivado['data_referencia'] = pd.to_datetime(
        titprivado['data_referencia']).dt.date

    logger.info("Escolha do melhor mtm")
    # 2 - Escolha do melhor mtm

    titprivado_mercado = titprivado[(titprivado.caracteristica == 'N')
                                    & (titprivado.mtm.notnull()) &
                                    (titprivado.mtm != 0)]
    titprivado_mercado['dif_mtm'] = titprivado_mercado[
        'puposicao'] / titprivado_mercado['mtm'] - 1
    titprivado_mercado['dif_mtm'] = titprivado_mercado['dif_mtm'].abs()
    titprivado_mercado = titprivado_mercado[
        titprivado_mercado.dt_ref ==
        titprivado_mercado.data_referencia].copy()
    titprivado_mercado = titprivado_mercado[[
        'id_papel_old', 'id_papel', 'codigo_isin', 'dif_mtm'
    ]].copy()
    titprivado_mercado = titprivado_mercado.sort(['dif_mtm'], ascending=[True])
    titprivado_mercado = titprivado_mercado.drop_duplicates(
        subset=['id_papel'], take_last=False)

    titprivado = titprivado.merge(
        titprivado_mercado,
        on=['id_papel_old', 'id_papel', 'codigo_isin'],
        how='left')
    titprivado = titprivado[((titprivado.caracteristica == 'N') &
                             (titprivado.dif_mtm.notnull())) |
                            (titprivado.caracteristica == 'V')].copy()

    tp_aux = titprivado[['id_papel', 'isin',
                         'dtvencimento']][titprivado.dif_mtm.isnull()].copy()
    tp_aux = tp_aux.drop_duplicates(subset=['id_papel'])
    tp_aux.to_excel(writer, 'sem_mtm')

    titprivado = titprivado.reset_index(level=None,
                                        drop=True,
                                        inplace=False,
                                        col_level=0,
                                        col_fill='')

    logger.info("Cálculo marcação na curva")
    # 3 - Cálculo marcação na curva

    titprivado_curva = titprivado[titprivado.caracteristica == 'V'].copy()

    del titprivado_curva['vne']

    # Seleciona a parte do fluxo entre a data da compra e a data da posição
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref >= titprivado_curva.dtoperacao_mtm].copy()
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref <= titprivado_curva.data_referencia].copy()

    # Preenchimento do VNE na data da compra
    tp_curva_dtop = titprivado_curva[[
        'id_papel_old', 'saldo_dev_juros_perc', 'pucompra'
    ]][titprivado_curva.dt_ref == titprivado_curva.dtoperacao_mtm].copy()

    tp_curva_dtop['vne'] = tp_curva_dtop['pucompra'] * (
        1 - tp_curva_dtop['saldo_dev_juros_perc'])

    del tp_curva_dtop['saldo_dev_juros_perc']
    del tp_curva_dtop['pucompra']

    titprivado_curva = titprivado_curva.merge(tp_curva_dtop,
                                              on=['id_papel_old'],
                                              how='left')
    titprivado_curva[
        'principal_perc_acum'] = 1 - titprivado_curva['principal_perc']
    titprivado_curva['principal_perc_acum'] = titprivado_curva[[
        'id_papel_old', 'principal_perc_acum'
    ]].groupby(['id_papel_old']).agg(['cumprod'])
    titprivado_curva['vne'] = titprivado_curva['vne'] * titprivado_curva[
        'principal_perc_acum']
    titprivado_curva['pagto_juros'] = titprivado_curva[
        'vne'] * titprivado_curva['pagto_juros_perc']
    titprivado_curva[
        'vna'] = titprivado_curva['vne'] * titprivado_curva['fator_index_per']
    titprivado_curva['vna'][titprivado_curva.indexador ==
                            'DI1'] = titprivado_curva['vne'][
                                titprivado_curva.indexador == 'DI1']
    titprivado_curva['saldo_dev_juros'] = titprivado_curva[
        'vna'] * titprivado_curva['saldo_dev_juros_perc']
    titprivado_curva['pupar'] = titprivado_curva['vna'] + titprivado_curva[
        'saldo_dev_juros'] + titprivado_curva['pagto_juros']
    titprivado_curva['dif_curva'] = titprivado_curva[
        'pupar'] / titprivado_curva['puposicao'] - 1
    titprivado_curva['dif_curva'] = titprivado_curva['dif_curva'].abs()
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref == titprivado_curva.data_referencia].copy()
    titprivado_curva = titprivado_curva[[
        'id_papel_old', 'id_papel', 'codigo_isin', 'dif_curva', 'pupar'
    ]].copy()
    titprivado_curva = titprivado_curva.sort(['dif_curva'], ascending=[True])
    titprivado_curva = titprivado_curva.drop_duplicates(subset=['id_papel'],
                                                        take_last=False)

    titprivado = titprivado.merge(
        titprivado_curva,
        on=['id_papel_old', 'id_papel', 'codigo_isin'],
        how='left')
    titprivado = titprivado[((titprivado.caracteristica == 'V') &
                             (titprivado.dif_curva.notnull())) |
                            (titprivado.caracteristica == 'N')].copy()
    titprivado = titprivado.reset_index(level=None,
                                        drop=True,
                                        inplace=False,
                                        col_level=0,
                                        col_fill='')

    logger.info("Separação dos pu's que ficaram muito distantes do informado")
    # 4 - Separação dos pu's que ficaram muito distantes do informado

    titprivado['dif_curva'] = titprivado['dif_curva'].fillna(0)
    titprivado['dif_mtm'] = titprivado['dif_mtm'].fillna(0)
    titprivado['dif'] = titprivado['dif_curva'] + titprivado['dif_mtm']

    # Retirar atualizar valores de papéis cujo dif é grande em apenas uma das observações
    x = titprivado[[
        'codigo_isin', 'id_papel'
    ]][titprivado.dt_ref == titprivado.data_referencia].groupby(
        ['codigo_isin']).count()
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'count_all'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['count_all'] = x['id_papel']
    titprivado = titprivado.merge(x1, on=['codigo_isin'], how='left')

    x = titprivado[[
        'codigo_isin', 'id_papel'
    ]][(titprivado.dt_ref == titprivado.data_referencia)
       & (titprivado.dif > tol) & (titprivado.caracteristica == 'N')].groupby(
           ['codigo_isin']).count()
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'count_0'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['count_0'] = x['id_papel']
    titprivado = titprivado.merge(x1, on=['codigo_isin'], how='left')
    titprivado['count_0'] = np.where(titprivado['dif'] < tol,
                                     titprivado['count_all'],
                                     titprivado['count_0'])
    titprivado['count_dif'] = titprivado['count_all'] - titprivado['count_0']

    x = pd.DataFrame()
    x = titprivado[['id_papel'
                    ]][(titprivado.count_dif != 0)
                       & (titprivado.dt_ref == titprivado.data_referencia) &
                       (titprivado.caracteristica == 'N')].copy()
    x['change'] = 1

    titprivado = titprivado.merge(x, on=['id_papel'], how='left')

    x = pd.DataFrame()
    x = titprivado[['codigo_isin'
                    ]][(titprivado.count_dif != 0)
                       & (titprivado.dt_ref == titprivado.data_referencia) &
                       (titprivado.caracteristica == 'N')].copy()
    x['change_basis'] = 2

    x = x.drop_duplicates()

    titprivado = titprivado.merge(x, on=['codigo_isin'], how='left')

    x = titprivado[['codigo_isin', 'puposicao'
                    ]][(titprivado.change_basis == 2)
                       & (titprivado.change != 1)].groupby(['codigo_isin'
                                                            ]).agg(['mean'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'puposnew'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['puposnew'] = x['puposicao']

    titprivado = titprivado.merge(x1, on=['codigo_isin'], how='left')
    titprivado['puposicao1'] = np.where(titprivado['change'] == 1,
                                        titprivado['puposnew'],
                                        titprivado['puposicao'])
    titprivado['change'] = titprivado['change'].fillna(0)

    del titprivado['change_basis']

    titprivado['dif'] = titprivado['mtm'] / titprivado['puposicao1'] - 1
    titprivado['dif'] = titprivado['dif'].abs()

    logger.info("Cálculo spread de crédito")
    # 4 - Cálculo spread de crédito

    titprivado_spread = \
    titprivado[['id_papel', 'codigo_isin', 'data_referencia', 'puposicao1', 'dt_ref', 'prazo_du', 'pv']][
        (titprivado.caracteristica == 'N')]

    # Tira a média dos puposicao para calcular spread único por isin
    x = titprivado_spread[['codigo_isin', 'puposicao1'
                           ]].groupby(['codigo_isin']).agg(['mean'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'pumedio'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['pumedio'] = x['puposicao1']
    titprivado_spread = titprivado_spread.merge(x1,
                                                on=['codigo_isin'],
                                                how='left')

    titprivado_spread['puposicao1'] = titprivado_spread['pumedio']

    del titprivado_spread['pumedio']

    # Seleciona apenas o fluxo com prazo_du positivo
    titprivado_spread = titprivado_spread[
        titprivado_spread.dt_ref >= titprivado_spread.data_referencia]

    titprivado_spread['pv_pv_fluxo'] = np.where(
        titprivado_spread['dt_ref'] == titprivado_spread['data_referencia'],
        -titprivado_spread['puposicao1'], titprivado_spread['pv'])

    tp_spread = titprivado_spread[[
        'id_papel', 'codigo_isin', 'dt_ref', 'prazo_du', 'pv_pv_fluxo'
    ]].copy()
    tp_spread['prazo_du'] = tp_spread['prazo_du'].astype(float)

    id_papel = titprivado_spread['id_papel'].unique()
    spread = np.zeros((len(id_papel)))

    spread_aux = pd.DataFrame(columns=['id_papel', 'spread'])
    spread_aux['id_papel'] = id_papel

    start_time = time.time()
    for i in range(0, len(id_papel)):
        v = tp_spread['pv_pv_fluxo'][tp_spread.id_papel == id_papel[i]].values
        v = np.meshgrid(v, sparse=True)

        s = np.linspace(-0.9999, 0.9999, 100000)
        t = tp_spread['prazo_du'][tp_spread.id_papel == id_papel[i]].values
        t, s = np.meshgrid(t, s, sparse=True)
        f_ts = 1. / (1 + s)**(t / 252)

        f_spread = v * f_ts

        f_sum = f_spread.sum(axis=1, dtype='float')

        min_index = abs(f_sum).argmin()

        spread[i] = s[min_index]

        #print(time.time() - start_time, i, id_papel[i], spread[i])

        spread_aux['spread'].iloc[i] = spread[i]

    titprivado = titprivado.merge(spread_aux, on=['id_papel'], how='left')

    logger.info("Seleção dos papéis cuja marcação não ficou boa")
    # 5 - Seleção dos papéis cuja marcação não ficou boa

    tp_bigdif = titprivado[[
        'data_referencia', 'codigo_isin', 'id_papel', 'flag', 'caracteristica',
        'indexador', 'dtemissao', 'data_emissao', 'dtvencimento',
        'data_expiracao', 'valor_nominal', 'puemissao', 'juros_cada', 'coupom',
        'taxa_juros', 'percentual_indexador', 'percindex', 'perc_amortizacao',
        'dt_ref', 'vne', 'du_per', 'prazo_du', 'fator_index_per',
        'fator_juros_per', 'juros_per', 'saldo_dev_juros', 'pv', 'fv', 'mtm',
        'puposicao', 'puposicao1', 'change', 'count_0', 'count_all', 'dif',
        'spread'
    ]].copy()

    tp_bigdif['dif'] = tp_bigdif['mtm'] / tp_bigdif['puposicao1'] - 1

    tp_bigdif[(tp_bigdif.dif > tol) | (tp_bigdif.dif < -tol) |
              (tp_bigdif.spread > tol) | (tp_bigdif.spread < -tol)].to_excel(
                  writer, 'bigdif')

    logger.info(
        "Atualização do fluxo de % de mtm com o spread e carregamento da tabela"
    )
    # 6 - Atualização do fluxo de percentual de mtm com o spread e carregamento da tabela para preenchimento do quadro 419

    titprivado_perc = titprivado.copy()

    titprivado_perc = titprivado_perc.rename(
        columns={
            'mtm': 'mtm_old',
            'pv': 'pv_old',
            'pv_DV100': 'pv_DV100_old',
            'fator_desconto': 'fator_desconto_old',
            'fator_desconto_DV100': 'fator_desconto_DV100_old',
            'DV100': 'DV100_old'
        })

    # Escolhe o melhor spread - SIGNIFICA O MELHOR FLUXO
    titprivado_perc['spread'] = titprivado_perc['spread'].fillna(0)

    # Pega penas uma linha para não ter problemas
    x = titprivado_perc[[
        'id_papel', 'codigo_isin', 'spread'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()

    x = x.sort(['codigo_isin', 'spread'], ascending=[True, True])
    x = x.drop_duplicates(subset=['codigo_isin'], take_last=False)

    x['marker'] = 1

    titprivado_perc = titprivado_perc.merge(
        x, on=['codigo_isin', 'id_papel', 'spread'], how='left')

    titprivado_perc = titprivado_perc[titprivado_perc.marker == 1].copy()
    del titprivado_perc['marker']

    titprivado_perc = titprivado_perc[titprivado_perc.prazo_du >= 0]

    # Recalcula apenas para que está marcado a mercado
    aux = titprivado_perc[titprivado_perc.caracteristica == 'V'].copy()
    aux['mtm_DV100_N'] = 0.0
    aux = aux.rename(columns={'mtm_old': 'mtm'})

    titprivado_perc = titprivado_perc[titprivado_perc.caracteristica ==
                                      'N'].copy()

    # Cálculo do fator de desconto atualizado pelo spread
    titprivado_perc[
        'fator_desconto'] = titprivado_perc['fator_desconto_old'] / (
            1 + titprivado_perc['spread'])**(titprivado_perc['prazo_du'] / 252)
    titprivado_perc['fator_desconto_DV100'] = titprivado_perc[
        'fator_desconto_DV100_old'] / (1 + titprivado_perc['spread'])**(
            titprivado_perc['prazo_du'] / 252)

    # Calculo do pv
    titprivado_perc[
        'pv'] = titprivado_perc['fv'] * titprivado_perc['fator_desconto']
    titprivado_perc['pv_DV100'] = titprivado_perc['fv'] * titprivado_perc[
        'fator_desconto_DV100']

    # Calculo do MTM
    x = titprivado_perc[['codigo_isin', 'pv',
                         'pv_DV100']].groupby(['codigo_isin']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'mtm', 'mtm_DV100_N'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['mtm'] = x['pv']
    x1['mtm_DV100_N'] = x['pv_DV100']
    titprivado_perc = titprivado_perc.merge(x1, on=['codigo_isin'], how='left')

    titprivado_perc['mtm_DV100'] = 0.0

    # Escolhe o melhor fluxo
    titprivado_perc[
        'dif_new'] = titprivado_perc['mtm'] - titprivado_perc['puposicao1']
    titprivado_perc['dif_new'] = titprivado_perc['dif_new'].abs()
    titprivado_perc[
        'dif_old'] = titprivado_perc['mtm_old'] - titprivado_perc['puposicao1']
    titprivado_perc['dif_old'] = titprivado_perc['dif_old'].abs()

    titprivado_perc['mtm'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['mtm_old'], titprivado_perc['mtm'])
    titprivado_perc['mtm_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['mtm_DV100'], titprivado_perc['mtm_DV100_N'])
    titprivado_perc['pv'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['pv_old'], titprivado_perc['pv'])
    titprivado_perc['pv_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['pv_DV100_old'], titprivado_perc['pv_DV100'])
    titprivado_perc['fator_desconto'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['fator_desconto_old'],
        titprivado_perc['fator_desconto'])
    titprivado_perc['fator_desconto_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['fator_desconto_DV100_old'],
        titprivado_perc['fator_desconto_DV100'])

    # Cálculo do DV100
    titprivado_perc = titprivado_perc.append(aux)

    titprivado_perc[
        'DV100'] = titprivado_perc['mtm'] - titprivado_perc['mtm_DV100']

    # Cálculo do perc_mtm
    titprivado_perc[
        'perc_mtm'] = titprivado_perc['pv'] / titprivado_perc['mtm']
    titprivado_perc['perc_mtm'] = np.where(
        titprivado_perc['caracteristica'] == 'V',
        titprivado_perc['pv_old'] / titprivado_perc['mtm'],
        titprivado_perc['perc_mtm'])

    # Cálculo da duration
    titprivado_perc[
        'duration'] = titprivado_perc['perc_mtm'] * titprivado_perc['prazo_du']
    x = titprivado_perc[['codigo_isin',
                         'duration']].groupby(['codigo_isin']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'duration'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['duration'] = x['duration']
    del titprivado_perc['duration']
    titprivado_perc = titprivado_perc.merge(x1, on=['codigo_isin'], how='left')

    titprivado_perc[[
        'codigo_isin', 'puposicao1', 'mtm', 'dt_ref', 'mtm_old', 'dif_new',
        'dif_old', 'duration', 'spread'
    ]].to_excel(writer, 'conclusao_fluxo')
    titprivado_perc[
        titprivado_perc.dt_ref == titprivado_perc.data_referencia][[
            'codigo_isin', 'puposicao1', 'mtm', 'dt_ref', 'mtm_old', 'dif_new',
            'dif_old', 'duration', 'spread'
        ]].to_excel(writer, 'conclusao_resumido')

    finalizacao = titprivado_perc[[
        'codigo_isin', 'mtm'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()

    del titprivado_perc['fator_desconto_DV100_old']
    del titprivado_perc['fator_desconto_old']
    del titprivado_perc['mtm_old']
    del titprivado_perc['mtm_DV100_N']
    del titprivado_perc['pv_DV100_old']
    del titprivado_perc['pv_old']
    del titprivado_perc['DV100_old']
    del titprivado_perc['dif_new']
    del titprivado_perc['dif_old']

    writer.save()

    # id_mtm_titprivado
    titprivado_perc['id_mtm_titprivado'] = titprivado_perc[
        'id_mtm_titprivado'].astype(int)

    # id_bmf_numeraca
    aux = titprivado_perc[[
        'id_papel', 'id_bmf_numeraca'
    ]][titprivado_perc.id_bmf_numeraca.notnull()].copy()
    aux['id_bmf_numeraca'] = aux['id_bmf_numeraca'].astype(int)
    del titprivado_perc['id_bmf_numeraca']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'], how='left')

    # pagto_amortizacao
    aux = titprivado_perc[[
        'id_papel', 'indexador_dc_du'
    ]][titprivado_perc.indexador_dc_du.notnull()].copy()
    aux['indexador_dc_du'] = aux['indexador_dc_du'].astype(int)
    del titprivado_perc['indexador_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # juros_cada
    aux = titprivado_perc[['id_papel', 'juros_cada'
                           ]][titprivado_perc.juros_cada.notnull()].copy()
    aux['juros_cada'] = aux['juros_cada'].astype(int)
    del titprivado_perc['juros_cada']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'], how='left')

    # indexador_dc_du
    aux = titprivado_perc[[
        'id_papel', 'indexador_dc_du'
    ]][titprivado_perc.indexador_dc_du.notnull()].copy()
    aux['indexador_dc_du'] = aux['indexador_dc_du'].astype(int)
    del titprivado_perc['indexador_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # juros_dc_du
    aux = titprivado_perc[['id_papel', 'juros_dc_du'
                           ]][titprivado_perc.juros_dc_du.notnull()].copy()
    aux['juros_dc_du'] = aux['juros_dc_du'].astype(int)
    del titprivado_perc['juros_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # flag_inclusao
    titprivado_perc['flag_inclusao'] = titprivado_perc['flag_inclusao'].astype(
        int)

    # du_per
    titprivado_perc['du_per'] = titprivado_perc['du_per'].astype(int)

    # dc_per
    titprivado_perc['dc_per'] = titprivado_perc['dc_per'].astype(int)

    # dt_ref -> data_fim
    titprivado_perc['dt_ref'] = pd.to_datetime(titprivado_perc['dt_ref'])
    titprivado_perc['data_fim'] = np.where(
        titprivado_perc['indexador'] == 'DI1',
        titprivado_perc['dt_ref'] - pd.DateOffset(months=0, days=1),
        titprivado_perc['dt_ref'])

    titprivado_perc['id_papel'] = titprivado_perc['id_papel_old']

    titprivado_perc['data_mtm'] = titprivado_perc['data_referencia']
    titprivado_perc['data_negociacao'] = titprivado_perc['data_referencia']

    # Tabelas não necessárias - MTM
    del titprivado_perc['data_referencia']
    del titprivado_perc['id_papel_old']
    del titprivado_perc['indice_du_mtm']
    del titprivado_perc['indice_dc_mtm']
    del titprivado_perc['ano_dt_ref2']
    del titprivado_perc['mes_dt_ref2']
    del titprivado_perc['dia_dt_ref2']
    del titprivado_perc['vertices_positivo']
    del titprivado_perc['indice_dc_dt_ref2']
    del titprivado_perc['indice_du_dt_ref2']
    del titprivado_perc['prazo_dc']
    del titprivado_perc['ano_inicio']
    del titprivado_perc['mes_inicio']
    del titprivado_perc['dia_inicio']
    del titprivado_perc['indice_du_inicio']
    del titprivado_perc['indice_dc_inicio']
    del titprivado_perc['ano_fim']
    del titprivado_perc['mes_fim']
    del titprivado_perc['dia_fim']
    del titprivado_perc['indice_du_fim']
    del titprivado_perc['indice_dc_fim']
    del titprivado_perc['dt_ref']
    del titprivado_perc['dtoperacao_mtm']
    del titprivado_perc['dif']
    del titprivado_perc['dif_mtm']
    del titprivado_perc['dif_curva']
    del titprivado_perc['pupar']
    del titprivado_perc['count_all']
    del titprivado_perc['count_0']
    del titprivado_perc['count_dif']
    del titprivado_perc['change']
    del titprivado_perc['puposnew']
    del titprivado_perc['puposicao1']
    del titprivado_perc['pu_mercado']
    del titprivado_perc['pu_curva']
    del titprivado_perc['mtm_mercado']
    del titprivado_perc['mtm_curva']
    del titprivado_perc['pu_regra_xml']
    del titprivado_perc['mtm_regra_xml']

    # Tabelas não necessárias - XML
    del titprivado_perc['id_xml_titprivado']
    del titprivado_perc['isin']
    del titprivado_perc['codativo']
    del titprivado_perc['dtemissao']
    del titprivado_perc['dtoperacao']
    del titprivado_perc['dtvencimento']
    del titprivado_perc['cnpjemissor']
    del titprivado_perc['qtdisponivel']
    del titprivado_perc['qtgarantia']
    del titprivado_perc['pucompra']
    del titprivado_perc['puvencimento']
    del titprivado_perc['puposicao']
    del titprivado_perc['puemissao']
    del titprivado_perc['principal']
    del titprivado_perc['tributos']
    del titprivado_perc['valorfindisp']
    del titprivado_perc['valorfinemgar']
    del titprivado_perc['coupom']
    del titprivado_perc['percindex']
    del titprivado_perc['caracteristica']
    del titprivado_perc['percprovcred']
    del titprivado_perc['classeoperacao']
    del titprivado_perc['idinternoativo']
    del titprivado_perc['nivelrsc']
    del titprivado_perc['header_id']
    del titprivado_perc['cusip']
    del titprivado_perc['depgar']

    # Remove as duplicatas de isin
    titprivado_perc = titprivado_perc.sort(
        ['codigo_isin', 'id_papel', 'data_fim'], ascending=[True, True, True])
    titprivado_perc = titprivado_perc.drop_duplicates(
        subset=['codigo_isin', 'data_fim'])

    # titprivado_perc['data_bd'] = horario_bd
    titprivado_perc['data_bd'] = datetime.datetime.today()
    titprivado_perc = titprivado_perc.where((pd.notnull(titprivado_perc)),
                                            None)
    titprivado_perc.to_excel(save_path_titprivado_perc)

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - mtm_renda_fixa")
    pd.io.sql.to_sql(titprivado_perc,
                     name='mtm_renda_fixa',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexão
    connection.close()

    logger.info("Preenchimento tabela xml")
    # 6 - Preenchimento tabela xml
    del original['id_xml_titprivado']
    del original['pu_mercado']
    del original['mtm_mercado']
    del original['pu_curva']
    del original['mtm_curva']
    del original['pu_regra_xml']
    del original['mtm_regra_xml']
    del original['data_referencia']
    del titprivado['mtm']

    titprivado = titprivado.merge(finalizacao, on=['codigo_isin'], how='left')
    titprivado_xml = titprivado[titprivado.dt_ref ==
                                titprivado.data_referencia].copy()
    titprivado_xml = titprivado_xml.rename(columns={'mtm': 'mtm_calculado'})
    titprivado_xml['pu_mercado'] = np.where(
        titprivado_xml['caracteristica'] == 'N',
        titprivado_xml['mtm_calculado'], 0)
    titprivado_xml['pu_curva'] = np.where(
        titprivado_xml['caracteristica'] == 'V', titprivado_xml['pupar'], 0)
    titprivado_xml = titprivado_xml[[
        'id_papel', 'pu_mercado', 'pu_curva', 'data_referencia'
    ]].copy()

    final = original.merge(titprivado_xml, on=['id_papel'], how='left')

    final['pu_mercado'] = np.where(
        (final['pu_mercado'].isnull()) | (final['pu_mercado'] == 0),
        final['puposicao'], final['pu_mercado'])
    final['mtm_mercado'] = final['pu_mercado'] * (final['qtdisponivel'] +
                                                  final['qtgarantia'])

    final['pu_curva'] = np.where(final['pu_curva'].isnull(),
                                 final['puposicao'], final['pu_curva'])
    final['mtm_curva'] = final['pu_curva'] * (final['qtdisponivel'] +
                                              final['qtgarantia'])

    final['pu_regra_xml'] = np.where(final['caracteristica'] == 'N',
                                     final['pu_mercado'], final['pu_curva'])
    final['mtm_regra_xml'] = np.where(final['caracteristica'] == 'N',
                                      final['mtm_mercado'], final['mtm_curva'])

    final['data_bd'] = datetime.datetime.today()

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - xml_titprivado")
    pd.io.sql.to_sql(final,
                     name='xml_titprivado',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexão
    connection.close()
def interpolacao_curvas_bmf():

    import pymysql as db
    import pandas as pd
    import datetime
    import logging
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior

    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    #dtbase = ['2016','11','30']
    #dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]

    #Conexão com Banco de Dados
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    def interpolacao(tp_curva, dt_ref):

        global curva_ettj
        global curva_ettj_fim
        global list_of_values
        global amostra

        try:
            ano = str(dt_ref[0:4])
            mes = str(dt_ref[5:7])
            dia = str(dt_ref[8:10])
            data = datetime.date(int(ano), int(mes), int(dia))

            query = 'select * from projeto_inv.bmf_curvas_' + str(ano) + '_' + str(mes) + ' where data_ref='+'"'+dt_ref+'" and codigo='+'"'+tp_curva+'";'
            #query = "select * from projeto_inv.bmf_curvas where data_ref='2016-12-07' and codigo='PRE'"
            amostra = pd.read_sql(query, con=connection)
            logger.info("Leitura do banco de dados executada com sucesso")

            #amostra = amostra.rename(columns={'id_bmf_curva_' + str(ano) + '_' + str(mes): 'id_bmf_curva'})

            if tp_curva=='DP':
                ref_data=360
                ref_data_txt='360'
            else:
                ref_data=252
                ref_data_txt='252'
            #listar as colunas da tabela:  tp_mtm.columns.tolist()
            #amostra=curvas[curvas['Codigo']==tp_curva]
            amostra=amostra.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
            amostra.index = amostra.index + 1
            #prazo_max=max(amostra['Prazo'])

            if tp_curva=='DP':
                prazo_max=2520
                list_of_values = [21, 63, 126, 252, 378, 504, 630 , 756, 1008, 1260, 2520]

            elif tp_curva=='DIM':
                prazo_max=12600
                list_of_values = [63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780, 5040, 6300, 7560, 8820, 10080, 11340, 12600]

            elif tp_curva=='DIC':
                prazo_max=12600
                list_of_values = [63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780, 5040, 6300, 7560, 8820, 10080, 11340, 12600]

            elif tp_curva=='TP':
                prazo_max=12600
                list_of_values = [63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780, 5040, 6300, 7560, 8820, 10080, 11340, 12600]

            else:
                prazo_max=3780
                list_of_values=[21, 63, 126, 252, 378, 504, 630, 756, 1008, 1260, 2520, 3780]


            #curva_ettj=pd.DataFrame(columns=['id_bmf_curva', 'prazo','tx_spot', 'tx_spot_ano'])
            curva_ettj=pd.DataFrame(columns=['id_bmf_curva', 'prazo','tx_spot'])
            curva_ettj1=pd.DataFrame(columns=['prazo','tx_spot'])

            max_vertice=max(amostra['Prazo'])
            i=1
            i1=1
            for i1 in range(1,min(prazo_max,max_vertice)+1):
            #for i1 in range(1, prazo_max):
                if i1==amostra['Prazo'][i]:
                    curva_ettj.loc[i1]=[amostra['id_bmf_curva'][i], i1, (1+amostra[ref_data_txt][i]/100)**(i1/ref_data)-1]
                    #curva_ettj['tx_spot_ano']=(1+curva_ettj['tx_spot'])**(ref_data/curva_ettj['prazo'])-1
                    i1=i1+1
                    i=i+1

                elif i1<amostra['Prazo'][i]:
                    curva_ettj.loc[i1]=[amostra['id_bmf_curva'][i], i1, (1+amostra[ref_data_txt][i]/100)**(i1/ref_data)-1]
                    #curva_ettj['tx_spot_ano']=(1+curva_ettj['tx_spot'])**(ref_data/curva_ettj['prazo'])-1
                    i1=i1+1

                #elif i1>max_vertice:

                else:
                    #curva_ettj['tx_spot_ano'][i1]=curva_ettj['tx_spot_ano'][i1-1]
                    #curva_ettj['tx_spot'][i]=((1+curva_ettj['tx_spot_ano'][i1])**(curva_ettj['prazo'][i1]/ref_data))-1
                    curva_ettj.loc[i1]=[amostra['id_bmf_curva'][i], i1, (1+curva_ettj['tx_spot'][i1-1])*(((1+amostra[ref_data_txt][i+1]/100)**(amostra['Prazo'][i+1]/ref_data))/(1+curva_ettj['tx_spot'][i1-1]))**((i1-curva_ettj['prazo'][i1-1])/(amostra['Prazo'][i+1]-curva_ettj['prazo'][i1-1]))-1]
                    i1=i1+1

            while i1<(prazo_max+1):
                    #curva_ettj1['prazo'][0]=curva_ettj['prazo'][i1-1]+1
                    #curva_ettj1['tx_spot'][1]= (1+curva_ettj['tx_spot'][max_vertice])**(curva_ettj['prazo'][i1]/curva_ettj['prazo'][max_vertice])
                curva_ettj1.loc[i1]= [i1, ((1+curva_ettj['tx_spot'][max_vertice])**(ref_data/curva_ettj['prazo'][max_vertice]))**(i1/ref_data)-1]
                i1=i1+1

            curva_ettj=curva_ettj.append(curva_ettj1)
            curva_ettj['prazo']= curva_ettj['prazo'].astype(int)
            #curva_ettj['id_bmf_curva']= curva_ettj['id_bmf_curva'].astype(int)
            curva_ettj['tx_spot_ano']=(1+curva_ettj['tx_spot'])**(ref_data/curva_ettj['prazo'])-1
            curva_ettj['tx_spot_shift']=curva_ettj['tx_spot'].shift()
            curva_ettj['tx_spot_shift']=curva_ettj['tx_spot_shift'].fillna(0)
            curva_ettj['tx_termo_dia']=(1+curva_ettj['tx_spot'])/(1+curva_ettj['tx_spot_shift'])-1
            curva_ettj['indexador_cod']=tp_curva
            curva_ettj['dt_ref']=dt_ref

            del curva_ettj['tx_spot_shift']
            curva_ettj['prazo']=curva_ettj['prazo'].astype(int)
            curva_ettj['data_bd'] = datetime.datetime.now()
            curva_ettj_fim=curva_ettj[curva_ettj['prazo'].isin(list_of_values)]

            #Salvar no MySQL
            logger.info("Salvando base de dados - curva_ettj_vertices_fixos")
            pd.io.sql.to_sql(curva_ettj_fim, name='curva_ettj_vertices_fixos', con=connection, if_exists='append', flavor='mysql', index=0)

            logger.info("Salvando base de dados - curva_ettj_interpol_"+str(ano)+'_'+str(mes))
            pd.io.sql.to_sql(curva_ettj, name='curva_ettj_interpol_' + str(ano) + '_' + str(mes), con=connection, if_exists='append', flavor='mysql', index=0)

        except:
            logger.info("Interpolação não executada")
            return None

    dt_ref = pd.date_range (start=datetime.date(int(dtbase[0]),int(dtbase[1]),1), end=datetime.date(int(dtbase[0]),int(dtbase[1]),int(dtbase[2])), freq='D').date
    for dt in dt_ref:

        dt = str(dt)

        try:
            logger.info("Fazendo interpolacao para PRE, data --> " + str(dt))
            interpolacao('PRE', dt)
            logger.info("Finalizado PRE")

            logger.info("Fazendo interpolacao para DIC, data --> " + str(dt))
            interpolacao('DIC', dt)
            logger.info("Finalizado DIC")

            logger.info("Fazendo interpolacao para DIM, data --> " + str(dt))
            interpolacao('DIM', dt)
            logger.info("Finalizado DIM")

            logger.info("Fazendo interpolacao para DP, data --> " + str(dt))
            interpolacao('DP', dt)
            logger.info("Finalizado DP")

            logger.info("Fazendo interpolacao para TP, data --> " + str(dt))
            interpolacao('TP', dt)
            logger.info("Finalizado TP")

            logger.info("Interpolações completas")

        except:
            logger.info(dt)

    connection.close()
示例#12
0
def importacao_rating_bloomberg():

    import pandas as pd
    import pymysql as db
    import logging

    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dt_ref = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2]

    data_bd = pd.datetime.today()

    # Define as variáveis de input e output dos arquivos
    worksheet_path = full_path_from_database(
        "bloomberg_ratings_input"
    ) + 'levantamento de contrapartes ' + dt_ref + '.xlsx'

    save_path = full_path_from_database("bloomberg_ratings_output")

    bancos = pd.read_excel(worksheet_path,
                           sheetname='bancos_sem_Link',
                           skiprows=1,
                           header=0)
    logger.info("Leitura dos arquivos executada com sucesso")

    logger.info("Tratando dados")
    contraparte_rtg = pd.DataFrame(columns=[
        'cnpj', 'contraparte', 'id_bloomberg', 'issuer', 'agencia_tipo_rtg',
        'rtg', 'dt_ref', 'data_bd'
    ])

    n = len(bancos)
    i = 0
    i1 = 0
    for i in range(0, n):
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_FITCH_ST_DEBT_LC', bancos['RTG_FITCH_ST_DEBT_LC'][i], dt_ref,
            data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_FITCH_LT_ISSUER_DEFAULT',
            bancos['RTG_FITCH_LT_ISSUER_DEFAULT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_OUTLOOK',
            bancos['RTG_FITCH_OUTLOOK'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_ST_LC_DEBT',
            bancos['RTG_MDY_ST_LC_DEBT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_LC_CURR_ISSUER_RATING',
            bancos['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_OUTLOOK',
            bancos['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_SP',
            bancos['RTG_SP'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_SP_ST_LC_ISSUER_CREDIT',
            bancos['RTG_SP_ST_LC_ISSUER_CREDIT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY',
            bancos['RTG_MOODY'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY_NO_WATCH',
            bancos['RTG_MOODY_NO_WATCH'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MOODY_LONG_TERM', bancos['RTG_MOODY_LONG_TERM'][i], dt_ref,
            data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MOODY_LONG_ISSUE_LEVEL',
            bancos['RTG_MOODY_LONG_ISSUE_LEVEL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MOODY_DES',
            bancos['RTG_MOODY_DES'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_OUTLOOK',
            bancos['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_SEN_UNSECURED_DEBT',
            bancos['RTG_MDY_SEN_UNSECURED_DEBT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_INITIAL',
            bancos['RTG_MDY_INITIAL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_LC_CURR_ISSUER_RATING',
            bancos['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_LT_CORP_FAMILY', bancos['RTG_MDY_LT_CORP_FAMILY'][i],
            dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_ISSUER',
            bancos['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR',
            bancos['RTG_MDY_NSR'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR',
            bancos['RTG_MDY_NSR'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_MDY_NSR_ISSUER',
            bancos['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_NSR_SHORT_TERM', bancos['RTG_MDY_NSR_SHORT_TERM'][i],
            dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_NSR_SR_UNSECURED', bancos['RTG_MDY_NSR_SR_UNSECURED'][i],
            dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_NSR_SUBORDINATED', bancos['RTG_MDY_NSR_SUBORDINATED'][i],
            dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_MDY_NSR_LT_CORP_FAMILY',
            bancos['RTG_MDY_NSR_LT_CORP_FAMILY'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_SP_NATIONAL',
            bancos['RTG_SP_NATIONAL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_SP_NATIONAL_LT_ISSUER_CREDIT',
            bancos['RTG_SP_NATIONAL_LT_ISSUER_CREDIT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_FITCH_NATIONAL_LT', bancos['RTG_FITCH_NATIONAL_LT'][i],
            dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i], 'RTG_FITCH_NATIONAL',
            bancos['RTG_FITCH_NATIONAL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_FITCH_NATIONAL_ST', bancos['RTG_FITCH_NATIONAL_ST'][i],
            dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_FITCH_NATL_SUBORDINATED',
            bancos['RTG_FITCH_NATL_SUBORDINATED'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        contraparte_rtg.loc[i1] = [
            bancos['cnpj'][i].astype(str).zfill(14), bancos['contraparte'][i],
            bancos['Nome Busca'][i], bancos['ISSUER'][i],
            'RTG_FITCH_NATIONAL_SR_UNSECURED',
            bancos['RTG_FITCH_NATIONAL_SR_UNSECURED'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        i = i + 1

    base_contraparte = contraparte_rtg[(~contraparte_rtg['rtg'].isnull()) & (
        contraparte_rtg['rtg'] != '#N/A Field Not Applicable')]

    # importar rating por isin
    isin = pd.read_excel(worksheet_path,
                         sheetname='isin_sem_link',
                         skiprows=1,
                         header=0)

    logger.info("Leitura dos arquivos executada com sucesso")

    isin_rtg = pd.DataFrame(columns=[
        'cnpj', 'contraparte', 'isin', 'id_bloomberg', 'agencia_tipo_rtg',
        'rtg', 'dt_ref', 'data_bd'
    ])

    n = len(isin)
    i = 0
    i1 = 0
    for i in range(0, n):
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_ST_DEBT_LC',
            isin['RTG_FITCH_ST_DEBT_LC'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_FITCH_LT_ISSUER_DEFAULT',
            isin['RTG_FITCH_LT_ISSUER_DEFAULT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_OUTLOOK',
            isin['RTG_FITCH_OUTLOOK'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_ST_LC_DEBT',
            isin['RTG_MDY_ST_LC_DEBT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_MDY_LC_CURR_ISSUER_RATING',
            isin['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_OUTLOOK',
            isin['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_SP',
            isin['RTG_SP'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_SP_ST_LC_ISSUER_CREDIT',
            isin['RTG_SP_ST_LC_ISSUER_CREDIT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY',
            isin['RTG_MOODY'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY_NO_WATCH',
            isin['RTG_MOODY_NO_WATCH'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY_LONG_TERM',
            isin['RTG_MOODY_LONG_TERM'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_MOODY_LONG_ISSUE_LEVEL',
            isin['RTG_MOODY_LONG_ISSUE_LEVEL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MOODY_DES',
            isin['RTG_MOODY_DES'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_OUTLOOK',
            isin['RTG_MDY_OUTLOOK'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_MDY_SEN_UNSECURED_DEBT',
            isin['RTG_MDY_SEN_UNSECURED_DEBT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_INITIAL',
            isin['RTG_MDY_INITIAL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_MDY_LC_CURR_ISSUER_RATING',
            isin['RTG_MDY_LC_CURR_ISSUER_RATING'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_LT_CORP_FAMILY',
            isin['RTG_MDY_LT_CORP_FAMILY'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_ISSUER',
            isin['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR',
            isin['RTG_MDY_NSR'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR',
            isin['RTG_MDY_NSR'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_ISSUER',
            isin['RTG_MDY_NSR_ISSUER'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_SHORT_TERM',
            isin['RTG_MDY_NSR_SHORT_TERM'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_SR_UNSECURED',
            isin['RTG_MDY_NSR_SR_UNSECURED'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_MDY_NSR_SUBORDINATED',
            isin['RTG_MDY_NSR_SUBORDINATED'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_MDY_NSR_LT_CORP_FAMILY',
            isin['RTG_MDY_NSR_LT_CORP_FAMILY'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_SP_NATIONAL',
            isin['RTG_SP_NATIONAL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_SP_NATIONAL_LT_ISSUER_CREDIT',
            isin['RTG_SP_NATIONAL_LT_ISSUER_CREDIT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATIONAL_LT',
            isin['RTG_FITCH_NATIONAL_LT'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATIONAL',
            isin['RTG_FITCH_NATIONAL'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i], 'RTG_FITCH_NATIONAL_ST',
            isin['RTG_FITCH_NATIONAL_ST'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_FITCH_NATL_SUBORDINATED',
            isin['RTG_FITCH_NATL_SUBORDINATED'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        isin_rtg.loc[i1] = [
            isin['cnpj'][i].astype(str).zfill(14), isin['contraparte'][i],
            isin['isin'][i], isin['Nome Busca'][i],
            'RTG_FITCH_NATIONAL_SR_UNSECURED',
            isin['RTG_FITCH_NATIONAL_SR_UNSECURED'][i], dt_ref, data_bd
        ]
        i1 = i1 + 1
        i = i + 1

    isin_rtg_fim = isin_rtg[(~isin_rtg['rtg'].isnull())
                            & (isin_rtg['rtg'] != '#N/A Field Not Applicable')
                            & (isin_rtg['rtg'] != '#N/A Invalid Security')]

    issuer = isin_rtg_fim[isin_rtg_fim['agencia_tipo_rtg'].str.contains(
        'ISSUER')]
    isin_final = isin_rtg_fim[~isin_rtg_fim['agencia_tipo_rtg'].str.
                              contains('ISSUER')]
    del isin_final['cnpj']
    del isin_final['contraparte']
    del issuer['isin']
    base_contraparte = base_contraparte.append(issuer)

    base_contraparte['cnpj'] = base_contraparte['cnpj'].str.split('.')
    base_contraparte['cnpj'] = base_contraparte['cnpj'].str[0]
    base_contraparte['rtg'] = base_contraparte['rtg'].replace(
        to_replace='#N/A Requesting Data...', value=None)

    logger.info("Conectando no Banco de dados")

    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")

    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - Tabela rating_isin")

    pd.io.sql.to_sql(isin_final,
                     name='rating_isin',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    logger.info("Salvando base de dados - Tabela rating_contraparte")

    pd.io.sql.to_sql(base_contraparte,
                     name='rating_contraparte',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    connection.close()

    base_contraparte.to_excel(save_path + 'contrapartes.xlsx')
    logger.info("Arquivos salvos com sucesso")
示例#13
0
def mtm_curva_debenture():

    import datetime, time
    import pandas as pd
    import pymysql as db
    import numpy as np
    import logging
    from findt import FinDt
    from pandas import ExcelWriter
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]

    # Diretório de save de planilhas
    save_path_puposicao_final = full_path_from_database(
        'get_output_quadro419') + 'puposicao_final_deb.xlsx'
    save_path_teste_dif_deb = full_path_from_database(
        'get_output_quadro419') + 'teste_dif_deb.xlsx'
    feriados_sheet = full_path_from_database(
        'feriados_nacionais') + 'feriados_nacionais.csv'

    tol = 0.20

    writer = ExcelWriter(save_path_puposicao_final)

    dt_base_rel = datetime.date(int(dtbase[0]), int(dtbase[1]), int(dtbase[2]))

    # 1 - Leitura e criação de tabelas
    # Informações do cálculo de MTM
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = "SELECT * FROM projeto_inv.mtm_titprivado WHERE tipo_ativo = 'DBS'"
    #query = "SELECT * FROM projeto_inv.mtm_titprivado"
    mtm_titprivado0 = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    mtm_titprivado = mtm_titprivado0.copy()

    # Seleciona debentures

    # Seleciona a última carga de debentures da data da posicao
    mtm_titprivado['dtrel'] = mtm_titprivado['id_papel'].str.split('_')
    mtm_titprivado['dtrel'] = mtm_titprivado['dtrel'].str[0]

    mtm_titprivado = mtm_titprivado[mtm_titprivado.dtrel ==
                                    dtbase_concat].copy()
    mtm_titprivado = mtm_titprivado[mtm_titprivado.data_bd == max(
        mtm_titprivado.data_bd)]

    # Renomeia columnas
    mtm_titprivado = mtm_titprivado.rename(columns={
        'data_fim': 'dt_ref',
        'dtoperacao': 'dtoperacao_mtm'
    })

    # Reajusta papéis indesaxos a DI
    mtm_titprivado['dt_ref'] = pd.to_datetime(mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = np.where(
        mtm_titprivado['indexador'] == 'DI1',
        mtm_titprivado['dt_ref'] + pd.DateOffset(months=0, days=1),
        mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = mtm_titprivado['dt_ref'].dt.date

    # Altera o nome do id_papel para levar em consideração o flag
    mtm_titprivado['id_papel_old'] = mtm_titprivado['id_papel']
    mtm_titprivado['id_papel'] = mtm_titprivado['id_papel_old'].str.split('_')
    mtm_titprivado['id_papel'] = mtm_titprivado['id_papel'].str[0] + '_' + mtm_titprivado['id_papel'].str[1] + '_' + \
                                 mtm_titprivado['id_papel'].str[2]

    del mtm_titprivado['data_bd']
    del mtm_titprivado['dtrel']

    query = 'SELECT * FROM projeto_inv.xml_debenture_org'
    xml_titprivado = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    # Seleciona a última carga de debentures da data da posicao
    xml_titprivado['dtrel'] = xml_titprivado['id_papel'].str.split('_')
    xml_titprivado['dtrel'] = xml_titprivado['dtrel'].str[0]

    xml_titprivado = xml_titprivado[xml_titprivado.dtrel ==
                                    dtbase_concat].copy()
    xml_titprivado = xml_titprivado[xml_titprivado.data_bd == max(
        xml_titprivado.data_bd)]

    original = xml_titprivado.copy()

    del xml_titprivado['data_bd']
    del xml_titprivado['indexador']
    del xml_titprivado['dtrel']

    # Puxa as informações de negociação em mercado secuindário da Anbima para debentures -> linha dtspread
    query = 'SELECT * FROM projeto_inv.anbima_debentures'
    anbima_deb = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    anbima_deb = anbima_deb[anbima_deb.data_referencia <= dt_base_rel]
    anbima_deb = anbima_deb.sort(['codigo', 'data_referencia', 'data_bd'],
                                 ascending=[True, True, True])
    anbima_deb = anbima_deb.drop_duplicates(subset=['codigo'], take_last=True)
    anbima_deb = anbima_deb[['codigo', 'data_referencia', 'pu']].copy()
    anbima_deb['codigo'] = anbima_deb['codigo'].astype(str)
    anbima_deb = anbima_deb.rename(columns={
        'codigo': 'coddeb',
        'data_referencia': 'data_spread'
    })
    anbima_deb.coddeb.unique().tolist()
    xml_titprivado.coddeb.unique().tolist()

    # Criação da tabela xml + anbima
    xml_titprivado = xml_titprivado.merge(anbima_deb,
                                          on=['coddeb'],
                                          how='left')

    # Para os papéis que não tiveram negociação, assume data_spread = data_relatorio
    xml_titprivado['data_spread'] = np.where(
        xml_titprivado['data_spread'].isnull(), dt_base_rel,
        xml_titprivado['data_spread'])

    # Preenchimento com puposicao do xml no pu vindo da anbima quando não tem pu
    # Tira o valor médio de todos os pu's posicao
    x = xml_titprivado[['isin', 'puposicao']].groupby(['isin']).agg(['mean'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['isin', 'pumedio'])
    x1['isin'] = x['isin']
    x1['pumedio'] = x['puposicao']
    xml_titprivado = xml_titprivado.merge(x1, on=['isin'], how='left')

    xml_titprivado['pu'] = np.where(xml_titprivado['pu'].isnull(),
                                    xml_titprivado['pumedio'],
                                    xml_titprivado['pu'])

    del xml_titprivado['pumedio']

    # Criação da tabela mtm + xml
    titprivado = xml_titprivado.merge(mtm_titprivado,
                                      on=['id_papel'],
                                      how='left')

    # Criação da coluna de data de referencia da posição
    titprivado['data_referencia'] = titprivado['id_papel'].str[0:8]
    titprivado['data_referencia'] = pd.to_datetime(
        titprivado['data_referencia']).dt.date

    titprivado.caracteristica.unique()

    logger.info("Cálculo marcação na curva")
    # 2 - Cálculo marcação na curva

    ###### AQUI ZERA!!################# Verificar
    titprivado_curva = titprivado[titprivado.caracteristica == 'V'].copy()

    del titprivado_curva['vne']

    # Seleciona a parte do fluxo entre a data da compra e a data da posição
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref >= titprivado_curva.dtoperacao_mtm].copy()
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref <= titprivado_curva.data_referencia].copy()

    # Preenchimento do VNE na data da compra
    tp_curva_dtop = titprivado_curva[[
        'id_papel_old', 'saldo_dev_juros_perc', 'pucompra'
    ]][titprivado_curva.dt_ref == titprivado_curva.dtoperacao_mtm].copy()

    tp_curva_dtop['vne'] = tp_curva_dtop['pucompra'] * (
        1 - tp_curva_dtop['saldo_dev_juros_perc'])

    del tp_curva_dtop['saldo_dev_juros_perc']
    del tp_curva_dtop['pucompra']

    titprivado_curva = titprivado_curva.merge(tp_curva_dtop,
                                              on=['id_papel_old'],
                                              how='left')

    titprivado_curva[
        'principal_perc_acum'] = 1 - titprivado_curva['principal_perc']
    titprivado_curva['principal_perc_acum'] = titprivado_curva[[
        'id_papel_old', 'principal_perc_acum'
    ]].groupby(['id_papel_old']).agg(['cumprod'])
    titprivado_curva['vne'] = titprivado_curva['vne'] * titprivado_curva[
        'principal_perc_acum']
    titprivado_curva['pagto_juros'] = titprivado_curva[
        'vne'] * titprivado_curva['pagto_juros_perc']
    titprivado_curva[
        'vna'] = titprivado_curva['vne'] * titprivado_curva['fator_index_per']
    titprivado_curva['vna'][titprivado_curva.indexador ==
                            'DI1'] = titprivado_curva['vne'][
                                titprivado_curva.indexador == 'DI1']
    titprivado_curva['saldo_dev_juros'] = titprivado_curva[
        'vna'] * titprivado_curva['saldo_dev_juros_perc']
    titprivado_curva['pupar'] = titprivado_curva['vna'] + titprivado_curva[
        'saldo_dev_juros'] + titprivado_curva['pagto_juros']
    titprivado_curva['dif_curva'] = titprivado_curva[
        'pupar'] / titprivado_curva['puposicao'] - 1
    titprivado_curva['dif_curva'] = titprivado_curva['dif_curva'].abs()
    titprivado_curva = titprivado_curva[
        titprivado_curva.dt_ref == titprivado_curva.data_referencia].copy()
    titprivado_curva = titprivado_curva[[
        'id_papel_old', 'id_papel', 'codigo_isin', 'dif_curva', 'pupar'
    ]].copy()
    titprivado_curva = titprivado_curva.sort(['dif_curva'], ascending=[True])
    titprivado_curva = titprivado_curva.drop_duplicates(subset=['id_papel'],
                                                        take_last=False)

    titprivado = titprivado.merge(
        titprivado_curva,
        on=['id_papel_old', 'id_papel', 'codigo_isin'],
        how='left')
    titprivado = titprivado[((titprivado.caracteristica == 'V') &
                             (titprivado.dif_curva.notnull())) |
                            (titprivado.caracteristica == 'N')].copy()
    titprivado = titprivado.reset_index(level=None,
                                        drop=True,
                                        inplace=False,
                                        col_level=0,
                                        col_fill='')

    logger.info("Cálculo do mtm na data_spread; a)prazo_du_spread")
    # 3 - Cálculo do mtm na data_spread; a) prazo_du_spread

    # Verificação de papéis sem a data de referência
    titprivado[titprivado.dt_ref.isnull()].to_excel(writer, 'dt_ref_NaN')

    # Retira papéis sem data de referência
    titprivado = titprivado[titprivado.dt_ref.notnull()].copy()

    # Cria vetor das datas
    dt_min = min(titprivado['dt_ref'])
    dt_min = dt_min.replace(day=1)
    dt_min = datetime.date(dt_min.year, dt_min.month, dt_min.day)

    dt_max = max(titprivado['dt_ref'])
    dt_max = dt_max.replace(day=1, month=dt_max.month)
    dt_max = dt_max + pd.DateOffset(months=1)
    dt_max = dt_max - pd.DateOffset(days=1)
    dt_max = datetime.date(dt_max.year, dt_max.month, dt_max.day)

    dt_ref = pd.date_range(start=dt_min, end=dt_max, freq='D').date

    serie_dias = pd.DataFrame(columns=['dt_ref', 'aux'])
    serie_dias['dt_ref'] = dt_ref

    # Cria vetor das datas úteis
    per = FinDt.DatasFinanceiras(dt_min, dt_max, path_arquivo=feriados_sheet)

    du = pd.DataFrame(columns=['dt_ref'])
    du['dt_ref'] = per.dias(3)
    du['du_1'] = 1

    serie_dias = serie_dias.merge(du, on=['dt_ref'], how='left')

    serie_dias['du_1'] = serie_dias['du_1'].fillna(0)

    serie_dias['indice_du'] = np.cumsum(serie_dias['du_1'])

    del serie_dias['aux']
    del serie_dias['du_1']

    fim = serie_dias.copy()
    fim = fim.rename(columns={'indice_du': 'indice_du_fim_spread'})

    inicio = serie_dias.copy()
    inicio = inicio.rename(columns={
        'dt_ref': 'data_spread',
        'indice_du': 'indice_du_inicio_spread'
    })

    # Une as séries dias à tabela titprivado
    titprivado = titprivado.merge(fim, on=['dt_ref'], how='left')
    titprivado = titprivado.merge(inicio, on=['data_spread'], how='left')

    # Calcula o prazo_du_spread
    titprivado['prazo_du_spread'] = titprivado[
        'indice_du_fim_spread'] - titprivado['indice_du_inicio_spread']

    logger.info("Cálculo do mtm na data_spread; b) taxa_spot")
    # 4 - Cálculo do mtm na data_spread; b) taxa_spot

    if len(titprivado[titprivado.indexador == 'PRE']) != 0:
        maximo_tp_PRE = max(
            titprivado['prazo_du_spread'][titprivado.indexador == 'PRE'])

    if len(titprivado[titprivado.indexador == 'IGP']) != 0:
        maximo_tp_IGPM = max(
            titprivado['prazo_du_spread'][titprivado.indexador == 'IGP'])

    if len(titprivado[titprivado.indexador == 'IPCA']) != 0:
        maximo_tp_IPCA = max(
            titprivado['prazo_du_spread'][titprivado.indexador == 'IPCA'])

    # ----Base de interpolações para cálculo do spread
    dt_min_interpol = str(min(titprivado['data_spread']))

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    # Data de 2020 limite para a criacao das tabelas
    dt_ref = pd.date_range(start=datetime.date(int(dt_min_interpol[0:4]),
                                               int(dt_min_interpol[5:7]), 1),
                           end=datetime.date(int(2020), int(10), 31),
                           freq='M').date

    # Uniao das tabelas criadas com union all
    query = ''
    for dt in dt_ref:
        month = '0' + str(dt.month) if len(str(dt.month)) == 1 else str(
            dt.month)
        year = '0' + str(dt.year) if len(str(dt.year)) == 1 else str(dt.year)
        query = query + 'SELECT * FROM projeto_inv.curva_ettj_interpol_' + year + "_" + month + " UNION ALL "
    query = query[:-11]

    query = 'select * from (' + query + ') AS a where dt_ref<=' + '"' + dtbase_concat + '" and dt_ref>=' + '"' + dt_min_interpol + '" and indexador_cod in("PRE","DIM","DIC");'

    ettj = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    # Seleciona a última carga
    ettj = ettj.sort(['indexador_cod', 'dt_ref', 'data_bd'],
                     ascending=[True, False, False])
    ettj = ettj.drop_duplicates(subset=[
        'prazo', 'tx_spot', 'tx_spot_ano', 'tx_termo_dia', 'indexador_cod'
    ],
                                take_last=False)
    ettj['indexador'] = np.where(
        ettj['indexador_cod'] == 'DIC', 'IPCA',
        np.where(ettj['indexador_cod'] == 'DIM', 'IGP', 'PRE'))
    ettj = ettj.rename(columns={'prazo': 'prazo_du'})
    ettj_filtro = ettj[['prazo_du', 'tx_spot', 'tx_spot_ano', 'indexador']]
    ettj_filtro = ettj_filtro.rename(columns={'prazo_du': 'prazo_du_spread'})

    # Extrapolação PRE, se necessário
    if len(titprivado[titprivado.indexador == 'PRE']) != 0:
        maximo_ettj = max(
            ettj_filtro['prazo_du_spread'][ettj_filtro.indexador == 'PRE'])
        # del ettj_fluxo
        if maximo_ettj < max(
                titprivado['prazo_du_spread'][titprivado.indexador == 'PRE']):
            ettj_filtro_PRE = ettj_filtro[[
                'prazo_du_spread', 'tx_spot_ano', 'indexador'
            ]][ettj_filtro.indexador == 'PRE'].copy()
            ettj_filtro_PRE = ettj_filtro_PRE.reset_index(level=None,
                                                          drop=True,
                                                          inplace=False,
                                                          col_level=0,
                                                          col_fill='')
            ettj_filtro_PRE = ettj_filtro_PRE[0:maximo_ettj - 1].copy()

            tx_max = ettj_filtro_PRE['tx_spot_ano'].loc[len(ettj_filtro_PRE) -
                                                        1]

            ettj_aux = pd.DataFrame(columns=['prazo_du_spread', 'indexador'])
            ettj_aux['prazo_du_spread'] = np.linspace(1, maximo_tp_PRE,
                                                      maximo_tp_PRE)
            ettj_aux['indexador'] = 'PRE'
            ettj_aux = ettj_aux.merge(ettj_filtro_PRE,
                                      on=['prazo_du_spread', 'indexador'],
                                      how='left')
            ettj_aux['tx_spot_ano'] = ettj_aux['tx_spot_ano'].fillna(tx_max)
            ettj_aux['tx_spot'] = (1 + ettj_aux['tx_spot_ano'])**(
                ettj_aux['prazo_du_spread'] / 252) - 1
            ettj_fluxo = ettj_fluxo.append(ettj_aux)
        else:
            ettj_aux = ettj_filtro.copy()
            ettj_fluxo = ettj_aux.copy()
    else:
        ettj_fluxo = ettj_filtro.copy()

    # Extrapolação IGPM, se necessário
    if len(titprivado[titprivado.indexador == 'IGP']) != 0:
        maximo_ettj = max(
            ettj_filtro['prazo_du_spread'][ettj_filtro.indexador == 'IGP'])
        # del ettj_fluxo
        if maximo_ettj < max(
                titprivado['prazo_du_spread'][titprivado.indexador == 'IGP']):
            ettj_filtro_IGPM = ettj_filtro[[
                'prazo_du_spread', 'tx_spot_ano', 'indexador'
            ]][ettj_filtro.indexador == 'IGP'].copy()
            ettj_filtro_IGPM = ettj_filtro_IGPM.reset_index(level=None,
                                                            drop=True,
                                                            inplace=False,
                                                            col_level=0,
                                                            col_fill='')
            ettj_filtro_IGPM = ettj_filtro_IGPM[0:maximo_ettj - 1].copy()

            tx_max = ettj_filtro_IGPM['tx_spot_ano'].loc[len(ettj_filtro_IGPM)
                                                         - 1]

            ettj_aux = pd.DataFrame(columns=['prazo_du_spread', 'indexador'])
            ettj_aux['prazo_du_spread'] = np.linspace(1, maximo_tp_IGPM,
                                                      maximo_tp_IGPM)
            ettj_aux['indexador'] = 'IGP'
            ettj_aux = ettj_aux.merge(ettj_filtro_IGPM,
                                      on=['prazo_du_spread', 'indexador'],
                                      how='left')
            ettj_aux['tx_spot_ano'] = ettj_aux['tx_spot_ano'].fillna(tx_max)
            ettj_aux['tx_spot'] = (1 + ettj_aux['tx_spot_ano'])**(
                ettj_aux['prazo_du_spread'] / 252) - 1
            ettj_fluxo = ettj_fluxo.append(ettj_aux)
        else:
            ettj_aux = ettj_filtro.copy()
            ettj_fluxo = ettj_aux.copy()
    else:
        ettj_fluxo = ettj_filtro.copy()

    # Extrapolação IPCA, se necessário
    if len(titprivado[titprivado.indexador == 'IPCA']) != 0:
        maximo_ettj = max(
            ettj_filtro['prazo_du_spread'][ettj_filtro.indexador == 'IPCA'])
        # del ettj_fluxo
        if maximo_ettj < max(
                titprivado['prazo_du_spread'][titprivado.indexador == 'IPCA']):
            ettj_filtro_IPCA = ettj_filtro[[
                'prazo_du_spread', 'tx_spot_ano', 'indexador'
            ]][ettj_filtro.indexador == 'IPCA'].copy()
            ettj_filtro_IPCA = ettj_filtro_IPCA.reset_index(level=None,
                                                            drop=True,
                                                            inplace=False,
                                                            col_level=0,
                                                            col_fill='')
            ettj_filtro_IPCA = ettj_filtro_IPCA[0:maximo_ettj - 1].copy()

            tx_max = ettj_filtro_IPCA['tx_spot_ano'].loc[len(ettj_filtro_IPCA)
                                                         - 1]

            ettj_aux = pd.DataFrame(columns=['prazo_du_spread', 'indexador'])
            ettj_aux['prazo_du_spread'] = np.linspace(1, maximo_tp_IPCA,
                                                      maximo_tp_IPCA)
            ettj_aux['indexador'] = 'IPCA'
            ettj_aux = ettj_aux.merge(ettj_filtro_IPCA,
                                      on=['prazo_du_spread', 'indexador'],
                                      how='left')
            ettj_aux['tx_spot_ano'] = ettj_aux['tx_spot_ano'].fillna(tx_max)
            ettj_aux['tx_spot'] = (1 + ettj_aux['tx_spot_ano'])**(
                ettj_aux['prazo_du_spread'] / 252) - 1
            ettj_fluxo = ettj_fluxo.append(ettj_aux)
        else:
            ettj_aux = ettj_filtro.copy()
            ettj_fluxo = ettj_aux.copy()
    else:
        ettj_fluxo = ettj_filtro.copy()

    # Une a ETTJ à tabela titprivado
    ettj_fluxo = ettj_fluxo.rename(columns={
        'tx_spot': 'tx_spot_spread',
        'tx_spot_ano': 'tx_spot_ano_spread'
    })
    titprivado = titprivado.merge(ettj_fluxo,
                                  on=['prazo_du_spread', 'indexador'],
                                  how='left')

    # Preenche com 0 onde não tem taxa spot (prazo_su_spread<0, indexador=DI1)
    titprivado['tx_spot_spread'] = titprivado['tx_spot_spread'].fillna(0)
    titprivado['tx_spot_ano_spread'] = titprivado['tx_spot_ano_spread'].fillna(
        0)

    logger.info("Cálculo do mtm na data_spread; b) valor presente e mtm")
    # 5 - Cálculo do mtm na data_spread; c) valor presente e mtm

    titprivado['fator_desconto_spread'] = 1 / (1 +
                                               titprivado['tx_spot_spread'])
    titprivado[
        'pv_spread'] = titprivado['fv'] * titprivado['fator_desconto_spread']
    titprivado['pv_spread'] = np.where(titprivado['prazo_du_spread'] < 0, 0,
                                       titprivado['pv_spread'])

    x = titprivado[['id_papel',
                    'pv_spread']].groupby(['id_papel']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['id_papel', 'mtm_spread'])
    x1['id_papel'] = x['id_papel']
    x1['mtm_spread'] = x['pv_spread']
    titprivado = titprivado.merge(x1, on=['id_papel'], how='left')
    titprivado['dif'] = titprivado['mtm_spread'] / titprivado['pu'] - 1

    writer = ExcelWriter(save_path_puposicao_final)

    aux = titprivado.drop_duplicates(subset=['codigo_isin'])
    aux[[
        'id_papel_old', 'codigo_isin', 'flag', 'indexador', 'puemissao',
        'data_emissao', 'data_expiracao', 'puposicao', 'percentual_indexador',
        'taxa_juros', 'pu', 'mtm_spread', 'dif'
    ]].to_excel(writer, 'dif')

    logger.info("Cálculo spread de crédito")
    # 6 - Cálculo spread de crédito

    titprivado_spread = \
    titprivado[['id_papel', 'codigo_isin', 'data_spread', 'pu', 'dt_ref', 'prazo_du_spread', 'pv_spread']][
        (titprivado.caracteristica == 'N') & (titprivado.dif != 1)]

    # Seleciona apenas o fluxo com prazo_du positivo
    titprivado_spread = titprivado_spread[
        titprivado_spread.dt_ref >= titprivado_spread.data_spread]
    titprivado_spread = titprivado_spread.drop_duplicates(
        subset=['id_papel', 'prazo_du_spread'])
    titprivado_spread['pv_pv_fluxo'] = np.where(
        titprivado_spread['dt_ref'] == titprivado_spread['data_spread'],
        -titprivado_spread['pu'], titprivado_spread['pv_spread'])
    tp_spread = titprivado_spread[[
        'id_papel', 'dt_ref', 'prazo_du_spread', 'pv_pv_fluxo'
    ]].copy()
    tp_spread['prazo_du'] = tp_spread['prazo_du_spread'].astype(float)
    tp_spread = tp_spread.drop_duplicates(
        subset=['id_papel', 'prazo_du_spread'], take_last=True)

    id_papel = titprivado_spread['id_papel'].unique()
    spread = np.zeros((len(id_papel)))

    spread_aux = pd.DataFrame(columns=['id_papel', 'spread'])
    spread_aux['id_papel'] = id_papel

    start_time = time.time()
    for i in range(0, len(id_papel)):
        v = tp_spread['pv_pv_fluxo'][tp_spread.id_papel == id_papel[i]].values
        v = np.meshgrid(v, sparse=True)

        s = np.linspace(-0.9999, 0.9999, 10000)
        t = tp_spread['prazo_du_spread'][tp_spread.id_papel ==
                                         id_papel[i]].values
        t, s = np.meshgrid(t, s, sparse=True)
        f_ts = 1. / (1 + s)**(t / 252)

        f_spread = v * f_ts

        f_sum = f_spread.sum(axis=1, dtype='float')

        min_index = abs(f_sum).argmin()

        spread[i] = s[min_index]

        print(time.time() - start_time, i, id_papel[i], spread[i])

        spread_aux['spread'].iloc[i] = spread[i]

    titprivado = titprivado.merge(spread_aux, on=['id_papel'], how='left')

    aux = titprivado.drop_duplicates(subset=['id_papel'])

    aux[[
        'id_papel_old', 'codigo_isin', 'valor_nominal', 'puposicao',
        'mtm_spread', 'pu', 'spread'
    ]].to_excel(save_path_teste_dif_deb)

    logger.info("Seleção dos papéis cuja marcação não ficou boa")
    # 7 - Seleção dos papéis cuja marcação não ficou boa

    tp_bigdif = titprivado[[
        'data_spread', 'codigo_isin', 'id_papel', 'flag', 'indexador',
        'dtemissao', 'data_emissao', 'dtvencimento', 'data_expiracao',
        'valor_nominal', 'puemissao', 'juros_cada', 'coupom', 'taxa_juros',
        'percentual_indexador', 'percindex', 'perc_amortizacao', 'dt_ref',
        'vne', 'du_per', 'prazo_du', 'fator_index_per', 'fator_juros_per',
        'pv', 'fv', 'mtm', 'puposicao', 'pu', 'dif', 'spread'
    ]].copy()

    tp_bigdif['dif'] = tp_bigdif['mtm'] / tp_bigdif['pu'] - 1

    tp_bigdif[(tp_bigdif.dif > tol) | (tp_bigdif.dif < -tol) |
              (tp_bigdif.spread > tol) | (tp_bigdif.spread < -tol)].to_excel(
                  writer, 'bigdif')

    logger.info(
        "Atualização do fluxo de percentual de mtm com o spread e carregamento da tabela"
    )
    # 8 - Atualização do fluxo de percentual de mtm com o spread e carregamento da tabela para preenchimento do quadro 419

    titprivado_perc = titprivado.copy()

    titprivado_perc = titprivado_perc.rename(
        columns={
            'mtm': 'mtm_old',
            'pv': 'pv_old',
            'pv_DV100': 'pv_DV100_old',
            'fator_desconto': 'fator_desconto_old',
            'fator_desconto_DV100': 'fator_desconto_DV100_old',
            'DV100': 'DV100_old'
        })

    # Escolhe o melhor spread - SIGNIFICA O MELHOR FLUXO
    titprivado_perc['spread'] = titprivado_perc['spread'].fillna(0)

    # Pega penas uma linha para não ter problemas
    x = titprivado_perc[[
        'id_papel', 'codigo_isin', 'spread'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()

    x = x.sort(['codigo_isin', 'spread'], ascending=[True, True])
    x = x.drop_duplicates(subset=['codigo_isin'], take_last=False)

    x['marker'] = 1

    titprivado_perc = titprivado_perc.merge(
        x, on=['codigo_isin', 'id_papel', 'spread'], how='left')

    titprivado_perc = titprivado_perc[titprivado_perc.marker == 1].copy()
    del titprivado_perc['marker']

    titprivado_perc = titprivado_perc.drop_duplicates(
        subset=['codigo_isin', 'dt_ref'], take_last=True)

    # titprivado_perc['puposicao_final'] = np.where(titprivado_perc['caracteristica']=='N',titprivado_perc['pu'],titprivado_perc['mtm_old'])

    titprivado_perc = titprivado_perc[titprivado_perc.prazo_du >= 0]

    aux = titprivado_perc[[
        'id_papel', 'codigo_isin'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()
    aux = aux.drop_duplicates(subset=['codigo_isin'], take_last=True)
    aux['marker'] = 1

    titprivado_perc = titprivado_perc.merge(aux,
                                            on=['id_papel', 'codigo_isin'],
                                            how='left')
    titprivado_perc = titprivado_perc[titprivado_perc.marker == 1].copy()
    del titprivado_perc['marker']

    # Recalcula apenas para que está marcado a mercado
    aux = titprivado_perc[titprivado_perc.caracteristica == 'V'].copy()
    aux['mtm_DV100_N'] = 0.0
    aux = aux.rename(columns={'mtm_old': 'mtm'})

    titprivado_perc = titprivado_perc[titprivado_perc.caracteristica ==
                                      'N'].copy()

    # Cálculo do fator de desconto atualizado pelo spread
    titprivado_perc[
        'fator_desconto'] = titprivado_perc['fator_desconto_old'] / (
            1 + titprivado_perc['spread'])**(titprivado_perc['prazo_du'] / 252)
    titprivado_perc['fator_desconto_DV100'] = titprivado_perc[
        'fator_desconto_DV100_old'] / (1 + titprivado_perc['spread'])**(
            titprivado_perc['prazo_du'] / 252)

    # Calculo do pv
    titprivado_perc[
        'pv'] = titprivado_perc['fv'] * titprivado_perc['fator_desconto']
    titprivado_perc['pv_DV100'] = titprivado_perc['fv'] * titprivado_perc[
        'fator_desconto_DV100']

    # Calculo do MTM
    x = titprivado_perc[['codigo_isin', 'pv',
                         'pv_DV100']].groupby(['codigo_isin']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'mtm', 'mtm_DV100_N'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['mtm'] = x['pv']
    x1['mtm_DV100_N'] = x['pv_DV100']
    titprivado_perc = titprivado_perc.merge(x1, on=['codigo_isin'], how='left')

    titprivado_perc['mtm_DV100'] = 0.0

    # Escolhe o melhor fluxo
    titprivado_perc['dif_new'] = titprivado_perc['mtm'] - titprivado_perc['pu']
    titprivado_perc['dif_new'] = titprivado_perc['dif_new'].abs()
    titprivado_perc[
        'dif_old'] = titprivado_perc['mtm_old'] - titprivado_perc['pu']
    titprivado_perc['dif_old'] = titprivado_perc['dif_old'].abs()

    titprivado_perc['mtm'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['mtm_old'], titprivado_perc['mtm'])
    titprivado_perc['mtm_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['mtm_DV100'], titprivado_perc['mtm_DV100_N'])
    titprivado_perc['pv'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['pv_old'], titprivado_perc['pv'])
    titprivado_perc['pv_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['pv_DV100_old'], titprivado_perc['pv_DV100'])
    titprivado_perc['fator_desconto'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['fator_desconto_old'],
        titprivado_perc['fator_desconto'])
    titprivado_perc['fator_desconto_DV100'] = np.where(
        titprivado_perc['dif_old'] < titprivado_perc['dif_new'],
        titprivado_perc['fator_desconto_DV100_old'],
        titprivado_perc['fator_desconto_DV100'])

    titprivado_perc[
        'dif_perc'] = titprivado_perc['dif_new'] / titprivado_perc['pu']

    # titprivado_perc['mtm'] = np.where(titprivado_perc['dif_perc']>0.10,titprivado_perc['pu'],titprivado_perc['mtm'])

    # Cálculo do DV100
    titprivado_perc = titprivado_perc.append(aux)

    titprivado_perc[
        'DV100'] = titprivado_perc['mtm'] - titprivado_perc['mtm_DV100']

    # Cálculo do perc_mtm
    titprivado_perc[
        'perc_mtm'] = titprivado_perc['pv'] / titprivado_perc['mtm']

    # Cálculo da duration
    titprivado_perc[
        'duration'] = titprivado_perc['perc_mtm'] * titprivado_perc['prazo_du']
    x = titprivado_perc[['codigo_isin',
                         'duration']].groupby(['codigo_isin']).agg(['sum'])
    x = x.reset_index(level=None,
                      drop=False,
                      inplace=False,
                      col_level=0,
                      col_fill='')
    x1 = pd.DataFrame(columns=['codigo_isin', 'duration'])
    x1['codigo_isin'] = x['codigo_isin']
    x1['duration'] = x['duration']
    del titprivado_perc['duration']
    titprivado_perc = titprivado_perc.merge(x1, on=['codigo_isin'], how='left')

    titprivado_perc[[
        'codigo_isin', 'pu', 'mtm', 'dt_ref', 'mtm_old', 'dif_new', 'dif_old',
        'duration', 'spread'
    ]].to_excel(writer, 'conclusao_fluxo')
    titprivado_perc[
        titprivado_perc.dt_ref == titprivado_perc.data_referencia][[
            'codigo_isin', 'pu', 'mtm', 'dt_ref', 'mtm_old', 'dif_new',
            'dif_old', 'duration', 'spread'
        ]].to_excel(writer, 'conclusao_resumido')

    finalizacao = titprivado_perc[[
        'codigo_isin', 'mtm'
    ]][titprivado_perc.dt_ref == titprivado_perc.data_referencia].copy()

    del titprivado_perc['fator_desconto_DV100_old']
    del titprivado_perc['fator_desconto_old']
    del titprivado_perc['mtm_old']
    del titprivado_perc['mtm_DV100_N']
    del titprivado_perc['pv_DV100_old']
    del titprivado_perc['pv_old']
    del titprivado_perc['DV100_old']
    del titprivado_perc['dif_new']
    del titprivado_perc['dif_old']
    del titprivado_perc['dif_perc']

    writer.save()

    #    Alteração de formato das colunas que são int e foram lidas como float (sabe lá pq...)

    # id_mtm_titprivado
    titprivado_perc['id_mtm_titprivado'] = titprivado_perc[
        'id_mtm_titprivado'].astype(int)

    # id_bmf_numeraca
    aux = titprivado_perc[[
        'id_papel', 'id_bmf_numeraca'
    ]][titprivado_perc.id_bmf_numeraca.notnull()].copy()
    aux['id_bmf_numeraca'] = aux['id_bmf_numeraca'].astype(int)
    del titprivado_perc['id_bmf_numeraca']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'], how='left')

    # pagto_amortizacao
    aux = titprivado_perc[[
        'id_papel', 'indexador_dc_du'
    ]][titprivado_perc.indexador_dc_du.notnull()].copy()
    aux['indexador_dc_du'] = aux['indexador_dc_du'].astype(int)
    del titprivado_perc['indexador_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # juros_cada
    aux = titprivado_perc[['id_papel', 'juros_cada'
                           ]][titprivado_perc.juros_cada.notnull()].copy()
    aux['juros_cada'] = aux['juros_cada'].astype(int)
    del titprivado_perc['juros_cada']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'], how='left')

    # indexador_dc_du
    aux = titprivado_perc[[
        'id_papel', 'indexador_dc_du'
    ]][titprivado_perc.indexador_dc_du.notnull()].copy()
    aux['indexador_dc_du'] = aux['indexador_dc_du'].astype(int)
    del titprivado_perc['indexador_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # juros_dc_du
    aux = titprivado_perc[['id_papel', 'juros_dc_du'
                           ]][titprivado_perc.juros_dc_du.notnull()].copy()
    aux['juros_dc_du'] = aux['juros_dc_du'].astype(int)
    del titprivado_perc['juros_dc_du']
    aux = aux.drop_duplicates()
    titprivado_perc = titprivado_perc.merge(aux, on=['id_papel'])

    # flag_inclusao
    titprivado_perc['flag_inclusao'] = titprivado_perc['flag_inclusao'].astype(
        int)

    # du_per
    titprivado_perc['du_per'] = titprivado_perc['du_per'].astype(int)

    # dc_per
    titprivado_perc['dc_per'] = titprivado_perc['dc_per'].astype(int)

    # dt_ref -> data_fim
    titprivado_perc['dt_ref'] = pd.to_datetime(titprivado_perc['dt_ref'])
    titprivado_perc['data_fim'] = np.where(
        titprivado_perc['indexador'] == 'DI1',
        titprivado_perc['dt_ref'] - pd.DateOffset(months=0, days=1),
        titprivado_perc['dt_ref'])

    titprivado_perc['id_papel'] = titprivado_perc['id_papel_old']

    titprivado_perc['data_mtm'] = titprivado_perc['data_referencia']
    titprivado_perc['data_negociacao'] = titprivado_perc['data_referencia']

    # Tabelas não necessárias - MTM
    del titprivado_perc['data_referencia']
    del titprivado_perc['id_papel_old']
    del titprivado_perc['indice_du_mtm']
    del titprivado_perc['indice_dc_mtm']
    del titprivado_perc['ano_dt_ref2']
    del titprivado_perc['mes_dt_ref2']
    del titprivado_perc['dia_dt_ref2']
    del titprivado_perc['vertices_positivo']
    del titprivado_perc['indice_dc_dt_ref2']
    del titprivado_perc['indice_du_dt_ref2']
    del titprivado_perc['prazo_dc']
    del titprivado_perc['ano_inicio']
    del titprivado_perc['mes_inicio']
    del titprivado_perc['dia_inicio']
    del titprivado_perc['indice_du_inicio']
    del titprivado_perc['indice_dc_inicio']
    del titprivado_perc['ano_fim']
    del titprivado_perc['mes_fim']
    del titprivado_perc['dia_fim']
    del titprivado_perc['indice_du_fim']
    del titprivado_perc['indice_dc_fim']
    del titprivado_perc['dt_ref']
    del titprivado_perc['dtoperacao_mtm']
    del titprivado_perc['dif']
    del titprivado_perc['pu_mercado']
    del titprivado_perc['pu_curva']
    del titprivado_perc['mtm_mercado']
    del titprivado_perc['mtm_curva']
    del titprivado_perc['pu_regra_xml']
    del titprivado_perc['mtm_regra_xml']
    del titprivado_perc['data_spread']
    del titprivado_perc['pu']
    del titprivado_perc['dif_curva']
    del titprivado_perc['pupar']
    del titprivado_perc['indice_du_fim_spread']
    del titprivado_perc['indice_du_inicio_spread']
    del titprivado_perc['prazo_du_spread']
    del titprivado_perc['mtm_spread']
    del titprivado_perc['pv_spread']
    del titprivado_perc['tx_spot_spread']
    del titprivado_perc['tx_spot_ano_spread']
    del titprivado_perc['fator_desconto_spread']

    # Tabelas não necessárias - XML
    del titprivado_perc['id_xml_debenture']
    del titprivado_perc['isin']
    del titprivado_perc['coddeb']
    del titprivado_perc['dtemissao']
    del titprivado_perc['dtoperacao']
    del titprivado_perc['dtvencimento']
    del titprivado_perc['cnpjemissor']
    del titprivado_perc['qtdisponivel']
    del titprivado_perc['qtgarantia']
    del titprivado_perc['pucompra']
    del titprivado_perc['puvencimento']
    del titprivado_perc['puposicao']
    del titprivado_perc['puemissao']
    del titprivado_perc['principal']
    del titprivado_perc['tributos']
    del titprivado_perc['valorfindisp']
    del titprivado_perc['valorfinemgar']
    del titprivado_perc['coupom']
    del titprivado_perc['percindex']
    del titprivado_perc['caracteristica']
    del titprivado_perc['percprovcred']
    del titprivado_perc['classeoperacao']
    del titprivado_perc['idinternoativo']
    del titprivado_perc['nivelrsc']
    del titprivado_perc['header_id']
    del titprivado_perc['cusip']
    del titprivado_perc['depgar']
    del titprivado_perc['debconv']
    del titprivado_perc['debpartlucro']
    del titprivado_perc['SPE']
    del titprivado_perc['dtretorno']
    del titprivado_perc['puretorno']
    del titprivado_perc['indexadorcomp']
    del titprivado_perc['perindexcomp']
    del titprivado_perc['txoperacao']
    del titprivado_perc['classecomp']

    # Remove as duplicatas de isin
    titprivado_perc = titprivado_perc.sort(
        ['codigo_isin', 'id_papel', 'data_fim'], ascending=[True, True, True])
    titprivado_perc = titprivado_perc.drop_duplicates(
        subset=['codigo_isin', 'data_fim'])

    # titprivado_perc['data_bd'] = horario_bd
    titprivado_perc['data_bd'] = datetime.datetime.today()

    titprivado_perc = titprivado_perc.where((pd.notnull(titprivado_perc)),
                                            None)

    titprivado_perc['flag1'] = titprivado_perc['flag'].str[0:2]
    del titprivado_perc['flag']
    titprivado_perc = titprivado_perc.rename(columns={'flag1': 'flag'})

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - mtm_renda_fixa")
    pd.io.sql.to_sql(titprivado_perc,
                     name='mtm_renda_fixa',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexão
    connection.close()

    logger.info("Preenchimento tabela xml")
    # 9 - Preenchimento tabela xml

    del original['id_xml_debenture']
    del original['pu_mercado']
    del original['mtm_mercado']
    del original['pu_curva']
    del original['mtm_curva']
    del original['pu_regra_xml']
    del original['mtm_regra_xml']
    del original['data_referencia']

    del titprivado['mtm']

    titprivado = titprivado.merge(finalizacao, on=['codigo_isin'], how='left')

    titprivado_xml = titprivado[titprivado.dt_ref ==
                                titprivado.data_referencia].copy()
    titprivado_xml = titprivado_xml.drop_duplicates(subset=['id_papel'],
                                                    take_last=True)
    titprivado_xml = titprivado_xml.rename(columns={'mtm': 'mtm_calculado'})

    anbima_deb = anbima_deb.rename(columns={'pu': 'pu_n'})

    titprivado_xml = titprivado_xml.merge(anbima_deb,
                                          on=['coddeb', 'data_spread'],
                                          how='left')
    titprivado_xml['pu'] = np.where(titprivado_xml['pu_n'].notnull(),
                                    titprivado_xml['pu_n'],
                                    titprivado_xml['mtm_calculado'])
    titprivado_xml['pu_mercado'] = np.where(
        titprivado_xml['caracteristica'] == 'N', titprivado_xml['pu'], 0)
    titprivado_xml['pu_curva'] = np.where(
        titprivado_xml['caracteristica'] == 'V', titprivado_xml['pupar'], 0)
    titprivado_xml = titprivado_xml[[
        'id_papel', 'pu_mercado', 'pu_curva', 'data_referencia'
    ]].copy()

    final = original.merge(titprivado_xml, on=['id_papel'], how='left')
    final['data_referencia'] = dt_base_rel
    final['pu_mercado'] = np.where(
        (final['pu_mercado'].isnull()) | (final['pu_mercado'] == 0),
        final['puposicao'], final['pu_mercado'])
    final['pu_mercado'] = np.where(final['dtretorno'].notnull(),
                                   final['puposicao'], final['pu_mercado'])
    final['mtm_mercado'] = final['pu_mercado'] * (final['qtdisponivel'] +
                                                  final['qtgarantia'])
    final['pu_curva'] = np.where(final['pu_curva'].isnull(),
                                 final['puposicao'], final['pu_curva'])
    final['pu_curva'] = np.where(final['dtretorno'].notnull(),
                                 final['puposicao'], final['pu_curva'])
    final['mtm_curva'] = final['pu_curva'] * (final['qtdisponivel'] +
                                              final['qtgarantia'])
    final['pu_regra_xml'] = np.where(final['caracteristica'] == 'N',
                                     final['pu_mercado'], final['pu_curva'])
    final['mtm_regra_xml'] = np.where(final['caracteristica'] == 'N',
                                      final['mtm_mercado'], final['mtm_curva'])
    final['data_bd'] = datetime.datetime.today()

    del final['dtrel']

    final['indexador'] = final['indexador'].str.replace('IGPM', 'IGP')
    final['indexador'] = final['indexador'].str.replace('IAP', 'IPC')
    final['indexador'] = final['indexador'].str.replace('SEM-ÍNDICE', 'PRE')
    final['indexador'] = final['indexador'].str.replace('ANB', 'DI1')
    final['indexador'] = final['indexador'].str.replace('ANBID', 'DI1')
    final['indexador'] = final['indexador'].str.replace('CDI', 'DI1')
    final['indexador'] = final['indexador'].str.replace('IPCA', 'IPC')

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - xml_debenture")
    pd.io.sql.to_sql(final,
                     name='xml_debenture',
                     con=connection,
                     if_exists='append',
                     flavor='mysql',
                     index=0)

    #Fecha conexão
    connection.close()
示例#14
0
def relatorio_risco_credito():

    import datetime
    import pandas as pd
    import pymysql as db
    import numpy as np
    import openpyxl
    import logging

    from openpyxl.styles import Font, Color, Border, Side, PatternFill, Alignment
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    global header_id_carteira_fundos

    logger = logging.getLogger(__name__)

    dt_base = get_data_ultimo_dia_util_mes_anterior()
    dt_base = dt_base[0]+'-'+dt_base[1]+'-'+dt_base[2]
    nivel_confianca=int(get_global_var("nivel_confianca_relatorio_credito"))
    end = full_path_from_database("get_output_var")+'relatorios/'
    cnpj_hdi=get_global_var("cnpj_hdi")

    def relatorio_credito(dt_base,cnpj,nivel_confianca,horario_bd):

        global percentil
        global header_id_carteira
        global header_nome
        global cnpj_fundo
        global administrador
        global gestor
        global quadro_oper
        global pl_info
        global tp
        global id_relatorio_qo
        global pl_credito
        global perc_credito
        global pe
        global duration_carteira
        global rtg_lp

        # Create a Pandas Excel writer using XlsxWriter as the engine.
        writer = pd.ExcelWriter(end+cnpj+"_"+dt_base+' relatorio_credito.xlsx', engine='xlsxwriter')
        workbook = writer.book
        numero_float = workbook.add_format({'num_format': '#,##0', 'bold': False})
        percent = workbook.add_format({'num_format': '0.0%', 'bold': False})
        percentil=nivel_confianca

        logger.info("Conectando no Banco de dados")
        connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv', use_unicode=True,
                                charset="utf8")
        logger.info("Conexão com DB executada com sucesso")

        query='select * from projeto_inv.xml_header where cnpjcpf="' + cnpj +'" and dtposicao='+'"'+dt_base+'";'

        df=pd.read_sql(query, con=connection)

        if len(df)==0:
            query='select * from projeto_inv.xml_header where cnpj="' + cnpj +'" and dtposicao='+'"'+dt_base+'";'
            df=pd.read_sql(query, con=connection)

        df=df.sort(['cnpj', 'cnpjcpf','data_bd'], ascending=[True, True, False])
        df=df.drop_duplicates(subset=['cnpj', 'cnpjcpf'], take_last=False)
        df=df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
        del df['index']
        header_id_carteira=df.get_value(0,'header_id').astype(str)
        header_nome=df.get_value(0,'nome')
        cnpj_fundo=cnpj
        administrador=df.get_value(0, 'nomeadm')
        gestor=df.get_value(0, 'nomegestor')
        query='select a.* from projeto_inv.xml_quadro_operacoes a right join (select header_id, max(data_bd) as data_bd from projeto_inv.xml_quadro_operacoes where header_id='+header_id_carteira+' group by 1) b on a.header_id=b.header_id and a.data_bd=b.data_bd;'
        quadro_oper=pd.read_sql(query, con=connection)
        pl=quadro_oper[quadro_oper['produto']!='Futuro']
        pl_info=sum(pl['mtm_info'])

        #selecionar crédito
        tp=quadro_oper.loc[quadro_oper['produto'].isin(['título privado','debênture'])]

        #id_relatorio_qo
        id_relatorio_qo=quadro_oper['id_relatorio_qo'].iloc[0]
        id_relatorio_qo_str=str(id_relatorio_qo)

        if len(tp)>0:

            # fidc
            fundos=quadro_oper.loc[quadro_oper['produto'].isin(['fundo'])].copy()
            fundos['fundo_final']=np.where(fundos['fundo_ult_nivel'].isnull(),fundos['fundo'],fundos['fundo_ult_nivel'])

            #INCLUIR FIDCS
            fidc=fundos[fundos['fundo_final'].str.contains('FIDC|DIREITOS|CREDITÓRIO|CREDITORIOS|DIREITOS')]
            tp=tp.append(fidc)
            pl_credito=sum(tp['mtm_info'])
            perc_credito=pl_credito/pl_info

            # incluir tipo de papel
            query= "select distinct codigo_isin, data_bd, tipo_ativo from projeto_inv.bmf_numeraca where tipo_ativo in ('DBS', 'LFI', 'LFN', 'DP', 'C', 'CC','CCC', 'CRI');"
            caracteristica=pd.read_sql(query, con=connection)

            caracteristica=caracteristica.sort(['codigo_isin', 'data_bd'], ascending=[True, False])
            caracteristica=caracteristica.drop_duplicates(subset=['codigo_isin'], take_last=False)
            del caracteristica['data_bd']

            tp=pd.merge(tp, caracteristica, left_on='isin', right_on='codigo_isin', how='left')
            tp.ix[tp.tipo_ativo == 'CC', 'tipo_prod']='CCB'
            tp.ix[tp.tipo_ativo == 'CCC', 'tipo_prod']='CCCB'
            tp.ix[tp.tipo_ativo =='DBS', 'tipo_prod']='Debênture'
            tp.ix[tp.tipo_ativo =='C', 'tipo_prod']='CDB'
            tp.ix[tp.tipo_ativo =='LFI', 'tipo_prod']='LF'
            tp.ix[tp.tipo_ativo =='LFN', 'tipo_prod']='LF'
            tp.ix[tp.tipo_ativo =='DP', 'tipo_prod']='DPGE'
            tp.ix[tp.produto =='fundo', 'tipo_prod']='FIDC'
            tp['tipo_prod']=tp['tipo_prod'].fillna('Outros')
            tp['contraparte']=np.where(tp.produto=='fundo',tp.fundo_final, tp.contraparte)
            tp['cnpj_fundo_final']=np.where((tp.produto=='fundo') & (tp.cnpjfundo_outros.isnull()),tp.cnpjfundo_1nivel,tp.cnpjfundo_outros)
            tp['cnpj']=np.where(tp.produto=='fundo',tp.cnpj_fundo_final,tp.cnpj)
            del tp['codigo_isin']

            #informação de emissor (contraparte)
            query='select distinct nome_emissor, cnpj_emissor, data_criacao_emissor from projeto_inv.bmf_emissor where cnpj_emissor>0;'
            emissor=pd.read_sql(query, con=connection)

            emissor=emissor.sort(['cnpj_emissor', 'data_criacao_emissor'], ascending=[True, False])
            emissor1=emissor.drop_duplicates(subset=['cnpj_emissor'], take_last=False)
            emissor1['cnpj']=emissor1['cnpj_emissor'].astype(float)
            emissor2=emissor1[['cnpj', 'nome_emissor']]

            tp=pd.merge(tp, emissor2, left_on='cnpj', right_on='cnpj', how='left')
            tp['contraparte']=tp['contraparte'].fillna(tp['nome_emissor'])
            del tp['nome_emissor']
            tp['contraparte']=tp['contraparte'].fillna('a')

            # selecionar simulação de perda de crédito
            #query='select a.* from projeto_inv.simulacao_credito a right join (select id_relatorio_qo, max(data_bd) as data_bd from projeto_inv.simulacao_credito where id_relatorio_qo = "51" group by 1) b on a.id_relatorio_qo=b.id_relatorio_qo and a.data_bd=b.data_bd;'
            query ='SELECT contraparte, isin, pv, perda_perc, pv_perda, duration, dt_base FROM projeto_inv.simulacao_credito_consolidado;'
            sim=pd.read_sql(query,con=connection)
            sim['perda_perc']=sim['perda_perc'].fillna(0)

            # perda esperada por isin
            perda_isin=sim[['isin', 'perda_perc']].copy()
            #perda_isin=perda_isin.groupby(['isin'], as_index=False).mean()
            perda_isin=perda_isin.rename(columns={'perda_perc':'perc_pe'})

            tp_isin_mtm=tp[['cnpj','contraparte','isin','tipo_prod', 'mtm_info']].copy()
            tp_isin_mtm=tp_isin_mtm.groupby(['cnpj','contraparte','isin','tipo_prod'],as_index=False).sum()
            tp_isin_mtm=pd.merge(tp_isin_mtm, perda_isin, left_on='isin', right_on='isin', how='left')
            tp_isin_mtm['perda_esperada'] = tp_isin_mtm['perc_pe']*tp_isin_mtm['mtm_info']
            tp_isin_mtm['perda_esperada']=tp_isin_mtm['perda_esperada'].fillna(0)

            # perda esperada da carteira
            perda=sum(tp_isin_mtm['perda_esperada'])

            pe=perda/pl_credito
            pe_carteira=pe*pl_credito/pl_info

            #composiçao da carteira - por tipo de produto
            prod=tp_isin_mtm[['tipo_prod', 'mtm_info', 'perda_esperada']]
            prod=prod.groupby(['tipo_prod'], as_index=False).sum()
            prod['perc_credito']=prod['mtm_info']/pl_credito
            prod['perc_pl']=prod['mtm_info']/pl_info
            prod['perc_pe']=prod['perda_esperada']/prod['mtm_info']

            del prod['perda_esperada']
            df_aux = pd.DataFrame(columns=['Dados Institucionais'])
            df_aux.to_excel(writer,index=False, sheet_name='Dados Institucionais', startrow =1, startcol=1, header =['Dados Institucionais'])
            prod.to_excel(writer,index=False, sheet_name='Resumo', startrow =14, startcol=1, header =['Tipo de produto', 'Exposição (R$)', '% PL de crédito', '% PL total', '% Perda Esperada'])

            # perda inesperada
            sim1=sim[['isin', 'pv_perda', 'pv']]

            isin_mtm=tp[['isin','mtm_info']].copy()
            isin_mtm=isin_mtm.groupby(['isin'],as_index=False).sum()

            sim2=pd.merge(sim1,isin_mtm, left_on='isin', right_on='isin', how='left' )
            sim2['perc_perda']=sim2['pv_perda']/sim2['pv']
            sim2['perda']=sim2['perc_perda']*sim2['mtm_info']
            del sim2['perc_perda']
            del sim2['pv']
            del sim2['pv_perda']
            sim_agr = sim2
            sim_agr['perda']=sim_agr['perda'].fillna(0)
            sim_agr['perc_perda']=sim_agr['perda']/sim_agr['mtm_info']
            sim_agr=sim_agr.sort(columns=['perc_perda'], ascending=True )
            sim_agr=sim_agr.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')

            n_conf= np.floor(len(sim_agr)*percentil)
            percentil_conf=sim_agr['perc_perda'][n_conf-1]

            # Relatório só a MERCADO - cálculo de duration
            query='select a.* from projeto_inv.quaid_419 a right join (select id_relatorio_qo, tipo_relatorio, max(data_bd) as data_bd from projeto_inv.quaid_419 where id_relatorio_qo='+id_relatorio_qo_str+' and tipo_relatorio="R" group by 1,2) b on a.id_relatorio_qo=b.id_relatorio_qo and a.tipo_relatorio=b.tipo_relatorio and a.data_bd=b.data_bd;'

            quaid_419_r=pd.read_sql(query, con=connection)
            quaid_419_r['expo']=np.where(quaid_419_r['TPFOPERADOR']=='-',-1*quaid_419_r['EMFVLREXPRISCO'],quaid_419_r['EMFVLREXPRISCO'] )
            quaid_419_r['prazo_ponderado']=quaid_419_r['expo']*quaid_419_r['EMFPRAZOFLUXO']

            isin_credito=tp[['isin']].copy()
            isin_credito=isin_credito.drop_duplicates(subset=['isin'], take_last=True)

            quaid_419_credito=pd.merge(isin_credito,quaid_419_r, left_on=['isin'], right_on=['EMFCODISIN'], how='left' )

            duration=quaid_419_credito[['EMFCODISIN','expo','prazo_ponderado']].copy()
            duration_ativa=duration[duration.expo>=0].copy()
            duration_ativa_papel=duration_ativa.groupby('EMFCODISIN', as_index=False).sum()
            duration_ativa_papel['duration']=duration_ativa_papel['prazo_ponderado']/duration_ativa_papel['expo']

            #duration carteira
            duration_c=quaid_419_credito[['EMFPRAZOFLUXO','expo']].copy()
            duration_c1=duration_c.groupby(['EMFPRAZOFLUXO'], as_index=False).sum()
            duration_c1['prazo_ponderado']=duration_c1['expo']*duration_c1['EMFPRAZOFLUXO']

            duration_carteira=sum(duration_c1['prazo_ponderado'])/sum(duration_c1['expo'])

            #rating da carteira
            query='select a.rtg, a.prazo, a.pd_acum from projeto_inv.pd_acum a right join (select max(data_bd) as data_bd from projeto_inv.pd_acum) b on a.data_bd=b.data_bd;'
            regua_unica=pd.read_sql(query, con=connection)
            regua_unica['pd_acum_shift']=regua_unica['pd_acum'].shift()
            regua_unica['prazo_shift']=regua_unica['prazo'].shift()
            regua_unica['pd_acum_min']=np.where(regua_unica['prazo_shift']==regua_unica['prazo'],regua_unica['pd_acum_shift'],0)

            del regua_unica['prazo_shift']
            del regua_unica['pd_acum_shift']

            duration_mes=np.floor(duration_carteira/22)

            if duration_mes>60:
                duration_carteira_temp=60
            else:
                duration_carteira_temp=np.floor(duration_mes)

            rtg_carteira=regua_unica[regua_unica['prazo']==duration_carteira_temp].copy()
            rtg_carteira1=rtg_carteira[rtg_carteira['pd_acum_min']<=pe_carteira]
            rtg_carteira2=rtg_carteira1[rtg_carteira1['pd_acum']>pe_carteira]
            rtg_carteira2=rtg_carteira2.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')

            rtg_lp=rtg_carteira2.get_value(0,'rtg')

            # rating por produto
            query='select cod_rtg, rtg from projeto_inv.de_para_rtg a right join (select max(data_bd) as data_bd from projeto_inv.de_para_rtg) b on a.data_bd = b.data_bd;'
            depara=pd.read_sql(query, con=connection)

            #regua mestra
            query='select distinct a.cod_rtg, a.agencia_rtg, a.rtg from projeto_inv.de_para_rtg a right join (select agencia_rtg, max(data_bd) as data_bd from projeto_inv.de_para_rtg where agencia_rtg="regua" group by 1) b on a.agencia_rtg=b.agencia_rtg and a.data_bd = b.data_bd;'
            regua_rtg=pd.read_sql(query, con=connection)
            del regua_rtg['agencia_rtg']

            #rating por isin
            query='select distinct a.isin, a.agencia_tipo_rtg, a.rtg from projeto_inv.rating_isin as a right join (select max(data_bd) as data_bd from projeto_inv.rating_isin where dt_ref= "'+ dt_base +'" ) as b on a.data_bd=b.data_bd;'
            rtg_isin=pd.read_sql(query, con=connection)

            rtg_local=rtg_isin.loc[rtg_isin['agencia_tipo_rtg'].isin(['RTG_MDY_NSR', 'RTG_MDY_NSR_SR_UNSECURED',  'RTG_MDY_NSR_SUBORDINATED','RTG_SP_NATIONAL','RTG_FITCH_NATIONAL_LT', 'RTG_FITCH_NATIONAL', 'RTG_FITCH_NATIONAL_SR_UNSECURED', 'RTG_FITCH_NATL_SUBORDINATED'])]
            rtg_local=pd.merge(rtg_local, depara, left_on='rtg', right_on='rtg', how='left')

            rtg_pior=rtg_local[['isin', 'cod_rtg']].copy()
            rtg_pior=rtg_pior.groupby(['isin'],as_index=False).max()
            rtg_pior=pd.merge(rtg_pior, regua_rtg, left_on='cod_rtg', right_on='cod_rtg', how='left')

            #rating por contraparte
            query='select distinct a.cnpj, a.agencia_tipo_rtg, a.rtg from projeto_inv.rating_contraparte as a right join (select max(data_bd) as data_bd from projeto_inv.rating_contraparte where dt_ref= "'+ dt_base +'" ) as b on a.data_bd=b.data_bd;'
            rtg_c=pd.read_sql(query, con=connection)
            rtg_c_local=rtg_c.loc[rtg_c['agencia_tipo_rtg'].isin(['RTG_MDY_NSR_ISSUER','RTG_SP_NATIONAL_LT_ISSUER_CREDIT','RTG_FITCH_NATIONAL_LT','RTG_FITCH_NATIONAL_SR_UNSECURED' ])]
            rtg_c_local=pd.merge(rtg_c_local, depara, left_on='rtg', right_on='rtg', how='left')
            rtg_c_pior=rtg_c_local[['cnpj', 'cod_rtg']].copy()
            rtg_c_pior=rtg_c_pior.groupby(['cnpj'], as_index=False).max()
            rtg_c_pior=pd.merge(rtg_c_pior, regua_rtg, left_on='cod_rtg', right_on='cod_rtg', how='left')

            #agregar o rtg na base
            tp_cnpj=pd.merge(tp_isin_mtm, rtg_pior, left_on='isin', right_on='isin', how='left')
            tp_cnpj=tp_cnpj.rename(columns={'cod_rtg':'cod_rtg_isin', 'rtg':'rtg_isin'})
            tp_cnpj=pd.merge(tp_cnpj, rtg_c_pior, left_on='cnpj', right_on='cnpj', how='left')
            tp_cnpj=tp_cnpj.rename(columns={'cod_rtg':'cod_rtg_cnpj', 'rtg':'rtg_cnpj'})
            tp_cnpj['cod_rtg']=np.where(tp_cnpj['cod_rtg_isin'].isnull(),tp_cnpj.cod_rtg_cnpj,tp_cnpj.cod_rtg_isin)

            del tp_cnpj['cod_rtg_isin']
            del tp_cnpj['cod_rtg_cnpj']
            del tp_cnpj['rtg_isin']
            del tp_cnpj['rtg_cnpj']

            tp_cnpj=pd.merge(tp_cnpj, regua_rtg, left_on='cod_rtg', right_on='cod_rtg', how='left')

            ##assumir rtg padrão missing: 'Aa3' e cod_rtg=4
            tp_cnpj['cod_rtg']=tp_cnpj['cod_rtg'].fillna(3)
            tp_cnpj['rtg']=tp_cnpj['rtg'].fillna('Aa2')

            sumario_rtg=tp_cnpj[['cod_rtg','rtg', 'mtm_info', 'perda_esperada']]
            sumario_rtg['mtm_info']=sumario_rtg['mtm_info'].fillna(0)
            sumario_rtg['perda_esperada']=sumario_rtg['perda_esperada'].fillna(0)

            sumario=sumario_rtg.groupby(['cod_rtg','rtg'], as_index=False).sum()
            sumario['perc_credito']= sumario['mtm_info']/pl_credito
            sumario['perc_tot']= sumario['mtm_info']/pl_info
            sumario['perc_pe']=sumario['perda_esperada']/sumario['mtm_info']
            del sumario['cod_rtg']
            del sumario['perda_esperada']
            sumario.to_excel(writer,index=False, sheet_name='Resumo', startrow =25, startcol=1, header =['Rating', 'Exposição (R$)', '% PL de crédito', '% PL total', '% Perda Esperada'])

            worksheet = writer.sheets['Resumo']
            worksheet.set_column('D:F', 12, percent)
            worksheet.set_column('C:C', 12, numero_float)

            # 20 maiores exposiçoes por contraparte
            contraparte=tp_cnpj[['cnpj', 'contraparte', 'mtm_info', 'perda_esperada']].copy()
            contraparte=contraparte.groupby(['cnpj', 'contraparte'], as_index=False).sum()
            contraparte['perc_exposicao']=contraparte['mtm_info']/pl_credito
            del contraparte['cnpj']
            contraparte=contraparte.sort(['mtm_info'], ascending=False)
            contraparte=contraparte.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
            contraparte['perc_pe']=contraparte['perda_esperada']/contraparte['mtm_info']
            del contraparte['perda_esperada']
            del contraparte['index']
            contraparte1=contraparte[0:20]
            contraparte1.to_excel(writer,index=False, sheet_name='Maiores Exposições', startrow =3, startcol=1, header =['Contraparte', 'Exposição', '% PL de crédito', '% Perda Esperada'])

            worksheet = writer.sheets['Maiores Exposições']
            worksheet.set_column('D5:E24', 12, percent)
            worksheet.set_column('C5:C24', 12, numero_float)

            # 20 maiores exposiçoes por produto
            prod=tp_isin_mtm[['contraparte','isin' , 'tipo_prod', 'mtm_info', 'perda_esperada']]
            prod=prod.groupby(['contraparte', 'isin', 'tipo_prod'], as_index=False).sum()
            prod['perc_credito']=prod['mtm_info']/pl_credito
            prod['perc_pe']=prod['perda_esperada']/prod['mtm_info']
            prod=prod.sort(['mtm_info'], ascending=False)
            prod=prod.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')

            del prod['perda_esperada']
            del prod['index']

            prod2=prod[0:20]
            prod2.to_excel(writer,index=False, sheet_name='Maiores Exposições', startrow =28, startcol=1, header =['Contraparte','Isin', 'Tipo de Produto','Exposição', '% PL de crédito', '% Perda Esperada'])

            worksheet = writer.sheets['Maiores Exposições']
            worksheet.set_column('F32:G51', 12, percent)
            worksheet.set_column('E32:E51', 12, numero_float)

            writer.save()

            # inserir caracteristicas
            wb = openpyxl.load_workbook(end+cnpj+"_"+dt_base+' relatorio_credito.xlsx')

            #####FORMATOS
            #Fonte
            fontObj1=Font(name='Calibri', bold=True, size =24,color='404040')
            fontObj2=Font(name='Calibri', bold=False, size =11,color='404040')

            #Borda
            borderObj1=Border(bottom=Side(border_style='double'),top=Side(border_style='thin'))
            borderObj2=Border()

            #Cor
            colorObj1=PatternFill(patternType='solid', fgColor=Color('FFE600'))

            #Alinhamento
            alinObj1=Alignment(vertical='center',horizontal='center')
            alinObj2=Alignment(vertical='center',horizontal='left')
            alinObj3=Alignment(vertical='center',horizontal='right')

            #####Dados institucionais

            #    #####Resumo
            sheet1=wb.get_sheet_by_name('Dados Institucionais')

            #Retira as gridlines
            sheet1.sheet_view.showGridLines = False

            #Formatação tamanho das linhas
            sheet1.row_dimensions[1].height = 90

            #Formata cor da fonte de todas as células
            for row in sheet1.range('B2:C20'):
                for cell in row:
                    cell.font=fontObj2

            #Formata o título
            sheet1.merge_cells('B2:C2')
            sheet1['B2']='Dados Institucionais'
            sheet1['B2'].font=fontObj1
            sheet1['B2'].alignment=alinObj2

            for row in sheet1.range('B2:C2'):
                for cell in row:
                    cell.border=borderObj1

            #Cria a parte de informações institucionais e resumo do relatório de crédito
            sheet1['B4']='Nome'
            sheet1['C4']=header_nome
            sheet1['B5']='CNPJ'
            sheet1['C5']=cnpj_fundo
            sheet1['B6']='Administrador'
            sheet1['C6']=administrador
            sheet1['B7']='Gestor'
            sheet1['C7']=gestor

            #Formatação tamanho das colunas
            sheet1.column_dimensions['A'].width = 2
            sheet1.column_dimensions['B'].width = 15
            sheet1.column_dimensions['C'].width = 100

            ####Resumo
            sheet1=wb.get_sheet_by_name('Resumo')

            #Retira as gridlines
            sheet1.sheet_view.showGridLines = False

            #Formatação tamanho das linhas
            sheet1.row_dimensions[1].height = 90

            #Formata cor da fonte de todas as células
            for row in sheet1.range('B2:F100'):
                for cell in row:
                    cell.font=fontObj2

            #Formata o título
            sheet1.merge_cells('B2:F2')
            sheet1['B2']='Relatório Quantitativo de Risco de Crédito'
            sheet1['B2'].font=fontObj1

            for row in sheet1.range('B2:F2'):
                for cell in row:
                    cell.border=borderObj1

            sheet1['B4']='Nível de Confiança'
            sheet1['C4']=percentil
            sheet1['B5']='PL do fundo (R$)'
            sheet1['C5']=pl_info
            sheet1['B6']='PL de crédito (R$)'
            sheet1['C6']=pl_credito
            sheet1['B7']='Duration - Crédito (DU)'
            sheet1['C7']=duration_carteira
            sheet1['B8']='% de crédito privado'
            sheet1['C8']=pl_credito/pl_info
            sheet1['B9']='Perda Esperada (em relação ao PL crédito)'
            sheet1['C9']=pe
            sheet1['B10']='Percentil da Perda ('+str(percentil)+')'
            sheet1['C10']=percentil_conf
            sheet1['B11']='Rating médio da carteira'
            sheet1['C11']=rtg_lp
            sheet1['B12']='Perda Esperada (em relação ao PL)'
            sheet1['C12']=pe_carteira

            #Formata os headers da tabela
            for row in sheet1.range('B15:F15'):
                for cell in row:
                    cell.fill=colorObj1
                    cell.border=borderObj2

            #Formata os headers da tabela
            for row in sheet1.range('B26:F26'):
                for cell in row:
                    cell.fill=colorObj1
                    cell.border=borderObj2

            #Formata os formatos de número
            for row in sheet1.range('C8:C10'):
                for cell in row:
                    cell.number_format = "0.0%"
                    cell.alignment=alinObj3

            sheet1['C4'].number_format = "0.00"

            #Formatação tamanho das colunas
            sheet1.column_dimensions['A'].width = 2
            sheet1.column_dimensions['B'].width = 40
            sheet1.column_dimensions['C'].width = 25
            sheet1.column_dimensions['D'].width = 25
            sheet1.column_dimensions['E'].width = 25
            sheet1.column_dimensions['F'].width = 25

            ####Maiores exposições
            sheet1=wb.get_sheet_by_name('Maiores Exposições')

            #Retira as gridlines
            sheet1.sheet_view.showGridLines = False

            #Formatação tamanho das linhas
            sheet1.row_dimensions[1].height = 90

            #Formata cor da fonte de todas as células
            for row in sheet1.range('B2:G100'):
                for cell in row:
                    cell.font=fontObj2

            #Formata o título
            sheet1.merge_cells('B2:G2')
            sheet1['B2']='20 Maiores Exposições por Contraparte'
            sheet1['B2'].font=fontObj1

            for row in sheet1.range('B2:G2'):
                for cell in row:
                    cell.border=borderObj1

            #Formata os headers da tabela
            for row in sheet1.range('B4:G4'):
                for cell in row:
                    cell.fill=colorObj1
                    cell.border=borderObj2

            #Formata os headers da tabela
            for row in sheet1.range('B29:G29'):
                for cell in row:
                    cell.fill=colorObj1
                    cell.border=borderObj2

            #Formata os formatos de número
            for row in sheet1.range('E5:E24'):
                for cell in row:
                    cell.number_format = "0.0%"

            #Formatação tamanho das colunas
            sheet1.column_dimensions['A'].width = 2
            sheet1.column_dimensions['B'].width = 100
            sheet1.column_dimensions['C'].width = 20
            sheet1.column_dimensions['D'].width = 20
            sheet1.column_dimensions['E'].width = 20
            sheet1.column_dimensions['F'].width = 20
            sheet1.column_dimensions['G'].width = 20

            wb.save(end+cnpj+"_"+dt_base+' relatorio_credito.xlsx')

        else:
            cnpj_sem_credito = pd.DataFrame(columns=['cnpj','id_relatorio_qo','data_bd'])
            cnpj_sem_credito['cnpj'] = cnpj
            cnpj_sem_credito['id_relatorio_qo'] = id_relatorio_qo_str
            cnpj_sem_credito['data_bd'] = horario_bd
            pd.io.sql.to_sql(cnpj_sem_credito, name='rel_credito_log', con=connection,if_exists="append", flavor='mysql', index=0, chunksize=5000)

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv', use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    #Busca lista dos fundos de primeiro nivel na carteira da HDI
    query='select * from projeto_inv.xml_header where cnpjcpf="' + cnpj_hdi +'" and dtposicao='+'"'+dt_base+'";'
    df=pd.read_sql(query, con=connection)

    if len(df)==0:
        x='select * from projeto_inv.xml_header where cnpj="' + cnpj_hdi +'" and dtposicao='+'"'+dt_base+'";'
        df=pd.read_sql(x, con=connection)

    df=df.sort(['cnpj', 'cnpjcpf','data_bd'], ascending=[True, True, False])
    df=df.drop_duplicates(subset=['cnpj', 'cnpjcpf'], take_last=False)
    df=df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
    del df['index']

    header_id_carteira_fundos=df.get_value(0,'header_id').astype(str) #Utiliza o header da carteira da HDI como chave para a query da lista

    lista_query='SELECT cnpj from projeto_inv.lista_fundos where data_bd=(select max(data_bd) from projeto_inv.lista_fundos where header_id="'+header_id_carteira_fundos+'");'
    lista_cnpj=pd.read_sql(lista_query, con=connection)
    lista=lista_cnpj['cnpj'].tolist()

    horario_bd = datetime.datetime.today()

    for cnpj in lista:
        relatorio_credito(dt_base,cnpj,nivel_confianca,horario_bd)
def finalizacao_fidc():

    import datetime
    import pandas as pd
    import numpy as np
    import pymysql as db
    import logging
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]
    horario_bd = datetime.datetime.today()

    #1 - Leitura e criação de tabelas

    #Informações do cálculo de MTM
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = "SELECT * FROM projeto_inv.mtm_titprivado WHERE tipo_ativo = 'CTF'"
    mtm_titprivado0 = pd.read_sql(query, con=connection)
    logger.info("Salvando base de dados")

    connection.close()

    mtm_titprivado = mtm_titprivado0.copy()

    #Seleciona debentures
    #mtm_titprivado = mtm_titprivado[mtm_titprivado.tipo_ativo.isin(['CTF'])].copy()

    #Seleciona a última carga de debentures da data da posicao
    mtm_titprivado['dtrel'] = mtm_titprivado['id_papel'].str.split('_')
    mtm_titprivado['dtrel'] = mtm_titprivado['dtrel'].str[0]
    mtm_titprivado = mtm_titprivado[mtm_titprivado.dtrel == dtbase_concat].copy()
    mtm_titprivado = mtm_titprivado[mtm_titprivado.data_bd == max(mtm_titprivado.data_bd)]
    mtm_titprivado = mtm_titprivado.rename(columns={'data_fim':'dt_ref'})

    #Reajusta papéis indesaxos a DI
    mtm_titprivado['dt_ref'] = pd.to_datetime(mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = np.where(mtm_titprivado['indexador']=='DI1', mtm_titprivado['dt_ref'] + pd.DateOffset(months=0, days=1), mtm_titprivado['dt_ref'])
    mtm_titprivado['dt_ref'] = mtm_titprivado['dt_ref'].dt.date

    #Segura apenas fluxos positivos
    mtm_titprivado = mtm_titprivado[mtm_titprivado.prazo_du>=0].copy()

    del mtm_titprivado['data_bd']
    del mtm_titprivado['dtrel']

    logger.info("Cálculo de DV100 e Duration")
    #2 - Calculo de DV100 e Duration

    mtm_titprivado['DV100'] = (mtm_titprivado['mtm'] - mtm_titprivado['mtm_DV100'])/(mtm_titprivado['mtm'])

    #Duration
    mtm_titprivado['duration'] = mtm_titprivado['perc_mtm']*mtm_titprivado['prazo_du']

    logger.info("Finalização e upload na base")
    #3 - Finalização e upload na base

    mtm_titprivado['mtm'] = None
    mtm_titprivado['data_bd'] = horario_bd
    mtm_titprivado['ano_mtm'] = mtm_titprivado['ano_mtm'].astype(str)
    mtm_titprivado['mes_mtm'] = mtm_titprivado['mes_mtm'].astype(str)
    mtm_titprivado['mes_mtm'] = mtm_titprivado['mes_mtm'].str.zfill(2)
    mtm_titprivado['dia_mtm'] = mtm_titprivado['dia_mtm'].astype(str)
    mtm_titprivado['dia_mtm'] = mtm_titprivado['dia_mtm'].str.zfill(2)
    mtm_titprivado['data_mtm'] = mtm_titprivado['ano_mtm'].astype(str) + mtm_titprivado['mes_mtm'].astype(str) + mtm_titprivado['dia_mtm'].astype(str)
    mtm_titprivado['data_mtm'] = pd.to_datetime(mtm_titprivado['data_mtm']).dt.date

    #Tabelas não necessárias - MTM
    del mtm_titprivado['indice_du_mtm']
    del mtm_titprivado['indice_dc_mtm']
    del mtm_titprivado['ano_dt_ref2']
    del mtm_titprivado['mes_dt_ref2']
    del mtm_titprivado['dia_dt_ref2']
    del mtm_titprivado['vertices_positivo']
    del mtm_titprivado['indice_dc_dt_ref2']
    del mtm_titprivado['indice_du_dt_ref2']
    del mtm_titprivado['prazo_dc']
    del mtm_titprivado['ano_inicio']
    del mtm_titprivado['mes_inicio']
    del mtm_titprivado['dia_inicio']
    del mtm_titprivado['indice_du_inicio']
    del mtm_titprivado['indice_dc_inicio']
    del mtm_titprivado['ano_fim']
    del mtm_titprivado['mes_fim']
    del mtm_titprivado['dia_fim']
    del mtm_titprivado['indice_du_fim']
    del mtm_titprivado['indice_dc_fim']
    del mtm_titprivado['dt_ref']
    del mtm_titprivado['dtoperacao']

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados - mtm_renda_fixa")
    pd.io.sql.to_sql(mtm_titprivado, name='mtm_renda_fixa', con=connection, if_exists='append', flavor='mysql', index=0)

    #Fecha conexão
    connection.close()
示例#16
0
def processo_quaid_expo_var():

    import pymysql as db
    import pandas as pd
    import datetime
    import logging

    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from var.scripts.relatorio_encadeado.quaid419.quaid419 import quaid419
    from var.scripts.relatorio_encadeado.exposicoes.exposicoes_conso import exposicoes_conso
    from var.scripts.relatorio_encadeado.exposicoes.exposicoes_sep import exposicoes_sep
    from var.scripts.relatorio_encadeado.var_gerencial.var_gerencial import var_gerencial

    #Definitions:
    logger = logging.getLogger(__name__)
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dtbase = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2]
    #dtbase = '2016-11-30' #Caso seja necessário forçar uma data
    horario_inicio= datetime.datetime.now()

    #Parametros gerados pelo arquivo 17-xml_quadro_operacoes_nao_org.py ao final da função parametrização
    inicio_hdi = int(get_global_var("inicio_hdi_quaid_expo_var"))
    fim_hdi = int(get_global_var("fim_hdi_quaid_expo_var"))
    inicio_gerling = int(fim_hdi)+1
    fim_gerling = int(get_global_var("fim_gerling_quaid_expo_var"))
    coent_hdi = get_global_var("coent_hdi")
    coent_gerling = get_global_var("coent_gerling")

    #HDI
    horario_processo = datetime.datetime.today()
    for i in range(inicio_hdi, fim_hdi+1):
        quaid419(i, dtbase, coent_hdi, "G", horario_processo)
        quaid419(i, dtbase, coent_hdi, "R", horario_processo)

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv', use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT * FROM count_quadros where ENTCODIGO = "'+coent_hdi+'" and tipo_relatorio = "G" and data_bd = (SELECT max(data_bd) from count_quadros where ENTCODIGO = "'+coent_hdi+'" and tipo_relatorio = "G" )'
    lista = pd.read_sql(query, connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    for j in lista['id_relatorio_quaid419']:
        logger.info("Executando Relatório para HDI - ID: "+j)
        print("Executando Relatório para HDI - ID: " + j)
        exposicoes_conso(j)
        exposicoes_sep(j)
        var_gerencial(j, "normal", dtbase)
        var_gerencial(j, "estressado", dtbase)

    #Gerling
    horario_processo = datetime.datetime.today()
    for i in range(inicio_gerling, fim_gerling+1):
        quaid419(i, dtbase, coent_gerling, "G", horario_processo)
        quaid419(i, dtbase, coent_gerling, "R", horario_processo)

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',user='******',passwd='root', db='projeto_inv', use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT * FROM count_quadros where ENTCODIGO = "'+coent_gerling+'" and tipo_relatorio = "G" and data_bd = (SELECT max(data_bd) from count_quadros where ENTCODIGO = "'+coent_gerling+'" and tipo_relatorio = "G" )'
    lista = pd.read_sql(query, connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    for j in lista['id_relatorio_quaid419']:
        exposicoes_conso(j)
        exposicoes_sep(j)
        var_gerencial(j, "normal", dtbase)
        var_gerencial(j, "estressado", dtbase)

    horario_fim = datetime.datetime.now()
    tempo=horario_fim-horario_inicio
    print(tempo)
示例#17
0
def get_bmf_curvas_historico():

    import pandas as pd
    import pymysql as db
    import datetime
    import logging

    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior

    logger = logging.getLogger(__name__)

    # Retorna um array (ano, mes e dia) referente ao útimo dia útil do mês anterior configurado no banco de dados
    dtbase = get_data_ultimo_dia_util_mes_anterior()

    logger.info("Tratando dados")

    # Retorna um range de datas do mes anterior
    dt_ref = pd.date_range(start=datetime.date(int(dtbase[0]), int(dtbase[1]),
                                               1),
                           end=datetime.date(int(dtbase[0]), int(dtbase[1]),
                                             int(dtbase[2])),
                           freq='D').date

    # Para cada dia de referência do mês anterior, puxa as informações do site da bolsa e inseri no banco
    for i in dt_ref:
        print("Executando para o dia: " + str(i))
        dia = str(i.day)
        mes = str(i.month)
        ano = str(i.year)

        if len(mes) == 1:
            mes = "0" + mes

        if len(dia) == 1:
            dia = "0" + dia

        lista_curvas = [
            "ACC", "ALD", "AN", "ANP", "APR", "BRP", "CBD", "DCO", "DIC",
            "DIM", "DOC", "DOL", "DP", "EUC", "EUR", "IAP", "INP", "IPR",
            "JPY", "LIB", "NID", "PBD", "PDN", "PRE", "PTX", "SDE", "SLP",
            "SND", "TFP", "TP", "TR", "ZND"
        ]

        # Cria gabarito da tabela definitiva das curvas e também tabela aux2 que é pré-gabarito
        matriz_curvas = pd.DataFrame()
        aux2 = pd.DataFrame()
        for j in range(0, 5):
            matriz_curvas[j] = 0
            aux2[j] = 0

        matriz_curvas.columns = ['Prazo', '252', '360', 'Valor', 'Codigo']

        aux2.columns = ['Prazo', '252', '360', 'Valor', 'Codigo']

        # Acesso aos dados da página
        try:
            for curva in lista_curvas:
                # curva = lista_curvas[0]
                endereco_curvas = get_global_var(
                    endereco_curvas
                ) + dia + "/" + mes + "/" + ano + "&slcTaxa=" + curva
                dados_curvas = pd.read_html(endereco_curvas, thousands=".")

                if not (
                        len(dados_curvas)
                ) <= 2:  # checa se essa curva tem dados, por meio do numero de linhas do dataframe, se <2, nao tem dados
                    # Copia o dataframe para a tabela auxiliar
                    aux = dados_curvas[2]

                    # Na tabela auxiliar, verifica-se se possui os 2 campos '252', '360', ou apenas 1 campo
                    # Faz-se uma copia das colunas de 'aux' para 'aux2', que é será adicionado (append) a matriz_curvas
                    if (len(aux.columns)) < 3:
                        if "252" in aux[0][1]:
                            aux = aux.drop(
                                [0, 1]
                            )  # Elimina as 2 primeiras linhas (nao utilizaveis)
                            aux2['Prazo'] = aux[0]
                            aux2['252'] = aux[1]
                        elif "360" in aux[0][1]:
                            aux = aux.drop(
                                [0, 1]
                            )  # Elimina as 2 primeiras linhas (nao utilizaveis)
                            aux2['Prazo'] = aux[0]
                            aux2['360'] = aux[1]
                        else:
                            aux = aux.drop(
                                [0, 1]
                            )  # Elimina as 2 primeiras linhas (nao utilizaveis)
                            aux2['Prazo'] = aux[0]
                            aux2['Valor'] = aux[1]

                    else:
                        aux = aux.iloc[2:len(
                            aux
                        ), :]  # Elimina as 2 primeiras linhas (nao utilizaveis)
                        aux2['Prazo'] = aux[0]
                        aux2['252'] = aux[1]
                        aux2['360'] = aux[2]

                    aux2['Codigo'] = curva
                    matriz_curvas = matriz_curvas.append(aux2)
                    for i in range(2, len(aux2) + 2):
                        aux2 = aux2.drop(i)
        except:
            pass

        horario_bd = datetime.datetime.now()
        matriz_curvas["data_bd"] = horario_bd

        ano = int(ano)
        mes = int(mes)
        dia = int(dia)
        matriz_curvas["data_ref"] = datetime.date(ano, mes, dia)

        # troca , .
        matriz_curvas = matriz_curvas.replace({',': '.'}, regex=True)

        # troca NaN por None
        matriz_curvas = matriz_curvas.where((pd.notnull(matriz_curvas)), None)

        logger.info("Conectando no Banco de dados")
        connection = db.connect('localhost',
                                user='******',
                                passwd='root',
                                db='projeto_inv',
                                use_unicode=True,
                                charset="utf8")
        logger.info("Conexão com DB executada com sucesso")

        logger.info("Salvando base de dados - Tabela bmf_curvas")
        pd.io.sql.to_sql(matriz_curvas,
                         name='bmf_curvas_' + str(ano) + '_' + str(mes),
                         con=connection,
                         if_exists="append",
                         flavor='mysql',
                         index=0)

        connection.close()
示例#18
0
def fluxo_titpublico():

    import datetime
    import pandas as pd
    import numpy as np
    import pymysql as db
    import logging

    from pandas.tseries.offsets import DateOffset
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior

    #Variables:
    logger = logging.getLogger(__name__)

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    dtbase_datetime = datetime.date(int(dtbase[0]), int(dtbase[1]),
                                    int(dtbase[2]))

    #Conexão com Banco de Dados
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT * FROM projeto_inv.anbima_tpf'
    baseref1 = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #1 - ALTERACAO DO CODIGO POR MUDANCA DA QUERY
    #1.1 - Joga fora sujeira da base antiga
    baseref1 = baseref1[baseref1['dt_vencto2'].notnull()]
    #1.2 - Ordena pela data da carga
    baseref1 = baseref1.sort_values(by=[
        'dt_referencia', 'titulo', 'cod_selic', 'dt_emissao', 'dt_vencto',
        'dt_carga'
    ],
                                    ascending=True)
    #1.3 - Pega para cada um dos titulos publicos apenas a ultima informacao baixada da anbima
    baseref1 = baseref1.drop_duplicates(
        subset=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto'], keep='last')
    #1.4 - Joga fora titulos que ja venceram
    baseref1 = baseref1[baseref1['dt_vencto2'] >= dtbase_datetime]
    #1.5 - Reseta o index do dataframe
    baseref1 = baseref1.reset_index(level=None,
                                    drop=True,
                                    inplace=False,
                                    col_level=0,
                                    col_fill='')
    ###############################################################################

    anbima_fluxo_tpf = pd.DataFrame(columns=[
        'titulo', 'cod_selic', 'dt_emissao', 'dt_vencto', 'dt_vencto2',
        'dt_referencia', 'dt_carga', 'dt_ref', 'fv'
    ])

    n = len(baseref1)

    i1 = 0

    for i in range(0, n):
        qtde = 1
        vencto = pd.to_datetime(baseref1['dt_vencto2'][i])
        temp = pd.to_datetime(baseref1['dt_vencto2'][i])
        anbima_fluxo_tpf.loc[i1] = [
            baseref1['titulo'][i], baseref1['cod_selic'][i],
            baseref1['dt_emissao'][i], baseref1['dt_vencto'][i],
            baseref1['dt_vencto2'][i], baseref1['dt_referencia'][i],
            baseref1['dt_carga'][i], temp, 0
        ]
        if (baseref1['titulo'][i] in ('NTN-B', 'NTN-C', 'NTN-F')):
            #print(anbima_fluxo_tpf)
            temp = temp - DateOffset(months=6, days=0)
            while temp > pd.to_datetime(baseref1['dt_emissao'])[i]:
                i1 = i1 + 1
                qtde = qtde + 1
                anbima_fluxo_tpf.loc[i1] = [
                    baseref1['titulo'][i], baseref1['cod_selic'][i],
                    baseref1['dt_emissao'][i], baseref1['dt_vencto'][i],
                    baseref1['dt_vencto2'][i], baseref1['dt_referencia'][i],
                    baseref1['dt_carga'][i], temp, 0
                ]
                temp = vencto - DateOffset(months=(6 * qtde), days=0)
        i = i + 1
        i1 = i1 + 1

    del anbima_fluxo_tpf['dt_referencia']
    del anbima_fluxo_tpf['dt_carga']

    anbima_fluxo_tpf['dt_ref'] = pd.to_datetime(anbima_fluxo_tpf['dt_ref'],
                                                format='%d-%m-%Y')

    anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LFT', 'cupom'] = 0
    anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LTN', 'cupom'] = 0
    anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'NTN-C', 'cupom'] = 0.06
    anbima_fluxo_tpf.ix[(anbima_fluxo_tpf['titulo'] == 'NTN-C') &
                        (pd.to_datetime(anbima_fluxo_tpf['dt_vencto']).dt.
                         date == datetime.date(2031, 1, 1)), 'cupom'] = 0.12
    anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'NTN-B', 'cupom'] = 0.06
    anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'NTN-F', 'cupom'] = 0.10
    anbima_fluxo_tpf['dif'] = (pd.to_datetime(anbima_fluxo_tpf['dt_vencto2']) -
                               pd.to_datetime(anbima_fluxo_tpf['dt_ref'])
                               ).astype('timedelta64[D]') * 1
    anbima_fluxo_tpf['fv'] = np.where(
        anbima_fluxo_tpf.dif <= 10.0, (1 + (anbima_fluxo_tpf['cupom']))**0.5,
        (1 + (anbima_fluxo_tpf['cupom']))**0.5 - 1)
    anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LTN', 'fv'] = 1
    anbima_fluxo_tpf.ix[anbima_fluxo_tpf.titulo == 'LFT', 'fv'] = 1
    del anbima_fluxo_tpf['dif']

    anbima_fluxo_tpf['data_bd'] = pd.datetime.today()

    anbima_fluxo_tpf1 = anbima_fluxo_tpf.copy()
    anbima_fluxo_tpf1['dt_ref'] = anbima_fluxo_tpf1['dt_ref'].dt.date

    # Salvar no MySQL
    if len(anbima_fluxo_tpf1) > 0:
        logger.info("Salvando base de dados - anbima_fluxo_tpf")
        pd.io.sql.to_sql(anbima_fluxo_tpf1,
                         name='anbima_fluxo_tpf',
                         con=connection,
                         if_exists='append',
                         flavor='mysql',
                         index=0)

    connection.close()
示例#19
0
def mtm_titpublico():

    import datetime
    import pandas as pd
    import numpy as np
    import pymysql as db
    import logging
    from findt import FinDt
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior

    logger = logging.getLogger(__name__)

    # Diretório de save de planilhas
    save_path = full_path_from_database('mtm_titpublico_output') + 'erro.xlsx'
    feriados_sheet = full_path_from_database('feriados_nacionais') + 'feriados_nacionais.csv'

    # Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
    dtbase = get_data_ultimo_dia_util_mes_anterior()
    #dtbase = ['2016','11','30']
    dt_base = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2]

    # Data formatada como Dia-Mes-Ano
    data_inicio = dtbase[2] + '-' + dtbase[1] + '-' + dtbase[0]

    # Conexão com Banco de Dados
    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost', user='******', passwd='root', db='projeto_inv'
, use_unicode=True, charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'SELECT a.* FROM projeto_inv.anbima_tpf a right join (select dt_referencia, max(dt_carga) as dt_carga from projeto_inv.anbima_tpf where dt_referencia="' + dt_base + '" group by 1) b on a.dt_referencia=b.dt_referencia and a.dt_carga=b.dt_carga;'
    basetaxa = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    basetaxa = basetaxa.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
    basetaxa1 = basetaxa[["titulo", "cod_selic", "dt_emissao", "dt_vencto", "dt_referencia", "tx_indicativa", "pu"]]

    query = 'SELECT a.* FROM projeto_inv.anbima_fluxo_tpf a right join (select titulo, cod_selic, dt_emissao, dt_vencto, max(data_bd) as data_bd from projeto_inv.anbima_fluxo_tpf group by 1,2,3,4) b on a.titulo=b.titulo and a.cod_selic=b.cod_selic and a.dt_emissao=b.dt_emissao and a.dt_vencto=b.dt_vencto and a.data_bd=b.data_bd;'
    baseref1 = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    logger.info("Tratando dados")

    baseref1 = pd.merge(baseref1, basetaxa1, left_on=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto'],
                        right_on=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto'], how='right')

    baseref2 = baseref1.reindex(
        columns=['titulo', 'cod_selic', 'dt_emissao', 'dt_vencto', 'dt_vencto2', 'tx_indicativa', 'dt_referencia', 'cupom',
                 'dt_ref', 'fv'])

    anbima_fluxomtm_tpf = baseref2[baseref2['dt_ref'] >= baseref2['dt_referencia']].copy()

    dt_max = max(anbima_fluxomtm_tpf['dt_ref'])
    dt_max = dt_max.strftime('%d-%m-%Y')
    per = FinDt.DatasFinanceiras(data_inicio, dt_max, path_arquivo = feriados_sheet)
    du = pd.DataFrame(columns=['dt_ref'])
    dc = pd.DataFrame(columns=['dt_ref'])
    dc['dt_ref'] = per.dias()
    du['dt_ref'] = per.dias(3)
    du['flag_du'] = 1
    controle_du = pd.merge(dc, du, left_on=['dt_ref'], right_on=['dt_ref'], how='left')
    controle_du = controle_du.fillna(0)
    controle_du['du'] = np.cumsum(controle_du['flag_du']).astype(float)

    anbima_fluxomtm_tpf = pd.merge(anbima_fluxomtm_tpf, controle_du, left_on=['dt_ref'], right_on=['dt_ref'], how='left')

    dt_base1 = dt_base + ' 00:00:00'
    query = 'select a.codigo_selic, a.titulo, a.vna from projeto_inv.anbima_vna a right join (select titulo, codigo_selic, data_referencia, max(data_bd) as data_bd from projeto_inv.anbima_vna where data_referencia="' + dt_base1 + '" group by 1,2,3) b on a.titulo=b.titulo and a.codigo_selic=b.codigo_selic and a.data_referencia=b.data_referencia and a.data_bd=b.data_bd;'
    vna = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'LFT', 'lft', anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'LTN', 'ltn', anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'NTN-F', 'ntnf',
                                             anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'NTN-C', 'ntnc',
                                             anbima_fluxomtm_tpf['titulo'])
    anbima_fluxomtm_tpf['titulo'] = np.where(anbima_fluxomtm_tpf['titulo'] == 'NTN-B', 'ntnb',
                                             anbima_fluxomtm_tpf['titulo'])

    anbima_fluxomtm_tpf['cotacao'] = 0
    anbima_fluxomtm_tpf['fv1'] = 0
    anbima_fluxomtm_tpf['pv'] = 0

    anbima_fluxomtm_tpf = pd.merge(anbima_fluxomtm_tpf, vna, left_on=['cod_selic', 'titulo'],
                                   right_on=['codigo_selic', 'titulo'], how='left')
    del anbima_fluxomtm_tpf['codigo_selic']
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'ltn', 'vna'] = 1000
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'ntnf', 'vna'] = 1000

    anbima_fluxomtm_tpf1 = anbima_fluxomtm_tpf.copy()
    anbima_fluxomtm_tpf = anbima_fluxomtm_tpf1.copy()

    anbima_fluxomtm_tpf['dif'] = (pd.to_datetime(anbima_fluxomtm_tpf['dt_vencto2']) - pd.to_datetime(
        anbima_fluxomtm_tpf['dt_ref'])).astype('timedelta64[D]') * 1
    anbima_fluxomtm_tpf['fv'] = np.where(anbima_fluxomtm_tpf.dif <= 10.0, (1 + (anbima_fluxomtm_tpf['cupom'])) ** 0.5,
                                         (1 + (anbima_fluxomtm_tpf['cupom'])) ** 0.5 - 1)
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'ltn', 'fv'] = 1
    anbima_fluxomtm_tpf.ix[anbima_fluxomtm_tpf.titulo == 'lft', 'fv'] = 1
    del anbima_fluxomtm_tpf['dif']

    anbima_fluxomtm_tpf['du_ajustado'] = np.where(anbima_fluxomtm_tpf['dt_vencto2'] == anbima_fluxomtm_tpf['dt_ref'],
                                                  anbima_fluxomtm_tpf['du'],
                                                  anbima_fluxomtm_tpf['du'] + anbima_fluxomtm_tpf['flag_du'])

    titpublico = pd.DataFrame()

    ltn = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ltn'].copy()
    formcor = np.float64((ltn['vna'] * ltn['fv'] / ((1 + ltn['tx_indicativa'] / 100) ** (ltn['du'] / 252))))
    ltn['pv'] = np.trunc(formcor * (10 ** 6)) / (10 ** 6)
    titpublico = titpublico.append(ltn)

    lft = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'lft'].copy()
    lft['cotacao'] = np.trunc(1 / (1 + lft['tx_indicativa'] / 100) ** (lft['du'] / 252) * (10 ** 6)) / (10 ** 6)
    formcor = np.float64(lft['vna'] * lft['cotacao'] * (10 ** 6))
    lft['pv'] = np.trunc(formcor) / (10 ** 6)
    titpublico = titpublico.append(lft)

    ntnf = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ntnf'].copy()
    formcor = np.float64(ntnf['fv'] * ntnf['vna'] * (10 ** 9))
    ntnf['fv1'] = np.trunc(formcor) / (10 ** 9)
    ntnf['pv'] = np.trunc((ntnf['fv1'] / (1 + ntnf['tx_indicativa'] / 100) ** (ntnf['du'] / 252)) * (10 ** 7)) / (10 ** 7)
    titpublico = titpublico.append(ntnf)

    ntnc = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ntnc'].copy()
    formcor = np.float64(
        (np.trunc((ntnc['fv'] / (1 + ntnc['tx_indicativa'] / 100) ** (ntnc['du'] / 252)) * (10 ** 8)) / (10 ** 8)) * ntnc[
            'vna'] * (10 ** 6))
    ntnc['pv'] = np.trunc(formcor) / (10 ** 6)
    titpublico = titpublico.append(ntnc)

    ntnb = anbima_fluxomtm_tpf[anbima_fluxomtm_tpf['titulo'] == 'ntnb'].copy()
    formcor = np.float64(
        (np.trunc((ntnb['fv'] / (1 + ntnb['tx_indicativa'] / 100) ** (ntnb['du'] / 252)) * (10 ** 8)) / (10 ** 8)) * ntnb[
            'vna'] * (10 ** 6))
    ntnb['pv'] = np.trunc(formcor) / (10 ** 6)
    titpublico = titpublico.append(ntnb)

    del titpublico['cotacao']
    del titpublico['fv1']

    mtm_sum_tpf = titpublico.groupby(["titulo", "dt_vencto"], as_index=False).sum()
    mtm_sum_tpf.rename(columns={'pv': 'pu_calc'}, inplace=True)
    anbima_mtm_sum_tpf = mtm_sum_tpf[["titulo", "dt_vencto", "pu_calc"]]
    anbima_fluxomtm_tpf = pd.merge(titpublico, anbima_mtm_sum_tpf, left_on=["titulo", "dt_vencto"],
                                   right_on=["titulo", "dt_vencto"], how='left')

    anbima_fluxomtm_tpf['perc_pu_fluxo'] = anbima_fluxomtm_tpf['pv'] / anbima_fluxomtm_tpf['pu_calc']

    anbima_fluxomtm_tpf['data_bd'] = datetime.datetime.today()

    # Salvar no MySQL
    logger.info("Salvando base de dados - anbima_fluxomtm_tpf")
    pd.io.sql.to_sql(anbima_fluxomtm_tpf, name='anbima_fluxomtm_tpf', con=connection, if_exists='append', flavor='mysql',
                     index=0)

    connection.close()

    # validacao
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'LFT', 'lft', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'LTN', 'ltn', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'NTN-F', 'ntnf', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'NTN-C', 'ntnc', basetaxa1['titulo'])
    basetaxa1['titulo'] = np.where(basetaxa1['titulo'] == 'NTN-B', 'ntnb', basetaxa1['titulo'])

    anbima_mtm_sum_tpf = anbima_mtm_sum_tpf.merge(basetaxa1, on=['titulo', 'dt_vencto'], how='left')
    anbima_mtm_sum_tpf['erro'] = anbima_mtm_sum_tpf['pu'] - anbima_mtm_sum_tpf['pu_calc']

    anbima_mtm_sum_tpf.to_excel(save_path, sheet_name='titpublico')
    logger.info("Arquivos salvos com sucesso")
示例#20
0
import datetime
import numpy as np
import pandas as pd
import pymysql as db
from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

id_relatorio_quaid419 = 3528

# Diretório de save de planilhas
save_path = full_path_from_database("matriz_gerencial_retornos")

# Pega a data do último dia útil do mês anterior e deixa no formato específico para utilização da função
dtbase = get_data_ultimo_dia_util_mes_anterior()
dt_base = dtbase[0] + '-' + dtbase[1] + '-' + dtbase[2]
dtbase_concat = dtbase[0] + dtbase[1] + dtbase[2]

data_inicial = "2010-03-31"
data_final = dt_base
lambda_geral = 0.95 #definir lambdas específicos na linha 60

# Ajuste datas
data_inicial = datetime.datetime.strptime(data_inicial, "%Y-%m-%d").date()
data_final = datetime.datetime.strptime(data_final, "%Y-%m-%d").date()

# Consulta valores das séries
connection = db.connect('localhost', user = '******', passwd = "root", db = 'projeto_inv')

# Substituir dados do excel pelas informações do MySQL
dados_curvas = pd.read_sql_query('SELECT * FROM curva_ettj_vertices_fixos', connection)
dados_bacen = pd.read_sql_query('SELECT * FROM bacen_series', connection)
示例#21
0
def simulacao_credito():

    import pandas as pd
    import pymysql as db
    import numpy as np
    import math
    import logging
    from dependencias.Metodos.funcoes_auxiliares import get_global_var
    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database
    from findt import FinDt

    feriados_sheet = full_path_from_database(
        'feriados_nacionais') + 'feriados_nacionais.csv'

    cnpj_hdi = get_global_var("cnpj_hdi")
    logger = logging.getLogger(__name__)
    dt_base = get_data_ultimo_dia_util_mes_anterior()
    dt_base = dt_base[0] + '-' + dt_base[1] + '-' + dt_base[2]
    #qtde_simulacao = 3000
    qtde_simulacao = 1

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    query = 'select distinct nome_emissor, cnpj_emissor, data_criacao_emissor from projeto_inv.bmf_emissor where cnpj_emissor>0;'
    emissor = pd.read_sql(query, con=connection)
    logger.info("Leitura do banco de dados executada com sucesso")

    #Fecha conexão
    connection.close()

    emissor = emissor.sort(['cnpj_emissor', 'data_criacao_emissor'],
                           ascending=[True, False])
    emissor1 = emissor.drop_duplicates(subset=['cnpj_emissor'],
                                       take_last=False)
    emissor1['cnpj'] = emissor1['cnpj_emissor'].astype(float)
    emissor1 = emissor1.rename(columns={'nome_emissor': 'contraparte'})
    emissor2 = emissor1[['cnpj', 'contraparte']]

    #seleção da carteira
    def quadro_oper(dt_base, cnpj):

        #Global Variables:
        global start
        global header_id_carteira
        global quadro_oper
        global tp
        global tp_expo
        global tp_fluxo
        global id_relatorio_qo

        start = dt_base

        logger.info("Conectando no Bancode dados")
        connection = db.connect('localhost',
                                user='******',
                                passwd='root',
                                db='projeto_inv',
                                use_unicode=True,
                                charset="utf8")
        logger.info("Conexão com DB executada com sucesso")

        query = 'select * from projeto_inv.xml_header_org where cnpjcpf="' + cnpj + '" and dtposicao=' + '"' + dt_base + '";'
        df = pd.read_sql(query, con=connection)

        if len(df) == 0:
            query = 'select * from projeto_inv.xml_header_org where cnpj="' + cnpj + '" and dtposicao=' + '"' + dt_base + '";'
            df = pd.read_sql(query, con=connection)

        df = df.sort(['cnpj', 'cnpjcpf', 'data_bd'],
                     ascending=[True, True, False])
        df = df.drop_duplicates(subset=['cnpj', 'cnpjcpf'], take_last=False)
        df = df.reset_index(level=None,
                            drop=False,
                            inplace=False,
                            col_level=0,
                            col_fill='')
        del df['index']

        header_id_carteira = df.get_value(0, 'header_id').astype(str)

        # quadro de operaçao
        query = 'select a.* from projeto_inv.xml_quadro_operacoes a right join (select header_id, max(data_bd) as data_bd from projeto_inv.xml_quadro_operacoes where header_id=' + header_id_carteira + ' group by 1) b on a.header_id=b.header_id and a.data_bd=b.data_bd;'
        quadro_oper = pd.read_sql(query, con=connection)
        logger.info("Leitura do banco de dados executada com sucesso")

        tp = quadro_oper.loc[quadro_oper['produto'].isin(
            ['título privado', 'debênture'])]
        id_relatorio_qo = tp['id_relatorio_qo'][0]

        # fidc
        fundos = quadro_oper.loc[quadro_oper['produto'].isin(['fundo'])].copy()
        fundos['fundo_final'] = np.where(fundos['fundo_ult_nivel'].isnull(),
                                         fundos['fundo'],
                                         fundos['fundo_ult_nivel'])

        #INCLUIR FIDCS
        fidc = fundos[fundos['fundo_final'].str.contains(
            'FIDC|DIREITOS|CREDITÓRIO|CREDITORIOS|DIREITOS')]

        tp = tp.append(fidc)
        tp['contraparte'] = np.where(tp.produto == 'fundo', tp.fundo_final,
                                     tp.contraparte)
        tp['cnpj_fundo_final'] = np.where(
            (tp.produto == 'fundo') & (tp.cnpjfundo_outros.isnull()),
            tp.cnpjfundo_1nivel, tp.cnpjfundo_outros)
        tp['cnpj'] = np.where(tp.produto == 'fundo', tp.cnpj_fundo_final,
                              tp.cnpj)

        # pegar exposicao mercado
        tp['expo_final'] = np.where(tp['caracteristica'] != 'N',
                                    tp['pu_mercado'] * tp['quantidade'],
                                    tp['mtm_info'])
        tp['expo_final'] = np.where(tp['expo_final'] == 0, tp['mtm_info'],
                                    tp['expo_final'])
        tp['expo_final'] = np.where(tp.produto == 'fundo', tp['mtm_info'],
                                    tp['expo_final'])

        # incluir data de vencimento de fidc
        query = 'select distinct codigo_isin, dtvencimento, data_bd, max(data_ref) as dt_ref from projeto_inv.mtm_renda_fixa group by 1,2,3;   '
        dfvencto = pd.read_sql(query, con=connection)
        dfvencto = dfvencto.sort_values(by=['codigo_isin', 'data_bd'],
                                        ascending=[True, False])
        dfvencto1 = dfvencto.drop_duplicates(subset=['codigo_isin'],
                                             take_last=False)
        dfvencto1['dt_vencto_fim'] = np.where(dfvencto1.dtvencimento.isnull(),
                                              dfvencto1.dt_ref,
                                              dfvencto1.dtvencimento)

        base_vencto = dfvencto1[['codigo_isin', 'dt_vencto_fim']].copy()

        tp = pd.merge(tp,
                      base_vencto,
                      left_on='isin',
                      right_on='codigo_isin',
                      how='left')
        tp['dt_vencto_1'] = np.where(tp.dt_vencto.isnull(), tp.dt_vencto_fim,
                                     tp.dt_vencto)

        del tp['codigo_isin']
        del tp['dt_vencto']
        del tp['dt_vencto_fim']

        tp = tp.rename(columns={'dt_vencto_1': 'dt_vencto'})

        tp_mtm = tp[[
            'expo_final', 'quantidade', 'isin', 'cnpj', 'produto', 'dt_vencto',
            'fundo_final'
        ]].copy()

        tp_mtm = pd.merge(tp_mtm,
                          emissor2,
                          left_on='cnpj',
                          right_on='cnpj',
                          how='left')
        tp_mtm['contraparte'] = tp_mtm['contraparte'].fillna(
            tp_mtm['fundo_final'])

        del tp_mtm['fundo_final']

        tp_expo = tp_mtm.groupby(
            ['isin', 'cnpj', 'contraparte', 'produto', 'dt_vencto'],
            as_index=False).sum()
        tp_expo = tp_expo.reset_index(level=None,
                                      drop=False,
                                      inplace=False,
                                      col_level=0,
                                      col_fill='')
        tp_expo['cnpj'] = tp_expo['cnpj'].astype(float)
        tp_expo['cnpj1'] = ""

        for i in range(0, len(tp_expo)):
            if tp_expo['cnpj'][i] > 0:
                tp_expo['cnpj1'][i] = math.floor(tp_expo['cnpj'][i])
            #i=i+1
        tp_expo['cnpj2'] = tp_expo['cnpj1'].astype(str).str.zfill(14)
        del tp_expo['cnpj']
        del tp_expo['cnpj1']
        tp_expo = tp_expo.rename(columns={'cnpj2': 'cnpj'})

        # fluxos
        query = 'select a.codigo_isin, a.fv, a.data_ref, a.indexador, a.data_mtm, a.data_bd from projeto_inv.mtm_renda_fixa a right join (select codigo_isin, data_mtm, max(data_bd) as data_bd from projeto_inv.mtm_renda_fixa where data_mtm="' + dt_base + '" group by 1,2) b on a.codigo_isin=b.codigo_isin and a.data_mtm=b.data_mtm and a.data_bd=b.data_bd;'
        fluxos = pd.read_sql(query, con=connection)

        tp_fluxo = pd.merge(tp_expo,
                            fluxos,
                            left_on='isin',
                            right_on='codigo_isin')
        del tp_fluxo['data_bd']
        tp_fluxo['fv1'] = abs(tp_fluxo['fv'] * tp_fluxo['quantidade'])
        del tp_fluxo['fv']
        tp_fluxo = tp_fluxo.rename(columns={'fv1': 'fv'})
        del tp_fluxo['codigo_isin']
        tp_fluxo = tp_fluxo.reindex(
            columns=['isin', 'data_ref', 'indexador', 'fv'])

        #Fecha conexão
        connection.close()

    quadro_oper(dt_base, cnpj_hdi)

    fluxo_original = tp_fluxo.copy()

    logger.info("Conectando no Banco de dados")
    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv',
                            use_unicode=True,
                            charset="utf8")
    logger.info("Conexão com DB executada com sucesso")

    # LGD
    query = 'select a.produto, a.lgd from projeto_inv.lgd a right join (select produto, max(data_bd) as data_bd from projeto_inv.lgd group by 1) b on a.produto=b.produto and a.data_bd=b.data_bd;'
    lgd = pd.read_sql(query, con=connection)

    #simulação de cenário____________________________________________________________________________
    query = 'SELECT n.* FROM projeto_inv.curva_ettj_interpol n INNER JOIN (  SELECT indexador_cod, month(dt_ref ) as mes, year (dt_ref) as ano, max(dt_ref) as max  FROM projeto_inv.curva_ettj_interpol  GROUP BY 1,2,3) a on a.indexador_cod=n.indexador_cod and a.max=n.dt_ref;'

    cen = pd.read_sql(query, con=connection)
    cen = cen.sort(['indexador_cod', 'prazo', 'dt_ref', 'data_bd'],
                   ascending=[True, True, True, False])
    cen1 = cen.drop_duplicates(subset=['indexador_cod', 'prazo', 'dt_ref'],
                               take_last=False)

    cen1['indexador_shift'] = cen1['indexador_cod'].shift()
    cen1['prazo_shift'] = cen1['prazo'].shift()
    cen1['tx_spot_shift'] = cen1['tx_spot'].shift()
    cen1['dif'] = np.where((cen1.indexador_cod == cen1.indexador_shift) &
                           (cen1.prazo == cen1.prazo_shift),
                           cen1.tx_spot - cen1.tx_spot_shift, 'NaN')
    cen2 = cen1[cen1.dif != 'NaN']

    #________________________________________________________________________________________________________
    # GERACAO DE SERIE DE DIAS ÚTEIS E DIAS CORRIDOS
    ano = start[0:4]
    mes = start[5:7]
    dia = start[8:10]

    dt_inicio = dia + '-' + mes + '-' + ano

    dt_max = max(tp_expo['dt_vencto'])

    per = FinDt.DatasFinanceiras(dt_inicio,
                                 dt_max,
                                 path_arquivo=feriados_sheet)
    du = pd.DataFrame(columns=['data_ref'])
    dc = pd.DataFrame(columns=['data_ref'])
    dc['data_ref'] = per.dias()
    dc['flag_dc'] = 1
    du['data_ref'] = per.dias(3)
    du['flag_du'] = 1
    serie_dias = pd.merge(dc,
                          du,
                          left_on=['data_ref'],
                          right_on=['data_ref'],
                          how='left')
    serie_dias['flag_du'] = serie_dias['flag_du'].fillna(0)
    serie_dias['indice_dc'] = np.cumsum(serie_dias['flag_dc'])
    serie_dias['indice_du'] = np.cumsum(serie_dias['flag_du'])
    del serie_dias['flag_du']
    del serie_dias['flag_dc']

    # OBS: a contagem de dias é o valor do índice menos um

    #PD e matriz de  migracao________________________________
    query = "select * from projeto_inv.pd_mes;"
    pd_mes = pd.read_sql(query, con=connection)
    pd_mes = pd_mes.sort(['rtg', 'produto', 'prazo', 'data_bd'],
                         ascending=[True, True, True, False])
    pd_mes = pd_mes.drop_duplicates(subset=['rtg', 'produto', 'prazo'],
                                    take_last=False)

    query = "select * from projeto_inv.matriz_migr_mes;"
    matriz_mes = pd.read_sql(query, con=connection)
    matriz_mes = matriz_mes.sort(['cod_rtg_de', 'cod_rtg_para', 'data_bd'],
                                 ascending=[True, True, False])
    matriz_mes = matriz_mes.drop_duplicates(
        subset=['cod_rtg_de', 'cod_rtg_para'], take_last=False)

    #TIPO DE PAPEL

    query = "select distinct codigo_isin, data_bd, tipo_ativo from projeto_inv.bmf_numeraca where tipo_ativo in ('DBS', 'LFI', 'LFN', 'DP', 'C', 'CC','CCC', 'CRI');"
    caracteristica = pd.read_sql(query, con=connection)
    caracteristica = caracteristica.sort(['codigo_isin', 'data_bd'],
                                         ascending=[True, False])
    caracteristica = caracteristica.drop_duplicates(subset=['codigo_isin'],
                                                    take_last=False)
    del caracteristica['data_bd']

    df_original = pd.merge(tp_expo,
                           caracteristica,
                           left_on='isin',
                           right_on='codigo_isin',
                           how='left')
    df_original.ix[df_original.tipo_ativo == 'CC', 'tipo_pd'] = 'ccb'
    df_original.ix[df_original.tipo_ativo == 'CCC', 'tipo_pd'] = 'ccb'
    df_original.ix[df_original.tipo_ativo == 'DBS', 'tipo_pd'] = 'deb'
    df_original.ix[df_original.tipo_ativo == 'C', 'tipo_pd'] = 'cdb'
    df_original.ix[df_original.tipo_ativo == 'LFI', 'tipo_pd'] = 'cdb'
    df_original.ix[df_original.tipo_ativo == 'LFN', 'tipo_pd'] = 'cdb'
    df_original.ix[df_original.tipo_ativo == 'DP', 'tipo_pd'] = 'cdb'
    df_original['tipo_pd'] = df_original['tipo_pd'].fillna('fidc')

    del df_original['codigo_isin']

    #RATING________________________________
    query = 'select cod_rtg, rtg from projeto_inv.de_para_rtg a right join (select max(data_bd) as data_bd from projeto_inv.de_para_rtg) b on a.data_bd = b.data_bd;'
    depara = pd.read_sql(query, con=connection)

    #regua mestra
    query = 'select distinct a.cod_rtg, a.agencia_rtg, a.rtg from projeto_inv.de_para_rtg a right join (select agencia_rtg, max(data_bd) as data_bd from projeto_inv.de_para_rtg where agencia_rtg="regua" group by 1) b on a.agencia_rtg=b.agencia_rtg and a.data_bd = b.data_bd;'
    regua_rtg = pd.read_sql(query, con=connection)
    del regua_rtg['agencia_rtg']

    #rating por isin
    query = 'select distinct a.isin, a.agencia_tipo_rtg, a.rtg from projeto_inv.rating_isin as a right join (select max(data_bd) as data_bd from projeto_inv.rating_isin where dt_ref= "' + dt_base + '" ) as b on a.data_bd=b.data_bd;'
    rtg_isin = pd.read_sql(query, con=connection)

    rtg_local = rtg_isin.loc[rtg_isin['agencia_tipo_rtg'].isin([
        'RTG_MDY_NSR', 'RTG_MDY_NSR_SR_UNSECURED', 'RTG_MDY_NSR_SUBORDINATED',
        'RTG_SP_NATIONAL', 'RTG_FITCH_NATIONAL_LT', 'RTG_FITCH_NATIONAL',
        'RTG_FITCH_NATIONAL_SR_UNSECURED', 'RTG_FITCH_NATL_SUBORDINATED'
    ])]
    rtg_local = pd.merge(rtg_local,
                         depara,
                         left_on='rtg',
                         right_on='rtg',
                         how='left')

    rtg_pior = rtg_local[['isin', 'cod_rtg']].copy()
    rtg_pior = rtg_pior.groupby(['isin'], as_index=False).max()
    rtg_pior = pd.merge(rtg_pior,
                        regua_rtg,
                        left_on='cod_rtg',
                        right_on='cod_rtg',
                        how='left')

    #rating por contraparte
    query = 'select distinct a.cnpj, a.agencia_tipo_rtg, a.rtg from projeto_inv.rating_contraparte as a right join (select max(data_bd) as data_bd from projeto_inv.rating_contraparte where dt_ref= "' + dt_base + '" ) as b on a.data_bd=b.data_bd;'
    rtg_c = pd.read_sql(query, con=connection)
    rtg_c_local = rtg_c.loc[rtg_c['agencia_tipo_rtg'].isin([
        'RTG_MDY_NSR_ISSUER', 'RTG_SP_NATIONAL_LT_ISSUER_CREDIT',
        'RTG_FITCH_NATIONAL_LT', 'RTG_FITCH_NATIONAL_SR_UNSECURED'
    ])]
    rtg_c_local = pd.merge(rtg_c_local,
                           depara,
                           left_on='rtg',
                           right_on='rtg',
                           how='left')
    rtg_c_pior = rtg_c_local[['cnpj', 'cod_rtg']].copy()
    rtg_c_pior = rtg_c_pior.groupby(['cnpj'], as_index=False).max()
    rtg_c_pior = pd.merge(rtg_c_pior,
                          regua_rtg,
                          left_on='cod_rtg',
                          right_on='cod_rtg',
                          how='left')

    #agregar o rtg na base
    df_original = pd.merge(df_original,
                           rtg_pior,
                           left_on='isin',
                           right_on='isin',
                           how='left')
    df_original = df_original.rename(columns={
        'cod_rtg': 'cod_rtg_isin',
        'rtg': 'rtg_isin'
    })
    df_original = pd.merge(df_original,
                           rtg_c_pior,
                           left_on='cnpj',
                           right_on='cnpj',
                           how='left')
    df_original = df_original.rename(columns={
        'cod_rtg': 'cod_rtg_cnpj',
        'rtg': 'rtg_cnpj'
    })
    df_original['cod_rtg'] = np.where(df_original['cod_rtg_isin'].isnull(),
                                      df_original.cod_rtg_cnpj,
                                      df_original.cod_rtg_isin)

    del df_original['cod_rtg_isin']
    del df_original['cod_rtg_cnpj']
    del df_original['rtg_isin']
    del df_original['rtg_cnpj']

    df_original = pd.merge(df_original,
                           regua_rtg,
                           left_on='cod_rtg',
                           right_on='cod_rtg',
                           how='left')

    #assumir rtg padrão missing: 'Aa3' e cod_rtg=4
    df_original['cod_rtg'] = df_original['cod_rtg'].fillna(3)
    df_original['rtg'] = df_original['rtg'].fillna('Aa2')
    df_original = df_original.rename(columns={'rtg': 'rating'})

    #Fecha conexão
    connection.close()

    #inicio da simulacao
    def simulacao(id_simulacao):

        global df
        global fluxo
        global df_resultado
        global i_tempo

        df = df_original.copy()
        fluxo = fluxo_original.copy()

        #criar a serie de tempo mensal - para simulacao
        end = max(df['dt_vencto'])
        end = end + pd.DateOffset(months=2)
        inicio = pd.to_datetime(start) + pd.DateOffset(months=1)
        tempo = pd.DataFrame()
        tempo['serie'] = pd.date_range(inicio, end, freq='M')
        tempo['serie'] = tempo['serie'].dt.date

        df = df.reset_index(level=None,
                            drop=False,
                            inplace=False,
                            col_level=0,
                            col_fill='')
        df['dt_base'] = start

        #primeira rodada
        df['rtg'] = df['rating']
        fim = pd.DataFrame()

        #### simulacao
        i_tempo = 0

        while len(df) > 0:

            np.random.seed(1234 + i_tempo + id_simulacao)
            df['aleat_matriz'] = np.random.uniform(0, 1, len(df))
            df['aleat_pd'] = np.random.uniform(0, 1, len(df))
            df_matriz = pd.merge(df,
                                 matriz_mes,
                                 left_on=['rtg'],
                                 right_on=['rtg_de'],
                                 how='left')
            df_rtg = df_matriz[
                (df_matriz['prob_ini'] < df_matriz['aleat_matriz'])
                & (df_matriz['aleat_matriz'] <= df_matriz['prob_fim'])]
            df_rtg['rtg'] = df_rtg['rtg_para']
            df_rtg['dt_ref'] = tempo['serie'][i_tempo]

            #  prazo=1 -> simulação mensal
            df_rtg['prazo'] = 1
            df_rtg1 = pd.merge(df_rtg,
                               pd_mes,
                               left_on=['tipo_pd', 'prazo', 'rtg'],
                               right_on=['produto', 'prazo', 'rtg'],
                               how='left')
            df_rtg1['default'] = np.where(df_rtg1.pd_mensal > df_rtg1.aleat_pd,
                                          1, 0)
            df_rtg_mes = df_rtg1[[
                'isin', 'cnpj', 'contraparte', 'dt_vencto', 'tipo_ativo',
                'tipo_pd', 'rating', 'rtg', 'dt_ref', 'prazo', 'dt_base',
                'pd_mensal', 'default'
            ]].copy()
            df_rtg_mes['break'] = np.where(
                (df_rtg_mes['default'] == 1) |
                (pd.to_datetime(df_rtg_mes['dt_vencto']) <= pd.to_datetime(
                    df_rtg_mes['dt_ref'])), 1, 0)

            default_break = df_rtg_mes[df_rtg_mes['break'] == 1].copy()
            nao_default = df_rtg_mes[~(df_rtg_mes['break'] == 1)].copy()

            fim = fim.append(default_break)
            df = nao_default[[
                'isin', 'cnpj', 'contraparte', 'dt_vencto', 'tipo_ativo',
                'tipo_pd', 'rating', 'rtg', 'dt_base'
            ]].copy()

            i_tempo = i_tempo + 1

        fim = fim.rename(columns={'dt_ref': 'dt_default'})
        fim['lgd'] = 0
        base_default = fim[fim['default'] == 1].copy()
        base_nao_default = fim[fim['default'] == 0].copy()
        base_default = base_default.reset_index(level=None,
                                                drop=False,
                                                inplace=False,
                                                col_level=0,
                                                col_fill='')
        del base_default['index']

        for i_lgd in range(0, len(base_default)):
            np.random.seed(123 + i_lgd + id_simulacao)
            lgd_base_0 = lgd[lgd['produto'] == base_default['tipo_pd'][i_lgd]]
            lgd_base = lgd_base_0.copy()
            lgd_base['aleat_lgd'] = np.random.uniform(0, 1, len(lgd_base))
            lgd_base = lgd_base.sort(['aleat_lgd'])
            lgd_base = lgd_base.reset_index(level=None,
                                            drop=False,
                                            inplace=False,
                                            col_level=0,
                                            col_fill='')
            lgd_perc = lgd_base.get_value(0, 'lgd')
            base_default.loc[i_lgd, 'lgd'] = lgd_perc
            ##VALIDAR ESTA ITERAÇÃO:
            #i_lgd=i_lgd+1

        df_fim = base_nao_default.append(base_default)
        df_fluxo = pd.merge(df_fim,
                            fluxo,
                            left_on=['isin'],
                            right_on=['isin'],
                            how='left')
        df_fluxo = pd.merge(df_fluxo,
                            serie_dias,
                            left_on=['data_ref'],
                            right_on=['data_ref'],
                            how='left')
        df_fluxo = df_fluxo.rename(columns={
            'indice_du': 'du_ref',
            'indice_dc': 'dc_ref'
        })
        df_fluxo = pd.merge(df_fluxo,
                            serie_dias,
                            left_on=['dt_default'],
                            right_on=['data_ref'],
                            how='left')
        del df_fluxo['data_ref_y']
        df_fluxo = df_fluxo.rename(
            columns={
                'indice_du': 'du_default',
                'indice_dc': 'dc_default',
                'data_ref_x': 'data_ref'
            })

        #___________________________CENARIO_______________________________________________
        base_dt = pd.DataFrame(columns=['dt', 'aleat'])
        base_dt['dt'] = cen2['dt_ref'].unique()
        base_dt['aleat'] = np.random.uniform(0, 1, len(base_dt))
        base_dt = base_dt.sort(['aleat'])
        base_dt = base_dt.reset_index(level=None,
                                      drop=False,
                                      inplace=False,
                                      col_level=0,
                                      col_fill='')
        base_dt = base_dt[['dt', 'aleat']]
        dt_max = max(base_dt.dt)

        base_ref_0 = cen2[cen2.dt_ref == dt_max]
        base_ref = base_ref_0.copy()
        del base_ref['dif']

        dt = base_dt.get_value(0, 'dt')

        #erro
        erro_0 = cen2[cen2.dt_ref == dt]
        erro = erro_0.copy()
        erro = erro[['indexador_cod', 'prazo', 'dt_ref', 'dif']]
        del erro['dt_ref']

        base_ref = pd.merge(base_ref,
                            erro,
                            how='left',
                            left_on=['indexador_cod', 'prazo'],
                            right_on=['indexador_cod', 'prazo'])
        base_ref['tx_spot_sim'] = base_ref['tx_spot'].astype(
            float) + base_ref['dif'].astype(float)

        del base_ref['indexador_shift']
        del base_ref['prazo_shift']
        del base_ref['tx_spot_shift']
        del base_ref['dif']

        #--fluxo e cenário
        df_fluxo['indexador_cod'] = ""
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'DI1',
                                             'CDI', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'CDI',
                                             'CDI', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IAP',
                                             'DIC', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IPC',
                                             'DIC', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IGM',
                                             'DIM', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'PRE',
                                             'PRE', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'TR', 'TP',
                                             df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IGP',
                                             'DIM', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IPCA',
                                             'DIC', df_fluxo['indexador_cod'])
        df_fluxo['indexador_cod'] = np.where(df_fluxo.indexador == 'IGPM',
                                             'DIM', df_fluxo['indexador_cod'])

        cenario = base_ref[['prazo', 'indexador_cod', 'tx_spot_sim']].copy()

        df_fluxo_sim = pd.merge(df_fluxo,
                                cenario,
                                left_on=['du_ref', 'indexador_cod'],
                                right_on=['prazo', 'indexador_cod'],
                                how='left')
        df_fluxo_sim['tx_spot_sim'] = df_fluxo_sim['tx_spot_sim'].fillna(0)
        df_fluxo_sim['pv'] = df_fluxo_sim['fv'] / (1 +
                                                   df_fluxo_sim['tx_spot_sim'])

        df_pv = df_fluxo_sim[['isin', 'pv']]
        df_pv['pv'] = df_pv['pv'].fillna(0)
        df_tot = df_pv.groupby(['isin'], as_index=False).sum()

        df_fluxo_perda = df_fluxo_sim[
            (pd.to_datetime(df_fluxo_sim['data_ref']) >= pd.to_datetime(
                df_fluxo_sim['dt_default'])) & (df_fluxo_sim['default'] == 1)]
        df_perda = df_fluxo_perda[['isin', 'tipo_ativo', 'lgd', 'pv']].copy()
        df_perda['pv'] = df_perda['pv'].fillna(0)
        df_perda_tot = df_perda.groupby(['isin', 'tipo_ativo', 'lgd'],
                                        as_index=False).sum()
        df_perda_tot['recuperacao'] = np.where(df_perda_tot.tipo_ativo == 'DP',
                                               20000000, 0)
        df_perda_tot['pv_perda'] = (df_perda_tot['pv'] * df_perda_tot['lgd'] -
                                    df_perda_tot['recuperacao']).clip(0, None)
        df_perda_tot1 = df_perda_tot[['isin', 'pv_perda']].copy()

        df_resultado = pd.merge(df_tot,
                                df_perda_tot1,
                                left_on=['isin'],
                                right_on=['isin'],
                                how='left')
        df_resultado['pv_perda'] = df_resultado['pv_perda'].fillna(0)
        df_resultado[
            'perda_perc'] = df_resultado['pv_perda'] / df_resultado['pv']
        df_resultado['perda_perc'] = df_resultado['perda_perc'].fillna(0)
        df_resultado['dt_base_sim'] = start

        df_resultado['numero_simulacao'] = id_simulacao
        df_resultado['data_bd'] = hoje
        df_resultado['id_relatorio_qo'] = id_relatorio_qo

        df_resultado['pv_perda'] = df_resultado['pv_perda'].fillna(0)

        #Salvar no MySQL
        logger.info("Conectando no Banco de dados")
        connection = db.connect('localhost',
                                user='******',
                                passwd='root',
                                db='projeto_inv',
                                use_unicode=True,
                                charset="utf8")
        logger.info("Conexão com DB executada com sucesso")

        logger.info("Salvando base de dados")
        pd.io.sql.to_sql(df_resultado,
                         name='simulacao_credito',
                         con=connection,
                         if_exists='append',
                         flavor='mysql',
                         index=0)

        #Fecha conexão
        connection.close()

    hoje = pd.datetime.today()

    for numero_sim in range(0, qtde_simulacao):
        simulacao(numero_sim)
示例#22
0
def get_bmf_cotacoes_hist():

    import pandas as pd
    import pymysql as db
    import datetime
    import zipfile
    import logging

    from dependencias.Metodos.funcoes_auxiliares import get_data_ultimo_dia_util_mes_anterior
    from dependencias.Metodos.funcoes_auxiliares import full_path_from_database

    logger = logging.getLogger(__name__)

    # Retorna um array (ano, mes e dia) referente ao útimo dia útil do mês anterior configurado no banco de dados
    array_data = get_data_ultimo_dia_util_mes_anterior()

    # Retorna o path utilizado para acesso aos dados baixados
    full_path = full_path_from_database("cotacoes")

    full_path = full_path + "COTAHIST_D" + str(array_data[2]) + str(
        array_data[1]) + str(array_data[0])

    # Acesso ao arquivo zip
    z = zipfile.ZipFile(full_path + ".zip", "r")
    z.extractall(path=full_path)

    logger.info("Arquivos extraidos com sucesso em :" + full_path)

    # Fechamento diário
    tamanho_campos = [
        2, 8, 2, 12, 3, 12, 10, 3, 4, 13, 13, 13, 13, 13, 13, 13, 5, 18, 18,
        13, 1, 8, 7, 13, 12, 3
    ]
    arquivo_bovespa = full_path + "/COTAHIST_D" + str(array_data[2]) + str(
        array_data[1]) + str(array_data[0]) + ".txt"
    dados_acoes = pd.read_fwf(arquivo_bovespa, widths=tamanho_campos, header=0)

    logger.info("Leitura da página executada com sucesso")

    logger.info("Tratando dados")

    #Padronizar nomes das colunas
    dados_acoes.columns = [
        "tipo_registro", "data_pregao", "cod_bdi", "cod_negociacao",
        "tipo_mercado", "noma_empresa", "especificacao_papel",
        "prazo_dias_merc_termo", "moeda_referencia", "preco_abertura",
        "preco_maximo", "preco_minimo", "preco_medio", "preco_ultimo_negocio",
        "preco_melhor_oferta_compra", "preco_melhor_oferta_venda",
        "numero_negocios", "quantidade_papeis_negociados",
        "volume_total_negociado", "preco_exercicio",
        "ìndicador_correcao_precos", "data_vencimento", "fator_cotacao",
        "preco_exercicio_pontos", "codigo_isin", "num_distribuicao_papel"
    ]

    # Eliminar a última linha ()
    linha = len(dados_acoes["data_pregao"])
    dados_acoes = dados_acoes.drop(linha - 1)

    # Colocar valores com virgula (divir por 100)

    lista_virgula = [
        "preco_abertura", "preco_maximo", "preco_minimo", "preco_medio",
        "preco_ultimo_negocio", "preco_melhor_oferta_compra",
        "preco_melhor_oferta_venda", "volume_total_negociado",
        "preco_exercicio", "preco_exercicio_pontos"
    ]

    for coluna in lista_virgula:
        dados_acoes[coluna] = [i / 100. for i in dados_acoes[coluna]]

    # Warnings tamanho
    #warnings.simplefilter(action = "ignore", category = RuntimeWarning)

    horario_bd = datetime.datetime.now()
    horario_bd = horario_bd.strftime("%Y-%m-%d %H:%M:%S")

    dados_acoes['data_bd'] = horario_bd

    logger.info("Conectando no Banco de dados")

    connection = db.connect('localhost',
                            user='******',
                            passwd='root',
                            db='projeto_inv')

    logger.info("Conexão com DB executada com sucesso")

    logger.info("Salvando base de dados")

    pd.io.sql.to_sql(dados_acoes,
                     name='bovespa_cotahist',
                     con=connection,
                     if_exists="append",
                     flavor='mysql',
                     index=0,
                     chunksize=5000)

    logger.info("Dados salvos no DB com sucesso")

    connection.close()