File size: 4,467 Bytes
03df0fa
 
 
 
 
 
 
603824f
 
 
03df0fa
 
 
 
 
 
 
603824f
03df0fa
 
 
603824f
 
883455d
603824f
 
 
 
 
03df0fa
 
 
603824f
883455d
03df0fa
 
 
 
883455d
03df0fa
 
603824f
 
 
 
03df0fa
 
 
 
 
883455d
03df0fa
603824f
03df0fa
603824f
03df0fa
603824f
 
 
03df0fa
603824f
 
883455d
603824f
 
 
 
 
 
883455d
603824f
883455d
 
603824f
 
883455d
603824f
03df0fa
 
603824f
03df0fa
 
 
883455d
03df0fa
 
 
 
603824f
03df0fa
 
 
 
 
 
 
883455d
03df0fa
 
 
603824f
 
883455d
603824f
 
883455d
03df0fa
 
 
603824f
 
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
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,  # "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]

    # 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)

    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_%'})

    # Daily dataframe
    daily = response.Daily()
    daily_temperature_2m_max = daily.Variables(0).ValuesAsNumpy()
    print(daily_temperature_2m_max)
    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)

    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 = 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)