import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Wählen wir zwei Features zur Variation:
less_important_feature_education = "education.num"
less_important_feature_fnlwgt = "fnlwgt" 

# Festlegen derRange für die Variation der zwei Features
education_range = np.linspace(instance_df[less_important_feature_education].values[0] - 10, instance_df[less_important_feature_education].values[0] + 10, 50)
fnlwgt_range = np.linspace(instance_df[less_important_feature_fnlwgt].values[0] - 100000, instance_df[less_important_feature_fnlwgt].values[0] + 100000, 50)

# Erstellen von Instanzen für LIME
instances_education = pd.DataFrame([instance] * len(education_range), columns=X_train.columns)
instances_fnlwgt = pd.DataFrame([instance] * len(fnlwgt_range), columns=X_train.columns)

# Ändern der Feature-Werte in den Instanzen
instances_education[less_important_feature_education] = education_range
instances_fnlwgt[less_important_feature_fnlwgt] = fnlwgt_range

# Vorhersagen mit dem Modell (Wahrscheinlichkeiten)
instances_education["prediction"] = best_rf_model.predict_proba(instances_education)[:, 1]
instances_fnlwgt["prediction"] = best_rf_model.predict_proba(instances_fnlwgt)[:, 1]

# Bestimmen der y-Achsen-Grenzen (min/max für alle Vorhersagen)
y_min = min(instances_education["prediction"].min(), instances_fnlwgt["prediction"].min())
y_max = max(instances_education["prediction"].max(), instances_fnlwgt["prediction"].max())

# Visualisierung der Variation von 'education-num' (moderater Einfluss)
plt.figure(figsize=(8,5))
plt.plot(education_range, instances_education["prediction"], label="Moderater Einfluss auf die Vorhersage", color='green')
plt.axvline(instance_df[less_important_feature_education].values[0], color="red", linestyle="dashed", label="Originalwert")
plt.xlabel("Bildungsniveau (education-num)")
plt.ylabel("Vorhersage (0 = <=50K, 1 = >50K)")
plt.title(f"Einfluss von {less_important_feature_education} auf die Vorhersage")
plt.ylim([y_min, y_max])  # Einheitliche y-Achse
plt.legend()
plt.show()

# Visualisierung der Variation von 'fnlwgt' (wenig Einfluss)
plt.figure(figsize=(8,5))
plt.plot(fnlwgt_range, instances_fnlwgt["prediction"], label="Wenig Einfluss auf die Vorhersage", color='orange')
plt.axvline(instance_df[less_important_feature_fnlwgt].values[0], color="red", linestyle="dashed", label="Originalwert")
plt.xlabel("Finales Gewicht (fnlwgt)")
plt.ylabel("Vorhersage (0 = <=50K, 1 = >50K)")
plt.title(f"Einfluss von {less_important_feature_fnlwgt} auf die Vorhersage")
plt.ylim([y_min, y_max])  # Einheitliche y-Achse
plt.legend()
plt.show()