Spaces:
Runtime error
Runtime error
Rim BACCOUR
commited on
final version for meterological summary
Browse files- prompts/summary_prompt.py +1 -1
- 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 |
-
|
| 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 |
-
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 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|