Skip to content

Instantly share code, notes, and snippets.

@p-freire
Created March 9, 2020 11:28
Show Gist options
  • Save p-freire/845b56e9f37d0b36e811be58fecb22bf to your computer and use it in GitHub Desktop.
Save p-freire/845b56e9f37d0b36e811be58fecb22bf to your computer and use it in GitHub Desktop.
#-------------------------------------------------------------------------------------------------------
# Código feito para consolidar as informações dos extratos da Easynvest
# Para rodar o script:
# 1) Baixe todos os extratos pelo site da Easynvest.
# A corretora permite pegar janelas temporais de até 90 dias, então
# serão 4 ou 5 arquivos a serem baixados, no máximo
# 2) Rode o script na pasta.
# 3) Verifique a saída na pasta "output". Lá dentro terão arquivos de dividendos/rendimentos e JSCP.
#
# Autor: Paulo Freire
# Data: 2020-03-08
#-------------------------------------------------------------------------------------------------------
import pandas as pd
import os
import fnmatch
import re
import numpy as np
# Pega os arquivos dos extratos
files = []
for file in sorted(os.listdir(os.getcwd())):
if file.endswith(".csv"):
files.append(file)
# Cria a pasta output
if not os.path.isdir(os.getcwd() + "/output"):
os.mkdir(os.getcwd() + "/output")
dfs = [pd.read_csv(file, sep = ";", encoding = "latin-1", header = 1) for file in files]
df = pd.concat(dfs)
# Pega colunas com dividendos, juros sobre capital própio e rendimentos
filter_div = np.array([fnmatch.fnmatch(x, "*DIVIDENDOS*") for x in df["Histórico"]])
filter_rend = np.array([fnmatch.fnmatch(x, "*RENDIMENTO*") for x in df["Histórico"]])
filter_jscp = np.array([fnmatch.fnmatch(x, "*CAPITAL PRÓPRIO*") for x in df["Histórico"]])
# Filtra primeiros os proventos isentos: dividendos e rendimentos
filter_proventos = filter_div | filter_rend
df_proventos = df.loc[filter_proventos].copy()
df_proventos["Lançamento"] = df_proventos["Lançamento"].apply(lambda x: x.replace(",", ".")).astype(float)
print("Trabalhando nos dividendos e rendimentos...")
# Encontra o ticker no meio da string
pattern = "([A-Z]{4})([0-9]{1,2})"
df_proventos["Empresa"] = [re.search(pattern, x).group() for x in df_proventos["Histórico"]]
# Agrupa
df_proventos.groupby("Empresa")["Lançamento"].sum().reset_index().to_csv("output/dividendos_rendimentos.csv", index = False, encoding = "utf-8-sig")
# Filtra, agora, o JSCP
df_jscp = df.loc[filter_jscp].copy()
# Acha o trecho relacionado à ação. O código aqui é da ISIN, então faremos um processamento extra
print("Trabalhando no JSCP...")
pattern = "BR[A-Z]{4,15}"
df_jscp["Empresa"] = [re.search(pattern, x).group().lstrip("BR") for x in df_jscp["Histórico"]]
df_jscp["Lançamento"] = df_jscp["Lançamento"].apply(lambda x: x.replace(",", ".")).astype(float)
# Função para lidar com o ISIN e identificar o que é ação ordinária, preferencial e unit
def func_nomes(data):
if fnmatch.fnmatch(data, "*ACNOR*"):
return data[0:4] + " Ordiária"
elif fnmatch.fnmatch(data, "*ACNPR*"):
return data[0:4] + " Preferencial"
elif fnmatch.fnmatch(data, "*CDAM*"):
return data[0:4] + " Unit"
df_jscp["Empresa"] = df_jscp["Empresa"].transform(func_nomes)
# Por fim, agrupa e salva o JSCP em arquivo
df_jscp.groupby("Empresa")["Lançamento"].sum().reset_index().to_csv("output/jscp.csv", index = False, encoding = "utf-8-sig")
print("Fim do programa. Verifique a saída na pasta output.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment