Py.Cafe

LudCano/

iuv_plotting

Ultraviolet Index plotting app

DocsPricing
  • app.py
  • requirements.txt
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
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)