Skip to content

Instantly share code, notes, and snippets.

@royopa
Last active June 29, 2019 15:34
Show Gist options
  • Save royopa/952803f77582bd834300b7d241c567e9 to your computer and use it in GitHub Desktop.
Save royopa/952803f77582bd834300b7d241c567e9 to your computer and use it in GitHub Desktop.
dados_cvm_fundos_similaridades.py
# -*- 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