{"cells":[{"cell_type":"markdown","metadata":{"id":"G1yCZo89bYXg"},"source":["\n","\n","# Data cleaning by example"]},{"cell_type":"markdown","metadata":{"id":"97GsGa5ihkOw"},"source":["We're going to cover data cleaning by an example. Primarily, you're going to work in `pandas`, a library for manipulating tabular data.\n","\n","## Imports and files\n","The first thing we'll try is loading some data and plotting it. To do this, we'll need some packages. Let's load up pandas, a package for data management, and matplotlib. The python command for this is `import`.\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ophPuMwbnOf1"},"outputs":[],"source":["import pandas as pd ## Pandas is our main data cleaning library\n","import numpy as np ## Numpy is our main numerical library\n","import matplotlib as mpl ## Matplotlib is our main plotting library"]},{"cell_type":"markdown","metadata":{"id":"oafyXjCZnYvY"},"source":["## Reading data in with pandas"]},{"cell_type":"markdown","metadata":{"id":"x-FYGI0_5mQZ"},"source":["Let's now read in an MRICloud dataset using pandas. We want to use the function `read_csv` within pandas. Notice we imported pandas `as pd` so the command is `pd.read_csv`. Also, pandas can accept URLs, so we just put the link to the file in the argument. The data we want to read in is in a github repo I created."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"vzhyTYxbm_m3"},"outputs":[],"source":["## Pandas can read in from a URL\n","df = pd.read_csv(\"https://raw.githubusercontent.com/bcaffo/ds4bme_intro/master/data/kirby127a_3_1_ax_283Labels_M2_corrected_stats.csv\")"]},{"cell_type":"markdown","metadata":{"id":"TXqLH6LK6Umh"},"source":["Let's look at the first 4 rows of our dataframe. The object `dataset` is a `pandas` object with associated methods. One is `head` which allows one to see the first few rows of data."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":175},"id":"5ljATgC_50nX","outputId":"678ac27d-3f0e-4ce8-d5d5-de2a74549f8e","executionInfo":{"status":"ok","timestamp":1713130322521,"user_tz":240,"elapsed":26,"user":{"displayName":"Brian Caffo","userId":"07979705296072332292"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" Unnamed: 0 rawid roi volume min max \\\n","0 1 kirby127a_3_1_ax.img Telencephalon_L 531111 0 374 \n","1 2 kirby127a_3_1_ax.img Telencephalon_R 543404 0 300 \n","2 3 kirby127a_3_1_ax.img Diencephalon_L 9683 15 295 \n","3 4 kirby127a_3_1_ax.img Diencephalon_R 9678 10 335 \n","\n"," mean std type level \n","0 128.3013 51.8593 1 1 \n","1 135.0683 53.6471 1 1 \n","2 193.5488 32.2733 1 1 \n","3 193.7051 32.7869 1 1 "],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
Unnamed: 0
\n","
rawid
\n","
roi
\n","
volume
\n","
min
\n","
max
\n","
mean
\n","
std
\n","
type
\n","
level
\n","
\n"," \n"," \n","
\n","
0
\n","
1
\n","
kirby127a_3_1_ax.img
\n","
Telencephalon_L
\n","
531111
\n","
0
\n","
374
\n","
128.3013
\n","
51.8593
\n","
1
\n","
1
\n","
\n","
\n","
1
\n","
2
\n","
kirby127a_3_1_ax.img
\n","
Telencephalon_R
\n","
543404
\n","
0
\n","
300
\n","
135.0683
\n","
53.6471
\n","
1
\n","
1
\n","
\n","
\n","
2
\n","
3
\n","
kirby127a_3_1_ax.img
\n","
Diencephalon_L
\n","
9683
\n","
15
\n","
295
\n","
193.5488
\n","
32.2733
\n","
1
\n","
1
\n","
\n","
\n","
3
\n","
4
\n","
kirby127a_3_1_ax.img
\n","
Diencephalon_R
\n","
9678
\n","
10
\n","
335
\n","
193.7051
\n","
32.7869
\n","
1
\n","
1
\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"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"df","summary":"{\n \"name\": \"df\",\n \"rows\": 836,\n \"fields\": [\n {\n \"column\": \"Unnamed: 0\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 241,\n \"min\": 1,\n \"max\": 836,\n \"num_unique_values\": 836,\n \"samples\": [\n 612,\n 824,\n 291\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rawid\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"target2.img\",\n \"kirby127a_3_1_ax.img\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"roi\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 426,\n \"samples\": [\n \"Fu_L\",\n \"TempSul_R\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 50180,\n \"min\": 2,\n \"max\": 553082,\n \"num_unique_values\": 473,\n \"samples\": [\n 21332,\n 28786\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"min\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 50,\n \"min\": 0,\n \"max\": 264,\n \"num_unique_values\": 119,\n \"samples\": [\n 20,\n 97\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"max\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 58,\n \"min\": 68,\n \"max\": 374,\n \"num_unique_values\": 143,\n \"samples\": [\n 229,\n 166\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"mean\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 64.36869664769512,\n \"min\": 23.2345,\n \"max\": 264.0,\n \"num_unique_values\": 485,\n \"samples\": [\n 101.0993,\n 159.0101\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"std\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 10.317542774769832,\n \"min\": 0.0,\n \"max\": 59.3877,\n \"num_unique_values\": 484,\n \"samples\": [\n 47.8376,\n 40.2171\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"type\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 2,\n \"num_unique_values\": 2,\n \"samples\": [\n 2,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"level\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 5,\n \"num_unique_values\": 5,\n \"samples\": [\n 2,\n 5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":3}],"source":["df.head(4)"]},{"cell_type":"markdown","metadata":{"id":"xM6krqI2ndye"},"source":["# Working with the data"]},{"cell_type":"markdown","metadata":{"id":"cHt4jCNWcAv2"},"source":["Let's get rid of the column `rawid` and the unnamed column since they're kind of useless for today's lecture. Also let's work with only the volume."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"VV0BRynMcAHr"},"outputs":[],"source":["df = df.drop(['Unnamed: 0', 'rawid', 'min', 'max', 'mean', 'std'], axis = 1)"]},{"cell_type":"markdown","metadata":{"id":"fRL2IS3RgpRW"},"source":["Now let's create a column called `icv` for intra-cranial volume. ICV is defined as the summ of the Type I Level 1 structures and cerebrospinal fluid. For the rest of this lecture, we're just going to look at this type and level."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":300},"id":"vpFUqDK8hAeG","outputId":"ca5a9037-6824-462e-ff83-0d7af28c0ab6","executionInfo":{"status":"ok","timestamp":1713130418400,"user_tz":240,"elapsed":26,"user":{"displayName":"Brian Caffo","userId":"07979705296072332292"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" roi volume type level icv\n","0 Telencephalon_L 531111 1 1 1378295\n","1 Telencephalon_R 543404 1 1 1378295\n","2 Diencephalon_L 9683 1 1 1378295\n","3 Diencephalon_R 9678 1 1 1378295\n","4 Mesencephalon 10268 1 1 1378295\n","5 Metencephalon 159402 1 1 1378295\n","6 Myelencephalon 4973 1 1 1378295\n","7 CSF 109776 1 1 1378295"],"text/html":["\n","
\n","
\n","\n","
\n"," \n","
\n","
\n","
roi
\n","
volume
\n","
type
\n","
level
\n","
icv
\n","
\n"," \n"," \n","
\n","
0
\n","
Telencephalon_L
\n","
531111
\n","
1
\n","
1
\n","
1378295
\n","
\n","
\n","
1
\n","
Telencephalon_R
\n","
543404
\n","
1
\n","
1
\n","
1378295
\n","
\n","
\n","
2
\n","
Diencephalon_L
\n","
9683
\n","
1
\n","
1
\n","
1378295
\n","
\n","
\n","
3
\n","
Diencephalon_R
\n","
9678
\n","
1
\n","
1
\n","
1378295
\n","
\n","
\n","
4
\n","
Mesencephalon
\n","
10268
\n","
1
\n","
1
\n","
1378295
\n","
\n","
\n","
5
\n","
Metencephalon
\n","
159402
\n","
1
\n","
1
\n","
1378295
\n","
\n","
\n","
6
\n","
Myelencephalon
\n","
4973
\n","
1
\n","
1
\n","
1378295
\n","
\n","
\n","
7
\n","
CSF
\n","
109776
\n","
1
\n","
1
\n","
1378295
\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"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"t1l1","summary":"{\n \"name\": \"t1l1\",\n \"rows\": 8,\n \"fields\": [\n {\n \"column\": \"roi\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 8,\n \"samples\": [\n \"Telencephalon_R\",\n \"Metencephalon\",\n \"Telencephalon_L\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 232281,\n \"min\": 4973,\n \"max\": 543404,\n \"num_unique_values\": 8,\n \"samples\": [\n 543404,\n 159402,\n 531111\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"type\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"level\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"icv\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1378295,\n \"max\": 1378295,\n \"num_unique_values\": 1,\n \"samples\": [\n 1378295\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":5}],"source":["## Extract the Type 1 Level 1 data\n","t1l1 = df.loc[(df['type'] == 1) & (df['level'] == 1)].copy()\n","## Create a new column based on ICV\n","t1l1['icv'] = sum(t1l1['volume'])\n","t1l1"]},{"cell_type":"markdown","metadata":{"id":"MaP4AzJfg57B"},"source":["One can access variables with methods, like `df.type`, or using brackets like df['type']. I prefer the latter, since it can accomodate things like spaces, periods or other special characters in the varible name.\n","In addition to defining new varibles using brackets, one can use `assign`. The `.copy()` command is used because I want a new dataframe, not just referencing the slices of the other."]},{"cell_type":"markdown","metadata":{"id":"AMSOSF0hqHfJ"},"source":["Now the TBV is defined as the sum of the volume for all rows except CSF."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":300},"id":"7tjWllGmqG1A","outputId":"a17de316-4d9d-4945-9302-95cc3154b225","executionInfo":{"status":"ok","timestamp":1713130424069,"user_tz":240,"elapsed":260,"user":{"displayName":"Brian Caffo","userId":"07979705296072332292"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" roi volume type level icv tbv\n","0 Telencephalon_L 531111 1 1 1378295 1268519\n","1 Telencephalon_R 543404 1 1 1378295 1268519\n","2 Diencephalon_L 9683 1 1 1378295 1268519\n","3 Diencephalon_R 9678 1 1 1378295 1268519\n","4 Mesencephalon 10268 1 1 1378295 1268519\n","5 Metencephalon 159402 1 1 1378295 1268519\n","6 Myelencephalon 4973 1 1 1378295 1268519\n","7 CSF 109776 1 1 1378295 1268519"],"text/html":["\n","
\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"t1l1","summary":"{\n \"name\": \"t1l1\",\n \"rows\": 8,\n \"fields\": [\n {\n \"column\": \"roi\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 8,\n \"samples\": [\n \"Telencephalon_R\",\n \"Metencephalon\",\n \"Telencephalon_L\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 232281,\n \"min\": 4973,\n \"max\": 543404,\n \"num_unique_values\": 8,\n \"samples\": [\n 543404,\n 159402,\n 531111\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"type\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"level\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"icv\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1378295,\n \"max\": 1378295,\n \"num_unique_values\": 1,\n \"samples\": [\n 1378295\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tbv\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1268519,\n \"max\": 1268519,\n \"num_unique_values\": 1,\n \"samples\": [\n 1268519\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"comp\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.18311214803681433,\n \"min\": 0.003920319679878661,\n \"max\": 0.42837671331686794,\n \"num_unique_values\": 8,\n \"samples\": [\n 0.42837671331686794\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"}},"metadata":{},"execution_count":7}],"source":["t1l1['comp'] = t1l1['volume'] / t1l1['tbv']\n","t1l1"]},{"cell_type":"markdown","metadata":{"id":"rl-OM9GmFJln"},"source":["# Plotting\n","\n","Pandas has built in methods for plotting. Later on, we'll try different plotting packages."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":551},"id":"HecZT2_jRSX3","outputId":"a9d521c9-504e-4bd3-fb11-8afd0d6e3710","executionInfo":{"status":"ok","timestamp":1713130439394,"user_tz":240,"elapsed":1272,"user":{"displayName":"Brian Caffo","userId":"07979705296072332292"}}},"outputs":[{"output_type":"display_data","data":{"text/plain":[""],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAiwAAAIWCAYAAAB0ltYiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABY2klEQVR4nO3deXxM9/4/8NdMyEY2IptGFksjiCCVq2iVVLhaW5dQFWJprQ1B0JLYrkSuaihXvqglWqRUacsNNURvCWqJpbYkRRCJoBKJSiQ5vz/8Mu1IopmRmXNmzuv5eMzjypkzJ+/PPSqvvM/nnI9CEAQBRERERBKmFLsAIiIior/DwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJJXR+wCakN5eTmys7NhY2MDhUIhdjlERERUA4Ig4MGDB3Bzc4NS+eweikkEluzsbLi7u4tdBhEREeng+vXreOGFF565j0kEFhsbGwBPBmxraytyNURERFQTBQUFcHd3V/8cfxaTCCwVl4FsbW0ZWIiIiIxMTaZzcNItERERSR4DCxEREUkeAwsRERFJnknMYSEiIqoNZWVlePz4sdhlmJS6devCzMzsuY/DwEJERLInCAJycnJw//59sUsxSfb29nBxcXmuZ6UxsBARkexVhBUnJydYW1vzIaS1RBAEPHz4ELdv3wYAuLq66nwsBhYiIpK1srIydVhp2LCh2OWYHCsrKwDA7du34eTkpPPlIU66JSIiWauYs2JtbS1yJaar4v/b55kfxMBCRESEmj28jHRTG//fMrAQERGR5DGwEBERkeRx0i0REVE1PGfsMtj3uhrbx2Dfyxixw0JERESSx8BCRERkpMrLyxEXF4dmzZrBwsICTZo0wb/+9S8AwNmzZ9G9e3dYWVmhYcOG+OCDD1BYWKj+7PDhw9G/f38sXLgQzs7OsLe3x7x581BaWopp06ahQYMGeOGFF7Bu3Tr1Z65evQqFQoEtW7bg5ZdfhqWlJVq3bo2DBw/qfawMLEREREZq5syZiI2NxezZs3H+/Hls2rQJzs7OKCoqQnBwMBwcHPDLL79g69at2LdvHyZMmKDx+f379yM7Oxs//fQTlixZgujoaLzxxhtwcHDA0aNHMWbMGHz44Ye4ceOGxuemTZuGKVOm4NSpU+jUqRPefPNN3L17V69jVQiCIOj1OxhAQUEB7OzskJ+fD1tbW7HLMSqGvD77NF6vJSIpePToEa5cuQIvLy9YWlpqvCflOSwPHjxAo0aNsHz5cowaNUrjvdWrV2P69Om4fv066tWrBwDYvXs33nzzTWRnZ8PZ2RnDhw9HSkoKfvvtNyiVT/oXPj4+cHJywk8//QTgyUP17OzssGbNGgwaNAhXr16Fl5cXYmNjMX36dABAaWkpvLy8MHHiRERGRlZZa3X/H2vz85sdFiIiIiN04cIFFBcXo0ePHlW+17ZtW3VYAYDOnTujvLwcly5dUm9r1aqVOqwAgLOzM9q0aaP+2szMDA0bNlQ/Wr9Cp06d1H+uU6cOAgICcOHChVoZV3UYWIiIiIxQxSPvn0fdunU1vlYoFFVuKy8vf+7v9bwYWIiIiIxQ8+bNYWVlBZVKVem9li1b4vTp0ygqKlJvO3ToEJRKJV588cXn/t5HjhxR/7m0tBQnTpxAy5Ytn/u4z8LnsBARERkhS0tLTJ8+HZGRkTA3N0fnzp2Rl5eHX3/9FUOGDEF0dDSGDRuGOXPmIC8vDxMnTsTQoUPh7Oz83N97xYoVaN68OVq2bInPPvsMv//+O0aMGFELo6oeAwsREZGRmj17NurUqYOoqChkZ2fD1dUVY8aMgbW1Nfbs2YPw8HC89NJLsLa2xltvvYUlS5bUyveNjY1FbGws0tLS0KxZM3z33XdwdHSslWNXh3cJyRzvEiIiuXvWXUKkqeIuoVOnTsHf37/Gn+NdQkRERCQLvCT0/7HTQEREJF0MLERERFQjnp6eEGsmCS8JERERkeQxsBAREZHkMbAQEREBkniaq6mqjf9vOYeFiIhkzdzcHEqlEtnZ2WjUqBHMzc2hUCjELsskCIKAkpIS5OXlQalUwtzcXOdjMbAQEZGsKZVKeHl54datW8jOzha7HJNkbW2NJk2aaCy0qC0GFiIikj1zc3M0adIEpaWlKCsrE7sck2JmZoY6deo8d9eKgYWIiAh/rlT89GrFJA2cdEtERESSx8BCREREkqdTYFmxYgU8PT1haWmJwMBAHDt2rEaf27JlCxQKBfr376+xXRAEREVFwdXVFVZWVggKCkJ6eroupREREZEJ0jqwJCUlISIiAtHR0Th58iTatm2L4OBg3L59+5mfu3r1KqZOnYquXbtWei8uLg7Lli1DQkICjh49inr16iE4OBiPHj3StjwiIiIyQVoHliVLlmD06NEICwuDr68vEhISYG1tjbVr11b7mbKyMgwZMgRz586Ft7e3xnuCICA+Ph6zZs1Cv3794Ofnh8TERGRnZ2PHjh1aD4iIiIhMj1aBpaSkBCdOnEBQUNCfB1AqERQUhNTU1Go/N2/ePDg5OWHkyJGV3rty5QpycnI0jmlnZ4fAwMBqj1lcXIyCggKNFxEREZkurQLLnTt3UFZWBmdnZ43tzs7OyMnJqfIzP//8M7744gusXr26yvcrPqfNMWNiYmBnZ6d+ubu7azMMIiIiMjJ6vUvowYMHGDp0KFavXg1HR8daO+7MmTORn5+vfl2/fr3Wjk1ERETSo9WD4xwdHWFmZobc3FyN7bm5uXBxcam0f2ZmJq5evYo333xTva1iAaQ6derg0qVL6s/l5ubC1dVV45j+/v5V1mFhYQELCwttSiciIiIjplWHxdzcHB06dIBKpVJvKy8vh0qlQqdOnSrt7+Pjg7NnzyItLU396tu3L1577TWkpaXB3d0dXl5ecHFx0ThmQUEBjh49WuUxiYiISH60fjR/REQEhg0bhoCAAHTs2BHx8fEoKipCWFgYACA0NBSNGzdGTEwMLC0t0bp1a43P29vbA4DG9kmTJmHBggVo3rw5vLy8MHv2bLi5uVV6XgsRERHJk9aBJSQkBHl5eYiKikJOTg78/f2RnJysnjSblZWl9WqMkZGRKCoqwgcffID79++jS5cuSE5OhqWlpbblERERkQlSCIIgiF3E8yooKICdnR3y8/Nha2ur0zE8Z+yq5apq7mpsH9G+t1zHTURE4tPm5zfXEiIiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJY2AhIiIiyWNgISIiIsljYCEiIiLJ0ymwrFixAp6enrC0tERgYCCOHTtW7b7bt29HQEAA7O3tUa9ePfj7+2Pjxo0a+wwfPhwKhULj1atXL11KIyIiIhNUR9sPJCUlISIiAgkJCQgMDER8fDyCg4Nx6dIlODk5Vdq/QYMG+OSTT+Dj4wNzc3P88MMPCAsLg5OTE4KDg9X79erVC+vWrVN/bWFhoeOQiIiIyNRo3WFZsmQJRo8ejbCwMPj6+iIhIQHW1tZYu3Ztlft369YNAwYMQMuWLdG0aVOEh4fDz88PP//8s8Z+FhYWcHFxUb8cHByqraG4uBgFBQUaLyIiIjJdWgWWkpISnDhxAkFBQX8eQKlEUFAQUlNT//bzgiBApVLh0qVLeOWVVzTeS0lJgZOTE1588UWMHTsWd+/erfY4MTExsLOzU7/c3d21GQYREREZGa0Cy507d1BWVgZnZ2eN7c7OzsjJyan2c/n5+ahfvz7Mzc3Rp08ffP7553j99dfV7/fq1QuJiYlQqVRYtGgRDh48iN69e6OsrKzK482cORP5+fnq1/Xr17UZBhERERkZreew6MLGxgZpaWkoLCyESqVCREQEvL290a1bNwDAoEGD1Pu2adMGfn5+aNq0KVJSUtCjR49Kx7OwsOAcFyIiIhnRKrA4OjrCzMwMubm5Gttzc3Ph4uJS7eeUSiWaNWsGAPD398eFCxcQExOjDixP8/b2hqOjIzIyMqoMLERERCQvWl0SMjc3R4cOHaBSqdTbysvLoVKp0KlTpxofp7y8HMXFxdW+f+PGDdy9exeurq7alEdEREQmSutLQhERERg2bBgCAgLQsWNHxMfHo6ioCGFhYQCA0NBQNG7cGDExMQCeTJANCAhA06ZNUVxcjN27d2Pjxo1YuXIlAKCwsBBz587FW2+9BRcXF2RmZiIyMhLNmjXTuO2ZiIiI5EvrwBISEoK8vDxERUUhJycH/v7+SE5OVk/EzcrKglL5Z+OmqKgI48aNw40bN2BlZQUfHx98+eWXCAkJAQCYmZnhzJkz2LBhA+7fvw83Nzf07NkT8+fP5zwVIiIiAgAoBEEQxC7ieRUUFMDOzg75+fmwtbXV6RieM3bVclU1dzW2j2jfW67jJiIi8Wnz85trCREREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeQxsBAREZHkMbAQERGR5DGwEBERkeTpFFhWrFgBT09PWFpaIjAwEMeOHat23+3btyMgIAD29vaoV68e/P39sXHjRo19BEFAVFQUXF1dYWVlhaCgIKSnp+tSGhEREZkgrQNLUlISIiIiEB0djZMnT6Jt27YIDg7G7du3q9y/QYMG+OSTT5CamoozZ84gLCwMYWFh2LNnj3qfuLg4LFu2DAkJCTh69Cjq1auH4OBgPHr0SPeRERERkcnQOrAsWbIEo0ePRlhYGHx9fZGQkABra2usXbu2yv27deuGAQMGoGXLlmjatCnCw8Ph5+eHn3/+GcCT7kp8fDxmzZqFfv36wc/PD4mJicjOzsaOHTuqPGZxcTEKCgo0XkRERGS6tAosJSUlOHHiBIKCgv48gFKJoKAgpKam/u3nBUGASqXCpUuX8MorrwAArly5gpycHI1j2tnZITAwsNpjxsTEwM7OTv1yd3fXZhhERERkZLQKLHfu3EFZWRmcnZ01tjs7OyMnJ6faz+Xn56N+/fowNzdHnz598Pnnn+P1118HAPXntDnmzJkzkZ+fr35dv35dm2EQERGRkaljiG9iY2ODtLQ0FBYWQqVSISIiAt7e3ujWrZtOx7OwsICFhUXtFklERESSpVVgcXR0hJmZGXJzczW25+bmwsXFpdrPKZVKNGvWDADg7++PCxcuICYmBt26dVN/Ljc3F66urhrH9Pf316Y8IiIiMlFaXRIyNzdHhw4doFKp1NvKy8uhUqnQqVOnGh+nvLwcxcXFAAAvLy+4uLhoHLOgoABHjx7V6phERERkurS+JBQREYFhw4YhICAAHTt2RHx8PIqKihAWFgYACA0NRePGjRETEwPgyQTZgIAANG3aFMXFxdi9ezc2btyIlStXAgAUCgUmTZqEBQsWoHnz5vDy8sLs2bPh5uaG/v37195IiYiIyGhpHVhCQkKQl5eHqKgo5OTkwN/fH8nJyepJs1lZWVAq/2zcFBUVYdy4cbhx4wasrKzg4+ODL7/8EiEhIep9IiMjUVRUhA8++AD3799Hly5dkJycDEtLy1oYIhERERk7hSAIgthFPK+CggLY2dkhPz8ftra2Oh3Dc8auWq6q5q7G9hHte8t13EREJD5tfn5zLSEiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8BhYiIiKSPAYWIiIikjwGFiIiIpI8nQLLihUr4OnpCUtLSwQGBuLYsWPV7rt69Wp07doVDg4OcHBwQFBQUKX9hw8fDoVCofHq1auXLqURERGRCdI6sCQlJSEiIgLR0dE4efIk2rZti+DgYNy+fbvK/VNSUjB48GAcOHAAqampcHd3R8+ePXHz5k2N/Xr16oVbt26pX5s3b9ZtRERERGRytA4sS5YswejRoxEWFgZfX18kJCTA2toaa9eurXL/r776CuPGjYO/vz98fHywZs0alJeXQ6VSaexnYWEBFxcX9cvBwaHaGoqLi1FQUKDxIiIiItOlVWApKSnBiRMnEBQU9OcBlEoEBQUhNTW1Rsd4+PAhHj9+jAYNGmhsT0lJgZOTE1588UWMHTsWd+/erfYYMTExsLOzU7/c3d21GQYREREZGa0Cy507d1BWVgZnZ2eN7c7OzsjJyanRMaZPnw43NzeN0NOrVy8kJiZCpVJh0aJFOHjwIHr37o2ysrIqjzFz5kzk5+erX9evX9dmGERERGRk6hjym8XGxmLLli1ISUmBpaWlevugQYPUf27Tpg38/PzQtGlTpKSkoEePHpWOY2FhAQsLC4PUTEREROLTqsPi6OgIMzMz5ObmamzPzc2Fi4vLMz+7ePFixMbGYu/evfDz83vmvt7e3nB0dERGRoY25REREZGJ0iqwmJubo0OHDhoTZism0Hbq1Knaz8XFxWH+/PlITk5GQEDA336fGzdu4O7du3B1ddWmPCIiIjJRWt8lFBERgdWrV2PDhg24cOECxo4di6KiIoSFhQEAQkNDMXPmTPX+ixYtwuzZs7F27Vp4enoiJycHOTk5KCwsBAAUFhZi2rRpOHLkCK5evQqVSoV+/fqhWbNmCA4OrqVhEhERkTHTeg5LSEgI8vLyEBUVhZycHPj7+yM5OVk9ETcrKwtK5Z85aOXKlSgpKcHbb7+tcZzo6GjMmTMHZmZmOHPmDDZs2ID79+/Dzc0NPXv2xPz58zlPhYiIiADoOOl2woQJmDBhQpXvpaSkaHx99erVZx7LysoKe/bs0aUMIiIikgmuJURERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJLHwEJERESSx8BCREREksfAQkRERJKnU2BZsWIFPD09YWlpicDAQBw7dqzafVevXo2uXbvCwcEBDg4OCAoKqrS/IAiIioqCq6srrKysEBQUhPT0dF1KIyIiIhOkdWBJSkpCREQEoqOjcfLkSbRt2xbBwcG4fft2lfunpKRg8ODBOHDgAFJTU+Hu7o6ePXvi5s2b6n3i4uKwbNkyJCQk4OjRo6hXrx6Cg4Px6NEj3UdGREREJkPrwLJkyRKMHj0aYWFh8PX1RUJCAqytrbF27doq9//qq68wbtw4+Pv7w8fHB2vWrEF5eTlUKhWAJ92V+Ph4zJo1C/369YOfnx8SExORnZ2NHTt2PNfgiIiIyDRoFVhKSkpw4sQJBAUF/XkApRJBQUFITU2t0TEePnyIx48fo0GDBgCAK1euICcnR+OYdnZ2CAwMrPaYxcXFKCgo0HgRERGR6dIqsNy5cwdlZWVwdnbW2O7s7IycnJwaHWP69Olwc3NTB5SKz2lzzJiYGNjZ2alf7u7u2gyDiIiIjIxB7xKKjY3Fli1b8O2338LS0lLn48ycORP5+fnq1/Xr12uxSiIiIpKaOtrs7OjoCDMzM+Tm5mpsz83NhYuLyzM/u3jxYsTGxmLfvn3w8/NTb6/4XG5uLlxdXTWO6e/vX+WxLCwsYGFhoU3pREREZMS06rCYm5ujQ4cO6gmzANQTaDt16lTt5+Li4jB//nwkJycjICBA4z0vLy+4uLhoHLOgoABHjx595jGJiIhIPrTqsABAREQEhg0bhoCAAHTs2BHx8fEoKipCWFgYACA0NBSNGzdG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\n"},"metadata":{}}],"source":["t1l1.plot.bar(x='roi',y='comp');"]},{"cell_type":"markdown","metadata":{"id":"igrcUuxgg57D"},"source":["In colab, you have to install packages it doesn't have everytime you reconnect the runtime. I've commented this out here, since plotly is already installed locally for me. To install in colab, use a `!` in front of the unix command. In this case we're using the python package management system `pip` to install plotly, an interactive graphing envinronment."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"xNUIQXeNVb5t"},"outputs":[],"source":["#!pip install plotly"]},{"cell_type":"markdown","metadata":{"id":"pxF96JVUqJaZ"},"source":["We can create an interactive plot with `plotly`. This is a professionally developed package that makes interactive plotting very easy. Also, it renders nicely within colab or jupyter notebooks. For plotly graphics, I would suggest assigning the graph to a variable then calling that variable to show the plot. This way you can modify the plot later if you'd like."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":542},"id":"PDyD16qapxOc","outputId":"f12b4315-47fc-48e3-ab73-0875e6fc17d1","executionInfo":{"status":"ok","timestamp":1713130457384,"user_tz":240,"elapsed":3179,"user":{"displayName":"Brian Caffo","userId":"07979705296072332292"}}},"outputs":[{"output_type":"display_data","data":{"text/html":["\n","\n","\n","
\n","
\n","\n",""]},"metadata":{}}],"source":["import plotly.express as px\n","myplot = px.bar(t1l1, x='roi', y='volume')\n","myplot.show()"]}],"metadata":{"colab":{"provenance":[]},"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.13"}},"nbformat":4,"nbformat_minor":0}