{"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\nhttps://github.com/cran2367/sgt/tree/master/python\n\nSequence Graph Transform (SGT) — Sequence Embedding for Clustering, Classification, and Search. \n\nThe notebook generates emebeddings, results are collected in the dataset: https://www.kaggle.com/datasets/alexandervc/cafa5-sgt-protein-embeddings\n\n\nEmbedder for sequences. Appeared before large protein language models, so probably less powerful.\nNevertheless it  seems useful to know it exists and github contains applications which might be useful for CAFA5.\n\nWe need train the embedder on our sequences.\n\nTraining on the entire dataset and transforming it - will break Kaggle timelimit 12 hours. \n\nSo we will \"fit\" embedder on some part of seqences and apply \"transform\" to train and test.\nWe will choose that subset randomly thus we can generated various embeddings in that way. \nA kind of \"feature engineering\" for free. \n\n\nParams for the size of the corpus for fitting :\n\n    n_sequences_to_include_in_fit_stage_train = \n    n_sequences_to_include_in_fit_stage_test = \n","metadata":{}},{"cell_type":"markdown","source":"Some technical details:\n\nTime consumption for \"transform\" seems does not depend on the size of the corpus used for \"fit\" - that is important for our limited execution time scenrio. \n\nTime consumtion for \"fit\" is linear in sequences number: \n\n    # 40sec - 400 seqs \n    # 80sec - 800 seqs \n    # 140sec - 1600 seqs\n    # 600sec=10min - 6400 seqs\n    # 1200sec=20min - 12800 seqs\n    # 2400sec=40min - 25600 seqs\n\nTime consumption for \"transform\":\n\n    # when fitted on 340 samples: \n    #     4.76secs - 100 seqs\n    #     32 secs - 200 seqs\n    #     42.6 secs - 400 seqs  # From here grow is more or less linear , although faster \n    #     1min 28s - 800 \n    #     3min 6s - 1600 \n    #     8min 27s - 5000\n    #     15min 41s - 10_000\n\n    # When fitted on 4000 seqs: So transform does not depend on the fit size corpus - that is great. \n    # 8 min - 5000     ","metadata":{}},{"cell_type":"markdown","source":"# Key params","metadata":{}},{"cell_type":"code","source":"## for 15_000 run-time is about 9 hours - see notebook versions 11,12 \nn_sequences_to_include_in_fit_stage_train = 15_000\nn_sequences_to_include_in_fit_stage_test = 15_000\n\ndebug_n_seqs_to_transform = 150_000 # Set to 150_000 or more to process full data . Smaller values used only for debug. \n\n","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:13.803417Z","iopub.execute_input":"2023-04-30T16:55:13.804846Z","iopub.status.idle":"2023-04-30T16:55:13.838483Z","shell.execute_reply.started":"2023-04-30T16:55:13.804792Z","shell.execute_reply":"2023-04-30T16:55:13.836564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" # This Python 3 environment comes with many helpful analytics libraries installed\n# 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 time\nt0start = time.time() \n\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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-30T16:55:13.84129Z","iopub.execute_input":"2023-04-30T16:55:13.841777Z","iopub.status.idle":"2023-04-30T16:55:13.86225Z","shell.execute_reply.started":"2023-04-30T16:55:13.841732Z","shell.execute_reply":"2023-04-30T16:55:13.860777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# SGT toy examples ","metadata":{}},{"cell_type":"code","source":"%%time\n!pip install sgt\n# https://github.com/cran2367/sgt/tree/master/python\n# Sequence Graph Transform (SGT) — Sequence Embedding for Clustering, Classification, and Search    \n\n# not all works from here: \n# https://towardsdatascience.com/sequence-embedding-for-clustering-and-classification-f816a66373fb\n","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:13.863846Z","iopub.execute_input":"2023-04-30T16:55:13.86515Z","iopub.status.idle":"2023-04-30T16:55:28.027411Z","shell.execute_reply.started":"2023-04-30T16:55:13.865086Z","shell.execute_reply":"2023-04-30T16:55:28.025773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nfrom sgt import SGT\nsgt = SGT(flatten=False)\nsequence = np.array([\"B\",\"B\",\"A\",\"C\",\"A\",\"C\",\"A\",\"A\",\"B\",\"A\"])\nsgt.fit(sequence)","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.030733Z","iopub.execute_input":"2023-04-30T16:55:28.031133Z","iopub.status.idle":"2023-04-30T16:55:28.073457Z","shell.execute_reply.started":"2023-04-30T16:55:28.031094Z","shell.execute_reply":"2023-04-30T16:55:28.07215Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# SGT embedding to a vector. The vector\n# embedding is useful for directly applying\n# a machine learning algorithm.\n\nsgt = SGT(flatten=True)\nsequence = np.array([\"B\",\"B\",\"A\",\"C\",\"A\",\"C\",\"A\",\"A\",\"B\",\"A\"])\nsgt.fit(sequence)","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.074958Z","iopub.execute_input":"2023-04-30T16:55:28.075339Z","iopub.status.idle":"2023-04-30T16:55:28.089849Z","shell.execute_reply.started":"2023-04-30T16:55:28.075306Z","shell.execute_reply":"2023-04-30T16:55:28.088704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nSGT embedding on a corpus of sequences.\nTest the two processing modes within the\nSGT class: 'default', 'multiprocessing'.\n\n'''\n\n# A sample corpus of two sequences.\ncorpus = pd.DataFrame([[1, [\"B\",\"B\",\"A\",\"C\",\"A\",\"C\",\"A\",\"A\",\"B\",\"A\"]], \n                       [2, [\"C\", \"Z\", \"Z\", \"Z\", \"D\"]]], \n                      columns=['id', 'sequence'])\ncorpus","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.090831Z","iopub.execute_input":"2023-04-30T16:55:28.091157Z","iopub.status.idle":"2023-04-30T16:55:28.111121Z","shell.execute_reply.started":"2023-04-30T16:55:28.091126Z","shell.execute_reply":"2023-04-30T16:55:28.109926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Corpus embeding example - that is what we need :","metadata":{}},{"cell_type":"code","source":"# Learning the sgt embeddings as vector for\n# all sequences in a corpus.\n# mode: 'default'\nsgt = SGT(kappa=1, \n          flatten=True, \n          lengthsensitive=False, \n          mode='default')\nsgt.fit_transform(corpus)","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.112696Z","iopub.execute_input":"2023-04-30T16:55:28.11316Z","iopub.status.idle":"2023-04-30T16:55:28.156923Z","shell.execute_reply.started":"2023-04-30T16:55:28.113113Z","shell.execute_reply":"2023-04-30T16:55:28.155653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Apply computed embedding ","metadata":{}},{"cell_type":"code","source":"corpus2 = pd.DataFrame([[1, [\"B\",\"B\",\"A\",\"C\",\"A\",\"C\",\"A\",\"A\",\"B\",\"A\", \"Z\", \"Z\", \"D\" ]], \n                       [2, [\"C\", \"Z\", \"Z\"]],\n                       [3, [\"A\", \"B\", \"C\",'A']] ], \n                      columns=['id', 'sequence'])\nsgt.transform(corpus2)","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.160912Z","iopub.execute_input":"2023-04-30T16:55:28.161318Z","iopub.status.idle":"2023-04-30T16:55:28.204296Z","shell.execute_reply.started":"2023-04-30T16:55:28.161269Z","shell.execute_reply":"2023-04-30T16:55:28.203001Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Compute with multiprocessing ","metadata":{}},{"cell_type":"code","source":"# Learning the sgt embeddings as vector for\n# all sequences in a corpus.\n# mode: 'multiprocessing'\n\nimport pandarallel  # required library for multiprocessing\n\nsgt = SGT(kappa=1, \n          flatten=True, \n          lengthsensitive=False,\n          mode='multiprocessing')\n\nsgt.fit_transform(corpus)","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.207756Z","iopub.execute_input":"2023-04-30T16:55:28.208149Z","iopub.status.idle":"2023-04-30T16:55:28.374909Z","shell.execute_reply.started":"2023-04-30T16:55:28.208114Z","shell.execute_reply":"2023-04-30T16:55:28.372959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ncorpus2 = pd.DataFrame([[1, [\"B\",\"B\",\"A\",\"C\",\"A\",\"C\",\"A\",\"A\",\"B\",\"A\", \"Z\", \"Z\", \"D\" ]], \n                       [2, [\"C\", \"Z\", \"Z\"]],\n                       [3, [\"A\", \"B\", \"C\",'A']] ], \n                      columns=['id', 'sequence'])\nsgt.transform(corpus2)","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.377628Z","iopub.execute_input":"2023-04-30T16:55:28.378606Z","iopub.status.idle":"2023-04-30T16:55:28.509346Z","shell.execute_reply.started":"2023-04-30T16:55:28.378552Z","shell.execute_reply":"2023-04-30T16:55:28.507676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CAFA5 data","metadata":{}},{"cell_type":"markdown","source":"# Prepare corpus","metadata":{}},{"cell_type":"markdown","source":"## We need to include in the train part of the corpus sequences with all possible letters - otherwise we crash on \"transform\" stage  ","metadata":{}},{"cell_type":"code","source":"%%time\nfrom Bio import SeqIO\n\nfn = '/kaggle/input/cafa-5-protein-function-prediction/Train/train_sequences.fasta'\n# fn = '/kaggle/input/cafa-5-protein-function-prediction/Test (Targets)/testsuperset.fasta'\nsequences = SeqIO.parse(fn, \"fasta\")\n\ndf_corpus = pd.DataFrame( columns=['id', 'sequence']); IX = 0\n\nvery_rare_letters = ['Z','B','O']\nrare_letters = ['U','X']\n\nl = []\nfor let in very_rare_letters:\n    sequences = SeqIO.parse(fn, \"fasta\")\n    for seq in sequences:\n        if let in seq.seq:\n            df_corpus.loc[IX,'id'] = seq.id\n            df_corpus.loc[IX,'sequence'] = list(seq)\n            l.append( len(seq.seq) )\n            IX += 1\nprint(df_corpus.shape)        \ndisplay( df_corpus) \nprint(df_corpus['id'].to_list() )\nprint(l)\nfor let in rare_letters:\n    sequences = SeqIO.parse(fn, \"fasta\")\n    ii = 0\n    for seq in sequences:\n        if let in seq.seq:\n            df_corpus.loc[IX,'id'] = seq.id\n            df_corpus.loc[IX,'sequence'] = list(seq)\n            l.append( len(seq.seq) )\n            IX += 1\n            ii += 1\n            if ii >= 100: break \nprint(df_corpus.shape)        \ndisplay( df_corpus) \nprint(df_corpus['id'].to_list() )\nprint(l)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:28.511804Z","iopub.execute_input":"2023-04-30T16:55:28.512238Z","iopub.status.idle":"2023-04-30T16:55:38.223374Z","shell.execute_reply.started":"2023-04-30T16:55:28.512191Z","shell.execute_reply":"2023-04-30T16:55:38.221935Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Add some random sequences to the corpus from the train/test ","metadata":{}},{"cell_type":"code","source":"%%time\n\n####### Add  sequences from the train : \n\nn_sequences_to_include_in_fit_stage_loc = n_sequences_to_include_in_fit_stage_train - len(df_corpus)\n\nfn = '/kaggle/input/cafa-5-protein-function-prediction/Train/train_sequences.fasta'\n# fn = '/kaggle/input/cafa-5-protein-function-prediction/Test (Targets)/testsuperset.fasta'\nsequences = SeqIO.parse(fn, \"fasta\")\nN = np.sum( [1 for seq in sequences ] )\n\nsequences = SeqIO.parse(fn, \"fasta\")\nlist_IX = [ np.random.randint(0,N) for i in range( n_sequences_to_include_in_fit_stage_loc )  ]\nfor i,seq in enumerate(sequences):\n    if i not in list_IX: continue \n    df_corpus.loc[IX,'id'] = seq.id\n    df_corpus.loc[IX,'sequence'] = list(seq)\n    IX += 1\nprint(df_corpus.shape)        \ndisplay( df_corpus) \n\n\n####### Add  sequences from test: \n\nn_sequences_to_include_in_fit_stage_loc = n_sequences_to_include_in_fit_stage_test\n\nfn = '/kaggle/input/cafa-5-protein-function-prediction/Train/train_sequences.fasta'\n# fn = '/kaggle/input/cafa-5-protein-function-prediction/Test (Targets)/testsuperset.fasta'\nsequences = SeqIO.parse(fn, \"fasta\")\nN = np.sum( [1 for seq in sequences ] )\n\nsequences = SeqIO.parse(fn, \"fasta\")\nlist_IX = [ np.random.randint(0,N) for i in range( n_sequences_to_include_in_fit_stage_loc )  ]\nfor i,seq in enumerate(sequences):\n    if i not in list_IX: continue \n    df_corpus.loc[IX,'id'] = seq.id\n    df_corpus.loc[IX,'sequence'] = list(seq)\n    IX += 1\nprint(df_corpus.shape)        \ndisplay( df_corpus) \n","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:38.225033Z","iopub.execute_input":"2023-04-30T16:55:38.225444Z","iopub.status.idle":"2023-04-30T16:55:59.325899Z","shell.execute_reply.started":"2023-04-30T16:55:38.225404Z","shell.execute_reply":"2023-04-30T16:55:59.324388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ndf_corpus.to_csv('df_corpus_for_fit_'+str(n_sequences_to_include_in_fit_stage_train)+'_'+str(n_sequences_to_include_in_fit_stage_test)+'.csv')\n","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:59.327915Z","iopub.execute_input":"2023-04-30T16:55:59.328434Z","iopub.status.idle":"2023-04-30T16:55:59.656205Z","shell.execute_reply.started":"2023-04-30T16:55:59.328379Z","shell.execute_reply":"2023-04-30T16:55:59.654557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Fit sgt embedder  on the selected part of the data","metadata":{}},{"cell_type":"code","source":"%%time\n\n# Learning the sgt embeddings as vector for\n# all sequences in a corpus.\n# mode: 'multiprocessing'\n\n# 40sec - 400 seqs \n# 80sec - 800 seqs \n# 140sec - 1600 seqs\n# 6 min - 4000 seqs\n\nimport pandarallel  # required library for multiprocessing\n\nsgt = SGT(kappa=1, \n          flatten=True, \n          lengthsensitive=False,\n          mode='multiprocessing')\n\nembedding = sgt.fit_transform(df_corpus)\nembedding","metadata":{"execution":{"iopub.status.busy":"2023-04-30T16:55:59.65825Z","iopub.execute_input":"2023-04-30T16:55:59.658689Z","iopub.status.idle":"2023-04-30T17:05:29.025104Z","shell.execute_reply.started":"2023-04-30T16:55:59.658635Z","shell.execute_reply":"2023-04-30T17:05:29.023922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%time \n# embedding.set_index('id').to_csv('sgt_embendings.csv')","metadata":{"execution":{"iopub.status.busy":"2023-04-30T17:05:29.02714Z","iopub.execute_input":"2023-04-30T17:05:29.027925Z","iopub.status.idle":"2023-04-30T17:05:29.033778Z","shell.execute_reply.started":"2023-04-30T17:05:29.02787Z","shell.execute_reply":"2023-04-30T17:05:29.032502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Apply sgt transform to the entire test and train ","metadata":{}},{"cell_type":"markdown","source":"## Transform test","metadata":{}},{"cell_type":"code","source":"%%time\nfrom Bio import SeqIO\n\n# fn = '/kaggle/input/cafa-5-protein-function-prediction/Train/train_sequences.fasta'\nfn = '/kaggle/input/cafa-5-protein-function-prediction/Test (Targets)/testsuperset.fasta'\nsequences = SeqIO.parse(fn, \"fasta\")\n\ndf_corpus = pd.DataFrame( columns=['id', 'sequence'])\nIX = 0 \nfor seq in sequences:\n    df_corpus.loc[IX,'id'] = seq.id\n    df_corpus.loc[IX,'sequence'] = list(seq)\n    IX += 1\n    if IX >=debug_n_seqs_to_transform: break\n\nprint(df_corpus.shape)        \ndf_corpus.head(2)        ","metadata":{"execution":{"iopub.status.busy":"2023-04-30T17:05:29.035546Z","iopub.execute_input":"2023-04-30T17:05:29.036105Z","iopub.status.idle":"2023-04-30T17:05:35.755706Z","shell.execute_reply.started":"2023-04-30T17:05:29.036047Z","shell.execute_reply":"2023-04-30T17:05:35.754445Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time \n# when fitted on 340 samples: \n#     4.76secs - 100 seqs\n#     32 secs - 200 seqs\n#     42.6 secs - 400 seqs  # From here grow is more or less linear , although faster \n#     1min 28s - 800 \n#     3min 6s - 1600 \n#     8min 27s - 5000\n#     15min 41s - 10_000\n\n# When fitted on 4000 seqs: So transform does not depend on the fit size corpus - that is great. \n# 8 min - 5000 \n\n# **sec - 5000 seqs \nprint(df_corpus.shape)\nembedding = sgt.transform(df_corpus)\nembedding","metadata":{"execution":{"iopub.status.busy":"2023-04-30T17:05:35.757367Z","iopub.execute_input":"2023-04-30T17:05:35.757751Z","iopub.status.idle":"2023-04-30T17:18:51.599069Z","shell.execute_reply.started":"2023-04-30T17:05:35.757714Z","shell.execute_reply":"2023-04-30T17:18:51.597625Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time \nembedding.set_index('id').to_csv('sgt_embendings_test_'+str(n_sequences_to_include_in_fit_stage_train)+'_'+str(n_sequences_to_include_in_fit_stage_test)+'.csv')","metadata":{"execution":{"iopub.status.busy":"2023-04-30T17:18:51.601277Z","iopub.execute_input":"2023-04-30T17:18:51.601809Z","iopub.status.idle":"2023-04-30T17:18:58.130284Z","shell.execute_reply.started":"2023-04-30T17:18:51.601753Z","shell.execute_reply":"2023-04-30T17:18:58.129046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Apply transform to train","metadata":{}},{"cell_type":"code","source":"%%time\nfrom Bio import SeqIO\n\nfn = '/kaggle/input/cafa-5-protein-function-prediction/Train/train_sequences.fasta'\n# fn = '/kaggle/input/cafa-5-protein-function-prediction/Test (Targets)/testsuperset.fasta'\nsequences = SeqIO.parse(fn, \"fasta\")\n\ndf_corpus = pd.DataFrame( columns=['id', 'sequence'])\nIX = 0 \nfor seq in sequences:\n    df_corpus.loc[IX,'id'] = seq.id\n    df_corpus.loc[IX,'sequence'] = list(seq)\n    IX += 1\n    if IX >=debug_n_seqs_to_transform: break\n\nprint(df_corpus.shape)        \ndf_corpus.head(2)        ","metadata":{"execution":{"iopub.status.busy":"2023-04-30T17:18:58.132132Z","iopub.execute_input":"2023-04-30T17:18:58.132499Z","iopub.status.idle":"2023-04-30T17:19:04.819728Z","shell.execute_reply.started":"2023-04-30T17:18:58.132463Z","shell.execute_reply":"2023-04-30T17:19:04.818508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time \nembedding = sgt.transform(df_corpus)\nembedding","metadata":{"execution":{"iopub.status.busy":"2023-04-30T17:19:04.824477Z","iopub.execute_input":"2023-04-30T17:19:04.825213Z","iopub.status.idle":"2023-04-30T17:30:38.695196Z","shell.execute_reply.started":"2023-04-30T17:19:04.825162Z","shell.execute_reply":"2023-04-30T17:30:38.693875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time \nembedding.set_index('id').to_csv('sgt_embendings_train_'+str(n_sequences_to_include_in_fit_stage_train)+'_'+str(n_sequences_to_include_in_fit_stage_test)+'.csv')","metadata":{"execution":{"iopub.status.busy":"2023-04-30T17:30:38.696907Z","iopub.execute_input":"2023-04-30T17:30:38.697272Z","iopub.status.idle":"2023-04-30T17:30:45.179925Z","shell.execute_reply.started":"2023-04-30T17:30:38.697234Z","shell.execute_reply":"2023-04-30T17:30:45.178602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualisations ","metadata":{}},{"cell_type":"code","source":"%%time\nfrom sklearn.decomposition import PCA\npca = PCA(n_components=5)\nX = embedding.iloc[:,1:]\nr = pca.fit_transform(X)\n\nprint(np.sum(pca.explained_variance_ratio_))\n","metadata":{"execution":{"iopub.status.busy":"2023-04-30T18:12:49.3533Z","iopub.execute_input":"2023-04-30T18:12:49.354117Z","iopub.status.idle":"2023-04-30T18:12:49.790118Z","shell.execute_reply.started":"2023-04-30T18:12:49.35407Z","shell.execute_reply":"2023-04-30T18:12:49.788977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nv4color = df_corpus['sequence'].apply(lambda x: len(x))\nv4color.name = 'sequence length'\n\nprint(r.shape)\n\nfor i,j in [(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)]:\n    sns.scatterplot(x = r[:,i], y = r[:,j], hue = v4color, palette = 'rainbow' )\n    plt.xlabel('PCA'+str(i+1), fontsize = 20)\n    plt.ylabel('PCA'+str(j+1), fontsize = 20)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-30T18:15:15.392193Z","iopub.execute_input":"2023-04-30T18:15:15.392643Z","iopub.status.idle":"2023-04-30T18:15:19.870987Z","shell.execute_reply.started":"2023-04-30T18:15:15.392606Z","shell.execute_reply":"2023-04-30T18:15:19.86934Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nimport umap \n\nr = umap.UMAP().fit_transform(X)\n\n# v4color = df_corpus['sequence'].apply(lambda x: len(x))\n# v4color.name = 'sequence length'\n\nprint(r.shape)\n\nfor i,j in [(0,1)]: # ,(0,2),(0,3),(1,2),(1,3),(2,3)]:\n    sns.scatterplot(x = r[:,i], y = r[:,j], hue = v4color, palette = 'rainbow' )\n    plt.xlabel('UMAP'+str(i+1), fontsize = 20)\n    plt.ylabel('UMAP'+str(j+1), fontsize = 20)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-04-30T18:16:37.875817Z","iopub.execute_input":"2023-04-30T18:16:37.876311Z","iopub.status.idle":"2023-04-30T18:17:51.815403Z","shell.execute_reply.started":"2023-04-30T18:16:37.876274Z","shell.execute_reply":"2023-04-30T18:17:51.813443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('%.1f seconds passed total '%(time.time()-t0start) )","metadata":{},"execution_count":null,"outputs":[]}]}