File size: 2,049 Bytes
e01549f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import requests
import pandas as pd
from datetime import datetime, timedelta

def fetch_historical_weather(lat: float, lon: float, years: int = 4) -> pd.DataFrame:
    """
    Fetch historical daily weather from Open-Meteo archive API.
    Returns a DataFrame with columns: datetime, temp, windspeed, humidity, cloudcover
    """
    end_date   = (datetime.now() - timedelta(days=6)).strftime("%Y-%m-%d")  # archive has ~5 day lag
    start_date = (datetime.now() - timedelta(days=365 * years)).strftime("%Y-%m-%d")

    url = (
        "https://archive-api.open-meteo.com/v1/archive"
        f"?latitude={lat}&longitude={lon}"
        f"&start_date={start_date}&end_date={end_date}"
        "&daily=temperature_2m_mean,wind_speed_10m_max,relative_humidity_2m_mean,cloud_cover_mean,precipitation_sum"
        "&timezone=auto"
    )

    resp = requests.get(url, timeout=20)
    resp.raise_for_status()
    daily = resp.json()["daily"]

    df = pd.DataFrame({
        "datetime":   daily["time"],
        "temp":       daily["temperature_2m_mean"],
        "windspeed":  daily["wind_speed_10m_max"],
        "humidity":   daily["relative_humidity_2m_mean"],
        "cloudcover": daily["cloud_cover_mean"],
        "precip":     daily["precipitation_sum"],
    })

    df["datetime"] = pd.to_datetime(df["datetime"])
    df = df.dropna().sort_values("datetime").reset_index(drop=True)
    return df


def fetch_recent_7days(lat: float, lon: float) -> list[float]:
    """
    Fetch last 7 days of mean temperature for lag initialization.
    Uses Open-Meteo forecast API with past_days parameter.
    """
    url = (
        "https://api.open-meteo.com/v1/forecast"
        f"?latitude={lat}&longitude={lon}"
        "&daily=temperature_2m_mean"
        "&past_days=7&forecast_days=1"
        "&timezone=auto"
    )
    resp = requests.get(url, timeout=10)
    resp.raise_for_status()
    temps = resp.json()["daily"]["temperature_2m_mean"]
    # Return last 7 values (most recent last), reversed for lag order
    return list(reversed(temps[-7:]))