Spaces:
Running
Running
File size: 5,470 Bytes
4565b50 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
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))
|