Rim BACCOUR commited on
Commit
a07ee0c
·
unverified ·
1 Parent(s): af18735

final version for meterological summary

Browse files
Files changed (2) hide show
  1. prompts/summary_prompt.py +1 -1
  2. summary_test.py +104 -151
prompts/summary_prompt.py CHANGED
@@ -20,7 +20,7 @@ meterological_data_summary_prompt = """
20
  - L'évolution de la tendances des précipitations.
21
  - Les variations de l’irradiance solaire.
22
 
23
- avec des pourcentage de variation du futur par rapport aux années passées et en spécifiant les dates
24
  Présente ta réponse sous un format structuré avec un résumé des tendances observées et des perspectives climatiques selon le scénario choisi."
25
 
26
  """
 
20
  - L'évolution de la tendances des précipitations.
21
  - Les variations de l’irradiance solaire.
22
 
23
+ Tu dois présenter avec des pourcentage de variation du futur par rapport aux années passées et en spécifiant les dates et en vulgarisant ces calculs pour un agriculteur
24
  Présente ta réponse sous un format structuré avec un résumé des tendances observées et des perspectives climatiques selon le scénario choisi."
25
 
26
  """
summary_test.py CHANGED
@@ -1,159 +1,112 @@
 
1
  import pandas as pd
2
  import pandas as pd
3
  import numpy as np
 
 
4
 
5
  from utils.summary import get_meterological_summary, get_agricultural_yield_comparison
6
 
7
- # Générer des dates sur 5 ans (historique) + 5 ans (prévision)
8
- dates_past = pd.date_range(
9
- start="2023-01-01", periods=36, freq="ME"
10
- ) # 3 ans d'historique
11
- dates_future = pd.date_range(
12
- start="2023-01-01", periods=60, freq="ME"
13
- ) # 5 ans de prévisions
14
-
15
-
16
- # Température: Tendance à la hausse selon le scénario
17
- def generate_temperature_trend(scenario):
18
- base_temp = 10 + 10 * np.sin(
19
- np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future))
20
- )
21
- if scenario == "optimiste":
22
- trend = base_temp + np.linspace(0, 1, len(base_temp)) # Faible réchauffement
23
- elif scenario == "modéré":
24
- trend = base_temp + np.linspace(0, 2, len(base_temp)) # Réchauffement moyen
25
- else: # pessimiste
26
- trend = base_temp + np.linspace(0, 3, len(base_temp)) # Fort réchauffement
27
- return trend
28
-
29
-
30
- # Précipitations: Variation selon le scénario
31
- def generate_precipitation_trend(scenario):
32
- base_rain = 50 + 20 * np.cos(
33
- np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future))
34
- )
35
- if scenario == "optimiste":
36
- trend = base_rain - np.linspace(0, 5, len(base_rain)) # Légère baisse
37
- elif scenario == "modéré":
38
- trend = base_rain - np.linspace(0, 10, len(base_rain)) # Baisse moyenne
39
- else: # pessimiste
40
- trend = base_rain - np.linspace(0, 15, len(base_rain)) # Forte baisse
41
- return trend
42
-
43
-
44
- # Irradiance: Augmentation progressive
45
- def generate_irradiance_trend(scenario):
46
- base_irradiance = 200 + 50 * np.sin(
47
- np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future))
48
- )
49
- if scenario == "optimiste":
50
- trend = base_irradiance + np.linspace(
51
- 0, 5, len(base_irradiance)
52
- ) # Faible augmentation
53
- elif scenario == "modéré":
54
- trend = base_irradiance + np.linspace(
55
- 0, 10, len(base_irradiance)
56
- ) # Augmentation modérée
57
- else: # pessimiste
58
- trend = base_irradiance + np.linspace(
59
- 0, 20, len(base_irradiance)
60
- ) # Forte augmentation
61
- return trend
62
-
63
-
64
- def get_mocked_summary(scenario):
65
- # Choix du scénario
66
- # scenario = "modéré" # Changer entre "optimiste", "modéré" et "pessimiste"
67
-
68
- # Créer les DataFrames
69
- temperature_df = pd.DataFrame(
70
- {
71
- "Date": dates_past.tolist() + dates_future.tolist(),
72
- "Température (°C)": generate_temperature_trend(scenario),
73
- }
74
- )
75
-
76
- rain_df = pd.DataFrame(
77
- {
78
- "Date": dates_past.tolist() + dates_future.tolist(),
79
- "Précipitations (mm)": generate_precipitation_trend(scenario),
80
- }
81
- )
82
-
83
- irradiation_df = pd.DataFrame(
84
- {
85
- "Date": dates_past.tolist() + dates_future.tolist(),
86
- "Irradiance (W/m²)": generate_irradiance_trend(scenario),
87
- }
88
- )
89
- return temperature_df, rain_df, irradiation_df
90
-
91
-
92
- def get_not_shaded_summary():
93
- scenario = "pessimiste"
94
- temperature_df, rain_df, irradiance_df = get_mocked_summary(scenario)
95
- summary = get_meterological_summary(
96
- scenario, temperature_df, rain_df, irradiance_df
97
- )
98
- return summary
99
-
100
-
101
- # Example usage
102
- def get_shaded_summary():
103
- import pandas as pd
104
- import numpy as np
105
-
106
- from utils.soil_utils import find_nearest_point_to_city
107
-
108
- city = "Bourgogne Franche Comté"
109
- closest_soil_features = find_nearest_point_to_city(city)
110
- print(closest_soil_features)
111
-
112
- # Définir la période de 4 ans dans le passé + 15 ans dans le futur (19 ans)
113
- start_date = "2010-01"
114
- end_date = "2029-12"
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  # Générer une série de dates mensuelles
117
- dates = pd.date_range(start=start_date, end=end_date, freq="M")
118
-
119
- # Générer des données fictives de rendement (en tonnes par hectare)
120
- np.random.seed(42) # Pour reproductibilité
121
-
122
- # Tendance générale du rendement sans ombrage (augmentation progressive)
123
- trend = np.linspace(2.5, 3.2, len(dates)) # Augmente légèrement sur les années
124
-
125
- # Ajout de variations saisonnières et aléatoires
126
- seasonality = 0.3 * np.sin(
127
- np.linspace(0, 12 * np.pi, len(dates))
128
- ) # Effet saisonnier
129
- random_variation = np.random.normal(0, 0.1, len(dates)) # Bruit aléatoire
130
-
131
- # Calcul du rendement sans ombrage
132
- yield_no_shade = trend + seasonality + random_variation
133
-
134
- # Appliquer un effet d'ombrage (réduction de 10-20% du rendement)
135
- shade_factor = np.random.uniform(
136
- 0.1, 0.2, len(dates)
137
- ) # Entre 10% et 20% de réduction
138
- yield_with_shade = yield_no_shade * (1 - shade_factor)
139
-
140
- # Créer le DataFrame
141
- df = pd.DataFrame(
142
- {
143
- "date": dates,
144
- "yield_no_shade": yield_no_shade,
145
- "yield_with_shade": yield_with_shade,
146
- }
147
- )
148
- water_deficit_data = pd.DataFrame()
149
- climate_data = pd.DataFrame()
150
-
151
- summary = get_agricultural_yield_comparison(
152
- culture="orge",
153
- region="bourgogne franche comté",
154
- water_df=water_deficit_data,
155
- climate_df=climate_data,
156
- soil_df=closest_soil_features,
157
- agri_yield_df=df,
158
- )
159
- return summary
 
1
+ import os
2
  import pandas as pd
3
  import pandas as pd
4
  import numpy as np
5
+ from forecast import get_forecast_datasets, get_forecast_data
6
+ from data_pipelines.historical_weather_data import download_historical_weather_data, aggregate_hourly_weather_data
7
 
8
  from utils.summary import get_meterological_summary, get_agricultural_yield_comparison
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
+ def get_meterological_past_data():
12
+ download_historical_weather_data(latitude, longitude, start_year, end_year)
13
+
14
+ def process_all_data_for_meterological_summary(scenario: str, lat: float = 47.0, lon:float = 5.0):
15
+
16
+ start_year, end_year = 2010, 2025
17
+ historical_df = aggregate_hourly_weather_data(download_historical_weather_data(latitude=lat, longitude=lon, start_year=start_year, end_year= end_year))
18
+ forecast_df = get_forecast_data(scenario=scenario, longitude=lon, latitude=lat, shading_coef=0)
19
+
20
+ forecast_df["time"] = pd.to_datetime(forecast_df["time"])
21
+ forecast_df['year'] = forecast_df["time"].dt.year
22
+ new_forecast_df = forecast_df.groupby(by="year", as_index=False)[["Near Surface Air Temperature (°C)", "Surface Downwelling Shortwave Radiation (W/m²)", "Precipitation (kg m-2 s-1)"]].mean().reset_index()
23
+ # new_forecast_df = new_forecast_df[new_forecast_df["year"] > 2025]
24
+
25
+ historical_df = historical_df.reset_index().rename(columns={"index": "time"}).sort_values(by="time")
26
+ historical_df["year"] = historical_df["time"].dt.year
27
+ historical_df["precipitation"] = historical_df["precipitation"] / 3600 # to transform the data to kg m2 per s
28
+
29
+ new_historical_df = historical_df.groupby(by="year", as_index=False)[["air_temperature_mean", "irradiance", "precipitation"]].mean().reset_index()
30
+ new_historical_df = new_historical_df[new_historical_df["year"] < 2024]
31
+
32
+ temperature_df = pd.concat([new_historical_df[["year", "air_temperature_mean"]].rename(columns={"air_temperature_mean": "Near Surface Air Temperature (°C)"}),
33
+ new_forecast_df[["year", "Near Surface Air Temperature (°C)"]]], axis=0)
34
+
35
+ irradiance_df = pd.concat([new_historical_df[["year", "irradiance"]].rename(columns={"irradiance": "Surface Downwelling Shortwave Radiation (W/m²)"}),
36
+ new_forecast_df[["year", "Surface Downwelling Shortwave Radiation (W/m²)"]]], axis=0)
37
+
38
+ rain_df = pd.concat([new_historical_df[["year", "precipitation"]].rename(columns={"precipitation": "Precipitation (kg m-2 s-1)"}),
39
+ new_forecast_df[["year", "Precipitation (kg m-2 s-1)"]]], axis=0)
40
+
41
+ return temperature_df, rain_df, irradiance_df
42
+
43
+
44
+ if __name__ == "__main__":
45
+
46
+ scenario = "pessimist"
47
+ lat, lon = 47.0, 5.0
48
+ temperature_df, rain_df, irradiance_df = process_all_data_for_meterological_summary(scenario, lat, lon)
49
+
50
+ meterological_summary = get_meterological_summary(scenario=scenario,
51
+ temperature_df=temperature_df,
52
+ irradiance_df=irradiance_df,
53
+ rain_df=rain_df)
54
+ print(meterological_summary)
55
+
56
+ # from utils.soil_utils import find_nearest_point
57
+ # city = "Bourgogne Franche Comté"
58
+ # closest_soil_features = find_nearest_point(city)
59
+ # print(closest_soil_features)
60
+
61
+ # Example usage
62
+ # import pandas as pd
63
+ # import numpy as np
64
+
65
+ # from utils.soil_utils import find_nearest_point
66
+
67
+ # city = "Bourgogne Franche Comté"
68
+ # closest_soil_features = find_nearest_point(city)
69
+ # print(closest_soil_features)
70
+
71
+ # # Définir la période de 4 ans dans le passé + 15 ans dans le futur (19 ans)
72
+ # start_date = "2010-01"
73
+ # end_date = "2029-12"
74
+
75
+ # # Générer une série de dates mensuelles
76
+ # dates = pd.date_range(start=start_date, end=end_date, freq='M')
77
  # Générer une série de dates mensuelles
78
+ # dates = pd.date_range(start=start_date, end=end_date, freq="M")
79
+
80
+ # # Générer des données fictives de rendement (en tonnes par hectare)
81
+ # np.random.seed(42) # Pour reproductibilité
82
+
83
+ # # Tendance générale du rendement sans ombrage (augmentation progressive)
84
+ # trend = np.linspace(2.5, 3.2, len(dates)) # Augmente légèrement sur les années
85
+
86
+ # # Ajout de variations saisonnières et aléatoires
87
+ # seasonality = 0.3 * np.sin(np.linspace(0, 12 * np.pi, len(dates))) # Effet saisonnier
88
+ # random_variation = np.random.normal(0, 0.1, len(dates)) # Bruit aléatoire
89
+
90
+ # # Calcul du rendement sans ombrage
91
+ # yield_no_shade = trend + seasonality + random_variation
92
+
93
+ # # Appliquer un effet d'ombrage (réduction de 10-20% du rendement)
94
+ # shade_factor = np.random.uniform(0.1, 0.2, len(dates)) # Entre 10% et 20% de réduction
95
+ # yield_with_shade = yield_no_shade * (1 - shade_factor)
96
+
97
+ # # Créer le DataFrame
98
+ # df = pd.DataFrame({
99
+ # "date": dates,
100
+ # "yield_no_shade": yield_no_shade,
101
+ # "yield_with_shade": yield_with_shade
102
+ # })
103
+ # water_deficit_data = pd.DataFrame()
104
+ # climate_data = pd.DataFrame()
105
+
106
+ # print(get_agricultural_yield_comparison(culture="orge",
107
+ # region="bourgogne franche comté",
108
+ # water_df=water_deficit_data,
109
+ # climate_df=climate_data,
110
+ # soil_df=closest_soil_features,
111
+ # agri_yield_df=df))
112
+