Ino de Bruijn Add kraken kmer origin counting  almost 10 years ago

Commit id: 150004ccbcfeff5a6d4190ec7de385c7691bce40

deletions | additions      

         

{  "metadata": {  "name": "",  "signature": "sha256:4359cc7d2281c0abc72356e35eb921bdb3bf886f0c079d739c5949d5bdc64bd8"  },  "nbformat": 3,  "nbformat_minor": 0,  "worksheets": [  {  "cells": [  {  "cell_type": "markdown",  "metadata": {},  "source": [  "# Metagenomic Assembly - Assessing Chimericity in Contigs with Kraken\n",  "In de novo metagenomic assembly it is possible that different genomes end up getting mixed in one contig, because they are so similar. How likely is this to occur?\n",  "\n",  "[Kraken](https://github.com/DerrickWood/kraken) performs taxonomic classification using kmers. You can build a database of your own references in fasta format as long as they have a GI number. Here we will use Kraken to determine where the kmers in a wrongly assembled contig are coming from. \n",  "\n",  "Starting data:\n",  "- 52 reference genomes\n",  "- Velvet assembly with kmer=31 and no scaffolding using only Illumina paired reads that align to those 52 genomes\n",  "\n",  "## Installing Kraken\n",  "This went pretty smoothly. I just cloned the repository and ran the installation script. Then copied the binaries to my home dir which is in my ``$PATH`` variable.\n",  "\n",  "```\n",  "$ cd ~/src\n",  "$ git clone https://github.com/DerrickWood/kraken\n",  "$ ./install_kraken.sh ../kraken-install\n",  "$ cd ../kraken-install\n",  "$ cp kraken kraken-build ~/bin\n",  "$ kraken --version\n",  "Kraken version 0.10.5-beta\n",  "Copyright 2013-2014, Derrick Wood ([email protected])\n",  "```\n",  "\n",  "For your own database you need to install jellyfish 1, which luckily was already installed on our server:\n",  "```\n",  "$ module load bioinfo-tools\n",  "$ module load jellyfish/1.1.11\n",  "```\n",  "\n",  "## Building the database of the references\n",  "\n",  "### Getting GI numbers for the genomes you are interested in\n",  "The reference fasta file of the 52 genomes that I had unfortunately did not contain the [GI number](http://www.ncbi.nlm.nih.gov/Sitemap/sequenceIDs.html) of NCBI, which is necessary for Kraken. It did contain some fairly descriptive names that could be used to query NCBI. Therefore I used those names to retrieve a ``original_name,gi_number`` csv file:\n",  "\n",  "```\n",  "for g in $(grep '^>' ../Mircea_07102013_selected_refs.fasta | sed 's/>//')\n",  "do \n",  " specific_g=$(echo $g | sed 's/tokodaii/tokodaii_str_7/' | sed 's/SulfuriYO3AOP1/Sulfuri_YO3AOP1/' | sed 's/_/+/g')\n",  " echo $g,$(\n",  " curl -sg 'http://www.ncbi.nlm.nih.gov/nuccore/?term=%28'$specific_g'+%29+AND+%22ddbj+embl+genbank%22[Filter]' | \n",  " grep -o -e '\\(complete genome\\|, whole genome shotgun sequencing project\\|chromosome 1, complete sequence\\|S2, complete sequence\\)\\(.\\)\\{500\\}' | \n",  " grep -o --color=always -e 'nuccore/.*report=genbank' -m1 | \n",  " cut -f2 -d'/' | cut -f1 -d'?'\n",  " )\n",  "done > rename-fasta-ids.csv\n",  "```\n",  "\n",  "Kudos if you can decipher that! We iterate over all the reference names in the fastafile. The first line in the loop changes some reference names so they actually give a result while searching NCBI - no love for corner cases. Then all the names in the fasta file contained underscores instead of spaces so I changed that to a ``+`` which is the character NCBI uses for a space in a query. NCBI is queried using the result. A grep expression is used to search for complete genomes in the retrieved HTML - again a bunch of corner case killed a simple generalization - and the GI id is obtained after cutting out the other text.\n",  "\n",  "After that I used [this](https://github.com/inodb/biorhino-tools/blob/92a5da5719804261fb55aa6c3e22a20774af78a0/scripts/br-fasta-replace-ids.py) script to replace the fasta ids.\n",  "\n",  "```\n",  "br-fasta-replace-ids.py rename-fasta-ids.csv ../Mircea_07102013_selected_refs.fasta -d, > Mircea_07102013_selected_refs_gi.fasta\n",  "```\n",  "\n",  "### Actually performing the build commands\n",  "```\n",  "kraken-build --download-taxonomy --db Mircea_07102013_selected_refs\n",  "kraken-build --add-to-library Mircea_07102013_selected_refs_gi.fasta --db Mircea_07102013_selected_refs\n",  "kraken-build --build --kmer-len 31 --db Mircea_07102013_selected_refs\n",  "```\n",  "\n",  "## Classifying\n",  "After the database is built, classifying the assembly was easy and went really fast:\n",  "```\n",  "kraken --threads 16 ma-contigs-velvetnoscaf31.fa --db Mircea_07102013_selected_refs > ma-contigs-velvetnoscaf31-kraken.tsv\n",  "```\n",  "\n",  "The resulting file has the following format:\n",  "\n",  "```\n",  "OUTPUT FORMAT\n",  "=============\n",  "\n",  "Each sequence classified by Kraken results in a single line of\n",  "output. Output lines contain five tab-delimited fields; from\n",  "left to right, they are:\n",  "\n",  " 1) \"C\"/\"U\": one letter code indicating that the sequence was\n",  " either classified or unclassified.\n",  " 2) The sequence ID, obtained from the FASTA/FASTQ header.\n",  " 3) The taxonomy ID Kraken used to label the sequence; this is\n",  " 0 if the sequence is unclassified.\n",  " 4) The length of the sequence in bp.\n",  " 5) A space-delimited list indicating the LCA mapping of each k-mer\n",  " in the sequence. For example, \"562:13 561:4 A:31 0:1 562:3\"\n",  " would indicate that:\n",  " - the first 13 k-mers mapped to taxonomy ID #562\n",  " - the next 4 k-mers mapped to taxonomy ID #561\n",  " - the next 31 k-mers contained an ambiguous nucleotide\n",  " - the next k-mer was not in the database\n",  " - the last 3 k-mers mapped to taxonomy ID #562\n",  "```\n",  "\n",  "## The fun part\n",  "So now that we know for each contig where each kmers come from we can have some fun plotting the results.\n",  "\n",  "### Import Kraken taxonomy file for tax_id to rank mappings"  ]  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "import pandas as pd"  ],  "language": "python",  "metadata": {},  "outputs": [],  "prompt_number": 1  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "def strip(text):\n",  " try:\n",  " return text.strip()\n",  " except AttributeError:\n",  " return text\n",  "\n",  "nodes = pd.read_csv(\"/media/milou/glob/src/kraken-install/databases/Mircea_07102013_selected_refs/taxonomy/nodes.dmp\", sep=\"|\", \n",  " skipinitialspace=True, index_col=False,\n",  " names=[\"tax_id\",\"parent_tax_id\",\"rank\",\"embl_code\",\n",  " \"division_id\",\"inherited_div_flag\",\"genetic_code_id\",\n",  " \"inherited_GC_flag\", \"mitochondrial genetic_code_id\",\n",  " \"inherited_MGC_flag\", \"Genbank_hidden_flag\",\"hidden_subtree_flag\",\n",  " \"comments\"],\n",  " converters={\"parent_tax_id\":strip,\"rank\":strip,\"embl_code\":strip})"  ],  "language": "python",  "metadata": {},  "outputs": [],  "prompt_number": 60  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "nodes.head()"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "html": [  "
\n",  "\n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  "
tax_idparent_tax_idrankembl_codedivision_idinherited_div_flaggenetic_code_idinherited_GC_flagmitochondrial genetic_code_idinherited_MGC_flagGenbank_hidden_flaghidden_subtree_flagcomments
0 1 1 no rank 8 0 1 0 0 0 0 0 \\t\\t
1 2 131567 superkingdom 0 0 11 0 0 0 0 0 \\t\\t
2 6 335928 genus 0 1 11 1 0 1 0 0 \\t\\t
3 7 6 species AC 0 1 11 1 0 1 1 0 \\t\\t
4 9 32199 species BA 0 1 11 1 0 1 1 0 \\t\\t
\n",
  "

5 rows \u00d7 13 columns

\n",
  "
"
  ],  "metadata": {},  "output_type": "pyout",  "prompt_number": 61,  "text": [  " tax_id parent_tax_id rank embl_code division_id \\\n",  "0 1 1 no rank 8 \n",  "1 2 131567 superkingdom 0 \n",  "2 6 335928 genus 0 \n",  "3 7 6 species AC 0 \n",  "4 9 32199 species BA 0 \n",  "\n",  " inherited_div_flag genetic_code_id inherited_GC_flag \\\n",  "0 0 1 0 \n",  "1 0 11 0 \n",  "2 1 11 1 \n",  "3 1 11 1 \n",  "4 1 11 1 \n",  "\n",  " mitochondrial genetic_code_id inherited_MGC_flag Genbank_hidden_flag \\\n",  "0 0 0 0 \n",  "1 0 0 0 \n",  "2 0 1 0 \n",  "3 0 1 1 \n",  "4 0 1 1 \n",  "\n",  " hidden_subtree_flag comments \n",  "0 0 \\t\\t \n",  "1 0 \\t\\t \n",  "2 0 \\t\\t \n",  "3 0 \\t\\t \n",  "4 0 \\t\\t \n",  "\n",  "[5 rows x 13 columns]"  ]  }  ],  "prompt_number": 61  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "pd.unique(nodes[\"rank\"])"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 91,  "text": [  "array(['no rank', 'superkingdom', 'genus', 'species', 'order', 'family',\n",  " 'subspecies', 'subfamily', 'tribe', 'phylum', 'class', 'forma',\n",  " 'suborder', 'superclass', 'subclass', 'varietas', 'kingdom',\n",  " 'superfamily', 'infraorder', 'subphylum', 'infraclass',\n",  " 'superorder', 'subgenus', 'parvorder', 'superphylum',\n",  " 'species group', 'species subgroup', 'subtribe', 'subkingdom'], dtype=object)"  ]  }  ],  "prompt_number": 91  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "### Import Kraken output"  ]  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "def list_it(text):\n",  " return [(int(c[0]), int(c[1])) for c in [s.split(':') for s in text.split()]]\n",  "\n",  "kraken = pd.read_csv(\"/media/milou/glob/projects/masmvali-partdeux/reassembly-filtered-reads/Sample_1ng_even/kraken/ma-contigs-velvetnoscaf31-kraken.tsv\", sep=\"\\t\",\n",  " true_values=[\"C\"], false_values=[\"U\"],\n",  " names=[\"classified\",\"seq_id\",\"tax_id\",\"length\",\"lca\"],\n",  " converters={\"lca\":list_it})"  ],  "language": "python",  "metadata": {},  "outputs": [],  "prompt_number": 152  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "kraken.head()"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "html": [  "
\n",  "\n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  "
classifiedseq_idtax_idlengthlca
0 True NODE_1_length_4050_cov_8.365432 395495 4080 [(395495, 4050)]
1 True NODE_2_length_84_cov_2.071429 436114 114 [(436114, 84)]
2 True NODE_3_length_532_cov_4.377820 436114 562 [(436114, 532)]
3 True NODE_4_length_336_cov_9.851191 395495 366 [(395495, 336)]
4 True NODE_5_length_217_cov_7.797235 395495 247 [(395495, 217)]
\n",
  "

5 rows \u00d7 5 columns

\n",
  "
"
  ],  "metadata": {},  "output_type": "pyout",  "prompt_number": 154,  "text": [  " classified seq_id tax_id length \\\n",  "0 True NODE_1_length_4050_cov_8.365432 395495 4080 \n",  "1 True NODE_2_length_84_cov_2.071429 436114 114 \n",  "2 True NODE_3_length_532_cov_4.377820 436114 562 \n",  "3 True NODE_4_length_336_cov_9.851191 395495 366 \n",  "4 True NODE_5_length_217_cov_7.797235 395495 247 \n",  "\n",  " lca \n",  "0 [(395495, 4050)] \n",  "1 [(436114, 84)] \n",  "2 [(436114, 532)] \n",  "3 [(395495, 336)] \n",  "4 [(395495, 217)] \n",  "\n",  "[5 rows x 5 columns]"  ]  }  ],  "prompt_number": 154  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "All sequences larger than 500 are classified"  ]  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "kraken[kraken.length > 500].classified.value_counts()"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 23,  "text": [  "True 54467\n",  "dtype: int64"  ]  }  ],  "prompt_number": 23  },  {  "cell_type": "markdown",  "metadata": {},  "source": [  "Now let's find out what rank the lca is for each wrong kmer in each contig (too slow right now)"  ]  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "def rank_lca(row):\n",  " return [(nodes[nodes.tax_id == tid][\"rank\"].values[0], row.lca[tid]) if tid != row.tax_id else (\"strain\", row.lca[tid]) for tid in row.lca]\n",  "\n",  "def df_rank_lca(row):\n",  " ranks = list(pd.unique(nodes[\"rank\"])) + [\"strain\",\"non-existent\"]\n",  " result = {rank:0 for rank in ranks}\n",  " for (tid, count) in row.lca:\n",  " if tid == 0:\n",  " result[\"non-existent\"] += count\n",  " elif tid != row.tax_id:\n",  " result[nodes[nodes.tax_id == tid][\"rank\"].values[0]] += count\n",  " else:\n",  " result[\"strain\"] += count\n",  " \n",  " return pd.Series(result)\n",  "\n",  "%time result = kraken[kraken.length > 500].apply(df_rank_lca, axis=1)\n",  "result.head()"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "html": [  "
\n",  "\n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  "
classfamilyformagenusinfraclassinfraorderkingdomno ranknon-existentorderparvorderphylumspeciesspecies groupspecies subgroupstrainsubclasssubfamilysubgenussubkingdom
14316 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54117 0 0 0 0...
33063 0 0 0 0 0 0 0 0 62 0 0 0 0 0 0 53541 0 0 0 0...
42327 0 0 0 0 0 0 0 0 90 0 0 0 0 0 0 66552 0 0 0 0...
43511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56783 0 0 0 0...
202248 0 0 0 0 0 0 0 0 61 0 0 0 0 0 0 60540 0 0 0 0...
\n",
  "

5 rows \u00d7 31 columns

\n",
  "
"
  ],  "metadata": {},  "output_type": "pyout",  "prompt_number": 197,  "text": [  " class family forma genus infraclass infraorder kingdom no rank \\\n",  "14316 0 0 0 0 0 0 0 0 \n",  "33063 0 0 0 0 0 0 0 0 \n",  "42327 0 0 0 0 0 0 0 0 \n",  "43511 0 0 0 0 0 0 0 0 \n",  "202248 0 0 0 0 0 0 0 0 \n",  "\n",  " non-existent order parvorder phylum species species group \\\n",  "14316 0 0 0 0 0 0 \n",  "33063 62 0 0 0 0 0 \n",  "42327 90 0 0 0 0 0 \n",  "43511 0 0 0 0 0 0 \n",  "202248 61 0 0 0 0 0 \n",  "\n",  " species subgroup strain subclass subfamily subgenus subkingdom \\\n",  "14316 0 54117 0 0 0 0 \n",  "33063 0 53541 0 0 0 0 \n",  "42327 0 66552 0 0 0 0 \n",  "43511 0 56783 0 0 0 0 \n",  "202248 0 60540 0 0 0 0 \n",  "\n",  " \n",  "14316 ... \n",  "33063 ... \n",  "42327 ... \n",  "43511 ... \n",  "202248 ... \n",  "\n",  "[5 rows x 31 columns]"  ]  }  ],  "prompt_number": 197  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "import matplotlib.pyplot as plt"  ],  "language": "python",  "metadata": {},  "outputs": [],  "prompt_number": 166  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "%matplotlib inline\n",  "result.drop('strain',axis=1).drop('non-existent',axis=1).sum().plot(kind='bar',logy=True)"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 201,  "text": [  ""  ]  },  {  "metadata": {},  "output_type": "display_data",  "png": "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\n",  "text": [  ""  ]  }  ],  "prompt_number": 201  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "t = pd.DataFrame(columns=list(pd.unique(nodes[\"rank\"])) + [\"strain\"])\n",  "t[\"strain\"][1] = 5\n",  "t[\"strain\"]"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "ename": "IndexError",  "evalue": "index 1 is out of bounds for axis 0 with size 0",  "output_type": "pyerr",  "traceback": [  "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",  "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mt\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlist\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munique\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnodes\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"rank\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m\"strain\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mt\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"strain\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m5\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mt\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"strain\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",  "\u001b[1;32m/home/idb/virtual-environments/py27-env/local/lib/python2.7/site-packages/pandas/core/series.pyc\u001b[0m in \u001b[0;36m__setitem__\u001b[1;34m(self, key, value)\u001b[0m\n\u001b[0;32m 600\u001b[0m and not self.index.inferred_type == 'integer'):\n\u001b[0;32m 601\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 602\u001b[1;33m \u001b[0mvalues\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 603\u001b[0m \u001b[1;32mreturn\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 604\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mkey\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mEllipsis\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",  "\u001b[1;31mIndexError\u001b[0m: index 1 is out of bounds for axis 0 with size 0"  ]  }  ],  "prompt_number": 117  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "pd.DataFrame([(0,0,0,0,0)], columns=['strain','uknowit','ugotit','loveit','5'])"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "html": [  "
\n",  "\n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  "
strainuknowitugotitloveit5
0 0 0 0 0 0
\n",
  "

1 rows \u00d7 5 columns

\n",
  "
"
  ],  "metadata": {},  "output_type": "pyout",  "prompt_number": 123,  "text": [  " strain uknowit ugotit loveit 5\n",  "0 0 0 0 0 0\n",  "\n",  "[1 rows x 5 columns]"  ]  }  ],  "prompt_number": 123  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "pd.DataFrame([(1,)], index=['strain',])"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "html": [  "
\n",  "\n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  " \n",  "
0
strain 1
\n",
  "

1 rows \u00d7 1 columns

\n",
  "
"
  ],  "metadata": {},  "output_type": "pyout",  "prompt_number": 130,  "text": [  " 0\n",  "strain 1\n",  "\n",  "[1 rows x 1 columns]"  ]  }  ],  "prompt_number": 130  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "nodes[nodes.tax_id == 297266][\"rank\"]"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 141,  "text": [  "248031 species\n",  "Name: rank, dtype: object"  ]  }  ],  "prompt_number": 141  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "pd.Series([0],index=['strain'])"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 142,  "text": [  "strain 0\n",  "dtype: int64"  ]  }  ],  "prompt_number": 142  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "pd.Series({\"ola\":5,\"fa\":6})"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 146,  "text": [  "fa 6\n",  "ola 5\n",  "dtype: int64"  ]  }  ],  "prompt_number": 146  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "{c:0 for c in [\"ola\"]}"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 147,  "text": [  "{'ola': 0}"  ]  }  ],  "prompt_number": 147  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "{\"ola\":5,\"ola\":6}"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "metadata": {},  "output_type": "pyout",  "prompt_number": 148,  "text": [  "{'ola': 6}"  ]  }  ],  "prompt_number": 148  },  {  "cell_type": "code",  "collapsed": false,  "input": [  "list([], [\"ola\"])"  ],  "language": "python",  "metadata": {},  "outputs": [  {  "ename": "TypeError",  "evalue": "list() takes at most 1 argument (2 given)",  "output_type": "pyerr",  "traceback": [  "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",  "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mlist\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m\"ola\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",  "\u001b[1;31mTypeError\u001b[0m: list() takes at most 1 argument (2 given)"  ]  }  ],  "prompt_number": 159  },  {  "cell_type": "code",  "collapsed": false,  "input": [],  "language": "python",  "metadata": {},  "outputs": []  }  ],  "metadata": {}  }  ]  }