File size: 8,669 Bytes
a07ee0c
a8dd5f5
 
 
a07ee0c
db975c4
 
 
 
ba70fb9
9c23216
38af3d3
9c23216
a07ee0c
 
 
db975c4
 
a07ee0c
ba70fb9
db975c4
 
 
 
 
 
 
 
a07ee0c
 
db975c4
 
 
 
a07ee0c
 
db975c4
 
 
 
 
a07ee0c
db975c4
 
 
a07ee0c
db975c4
 
 
a07ee0c
 
ba70fb9
 
a07ee0c
db975c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a07ee0c
 
 
db975c4
 
 
 
ba70fb9
 
 
db975c4
 
 
 
 
 
 
 
ba70fb9
db975c4
 
 
ba70fb9
 
db975c4
 
 
ba70fb9
 
db975c4
 
 
 
 
 
 
 
 
ba70fb9
a07ee0c
fe52f62
a07ee0c
 
db975c4
ba70fb9
 
 
 
db975c4
 
 
 
e25f53d
db975c4
 
 
 
 
 
e25f53d
ba70fb9
db975c4
 
 
 
 
 
4d46cce
 
db975c4
 
 
4d46cce
db975c4
 
 
 
 
 
 
ba70fb9
db975c4
 
 
4d46cce
ba70fb9
e25f53d
db975c4
 
 
 
 
 
 
 
 
 
 
e25f53d
4d46cce
e25f53d
fe52f62
a07ee0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9c23216
a07ee0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db975c4
 
a07ee0c
db975c4
a07ee0c
db975c4
a07ee0c
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
import os
import pandas as pd
import pandas as pd
import numpy as np
from forecast import get_forecast_datasets, get_forecast_data
from data_pipelines.historical_weather_data import (
    download_historical_weather_data,
    aggregate_hourly_weather_data,
)
from utils.soil_utils import find_nearest_point_to_coordinates
from utils.summary import get_meterological_summary, get_agricultural_yield_comparison


def get_meterological_past_data():
    download_historical_weather_data(latitude, longitude, start_year, end_year)


def pre_process_data(scenario: str, lat: float = 47.0, lon: float = 5.0):
    start_year, end_year = 2010, 2025

    historical_df = aggregate_hourly_weather_data(
        download_historical_weather_data(
            latitude=lat, longitude=lon, start_year=start_year, end_year=end_year
        )
    )
    forecast_df = get_forecast_data(
        scenario=scenario, longitude=lon, latitude=lat, shading_coef=0
    )

    forecast_df["time"] = pd.to_datetime(forecast_df["time"])
    forecast_df["year"] = forecast_df["time"].dt.year
    new_forecast_df = (
        forecast_df.groupby(by="year", as_index=False).mean().reset_index()
    )
    # new_forecast_df = new_forecast_df[new_forecast_df["year"] > 2025]

    historical_df = (
        historical_df.reset_index()
        .rename(columns={"index": "time"})
        .sort_values(by="time")
    )
    historical_df["year"] = historical_df["time"].dt.year
    historical_df["precipitation"] = (
        historical_df["precipitation"] / 3600
    )  # to transform the data to kg m2 per s

    new_historical_df = (
        historical_df.groupby(by="year", as_index=False).mean().reset_index()
    )
    new_historical_df = new_historical_df[new_historical_df["year"] < 2024]

    return new_historical_df, new_forecast_df


def process_all_data_for_meterological_summary(
    historical_data: pd.DataFrame, forecast_data: pd.DataFrame
):

    temperature_df = pd.concat(
        [
            historical_data[["year", "air_temperature_mean"]].rename(
                columns={"air_temperature_mean": "Near Surface Air Temperature (°C)"}
            ),
            forecast_data[["year", "Near Surface Air Temperature (°C)"]],
        ],
        axis=0,
    )

    irradiance_df = pd.concat(
        [
            historical_data[["year", "irradiance"]].rename(
                columns={"irradiance": "Surface Downwelling Shortwave Radiation (W/m²)"}
            ),
            forecast_data[["year", "Surface Downwelling Shortwave Radiation (W/m²)"]],
        ],
        axis=0,
    )

    rain_df = pd.concat(
        [
            historical_data[["year", "precipitation"]].rename(
                columns={"precipitation": "Precipitation (kg m-2 s-1)"}
            ),
            forecast_data[["year", "Precipitation (kg m-2 s-1)"]],
        ],
        axis=0,
    )

    return temperature_df, rain_df, irradiance_df


def get_yield_data(
    region: str = "Bourgogne-Franche-Comté", culture: str = "Blé tendre d'hiver"
):

    yield_past_data = pd.read_csv("data/data_yield/data_rendement.csv")
    # yield_forecast_data = pd.read_csv("data/data_yield/data_rendement.csv")
    yield_past_data = yield_past_data[
        (yield_past_data["LIB_REG2"] == region)
        & (yield_past_data["LIB_SAA"].str.contains("Colza grain d'hiver"))
    ]
    yield_past_data = yield_past_data[
        ["LIB_REG2", "LIB_SAA"]
        + [col for col in yield_past_data.columns if "REND" in col]
    ]
    # Transformation
    yield_past_data = yield_past_data.melt(
        id_vars=["LIB_REG2", "LIB_SAA"], var_name="year", value_name="past_yield"
    )

    # Nettoyer la colonne "temps" pour enlever "REND_"
    yield_past_data["year"] = (
        yield_past_data["year"].str.replace("REND_", "").astype(int)
    )

    yield_forecast_data = pd.read_csv("data/data_yield/rendement_forecast.csv")
    yield_forecast_data = yield_forecast_data[
        yield_forecast_data["culture"].str.contains(culture)
    ]
    return (
        yield_past_data[["year", "past_yield"]],
        yield_forecast_data[
            ["year", "yield_simple_forecast", "yield_with_shading_forecast"]
        ],
    )


