File size: 5,121 Bytes
03df0fa
 
 
 
 
 
 
603824f
 
 
03df0fa
 
57cfeee
603824f
883455d
03df0fa
 
 
 
883455d
03df0fa
 
603824f
 
 
 
03df0fa
 
 
 
 
883455d
03df0fa
603824f
03df0fa
57cfeee
 
603824f
03df0fa
603824f
 
 
03df0fa
603824f
 
883455d
603824f
 
 
 
 
 
883455d
603824f
883455d
 
603824f
 
883455d
57cfeee
 
 
 
603824f
03df0fa
 
 
 
 
883455d
03df0fa
 
 
 
603824f
03df0fa
 
 
 
 
 
 
883455d
03df0fa
 
57cfeee
03df0fa
603824f
 
883455d
57cfeee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
603824f
 
57cfeee
 
03df0fa
 
 
603824f
57cfeee
03df0fa
603824f
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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_hourly_weather_data(response):
    # 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_cloud_cover = hourly.Variables(3).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_data["cloud_cover_%"] = hourly_cloud_cover

    hourly_dataframe = pd.DataFrame(data=hourly_data)

    # print('hourly df', hourly_dataframe)

    hourly_dataframe = pd.DataFrame(data=hourly_data)

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

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

    avg_hourly_dataframe = tmp1.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³'
    }
    )

    # med cloud couverture
    tmp2 = hourly_dataframe.groupby('day_date')[['cloud_cover_%']].median()

    med_cloud_cover = tmp2.rename(
        columns={'cloud_cover_%': 'med_cloud_cover_%'})

    return avg_hourly_dataframe, med_cloud_cover


def get_daily_weather_data(response):
    # 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_rain_sum = daily.Variables(4).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_data["daily_rain_sum_mm"] = daily_rain_sum

    daily_dataframe = pd.DataFrame(data=daily_data)
    # print('meteo_daily', daily_dataframe)

    daily_dataframe['day_date'] = daily_dataframe['date'].dt.strftime(
        '%Y-%m-%d')

    return daily_dataframe


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,  # "cloud_cover_low", "cloud_cover_mid","cloud_cover_high"
        "hourly": ["relative_humidity_2m", "soil_temperature_0cm", "soil_moisture_0_to_1cm", "cloud_cover"],
        "daily": ["temperature_2m_max", "precipitation_sum", "wind_speed_10m_max", "sunshine_duration", "rain_sum"],
        "past_days": 5,
        "forecast_days": 7

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

    print(f"Coordinates {response.Latitude()}°N {response.Longitude()}°E")
    print(f"Elevation {response.Elevation()} m asl")
    print(f"Timezone {response.Timezone()} {response.TimezoneAbbreviation()}")
    print(f"Timezone difference to GMT+0 {response.UtcOffsetSeconds()} s")

    avg_hourly_dataframe, med_cloud_cover = get_hourly_weather_data(response)
    daily_dataframe = get_daily_weather_data(response)

    total_df = pd.merge(daily_dataframe, avg_hourly_dataframe,
                        on="day_date", how="left")
    total_df = pd.merge(total_df, med_cloud_cover,
                        on="day_date", how="left")

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

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


if __name__ == "__main__":
    df = get_info_meteo(48.832, 2.286)
    print(df)