Python - zajęcia 14
- Przypomnienie zagadnień sieciowych
- Aplikacja pogodowa w Streamlit
Notatki:
The AI workspace that works for you. | Notion
A tool that connects everyday work into one space. It gives you and your teams AI tools—search, writing, note-taking—inside an all-in-one, flexible workspace.




W aplikacji wykorzystujemy biblioteki:
- folium,streamlit_folium -> do mapy
- request -> do pobrania danych z API
- pandas -> do obrotu danymi z API
- datetime -> do formatowania dat
Kod:
import requests
import pandas as pd
import streamlit as st
import folium # --> mapa
from streamlit_folium import st_folium # --> mapa
from datetime import datetime # --> formatowanie daty
st.set_page_config(layout="wide")
# ============= f- cja do pobierania danych pogodowych ==================
def pobierz_pogode(lat: str, lon: str) -> dict:
url = "https://api.open-meteo.com/v1/forecast"
querystring = {
"latitude": latitude,
"longitude": longitude,
"daily": ["sunrise", "sunset"],
"past_days": "0",
"timezone": "Europe/Berlin",
"forecast_days": 3,
"hourly": "temperature_2m,relative_humidity_2m,wind_speed_10m",
}
response = requests.get(url, params=querystring)
return response.json()
# ============= Wyświetlanie mapy =============
m = folium.Map(location=[51.12247540898693, 17.0289158821106], zoom_start=10)
folium.Marker(
location=[51.12247540898693, 17.0289158821106],
tooltip="Bazowa loklizacja",
icon=folium.Icon(color="red", icon="home")
).add_to(m)
k1, k2 = st.columns([2, 1])
with k1:
# call to render Folium map in Streamlit
mapka = st_folium(m, width=1200, use_container_width=True)
# ============= Wyświetlanie danych wybranej lokalizacji =============
if not mapka.get("last_clicked"):
st.write("Wybierz na mapie lokalizację.")
else:
latitude = mapka["last_clicked"]["lat"]
longitude = mapka["last_clicked"]["lng"] # <-- Pobranie współrzędnych
pogoda = pobierz_pogode(f"{latitude:02f}", f"{longitude:02f}")
pogoda_df = pd.DataFrame(pogoda["hourly"])
jednostki = pogoda["hourly_units"]
with k2:
# Współrzędne:
st.write("#### Współrzędne")
st.write(f"latitude: <h style='color:orange;'>**{latitude:02f}**</h>",
unsafe_allow_html=True)
st.write(f"longitude: <h style='color:orange;'>**{longitude:02f}**</h>",
unsafe_allow_html=True)
# Podsumowanie:
# Temp max
# dodaje dni do dataframe i obliczam temp_max tworząc nowe df:
pogoda_df["dzien"] = pd.to_datetime(
# w ten sposób dodałam do Data frame nową kolumnę obliczoną na podstawie innej kolumny już istniejące w df
pogoda_df["time"]).dt.date
pogoda_df["czas"] = pd.to_datetime(
# dodaje kolumnę z formatowaną datą
pogoda_df["time"]).dt.strftime("%d-%m %H:%M")
pogoda_df["data_godzina"] = pd.to_datetime(
# dodaje kolumnę z formatowaną pełną datą
pogoda_df["time"]).dt.strftime("%d-%m-%y %H:%M")
max_temp_dziennie = pogoda_df.groupby(
"dzien")["temperature_2m"].max().reset_index()
# Wschody i zachody
wschody_df = pd.DataFrame(pogoda["daily"])
for _, wiersz in wschody_df.iterrows():
st.write(
f"###### **{pd.to_datetime(wiersz['time']).strftime('%A, %d %B %Y')}**")
# warunkowo wyszukuję (loc) temp z wybranego dnia, w pętli
# rzutuję tekst na datę i porównuję
st.write(f"##### 🌡️ {max_temp_dziennie.loc[max_temp_dziennie["dzien"] == pd.to_datetime(
wiersz["time"]).date(), "temperature_2m"].iloc[0]}°C ↑☀️ {pd.to_datetime(wiersz["sunrise"]).strftime("%H:%M")} ↓☀️ {pd.to_datetime(wiersz["sunset"]).strftime("%H:%M")}")
# Szczegółowe dane pogodowe: wykresy i tabela
with st.expander("## Szczegółowe dane"):
st.write("#### Temperatura")
st.line_chart(pogoda_df[["czas", "temperature_2m"]],
x="czas", y="temperature_2m")
st.write("#### Wilgotność")
st.line_chart(pogoda_df[["czas", "relative_humidity_2m"]],
x="czas", y="relative_humidity_2m")
st.write("#### Wiatr")
st.line_chart(pogoda_df[["czas", "wind_speed_10m"]],
x="czas", y="wind_speed_10m")
st.write("#### Jednostki")
st.write("")
for keys, var in jednostki.items():
st.write(f"{keys}: <h style='color:orange;'>**{var}**</h>",
unsafe_allow_html=True)
st.write("#### Dane pogodowe")
st.dataframe(hide_index=True,
data=pogoda_df[["data_godzina", "temperature_2m", "relative_humidity_2m", "wind_speed_10m"]],)