def get_summaries():
    scenario = "pessimist"
    lat, lon = 47.0, 5.0
    culture = "Colza d'hiver"
    region = "Bourgogne-Franche-Comté"

    historical_df, forecast_df = pre_process_data(scenario, lat, lon)

    temperature_df, rain_df, irradiance_df = process_all_data_for_meterological_summary(
        historical_df, forecast_df
    )

    #######@
    meterological_summary = get_meterological_summary(
        scenario=scenario,
        temperature_df=temperature_df,
        irradiance_df=irradiance_df,
        rain_df=rain_df,
    )
    print(meterological_summary)

    climate_data = temperature_df.merge(rain_df, on="year").merge(
        irradiance_df, on="year"
    )  # meteo ok
    closest_soil_data = find_nearest_point_to_coordinates(
        latitude=lat, longitude=lon
    )  # soil ok
    water_deficit_data = forecast_df[["year", "Water Deficit (mm/day)"]]
    ############ forecast data PV ############
    forecast_df_pv = get_forecast_data(
        scenario=scenario, longitude=lon, latitude=lat, shading_coef=0.2
    )
    forecast_df_pv["time"] = pd.to_datetime(forecast_df_pv["time"])
    forecast_df_pv["year"] = forecast_df_pv["time"].dt.year
    water_deficit_data_pv = (
        forecast_df_pv.groupby(by="year", as_index=False)
        .mean()
        .reset_index()[["year", "Water Deficit (mm/day)"]]
    )

    # add a step to transform gps coordinates into french region to be able to filter yield data
    yield_past_data, yield_forecast_data = get_yield_data(
        region=region, culture=culture
    )
    print(yield_forecast_data.tail())

    # rendement (avec et sans ombrage)

    second_summary = get_agricultural_yield_comparison(
        culture=culture,
        region="bourgogne franche comté",
        water_df=water_deficit_data,
        water_df_pv=water_deficit_data_pv,
        climate_df=climate_data,
        soil_df=closest_soil_data,
        forecast_yield_df=yield_forecast_data,
        historical_yield_df=yield_past_data,
    )

    print(yield_forecast_data.tail())
    print(second_summary)
    return meterological_summary, second_summary
    # from utils.soil_utils import find_nearest_point
    # city = "Bourgogne Franche Comté"
    # closest_soil_features = find_nearest_point(city)
    # print(closest_soil_features)

    # Example usage
    # import pandas as pd
    # import numpy as np

    # from utils.soil_utils import find_nearest_point

    # city = "Bourgogne Franche Comté"
    # closest_soil_features = find_nearest_point(city)
    # print(closest_soil_features)

    # # Définir la période de 4 ans dans le passé + 15 ans dans le futur (19 ans)
    # start_date = "2010-01"
    # end_date = "2029-12"

    # # Générer une série de dates mensuelles
    # dates = pd.date_range(start=start_date, end=end_date, freq='M')
    # Générer une série de dates mensuelles
    # dates = pd.date_range(start=start_date, end=end_date, freq="M")

    # # Générer des données fictives de rendement (en tonnes par hectare)
    # np.random.seed(42)  # Pour reproductibilité

    # # Tendance générale du rendement sans ombrage (augmentation progressive)
    # trend = np.linspace(2.5, 3.2, len(dates))  # Augmente légèrement sur les années

    # # Ajout de variations saisonnières et aléatoires
    # seasonality = 0.3 * np.sin(np.linspace(0, 12 * np.pi, len(dates)))  # Effet saisonnier
    # random_variation = np.random.normal(0, 0.1, len(dates))  # Bruit aléatoire

    # # Calcul du rendement sans ombrage
    # yield_no_shade = trend + seasonality + random_variation

    # # Appliquer un effet d'ombrage (réduction de 10-20% du rendement)
    # shade_factor = np.random.uniform(0.1, 0.2, len(dates))  # Entre 10% et 20% de réduction
    # yield_with_shade = yield_no_shade * (1 - shade_factor)

    # # Créer le DataFrame
    # df = pd.DataFrame({
    #     "date": dates,
    #     "yield_no_shade": yield_no_shade,
    #     "yield_with_shade": yield_with_shade
    # })
    # water_deficit_data = pd.DataFrame()
    # climate_data = pd.DataFrame()

    # print(get_agricultural_yield_comparison(culture="orge",
    #                                         region="bourgogne franche comté",
    #                                         water_df=water_deficit_data,
    #                                         climate_df=climate_data,
    #                                         soil_df=closest_soil_features,
    #                                         agri_yield_df=df))