{
"cells": [
{
"cell_type": "code",
"execution_count": 44,
"id": "8f5d769d",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import os\n",
"import math\n",
"from tabulate import tabulate\n",
"from difflib import SequenceMatcher\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"from collections import defaultdict\n",
"from itertools import chain, combinations\n",
"from fpgrowth_py import fpgrowth\n",
"import time\n",
"\n",
"from dna import dna\n",
"from scov import numpy_image_dict\n",
"from helper import *\n",
"import zlib\n",
"import lzma"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "148b7aad",
"metadata": {},
"outputs": [],
"source": [
"input_file1 = r'./input/China_Seq.txt'"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "a4a1a484",
"metadata": {},
"outputs": [],
"source": [
"input_file2= r'./input/USA_Seq.txt'"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "7cbd52af",
"metadata": {},
"outputs": [],
"source": [
"df_sequence = pd.DataFrame(columns=[\"line no\",\"sequence ratios\"])"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "95a2008d",
"metadata": {},
"outputs": [],
"source": [
"count_lines=0"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "00745df9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" line no | \n",
" sequence ratios | \n",
"
\n",
" \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [line no, sequence ratios]\n",
"Index: []"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_sequence"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "f5281c63",
"metadata": {},
"outputs": [],
"source": [
"current_start_time = time.time()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "52e23471",
"metadata": {},
"outputs": [],
"source": [
"with open(input_file1) as file1, open(input_file2) as file2:\n",
" for lineno, (sequence1, sequence2) in enumerate(zip(file1, file2), 1):\n",
" sequence = SequenceMatcher(a=sequence1 , b=sequence2) #comparing both the strings\n",
" #print(lineno,\" - \",sequence.ratio())\n",
" df_sequence.loc[len(df_sequence.index)] = [lineno,sequence.ratio()]\n",
" df_sequence['line no'] = df_sequence['line no'].astype(int)\n",
" count_lines+=1"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "f814a106",
"metadata": {},
"outputs": [],
"source": [
"current_end_time = time.time()"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "38e12b9d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total Time : 2.0572099685668945\n"
]
}
],
"source": [
"print(\"Total Time :\",current_end_time-current_start_time)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "a4809151",
"metadata": {},
"outputs": [],
"source": [
"df_sequence_missings = df_sequence[df_sequence['sequence ratios']<1]"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "e0e8ea4a",
"metadata": {},
"outputs": [],
"source": [
"length_changed_genome = len(df_sequence_missings)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "466556ad",
"metadata": {},
"outputs": [],
"source": [
"perc_missing_values = (length_changed_genome/count_lines)*100"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "5ebf614e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Percentage of changed Genome Sequence 1.31 %\n"
]
}
],
"source": [
"print(\"Percentage of changed Genome Sequence \",round(perc_missing_values,2),\"%\")"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "cc2854eb",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" line no | \n",
" sequence ratios | \n",
"
\n",
" \n",
" \n",
" \n",
" 121 | \n",
" 122 | \n",
" 0.985915 | \n",
"
\n",
" \n",
" 249 | \n",
" 250 | \n",
" 0.985915 | \n",
"
\n",
" \n",
" 251 | \n",
" 252 | \n",
" 0.985915 | \n",
"
\n",
" \n",
" 254 | \n",
" 255 | \n",
" 0.985915 | \n",
"
\n",
" \n",
" 426 | \n",
" 427 | \n",
" 0.985915 | \n",
"
\n",
" \n",
" 589 | \n",
" 590 | \n",
" 0.985915 | \n",
"
\n",
" \n",
" 601 | \n",
" 602 | \n",
" 0.985915 | \n",
"
\n",
" \n",
" 611 | \n",
" 612 | \n",
" 0.989474 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" line no sequence ratios\n",
"121 122 0.985915\n",
"249 250 0.985915\n",
"251 252 0.985915\n",
"254 255 0.985915\n",
"426 427 0.985915\n",
"589 590 0.985915\n",
"601 602 0.985915\n",
"611 612 0.989474"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_sequence_missings"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "76f8e402",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df_sequence_missings['sequence ratios'].plot(kind='bar')\n",
"\n",
"plt.ylabel(\"Sequence Ration < 1\")\n",
"plt.xlabel(\"Index / Sequence number where genomes are missing\")\n",
"\n",
"#add custom legend to bar chart\n",
"plt.legend(['Index of Missing Sequences'], prop={'size': 20})"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "91e45725",
"metadata": {},
"outputs": [],
"source": [
"sequence1_All=''\n",
"sequence2_All=''"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "a733679d",
"metadata": {},
"outputs": [],
"source": [
"with open(input_file1) as file1:\n",
" for lineno in file1:\n",
" lineno=lineno.strip('\\n')\n",
" sequence1_All+=lineno"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "e04490d5",
"metadata": {},
"outputs": [],
"source": [
"with open(input_file2) as file2:\n",
" for lineno in file2:\n",
" lineno=lineno.strip('\\n')\n",
" sequence2_All+=lineno"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "e6cd0cf4",
"metadata": {},
"outputs": [],
"source": [
"def basic_Analysis(DNAseq):\n",
" total_base = len(DNAseq)\n",
" num_Adenine = DNAseq.count('A')\n",
" num_Guanine = DNAseq.count('G')\n",
" num_Thymine = DNAseq.count('T')\n",
" num_Cytosine = DNAseq.count('C')\n",
" \n",
" if total_base != num_Adenine + num_Guanine + num_Thymine + num_Cytosine:\n",
" print('Something is not right')\n",
" else : pass\n",
" \n",
" A_percent = num_Adenine / total_base\n",
" G_percent = num_Guanine / total_base\n",
" T_percent = num_Thymine / total_base\n",
" C_percent = num_Cytosine / total_base\n",
" \n",
" #visualization\n",
" x = np.arange(4)\n",
" bases = ['Adenine', 'Guanine', 'Thymine' ,'Cytosine']\n",
" values = [num_Adenine, num_Guanine, num_Thymine, num_Cytosine]\n",
" plt.bar(x,values)\n",
" plt.xticks(x, bases)\n",
" plt.show()\n",
" table = [['total base',total_base,'Percentage',str('100%')],\n",
" ['Adenine:',num_Adenine, 'Percentage:',str(round(A_percent*100,2))+'%'],\n",
" ['Guanine:',num_Guanine, 'Percentage:',str(round(G_percent*100,2))+'%'],\n",
" ['Thynime:',num_Thymine, 'Percentage:',str(round(T_percent*100,2))+'%'],\n",
" ['Cytosine:',num_Cytosine, 'Percentage:',str(round(C_percent*100,2))+'%']]\n",
" print(tabulate(table))\n",
" print('GC content:', round((((num_Guanine + num_Cytosine) / total_base)*100),2),'%')"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "b1c5ce22",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"---------- ----- ----------- ------\n",
"total base 42483 Percentage 100%\n",
"Adenine: 12688 Percentage: 29.87%\n",
"Guanine: 8393 Percentage: 19.76%\n",
"Thynime: 13709 Percentage: 32.27%\n",
"Cytosine: 7693 Percentage: 18.11%\n",
"---------- ----- ----------- ------\n",
"GC content: 37.86 %\n"
]
}
],
"source": [
"basic_Analysis(sequence1_All)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "ef963c92",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"---------- ----- ----------- ------\n",
"total base 42483 Percentage 100%\n",
"Adenine: 12686 Percentage: 29.86%\n",
"Guanine: 8394 Percentage: 19.76%\n",
"Thynime: 13713 Percentage: 32.28%\n",
"Cytosine: 7690 Percentage: 18.1%\n",
"---------- ----- ----------- ------\n",
"GC content: 37.86 %\n"
]
}
],
"source": [
"basic_Analysis(sequence2_All)"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "d9f07b3d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" line no | \n",
" sequence ratios | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 607 | \n",
" 608 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 608 | \n",
" 609 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 609 | \n",
" 610 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 610 | \n",
" 611 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" 611 | \n",
" 612 | \n",
" 0.989474 | \n",
"
\n",
" \n",
"
\n",
"
612 rows × 2 columns
\n",
"
"
],
"text/plain": [
" line no sequence ratios\n",
"0 1 1.000000\n",
"1 2 1.000000\n",
"2 3 1.000000\n",
"3 4 1.000000\n",
"4 5 1.000000\n",
".. ... ...\n",
"607 608 1.000000\n",
"608 609 1.000000\n",
"609 610 1.000000\n",
"610 611 1.000000\n",
"611 612 0.989474\n",
"\n",
"[612 rows x 2 columns]"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_sequence"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "f4d0cf89",
"metadata": {},
"outputs": [],
"source": [
"def Fapriori(itemSetList, minSup, minConf):\n",
" C1ItemSet = getItemSetFromList(itemSetList)\n",
" # Final result global frequent itemset\n",
" globalFreqItemSet = dict()\n",
" # Storing global itemset with support count\n",
" globalItemSetWithSup = defaultdict(int)\n",
"\n",
" L1ItemSet = getAboveMinSup(\n",
" C1ItemSet, itemSetList, minSup, globalItemSetWithSup)\n",
" currentLSet = L1ItemSet\n",
" k = 2\n",
"\n",
" # Calculating frequent item set\n",
" while(currentLSet):\n",
" # Storing frequent itemset\n",
" globalFreqItemSet[k-1] = currentLSet\n",
" # Self-joining Lk\n",
" candidateSet = getUnion(currentLSet, k)\n",
" # Perform subset testing and remove pruned supersets\n",
" candidateSet = pruning(candidateSet, currentLSet, k-1)\n",
" # Scanning itemSet for counting support\n",
" currentLSet = getAboveMinSup(\n",
" candidateSet, itemSetList, minSup, globalItemSetWithSup)\n",
" k += 1\n",
"\n",
" rules = FassociationRule(globalFreqItemSet, globalItemSetWithSup, minConf)\n",
" rules.sort(key=lambda x: x[2])\n",
" return globalFreqItemSet, rules"
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "a0f39c52",
"metadata": {},
"outputs": [],
"source": [
"def FaprioriFromFile(fname, minSup, minConf):\n",
" C1ItemSet, itemSetList = getFromFile(fname)\n",
"\n",
" # Final result global frequent itemset\n",
" globalFreqItemSet = dict()\n",
" # Storing global itemset with support count\n",
" globalItemSetWithSup = defaultdict(int)\n",
"\n",
" L1ItemSet = getAboveMinSup(\n",
" C1ItemSet, itemSetList, minSup, globalItemSetWithSup)\n",
" currentLSet = L1ItemSet\n",
" k = 2\n",
"\n",
" # Calculating frequent item set\n",
" while(currentLSet):\n",
" # Storing frequent itemset\n",
" globalFreqItemSet[k-1] = currentLSet\n",
" # Self-joining Lk\n",
" candidateSet = getUnion(currentLSet, k)\n",
" # Perform subset testing and remove pruned supersets\n",
" candidateSet = pruning(candidateSet, currentLSet, k-1)\n",
" # Scanning itemSet for counting support\n",
" currentLSet = getAboveMinSup(\n",
" candidateSet, itemSetList, minSup, globalItemSetWithSup)\n",
" k += 1\n",
"\n",
" rules = associationRule(globalFreqItemSet, globalItemSetWithSup, minConf)\n",
" rules.sort(key=lambda x: x[2])\n",
"\n",
" return globalFreqItemSet, rules"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "8ee83d1e",
"metadata": {},
"outputs": [],
"source": [
"def powerset(s):\n",
" return chain.from_iterable(combinations(s, r) for r in range(1, len(s)))"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "2887a2fe",
"metadata": {},
"outputs": [],
"source": [
"def getFromFile(fname):\n",
" itemSets = []\n",
" itemSet = set()\n",
"\n",
" with open(fname, 'r') as file:\n",
" csv_reader = reader(file)\n",
" for line in csv_reader:\n",
" line = list(filter(None, line))\n",
" record = set(line)\n",
" for item in record:\n",
" itemSet.add(frozenset([item]))\n",
" itemSets.append(record)\n",
" return itemSet, itemSets"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "f9565ada",
"metadata": {},
"outputs": [],
"source": [
"def getAboveMinSup(itemSet, itemSetList, minSup, globalItemSetWithSup):\n",
" freqItemSet = set()\n",
" localItemSetWithSup = defaultdict(int)\n",
"\n",
" for item in itemSet:\n",
" for itemSet in itemSetList:\n",
" if item.issubset(itemSet):\n",
" globalItemSetWithSup[item] += 1\n",
" localItemSetWithSup[item] += 1\n",
"\n",
" for item, supCount in localItemSetWithSup.items():\n",
" support = float(supCount / len(itemSetList))\n",
" if(support >= minSup):\n",
" freqItemSet.add(item)\n",
"\n",
" return freqItemSet"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "e2fb604e",
"metadata": {},
"outputs": [],
"source": [
"def getUnion(itemSet, length):\n",
" return set([i.union(j) for i in itemSet for j in itemSet if len(i.union(j)) == length])"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "13e91051",
"metadata": {},
"outputs": [],
"source": [
"def pruning(candidateSet, prevFreqSet, length):\n",
" tempCandidateSet = candidateSet.copy()\n",
" for item in candidateSet:\n",
" subsets = combinations(item, length)\n",
" for subset in subsets:\n",
" # if the subset is not in previous K-frequent get, then remove the set\n",
" if(frozenset(subset) not in prevFreqSet):\n",
" tempCandidateSet.remove(item)\n",
" break\n",
" return tempCandidateSet"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "9ad0970f",
"metadata": {},
"outputs": [],
"source": [
"def FassociationRule(freqItemSet, itemSetWithSup, minConf):\n",
" rules = []\n",
" for k, itemSet in freqItemSet.items():\n",
" for item in itemSet:\n",
" subsets = powerset(item)\n",
" for s in subsets:\n",
" confidence = float(\n",
" itemSetWithSup[item] / itemSetWithSup[frozenset(s)])\n",
" if(confidence > minConf):\n",
" rules.append([set(s), set(item.difference(s)), confidence])\n",
" return rules"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "3edfe7aa",
"metadata": {},
"outputs": [],
"source": [
"def getItemSetFromList(itemSetList):\n",
" tempItemSet = set()\n",
"\n",
" for itemSet in itemSetList:\n",
" for item in itemSet:\n",
" tempItemSet.add(frozenset([item]))\n",
"\n",
" return tempItemSet"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "9cc11b9c",
"metadata": {},
"outputs": [],
"source": [
"g_sequence1=list()\n",
"g_sequence2=list()"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "b3d26567",
"metadata": {},
"outputs": [],
"source": [
"count=1"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "d1c3ed93",
"metadata": {},
"outputs": [],
"source": [
"with open(input_file1) as file1:\n",
" for lineno in file1:\n",
" if count==3 or count==70 or count ==94 or count==115 or count==130 or count==139 or count==328 or count==415:\n",
" lineno = list(lineno)\n",
" lineno.remove(\"\\n\")\n",
" g_sequence1.append(lineno)\n",
" count+=1\n",
" else:\n",
" count+=1"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "f407841d",
"metadata": {},
"outputs": [],
"source": [
"count1=1"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "4f9d9be5",
"metadata": {},
"outputs": [],
"source": [
"with open(input_file2) as file2:\n",
" for lineno in file2:\n",
" if count1==3 or count1==70 or count1 ==94 or count1==115 or count1==130 or count1==139 or count1==328 or count1==415:\n",
" lineno = list(lineno)\n",
" lineno.remove(\"\\n\")\n",
" g_sequence2.append(lineno)\n",
" count1+=1\n",
" else:\n",
" count1+=1"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "e89764bd",
"metadata": {},
"outputs": [],
"source": [
"freqItemSet, rules = Fapriori(g_sequence1, minSup=.5, minConf=.5)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "853f3736",
"metadata": {},
"outputs": [],
"source": [
"freqItemSet1, rules1 = Fapriori(g_sequence2, minSup=.5, minConf=.5)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "0866f8fc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{1: {frozenset({'G'}), frozenset({'C'}), frozenset({'T'}), frozenset({'A'})}, 2: {frozenset({'A', 'C'}), frozenset({'T', 'A'}), frozenset({'T', 'C'}), frozenset({'G', 'T'}), frozenset({'G', 'C'}), frozenset({'G', 'A'})}, 3: {frozenset({'G', 'A', 'C'}), frozenset({'G', 'T', 'C'}), frozenset({'T', 'A', 'C'}), frozenset({'G', 'T', 'A'})}, 4: {frozenset({'T', 'A', 'G', 'C'})}} [[{'A'}, {'C'}, 1.0], [{'C'}, {'A'}, 1.0], [{'T'}, {'A'}, 1.0], [{'A'}, {'T'}, 1.0], [{'T'}, {'C'}, 1.0], [{'C'}, {'T'}, 1.0], [{'G'}, {'T'}, 1.0], [{'T'}, {'G'}, 1.0], [{'G'}, {'C'}, 1.0], [{'C'}, {'G'}, 1.0], [{'G'}, {'A'}, 1.0], [{'A'}, {'G'}, 1.0], [{'G'}, {'C', 'A'}, 1.0], [{'A'}, {'G', 'C'}, 1.0], [{'C'}, {'G', 'A'}, 1.0], [{'G', 'A'}, {'C'}, 1.0], [{'G', 'C'}, {'A'}, 1.0], [{'C', 'A'}, {'G'}, 1.0], [{'G'}, {'T', 'C'}, 1.0], [{'T'}, {'G', 'C'}, 1.0], [{'C'}, {'G', 'T'}, 1.0], [{'G', 'T'}, {'C'}, 1.0], [{'G', 'C'}, {'T'}, 1.0], [{'T', 'C'}, {'G'}, 1.0], [{'T'}, {'C', 'A'}, 1.0], [{'A'}, {'T', 'C'}, 1.0], [{'C'}, {'T', 'A'}, 1.0], [{'T', 'A'}, {'C'}, 1.0], [{'T', 'C'}, {'A'}, 1.0], [{'C', 'A'}, {'T'}, 1.0], [{'G'}, {'T', 'A'}, 1.0], [{'T'}, {'G', 'A'}, 1.0], [{'A'}, {'G', 'T'}, 1.0], [{'G', 'T'}, {'A'}, 1.0], [{'G', 'A'}, {'T'}, 1.0], [{'T', 'A'}, {'G'}, 1.0], [{'T'}, {'G', 'A', 'C'}, 1.0], [{'A'}, {'G', 'T', 'C'}, 1.0], [{'G'}, {'T', 'A', 'C'}, 1.0], [{'C'}, {'G', 'T', 'A'}, 1.0], [{'T', 'A'}, {'G', 'C'}, 1.0], [{'G', 'T'}, {'C', 'A'}, 1.0], [{'T', 'C'}, {'G', 'A'}, 1.0], [{'G', 'A'}, {'T', 'C'}, 1.0], [{'C', 'A'}, {'G', 'T'}, 1.0], [{'G', 'C'}, {'T', 'A'}, 1.0], [{'G', 'T', 'A'}, {'C'}, 1.0], [{'C', 'T', 'A'}, {'G'}, 1.0], [{'G', 'T', 'C'}, {'A'}, 1.0], [{'C', 'G', 'A'}, {'T'}, 1.0]]\n"
]
}
],
"source": [
"print(freqItemSet,rules)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "a49cba4b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{1: {frozenset({'G'}), frozenset({'C'}), frozenset({'T'}), frozenset({'A'})}, 2: {frozenset({'A', 'C'}), frozenset({'T', 'A'}), frozenset({'T', 'C'}), frozenset({'G', 'T'}), frozenset({'G', 'C'}), frozenset({'G', 'A'})}, 3: {frozenset({'G', 'A', 'C'}), frozenset({'G', 'T', 'C'}), frozenset({'T', 'A', 'C'}), frozenset({'G', 'T', 'A'})}, 4: {frozenset({'T', 'A', 'G', 'C'})}} [[{'A'}, {'C'}, 1.0], [{'C'}, {'A'}, 1.0], [{'T'}, {'A'}, 1.0], [{'A'}, {'T'}, 1.0], [{'T'}, {'C'}, 1.0], [{'C'}, {'T'}, 1.0], [{'G'}, {'T'}, 1.0], [{'T'}, {'G'}, 1.0], [{'G'}, {'C'}, 1.0], [{'C'}, {'G'}, 1.0], [{'G'}, {'A'}, 1.0], [{'A'}, {'G'}, 1.0], [{'G'}, {'C', 'A'}, 1.0], [{'A'}, {'G', 'C'}, 1.0], [{'C'}, {'G', 'A'}, 1.0], [{'G', 'A'}, {'C'}, 1.0], [{'G', 'C'}, {'A'}, 1.0], [{'C', 'A'}, {'G'}, 1.0], [{'G'}, {'T', 'C'}, 1.0], [{'T'}, {'G', 'C'}, 1.0], [{'C'}, {'G', 'T'}, 1.0], [{'G', 'T'}, {'C'}, 1.0], [{'G', 'C'}, {'T'}, 1.0], [{'T', 'C'}, {'G'}, 1.0], [{'T'}, {'C', 'A'}, 1.0], [{'A'}, {'T', 'C'}, 1.0], [{'C'}, {'T', 'A'}, 1.0], [{'T', 'A'}, {'C'}, 1.0], [{'T', 'C'}, {'A'}, 1.0], [{'C', 'A'}, {'T'}, 1.0], [{'G'}, {'T', 'A'}, 1.0], [{'T'}, {'G', 'A'}, 1.0], [{'A'}, {'G', 'T'}, 1.0], [{'G', 'T'}, {'A'}, 1.0], [{'G', 'A'}, {'T'}, 1.0], [{'T', 'A'}, {'G'}, 1.0], [{'T'}, {'G', 'A', 'C'}, 1.0], [{'A'}, {'G', 'T', 'C'}, 1.0], [{'G'}, {'T', 'A', 'C'}, 1.0], [{'C'}, {'G', 'T', 'A'}, 1.0], [{'T', 'A'}, {'G', 'C'}, 1.0], [{'G', 'T'}, {'C', 'A'}, 1.0], [{'T', 'C'}, {'G', 'A'}, 1.0], [{'G', 'A'}, {'T', 'C'}, 1.0], [{'C', 'A'}, {'G', 'T'}, 1.0], [{'G', 'C'}, {'T', 'A'}, 1.0], [{'G', 'T', 'A'}, {'C'}, 1.0], [{'C', 'T', 'A'}, {'G'}, 1.0], [{'G', 'T', 'C'}, {'A'}, 1.0], [{'C', 'G', 'A'}, {'T'}, 1.0]]\n"
]
}
],
"source": [
"print(freqItemSet1,rules1)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "5ce84ad2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"4"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(freqItemSet1)"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "4e82df43",
"metadata": {},
"outputs": [],
"source": [
"#freqItemSet, rules = fpgrowth(g_sequence1,minSupRatio=0.5,minConf=0.5)\n",
"#print(rules) "
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "1cdf0bc8",
"metadata": {},
"outputs": [],
"source": [
"corona=''"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "9e61ca11",
"metadata": {},
"outputs": [],
"source": [
"with open(input_file1) as file1:\n",
" for lineno in file1:\n",
" corona+=lineno"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "2ca062e0",
"metadata": {},
"outputs": [],
"source": [
"for a in \" \\n0123456789\":\n",
" corona = corona.replace(a, \"\")"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "d0c69e5f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"42483"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(corona)"
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "e83ce4af",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9579"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(zlib.compress(corona.encode(\"utf-8\")))"
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "8b60ad48",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8292"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lzc = lzma.compress(corona.encode(\"utf-8\"))\n",
"len(lzc)"
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "93071057",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Ala / A', 'GCU, GCC, GCA, GCG']\n",
"['Ile / I', 'AUU, AUC, AUA']\n",
"['Arg / R', 'CGU, CGC, CGA, CGG; AGA, AGG, AGR;']\n",
"['Leu / L', 'CUU, CUC, CUA, CUG; UUA, UUG, UUR;']\n",
"['Asn / N', 'AAU, AAC']\n",
"['Lys / K', 'AAA, AAG']\n",
"['Asp / D', 'GAU, GAC']\n",
"['Met / M', 'AUG']\n",
"['Phe / F', 'UUU, UUC']\n",
"['Cys / C', 'UGU, UGC']\n",
"['Pro / P', 'CCU, CCC, CCA, CCG']\n",
"['Gln / Q', 'CAA, CAG']\n",
"['Ser / S', 'UCU, UCC, UCA, UCG; AGU, AGC;']\n",
"['Glu / E', 'GAA, GAG']\n",
"['Thr / T', 'ACU, ACC, ACA, ACG']\n",
"['Trp / W', 'UGG']\n",
"['Gly / G', 'GGU, GGC, GGA, GGG']\n",
"['Tyr / Y', 'UAU, UAC']\n",
"['His / H', 'CAU, CAC']\n",
"['Val / V', 'GUU, GUC, GUA, GUG']\n",
"['STOP', 'UAA, UGA, UAG']\n"
]
}
],
"source": [
"# Asn or Asp / B\tAAU, AAC; GAU, GAC\n",
"# Gln or Glu / Z\tCAA, CAG; GAA, GAG\n",
"# START\tAUG\n",
"## Seperating them from the table because these duplicates was creating problems\n",
"codons = \"\"\"\n",
"Ala / A\tGCU, GCC, GCA, GCG\n",
"Ile / I\tAUU, AUC, AUA\n",
"Arg / R\tCGU, CGC, CGA, CGG; AGA, AGG, AGR;\n",
"Leu / L\tCUU, CUC, CUA, CUG; UUA, UUG, UUR;\n",
"Asn / N\tAAU, AAC\n",
"Lys / K\tAAA, AAG\n",
"Asp / D\tGAU, GAC\n",
"Met / M\tAUG\n",
"Phe / F\tUUU, UUC\n",
"Cys / C\tUGU, UGC\n",
"Pro / P\tCCU, CCC, CCA, CCG\n",
"Gln / Q\tCAA, CAG\n",
"Ser / S\tUCU, UCC, UCA, UCG; AGU, AGC;\n",
"Glu / E\tGAA, GAG\n",
"Thr / T\tACU, ACC, ACA, ACG\n",
"Trp / W\tUGG\n",
"Gly / G\tGGU, GGC, GGA, GGG\n",
"Tyr / Y\tUAU, UAC\n",
"His / H\tCAU, CAC\n",
"Val / V\tGUU, GUC, GUA, GUG\n",
"STOP\tUAA, UGA, UAG\"\"\".strip()\n",
"\n",
"for t in codons.split('\\n'):\n",
" print(t.split('\\t'))"
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "07b1ad19",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'gct': 'A',\n",
" 'gcc': 'A',\n",
" 'gca': 'A',\n",
" 'gcg': 'A',\n",
" 'att': 'I',\n",
" 'atc': 'I',\n",
" 'ata': 'I',\n",
" 'cgt': 'R',\n",
" 'cgc': 'R',\n",
" 'cga': 'R',\n",
" 'cgg': 'R',\n",
" 'aga': 'R',\n",
" 'agg': 'R',\n",
" 'agr': 'R',\n",
" 'ctt': 'L',\n",
" 'ctc': 'L',\n",
" 'cta': 'L',\n",
" 'ctg': 'L',\n",
" 'tta': 'L',\n",
" 'ttg': 'L',\n",
" 'ttr': 'L',\n",
" 'aat': 'N',\n",
" 'aac': 'N',\n",
" 'aaa': 'K',\n",
" 'aag': 'K',\n",
" 'gat': 'D',\n",
" 'gac': 'D',\n",
" 'atg': 'M',\n",
" 'ttt': 'F',\n",
" 'ttc': 'F',\n",
" 'tgt': 'C',\n",
" 'tgc': 'C',\n",
" 'cct': 'P',\n",
" 'ccc': 'P',\n",
" 'cca': 'P',\n",
" 'ccg': 'P',\n",
" 'caa': 'Q',\n",
" 'cag': 'Q',\n",
" 'tct': 'S',\n",
" 'tcc': 'S',\n",
" 'tca': 'S',\n",
" 'tcg': 'S',\n",
" 'agt': 'S',\n",
" 'agc': 'S',\n",
" 'gaa': 'E',\n",
" 'gag': 'E',\n",
" 'act': 'T',\n",
" 'acc': 'T',\n",
" 'aca': 'T',\n",
" 'acg': 'T',\n",
" 'tgg': 'W',\n",
" 'ggt': 'G',\n",
" 'ggc': 'G',\n",
" 'gga': 'G',\n",
" 'ggg': 'G',\n",
" 'tat': 'Y',\n",
" 'tac': 'Y',\n",
" 'cat': 'H',\n",
" 'cac': 'H',\n",
" 'gtt': 'V',\n",
" 'gtc': 'V',\n",
" 'gta': 'V',\n",
" 'gtg': 'V',\n",
" 'taa': '*',\n",
" 'tga': '*',\n",
" 'tag': '*'}"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"##decoder dictionary\n",
"dec = {} \n",
"\n",
"for t in codons.split('\\n'):\n",
" k, v = t.split('\\t')\n",
" if '/' in k:\n",
" k = k.split('/')[-1].strip()\n",
" k = k.replace(\"STOP\", \"*\")\n",
" v = v.replace(\",\", \"\").replace(\";\", \"\").lower().replace(\"u\", \"t\").split(\" \")\n",
" for vv in v:\n",
" if vv in dec:\n",
" print(\"duplicate\", vv)\n",
" dec[vv] = k\n",
"dec"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "6356f936",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"21"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(set(dec.values())) "
]
},