Created
March 9, 2020 11:28
-
-
Save p-freire/845b56e9f37d0b36e811be58fecb22bf to your computer and use it in GitHub Desktop.
This file contains hidden or 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
#------------------------------------------------------------------------------------------------------- | |
# 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