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