{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bar Chart\n", "\n", "Bar chart is the bread and butter of data visualization. You can basically meet 90% of data analytics needs with bar chart.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "::::{grid}\n", ":gutter: 3\n", "\n", ":::{grid-item-card} Motivation\n", "Often, online examples have 1 final example with 50-line chart-generating code, which can be daunting for begginers. I aim to to display, incremental, line-by-line additions with the corresponding outputs, which is best for learning.\n", ":::\n", "\n", ":::{grid-item-card} Approach\n", "Typically, most data visualization experts usually do it for creating \"dashboard\" output, but for me, data visualization is a mechanism to understand data, and often few of the output ends up becoming useful by chance. \n", ":::\n", "\n", "::::\n", "\n", "The \"iterative\" development is often unintentionally discouraged given today's \"Scrum\" culture - you need to definite your X and Y before you even get to the data. Data analysis, especially on new data, requires a lot of exploration." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Playground Data\n", "\n", "Polars is my favorite dataframe library. There is an interesting open-source effort in biomedical space called OpenTargets.\n", "\n", "Downloaded the (tab-separated value) from OpenTargets's `IgA Glomerulonephritis`: https://platform.opentargets.org/disease/EFO_0004194 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Alt text](iga_neph.png)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (5, 12)
diseaseIddiseaseNamedrugIddrugNametypemechanismOfActionactionTypesymbolnamephasestatussource
strstrstrstrstrstrstrstrstri64strstr
"EFO_0004194""IGA glomerulon…"CHEMBL429910""DAPAGLIFLOZIN""Small molecule…"Sodium/glucose…"Inhibitor""SLC5A2""solute carrier…4"Not yet recrui…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1168""RAMIPRIL""Small molecule…"Angiotensin-co…"Inhibitor""ACE""angiotensin I …4"Not yet recrui…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1535""HYDROXYCHLOROQ…"Small molecule…"Toll-like rece…"Antagonist""TLR7""toll like rece…4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1639""ALISKIREN""Small molecule…"Renin inhibito…"Inhibitor""REN""renin"4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL4594217""CANAGLIFLOZIN""Small molecule…"Sodium/glucose…"Inhibitor""SLC5A2""solute carrier…4"Not yet recrui…"https://clinic…
" ], "text/plain": [ "shape: (5, 12)\n", "┌────────────┬────────────┬────────────┬───────────┬───┬───────────┬───────┬───────────┬───────────┐\n", "│ diseaseId ┆ diseaseNam ┆ drugId ┆ drugName ┆ … ┆ name ┆ phase ┆ status ┆ source │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ str ┆ --- ┆ str ┆ str ┆ ┆ str ┆ i64 ┆ str ┆ str │\n", "│ ┆ str ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", "╞════════════╪════════════╪════════════╪═══════════╪═══╪═══════════╪═══════╪═══════════╪═══════════╡\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL4299 ┆ DAPAGLIFL ┆ … ┆ solute ┆ 4 ┆ Not yet ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ 10 ┆ OZIN ┆ ┆ carrier ┆ ┆ recruitin ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ family 5 ┆ ┆ g ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ member 2 ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL1168 ┆ RAMIPRIL ┆ … ┆ angiotens ┆ 4 ┆ Not yet ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ ┆ ┆ ┆ in I conv ┆ ┆ recruitin ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ erting ┆ ┆ g ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ enzyme ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL1535 ┆ HYDROXYCH ┆ … ┆ toll like ┆ 4 ┆ Completed ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ ┆ LOROQUINE ┆ ┆ receptor ┆ ┆ ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ 7 ┆ ┆ ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL1639 ┆ ALISKIREN ┆ … ┆ renin ┆ 4 ┆ Completed ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ ┆ ┆ ┆ ┆ ┆ ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ ┆ ┆ ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL4594 ┆ CANAGLIFL ┆ … ┆ solute ┆ 4 ┆ Not yet ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ 217 ┆ OZIN ┆ ┆ carrier ┆ ┆ recruitin ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ family 5 ┆ ┆ g ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ member 2 ┆ ┆ ┆ ct2/s… │\n", "└────────────┴────────────┴────────────┴───────────┴───┴───────────┴───────┴───────────┴───────────┘" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import polars as pl\n", "\n", "df = pl.read_csv(\"data/EFO_0004194-known-drugs.tsv\", separator=\"\\t\")\n", "df.head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Viz as exploratory data analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "## Preview the data\n", "\n", "For starters, an easy way to explore complex datasets like this is to explore seemingly obvious ones.\n", "\n", "The data contains:\n", "- row-by-row information for disease IgA glomerulonephritis (IgA nephropathy)\n", "\n", "## Base Bar Chart\n", "\n", "`status` column is relatively understandable, even if you don't come from biomedical background.\n", "\n", "Let's start with plotting a count of different `status` counts.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import altair as alt\n", "\n", "fig = (\n", " alt.Chart(df).mark_bar().encode(\n", " x=\"distinct(drugId):Q\",\n", " y=alt.X(\"status:N\")\n", " )\n", ")\n", "\n", "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adding a Tooltip" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import altair as alt\n", "\n", "fig = (\n", " alt.Chart(df).mark_bar().encode(\n", " x=\"distinct(drugId):Q\",\n", " y=alt.Y(\"status:N\"),\n", " tooltip=[\n", " \"distinct(drugId):Q\", \n", " \"status:N\"\n", " ]\n", " )\n", ")\n", "\n", "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reorder Y-axis (status) by x-axis (count)\n", "\n", "Altair syntax allows you to sort by another field. In our case, we want to sort by the data result mapped to \"x\" (which is `distinct(drugId)`) but in descending order.\n", "\n", "When you start to add in more complex encodings and parameters, you have to start using Altair's object representations such as `alt.X()` or `alt.Color()` rather than the column names themselves (this is a shortcut to an extent)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import altair as alt\n", "\n", "fig = (\n", " alt.Chart(df).mark_bar().encode(\n", " x=\"distinct(drugId):Q\",\n", " y=alt.Y(\"status:N\").sort(\"-x\"),\n", " tooltip=[\n", " \"distinct(drugId):Q\", \n", " \"status:N\"\n", " ]\n", " )\n", ")\n", "\n", "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Add Color encoding" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import altair as alt\n", "\n", "fig = (\n", " alt.Chart(df).mark_bar().encode(\n", " x=\"distinct(drugId):Q\",\n", " y=alt.Y(\"status:N\").sort(\"-x\"),\n", " color=alt.Color(\"status:N\"),\n", " tooltip=[\n", " \"distinct(drugId):Q\", \n", " \"status:N\"\n", " ]\n", " )\n", ")\n", "\n", "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Remove Unnecesary Titles\n", "\n", "Many times, I find titles unnecessary or not-presentation ready. \n", "\n", "For such cases, it's very easy to modify encoding channel titles (e.g. axis titles, legend titles) in Altair.\n", "\n", "Use `.title()` after each encoding definition." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import altair as alt\n", "\n", "fig = (\n", " alt.Chart(df).mark_bar().encode(\n", " x=alt.X(\"distinct(drugId):Q\").title(\"Unique Drugs\"),\n", " y=alt.Y(\"status:N\").sort(\"-x\").title(\"Status\"),\n", " color=alt.Color(\"status:N\").title(None),\n", " tooltip=[\n", " \"distinct(drugId):Q\", \n", " \"status:N\"\n", " ]\n", " )\n", ")\n", "\n", "fig" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import altair as alt\n", "\n", "fig = (\n", " alt.Chart(df).mark_bar().encode(\n", " x=alt.X(\"distinct(drugId):Q\").title(\"Unique Drugs\"),\n", " y=alt.Y(\"status:N\").sort(\"-x\").title(\"Status\"),\n", " color=alt.Color(\"status:N\").title(None),\n", " tooltip=[\n", " \"distinct(drugId):Q\", \n", " \"status:N\"\n", " ]\n", " )\n", ").properties(\n", " title=\"Drug Trials for IgA Nephropathy\",\n", ")\n", "\n", "fig" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alt.Chart(df).mark_bar().encode(\n", " x=alt.X(\"distinct(drugId):Q\").title(\"Unique Drugs\"),\n", " y=alt.Y(\"mechanismOfAction:N\").sort(\"-x\").title(\"Status\"),\n", " tooltip=[\n", " \"distinct(drugId):Q\", \n", " \"mechanismOfAction:N\"\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "shape: (86, 12)
diseaseIddiseaseNamedrugIddrugNametypemechanismOfActionactionTypesymbolnamephasestatussource
strstrstrstrstrstrstrstrstri64strstr
"EFO_0004194""IGA glomerulon…"CHEMBL429910""DAPAGLIFLOZIN""Small molecule…"Sodium/glucose…"Inhibitor""SLC5A2""solute carrier…4"Not yet recrui…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1168""RAMIPRIL""Small molecule…"Angiotensin-co…"Inhibitor""ACE""angiotensin I …4"Not yet recrui…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1535""HYDROXYCHLOROQ…"Small molecule…"Toll-like rece…"Antagonist""TLR7""toll like rece…4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1639""ALISKIREN""Small molecule…"Renin inhibito…"Inhibitor""REN""renin"4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL4594217""CANAGLIFLOZIN""Small molecule…"Sodium/glucose…"Inhibitor""SLC5A2""solute carrier…4"Not yet recrui…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1535""HYDROXYCHLOROQ…"Small molecule…"Toll-like rece…"Antagonist""TLR9""toll like rece…4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL578""ENALAPRIL""Small molecule…"Angiotensin-co…"Inhibitor""ACE""angiotensin I …4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1456""MYCOPHENOLATE …"Small molecule…"Inosine-5'-mon…"Inhibitor""IMPDH1""inosine monoph…4"Unknown status…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1069""VALSARTAN""Small molecule…"Type-1 angiote…"Antagonist""AGTR1""angiotensin II…4"Unknown status…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1690""HYDROXYCHLOROQ…"Small molecule…"Toll-like rece…"Antagonist""TLR7""toll like rece…4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1535""HYDROXYCHLOROQ…"Small molecule…"Toll-like rece…"Antagonist""TLR9""toll like rece…4"Unknown status…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL608""PROBUCOL""Small molecule…"ATP-binding ca…"Inhibitor""ABCA1""ATP binding ca…4"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL4594460""AT-1501""Unknown""CD40 ligand in…"Inhibitor""CD40LG""CD40 ligand"2"Recruiting""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1742986""ATACICEPT""Protein""Tumor necrosis…"Inhibitor""TNFSF13""TNF superfamil…2"Active, not re…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL4594614""SIBEPRENLIMAB""Antibody""Tumor necrosis…"Inhibitor""TNFSF13""TNF superfamil…2"Active, not re…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL4594579""FELZARTAMAB""Antibody""Lymphocyte dif…"Inhibitor""CD38""CD38 molecule"2"Recruiting""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1487""ATORVASTATIN""Small molecule…"HMG-CoA reduct…"Inhibitor""HMGCR""3-hydroxy-3-me…2"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL3989871""AVACOPAN""Small molecule…"C5a anaphylato…"Antagonist""C5AR1""complement C5a…2"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL1370""BUDESONIDE""Small molecule…"Glucocorticoid…"Agonist""NR3C1""nuclear recept…2"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL2103830""FOSTAMATINIB""Small molecule…"Tyrosine-prote…"Inhibitor""SYK""spleen associa…2"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL578""ENALAPRIL""Small molecule…"Angiotensin-co…"Inhibitor""ACE""angiotensin I …2"Completed""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL3989516""FOSTAMATINIB D…"Small molecule…"Tyrosine-prote…"Inhibitor""SYK""spleen associa…2"Withdrawn""https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL4297722""CEMDISIRAN""Oligonucleotid…"Complement C5 …"Rnai inhibitor…"C5""complement C5"2"Active, not re…"https://clinic…
"EFO_0004194""IGA glomerulon…"CHEMBL4594614""SIBEPRENLIMAB""Antibody""Tumor necrosis…"Inhibitor""TNFSF13""TNF superfamil…1"Completed""https://clinic…
" ], "text/plain": [ "shape: (86, 12)\n", "┌────────────┬────────────┬────────────┬───────────┬───┬───────────┬───────┬───────────┬───────────┐\n", "│ diseaseId ┆ diseaseNam ┆ drugId ┆ drugName ┆ … ┆ name ┆ phase ┆ status ┆ source │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ str ┆ --- ┆ str ┆ str ┆ ┆ str ┆ i64 ┆ str ┆ str │\n", "│ ┆ str ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", "╞════════════╪════════════╪════════════╪═══════════╪═══╪═══════════╪═══════╪═══════════╪═══════════╡\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL4299 ┆ DAPAGLIFL ┆ … ┆ solute ┆ 4 ┆ Not yet ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ 10 ┆ OZIN ┆ ┆ carrier ┆ ┆ recruitin ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ family 5 ┆ ┆ g ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ member 2 ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL1168 ┆ RAMIPRIL ┆ … ┆ angiotens ┆ 4 ┆ Not yet ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ ┆ ┆ ┆ in I conv ┆ ┆ recruitin ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ erting ┆ ┆ g ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ enzyme ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL1535 ┆ HYDROXYCH ┆ … ┆ toll like ┆ 4 ┆ Completed ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ ┆ LOROQUINE ┆ ┆ receptor ┆ ┆ ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ 7 ┆ ┆ ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL1639 ┆ ALISKIREN ┆ … ┆ renin ┆ 4 ┆ Completed ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ ┆ ┆ ┆ ┆ ┆ ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ ┆ ┆ ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ct2/s… │\n", "│ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … ┆ … │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL578 ┆ ENALAPRIL ┆ … ┆ angiotens ┆ 2 ┆ Completed ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ ┆ ┆ ┆ in I conv ┆ ┆ ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ erting ┆ ┆ ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ enzyme ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL3989 ┆ FOSTAMATI ┆ … ┆ spleen ┆ 2 ┆ Withdrawn ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ 516 ┆ NIB ┆ ┆ associate ┆ ┆ ┆ linicaltr │\n", "│ ┆ is ┆ ┆ DISODIUM ┆ ┆ d ┆ ┆ ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ tyrosine ┆ ┆ ┆ ct2/s… │\n", "│ ┆ ┆ ┆ ┆ ┆ kinas… ┆ ┆ ┆ │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL4297 ┆ CEMDISIRA ┆ … ┆ complemen ┆ 2 ┆ Active, ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ 722 ┆ N ┆ ┆ t C5 ┆ ┆ not recru ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ ┆ ┆ iting ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ct2/s… │\n", "│ EFO_000419 ┆ IGA glomer ┆ CHEMBL4594 ┆ SIBEPRENL ┆ … ┆ TNF super ┆ 1 ┆ Completed ┆ https://c │\n", "│ 4 ┆ ulonephrit ┆ 614 ┆ IMAB ┆ ┆ family ┆ ┆ ┆ linicaltr │\n", "│ ┆ is ┆ ┆ ┆ ┆ member 13 ┆ ┆ ┆ ials.gov/ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ct2/s… │\n", "└────────────┴────────────┴────────────┴───────────┴───┴───────────┴───────┴───────────┴───────────┘" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "data-expressions-XOHyUNvQ-py3.10", "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" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }