-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
145 lines (123 loc) · 3.69 KB
/
app.py
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
"""
Análise Econômica Dashboard
@author: Rafael Gonçalves
"""
import pandas_datareader.data as pdrd
import plotly.graph_objects as go
import streamlit as st
import yfinance as yf
yf.pdr_override()
# Configurações da página
st.set_page_config(page_title="Análise Econômica App", page_icon="📈", layout="centered")
# Sidebar - seleção
st.sidebar.title("Menu")
# Lista das empresas - ticket B3
Empresas = [
"ITSA4",
"ENBR3",
"EZTC3",
"ITUB4",
"STBP3",
"ENAT3",
"ALUP4",
"BBAS3",
"TRPL4",
"SAPR11",
"RENT3",
"DIRR3",
"LREN3",
"KLBN11",
"WIZS3",
"CPLE3",
"RADL3",
"TAEE11",
"CMIG4",
"PRIO3",
"CXSE3",
"AESB3",
"EGIE3",
]
Empresas.sort()
Selecao = st.sidebar.selectbox("Selecione a empresa:", Empresas, format_func=lambda x: x + ".SA")
# Range de seleção de meses
slider = st.sidebar.slider("Período de meses", 0, 12, 1, key="Barra_Selecao")
selecao_range = str(slider) + "mo"
# Colunas
col1, col2 = st.columns([3, 0.2])
# Imagens
col2.image(f"https://www.ivalor.com.br/media/emp/logos/{Selecao[0:4]}.png", width=108)
# Titulo
titulo = f"Análise Econômica { str(Selecao) }"
col1.title(titulo)
try:
# Coletar da API do Yahoo Finance
dados = pdrd.get_data_yahoo(Selecao + ".SA", period=selecao_range)
if dados.empty:
st.error(
"Não foi possivel obter dados para " + Selecao + ".SA. Por favor, tente outra ação."
)
raise Exception
except:
raise Exception
else:
# Filtrando dados sem informação
filtroIndex = dados.loc[(dados["Open"] == 0) & (dados["Low"] == 0)].index
if not filtroIndex.empty:
dados.drop(filtroIndex, inplace=True)
# Grafico
grafico_candlestick = go.Figure(
data=[
go.Candlestick(
x=dados.index,
open=dados["Open"],
high=dados["High"],
low=dados["Low"],
close=dados["Close"],
)
]
)
grafico_candlestick.update_layout(
xaxis_rangeslider_visible=False,
title="Análise das Ações",
xaxis_title="Período",
yaxis_title="Preço de Fechamento",
)
# Mostrar o gráfico do plotly no streamlit
st.plotly_chart(grafico_candlestick)
# Mostrar dados do gráfico em tabela
if st.checkbox("Mostrar dados em tabela"):
st.subheader("Tabela de registro")
# Ordenação por data mais recente
dados = dados.sort_index(ascending=False)
dados.index = dados.index.strftime("%d-%m-%Y")
dados.index.name = "Data"
styler = (
dados.reset_index()
.style.hide()
.format(
subset=["Open", "High", "Low", "Close", "Adj Close"],
decimal=",",
precision=2,
)
.format(subset=["Volume"], formatter="{:,}", thousands=".")
)
st.write(styler.to_html(), unsafe_allow_html=True)
# Salvando os dados em CSV
st.markdown("<br />", unsafe_allow_html=True)
csv = dados.to_csv().encode("utf-8")
st.download_button(
"Download CSV file",
data=csv,
file_name=f"registro_acao_{Selecao}_em_{slider}m.csv",
mime="text/csv",
)
# Estilizando a tabela por meio de hack com st.markdown
styler_table = """
<style>
.css-1offfwp th, .css-1offfwp td { padding: 0.4rem 1.5rem; border : 0 }
td, th { text-align: -webkit-center; }
h1 { padding: 1rem 0px 0.75rem; }
div.css-ocqkz7 { -webkit-box-align: center; align-items: baseline; }
</style>
"""
st.markdown(styler_table, unsafe_allow_html=True)