{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import scanpy as sc\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"AnnData object with n_obs × n_vars = 149926 × 4000\n",
" obs: 'nCount_ADT', 'nFeature_ADT', 'nCount_RNA', 'nFeature_RNA', 'orig.ident', 'lane', 'donor', 'time', 'celltype.l1', 'celltype.l2', 'celltype.l3', 'Phase', 'Batch', 'n_genes', 'n_genes_by_counts', 'log1p_n_genes_by_counts', 'total_counts', 'log1p_total_counts', 'total_counts_mt', 'log1p_total_counts_mt', 'pct_counts_mt'\n",
" var: 'names', 'n_cells', 'mt', 'n_cells_by_counts', 'mean_counts', 'log1p_mean_counts', 'pct_dropout_by_counts', 'total_counts', 'log1p_total_counts', 'highly_variable', 'means', 'dispersions', 'dispersions_norm'\n",
" uns: 'Batch_colors', 'celltype.l1_colors', 'celltype.l2_colors', 'celltype.l3_colors', 'donor_colors', 'neighbors', 'pca', 'umap'\n",
" obsm: 'X_pca', 'X_umap'\n",
" varm: 'PCs'\n",
" layers: 'count'\n",
" obsp: 'connectivities', 'distances'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scrna = sc.read('../data/hao-2020/expressions_hvg.h5ad')\n",
"scrna"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"AnnData object with n_obs × n_vars = 149926 × 228\n",
" obs: 'nCount_ADT', 'nFeature_ADT', 'nCount_RNA', 'nFeature_RNA', 'orig.ident', 'lane', 'donor', 'time', 'celltype.l1', 'celltype.l2', 'celltype.l3', 'Phase', 'Batch', 'n_genes'\n",
" var: 'n_cells'\n",
" uns: 'Batch_colors', 'celltype.l1_colors', 'celltype.l2_colors', 'celltype.l3_colors', 'donor_colors', 'neighbors', 'pca', 'umap'\n",
" obsm: 'X_pca', 'X_umap'\n",
" varm: 'PCs'\n",
" layers: 'count'\n",
" obsp: 'connectivities', 'distances'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cite = sc.read('../data/hao-2020/protein.h5ad')\n",
"cite"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"scrna.obs['cell_type'] = scrna.obs['celltype.l2'].astype('category')\n",
"cite.obs['cell_type'] = cite.obs['celltype.l2'].astype('category')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[66., 15., 37., ..., 8., 20., 50.],\n",
" [ 4., 13., 9., ..., 7., 10., 22.],\n",
" [ 6., 19., 8., ..., 7., 8., 13.],\n",
" ...,\n",
" [24., 5., 13., ..., 2., 2., 15.],\n",
" [43., 4., 24., ..., 6., 7., 75.],\n",
" [30., 7., 31., ..., 4., 2., 54.]], dtype=float32)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cite.layers['count']"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/icb/litinetskaya/miniconda3/envs/multigrate/lib/python3.7/site-packages/anndata/_core/anndata.py:1094: FutureWarning: is_categorical is deprecated and will be removed in a future version. Use is_categorical_dtype instead\n",
" if not is_categorical(df_full[k]):\n",
"/home/icb/litinetskaya/miniconda3/envs/multigrate/lib/python3.7/site-packages/pandas/core/arrays/categorical.py:2487: FutureWarning: The `inplace` parameter in pandas.Categorical.remove_unused_categories is deprecated and will be removed in a future version.\n",
" res = method(*args, **kwargs)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CD4\n",
"CD4\n",
"CD3\n",
"CD56\n",
"CD56\n",
"CD11b\n",
"CD11b\n",
"CD38\n",
"CD38\n",
"CD44\n",
"CD44\n",
"CD26\n",
"CD26\n",
"CD275\n",
"CD275\n",
"CD45\n",
"CD45\n",
"CD133\n",
"CD133\n",
"CD3\n",
"CD138\n",
"CD138\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>CD39</th>\n",
" <th>Rat-IgG1-1</th>\n",
" <th>CD107a</th>\n",
" <th>CD62P</th>\n",
" <th>TCR-2</th>\n",
" <th>CD30</th>\n",
" <th>CD31</th>\n",
" <th>CD34</th>\n",
" <th>CD35</th>\n",
" <th>CD36</th>\n",
" <th>...</th>\n",
" <th>CD119</th>\n",
" <th>CD169</th>\n",
" <th>CD28</th>\n",
" <th>CD161</th>\n",
" <th>CD163</th>\n",
" <th>CD138</th>\n",
" <th>CD164</th>\n",
" <th>CD144</th>\n",
" <th>CD202b</th>\n",
" <th>CD11c</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>L1_AAACCCAAGAAACTCA</th>\n",
" <td>66.0</td>\n",
" <td>15.0</td>\n",
" <td>37.0</td>\n",
" <td>142.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>242.0</td>\n",
" <td>9.0</td>\n",
" <td>752.0</td>\n",
" <td>14.0</td>\n",
" <td>...</td>\n",
" <td>28.0</td>\n",
" <td>5.0</td>\n",
" <td>31.0</td>\n",
" <td>3.0</td>\n",
" <td>13.0</td>\n",
" <td>14.0</td>\n",
" <td>5.0</td>\n",
" <td>8.0</td>\n",
" <td>20.0</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>L1_AAACCCAAGACATACA</th>\n",
" <td>4.0</td>\n",
" <td>13.0</td>\n",
" <td>9.0</td>\n",
" <td>66.0</td>\n",
" <td>34.0</td>\n",
" <td>3.0</td>\n",
" <td>44.0</td>\n",
" <td>5.0</td>\n",
" <td>57.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>6.0</td>\n",
" <td>4.0</td>\n",
" <td>61.0</td>\n",
" <td>12.0</td>\n",
" <td>8.0</td>\n",
" <td>7.0</td>\n",
" <td>1.0</td>\n",
" <td>7.0</td>\n",
" <td>10.0</td>\n",
" <td>22.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>L1_AAACCCACAACTGGTT</th>\n",
" <td>6.0</td>\n",
" <td>19.0</td>\n",
" <td>8.0</td>\n",
" <td>94.0</td>\n",
" <td>10.0</td>\n",
" <td>9.0</td>\n",
" <td>103.0</td>\n",
" <td>4.0</td>\n",
" <td>60.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>5.0</td>\n",
" <td>37.0</td>\n",
" <td>0.0</td>\n",
" <td>6.0</td>\n",
" <td>18.0</td>\n",
" <td>1.0</td>\n",
" <td>7.0</td>\n",
" <td>8.0</td>\n",
" <td>13.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>L1_AAACCCACACGTACTA</th>\n",
" <td>5.0</td>\n",
" <td>5.0</td>\n",
" <td>6.0</td>\n",
" <td>79.0</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>60.0</td>\n",
" <td>7.0</td>\n",
" <td>56.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>6.0</td>\n",
" <td>1.0</td>\n",
" <td>19.0</td>\n",
" <td>8.0</td>\n",
" <td>10.0</td>\n",
" <td>18.0</td>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>10.0</td>\n",
" <td>13.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>L1_AAACCCACAGCATACT</th>\n",
" <td>4.0</td>\n",
" <td>10.0</td>\n",
" <td>14.0</td>\n",
" <td>115.0</td>\n",
" <td>10.0</td>\n",
" <td>4.0</td>\n",
" <td>169.0</td>\n",
" <td>6.0</td>\n",
" <td>73.0</td>\n",
" <td>5.0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>4.0</td>\n",
" <td>46.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>16.0</td>\n",
" <td>1.0</td>\n",
" <td>5.0</td>\n",
" <td>13.0</td>\n",
" <td>12.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>E2L8_TTTGTTGGTCGTGATT</th>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>11.0</td>\n",
" <td>59.0</td>\n",
" <td>17.0</td>\n",
" <td>1.0</td>\n",
" <td>52.0</td>\n",
" <td>6.0</td>\n",
" <td>24.0</td>\n",
" <td>1.0</td>\n",
" <td>...</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>26.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>6.0</td>\n",
" <td>3.0</td>\n",
" <td>5.0</td>\n",
" <td>10.0</td>\n",
" <td>7.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>E2L8_TTTGTTGGTGTGCCTG</th>\n",
" <td>49.0</td>\n",
" <td>10.0</td>\n",
" <td>38.0</td>\n",
" <td>256.0</td>\n",
" <td>11.0</td>\n",
" <td>1.0</td>\n",
" <td>188.0</td>\n",
" <td>6.0</td>\n",
" <td>519.0</td>\n",
" <td>14.0</td>\n",
" <td>...</td>\n",
" <td>18.0</td>\n",
" <td>26.0</td>\n",
" <td>16.0</td>\n",
" <td>0.0</td>\n",
" <td>13.0</td>\n",
" <td>16.0</td>\n",
" <td>11.0</td>\n",
" <td>5.0</td>\n",
" <td>6.0</td>\n",
" <td>90.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>E2L8_TTTGTTGGTTAGTTCG</th>\n",
" <td>24.0</td>\n",
" <td>5.0</td>\n",
" <td>13.0</td>\n",
" <td>78.0</td>\n",
" <td>4.0</td>\n",
" <td>4.0</td>\n",
" <td>37.0</td>\n",
" <td>5.0</td>\n",
" <td>851.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>12.0</td>\n",
" <td>1.0</td>\n",
" <td>14.0</td>\n",
" <td>1.0</td>\n",
" <td>5.0</td>\n",
" <td>9.0</td>\n",
" <td>23.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>15.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>E2L8_TTTGTTGGTTGGCTAT</th>\n",
" <td>43.0</td>\n",
" <td>4.0</td>\n",
" <td>24.0</td>\n",
" <td>287.0</td>\n",
" <td>8.0</td>\n",
" <td>3.0</td>\n",
" <td>181.0</td>\n",
" <td>14.0</td>\n",
" <td>96.0</td>\n",
" <td>4.0</td>\n",
" <td>...</td>\n",
" <td>12.0</td>\n",
" <td>14.0</td>\n",
" <td>19.0</td>\n",
" <td>7.0</td>\n",
" <td>8.0</td>\n",
" <td>20.0</td>\n",
" <td>2.0</td>\n",
" <td>6.0</td>\n",
" <td>7.0</td>\n",
" <td>75.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>E2L8_TTTGTTGTCTCATGGA</th>\n",
" <td>30.0</td>\n",
" <td>7.0</td>\n",
" <td>31.0</td>\n",
" <td>146.0</td>\n",
" <td>10.0</td>\n",
" <td>1.0</td>\n",
" <td>194.0</td>\n",
" <td>5.0</td>\n",
" <td>274.0</td>\n",
" <td>6.0</td>\n",
" <td>...</td>\n",
" <td>9.0</td>\n",
" <td>7.0</td>\n",
" <td>21.0</td>\n",
" <td>2.0</td>\n",
" <td>7.0</td>\n",
" <td>12.0</td>\n",
" <td>6.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>54.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>149926 rows × 217 columns</p>\n",
"</div>"
],
"text/plain": [
" CD39 Rat-IgG1-1 CD107a CD62P TCR-2 CD30 CD31 \\\n",
"L1_AAACCCAAGAAACTCA 66.0 15.0 37.0 142.0 4.0 3.0 242.0 \n",
"L1_AAACCCAAGACATACA 4.0 13.0 9.0 66.0 34.0 3.0 44.0 \n",
"L1_AAACCCACAACTGGTT 6.0 19.0 8.0 94.0 10.0 9.0 103.0 \n",
"L1_AAACCCACACGTACTA 5.0 5.0 6.0 79.0 10.0 0.0 60.0 \n",
"L1_AAACCCACAGCATACT 4.0 10.0 14.0 115.0 10.0 4.0 169.0 \n",
"... ... ... ... ... ... ... ... \n",
"E2L8_TTTGTTGGTCGTGATT 1.0 2.0 11.0 59.0 17.0 1.0 52.0 \n",
"E2L8_TTTGTTGGTGTGCCTG 49.0 10.0 38.0 256.0 11.0 1.0 188.0 \n",
"E2L8_TTTGTTGGTTAGTTCG 24.0 5.0 13.0 78.0 4.0 4.0 37.0 \n",
"E2L8_TTTGTTGGTTGGCTAT 43.0 4.0 24.0 287.0 8.0 3.0 181.0 \n",
"E2L8_TTTGTTGTCTCATGGA 30.0 7.0 31.0 146.0 10.0 1.0 194.0 \n",
"\n",
" CD34 CD35 CD36 ... CD119 CD169 CD28 CD161 \\\n",
"L1_AAACCCAAGAAACTCA 9.0 752.0 14.0 ... 28.0 5.0 31.0 3.0 \n",
"L1_AAACCCAAGACATACA 5.0 57.0 0.0 ... 6.0 4.0 61.0 12.0 \n",
"L1_AAACCCACAACTGGTT 4.0 60.0 2.0 ... 2.0 5.0 37.0 0.0 \n",
"L1_AAACCCACACGTACTA 7.0 56.0 1.0 ... 6.0 1.0 19.0 8.0 \n",
"L1_AAACCCACAGCATACT 6.0 73.0 5.0 ... 2.0 4.0 46.0 0.0 \n",
"... ... ... ... ... ... ... ... ... \n",
"E2L8_TTTGTTGGTCGTGATT 6.0 24.0 1.0 ... 6.0 0.0 26.0 0.0 \n",
"E2L8_TTTGTTGGTGTGCCTG 6.0 519.0 14.0 ... 18.0 26.0 16.0 0.0 \n",
"E2L8_TTTGTTGGTTAGTTCG 5.0 851.0 4.0 ... 12.0 1.0 14.0 1.0 \n",
"E2L8_TTTGTTGGTTGGCTAT 14.0 96.0 4.0 ... 12.0 14.0 19.0 7.0 \n",
"E2L8_TTTGTTGTCTCATGGA 5.0 274.0 6.0 ... 9.0 7.0 21.0 2.0 \n",
"\n",
" CD163 CD138 CD164 CD144 CD202b CD11c \n",
"L1_AAACCCAAGAAACTCA 13.0 14.0 5.0 8.0 20.0 50.0 \n",
"L1_AAACCCAAGACATACA 8.0 7.0 1.0 7.0 10.0 22.0 \n",
"L1_AAACCCACAACTGGTT 6.0 18.0 1.0 7.0 8.0 13.0 \n",
"L1_AAACCCACACGTACTA 10.0 18.0 0.0 3.0 10.0 13.0 \n",
"L1_AAACCCACAGCATACT 1.0 16.0 1.0 5.0 13.0 12.0 \n",
"... ... ... ... ... ... ... \n",
"E2L8_TTTGTTGGTCGTGATT 2.0 6.0 3.0 5.0 10.0 7.0 \n",
"E2L8_TTTGTTGGTGTGCCTG 13.0 16.0 11.0 5.0 6.0 90.0 \n",
"E2L8_TTTGTTGGTTAGTTCG 5.0 9.0 23.0 2.0 2.0 15.0 \n",
"E2L8_TTTGTTGGTTGGCTAT 8.0 20.0 2.0 6.0 7.0 75.0 \n",
"E2L8_TTTGTTGTCTCATGGA 7.0 12.0 6.0 4.0 2.0 54.0 \n",
"\n",
"[149926 rows x 217 columns]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"protein_df = pd.DataFrame(index=cite.obs_names)\n",
"ref_proteins = cite.var_names\n",
"for p in ref_proteins:\n",
" if p.split(\"-\")[-1] == \"1\" or p.split(\"-\")[-1] == \"2\":\n",
" root = p.split(\"-\")[0]\n",
" if root not in [\"Notch\", \"TCR\"]:\n",
" try:\n",
" protein_df[root] = (\n",
" cite[:, root + \"-1\"].layers['count']\n",
" + cite[:, root + \"-2\"].layers['count']\n",
" )\n",
" print(root)\n",
" except:\n",
" protein_df[p] = cite[:, p].layers['count']\n",
" else:\n",
" protein_df[p] = cite[:, p].layers['count']\n",
" else:\n",
" protein_df[p] = cite[:, p].layers['count']\n",
"protein_df"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"AnnData object with n_obs × n_vars = 149926 × 217\n",
" obs: 'nCount_ADT', 'nFeature_ADT', 'nCount_RNA', 'nFeature_RNA', 'orig.ident', 'lane', 'donor', 'time', 'celltype.l1', 'celltype.l2', 'celltype.l3', 'Phase', 'Batch', 'n_genes', 'cell_type'"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cite_new = sc.AnnData(protein_df.to_numpy())\n",
"cite_new.obs = cite.obs.copy()\n",
"cite_new"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"cite_new.layers['count'] = cite_new.X.copy()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def clr_normalize_each_cell(adata, inplace=True):\n",
" \"\"\"Normalize count vector for each cell, i.e. for each row of .X\"\"\"\n",
"\n",
" import numpy as np\n",
" import scipy\n",
"\n",
" def seurat_clr(x):\n",
" # TODO: support sparseness\n",
" s = np.sum(np.log1p(x[x > 0]))\n",
" exp = np.exp(s / len(x))\n",
" return np.log1p(x / exp)\n",
"\n",
" if not inplace:\n",
" adata = adata.copy()\n",
"\n",
" # apply to dense or sparse matrix, along axis. returns dense matrix\n",
" adata.X = np.apply_along_axis(\n",
" seurat_clr, 1, (adata.X.A if scipy.sparse.issparse(adata.X) else adata.X)\n",
" )\n",
" return adata"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"cite_new = clr_normalize_each_cell(cite_new)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/icb/litinetskaya/miniconda3/envs/multigrate/lib/python3.7/site-packages/anndata/_core/anndata.py:1094: FutureWarning: is_categorical is deprecated and will be removed in a future version. Use is_categorical_dtype instead\n",
" if not is_categorical(df_full[k]):\n",
"/home/icb/litinetskaya/miniconda3/envs/multigrate/lib/python3.7/site-packages/pandas/core/arrays/categorical.py:2487: FutureWarning: The `inplace` parameter in pandas.Categorical.remove_unused_categories is deprecated and will be removed in a future version.\n",
" res = method(*args, **kwargs)\n"
]
}
],
"source": [
"adata1 = scrna[scrna.obs.Batch == 'Batch1']\n",
"adata2 = scrna[scrna.obs.Batch == 'Batch2']"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"cite1 = cite_new[cite_new.obs.Batch == 'Batch1']\n",
"cite2 = cite_new[cite_new.obs.Batch == 'Batch2']"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/icb/litinetskaya/miniconda3/envs/multigrate/lib/python3.7/site-packages/anndata/_core/anndata.py:1192: FutureWarning: is_categorical is deprecated and will be removed in a future version. Use is_categorical_dtype instead\n",
" if is_string_dtype(df[key]) and not is_categorical(df[key])\n"
]
}
],
"source": [
"adata1.write('../data/hao-2020/adata1.h5ad')\n",
"adata2.write('../data/hao-2020/adata2.h5ad')\n",
"cite1.write('../data/hao-2020/cite1.h5ad')\n",
"cite2.write('../data/hao-2020/cite2.h5ad')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}