|
1 | 1 | import datetime |
| 2 | + |
2 | 3 | import pandas as pd |
3 | 4 | import plotly.graph_objects as go |
4 | 5 | import requests |
5 | | - |
6 | | -from shiny import render, ui, reactive |
| 6 | +from shiny import reactive, render, ui |
7 | 7 | from shiny.express import input |
8 | 8 | from shinywidgets import render_widget |
9 | 9 |
|
10 | | - |
11 | 10 | ui.panel_title("Weather App") |
12 | | -ui.input_numeric("lat", |
13 | | - "Latitude", |
14 | | - value = 51.3167) |
15 | | -ui.input_numeric("lon", |
16 | | - "Longitude", |
17 | | - value = 9.5) |
| 11 | +ui.input_numeric("lat", "Latitude", value=51.3167) |
| 12 | +ui.input_numeric("lon", "Longitude", value=9.5) |
| 13 | + |
18 | 14 |
|
19 | 15 | @reactive.Calc |
20 | 16 | def weather_dat(): |
21 | | - url = f"https://api.open-meteo.com/v1/forecast?latitude=%s&longitude=%s&hourly=temperature_2m,rain&past_days=3" %(input.lat(), input.lon()) |
| 17 | + url = ( |
| 18 | + f"https://api.open-meteo.com/v1/forecast?latitude=%s&longitude=%s&hourly=temperature_2m,rain&past_days=3" |
| 19 | + % (input.lat(), input.lon()) |
| 20 | + ) |
22 | 21 | response = requests.get(url) |
23 | 22 | data = response.json()["hourly"] |
24 | 23 | df = pd.DataFrame(data) |
25 | 24 | return df |
26 | 25 |
|
| 26 | + |
27 | 27 | @render_widget |
28 | 28 | def plot(): |
29 | 29 | df = weather_dat() |
30 | 30 | fig = go.Figure() |
31 | | - fig.add_trace(go.Scatter(x=df['time'], y=df['temperature_2m'], mode='lines', name='Temperature')) |
32 | | - fig.add_trace(go.Bar(x=df['time'], y=df['rain'], name='Rain', yaxis='y2')) |
33 | | - fig.add_vline(x = datetime.datetime.today()) |
| 31 | + fig.add_trace( |
| 32 | + go.Scatter( |
| 33 | + x=df["time"], y=df["temperature_2m"], mode="lines", name="Temperature" |
| 34 | + ) |
| 35 | + ) |
| 36 | + fig.add_trace(go.Bar(x=df["time"], y=df["rain"], name="Rain", yaxis="y2")) |
| 37 | + fig.add_vline(x=datetime.datetime.today()) |
34 | 38 | fig.update_layout( |
35 | | - xaxis_title='Date', |
36 | | - yaxis_title='Temperature (°C)', |
37 | | - yaxis2=dict( |
38 | | - title='Rain (mm)', |
39 | | - overlaying='y', |
40 | | - side='right' |
41 | | - ), |
42 | | - showlegend = False |
| 39 | + xaxis_title="Date", |
| 40 | + yaxis_title="Temperature (°C)", |
| 41 | + yaxis2=dict(title="Rain (mm)", overlaying="y", side="right"), |
| 42 | + showlegend=False, |
43 | 43 | ) |
44 | 44 | return fig |
45 | 45 |
|
46 | | -@render.table(index= True) |
| 46 | + |
| 47 | +@render.table(index=True) |
47 | 48 | def table(): |
48 | 49 | df = weather_dat() |
49 | | - df['time'] = pd.to_datetime(df['time']) |
50 | | - df.set_index('time', inplace=True) |
51 | | - daily_summary = df.resample('D').agg({ |
52 | | - 'temperature_2m': ['min', 'max'], |
53 | | - 'rain': 'sum' |
54 | | - }) |
| 50 | + df["time"] = pd.to_datetime(df["time"]) |
| 51 | + df.set_index("time", inplace=True) |
| 52 | + daily_summary = df.resample("D").agg( |
| 53 | + {"temperature_2m": ["min", "max"], "rain": "sum"} |
| 54 | + ) |
55 | 55 | daily_summary = daily_summary.T |
56 | | - daily_summary.index = ['min. T (°C)', 'max. T (°C)', 'Rain (mm)'] |
57 | | - daily_summary.columns = [col.strftime('%d.%m') for col in daily_summary.columns] |
| 56 | + daily_summary.index = ["min. T (°C)", "max. T (°C)", "Rain (mm)"] |
| 57 | + daily_summary.columns = [col.strftime("%d.%m") for col in daily_summary.columns] |
58 | 58 | return daily_summary |
0 commit comments