import requests
import pandas as pd
import datetime as dt
import dash
from dash import dcc, html
import plotly.graph_objs as go
csv_url = 'https://docs.google.com/spreadsheets/d/16bEpYUm1Z2FpAjQOAQi8JEC3tRvOoAJZgV005v6RuEw/gviz/tq?tqx=out:csv'
def get_df():
# Realiza la solicitud GET para descargar el CSV
response = requests.get(csv_url)
f = str(response.content)
a = f.split(r'\n')[2:]
lls = []
c = len(a)
for n,line in enumerate(a):
ll = [i[1:-1] for i in line.split(',')]
if n+1 == c:
ll[-1] = ll[-1][:-1]
lls.append(ll)
df = pd.DataFrame(lls, columns=['datetime','val','iuv'])
df = df[['datetime','iuv']]
df['iuv'] = df.iuv.astype(float)
df['datetime'] = pd.to_datetime(df.datetime, format = '%d/%m/%Y %H:%M')
return df
df = get_df()
# Cargar datos
today = dt.datetime.now()
today_date = today.date()
df['datetime'] = pd.to_datetime(df.datetime, format='%d/%m/%Y %H:%M')
df['date'] = df.datetime.dt.date
today_data = df[df.date == today_date]
# Límites y colores
lims = [0, 3, 6, 8, 11, 20]
clrs = ['green', 'yellow', 'orange', 'red', 'blueviolet']
# Crear la aplicación Dash
app = dash.Dash(__name__)
# Definir la disposición de la aplicación
app.layout = html.Div([
dcc.Graph(id='uv-graph'),
dcc.Interval(
id='interval-component',
interval=60 * 1000, # Actualiza cada 60 segundos
n_intervals=0
)
])
# Callback para generar la gráfica
@app.callback(
dash.dependencies.Output('uv-graph', 'figure'),
[dash.dependencies.Input('interval-component', 'n_intervals')]
)
def update_graph(n):
# Cargar datos cada vez que se actualiza
df = get_df()
df['datetime'] = pd.to_datetime(df.datetime, format='%d/%m/%Y %H:%M')
df['date'] = df.datetime.dt.date
today_data = df[df.date == today_date]
traces = []
# Rellenar áreas
for i in range(len(lims) - 1):
traces.append(go.Scatter(
x=[today_data['datetime'].min(), today_data['datetime'].max()],
y=[lims[i+1], lims[i+1]],
fill='tonexty',
mode='lines',
line=dict(color=clrs[i]),
name='Rango UV',
showlegend=False
))
# Gráfica del Índice Ultravioleta
traces.append(go.Scatter(
x=today_data['datetime'],
y=today_data['iuv'],
mode='lines',
name='Índice UV',
line=dict(color='black')
))
# Configuración de la gráfica
layout = go.Layout(
title=f'Índice UV Cota Cota {dt.datetime.strftime(today, "%d %b %Y")}',
xaxis=dict(
title='Hora Local',
tickformat='%H:%M',
dtick='1h',
range=[today.replace(hour=7, minute=0), today.replace(hour=18, minute=0)], # Limitar de 7 AM a 6 PM
tickvals=pd.date_range(start=today.replace(hour=7, minute = 0), end=today.replace(hour=18, minute=0), freq='h'), # Generar ticks
ticktext=[(today.replace(hour=hour, minute = 0).strftime('%H:%M')) for hour in range(7, 19)] # Formato de los ticks
),
yaxis=dict(title='Índice Ultravioleta', range=[0, 20], tickmode='linear', tick0=0, dtick=5),
showlegend=True,
hovermode='closest'
)
figure = {'data': traces, 'layout': layout}
return figure
if __name__ == '__main__':
app.run_server(debug=True)