Spaces:
Runtime error
Runtime error
import pandas as pd | |
import pandas as pd | |
import numpy as np | |
from utils.summary import get_meterological_summary, get_agricultural_yield_comparison | |
# Générer des dates sur 5 ans (historique) + 5 ans (prévision) | |
dates_past = pd.date_range( | |
start="2023-01-01", periods=36, freq="ME" | |
) # 3 ans d'historique | |
dates_future = pd.date_range( | |
start="2023-01-01", periods=60, freq="ME" | |
) # 5 ans de prévisions | |
# Température: Tendance à la hausse selon le scénario | |
def generate_temperature_trend(scenario): | |
base_temp = 10 + 10 * np.sin( | |
np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)) | |
) | |
if scenario == "optimiste": | |
trend = base_temp + np.linspace(0, 1, len(base_temp)) # Faible réchauffement | |
elif scenario == "modéré": | |
trend = base_temp + np.linspace(0, 2, len(base_temp)) # Réchauffement moyen | |
else: # pessimiste | |
trend = base_temp + np.linspace(0, 3, len(base_temp)) # Fort réchauffement | |
return trend | |
# Précipitations: Variation selon le scénario | |
def generate_precipitation_trend(scenario): | |
base_rain = 50 + 20 * np.cos( | |
np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)) | |
) | |
if scenario == "optimiste": | |
trend = base_rain - np.linspace(0, 5, len(base_rain)) # Légère baisse | |
elif scenario == "modéré": | |
trend = base_rain - np.linspace(0, 10, len(base_rain)) # Baisse moyenne | |
else: # pessimiste | |
trend = base_rain - np.linspace(0, 15, len(base_rain)) # Forte baisse | |
return trend | |
# Irradiance: Augmentation progressive | |
def generate_irradiance_trend(scenario): | |
base_irradiance = 200 + 50 * np.sin( | |
np.linspace(0, 2 * np.pi, len(dates_past) + len(dates_future)) | |
) | |
if scenario == "optimiste": | |
trend = base_irradiance + np.linspace( | |
0, 5, len(base_irradiance) | |
) # Faible augmentation | |
elif scenario == "modéré": | |
trend = base_irradiance + np.linspace( | |
0, 10, len(base_irradiance) | |
) # Augmentation modérée | |
else: # pessimiste | |
trend = base_irradiance + np.linspace( | |
0, 20, len(base_irradiance) | |
) # Forte augmentation | |
return trend | |
def get_mocked_summary(scenario): | |
# Choix du scénario | |
# scenario = "modéré" # Changer entre "optimiste", "modéré" et "pessimiste" | |
# Créer les DataFrames | |
temperature_df = pd.DataFrame( | |
{ | |
"Date": dates_past.tolist() + dates_future.tolist(), | |
"Température (°C)": generate_temperature_trend(scenario), | |
} | |
) | |
rain_df = pd.DataFrame( | |
{ | |
"Date": dates_past.tolist() + dates_future.tolist(), | |
"Précipitations (mm)": generate_precipitation_trend(scenario), | |
} | |
) | |
irradiation_df = pd.DataFrame( | |
{ | |
"Date": dates_past.tolist() + dates_future.tolist(), | |
"Irradiance (W/m²)": generate_irradiance_trend(scenario), | |
} | |
) | |
return temperature_df, rain_df, irradiation_df | |
def get_not_shaded_summary(): | |
scenario = "pessimiste" | |
temperature_df, rain_df, irradiance_df = get_mocked_summary(scenario) | |
summary = get_meterological_summary( | |
scenario, temperature_df, rain_df, irradiance_df | |
) | |
return summary | |
# Example usage | |
def get_shaded_summary(): | |
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 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() | |
summary = 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, | |
) | |
return summary | |