File size: 3,722 Bytes
03df0fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import openmeteo_requests
import requests_cache
import pandas as pd
from retry_requests import retry


# Setup the Open-Meteo API client with cache and retry on error
cache_session = requests_cache.CachedSession('.cache', expire_after=3600)
retry_session = retry(cache_session, retries=5, backoff_factor=0.2)
openmeteo = openmeteo_requests.Client(session=retry_session)


def get_info_meteo(latitude, longitude):
    """Function that creates a Json file containing the weather data of the location
    ARGS: 
        latitude (Float) : latitude coordinate
        longitude (Float): longitude coordinate

    """

    url = "https://api.open-meteo.com/v1/forecast"
    params = {
        "latitude": latitude,
        "longitude": longitude,
        "hourly": {"relative_humidity_2m", "soil_temperature_0cm", "soil_moisture_0_to_1cm"},
        "daily": {"temperature_2m_max", "precipitation_sum", "wind_speed_10m_max", "sunshine_duration"},
        "past_days": 30,
        "forecast_days": 7

    }

    responses = openmeteo.weather_api(url, params=params)
    response = responses[0]

    # Hourly dataframe
    hourly = response.Hourly()
    hourly_relative_humidity_2m = hourly.Variables(0).ValuesAsNumpy()
    hourly_soil_temperature_0cm = hourly.Variables(1).ValuesAsNumpy()
    hourly_soil_moisture_0_to_1cm = hourly.Variables(2).ValuesAsNumpy()

    hourly_data = {"date": pd.date_range(
        start=pd.to_datetime(hourly.Time(), unit="s", utc=True),
        end=pd.to_datetime(hourly.TimeEnd(), unit="s", utc=True),
        freq=pd.Timedelta(seconds=hourly.Interval()),
        inclusive="left"
    )}

    hourly_data["relative_humidity_2m_%"] = hourly_relative_humidity_2m
    hourly_data["soil_temperature_0cm_C"] = hourly_soil_temperature_0cm
    hourly_data["soil_moisture_0_to_1cm_m³"] = hourly_soil_moisture_0_to_1cm

    hourly_dataframe = pd.DataFrame(data=hourly_data)

    # Average hourly data per day
    hourly_dataframe['day_date'] = hourly_dataframe['date'].dt.strftime(
        '%Y-%m-%d')

    tmp = hourly_dataframe.groupby('day_date')[
        ['relative_humidity_2m_%', 'soil_temperature_0cm_C', 'soil_moisture_0_to_1cm_m³']].mean()

    avg_hourly_dataframe = tmp.rename(columns={'relative_humidity_2m_%': 'avg_hourly_relative_humidity_2m_%',
                                      'soil_temperature_0cm_C': 'avg_hourly_soil_temperature_0cm_C', 'soil_moisture_0_to_1cm_m³': 'avg_hourly_soil_moisture_0_to_1cm_m³'})

    # Daily dataframe
    daily = response.Daily()
    daily_temperature_2m_max = daily.Variables(0).ValuesAsNumpy()
    daily_precipitation_sum = daily.Variables(1).ValuesAsNumpy()
    daily_wind_speed_10m_max = daily.Variables(2).ValuesAsNumpy()
    daily_sunshine_duration = daily.Variables(3).ValuesAsNumpy()

    daily_data = {"date": pd.date_range(
        start=pd.to_datetime(daily.Time(), unit="s", utc=True),
        end=pd.to_datetime(daily.TimeEnd(), unit="s", utc=True),
        freq='D',
        inclusive="left"
    )}

    daily_data["daily_temperature_2m_max_C"] = daily_temperature_2m_max
    daily_data["daily_precipitation_sum_mm"] = daily_precipitation_sum
    daily_data["daily_wind_speed_10m_max_km/h"] = daily_wind_speed_10m_max
    daily_data["daily_sunshine_duration_sec"] = daily_sunshine_duration

    daily_dataframe = pd.DataFrame(data=daily_data)

    daily_dataframe['day_date'] = daily_dataframe['date'].dt.strftime(
        '%Y-%m-%d')
    total_df = pd.merge(daily_dataframe, avg_hourly_dataframe,
                        on="day_date", how="left")

    total_df['date'] = total_df['day_date']
    total_df = total_df.drop('day_date', axis=1)

    return total_df
    #total_df.to_json("app/data/weather_data.json", orient='columns')