{"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":59094,"databundleVersionId":7010844,"sourceType":"competition"},{"sourceId":7279447,"sourceType":"datasetVersion","datasetId":1608748},{"sourceId":7299702,"sourceType":"datasetVersion","datasetId":4234070}],"dockerImageVersionId":30626,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install scanpy > /dev/null 2>&1","metadata":{"execution":{"iopub.status.busy":"2023-12-31T12:44:24.051166Z","iopub.execute_input":"2023-12-31T12:44:24.051523Z","iopub.status.idle":"2023-12-31T12:44:33.798905Z","shell.execute_reply.started":"2023-12-31T12:44:24.051473Z","shell.execute_reply":"2023-12-31T12:44:33.797446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import scanpy as sc\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"execution":{"iopub.status.busy":"2023-12-31T12:44:33.801277Z","iopub.execute_input":"2023-12-31T12:44:33.801593Z","iopub.status.idle":"2023-12-31T12:44:33.807464Z","shell.execute_reply.started":"2023-12-31T12:44:33.801566Z","shell.execute_reply":"2023-12-31T12:44:33.806471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"adata = sc.read_h5ad('/kaggle/input/open-problems-single-cell-perturbations-data/adata_OPSCP_rawcounts_sparse_240090_21255.h5ad')\nde_train = pd.read_parquet('/kaggle/input/open-problems-single-cell-perturbations/de_train.parquet')","metadata":{"execution":{"iopub.status.busy":"2023-12-31T12:44:33.809041Z","iopub.execute_input":"2023-12-31T12:44:33.809484Z","iopub.status.idle":"2023-12-31T12:44:54.813601Z","shell.execute_reply.started":"2023-12-31T12:44:33.809455Z","shell.execute_reply":"2023-12-31T12:44:54.812624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cell_types = adata.obs['cell_type'].unique()\n\ndef plot_gene_distribution(genes, data, ncols=3):\n    nrows = len(genes) // ncols + (len(genes) % ncols > 0)\n    fig, axes = plt.subplots(nrows, ncols, figsize=(15, nrows*5))\n    \n    for i, gene in enumerate(genes):\n        if nrows > 1:\n            ax = axes[i // ncols, i % ncols]\n        else:\n            ax = axes[i]\n        sns.histplot(data[gene], kde=True, ax=ax)\n        ax.set_title(f\"Distribution of {gene}\")\n        ax.set_xlabel(\"Expression\")\n        ax.set_ylabel(\"Frequency\")\n    \n    for j in range(i + 1, nrows * ncols):\n        if nrows > 1:\n            fig.delaxes(axes[j // ncols, j % ncols])\n        else:\n            fig.delaxes(axes[j])\n    \n    plt.tight_layout()\n    plt.show()\n\nfor cell_type in cell_types:\n    print(f\"Analyzing cell type: {cell_type}\")\n\n    cells = adata[adata.obs['cell_type'] == cell_type]\n    negative_control = adata[adata.obs['control negative'] == True]\n\n    zero_genes_cells = cells[:, cells.X.sum(axis=0) == 0].var.index.tolist()\n    zero_genes_control = negative_control[:, negative_control.X.sum(axis=0) == 0].var.index.tolist()\n    zero_genes_common = list(set(zero_genes_cells) & set(zero_genes_control))\n    print(f\"Number of genes in common strictly equal to zero: {len(zero_genes_common)}\")\n    print(\"Genes:\", zero_genes_common)\n\n    \n    available_genes = [gene for gene in zero_genes_common if gene in de_train.columns]\n    print(f\"Available genes: {available_genes}\")\n    print(f\"Number of available genes: {len(available_genes)}\")\n\n    if len(available_genes) > 0:\n        duplicates = de_train.duplicated(subset=available_genes).sum()\n        print(f\"Duplicates in de_train for available genes: {duplicates}\")\n\n        plot_gene_distribution(available_genes, de_train)\n    else:\n        print(\"No available genes for analysis.\")\n\n    print(\"-\" * 50)","metadata":{"execution":{"iopub.status.busy":"2023-12-31T12:44:54.817476Z","iopub.execute_input":"2023-12-31T12:44:54.817788Z","iopub.status.idle":"2023-12-31T12:45:02.543080Z","shell.execute_reply.started":"2023-12-31T12:44:54.817762Z","shell.execute_reply":"2023-12-31T12:45:02.541766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport scanpy as sc\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nnegative_control = adata[adata.obs['control negative'] == True]\n\nzero_genes_control = negative_control[:, negative_control.X.sum(axis=0) == 0].var.index.tolist()\n\navailable_genes = [gene for gene in zero_genes_control if gene in de_train.columns]\n\nfiltered_de_train = de_train[available_genes]\n\nconstant_genes = filtered_de_train.nunique() == 1\n\nconstant_genes[constant_genes].index.tolist()","metadata":{"execution":{"iopub.status.busy":"2023-12-31T12:56:06.428395Z","iopub.execute_input":"2023-12-31T12:56:06.428790Z","iopub.status.idle":"2023-12-31T12:56:06.822292Z","shell.execute_reply.started":"2023-12-31T12:56:06.428762Z","shell.execute_reply":"2023-12-31T12:56:06.821581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\nde_train_long = de_train.melt(id_vars=[\"cell_type\", \"sm_name\"], \n                              var_name=\"gene\", value_name=\"expression_change\")\n\ngrouped_data = de_train_long.groupby([\"sm_name\", \"cell_type\", \"expression_change\"]).size().reset_index(name='count')\n\nduplicate_values = grouped_data[grouped_data['count'] > 1]\n\nduplicate_values\n","metadata":{"execution":{"iopub.status.busy":"2023-12-31T12:52:13.164535Z","iopub.execute_input":"2023-12-31T12:52:13.164862Z","iopub.status.idle":"2023-12-31T12:53:48.287258Z","shell.execute_reply.started":"2023-12-31T12:52:13.164836Z","shell.execute_reply":"2023-12-31T12:53:48.286337Z"},"trusted":true},"execution_count":null,"outputs":[]}]}