ativos / pag3.py
Lucas Vasconcelos Rocha
Add application file
4565b50
raw history blame
No virus
5.47 kB
import matplotlib
matplotlib.use('Agg')
import streamlit as st
import pandas as pd
import numpy as np
from collections import OrderedDict
import scrap as scraping
from st_aggrid import AgGrid
def flatten(d):
'''
Flatten an OrderedDict object
'''
result = OrderedDict()
for k, v in d.items():
if isinstance(v, dict):
result.update(flatten(v))
else:
result[k] = v
return result
def descobrir_ativos():
#código para ativar bootstrap css
st.markdown(
"""
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
""",unsafe_allow_html=True
)
col1, col2,col3 = st.columns([0.1,0.4,0.1])
with col2:
st.title('Analisar ativos com filtros e recomendações fundamentalistas')
st.title("")
st.subheader('Médias dos principais setores, subsetores e segmentos')
codigo_nome = pd.read_excel('data/classification_b3.xlsx')
lista = scraping.get_data()
todos = pd.DataFrame(flatten(lista).keys()).transpose()
todos.columns = todos.iloc[0]
for i in range(len(lista)):
todos = pd.concat([todos,pd.DataFrame(lista[i]).transpose()])
todos = todos.iloc[1:]
todos = todos.reset_index()
#tratamentos
todos['P/L'] = todos['P/L'].str.replace('.','')
todos['DY'] = todos['DY'].apply(lambda x: x[:-1])
todos['Cresc.5a %'] = todos['Cresc.5a'].apply(lambda x: x[:-1]).str.replace('.','').str.replace(',','.').astype(float)
todos['ROE'] = todos['ROE'].apply(lambda x: x[:-1]).str.replace('.','').str.replace(',','.').astype(float)
todos['Pat.Liq'] = todos['Pat.Liq'].str.replace('.','')
todos = todos.replace(',','.', regex=True)
todos = todos.apply(pd.to_numeric,errors='ignore')
todos.rename(columns={'cotacao': 'Cotação'}, inplace=True)
todos.rename(columns={'index': 'Código'}, inplace=True)
#criação colunas
todos['VPA'] = todos['Cotação'] / todos['P/VP']
todos['Lucro Líquido'] = (todos['ROE'] /100 ) * 1159400000
todos['Quantidade de ações'] = 1159400000 / todos['VPA']
todos['LPA'] = todos['Lucro Líquido'] / todos['Quantidade de ações']
todos['DPA'] = todos['Cotação'] * (todos['DY'] / 100)
todos['Payout'] = todos['DPA'] / todos['LPA']
todos['Expectativa de crescimento'] = (1 - todos['Payout']) * todos['ROE']
todos['Valuation Bazin'] = todos['DPA'] / 0.06
todos['Desconto Bazin'] = (todos['Valuation Bazin'] - todos['Cotação']) / todos['Valuation Bazin']
todos['Valuation Graham'] = (22.5 * todos['LPA'] * todos['VPA']) ** 0.5
todos['Desconto Graham'] = (todos['Valuation Graham'] - todos['Cotação']) / todos['Valuation Graham']
todos = todos.fillna(0)
merged = pd.merge(todos,codigo_nome,on='Código', how="left")
merged.replace([np.inf, -np.inf], 0, inplace=True)
#group
col1, col2, col3 = st.columns([1,1,1])
with col1:
grouped_setor = merged.groupby('Setor').mean()
st.dataframe(grouped_setor[['Expectativa de crescimento','Desconto Graham', 'Desconto Bazin']].sort_values('Expectativa de crescimento', ascending=False).reset_index())
with col2:
grouped_subsetor = merged.groupby('Subsetor').mean()
st.dataframe(grouped_subsetor[['Expectativa de crescimento','Desconto Graham', 'Desconto Bazin']].sort_values('Expectativa de crescimento', ascending=False).reset_index())
with col3:
grouped_subsetor = merged.groupby('Segmento').mean()
st.dataframe(grouped_subsetor[['Expectativa de crescimento','Desconto Graham', 'Desconto Bazin']].sort_values('Expectativa de crescimento', ascending=False).reset_index())
#filter
col1, col2,col3 = st.columns([0.1,0.4,0.1])
st.title('')
with col2:
st.write('Aplique alguns filtros na tabela')
exp_min = float(st.number_input(label='Expectativa de crescimento >',value=10,step=5))
desc_bazin = int(st.number_input(label='Desconto Bazin >',value=0.3,step=0.1))
desc_graham = float(st.number_input(label='Desconto Graham >',value=0.3,step=0.1))
filtred = merged.loc[(merged['Expectativa de crescimento']>= exp_min) & (merged['Desconto Bazin']>= desc_bazin) & (merged['Desconto Graham']>= desc_graham) & (merged['Desconto Bazin']!= 0)& (merged['Desconto Graham']!= 0)]
filtred = filtred.sort_values('Expectativa de crescimento',ascending=False)
#st.dataframe(merged[['Código','Cotação', 'Pat.Liq', 'Expectativa de crescimento','Desconto Bazin', 'Desconto Graham','Nome', 'Setor','Subsetor', 'Segmento']])
AgGrid(filtred[['Código','Cotação', 'Lucro Líquido', 'Expectativa de crescimento','Desconto Bazin', 'Desconto Graham','Nome', 'Setor','Subsetor', 'Segmento']].round(2))