
{
"cell_type": "code",
"execution_count": 96,
"id": "885b0a70",
"metadata": {},
"outputs": [],
"source": [
"genome_sequence1=''\n",
"genome_sequence2=''"
]
},
{
"cell_type": "code",
"execution_count": 97,
"id": "59228e84",
"metadata": {},
"outputs": [],
"source": [
"dict_seq_1 = read_dna_seq('./input/China_Seq_2019_Dec.txt')"
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "f915174f",
"metadata": {},
"outputs": [],
"source": [
"# Modify the sequence with dummy 'N' nucleotide.\n",
"dict_seq_1 = gene_mod(dict_seq_1)"
]
},
{
"cell_type": "code",
"execution_count": 99,
"id": "52877d77",
"metadata": {},
"outputs": [],
"source": [
"# Read the dna sequence file-2 previously downloaded from NCBI.\n",
"dict_seq_2 = read_dna_seq('./input/USA_Seq_2020_Jan.txt')"
]
},
{
"cell_type": "code",
"execution_count": 100,
"id": "99cded28",
"metadata": {},
"outputs": [],
"source": [
"# Modify the sequence with dummy 'N' nucleotide.\n",
"dict_seq_2 = gene_mod(dict_seq_2)"
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "42a90ebd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Create matplotlib subplots for each gene. \n",
"f,ax = plt.subplots(nrows=11,ncols=3,figsize=(25,30))"
]
},