PortalLVAM / apps /Home.py
bullm's picture
ldsakjl
025632f
raw
history blame
14.2 kB
import pandas as pd
from datetime import date
from plotly import graph_objs as go
import pybase64 as base64
import numpy as np
import investpy
import streamlit as st
import datetime as dt
import io
def get_table_excel_link(df, selected_stocks):
towrite = io.BytesIO()
downloaded_file = df.to_excel(towrite, encoding='utf-8', index=False,
header=True)
towrite.seek(0) # reset pointer
file_name = 'Data'+ selected_stocks + '.xlsx'
style = 'style="color:black;text-decoration: none; font-size:18px;"'
name_mark = "Descargar " + selected_stocks + ".xlsx"
b64 = base64.b64encode(towrite.read()).decode() # some strings
linko= f'<center><a href="data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{b64}" '+style+'download="'+file_name+'"><button>'+name_mark+'</button></a></center>'
return linko
@st.cache
def tabla_commodity(stocks, TODAY):
tabla = pd.DataFrame()
year_ago = date.today() - dt.timedelta(days=365)
year_ago = year_ago.strftime("%d/%m/%Y")
for stock in stocks:
precios = investpy.commodities.get_commodity_historical_data(
commodity=stock,
from_date=year_ago,
to_date=TODAY)
precios = precios["Close"]
last_price = precios.iloc[-1]
oned = precios.iloc[-2]
onew = precios.iloc[-7]
onem = precios.iloc[-30]
oney = precios.iloc[0]
return1m = str(round((last_price/onem-1)*100, 2))+"%"
return1d = str(round((last_price/oned-1)*100, 2))+"%"
return1w = str(round((last_price/onew-1)*100, 2))+"%"
return1y = str(round((last_price/oney-1)*100, 2))+"%"
tabla = tabla.append([[return1d, return1w, return1m, return1y]])
tabla.columns = ["1d", "1w", "1m", "1y"]
tabla.index = stocks
return tabla
@st.cache
def tabla_indices(index, countries, TODAY):
tabla = pd.DataFrame()
year_ago = date.today() - dt.timedelta(days=365)
year_ago = year_ago.strftime("%d/%m/%Y")
for i in range(len(index)):
precios = investpy.get_index_historical_data(index=index[i],
country=countries[i],
from_date=year_ago,
to_date=TODAY)
precios = precios["Close"]
last_price = precios.iloc[-1]
oned = precios.iloc[-2]
onew = precios.iloc[-7]
onem = precios.iloc[-30]
oney = precios.iloc[0]
return1m = str(round((last_price/onem-1)*100, 2))+"%"
return1d = str(round((last_price/oned-1)*100, 2))+"%"
return1w = str(round((last_price/onew-1)*100, 2))+"%"
return1y = str(round((last_price/oney-1)*100, 2))+"%"
tabla = tabla.append([[return1d, return1w, return1m, return1y]])
tabla.columns = ["1d", "1w", "1m", "1y"]
tabla.index = index
return tabla
@st.cache
def tabla_bonos(stocks, TODAY):
tabla = pd.DataFrame()
year_ago = date.today() - dt.timedelta(days=365)
year_ago = year_ago.strftime("%d/%m/%Y")
for stock in stocks:
precios = investpy.get_bond_historical_data(bond=stock,
from_date=year_ago,
to_date=TODAY)
precios = precios["Close"]
last_price = precios.iloc[-1]
oned = precios.iloc[-2]
onew = precios.iloc[-7]
onem = precios.iloc[-30]
oney = precios.iloc[0]
return1m = str(round((last_price-onem)*100, 2))+"%"
return1d = str(round((last_price -oned)*100, 2))+"%"
return1w = str(round((last_price -onew)*100, 2))+"%"
return1y = str(round((last_price - oney)*100, 2))+"%"
tabla = tabla.append([[return1d, return1w, return1m, return1y]])
tabla.columns = ["1d", "1w", "1m", "1y"]
tabla.index = stocks
return tabla
def highlight_max(s):
if s.dtype == np.object:
is_neg = [False for _ in range(s.shape[0])]
else:
is_neg = s < 0
return ['color: red;' if cell else 'color:black' for cell in is_neg]
def button_style():
style_button = """
<style>
button {
display: inline-block;
background-color: #e8e8e8;
border-radius: 15px;
border: 4px #cccccc;
color: #4a4a4a;
text-align: center;
font-size: 12px;
padding: 2px;
width: 250px;
transition: all 0.5s;
cursor: pointer;
margin: 5px;
}
button span {
cursor: pointer;
display: inline-block;
position: relative;
transition: 0.5s;
}
button span:after {
content: '\00bb';
position: absolute;
opacity: 0;
top: 0;
right: -20px;
transition: 0.5s;
}
button:hover {
background-color: #bb1114;
color:#e8e8e8;
}
button:hover span {
padding-right: 25px;
}
button:hover span:after {
opacity: 1;
right: 0;
}
.stMarkdown{
margin-bottom:0px;}
</style>
"""
st.markdown(style_button, unsafe_allow_html=True)
def style_table():
# tr:hover {background-color: #E8E8E8;
# color:#BB1114;}
style_table = """
<style>
tr { line-height: 5px; }
thead {
background-color:#BB1114 ;
color: #E8E8E8;
}
tbody tr:nth-child(odd) {
background-color: #fff;
}
tbody tr:nth-child(even) {
background-color: #eee;
}
.css-1rcck9u{
padding:0.25rem;}
tbody tr:nth-child(odd)
stTable {
border-collapse: collapse;
background-color:red;
margin: 25px 0;
font-size: 0.9em;
min-width: 400px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
}
table{
margin-top:0px;
font-size:9px;
padding:0px;
height:200px;}
.st-cc, .st-cb{
padding-top:5px;
padding-bottom:5px;}
h3, h1, h2, .svg-container {
animation-duration: 3s;
animation-name: slidein;
}
@keyframes slidein {
from {
margin-left: 100%;
width: 300%
}
to {
margin-left: 0%;
width: 100%;
}
}
</style>
"""
st.markdown(style_table, unsafe_allow_html=True)
def seleccionar_fecha(fecha_select):
if fecha_select == "1 week":
fec_in = date.today() - dt.timedelta(days=7)
elif fecha_select == "1 month":
fec_in = date.today() - dt.timedelta(days=30)
elif fecha_select == "3 month":
fec_in = date.today() - dt.timedelta(days=90)
elif fecha_select == "6 month":
fec_in = date.today() - dt.timedelta(days=180)
elif fecha_select == "1 year":
fec_in = date.today() - dt.timedelta(days=365)
elif fecha_select == "5 year":
fec_in = date.today() - dt.timedelta(days=365*5)
fec_in = fec_in.strftime("%d/%m/%Y")
return fec_in
def stock_price():
style_table()
button_style()
TODAY = date.today().strftime("%d/%m/%Y")
YDAY = date.today() - dt.timedelta(days=1)
YDAY = YDAY.strftime("%d/%m/%Y")
commodity = ["Copper", "Silver", "Gold", "Platinum", 'Brent Oil',
'Heating Oil']
# bonos = ["Brazil 10Y", "Mexico 10Y" , "Chile 10Y", "Colombia 10Y"
# , "Peru 10Y"]
bonds10y = ["Brazil 10Y", "Mexico 10Y", "Chile 10Y", "Colombia 10Y",
"Peru 10Y", "China 10Y"]
index = ["S&P CLX IPSA", "S&P Merval", "Bovespa", "S&P 500"]
countries = ["chile", "argentina", "brazil", "united states"]
col1, col2, col3 = st.beta_columns(3)
cols = st.beta_columns((3, 2, 3, 2, 3, 2))
col1.markdown('<center><h1 style="font-size:22px;">Principales bonos 10Y</h1><center>', unsafe_allow_html=True)
col2.markdown('<center><h1 style="font-size:22px;">Principales commodities</h1><center>', unsafe_allow_html=True)
col3.markdown('<center><h1 style="font-size:22px;">Principales indices</h1><center>', unsafe_allow_html=True)
selected_com = cols[2].selectbox(" ", commodity)
selected_index = cols[4].selectbox(" ", index)
selected_bonds = cols[0].selectbox(" ", bonds10y)
fecha_select = cols[3].selectbox(" ", ["1 year", "6 month", "3 month",
"1 month", "1 week"])
fecha_select2 = cols[5].selectbox(" ", ["1 year", "6 month", "3 month",
"1 month", "1 week"])
fecha_select3 = cols[1].selectbox(" ", ["1 year", "6 month", "3 month",
"1 month", "1 week"])
# fecha_select =cols[2].button("hola")
fec_in = seleccionar_fecha(fecha_select)
fec_in2 = seleccionar_fecha(fecha_select2)
fec_in3 = seleccionar_fecha(fecha_select3)
selected_country = countries[index.index(selected_index)]
data_bonds = investpy.get_bond_historical_data(bond=selected_bonds,
from_date=fec_in3,
to_date=TODAY)
data_com = investpy.commodities.get_commodity_historical_data(
commodity=selected_com,
from_date=fec_in,
to_date=TODAY)
data_index = investpy.get_index_historical_data(index=selected_index,
country=selected_country,
from_date=fec_in2,
to_date=TODAY)
def plot_raw_data(col, data, color, prefijo):
fig = go.Figure()
close_ = go.Scatter(x=data.index, y=data['Close'], name="stock_close",
line=dict(color=color), fill='tonexty')
fig.add_trace(close_)
fig.layout.update(title_text="", xaxis_rangeslider_visible=True,
width=300, height=200, margin_b=0, margin_t=0,
margin_r=0, margin_l=0)
fig.update_yaxes(range=[min(data['Close'])/1.05,
max(data['Close'])*1.05], tickprefix=prefijo)
col.plotly_chart(fig)
plot_raw_data(cols[0], data_bonds, 'seagreen', "")
plot_raw_data(cols[2], data_com, 'midnightblue', "$")
plot_raw_data(cols[4], data_index, 'dimgrey', "$")
col1, col2, col3 = st.beta_columns(3)
cols = st.beta_columns((3, 2, 3, 2, 3, 2))
last_price = data_bonds.iloc[-1]["Close"]
first_price = data_bonds.iloc[0]["Close"]
returns = round((last_price/first_price-1)*100, 2)
cols[0].markdown('<h4 style="font-size:12px; padding-left:15px; margin-bottom:0px;">'+"Precio"+"</h4>", unsafe_allow_html=True)
cols[0].markdown('<p style="font-size:25px; padding-left:30px;">'+"{:,}".format(last_price)+"%</p>", unsafe_allow_html=True)
if returns > 0:
cols[1].markdown('<p style="font-size:20px; padding-top:22px; color:green;">▲ '+str(returns)+" %</p>", unsafe_allow_html=True)
else:
cols[1].markdown('<p style="font-size:20px; padding-top:22px; color:red;">▼ '+str(returns)+" %</p>", unsafe_allow_html=True)
last_price2 = data_com.iloc[-1]["Close"]
first_price2 = data_com.iloc[0]["Close"]
returns2 = round((last_price2/first_price2-1)*100, 2)
cols[2].markdown('<h4 style="font-size:12px; padding-left:15px; margin-bottom:0px;">'+"Precio"+"</h4>", unsafe_allow_html=True)
cols[2].markdown('<p style="font-size:25px; padding-left:30px;">$'+"{:,}".format(last_price2)+"</p>", unsafe_allow_html=True)
if returns2 > 0:
cols[3].markdown('<p style="font-size:20px; padding-top:22px; color:green;">▲ '+str(returns2)+" %</p>", unsafe_allow_html=True)
else:
cols[3].markdown('<p style="font-size:20px; padding-top:22px; color:red;">▼ '+str(returns2)+" %</p>", unsafe_allow_html=True)
last_price3 = data_index.iloc[-1]["Close"]
first_price3 = data_index.iloc[0]["Close"]
returns3 = round((last_price3/first_price3-1)*100, 2)
cols[4].markdown('<h4 style="font-size:12px; padding-left:15px; margin-bottom:0px;">'+"Precio"+"</h4>", unsafe_allow_html=True)
cols[4].markdown('<p style="font-size:25px; padding-left:30px;">$'+"{:,}".format(last_price3)+"</p>", unsafe_allow_html=True)
if returns3 > 0:
cols[5].markdown('<p style="font-size:20px; padding-top:22px; color:green;">▲ '+str(returns3)+" %</p>", unsafe_allow_html=True)
else:
cols[5].markdown('<p style="font-size:20px; padding-top:22px; color:red;">▼ '+str(returns3)+" %</p>", unsafe_allow_html=True)
col1, col2, col3 = st.beta_columns(3)
col1.table(tabla_bonos(bonds10y, TODAY))
col2.table(tabla_commodity(commodity, TODAY))
col3.table(tabla_indices(index, countries, TODAY))
col1, col2, col3 = st.beta_columns(3)
col2.markdown(get_table_excel_link(data_com, selected_com),
unsafe_allow_html=True)
col3.markdown(get_table_excel_link(data_index, selected_index),
unsafe_allow_html=True)
col1.markdown(get_table_excel_link(data_bonds, selected_bonds),
unsafe_allow_html=True)
get_table_excel_link