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(
"""
""",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))