Last active
June 29, 2019 15:34
-
-
Save royopa/952803f77582bd834300b7d241c567e9 to your computer and use it in GitHub Desktop.
dados_cvm_fundos_similaridades.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import pandas as pd | |
from datetime import date | |
from datetime import timedelta | |
def get_df_extrato(): | |
# pega o arquivo do último ano disponível no site da CVM | |
today = date.today() | |
current_year = today.strftime('%Y') | |
df = pd.DataFrame() | |
for year in range(int(current_year), int(current_year)-5, -1): | |
base_url = 'http://dados.cvm.gov.br' | |
url = '{}/dados/FI/DOC/EXTRATO/DADOS/extrato_fi_{}.csv'.format(base_url, str(year)) | |
# lê o csv da página da CVM | |
df1 = pd.read_csv(url, sep=';', encoding='latin1') | |
df = pd.concat([df, df1]) | |
# transforma o campo CO_PRD | |
df['CO_PRD'] = df['CNPJ_FUNDO'].str.replace('.','') | |
df['CO_PRD'] = df['CO_PRD'].str.replace('/','') | |
df['CO_PRD'] = df['CO_PRD'].str.replace('-','') | |
df['CO_PRD'] = df['CO_PRD'].str.zfill(14) | |
df['DT_COMPTC'] = pd.to_datetime(df['DT_COMPTC'], errors='coerce').dt.strftime('%Y-%m-%d') | |
df['DT_REF'] = df['DT_COMPTC'] | |
#df.columns.values | |
print(len(df), 'df_extrato_antes') | |
# faz a limpeza no data frame para manter apenas o registro mais atualizado | |
df = df.sort_values(by=['CO_PRD', 'DT_REF']) | |
df = df.drop_duplicates(subset=['CO_PRD'], keep='last') | |
print(len(df), 'df_extrato_filtrado') | |
return df[ | |
['DT_REF', 'CNPJ_FUNDO', 'CO_PRD', 'DENOM_SOCIAL', 'CLASSE_ANBIMA', 'POLIT_INVEST', 'PUBLICO_ALVO'] | |
] | |
def get_df_cadastro(): | |
# pega o arquivo do último ano disponível no site da CVM | |
today = date.today() | |
current_year = today.strftime('%Y') | |
# Dados cadastrais do fundo | |
yesterday = today - timedelta(days=1) | |
base_url = 'http://dados.cvm.gov.br' | |
url = '{}/dados/FI/CAD/DADOS/inf_cadastral_fi_{}.csv'.format(base_url, yesterday.strftime('%Y%m%d')) | |
df = pd.read_csv( | |
url, | |
sep=';', | |
encoding='latin1' | |
) | |
# fundos ativos df['SIT'] | |
#EM FUNCIONAMENTO NORMAL ou FASE PRÉ-OPERACIONAL | |
# transforma o campo CO_PRD | |
df['CO_PRD'] = df['CNPJ_FUNDO'].str.replace('.','') | |
df['CO_PRD'] = df['CO_PRD'].str.replace('/','') | |
df['CO_PRD'] = df['CO_PRD'].str.replace('-','') | |
df['CO_PRD'] = df['CO_PRD'].str.zfill(14) | |
df['DT_REG'] = pd.to_datetime(df['DT_REG'], errors='coerce').dt.strftime('%Y-%m-%d') | |
df['DT_CONST'] = pd.to_datetime(df['DT_CONST'], errors='coerce').dt.strftime('%Y-%m-%d') | |
df['DT_CANCEL'] = pd.to_datetime(df['DT_CANCEL'], errors='coerce').dt.strftime('%Y-%m-%d') | |
df['DT_INI_SIT'] = pd.to_datetime(df['DT_INI_SIT'], errors='coerce').dt.strftime('%Y-%m-%d') | |
df['DT_INI_ATIV'] = pd.to_datetime(df['DT_INI_ATIV'], errors='coerce').dt.strftime('%Y-%m-%d') | |
print(len(df), 'df_cadastro_antes') | |
#remove duplicados se tiver | |
#df = df.drop_duplicates(subset=['CO_PRD'], keep='last') | |
df = df.drop_duplicates(subset=['CO_PRD'], keep='last') | |
print(len(df), 'df_cadastro_filtrado') | |
return df | |
# baixa e junta os dados de cadastro e extratos de fundos da CVM | |
df_extrato = get_df_cadastro() | |
df_cadastro = get_df_extrato() | |
# faz o JOIN entre o df_detalhe e o cadastro do fundo | |
df_detalhe = pd.merge(df_extrato, df_cadastro, how='inner', on = 'CO_PRD') | |
print(len(df_detalhe)) | |
''' | |
Parágrafo único. Caso não haja informações suficientes, tal como histórico | |
disponível, deve-se utilizar, minimamente, a análise de similaridade e | |
justificar os prazos analisados por: | |
Nome; df['DENOM_SOCIAL'] | |
CNPJ; df['CO_PRD'] | |
I. Tipo de Fundo; df['CLASSE_ANBIMA'] | |
II. Política de investimento; df['POLIT_INVEST'] | |
III. Regras de movimentação; df['APLIC_MIN'] | |
IV. Público-alvo. df['PUBLICO_ALVO'] | |
''' | |
# filtra novamente as informações do dataframe | |
df_detalhe = df_detalhe[[ | |
'DT_REF', | |
'CO_PRD', | |
'DENOM_SOCIAL_x', | |
'CLASSE_ANBIMA', | |
'POLIT_INVEST', | |
'PUBLICO_ALVO', | |
'SIT', | |
'DT_INI_ATIV', | |
'RENTAB_FUNDO', | |
'CONDOM', | |
'FUNDO_COTAS', | |
'FUNDO_EXCLUSIVO', | |
'TRIB_LPRAZO', | |
'INVEST_QUALIF', | |
'ADMIN', | |
'GESTOR' | |
]] | |
df_detalhe.rename(index=str, columns={"DENOM_SOCIAL_x": "DENOM_SOCIAL"}, inplace=True) | |
# seta o index com o CO_PRD | |
#df_detalhe.set_index(['CO_PRD'], drop=True, append=False, inplace=True, verify_integrity=True) | |
# sorteia os dados de acordo com as informações da ANBIMA | |
''' | |
df_detalhe = df_detalhe.sort_values(by= | |
[ | |
'CLASSE_ANBIMA', | |
'POLIT_INVEST', | |
'PUBLICO_ALVO', | |
'FUNDO_COTAS', | |
'FUNDO_EXCLUSIVO', | |
'INVEST_QUALIF' | |
] | |
) | |
''' | |
# essa é uma tabela simplificada que sera usada para ver os fundos semelhantes | |
# gera e faz o download de um excel de saída | |
df_detalhe.to_excel('df_fundos_cvm_cadastro_simples.xls') | |
print(len(df_detalhe), 'registros processados', 'xls saída salvo com sucesso') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment