{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# What is about ? \n\nHere we create CSV with correspondence of CD-name (used in target dataframe) to Ensembl/Symbol IDs used in features dataframe for Kaggle NIPS2022 competition: https://www.kaggle.com/competitions/open-problems-multimodal \nIt is based on the Excel provided by orgs: \nhttps://www.kaggle.com/competitions/open-problems-multimodal/discussion/354713#1984553\n\nBut we explain certain cavets and add some additional info. \n\nIn the output CSV file: \n\n    column 'CD_name' - name of the CDs;  the names and the order are  exactly as in the target dataframe \n    column 'ID in RNA dataset' - names of RNA in features dataset (if such rna  exists there, otherwise - NAN - there are 114 not nans)\n\nThere are 26 = 6+3+17 exceptions - which are described below where the  correspondence does not exist.\nAnd there 3 antibodies of for isoforms of the protein CD45 which correspond to one gene.\n\n### 6 Mouse/Rat antibodies provided for control \n\n    31  Mouse IgG1, κ isotype\tNaN\tMouse-IgG1\n    32\tMouse IgG2a, κ isotype\tNaN\tMouse-IgG2a\n    33\tMouse IgG2b, κ isotype\tNaN\tMouse-IgG2b\n    34\tRat IgG2b, κ isotype\tNaN\tRat-IgG2b\n    84\tRat IgG1, κ isotype\tNaN\tRat-IgG1\n    85\tRat IgG2a, κ Isotype\tNaN\tRat-IgG2a\n\n### TCR - T cell receptor - which is complex of several proteins - so one particular gene is not assigned\n\n    83\tanti-human TCR α/β\tNaN\tTCR\n    122\tanti-human TCR Vα7.2\tNaN\tTCRVa7.2\n    123\tanti-human TCR Vδ2\tNaN\tTCRVd2\n\n### 17 proteins - rna is not provided for them in the main train data - may be too low expressed and was filtered out \n\n    ENSG00000153563 0 CD8\n    ENSG00000203747 0 CD16\n    ENSG00000188389 0 CD279\n    ENSG00000181847 0 TIGIT\n    ENSG00000162493 0 Podoplanin\n    \n    ENSG00000110448 0 CD5\n    ENSG00000112486 0 CD196\n    ENSG00000163599 0 CD152\n    ENSG00000213809 0 CD314\n    ENSG00000109956 0 CD57\n    \n    ENSG00000186265 0 CD272\n    ENSG00000088827 0 CD169\n    ENSG00000178562 0 CD28\n    ENSG00000125498 0 CD158\n    ENSG00000135318 0 CD73\n    \n    ENSG00000243772 0 CD158b\n    ENSG00000167633 0 CD158e1\n\n\n### Also note that 3 antobodies (CD45, CD45RA , CD45RO) correspond to 1 gene - because of catching different isoforms \n\n    \n\n    17\tB0063\tanti-human CD45RA\tHI100\tTCAATCCTTCCGCTT\tENSG00000081237\tNaN\n    28\tB0087\tanti-human CD45RO\tUCHL1\tCTCCGAATCATGTTG\tENSG00000081237\tNaN\n    106\tB0391\tanti-human CD45\tHI30\tTGCAATTACCCGGAT\tENSG00000081237\tNaN\n\n","metadata":{}},{"cell_type":"code","source":"# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:03.800788Z","iopub.execute_input":"2022-12-20T15:00:03.801395Z","iopub.status.idle":"2022-12-20T15:00:03.877932Z","shell.execute_reply.started":"2022-12-20T15:00:03.801362Z","shell.execute_reply":"2022-12-20T15:00:03.876918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ndf_rna = pd.read_hdf('/kaggle/input/open-problems-multimodal/train_cite_inputs.h5', stop= 5 )\ndisplay(df_rna) \ndf_y = pd.read_hdf('/kaggle/input/open-problems-multimodal/train_cite_targets.h5')\ndisplay(df_y)\n\n\n# Excel provided by orgs: \n# https://www.kaggle.com/competitions/open-problems-multimodal/discussion/354713#1984553\nfn1 = '/kaggle/input/research-project-01-around-multimodal-singlecell/TotalSeq_B_Universal_Cocktail_v1_140_Antibodies_399904_Barcodes.xlsx'\ndf_names = pd.read_excel(fn1)\ndf_names = df_names.rename(columns={\"Ensemble ID\": \"Ensembl ID\"})\ndisplay(df_names)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:03.879663Z","iopub.execute_input":"2022-12-20T15:00:03.879986Z","iopub.status.idle":"2022-12-20T15:00:05.509360Z","shell.execute_reply.started":"2022-12-20T15:00:03.879957Z","shell.execute_reply":"2022-12-20T15:00:05.508194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print( df_names['Ensembl ID'].value_counts().head(3) )\nm = df_names['Ensembl ID'] == 'ENSG00000081237'\ndf_names[m]","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:05.510601Z","iopub.execute_input":"2022-12-20T15:00:05.510899Z","iopub.status.idle":"2022-12-20T15:00:05.531055Z","shell.execute_reply.started":"2022-12-20T15:00:05.510872Z","shell.execute_reply":"2022-12-20T15:00:05.529943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Look on protein/gene names","metadata":{}},{"cell_type":"code","source":"%%time\nprint(list(df_y.columns))\nlist_genes = [t.split('_')[1] for t in df_rna ]\nprint(list_genes[:10])\n\nl1 = []\nl1b = []\nfor t in list(df_y.columns):\n    if 'CD' in t:\n        l1.append(t)\n    else:\n        l1b.append(t)\nprint();print();\nprint('Containing CD ')\nprint(len(l1), l1)        \nprint();print();\nprint('Not containing CD ')\nprint(len(l1b), l1b)        \nprint();print();\n        \n\n\nll = []\nll2 = []\nll1 = []\nfor t in df_y.columns:\n    for k in df_rna.columns:\n        if t ==  k.split('_')[1]:\n            ll.append(k)\n            ll2.append(k.split('_')[0])\n            ll1.append(k.split('_')[1])\nprint('Protein names  found in gene names (RNA part of data) ');\nprint(len(ll1), ll1)            \nprint();\nprint(len(ll), ll)       \nprint();\nprint(len(ll2), ll2)            \n            \n","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:05.534349Z","iopub.execute_input":"2022-12-20T15:00:05.535050Z","iopub.status.idle":"2022-12-20T15:00:06.781698Z","shell.execute_reply.started":"2022-12-20T15:00:05.535009Z","shell.execute_reply":"2022-12-20T15:00:06.780651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Compare table with genes names provided by orgs and proteins names in target dataset - see quite exact match ","metadata":{}},{"cell_type":"code","source":"df_names.head(1)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:06.783089Z","iopub.execute_input":"2022-12-20T15:00:06.783771Z","iopub.status.idle":"2022-12-20T15:00:06.796590Z","shell.execute_reply.started":"2022-12-20T15:00:06.783729Z","shell.execute_reply":"2022-12-20T15:00:06.795489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_res = df_names[['Description', 'Ensembl ID' ]].copy()\ndisplay(df_res.head(1) )\n\nc = 0\ncount_match_problem = 0\nfor i,t in enumerate( list(df_y.columns) ) :\n    count_matches = 0\n    list_matched = []\n    for j,k in enumerate( df_res['Description']):\n        \n        for kk in k.split(' '):\n            if t == kk:\n                count_matches += 1\n                c +=1\n                #print(c, t,kk, k)\n                list_matched.append( (kk, k ) )\n                IX = df_res.index[j]\n                \n    if count_matches != 1:\n        count_match_problem += 1\n        print('Found matches: ',  count_matches, c, t, list_matched )\n        print()\n        #print( )\n    else:\n        df_res.loc[IX,'CD_name'] = t\n        df_res.loc[IX,'Index'] = i\n        \nprint('count_match_problem', count_match_problem)        \n\ndisplay(df_res.head(50))\ndisplay(df_res.tail(50))","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:06.800015Z","iopub.execute_input":"2022-12-20T15:00:06.800451Z","iopub.status.idle":"2022-12-20T15:00:06.937937Z","shell.execute_reply.started":"2022-12-20T15:00:06.800422Z","shell.execute_reply":"2022-12-20T15:00:06.937035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"m = df_res['CD_name'].isnull()\nprint( (df_res[~m].index != df_res[~m]['Index'].values ).sum() )\nprint('Conclusion - order of CD in Excel provided by orgs is exactly the same as in targets dataframe')\nprint('So we can just assigne CD_name column by df_y.columns, and index is the same as  in Excel')\ndf_res2 = df_res.drop('Index', axis = 1)\ndf_res2['CD_name'] = df_y.columns\ndisplay(df_res2.head(50) )\ndisplay(df_res2.tail(50) )","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:06.938972Z","iopub.execute_input":"2022-12-20T15:00:06.939420Z","iopub.status.idle":"2022-12-20T15:00:06.969936Z","shell.execute_reply.started":"2022-12-20T15:00:06.939394Z","shell.execute_reply":"2022-12-20T15:00:06.969013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Just show rows where was problem with match of CD name from df_y to desription in orgs Excel - everything is clear  ')\nm = df_res['CD_name'].isnull()\nprint(m.sum() )\ndisplay(df_res[m] )\ndisplay(df_res2[m] )\n\n","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:06.970925Z","iopub.execute_input":"2022-12-20T15:00:06.971856Z","iopub.status.idle":"2022-12-20T15:00:06.993440Z","shell.execute_reply.started":"2022-12-20T15:00:06.971817Z","shell.execute_reply":"2022-12-20T15:00:06.992485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for t in df_rna.columns:\n    if 'TCR' in t:\n        print(t)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:06.994601Z","iopub.execute_input":"2022-12-20T15:00:06.995235Z","iopub.status.idle":"2022-12-20T15:00:07.004352Z","shell.execute_reply.started":"2022-12-20T15:00:06.995182Z","shell.execute_reply":"2022-12-20T15:00:07.003266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Look on missing ensembl IDs etc","metadata":{}},{"cell_type":"code","source":"df_res2['In RNA dataset'] = 0 \ndf_res2['ID in RNA dataset'] = np.nan \n\nm = df_res2['Ensembl ID'].isnull()\nc = 0\nfor i,t in enumerate(df_res2['Ensembl ID']):\n    if pd.isnull(t): continue\n    count_found = 0\n    for k in df_rna.columns:\n        if t in k: \n            count_found+=1 \n            id_save = k\n    if count_found!=1: \n        print(t, count_found, df_res2['CD_name'].iat[i]); c+=1\n    if count_found >0:\n        df_res2['In RNA dataset'].iat[i] =1 \n        df_res2[ 'ID in RNA dataset'].iat[i] = id_save\n        \n        \nprint('Not found:',c)        \nm = df_res2['In RNA dataset'] == 0\ndisplay(df_res2[m])\nprint(m.sum(), df_res2['In RNA dataset'].sum(), df_res2.shape)        \ndf_res2","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:07.008397Z","iopub.execute_input":"2022-12-20T15:00:07.008716Z","iopub.status.idle":"2022-12-20T15:00:07.611292Z","shell.execute_reply.started":"2022-12-20T15:00:07.008687Z","shell.execute_reply":"2022-12-20T15:00:07.610262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"m = df_res2['Ensembl ID'].isnull()\nprint(m.sum() )\ndf_res2[m]","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:07.612610Z","iopub.execute_input":"2022-12-20T15:00:07.612925Z","iopub.status.idle":"2022-12-20T15:00:07.626881Z","shell.execute_reply.started":"2022-12-20T15:00:07.612897Z","shell.execute_reply":"2022-12-20T15:00:07.625797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## APC anti-human TCR α/β Antibody\n## The IP26 antibody reacts with a monomorphic determinant of the α/β T-cell receptor, which is expressed on greater than 95% of normal peripheral blood CD3+ T cells. The α/β TCR recognizes a peptide bound to MHC leading to T-cell activation.\n\n\n## APC anti-human TCR Vα7.2 Antibody\n## 'antibody recognizes the Vα7.2 T cell antigen receptor (TCR) α-chain segment which, joined with the Jα33 segment, constitutes an invariant TCR that is a characteristic of the mucosal-associated invariant T cells (MAIT cells)'\n\n## PE anti-human TCR Vδ2 Antibody\n## The Vδ2 TCR is a variant of the TCR δ chain expressed on a subset of γ/δ T cells. Vγ9Vδ2 T lymphocytes, a major γ/δ T cell subset in humans, recognize phosphoantigens, certain tumor cells, and cells treated with aminobisphosphonates. This cell population displays cytolytic activity against various tumor cells. The γ/δ TCR is an heterodimeric TCR complex composed of covalently bound γ and δ chains involved in antigen recognition and the non-covalently associated monomorphic proteins CD3δ, γ, ε, and ζ chains.\n","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:07.628310Z","iopub.execute_input":"2022-12-20T15:00:07.628643Z","iopub.status.idle":"2022-12-20T15:00:07.635964Z","shell.execute_reply.started":"2022-12-20T15:00:07.628615Z","shell.execute_reply":"2022-12-20T15:00:07.634849Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for k in df_rna.columns:\n#     if '_TRA' in k:\n#         print(k)\n\n# 'CD247' # \tCD247, CD3-ZETA - part of the TCR complex \n# for k in df_rna.columns:\n#     if 'CD247' in k:\n#         print(k)\n# for k in df_rna.columns:\n#     if 'CD3G' in k:\n#         print(k)        \n# 'ENSG00000160654'   # =  CD3G  \n# for k in df_rna.columns:\n#     if 'ENSG00000160654' in k:\n#         print(k)        \n","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:07.637518Z","iopub.execute_input":"2022-12-20T15:00:07.637891Z","iopub.status.idle":"2022-12-20T15:00:07.649258Z","shell.execute_reply.started":"2022-12-20T15:00:07.637853Z","shell.execute_reply":"2022-12-20T15:00:07.648018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Add addtional information via \"mygene\"","metadata":{}},{"cell_type":"code","source":"!pip install mygene\nimport mygene\n","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:07.650995Z","iopub.execute_input":"2022-12-20T15:00:07.651471Z","iopub.status.idle":"2022-12-20T15:00:20.307364Z","shell.execute_reply.started":"2022-12-20T15:00:07.651432Z","shell.execute_reply":"2022-12-20T15:00:20.306204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nm = df_res2['Ensembl ID'].notnull()\nl_e = list(set(df_res2['Ensembl ID'][m]))\nprint(len(l_e))\n# let us query for two genes - one is given by Ensembl ID, another by entrez id : \n# 'ENSG00000100297' - example ensemble id (for gene  MCM5) , 5111 - example of entrez id (integer number) - for gene PCNA\nmg = mygene.MyGeneInfo()\ng = mg.getgenes( l_e,  fields=['symbol',  'alias',   'name',  'entrezgene' ], species='human'\n               , as_dataframe=True)# [:1000])\ng","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:20.310559Z","iopub.execute_input":"2022-12-20T15:00:20.311468Z","iopub.status.idle":"2022-12-20T15:00:21.963770Z","shell.execute_reply.started":"2022-12-20T15:00:20.311430Z","shell.execute_reply":"2022-12-20T15:00:21.962732Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"g = g.reset_index()\ng.head(1)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:21.965495Z","iopub.execute_input":"2022-12-20T15:00:21.965910Z","iopub.status.idle":"2022-12-20T15:00:21.979795Z","shell.execute_reply.started":"2022-12-20T15:00:21.965869Z","shell.execute_reply":"2022-12-20T15:00:21.978718Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"g2 = g[['query','symbol', 'entrezgene', 'name' , 'alias']]\ng2","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:21.981099Z","iopub.execute_input":"2022-12-20T15:00:21.981680Z","iopub.status.idle":"2022-12-20T15:00:22.000136Z","shell.execute_reply.started":"2022-12-20T15:00:21.981641Z","shell.execute_reply":"2022-12-20T15:00:21.998996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_res2.head(1)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:22.001742Z","iopub.execute_input":"2022-12-20T15:00:22.002067Z","iopub.status.idle":"2022-12-20T15:00:22.015078Z","shell.execute_reply.started":"2022-12-20T15:00:22.002038Z","shell.execute_reply":"2022-12-20T15:00:22.014230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_res3 = df_res2.merge(g2, left_on = 'Ensembl ID', right_on = 'query', how = 'left' )\ndf_res3 = df_res3.drop('query', axis = 1)\ndf_res3 ","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:22.016187Z","iopub.execute_input":"2022-12-20T15:00:22.016499Z","iopub.status.idle":"2022-12-20T15:00:22.051965Z","shell.execute_reply.started":"2022-12-20T15:00:22.016473Z","shell.execute_reply":"2022-12-20T15:00:22.050935Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Perform some check that CD name correspond to symbol either one of aliases obtained by mygene","metadata":{}},{"cell_type":"code","source":"c = 0\nl = []\nfor IX in df_res3.index:\n    e = df_res.loc[IX, 'Ensembl ID']\n    if pd.notnull(e):\n        c += 1\n        cd = df_res3.loc[IX, 'CD_name']\n        checked_passed = False\n        if str(cd).upper() == df_res3.loc[IX, 'symbol'].upper():\n            checked_passed = True\n        if str(cd).upper() in str(df_res3.loc[IX, 'alias']).upper():\n            checked_passed = True\n        if  checked_passed != True:\n            print('Warning:')\n            print(IX, str(cd) )\n            print( df_res3.loc[IX,:] )\n            print()\n            l.append(cd)\n            \n\n            \nprint(c)        \nprint(l)\n\n","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:22.053352Z","iopub.execute_input":"2022-12-20T15:00:22.053832Z","iopub.status.idle":"2022-12-20T15:00:22.079304Z","shell.execute_reply.started":"2022-12-20T15:00:22.053793Z","shell.execute_reply":"2022-12-20T15:00:22.078319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 'Manual inspection shows - everything is Okay with:', \"['HLA-A-B-C', 'CD45RA', 'CD105', 'CD45RO', 'Podoplanin', 'IgM', 'integrinB7', 'IgD', 'LOX-1']\"","metadata":{}},{"cell_type":"code","source":"print('Manual inspection shows - everything is Okay with:', \"['HLA-A-B-C', 'CD45RA', 'CD105', 'CD45RO', 'Podoplanin', 'IgM', 'integrinB7', 'IgD', 'LOX-1']\")","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:22.080456Z","iopub.execute_input":"2022-12-20T15:00:22.080736Z","iopub.status.idle":"2022-12-20T15:00:22.085042Z","shell.execute_reply.started":"2022-12-20T15:00:22.080711Z","shell.execute_reply":"2022-12-20T15:00:22.084207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_res3.head(50)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:22.086171Z","iopub.execute_input":"2022-12-20T15:00:22.086490Z","iopub.status.idle":"2022-12-20T15:00:22.130959Z","shell.execute_reply.started":"2022-12-20T15:00:22.086464Z","shell.execute_reply":"2022-12-20T15:00:22.130012Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_res3.tail(50)","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:22.132198Z","iopub.execute_input":"2022-12-20T15:00:22.132519Z","iopub.status.idle":"2022-12-20T15:00:22.172071Z","shell.execute_reply.started":"2022-12-20T15:00:22.132493Z","shell.execute_reply":"2022-12-20T15:00:22.171128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_res3['ID in RNA dataset'].isnull().sum(), df_res3['ID in RNA dataset'].notnull().sum(), ","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:58.206849Z","iopub.execute_input":"2022-12-20T15:00:58.207586Z","iopub.status.idle":"2022-12-20T15:00:58.216011Z","shell.execute_reply.started":"2022-12-20T15:00:58.207543Z","shell.execute_reply":"2022-12-20T15:00:58.215230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_res3.to_csv('CD_to_EnsemblSymbol_correspondence_NIPS2022.csv')","metadata":{"execution":{"iopub.status.busy":"2022-12-20T15:00:22.182274Z","iopub.execute_input":"2022-12-20T15:00:22.182541Z","iopub.status.idle":"2022-12-20T15:00:22.193052Z","shell.execute_reply.started":"2022-12-20T15:00:22.182516Z","shell.execute_reply":"2022-12-20T15:00:22.192276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}