{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualizing Zeolite Framework Classifications\n", "\n", "Find all zeolite topologies that fit certain criteria:\n", "\n", "- largest channel is an 8 MR\n", "- largest channel is a 10 MR\n", "- largest channel is a 12 MR\n", "- realizable as AlPO\n", "- split plots by dimensionality of the channels, 0D, 1D, 2D, 3D\n", "\n", "### First some important imports " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(global) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", " window._bokeh_onload_callbacks = [];\n", " window._bokeh_is_loading = undefined;\n", " }\n", "\n", "\n", " \n", " if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n", " window._bokeh_timeout = Date.now() + 5000;\n", " window._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " if (window.Bokeh !== undefined) {\n", " document.getElementById(\"fbfa7e97-2730-4b1e-a5d7-c4ab10aed8c1\").textContent = \"BokehJS successfully loaded.\";\n", " } else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", " delete window._bokeh_onload_callbacks\n", " console.info(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(js_urls, callback) {\n", " window._bokeh_onload_callbacks.push(callback);\n", " if (window._bokeh_is_loading > 0) {\n", " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " window._bokeh_is_loading = js_urls.length;\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var s = document.createElement('script');\n", " s.src = url;\n", " s.async = false;\n", " s.onreadystatechange = s.onload = function() {\n", " window._bokeh_is_loading--;\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", " run_callbacks()\n", " }\n", " };\n", " s.onerror = function() {\n", " console.warn(\"failed to load library \" + url);\n", " };\n", " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", " }\n", " };var element = document.getElementById(\"fbfa7e97-2730-4b1e-a5d7-c4ab10aed8c1\");\n", " if (element == null) {\n", " console.log(\"Bokeh: ERROR: autoload.js configured with elementid 'fbfa7e97-2730-4b1e-a5d7-c4ab10aed8c1' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.js\"];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " document.getElementById(\"fbfa7e97-2730-4b1e-a5d7-c4ab10aed8c1\").textContent = \"BokehJS is loading...\";\n", " },\n", " function(Bokeh) {\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.4.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.4.min.css\");\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((window.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i](window.Bokeh);\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < window._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!window._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " window._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(\"fbfa7e97-2730-4b1e-a5d7-c4ab10aed8c1\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (window._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(js_urls, function() {\n", " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(this));" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import math\n", "import pandas as pd\n", "\n", "from bokeh.io import output_notebook\n", "from bokeh.plotting import figure, show, output_file\n", "from bokeh.charts import Bar\n", "from bokeh.charts.attributes import cat\n", "from bokeh.models import HoverTool, ColumnDataSource, FixedTicker\n", "from bokeh.palettes import Category10, Set1, Spectral\n", "\n", "output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Obtain the data\n", "\n", "The data is accessed from the [``zefram``](https://bitbucket.org/lukaszmentel/zefram) package that has a collection of [IZA](http://www.iza-structure.org/databases/) and [ZEOMICS](http://helios.princeton.edu/zeomics/) databases accessible from Python." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from zefram import get_session, get_table, framework, Framework, RingSize" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data is retrieved as ``pandas.DataFrame`` allowing convenient manipulations and vizualiztions." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 229 entries, 0 to 228\n", "Data columns (total 45 columns):\n", "id 229 non-null int64\n", "code 229 non-null object\n", "atoms 204 non-null float64\n", "cages 204 non-null float64\n", "channels 204 non-null float64\n", "connections 204 non-null float64\n", "junctions 204 non-null float64\n", "lcd 204 non-null float64\n", "name 204 non-null object\n", "pld 201 non-null float64\n", "portals 204 non-null float64\n", "tpw_abs 204 non-null float64\n", "tpw_pct 204 non-null float64\n", "url_zeomics 204 non-null object\n", "a 229 non-null float64\n", "b 229 non-null float64\n", "c 229 non-null float64\n", "alpha 229 non-null float64\n", "beta 229 non-null float64\n", "gamma 229 non-null float64\n", "accessible_area 225 non-null float64\n", "accessible_area_m2pg 225 non-null float64\n", "accessible_volume 225 non-null float64\n", "accessible_volume_pct 225 non-null float64\n", "channel_dim 229 non-null int64\n", "cif 229 non-null object\n", "framework_density 229 non-null float64\n", "isdisordered 229 non-null bool\n", "isinterrupted 229 non-null bool\n", "maxdsd_a 225 non-null float64\n", "maxdsd_b 225 non-null float64\n", "maxdsd_c 225 non-null float64\n", "maxdsi 225 non-null float64\n", "occupiable_area 225 non-null float64\n", "occupiable_area_m2pg 225 non-null float64\n", "occupiable_volume 225 non-null float64\n", "occupiable_volume_pct 225 non-null float64\n", "rdls 224 non-null float64\n", "sbu 229 non-null object\n", "specific_accessible_area 225 non-null float64\n", "specific_occupiable_area 225 non-null float64\n", "td10 229 non-null float64\n", "topological_density 176 non-null float64\n", "url_iza 229 non-null object\n", "_spacegroup_id 229 non-null int64\n", "dtypes: bool(2), float64(34), int64(3), object(6)\n", "memory usage: 77.5+ KB\n" ] } ], "source": [ "df = get_table('frameworks')\n", "df.info()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def assign_label(rings):\n", " '''\n", " assign string labels to a list of ints\n", " matching the usual zeolite pore size labels\n", " '''\n", "\n", " if max(rings) == 8:\n", " return 's'\n", " elif max(rings) == 10:\n", " if 8 in rings:\n", " return 'ms'\n", " else:\n", " return 'm'\n", " elif max(rings) == 12:\n", " if 10 in rings and 8 in rings:\n", " return 'lms'\n", " elif 10 in rings:\n", " return 'lm'\n", " elif 8 in rings:\n", " return 'ls'\n", " else:\n", " return 'l'\n", " \n", " else:\n", " return None\n", " \n", "def are_all_even(lst):\n", " 'check if all the elements of a list are even numbers'\n", "\n", " return all(x % 2 == 0 for x in lst)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.loc[:, 'Rings'] = [[r.size for r in framework(row['code']).ring_sizes] for i, row in df.iterrows()]\n", "# get the largest ring\n", "df.loc[:, 'max_ring'] = df['Rings'].apply(max)\n", "# assign a string label\n", "df.loc[:, 'ring_label'] = df.Rings.apply(assign_label)\n", "df.loc[:, 'alpo_possible'] = df.Rings.apply(are_all_even)\n", "df.rename(columns={'lcd': 'Largest cavity dia.', 'pld': 'Pore limiting dia.',\n", " 'maxdsi': 'Max dia. of inc. sphere'}, inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Histogram\n", "\n", "Now we can plot a histogram depicting the distirubtion of frameworks depneding on the largest channel." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p = Bar(df, 'max_ring', values='max_ring', agg='count', group='channel_dim',\n", " xlabel='Largest channel [#T atoms]', ylabel='Number of frameworks',\n", " legend='top_right', plot_width=760)\n", "show(p)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "gencols = ['code', 'channel_dim', 'Largest cavity dia.', 'Pore limiting dia.',\n", " 'Max dia. of inc. sphere', 'Rings', 'ring_label', 'alpo_possible']\n", "df0d = df.loc[df['channel_dim'] == 0, gencols].copy()\n", "df1d = df.loc[df['channel_dim'] == 1, gencols].copy()\n", "df2d = df.loc[df['channel_dim'] == 2, gencols].copy()\n", "df3d = df.loc[df['channel_dim'] == 3, gencols].copy()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting function" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.utils.extmath import cartesian\n", "\n", "def show_plot(dataframe, width=750, height=300,radius=0.4, alpha=0.6, title=None, showit=True):\n", "\n", " df = dataframe.copy()\n", "\n", " colors = {'s': Spectral[4][0], 'm': Spectral[4][1], 'l': Spectral[4][2], 'alpo': Spectral[4][3]}\n", "\n", " ncols = 10\n", " nitems = df.shape[0]\n", "\n", " if nitems % ncols == 0:\n", " nrows = nitems / ncols\n", " else:\n", " nrows = nitems // ncols + 1\n", "\n", " xy = cartesian([np.arange(nrows), np.arange(ncols)])\n", "\n", " df.loc[:, 'x'] = xy[:nitems, 1]\n", " df.loc[:, 'y'] = xy[:nitems, 0]\n", "\n", " source = ColumnDataSource(data=df)\n", "\n", " hover = HoverTool(\n", " tooltips=[\n", " (\"Pore limiting diameter\", \"@Pore limiting dia.\"),\n", " (\"Largest cavity D.\", \"@Largest cavity dia.\"),\n", " (\"Max. D. Sph. I.\", \"@maxdsi\"),\n", " (\"Dimensionality\", \"@channel_dim\"),\n", " (\"Rings\", \"@rings\")\n", " ]\n", " )\n", "\n", " p = figure(title=title,\n", " x_range = (df.x.min() - 0.5, df.x.max() + 0.5),\n", " y_range = (df.y.max() + 0.5, df.y.min() - 0.5),\n", " plot_width=width, plot_height=height, tools='save')\n", "\n", " # empty circles\n", " x = df.loc[df.ring_label.str.len().isnull(), 'x'].values\n", " y = df.loc[df.ring_label.str.len().isnull(), 'y'].values\n", " p.circle(x, y, radius=radius, color='#ffffff', fill_alpha=1.0, line_color='#888888')\n", " \n", " # full circles\n", " mask = df.ring_label.str.len() == 1\n", " x = df.loc[mask, 'x'].values\n", " y = df.loc[mask, 'y'].values\n", " c = [colors[k] for k in df.loc[mask, 'ring_label']]\n", " p.circle(x, y, radius=radius, color=c, fill_alpha=alpha, line_color='#888888')\n", " \n", " # half circles/wedges\n", " mask = df.ring_label.str.len() == 2 \n", " x = df.loc[mask, 'x'].values\n", " y = df.loc[mask, 'y'].values\n", " c1 = [colors[k] for k in df.loc[mask, 'ring_label'].str[0]]\n", " c2 = [colors[k] for k in df.loc[mask, 'ring_label'].str[1]]\n", " p.wedge(x, y, radius=radius, start_angle=math.pi/4, end_angle=5*math.pi/4,\n", " color=c1, alpha=alpha, direction=\"anticlock\")\n", " p.wedge(x, y, radius=radius, start_angle=5*math.pi/4, end_angle=math.pi/4,\n", " color=c2, alpha=alpha, direction=\"anticlock\")\n", " \n", " # third circles/wedges\n", " mask = df.ring_label.str.len() == 3\n", " x = df.loc[mask, 'x'].values\n", " y = df.loc[mask, 'y'].values\n", " p.wedge(x, y, radius=radius, start_angle=math.pi/2, end_angle=7*math.pi/6,\n", " color=colors['s'], alpha=alpha, direction=\"anticlock\")\n", " p.wedge(x, y, radius=radius, start_angle=7*math.pi/6, end_angle=11*math.pi/6,\n", " color=colors['m'], alpha=alpha, direction=\"anticlock\")\n", " p.wedge(x, y, radius=radius, start_angle=11*math.pi/6, end_angle=math.pi/2,\n", " color=colors['l'], alpha=alpha, direction=\"anticlock\")\n", " \n", " x = df.loc[df.alpo_possible, 'x'].values\n", " y = df.loc[df.alpo_possible, 'y'].values\n", " p.circle(x, y, radius=radius + 0.02, color='#ffffff', fill_alpha=0.0,\n", " line_color=colors['alpo'], line_width=5.0, line_alpha=0.6)\n", " \n", " maxx = df['x'].max()\n", " maxy = df['y'].max()\n", " p.circle([maxx-3.2, maxx-2.2, maxx-1.2, maxx-0.2], [maxy] * 4,\n", " color=[colors['s'], colors['m'], colors['l'], colors['alpo']], radius=0.1, alpha=alpha)\n", " p.text([maxx-3, maxx-2, maxx-1, maxx-0.05], [maxy] * 4, text=['8', '10', '12', 'AlPO'],\n", " text_alpha=0.7, text_align='left', text_baseline='middle')\n", "\n", " text_props = {\n", " \"text_font\": \"times\",\n", " \"text_font_style\": \"bold\",\n", " \"text_font_size\": \"13pt\",\n", " \"source\": source,\n", " \"angle\": 0,\n", " \"color\": \"black\",\n", " \"text_alpha\": 0.7,\n", " \"text_align\": \"center\",\n", " \"text_baseline\": \"middle\"\n", " }\n", "\n", " p.text(x=\"x\", y=\"y\", text=\"code\", **text_props)\n", " p.grid.grid_line_color = None\n", "\n", " p.axis[0].ticker.num_minor_ticks = 0\n", " p.axis[1].ticker.num_minor_ticks = 0\n", " p.axis.major_label_text_font_size = '0pt'\n", " p.axis.major_tick_line_color = None\n", "\n", " p.border_fill_color = 'white'\n", " p.outline_line_width = 0\n", " p.axis.visible = False\n", " \n", " \n", " \n", " p.legend.location = \"bottom_right\"\n", " p.legend.orientation = \"horizontal\"\n", "\n", " if showit:\n", " show(p)\n", " else:\n", " return p" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_plot(df0d, width=760, height=250,radius=0.44, title='Zeolite Topologies')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_plot(df1d, width=760, height=530,radius=0.44, title='Unidirectional Zeolite Topologies')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_plot(df2d, width=760, height=450,radius=0.44, title='Bidirectional Zeolite Topologies')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_plot(df3d, width=760, height=750,radius=0.44, title='Tridirectional Zeolite Topologies')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bar charts with pore sizes" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def diameters_bar_plot(data, category, title=None, showit=True):\n", " '''\n", " plot a bar chart for a given category\n", " \n", " Args:\n", " data (pd.DataFrame) :\n", " \n", " category (str) : 's', 'm', 'l', 'ms',...\n", "\n", " '''\n", "\n", " mask = data.ring_label == category\n", " cols = ['code', 'Max dia. of inc. sphere', 'Largest cavity dia.', 'Pore limiting dia.']\n", " melted = pd.melt(data.loc[mask, cols].sort_values(by='Largest cavity dia.'),\n", " id_vars=['code'], value_vars=cols[1:])\n", "\n", " p = Bar(melted, label=cat('code', sort=False), values=\"value\", group=\"variable\",\n", " legend=\"top_left\", xlabel='Framwork code', ylabel='Length [Angstrom]',\n", " plot_width=750, title=title)\n", " \n", " if showit:\n", " show(p)\n", " else:\n", " return p" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diameters_bar_plot(df, 's', title='Small pore frameworks (8MR)')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diameters_bar_plot(df, 'm', title='Medium pore frameworks (10MR)')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diameters_bar_plot(df, 'l', title='Large pore frameworks (12MR)')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diameters_bar_plot(df, 'ms', title='Small-medium pore frameworks (8 and 10 MR)')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diameters_bar_plot(df, 'lm', title='Medium-large pore frameworks (10 and 12 MR)')" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diameters_bar_plot(df, 'ls', title='Small-large pore frameworks (8 and 12 MR)')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "diameters_bar_plot(df, 'lms', title='Small-medium-large pore frameworks (8, 10 and 12 MR)')" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "application/json": { "Software versions": [ { "module": "Python", "version": "3.6.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]" }, { "module": "IPython", "version": "6.0.0" }, { "module": "OS", "version": "Linux 3.16.0 4 amd64 x86_64 with debian 8.7" }, { "module": "bokeh", "version": "0.12.5" }, { "module": "pandas", "version": "0.19.2" }, { "module": "numpy", "version": "1.12.1" }, { "module": "zefram", "version": "0.1.2" } ] }, "text/html": [ "
SoftwareVersion
Python3.6.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
IPython6.0.0
OSLinux 3.16.0 4 amd64 x86_64 with debian 8.7
bokeh0.12.5
pandas0.19.2
numpy1.12.1
zefram0.1.2
Mon May 08 00:27:01 2017 CEST
" ], "text/latex": [ "\\begin{tabular}{|l|l|}\\hline\n", "{\\bf Software} & {\\bf Version} \\\\ \\hline\\hline\n", "Python & 3.6.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] \\\\ \\hline\n", "IPython & 6.0.0 \\\\ \\hline\n", "OS & Linux 3.16.0 4 amd64 x86\\_64 with debian 8.7 \\\\ \\hline\n", "bokeh & 0.12.5 \\\\ \\hline\n", "pandas & 0.19.2 \\\\ \\hline\n", "numpy & 1.12.1 \\\\ \\hline\n", "zefram & 0.1.2 \\\\ \\hline\n", "\\hline \\multicolumn{2}{|l|}{Mon May 08 00:27:01 2017 CEST} \\\\ \\hline\n", "\\end{tabular}\n" ], "text/plain": [ "Software versions\n", "Python 3.6.1 64bit [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\n", "IPython 6.0.0\n", "OS Linux 3.16.0 4 amd64 x86_64 with debian 8.7\n", "bokeh 0.12.5\n", "pandas 0.19.2\n", "numpy 1.12.1\n", "zefram 0.1.2\n", "Mon May 08 00:27:01 2017 CEST" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%version_information bokeh, pandas, numpy, zefram" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }