import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

data = pd.read_csv("data_avec_gene.csv")
print(data.head())

# Prédit la variable "off" sans utiliser la donnée "on" 
# data_known : lignes pour lesquelles "off" est renseigné
# data_missing : lignes pour lesquelles "off" est manquant
data_known = data[data["off"].notnull()].copy()
data_missing = data[data["off"].isnull()].copy()


features = data.columns.drop(["on", "off"])
print("Variables explicatives utilisées :", features.tolist())

# Préparation des ensembles d'entraînement
X = data_known[features]
y = data_known["off"]

# Division en ensemble d'entraînement et de test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

#J'utilise un RandomForestRegressor, choix à discuter
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# On test un peu le model
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error sur l'ensemble de test : {mse:.3f}")

# Validation croisée
cv_scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
print("CV MSE scores :", -cv_scores)
print("CV MSE moyen :", -cv_scores.mean())

# Prédiction des valeurs manquantes de "off"
if not data_missing.empty:
    X_missing = data_missing[features]
    data.loc[data_missing.index, "off_pred"] = model.predict(X_missing)
    print("Prédictions effectuées pour les données manquantes.")

# Enregistrement du jeu de données avec les prédictions dans un nouveau fichier CSV
data.to_csv("data_with_predictions.csv", index=False)
print("Les données avec les prédictions ont été enregistrées dans 'data_with_predictions.csv'.")