
{
"cell_type": "code",
"execution_count": 102,
"id": "ae69f7f0",
"metadata": {},
"outputs": [],
"source": [
"gene_name = list(numpy_image_dict.keys())"
]
},
{
"cell_type": "code",
"execution_count": 103,
"id": "8c13dd17",
"metadata": {},
"outputs": [],
"source": [
"row = 0\n",
"col = 0\n",
"mut_dict={}"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "7dc4b45f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mutated DNA Base 255 in China and Base 100 in USA at position (74, 6) For the Gene ORF1ab\n",
"Mutated DNA Base 100 in China and Base 255 in USA at position (12, 10) For the Gene ORF8\n",
"Mutated DNA Base 255 in China and Base 0 in USA at position (17, 24) For the Gene N\n"
]
}
],
"source": [
"for i in gene_name:\n",
" G = i[5:]\n",
" # Loop thru each gene in the Cornona Virus nucleotide sequence.\n",
" gene_us = dna(dict_seq_1['gene='+G][1])\n",
" # Invoke the transcription method of the class dna \n",
" gene_us.transcription()\n",
" # Invoke the mothod that converts the gene sequence into a numpy array.\n",
" numpfy_usa = gene_us.numpfy()\n",
" # Reshape the numpy array with a predeifned shape from the numpy_image_dict dictionary.\n",
" numpfy_usa = numpfy_usa.reshape(numpy_image_dict['gene='+G][0])\n",
" # sub-plot the numpy array with matplotlib pcolor method.\n",
" ax[row][col].pcolor(numpfy_usa)\n",
" ax[row][col].set_title(G+' Gene - USA')\n",
" col+=1\n",
" gene_china = dna(dict_seq_2['gene='+G][1])\n",
" # Invoke the transcription method of the class dna \n",
" gene_china.transcription()\n",
" # Invoke the mothod that converts the gene sequence into a numpy array.\n",
" numpfy_china = gene_china.numpfy()\n",
" # Reshape the numpy array with a predeifned shape from the numpy_image_dict dictionary.\n",
" numpfy_china = numpfy_china.reshape(numpy_image_dict['gene='+G][0])\n",
" # sub-plot the numpy array with matplotlib pcolor method.\n",
" ax[row][col].pcolor(numpfy_china)\n",
" ax[row][col].set_title(G+' Gene - CHINA')\n",
" col+=1\n",
"\n",
" # To find the gene mutation subtract the numpy array from base sequence with the newer sequence. Here the \n",
" # the Chinese sequence is the base sequence and the USA sequence is a newer sequence.\n",
" mut = numpfy_china - numpfy_usa\n",
" if mut.any():\n",
" # Here we are looking for a non zero value in the mutated numpy array (result of the subtracting the 2 numpy arrays).\n",
" # Presence of non-zero value means that there is difference between the 2 numpy arrays and the gene has \n",
" # mutataions. If there are mutations in the gene create a python dictionary \"mut_dict\" with details as below.\n",
" # {'': [[, , , (x_value,y_value)]], '': [[, , , (x_value,y_value)]]}\n",
" mut_nec = np.nonzero(mut)\n",
" x=mut_nec[0]\n",
" y=mut_nec[1]\n",
" l=0\n",
" mut_dict[G]=[]\n",
" for i in x:\n",
" us_base = numpfy_usa[i][y[l]]\n",
" ch_base = numpfy_china[i][y[l]]\n",
" mut_base = mut[i][y[l]]\n",
" info_list = [ch_base,us_base,mut_base,(i,y[l])]\n",
" mut_dict[G].append(info_list)\n",
" print(\"Mutated DNA Base {} in China and Base {} in USA at position {} For the Gene {}\".format(ch_base,us_base,(i,y[l]),G))\n",
" l+= 1\n",
" # Giving a title to the matplotlib subplot\n",
" ax[row][col].pcolor(mut)\n",
" ax[row][col].set_title(G+' Gene - Mutataion')\n",
" row+= 1\n",
" col=0"
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "01150db9",
"metadata": {},
"outputs": [],
"source": [
"f.tight_layout()\n",
"# Saving the matplotlib subplot as a jpg.\n",
"f.savefig('./output/Gene_Mutation_Analysis.jpg')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}