Python - zajęcia 14

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"]],)