{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":87793,"databundleVersionId":11228175,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# -*- coding: utf-8 -*-\nimport os\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom mpl_toolkits.mplot3d import Axes3D\nfrom sklearn.cluster import KMeans, DBSCAN\nfrom difflib import SequenceMatcher\n\n# ---- 📌 Vérification des fichiers disponibles ----\nprint(\"\\n[INFO] 📂 Fichiers disponibles dans le dataset Kaggle :\")\nprint(os.listdir(\"/kaggle/input/stanford-rna-3d-folding\"))\n\n# ---- 📌 Fonction pour tester plusieurs encodages ----\ndef read_csv_flexible(file_path):\n    encodings = ['utf-8', 'latin1', 'ISO-8859-1']\n    for enc in encodings:\n        try:\n            df = pd.read_csv(file_path, encoding=enc)\n            print(f\"[INFO] ✅ Chargement réussi avec l'encodage : {enc}\")\n            return df\n        except UnicodeDecodeError:\n            print(f\"[WARNING] ⚠️ Problème avec l'encodage : {enc}\")\n    raise ValueError(\"[ERROR] ❌ Aucun encodage valide trouvé pour le fichier !\")\n\n# ---- 📌 Chargement des fichiers ----\ntrain_labels_path = \"/kaggle/input/stanford-rna-3d-folding/train_labels.csv\"\ntrain_sequences_path = \"/kaggle/input/stanford-rna-3d-folding/train_sequences.csv\"\n\ndf_labels = read_csv_flexible(train_labels_path)\ndf_sequences = read_csv_flexible(train_sequences_path)\n\n# ---- 📌 Nettoyage des données ----\nprint(\"\\n[INFO] 🧹 Nettoyage des données...\")\ndf_clean = df_labels.dropna().copy()\ndf_clean = df_clean[df_clean['resname'].isin(['A', 'C', 'G', 'U'])]\n\n# ---- 📌 Exploration des données ----\nprint(\"\\n[INFO] 🔍 Aperçu des données :\")\nprint(df_clean.info())\nprint(df_clean.head())\n\n# ---- 📊 Visualisation interactive des nucléotides ----\nfig_nucleotides = px.histogram(df_clean, x=\"resname\", title=\"Distribution des nucléotides\")\nfig_nucleotides.show()\n\n# ---- 📊 Visualisation interactive des coordonnées X, Y, Z ----\nfig_coords = px.scatter_3d(df_clean, x=\"x_1\", y=\"y_1\", z=\"z_1\", color=\"resname\",\n                           title=\"Visualisation 3D des résidus ARN\")\nfig_coords.show()\n\n# ---- 📌 Clustering K-Means ----\nprint(\"\\n[INFO] 📌 Application du clustering K-Means...\")\ndf_cluster = df_clean.sample(n=10000, random_state=42)\nkmeans = KMeans(n_clusters=4, random_state=42, n_init=10)\ndf_cluster['kmeans_cluster'] = kmeans.fit_predict(df_cluster[['x_1', 'y_1', 'z_1']])\n\nfig_kmeans = px.scatter_3d(df_cluster, x=\"x_1\", y=\"y_1\", z=\"z_1\", color=\"kmeans_cluster\",\n                           title=\"Clustering K-Means des résidus ARN\")\nfig_kmeans.show()\n\n# ---- 📌 Clustering DBSCAN ----\nprint(\"\\n[INFO] 📌 Application du clustering DBSCAN...\")\ndbscan = DBSCAN(eps=20, min_samples=10)\ndf_cluster['dbscan_cluster'] = dbscan.fit_predict(df_cluster[['x_1', 'y_1', 'z_1']])\n\nfig_dbscan = px.scatter_3d(df_cluster, x=\"x_1\", y=\"y_1\", z=\"z_1\", color=\"dbscan_cluster\",\n                           title=\"Clustering DBSCAN des Résidus ARN\")\nfig_dbscan.show()\n\n# ---- 📌 Comparaison de plusieurs chaînes ARN ----\nprint(\"\\n[INFO] 📌 Sélection de 3 chaînes ARN au hasard...\")\nrandom_chains = df_clean['ID'].str.split('_').str[0].drop_duplicates().sample(3, random_state=42).values\ndf_selected_chains = df_clean[df_clean['ID'].str.startswith(tuple(random_chains))]\n\nfig_chains = px.scatter_3d(df_selected_chains, x=\"x_1\", y=\"y_1\", z=\"z_1\", color=\"ID\",\n                           title=\"Comparaison 3D de plusieurs chaînes ARN\")\nfig_chains.show()\n\n# ---- 📌 Sélection et analyse d’une séquence ARN inconnue ----\nprint(\"\\n[INFO] 📌 Sélection d'une séquence ARN non annotée...\")\nexisting_ids = df_clean['ID'].str.split('_').str[0].unique()\ndf_unknown_seq = df_sequences[~df_sequences['target_id'].isin(existing_ids)]\nrandom_unknown_seq = df_unknown_seq.sample(1, random_state=42)\n\n# ---- 📌 Recherche des séquences similaires ----\nprint(\"\\n[INFO] 🔍 Recherche des séquences similaires...\")\ndef sequence_similarity(seq1, seq2):\n    return SequenceMatcher(None, seq1, seq2).ratio()\n\ndf_sequences['similarity'] = df_sequences['sequence'].apply(\n    lambda x: sequence_similarity(x, random_unknown_seq['sequence'].values[0]) if isinstance(x, str) else 0)\n\ntop_similar_sequences = df_sequences.sort_values(by='similarity', ascending=False).head(5)\nsimilar_ids = top_similar_sequences['target_id'].values[1:4]\ndf_similar_structures = df_clean[df_clean['ID'].str.startswith(tuple(similar_ids))]\n\n# ---- 📌 Estimation de la structure 3D de la séquence inconnue ----\ndf_estimated_structure = df_similar_structures.groupby('resid')[['x_1', 'y_1', 'z_1']].mean().reset_index()\n\nfig_estimated = px.scatter_3d(df_estimated_structure, x=\"x_1\", y=\"y_1\", z=\"z_1\", color=\"resid\",\n                              title=\"Structure 3D estimée pour une séquence ARN inconnue\")\nfig_estimated.show()\n\n# ---- 📌 Génération d’un fichier PDB ----\npdb_filename = \"/kaggle/working/4YVJ_C_estimated.pdb\"\nprint(f\"\\n[INFO] 📄 Génération du fichier PDB : {pdb_filename}\")\nwith open(pdb_filename, 'w', encoding='utf-8') as f:\n    f.write(\"HEADER    ESTIMATED RNA STRUCTURE 4YVJ_C\\n\")\n    for index, row in df_estimated_structure.iterrows():\n        f.write(f\"ATOM  {index+1:5d}  C1'  A {int(row['resid']):4d}    {row['x_1']:8.3f} {row['y_1']:8.3f} {row['z_1']:8.3f}\\n\")\n    f.write(\"END\\n\")\n\nprint(f\"[INFO] ✅ Fichier PDB généré avec succès : {pdb_filename}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-11T04:57:51.795718Z","iopub.execute_input":"2025-03-11T04:57:51.796051Z","iopub.status.idle":"2025-03-11T04:57:55.579079Z","shell.execute_reply.started":"2025-03-11T04:57:51.796019Z","shell.execute_reply":"2025-03-11T04:57:55.578031Z"}},"outputs":[],"execution_count":null}]}