You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by zj...@apache.org on 2020/02/06 08:00:28 UTC

[zeppelin] branch master updated: [ZEPPELIN-4589]. Improve Python tutorial notes

This is an automated email from the ASF dual-hosted git repository.

zjffdu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zeppelin.git


The following commit(s) were added to refs/heads/master by this push:
     new 88dd28f  [ZEPPELIN-4589]. Improve Python tutorial notes
88dd28f is described below

commit 88dd28f7800c5b57288dec169c569790043cfc34
Author: Jeff Zhang <zj...@apache.org>
AuthorDate: Wed Feb 5 15:13:35 2020 +0800

    [ZEPPELIN-4589]. Improve Python tutorial notes
    
    ### What is this PR for?
    
    In this PR, I added 4 python tutorial notes:
    * IPython Basic (cover the basic ipython usage in Zeppelin)
    * IPython Visualization Tutorial (cover the how to do visualization via IPython in Zeppelin)
    * Keras Binary Classification (IMDB) (cover keras usage in Zeppelin)
    * Matplotlib (Python, PySpark) (How to use matplotlib in vanilla python interpreter)
    
    ### What type of PR is it?
    [ Documentation ]
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    * https://issues.apache.org/jira/browse/ZEPPELIN-4589
    
    ### How should this be tested?
    * CI pass
    
    ### Screenshots (if appropriate)
    
    ### Questions:
    * Does the licenses files need update? No
    * Is there breaking changes for older versions? No
    * Does this needs documentation? No
    
    Author: Jeff Zhang <zj...@apache.org>
    
    Closes #3630 from zjffdu/ZEPPELIN-4589 and squashes the following commits:
    
    8391c2508 [Jeff Zhang] [ZEPPELIN-4589]. Improve Python tutorial notes
---
 .../Python Tutorial/IPython Basic_2EYDJKFFY.zpln   |  638 ++++++++++++
 .../IPython Visualization Tutorial_2F1S9ZY8Z.zpln  | 1093 ++++++++++++++++++++
 ...ras Binary Classification (IMDB)_2F2AVWJ77.zpln |  507 +++++++++
 .../Matplotlib (Python, PySpark)_2C2AUG798.zpln    |  288 +++---
 4 files changed, 2386 insertions(+), 140 deletions(-)

diff --git a/notebook/Python Tutorial/IPython Basic_2EYDJKFFY.zpln b/notebook/Python Tutorial/IPython Basic_2EYDJKFFY.zpln
new file mode 100644
index 0000000..85c0aba
--- /dev/null
+++ b/notebook/Python Tutorial/IPython Basic_2EYDJKFFY.zpln	
@@ -0,0 +1,638 @@
+{
+  "paragraphs": [
+    {
+      "title": "Introduction",
+      "text": "%md\n\nIPython is more powerful than the default python interpreter with extra functionality. You can use IPython with Python2 or Python3 which depends on which python you set `zeppelin.python`. This tutorial will teach you how to use IPython and what kind of fancy feature IPython provides for you. ",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:16:03.242",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003cp\u003eIPython is more powerful than the default python interpreter with extra functionality. You can use IPython with Python2 or Python3 which depends on which python you set \u003ccode\u003ezeppelin.python\u003c/code\u003e. This tutorial will teach you how to use IPython and what kind of fancy feature IPython provides for you.\u003c/p\u003e\n\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128399_1705920905",
+      "id": "20180118-105449_1130638270",
+      "dateCreated": "2020-02-05 14:12:08.399",
+      "dateStarted": "2020-02-05 14:12:44.213",
+      "dateFinished": "2020-02-05 14:12:45.639",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# Prerequisite\n\nFirst you need to use Zeppelin 0.8.0 or afterwards. You need to install the following 2 packages to make IPython work in Jupyter.\n\n* jupyter `pip install jupyter`\n* grpcio `pip install grpcio`\n* protobuf `pip install protobuf`\n\nIf you have anaconda installed, then you just need to install `grpcio` and `protobuf` as Jupyter is already included in anaconda.\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:45:28.518",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003ePrerequisite\u003c/h1\u003e\n\u003cp\u003eFirst you need to use Zeppelin 0.8.0 or afterwards. You need to install the following 2 packages to make IPython work in Jupyter.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ejupyter \u003ccode\u003epip install jupyter\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003egrpcio \u003ccode\u003epip install grpcio\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eprotobuf \u003 [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128401_-91751836",
+      "id": "20180118-105734_546968647",
+      "dateCreated": "2020-02-05 14:12:08.401",
+      "dateStarted": "2020-02-05 14:15:52.966",
+      "dateFinished": "2020-02-05 14:15:52.978",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# How to use IPython\n\nAfter you get the above prerequisite installed, you can use IPython in Zeppelin via `%python.ipython` or `%spark.ipyspark`. If you want to make IPython as your default interpreter via `%python` or `%spark.pyspark`, then you can configure `zeppelin.python.useIPython` as `true` in python\u0027s interpreter setting or `zeppelin.pyspark.useIPython` in spark\u0027s interpreter setting. So that Zeppelin will use IPython as the default python interp [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:16:52.364",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eHow to use IPython\u003c/h1\u003e\n\u003cp\u003eAfter you get the above prerequisite installed, you can use IPython in Zeppelin via \u003ccode\u003e%python.ipython\u003c/code\u003e or \u003ccode\u003e%spark.ipyspark\u003c/code\u003e. If you want to make IPython as your default interpreter via \u003ccode\u003e%python\u003c/code\u003e or \u003ccode\u003e%spark.pyspark\u003c/code\u003e, then you can configure \ [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128402_-1251111399",
+      "id": "20180118-112614_44484642",
+      "dateCreated": "2020-02-05 14:12:08.402",
+      "dateStarted": "2020-02-05 14:16:50.898",
+      "dateFinished": "2020-02-05 14:16:50.907",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# IPython Help\n\nThere\u0027re 2 approaches to for getting python help in IPython. \n* Use `?` after the python object,\n* Use `help` function",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.402",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "markdown",
+          "editOnDblClick": true,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/markdown",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eIPython Help\u003c/h1\u003e\n\u003cp\u003eThere\u0026rsquo;re 2 approaches to for getting python help in IPython.\u003cbr/\u003e* Use \u003ccode\u003e?\u003c/code\u003e after the python object,\u003cbr/\u003e* Use \u003ccode\u003ehelp\u003c/code\u003e function\u003c/p\u003e\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128402_-1077704099",
+      "id": "20180118-111958_1561079624",
+      "dateCreated": "2020-02-05 14:12:08.402",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nimport sys\n\nsys?",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:17:03.465",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true,
+        "title": false
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "\u001b[0;31mType:\u001b[0m        module\n\u001b[0;31mString form:\u001b[0m \u003cmodule \u0027sys\u0027 (built-in)\u003e\n\u001b[0;31mDocstring:\u001b[0m  \nThis module provides access to some objects used or maintained by the\ninterpreter and to functions that interact strongly with the interpreter.\n\nDynamic objects:\n\nargv -- command line arguments; argv[0] is the script pathname if known\npath -- module search path; path[0] is the script directory, else \u0027 [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128402_-688763859",
+      "id": "20180118-112246_474555672",
+      "dateCreated": "2020-02-05 14:12:08.403",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nimport sys\n\nhelp(sys)",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.403",
+      "config": {
+        "editorSetting": {
+          "language": "scala",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/scala",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "Help on built-in module sys:\n\nNAME\n    sys\n\nMODULE REFERENCE\n    https://docs.python.org/3.6/library/sys\n    \n    The following documentation is automatically generated from the Python\n    source files.  It may be incomplete, incorrect or include features that\n    are considered implementation detail and may vary between Python\n    implementations.  When in doubt, consult the module reference at the\n    location listed above.\n\nDESCRIPTION\n    This modu [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128403_-2022546282",
+      "id": "20180118-112905_1540839273",
+      "dateCreated": "2020-02-05 14:12:08.403",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# IPython magic function\n\nAll the IPython magic functions are avalible in Zeppelin, here\u0027s one example of `%timeit`, for the complete IPython magic functions, you can check the [link](http://ipython.readthedocs.io/en/stable/interactive/magics.html) here.\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.404",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "markdown",
+          "editOnDblClick": true,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/markdown",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eIPython magic function\u003c/h1\u003e\n\u003cp\u003eAll the IPython magic functions are avalible in Zeppelin, here\u0026rsquo;s one example of \u003ccode\u003e%timeit\u003c/code\u003e, for the complete IPython magic functions, you can check the \u003ca href\u003d\"http://ipython.readthedocs.io/en/stable/interactive/magics.html\"\u003elink\u003c/a\u003e here.\u003c/p\u003e\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128404_-1445116404",
+      "id": "20180118-112924_1945597351",
+      "dateCreated": "2020-02-05 14:12:08.404",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\n%timeit range(1000)",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.405",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "242 ns ± 7.71 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128405_-1093651105",
+      "id": "20180118-113325_2018867273",
+      "dateCreated": "2020-02-05 14:12:08.405",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# Tab completion\n\nTab completion, especially for attributes, is a convenient way to explore the structure of any object you’re dealing with. Simply type `object_name.\u003cTAB\u003e` to view the object’s attributes. See the following snapshot of how tab completion works in IPython Interpreter.\n![alt text](https://user-images.githubusercontent.com/164491/34858941-3f28105a-f78e-11e7-8341-2fbfd306ba5b.gif \"Logo Title Text 1\")\n\n\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.405",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "markdown",
+          "editOnDblClick": true,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/markdown",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eTab completion\u003c/h1\u003e\n\u003cp\u003eTab completion, especially for attributes, is a convenient way to explore the structure of any object you’re dealing with. Simply type \u003ccode\u003eobject_name.\u0026lt;TAB\u0026gt;\u003c/code\u003e to view the object’s attributes. See the following snapshot of how tab completion works in IPython Interpreter.\u003cbr/\u003e\u003cimg src\u003d\"https://user-image [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128405_-1429375020",
+      "id": "20180118-113333_768199475",
+      "dateCreated": "2020-02-05 14:12:08.405",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n\n# Visualization\n\nOne big advangae of notebook is that you can inline visualization with your code in notebook. There\u0027re many awesome visualization libraries in Python, you can use most of them in Zeppelin.\nRefer this [tutorial](https://www.zepl.com/viewer/notebooks/bm90ZTovL3pqZmZkdS9lN2Q3ODNiODRkNjA0ZjVjODM1OWZlMWExZjM4OTk3Zi9ub3RlLmpzb24) for how to use Python visualization libraries in Apache Zeppelin.\n\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.405",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "markdown",
+          "editOnDblClick": true,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/markdown",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eVisualization\u003c/h1\u003e\n\u003cp\u003eOne big advangae of notebook is that you can inline visualization with your code in notebook. There\u0026rsquo;re many awesome visualization libraries in Python, you can use most of them in Zeppelin.\u003cbr/\u003eRefer this \u003ca href\u003d\"https://www.zepl.com/viewer/notebooks/bm90ZTovL3pqZmZkdS9lN2Q3ODNiODRkNjA0ZjVjODM1OWZlMWExZjM4OTk3Zi9ub3RlLmpzb24\"\u003etu [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128405_-1181474830",
+      "id": "20180118-114439_1191932175",
+      "dateCreated": "2020-02-05 14:12:08.405",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# Use ZeppelinContext \n\n`ZeppelinContext` is a utlity class which provide the following features\n\n* Dynamic forms\n* Show DataFrame via builtin visualization\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.405",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "markdown",
+          "editOnDblClick": true,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/markdown",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eUse ZeppelinContext\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eZeppelinContext\u003c/code\u003e is a utlity class which provide the following features\u003c/p\u003e\n\u003cul\u003e\n  \u003cli\u003eDynamic forms\u003c/li\u003e\n  \u003cli\u003eShow DataFrame via builtin visualization\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128405_440264383",
+      "id": "20180118-114841_1750411156",
+      "dateCreated": "2020-02-05 14:12:08.405",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nz.input(name\u003d\u0027my_name\u0027, defaultValue\u003d\u0027hello\u0027)",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.405",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {
+          "my_name": {
+            "type": "TextBox",
+            "name": "my_name",
+            "displayName": "my_name",
+            "defaultValue": "hello",
+            "hidden": false
+          }
+        }
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "\u0027hello\u0027"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128405_746444677",
+      "id": "20180118-115612_471385279",
+      "dateCreated": "2020-02-05 14:12:08.405",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nimport pandas as pd\ndf \u003d pd.DataFrame({\u0027name\u0027:[\u0027a\u0027,\u0027b\u0027,\u0027c\u0027], \u0027count\u0027:[12,24,18]})\nz.show(df)",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.406",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {
+          "0": {
+            "graph": {
+              "mode": "table",
+              "height": 300.0,
+              "optionOpen": false,
+              "setting": {
+                "table": {
+                  "tableGridState": {
+                    "columns": [
+                      {
+                        "name": "count",
+                        "visible": true,
+                        "width": "*",
+                        "sort": {},
+                        "filters": [
+                          {}
+                        ],
+                        "pinned": ""
+                      },
+                      {
+                        "name": "name",
+                        "visible": true,
+                        "width": "*",
+                        "sort": {
+                          "priority": 0.0,
+                          "direction": "desc"
+                        },
+                        "filters": [
+                          {}
+                        ],
+                        "pinned": ""
+                      }
+                    ],
+                    "scrollFocus": {},
+                    "selection": [],
+                    "grouping": {
+                      "grouping": [],
+                      "aggregations": [],
+                      "rowExpandedStates": {}
+                    },
+                    "treeView": {},
+                    "pagination": {
+                      "paginationCurrentPage": 1.0,
+                      "paginationPageSize": 250.0
+                    }
+                  },
+                  "tableColumnTypeState": {
+                    "updated": false,
+                    "names": {
+                      "count": "string",
+                      "name": "string"
+                    }
+                  },
+                  "updated": false,
+                  "initialized": false,
+                  "tableOptionSpecHash": "[{\"name\":\"useFilter\",\"valueType\":\"boolean\",\"defaultValue\":false,\"widget\":\"checkbox\",\"description\":\"Enable filter for columns\"},{\"name\":\"showPagination\",\"valueType\":\"boolean\",\"defaultValue\":false,\"widget\":\"checkbox\",\"description\":\"Enable pagination for better navigation\"},{\"name\":\"showAggregationFooter\",\"valueType\":\"boolean\",\"defaultValue\":false,\"widget\":\"checkbox\",\"description\":\"Enable a footer [...]
+                  "tableOptionValue": {
+                    "useFilter": false,
+                    "showPagination": false,
+                    "showAggregationFooter": false
+                  }
+                },
+                "scatterChart": {
+                  "xAxis": {
+                    "name": "name",
+                    "index": 1.0,
+                    "aggr": "sum"
+                  },
+                  "yAxis": {
+                    "name": "count",
+                    "index": 0.0,
+                    "aggr": "sum"
+                  }
+                },
+                "multiBarChart": {}
+              },
+              "commonSetting": {},
+              "keys": [],
+              "groups": [],
+              "values": [
+                {
+                  "name": "name",
+                  "index": 1.0,
+                  "aggr": "sum"
+                }
+              ]
+            },
+            "helium": {}
+          }
+        },
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TABLE",
+            "data": "count\tname\n12\ta\n24\tb\n18\tc\n"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128406_-1787806183",
+      "id": "20180118-122136_1299905608",
+      "dateCreated": "2020-02-05 14:12:08.406",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:12:08.406",
+      "config": {},
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580883128406_130649699",
+      "id": "20180118-122149_878709973",
+      "dateCreated": "2020-02-05 14:12:08.406",
+      "status": "READY"
+    }
+  ],
+  "name": "IPython Basic",
+  "id": "2EYDJKFFY",
+  "defaultInterpreterGroup": "spark",
+  "version": "0.9.0-SNAPSHOT",
+  "permissions": {},
+  "noteParams": {},
+  "noteForms": {},
+  "angularObjects": {},
+  "config": {
+    "isZeppelinNotebookCronEnable": true
+  },
+  "info": {},
+  "path": "/Python Tutorial/IPython Basic"
+}
\ No newline at end of file
diff --git a/notebook/Python Tutorial/IPython Visualization Tutorial_2F1S9ZY8Z.zpln b/notebook/Python Tutorial/IPython Visualization Tutorial_2F1S9ZY8Z.zpln
new file mode 100644
index 0000000..dc73cdf
--- /dev/null
+++ b/notebook/Python Tutorial/IPython Visualization Tutorial_2F1S9ZY8Z.zpln	
@@ -0,0 +1,1093 @@
+{
+  "paragraphs": [
+    {
+      "title": "Overview",
+      "text": "%md\n\n\nThere\u0027re many visualization libraries availabel in python world. Visualization is tremendous useful in notebook enviroment, most of them could be used in Jupyter Notebook. And most of them can also be used in Apache Zeppelin Notebook, but maybe a little difference for some libraries. This tutorial will teach you how to use these popular visualization libraries in Apache Zeppelin. To be noted, you need to use IPython interpreter to make these libraries work in [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:12:28.523",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true,
+        "title": false
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003cp\u003eThere\u0026rsquo;re many visualization libraries availabel in python world. Visualization is tremendous useful in notebook enviroment, most of them could be used in Jupyter Notebook. And most of them can also be used in Apache Zeppelin Notebook, but maybe a little difference for some libraries. This tutorial will teach you how to use these popular visualization libraries in Apache Zeppelin. To be noted, you n [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482808_420748092",
+      "id": "20180117-220147_1889980489",
+      "dateCreated": "2020-02-05 14:34:42.808",
+      "dateStarted": "2020-02-05 15:09:34.095",
+      "dateFinished": "2020-02-05 15:09:34.123",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# Matplotlib\n\nMatplotlib is a Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. The usage of Matplotlib in Zeppelin is the same as Jupyter Notebook. The key is to put `%matplotlib inline` before using Matplotlig. Below is one simple example, for more usage of Matplotlib, you can refer this [link](https://matplotlib.org/).",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:09:59.174",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eMatplotlib\u003c/h1\u003e\n\u003cp\u003eMatplotlib is a Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms. The usage of Matplotlib in Zeppelin is the same as Jupyter Notebook. The key is to put \u003ccode\u003e%matplotlib inline\u003c/code\u003e before using Matplotlig. Below is one simple example, for more usa [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482810_-1147533206",
+      "id": "20180118-090246_2126121401",
+      "dateCreated": "2020-02-05 14:34:42.810",
+      "dateStarted": "2020-02-05 14:37:05.024",
+      "dateFinished": "2020-02-05 14:37:05.035",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Matplotlib Example",
+      "text": "%python.ipython\n\n%matplotlib inline\n\nimport matplotlib.pyplot as plt\n\nplt.plot([1,2,3,4])\nplt.ylabel(\u0027some numbers\u0027)\nplt.show()\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:34:42.810",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": false,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "\u003cmatplotlib.figure.Figure at 0x10b62b320\u003e\n"
+          },
+          {
+            "type": "IMG",
+            "data": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAD8CAYAAACYebj1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3Xd8VfX9x/HXBwh77zDC3kPFMBx14UBFEUVrtW5Fra0dPwXEgavuDlsHYtWiba2WsAUHdS8UqGQww5I9JWGFrM/vj3tN0xjIDeTm5Cbv5+ORR+743ns+hxPu+571OebuiIiIAFQLugAREak4FAoiIlJAoSAiIgUUCiIiUkChICIiBRQKIiJSQKEgIiIFFAoiIlJAoSAiIgVqBF1AaTVv3tw7duwYdBkiIjFl4cKFO9y9RUnjYi4UOnbsyIIFC4IuQ0QkppjZukjGafO [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482810_-1322704841",
+      "id": "20180117-220535_590781730",
+      "dateCreated": "2020-02-05 14:34:42.810",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# Pandas\n\nPandas provide high level api for visualization on DataFrame. It uses Matplotlib for its visualization underlying, so the usage is the same as Matplotlib. ",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:34:42.811",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "markdown",
+          "editOnDblClick": true,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/markdown",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003ePandas\u003c/h1\u003e\n\u003cp\u003ePandas provide high level api for visualization on DataFrame. It uses Matplotlib for its visualization underlying, so the usage is the same as Matplotlib.\u003c/p\u003e\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482811_125744258",
+      "id": "20180118-090527_1578553673",
+      "dateCreated": "2020-02-05 14:34:42.811",
+      "status": "READY"
+    },
+    {
+      "title": "Pandas Example",
+      "text": "%python.ipython\n\n%matplotlib inline\n\nimport pandas as pd\nimport numpy as np\n\nts \u003d pd.Series(np.random.randn(1000), index\u003dpd.date_range(\u00271/1/2000\u0027, periods\u003d1000))\nts \u003d ts.cumsum()\nts.plot()",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:34:42.811",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": false,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "\u003cmatplotlib.axes._subplots.AxesSubplot at 0x1087c99e8\u003e\n"
+          },
+          {
+            "type": "IMG",
+            "data": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAEHCAYAAAC6IG0BAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJztnXmcHFXV93+399kns2TfSUhCIAtkg4AQZZPFgIgsgogi+r7wiD6PC4/4Kvo8IiqCoriAsomIKwIS2SJ7IBAgJGQjK9knk5nMPr1V3fePqlt9q7p6m6nuru4+388nn3RXV1fdnqo6dercc36Hcc5BEARBlA+eYg+AIAiCcBYy7ARBEGUGGXaCIIgygww7QRBEmUGGnSAIoswgw04QBFFmkGEnCIIoM8iwEwRBlBlk2AmCIMoMXzF22tLSwidPnlyMXRMEQZQsb7311mH [...]
+          },
+          {
+            "type": "TEXT",
+            "data": "\u003cmatplotlib.figure.Figure at 0x108797b70\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482811_-1394723261",
+      "id": "20180117-220828_1751137554",
+      "dateCreated": "2020-02-05 14:34:42.811",
+      "status": "READY"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# Seaborn\n\nSeaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing attractive statistical graphics. Its usage in Zeppelin is the same as in Jupyter. For seaborn usage please refer this [link](https://seaborn.pydata.org/)\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:10:13.929",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eSeaborn\u003c/h1\u003e\n\u003cp\u003eSeaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing attractive statistical graphics. Its usage in Zeppelin is the same as in Jupyter. For seaborn usage please refer this \u003ca href\u003d\"https://seaborn.pydata.org/\"\u003elink\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482811_1702400931",
+      "id": "20180118-091931_1235694337",
+      "dateCreated": "2020-02-05 14:34:42.811",
+      "status": "READY"
+    },
+    {
+      "title": "Seaborn Example",
+      "text": "%python.ipython\n\n%matplotlib inline\n\nimport seaborn as sns\nsns.set(style\u003d\"ticks\")\n\n# Load the example dataset for Anscombe\u0027s quartet\ndf \u003d sns.load_dataset(\"anscombe\")\n\n# Show the results of a linear regression within each dataset\nsns.lmplot(x\u003d\"x\", y\u003d\"y\", col\u003d\"dataset\", hue\u003d\"dataset\", data\u003ddf,\n           col_wrap\u003d2, ci\u003dNone, palette\u003d\"muted\", size\u003d4,\n           scatter_kws\u003d{\"s\": 50, [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:34:42.812",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": false,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "\u003cseaborn.axisgrid.FacetGrid at 0x1a12763fd0\u003e\u003cmatplotlib.figure.Figure at 0x1a1277a2b0\u003e\n"
+          },
+          {
+            "type": "IMG",
+            "data": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAI0CAYAAAAKi7MDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzs3Xl8VNX9//HXLNlIAiE7ISELitW6iyKKCKKAKIqArC4gCPardrMq2kdtf99+RWv91n5FrcimYhBBUNxALYqKIOCCiiIq2ROyQwjZZubO/f0xdRRNkCWZO5O8n385Z5J7P4lweM8595xjM03TRERERCSE2a0uQERERORYKdCIiIhIyFOgERERkZCnQCMiIiIhT4FGREREQp4CjYiIiIQ8BRo5KnPmzGH16tWH/Jq77rqL0tLSdrtnfX09N99881F//7x585g3b1671SM [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482811_576440533",
+      "id": "20180117-220708_660528060",
+      "dateCreated": "2020-02-05 14:34:42.811",
+      "status": "READY"
+    },
+    {
+      "title": "Plotnine",
+      "text": "%md\n\n# Plotnine\n\nplotnine is an implementation of a grammar of graphics in Python, it is based on ggplot2. The grammar allows users to compose plots by explicitly mapping data to the visual objects that make up the plot.\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:10:26.243",
+      "config": {
+        "colWidth": 12.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/text",
+        "title": false
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003ePlotnine\u003c/h1\u003e\n\u003cp\u003eplotnine is an implementation of a grammar of graphics in Python, it is based on ggplot2. The grammar allows users to compose plots by explicitly mapping data to the visual objects that make up the plot.\u003c/p\u003e\n\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885213779_377546255",
+      "id": "paragraph_1580885213779_377546255",
+      "dateCreated": "2020-02-05 14:46:53.782",
+      "dateStarted": "2020-02-05 15:10:26.263",
+      "dateFinished": "2020-02-05 15:10:26.273",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\n%matplotlib inline  \n\nfrom plotnine import *\nfrom plotnine.data import mtcars\n\n(ggplot(mtcars, aes(\u0027wt\u0027, \u0027mpg\u0027))\n + geom_point())\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:56:28.995",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "/Users/jzhang/anaconda3/lib/python3.7/site-packages/plotnine/scales/scale.py:93: MatplotlibDeprecationWarning: \nThe iterable function was deprecated in Matplotlib 3.1 and will be removed in 3.3. Use np.iterable instead.\n  if cbook.iterable(self.breaks) and cbook.iterable(self.labels):\n/Users/jzhang/anaconda3/lib/python3.7/site-packages/plotnine/utils.py:553: MatplotlibDeprecationWarning: \nThe iterable function was deprecated in Matplotlib 3.1 and will be removed  [...]
+          },
+          {
+            "type": "IMG",
+            "data": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAG0CAYAAAD6ncdZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXwUhf3/8ffslYSQYDAJASFcAgJSBEQOlYBUigeHoEC5pCoFLD5s/dUDH/VsqEdpBUEkxFr5VgFtoVap1rbEcitgW29UhADKGUxMSAJ7ze8PHmy7BBoIm8zO7Ov5ePh4uJPJ7Hv5ZLPvzMzOGqZpmgIAALAJl9UBAAAAzgblBQAA2ArlBQAA2ArlBQAA2ArlBQAA2ArlBQAA2ArlBQAA2ArlBQAA2ArlBQAA2ArlBQAA2IrH6gCStGDBAm3dulXV1dVKS0vTkCFDNGb [...]
+          },
+          {
+            "type": "TEXT",
+            "data": "\u003cggplot: (285151229)\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885221038_719317105",
+      "id": "paragraph_1580885221038_719317105",
+      "dateCreated": "2020-02-05 14:47:01.038",
+      "dateStarted": "2020-02-05 14:48:22.223",
+      "dateFinished": "2020-02-05 14:48:29.950",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\n(ggplot(mtcars, aes(\u0027wt\u0027, \u0027mpg\u0027, color\u003d\u0027factor(gear)\u0027))\n + geom_point()\n + stat_smooth(method\u003d\u0027lm\u0027)\n + facet_wrap(\u0027~gear\u0027))",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:57:48.332",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "/Users/jzhang/anaconda3/lib/python3.7/site-packages/plotnine/scales/scale.py:93: MatplotlibDeprecationWarning: \nThe iterable function was deprecated in Matplotlib 3.1 and will be removed in 3.3. Use np.iterable instead.\n  if cbook.iterable(self.breaks) and cbook.iterable(self.labels):\n/Users/jzhang/anaconda3/lib/python3.7/site-packages/numpy/core/fromnumeric.py:2495: FutureWarning: Method .ptp is deprecated and will be removed in a future version. Use numpy.ptp in [...]
+          },
+          {
+            "type": "IMG",
+            "data": "iVBORw0KGgoAAAANSUhEUgAAArcAAAHCCAYAAAD1muGYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXxU9b0//tc5Z/YlOxDWhCULYZFAua5csShabVHcv1UpXUT70/beW9pa21qtF6q92lp3rb0WWxVbr9S6V6UuKIJFdshC2EkCJCHbrGfmnPP7Y0jIMPtkkplMXk8f/JGZs7wznpm853Pen/dH0DRNAxERERFRFhDTHQARERERUaowuSUiIiKirMHkloiIiIiyBpNbIiIiIsoaTG6JiIiIKGswuSUiIiKirMHkloiIiIiyBpNbIiIiIsoaTG6JiIiIKGvo0h3AQKivr09 [...]
+          },
+          {
+            "type": "TEXT",
+            "data": "\u003cggplot: (7558407260)\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885791251_758930573",
+      "id": "paragraph_1580885791251_758930573",
+      "dateCreated": "2020-02-05 14:56:31.251",
+      "dateStarted": "2020-02-05 14:57:36.295",
+      "dateFinished": "2020-02-05 14:57:37.319",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# bokeh\n\n[Bokeh](https://bokeh.pydata.org/en/latest/) is a Python interactive visualization library that targets modern web browsers for presentation. Its goal is to provide elegant, concise construction of novel graphics in the style of D3.js, and to extend this capability with high-performance interactivity over very large or streaming datasets. Bokeh can help anyone who would like to quickly and easily create interactive plots, dashboards, and data applications [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:10:37.902",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true,
+        "title": false
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003ebokeh\u003c/h1\u003e\n\u003cp\u003e\u003ca href\u003d\"https://bokeh.pydata.org/en/latest/\"\u003eBokeh\u003c/a\u003e is a Python interactive visualization library that targets modern web browsers for presentation. Its goal is to provide elegant, concise construction of novel graphics in the style of D3.js, and to extend this capability with high-performance interactivity over very large or streaming dataset [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482814_1997313050",
+      "id": "20180118-092227_1380687854",
+      "dateCreated": "2020-02-05 14:34:42.814",
+      "dateStarted": "2020-02-05 14:42:33.017",
+      "dateFinished": "2020-02-05 14:42:33.092",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nfrom bokeh.io import output_notebook, show\nfrom bokeh.plotting import figure\nimport bkzep\n\noutput_notebook(notebook_type\u003d\u0027zeppelin\u0027)\n\nfig \u003d figure()\nfig.line([1,2], [3,4])\nshow(fig)\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:00:57.563",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 6.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\n    \u003cdiv class\u003d\"bk-root\"\u003e\n        \u003ca href\u003d\"https://bokeh.pydata.org\" target\u003d\"_blank\" class\u003d\"bk-logo bk-logo-small bk-logo-notebook\"\u003e\u003c/a\u003e\n        \u003cspan id\u003d\"3452\"\u003eLoading BokehJS ...\u003c/span\u003e\n    \u003c/div\u003e\n\n"
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript type\u003d\"text/javascript\"\u003e\n(function(root) {\n  function now() {\n    return new Date();\n  }\n\n  var force \u003d true;\n\n  if (typeof root._bokeh_onload_callbacks \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) {\n    root._bokeh_onload_callbacks \u003d [];\n    root._bokeh_is_loading \u003d undefined;\n  }\n\n  \n\n  \n  if (typeof (root._bokeh_timeout) \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) { [...]
+          },
+          {
+            "type": "HTML",
+            "data": "\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"125e83e5-5abe-4ec2-b352-69745a9ccc93\" data-root-id\u003d\"3453\"\u003e\u003c/div\u003e\n\n"
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript type\u003d\"text/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"08bbe30c-9bbf-4f39-872a-1bc5f3926223\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"3462\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"3466\",\"type\":\"Grid\"},{\"id\":\"3471\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"3467\",\"type\":\"LinearAxis\"}],\"renderers\":[{\"id\":\"3488\",\"type\":\"GlyphRenderer\"}], [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482814_278965699",
+      "id": "20180118-092433_377794298",
+      "dateCreated": "2020-02-05 14:34:42.814",
+      "dateStarted": "2020-02-05 15:00:57.587",
+      "dateFinished": "2020-02-05 15:00:57.659",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nfrom bokeh.server.server import Server\nfrom bokeh.application import Application\nfrom bokeh.application.handlers.function import FunctionHandler\nfrom bokeh.plotting import figure, ColumnDataSource\n\ndef make_document(doc):\n    fig \u003d figure(title\u003d\u0027Line plot!\u0027, sizing_mode\u003d\u0027scale_width\u0027)\n    fig.line(x\u003d[1, 2, 3], y\u003d[1, 4, 9])\n\n    doc.title \u003d \"Hello, world!\"\n    doc.add_root(fig)\n\n# Set up the  [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:03:13.813",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\u0027bokeh_class\u0027 id\u003d\u00273a4d520c005443a28db6569f200ee1c8\u0027\u003e\n\u003cscript src\u003d\"http://localhost:51396/autoload.js?bokeh-autoload-element\u003d3881\u0026bokeh-absolute-url\u003dhttp://localhost:51396\" id\u003d\"3881\"\u003e\u003c/script\u003e\u003c/div\u003e\n"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580886029142_1541635661",
+      "id": "paragraph_1580886029142_1541635661",
+      "dateCreated": "2020-02-05 15:00:29.143",
+      "dateStarted": "2020-02-05 15:02:48.866",
+      "dateFinished": "2020-02-05 15:02:48.927",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%md\n\n# Holoviews\n\nHoloViews is an open-source Python library designed to make data analysis and visualization seamless and simple. With HoloViews, you can usually express what you want to do in very few lines of code, letting you focus on what you are trying to explore and convey, not on the process of plotting. Compared to bokeh, HoloViews is a high level visualization library. Refer this [link](http://holoviews.org/) for more usage tutorial of HoloViews.\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:53:49.481",
+      "config": {
+        "tableHide": false,
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/text",
+        "fontSize": 9.0,
+        "editorHide": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eHoloviews\u003c/h1\u003e\n\u003cp\u003eHoloViews is an open-source Python library designed to make data analysis and visualization seamless and simple. With HoloViews, you can usually express what you want to do in very few lines of code, letting you focus on what you are trying to explore and convey, not on the process of plotting. Compared to bokeh, HoloViews is a high level visualization library. Refer th [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482815_870528203",
+      "id": "20180120-131737_1287341499",
+      "dateCreated": "2020-02-05 14:34:42.815",
+      "dateStarted": "2020-02-05 14:53:46.544",
+      "dateFinished": "2020-02-05 14:53:46.571",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nimport pandas as pd\nimport numpy as np\nimport holoviews as hv\nfrom holoviews import opts\nhv.extension(\u0027bokeh\u0027)\n\nfrom bokeh.plotting import figure\nfrom bokeh.io import show,output_notebook\nimport bkzep\noutput_notebook(notebook_type\u003d\u0027zeppelin\u0027)\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:50:15.242",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cscript\u003e \n(function(root) {\n  function now() {\n    return new Date();\n  }\n\n  var force \u003d true;\n\n  if (typeof root._bokeh_onload_callbacks \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) {\n    root._bokeh_onload_callbacks \u003d [];\n    root._bokeh_is_loading \u003d undefined;\n  }\n\n  var JS_MIME_TYPE \u003d \u0027application/javascript\u0027;\n  var HTML_MIME_TYPE \u003d \u0027text/html\u0027;\n  var EXEC_MIME_TYPE \u003d [...]
+          },
+          {
+            "type": "HTML",
+            "data": "\n\u003clink rel\u003d\"stylesheet\" href\u003d\"https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\"\u003e\n\u003cstyle\u003ediv.bk-hbox {\n    display: flex;\n    justify-content: center;\n}\n\ndiv.bk-hbox div.bk-plot {\n    padding: 8px;\n}\n\ndiv.bk-hbox div.bk-data-table {\n    padding: 20px;\n}\n\ndiv.hololayout {\n  display: flex;\n  align-items: center;\n  margin: 0;\n}\n\ndiv.holoframe {\n  width: 75%;\n}\n\ndiv.holowell {\n  display: flex;\n  [...]
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript\u003e function HoloViewsWidget() {\n}\n\nHoloViewsWidget.prototype.init_slider \u003d function(init_val){\n  if(this.load_json) {\n    this.from_json()\n  } else {\n    this.update_cache();\n  }\n}\n\nHoloViewsWidget.prototype.populate_cache \u003d function(idx){\n  this.cache[idx].innerHTML \u003d this.frames[idx];\n  if (this.embed) {\n    delete this.frames[idx];\n  }\n}\n\nHoloViewsWidget.prototype.process_error \u003d function(msg){\n}\n\nHoloViewsW [...]
+          },
+          {
+            "type": "HTML",
+            "data": "\n    \u003cdiv class\u003d\"bk-root\"\u003e\n        \u003ca href\u003d\"https://bokeh.pydata.org\" target\u003d\"_blank\" class\u003d\"bk-logo bk-logo-small bk-logo-notebook\"\u003e\u003c/a\u003e\n        \u003cspan id\u003d\"1093\"\u003eLoading BokehJS ...\u003c/span\u003e\n    \u003c/div\u003e\n\n"
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript type\u003d\"text/javascript\"\u003e\n(function(root) {\n  function now() {\n    return new Date();\n  }\n\n  var force \u003d true;\n\n  if (typeof root._bokeh_onload_callbacks \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) {\n    root._bokeh_onload_callbacks \u003d [];\n    root._bokeh_is_loading \u003d undefined;\n  }\n\n  \n\n  \n  if (typeof (root._bokeh_timeout) \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) { [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482815_131583170",
+      "id": "20180120-131731_1558753626",
+      "dateCreated": "2020-02-05 14:34:42.815",
+      "dateStarted": "2020-02-05 14:50:15.270",
+      "dateFinished": "2020-02-05 14:50:17.234",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nstation_info \u003d pd.read_csv(\u0027https://raw.githubusercontent.com/holoviz/holoviews/master/examples/assets/station_info.csv\u0027)\nstation_info.head()\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:51:57.708",
+      "config": {
+        "colWidth": 12.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv\u003e\n\u003cstyle scoped\u003e\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n\u003c/style\u003e\n\u003ctable border\u003d\"1\" class\u003d\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style\u003d\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u00 [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885453474_1167659991",
+      "id": "paragraph_1580885453474_1167659991",
+      "dateCreated": "2020-02-05 14:50:53.474",
+      "dateStarted": "2020-02-05 14:51:57.821",
+      "dateFinished": "2020-02-05 14:52:04.924",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nscatter \u003d hv.Scatter(station_info, \u0027services\u0027, \u0027ridership\u0027)\nscatter",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:52:34.586",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv id\u003d\u00271096\u0027 style\u003d\u0027display: table; margin: 0 auto;\u0027\u003e\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"1f3ae3f5-bfd7-4295-8f99-29d46842288e\" data-root-id\u003d\"1096\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cscript type\u003d\"application/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"763984d9-0529-456a-ab85-4ca811fccf92\":{\"roots\":{\"references\":[{\"a [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885519951_-291252209",
+      "id": "paragraph_1580885519951_-291252209",
+      "dateCreated": "2020-02-05 14:51:59.951",
+      "dateStarted": "2020-02-05 14:52:20.562",
+      "dateFinished": "2020-02-05 14:52:20.683",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nlayout \u003d scatter + hv.Histogram(np.histogram(station_info[\u0027opened\u0027], bins\u003d24), kdims\u003d[\u0027opened\u0027])\nlayout",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:52:54.836",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv id\u003d\u00271419\u0027 style\u003d\u0027display: table; margin: 0 auto;\u0027\u003e\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"3208b87b-64b3-439e-9327-8f517a4f7a87\" data-root-id\u003d\"1419\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cscript type\u003d\"application/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"7a36d125-8976-474d-8ac7-8eba79fbc756\":{\"roots\":{\"references\":[{\"a [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885548751_1272982082",
+      "id": "paragraph_1580885548751_1272982082",
+      "dateCreated": "2020-02-05 14:52:28.751",
+      "dateStarted": "2020-02-05 14:52:54.884",
+      "dateFinished": "2020-02-05 14:52:55.373",
+      "status": "FINISHED"
+    },
+    {
+      "title": "HvPlot",
+      "text": "%md\n\n# HvPlot\n\n[HvPlot](https://hvplot.holoviz.org/) is a high-level plotting API for the PyData ecosystem built on HoloViews.\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:11:17.248",
+      "config": {
+        "colWidth": 12.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/text",
+        "title": false,
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eHvPlot\u003c/h1\u003e\n\u003cp\u003e\u003ca href\u003d\"https://hvplot.holoviz.org/\"\u003eHvPlot\u003c/a\u003e is a high-level plotting API for the PyData ecosystem built on HoloViews.\u003c/p\u003e\n\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580884482945_-1037962389",
+      "id": "20180119-091845_1603850480",
+      "dateCreated": "2020-02-05 14:34:42.945",
+      "dateStarted": "2020-02-05 15:11:09.945",
+      "dateFinished": "2020-02-05 15:11:09.951",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nfrom bokeh.io import output_notebook\nimport bkzep\noutput_notebook(notebook_type\u003d\u0027zeppelin\u0027)\n\n\nimport pandas as pd, numpy as np\n\n\nidx \u003d pd.date_range(\u00271/1/2000\u0027, periods\u003d1000)\ndf  \u003d pd.DataFrame(np.random.randn(1000, 4), index\u003didx, columns\u003dlist(\u0027ABCD\u0027)).cumsum()\n\nimport hvplot.pandas\ndf.hvplot()",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:55:41.519",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\n    \u003cdiv class\u003d\"bk-root\"\u003e\n        \u003ca href\u003d\"https://bokeh.pydata.org\" target\u003d\"_blank\" class\u003d\"bk-logo bk-logo-small bk-logo-notebook\"\u003e\u003c/a\u003e\n        \u003cspan id\u003d\"1660\"\u003eLoading BokehJS ...\u003c/span\u003e\n    \u003c/div\u003e\n\n"
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript type\u003d\"text/javascript\"\u003e\n(function(root) {\n  function now() {\n    return new Date();\n  }\n\n  var force \u003d true;\n\n  if (typeof root._bokeh_onload_callbacks \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) {\n    root._bokeh_onload_callbacks \u003d [];\n    root._bokeh_is_loading \u003d undefined;\n  }\n\n  \n\n  \n  if (typeof (root._bokeh_timeout) \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) { [...]
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cdiv id\u003d\u00271667\u0027 style\u003d\u0027display: table; margin: 0 auto;\u0027\u003e\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"ac5bc1b8-0a13-4413-be19-7aaae89d6c76\" data-root-id\u003d\"1667\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cscript type\u003d\"application/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"de8c7f52-af62-4c42-b2c7-037a4ac3c5ed\":{\"roots\":{\"references\":[{\"a [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885707198_-1652524072",
+      "id": "paragraph_1580885707198_-1652524072",
+      "dateCreated": "2020-02-05 14:55:07.198",
+      "dateStarted": "2020-02-05 14:55:36.307",
+      "dateFinished": "2020-02-05 14:55:38.341",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nfrom hvplot.sample_data import us_crime\n\ncolumns \u003d [\u0027Burglary rate\u0027, \u0027Larceny-theft rate\u0027, \u0027Robbery rate\u0027, \u0027Violent Crime rate\u0027]\n\n\nus_crime.plot.violin(y\u003dcolumns, group_label\u003d\u0027Type of crime\u0027, value_label\u003d\u0027Rate per 100k\u0027, invert\u003dTrue)\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:56:02.776",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv id\u003d\u00272386\u0027 style\u003d\u0027display: table; margin: 0 auto;\u0027\u003e\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"cdf3059a-39ed-43f9-9a8a-5f9a8f2d6e19\" data-root-id\u003d\"2386\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cscript type\u003d\"application/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"5dff9f36-6d84-4867-8e9e-fc59f5a54790\":{\"roots\":{\"references\":[{\"a [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885736306_456675117",
+      "id": "paragraph_1580885736306_456675117",
+      "dateCreated": "2020-02-05 14:55:36.307",
+      "dateStarted": "2020-02-05 14:56:02.800",
+      "dateFinished": "2020-02-05 14:56:03.041",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nus_crime.plot.bivariate(\u0027Burglary rate\u0027, \u0027Property crime rate\u0027, legend\u003dFalse, width\u003d500, height\u003d400) * \\\nus_crime.plot.scatter(  \u0027Burglary rate\u0027, \u0027Property crime rate\u0027, color\u003d\u0027black\u0027, size\u003d15, legend\u003dFalse) + \\\nus_crime.plot.table([\u0027Burglary rate\u0027, \u0027Property crime rate\u0027], width\u003d350, height\u003d350)",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 14:56:02.798",
+      "config": {
+        "colWidth": 12.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv id\u003d\u00272722\u0027 style\u003d\u0027display: table; margin: 0 auto;\u0027\u003e\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"4149a85a-8ec4-45c2-bede-c91dcf0a423a\" data-root-id\u003d\"2722\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cscript type\u003d\"application/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"90811ff6-b552-43dd-a236-6ddd7ae3602e\":{\"roots\":{\"references\":[{\"a [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885746483_-68202156",
+      "id": "paragraph_1580885746483_-68202156",
+      "dateCreated": "2020-02-05 14:55:46.483",
+      "dateStarted": "2020-02-05 14:56:03.007",
+      "dateFinished": "2020-02-05 14:56:03.475",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Altair",
+      "text": "%md\n\n# Altair\n\n[Altair](https://altair-viz.github.io/) is a declarative statistical visualization library for Python, based on Vega and Vega-Lite, and the source is available on GitHub.\n\nWith Altair, you can spend more time understanding your data and its meaning. Altair’s API is simple, friendly and consistent and built on top of the powerful Vega-Lite visualization grammar. This elegant simplicity produces beautiful and effective visualizations with a minimal amoun [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:12:17.704",
+      "config": {
+        "colWidth": 12.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/text",
+        "title": false,
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch1\u003eAltair\u003c/h1\u003e\n\u003cp\u003e\u003ca href\u003d\"https://altair-viz.github.io/\"\u003eAltair\u003c/a\u003e is a declarative statistical visualization library for Python, based on Vega and Vega-Lite, and the source is available on GitHub.\u003c/p\u003e\n\u003cp\u003eWith Altair, you can spend more time understanding your data and its meaning. Altair’s API is simple, friendly and consistent and built on [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580886248807_819045686",
+      "id": "paragraph_1580886248807_819045686",
+      "dateCreated": "2020-02-05 15:04:08.807",
+      "dateStarted": "2020-02-05 15:12:10.963",
+      "dateFinished": "2020-02-05 15:12:10.975",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nimport altair as alt\n\nalt.renderers.enable(\u0027zeppelin\u0027)\n\n# load a simple dataset as a pandas DataFrame\nfrom vega_datasets import data\ncars \u003d data.cars()\n\nalt.Chart(cars).mark_point().encode(\n    x\u003d\u0027Horsepower\u0027,\n    y\u003d\u0027Miles_per_Gallon\u0027,\n    color\u003d\u0027Origin\u0027,\n)",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:07:16.517",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/python"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n  \u003cstyle\u003e\n    .vega-actions a {\n        margin-right: 12px;\n        color: #757575;\n        font-weight: normal;\n        font-size: 13px;\n    }\n    .error {\n        color: red;\n    }\n  \u003c/style\u003e\n  \u003cscript type\u003d\"text/javascript\" src\u003d\"https://cdn.jsdelivr.net/npm//vega@5\"\u003e\u003c/script\u003e\n  \u003cscript type\u003d\"text/javascript\" src\u003d\"https: [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580885762824_-1733991523",
+      "id": "paragraph_1580885762824_-1733991523",
+      "dateCreated": "2020-02-05 14:56:02.824",
+      "dateStarted": "2020-02-05 15:03:56.419",
+      "dateFinished": "2020-02-05 15:03:56.545",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\n\n# Compute x^2 + y^2 across a 2D grid\nx, y \u003d np.meshgrid(range(-5, 5), range(-5, 5))\nz \u003d x ** 2 + y ** 2\n\n# Convert this grid to columnar data expected by Altair\nsource \u003d pd.DataFrame({\u0027x\u0027: x.ravel(),\n                     \u0027y\u0027: y.ravel(),\n                     \u0027z\u0027: z.ravel()})\n\nalt.Chart(source).mark_rect().encode(\n    x\u003d\u0027x:O\u00 [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:07:25.210",
+      "config": {
+        "colWidth": 6.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "scala",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n  \u003cstyle\u003e\n    .vega-actions a {\n        margin-right: 12px;\n        color: #757575;\n        font-weight: normal;\n        font-size: 13px;\n    }\n    .error {\n        color: red;\n    }\n  \u003c/style\u003e\n  \u003cscript type\u003d\"text/javascript\" src\u003d\"https://cdn.jsdelivr.net/npm//vega@5\"\u003e\u003c/script\u003e\n  \u003cscript type\u003d\"text/javascript\" src\u003d\"https: [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580886216808_1963511607",
+      "id": "paragraph_1580886216808_1963511607",
+      "dateCreated": "2020-02-05 15:03:36.808",
+      "dateStarted": "2020-02-05 15:07:20.097",
+      "dateFinished": "2020-02-05 15:07:20.160",
+      "status": "FINISHED"
+    },
+    {
+      "text": "%python.ipython\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:07:20.097",
+      "config": {},
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580886440097_1853064047",
+      "id": "paragraph_1580886440097_1853064047",
+      "dateCreated": "2020-02-05 15:07:20.097",
+      "status": "READY"
+    }
+  ],
+  "name": "IPython Visualization Tutorial",
+  "id": "2F1S9ZY8Z",
+  "defaultInterpreterGroup": "spark",
+  "version": "0.9.0-SNAPSHOT",
+  "permissions": {},
+  "noteParams": {},
+  "noteForms": {},
+  "angularObjects": {},
+  "config": {
+    "isZeppelinNotebookCronEnable": true
+  },
+  "info": {},
+  "path": "/Python Tutorial/IPython Visualization Tutorial"
+}
\ No newline at end of file
diff --git a/notebook/Python Tutorial/Keras Binary Classification (IMDB)_2F2AVWJ77.zpln b/notebook/Python Tutorial/Keras Binary Classification (IMDB)_2F2AVWJ77.zpln
new file mode 100644
index 0000000..be88237
--- /dev/null
+++ b/notebook/Python Tutorial/Keras Binary Classification (IMDB)_2F2AVWJ77.zpln	
@@ -0,0 +1,507 @@
+{
+  "paragraphs": [
+    {
+      "text": "%md\n\nThis tutorial is from book [Deep Learning with Python](https://www.amazon.com/Deep-Learning-Python-Francois-Chollet/dp/1617294438). It use [Keras](http://keras.io/) to train binary classifier on IMDB data.\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:50:03.006",
+      "config": {
+        "colWidth": 12.0,
+        "fontSize": 9.0,
+        "enabled": true,
+        "results": {},
+        "editorSetting": {
+          "language": "text",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "editorMode": "ace/mode/text",
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003cp\u003eThis tutorial is from book \u003ca href\u003d\"https://www.amazon.com/Deep-Learning-Python-Francois-Chollet/dp/1617294438\"\u003eDeep Learning with Python\u003c/a\u003e. It use \u003ca href\u003d\"http://keras.io/\"\u003eKeras\u003c/a\u003e to train binary classifier on IMDB data.\u003c/p\u003e\n\n\u003c/div\u003e"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887284288_-572987457",
+      "id": "paragraph_1580887284288_-572987457",
+      "dateCreated": "2020-02-05 15:21:24.288",
+      "dateStarted": "2020-02-05 15:50:03.014",
+      "dateFinished": "2020-02-05 15:50:03.025",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Load Data",
+      "text": "%python.ipython\n\n\nfrom keras.datasets import imdb\n\n(training_data, training_labels), (testing_data, testing_labels) \u003d imdb.load_data(num_words\u003d10000)\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:42:38.288",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 6.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "Using TensorFlow backend.\n"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266618_558814345",
+      "id": "20180312-171655_220733505",
+      "dateCreated": "2020-02-05 15:21:06.618",
+      "dateStarted": "2020-02-05 15:42:38.296",
+      "dateFinished": "2020-02-05 15:42:46.933",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nprint(training_data[0])\nprint(training_labels[0])",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:50:27.642",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 6.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true,
+        "title": false
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38 [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266625_804328120",
+      "id": "20180312-171715_624018844",
+      "dateCreated": "2020-02-05 15:21:06.625",
+      "dateStarted": "2020-02-05 15:42:54.913",
+      "dateFinished": "2020-02-05 15:42:54.983",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Transform Data",
+      "text": "%python.ipython\n\nimport numpy as np\n\n# convert input data to sparse matrix (each row represent one hot encoding of one doc)\ndef vectorize_sequences(sequences, dimension \u003d 10000):\n    matrix \u003d np.zeros((len(sequences), dimension))\n    for (i, sequence) in enumerate(sequences):\n        matrix[i, sequence] \u003d 1.0\n    return matrix\n\nx_train \u003d vectorize_sequences(training_data)\nx_test \u003d vectorize_sequences(testing_data)\n\ny_train \u003d trai [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:42:57.329",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "array([0., 1., 1., ..., 0., 0., 0.])"
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266625_1445359335",
+      "id": "20180312-172108_1871132312",
+      "dateCreated": "2020-02-05 15:21:06.625",
+      "dateStarted": "2020-02-05 15:42:57.337",
+      "dateFinished": "2020-02-05 15:43:01.756",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Build Model",
+      "text": "%python.ipython\n\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense\n\n\nmodel \u003d Sequential()\nmodel.add(Dense(16, input_shape\u003d(10000,), activation\u003d\u0027relu\u0027))\nmodel.add(Dense(16, activation\u003d\u0027relu\u0027))\nmodel.add(Dense(1, activation\u003d\u0027sigmoid\u0027))\n\nmodel.compile(loss\u003d\u0027binary_crossentropy\u0027, optimizer\u003d\u0027rmsprop\u0027, metrics\u003d[\u0027accuracy\u0027])\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:43:03.522",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "WARNING: Logging before flag parsing goes to stderr.\nW0205 15:43:03.542002 4550231488 deprecation_wrapper.py:119] From /Users/jzhang/anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:74: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n\nW0205 15:43:03.574465 4550231488 deprecation_wrapper.py:119] From /Users/jzhang/anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:517: T [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266625_-1696330995",
+      "id": "20180312-172157_1653956917",
+      "dateCreated": "2020-02-05 15:21:06.625",
+      "dateStarted": "2020-02-05 15:43:03.529",
+      "dateFinished": "2020-02-05 15:43:03.755",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Traing Model",
+      "text": "%python.ipython\n\nx_val \u003d x_train[:10000]\ny_val \u003d y_train[:10000]\npartial_x_train \u003d x_train[10000:]\npartial_y_train \u003d y_train[10000:]\n\nhistory \u003d model.fit(partial_x_train, partial_y_train, epochs\u003d20, batch_size\u003d512, validation_data\u003d(x_val, y_val))\n\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:43:07.601",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "W0205 15:43:08.120182 4550231488 deprecation_wrapper.py:119] From /Users/jzhang/anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:986: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.\n\nTrain on 15000 samples, validate on 10000 samples\nEpoch 1/20\n\r  512/15000 [\u003e.............................] - ETA: 14s - loss: 0.6939 - acc: 0.5020\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\ [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266626_-253784643",
+      "id": "20180312-175108_20761277",
+      "dateCreated": "2020-02-05 15:21:06.626",
+      "dateStarted": "2020-02-05 15:43:07.607",
+      "dateFinished": "2020-02-05 15:43:41.441",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n\nhistory_dict \u003d history.history\nhistory_dict",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:43:32.021",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true,
+        "title": false
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "{\u0027val_loss\u0027: [0.37968397402763365,\n  0.300372970533371,\n  0.30855551714897156,\n  0.28398124709129335,\n  0.2841434906005859,\n  0.3164743734836578,\n  0.312709903717041,\n  0.38588675870895384,\n  0.36348103885650634,\n  0.3842476764202118,\n  0.41507191224098205,\n  0.4539576127052307,\n  0.47011078305244447,\n  0.5024201002120972,\n  0.5311277472019196,\n  0.5638622181892395,\n  0.6184595478057862,\n  0.6363161237716675,\n  0.7269207975387574,\n  0.734 [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266629_-1158190533",
+      "id": "20180312-181145_1796362449",
+      "dateCreated": "2020-02-05 15:21:06.629",
+      "dateStarted": "2020-02-05 15:43:32.029",
+      "dateFinished": "2020-02-05 15:43:41.513",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Initialize Bokeh for training process plotting",
+      "text": "%python.ipython\n\nfrom bokeh.io import output_notebook, show\nfrom bokeh.plotting import figure\n\nimport bkzep\n\noutput_notebook(notebook_type\u003d\u0027zeppelin\u0027)\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:43:45.275",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\n    \u003cdiv class\u003d\"bk-root\"\u003e\n        \u003ca href\u003d\"https://bokeh.pydata.org\" target\u003d\"_blank\" class\u003d\"bk-logo bk-logo-small bk-logo-notebook\"\u003e\u003c/a\u003e\n        \u003cspan id\u003d\"1001\"\u003eLoading BokehJS ...\u003c/span\u003e\n    \u003c/div\u003e\n\n"
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript type\u003d\"text/javascript\"\u003e\n(function(root) {\n  function now() {\n    return new Date();\n  }\n\n  var force \u003d true;\n\n  if (typeof root._bokeh_onload_callbacks \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) {\n    root._bokeh_onload_callbacks \u003d [];\n    root._bokeh_is_loading \u003d undefined;\n  }\n\n  \n\n  \n  if (typeof (root._bokeh_timeout) \u003d\u003d\u003d \"undefined\" || force \u003d\u003d\u003d true) { [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266629_755430293",
+      "id": "20180312-212623_945231959",
+      "dateCreated": "2020-02-05 15:21:06.629",
+      "dateStarted": "2020-02-05 15:43:45.294",
+      "dateFinished": "2020-02-05 15:43:45.783",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Accuracy Plotting",
+      "text": "%python.ipython\n\nfrom bokeh.io import show\nfrom bokeh.plotting import figure\n\nval_acc, acc \u003d history_dict[\u0027val_acc\u0027], history_dict[\u0027acc\u0027]\n\nfig \u003d figure()\nfig.line(range(1, len(val_acc) + 1), val_acc, color\u003d\u0027red\u0027, legend\u003d\u0027Validation Accuracy\u0027)\nfig.line(range(1, len(acc) +1), acc, color\u003d\u0027blue\u0027, legend\u003d\u0027Training Accuracy\u0027)\nfig.xaxis.axis_label \u003d \u0027Epochs\u0027\nfig.yax [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:43:47.556",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 6.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"f0d77ab9-6462-42b8-a56c-278fcfe88973\" data-root-id\u003d\"1002\"\u003e\u003c/div\u003e\n\n"
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript type\u003d\"text/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"69449613-57e3-42d6-9ea9-8810b7923f2a\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1011\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1015\",\"type\":\"Grid\"},{\"id\":\"1020\",\"type\":\"Grid\"},{\"id\":\"1046\",\"type\":\"Legend\"}],\"left\":[{\"id\":\"1016\",\"type\":\"LinearAxis\"}],\"renderers\":[{\"id\": [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266630_-767905714",
+      "id": "20180312-212042_924458653",
+      "dateCreated": "2020-02-05 15:21:06.630",
+      "dateStarted": "2020-02-05 15:43:47.564",
+      "dateFinished": "2020-02-05 15:43:47.681",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Loss Plotting",
+      "text": "%python.ipython\n\nfrom bokeh.io import show\nfrom bokeh.plotting import figure\n\nval_loss, loss \u003d history_dict[\u0027val_loss\u0027], history_dict[\u0027loss\u0027]\n\nfig \u003d figure()\nfig.line(range(1, len(val_loss) + 1), val_loss, color\u003d\u0027red\u0027, legend\u003d\u0027Validation Loss\u0027)\nfig.line(range(1, len(loss) +1), loss, color\u003d\u0027blue\u0027, legend\u003d\u0027Training Loss\u0027)\n\nfig.xaxis.axis_label \u003d \u0027Epochs\u0027\nfig.y [...]
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:43:49.169",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 6.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "HTML",
+            "data": "\n\n\n\n\n\n  \u003cdiv class\u003d\"bk-root\" id\u003d\"26a3aff0-c188-468a-b2ec-ad59decbe6b8\" data-root-id\u003d\"1129\"\u003e\u003c/div\u003e\n\n"
+          },
+          {
+            "type": "HTML",
+            "data": "\u003cscript type\u003d\"text/javascript\"\u003e(function(root) {\n  function embed_document(root) {\n    \n  var docs_json \u003d {\"47586f20-c8c3-42c2-b62d-0467c6b8a1ba\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1138\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1142\",\"type\":\"Grid\"},{\"id\":\"1147\",\"type\":\"Grid\"},{\"id\":\"1173\",\"type\":\"Legend\"}],\"left\":[{\"id\":\"1143\",\"type\":\"LinearAxis\"}],\"renderers\":[{\"id\": [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266630_-932015545",
+      "id": "20180312-212825_683262480",
+      "dateCreated": "2020-02-05 15:21:06.630",
+      "dateStarted": "2020-02-05 15:43:49.182",
+      "dateFinished": "2020-02-05 15:43:49.332",
+      "status": "FINISHED"
+    },
+    {
+      "title": "Retrain the model in 4 epochs",
+      "text": "%python.ipython\n\nmodel.fit(x_train, y_train, epochs\u003d4, batch_size\u003d512)\nresults \u003d model.evaluate(x_test, y_test)\nprint(results)\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:43:52.363",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB",
+          "completionSupport": true
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "title": true,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "results": {
+        "code": "SUCCESS",
+        "msg": [
+          {
+            "type": "TEXT",
+            "data": "Epoch 1/4\n\r  512/25000 [..............................] - ETA: 1s - loss: 0.2078 - acc: 0.9590\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\r 1536/25000 [\u003e.............................] - ETA: 1s - loss: 0.2439 - acc: 0.9564\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\ [...]
+          }
+        ]
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266631_-208421764",
+      "id": "20180312-213402_1553086977",
+      "dateCreated": "2020-02-05 15:21:06.631",
+      "dateStarted": "2020-02-05 15:43:52.369",
+      "dateFinished": "2020-02-05 15:44:02.728",
+      "status": "FINISHED"
+    },
+    {
+      "title": "",
+      "text": "%python.ipython\n",
+      "user": "anonymous",
+      "dateUpdated": "2020-02-05 15:21:06.633",
+      "config": {
+        "editorSetting": {
+          "language": "python",
+          "editOnDblClick": false,
+          "completionKey": "TAB"
+        },
+        "colWidth": 12.0,
+        "editorMode": "ace/mode/python",
+        "fontSize": 9.0,
+        "results": {},
+        "enabled": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1580887266633_-1827767869",
+      "id": "20180312-214821_1740662910",
+      "dateCreated": "2020-02-05 15:21:06.633",
+      "status": "READY"
+    }
+  ],
+  "name": "Keras Binary Classification (IMDB)",
+  "id": "2F2AVWJ77",
+  "defaultInterpreterGroup": "spark",
+  "version": "0.9.0-SNAPSHOT",
+  "permissions": {},
+  "noteParams": {},
+  "noteForms": {},
+  "angularObjects": {},
+  "config": {
+    "isZeppelinNotebookCronEnable": true
+  },
+  "info": {},
+  "path": "/Python Tutorial/Keras Binary Classification (IMDB)"
+}
\ No newline at end of file
diff --git a/notebook/Zeppelin Tutorial/Matplotlib (Python, PySpark)_2C2AUG798.zpln b/notebook/Python Tutorial/Matplotlib (Python, PySpark)_2C2AUG798.zpln
similarity index 96%
rename from notebook/Zeppelin Tutorial/Matplotlib (Python, PySpark)_2C2AUG798.zpln
rename to notebook/Python Tutorial/Matplotlib (Python, PySpark)_2C2AUG798.zpln
index bbf25bf..6a7319a 100644
--- a/notebook/Zeppelin Tutorial/Matplotlib (Python, PySpark)_2C2AUG798.zpln	
+++ b/notebook/Python Tutorial/Matplotlib (Python, PySpark)_2C2AUG798.zpln	
@@ -1,9 +1,9 @@
 {
   "paragraphs": [
     {
-      "text": "%md\n## Introduction\nIn this tutorial we will go through some of the basic features of Zeppelin\u0027s built-in matplotlib integration. \n\n### Prerequisites\n`matplotlib` must be installed to your local python installation. (use `pip install matplotlib` or `conda install matplotlib` if you have `conda`). Additionally, you will need Zeppelin\u0027s matplotlib backend files which are usually found in `$ZEPPELIN_HOME/lib/python`. Although Zeppelin should automatically find  [...]
+      "text": "%md\n## Introduction\nIn this tutorial we will go through some of the basic features of Zeppelin\u0027s built-in matplotlib integration. To be noticed, this tutorial is only for Vanilla Python Interpreter (`%python` or `%spark.pyspark`). You can refer another tutorial (IPython Visualization Tutorial) for using Matplotlib in IPython Interpreter.\n\n### Prerequisites\n`matplotlib` must be installed to your local python installation. (use `pip install matplotlib` or `conda in [...]
       "user": "anonymous",
-      "dateUpdated": "Dec 17, 2016 3:33:25 PM",
+      "dateUpdated": "2020-02-05 15:48:09.193",
       "config": {
         "tableHide": false,
         "colWidth": 12.0,
@@ -26,33 +26,34 @@
         "editorSetting": {
           "language": "text",
           "editOnDblClick": false
-        }
+        },
+        "fontSize": 9.0
       },
       "settings": {
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627954_-1473548609",
-      "id": "20160614-174657_1772993700",
       "results": {
         "code": "SUCCESS",
         "msg": [
           {
             "type": "HTML",
-            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch2\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eIn this tutorial we will go through some of the basic features of Zeppelin\u0026rsquo;s built-in matplotlib integration. \u003c/p\u003e\n\u003ch3\u003ePrerequisites\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ematplotlib\u003c/code\u003e must be installed to your local python installation. (use \u003ccode\u003epip install matplotlib\u003c/code\u003e or \u003ccode\u00 [...]
+            "data": "\u003cdiv class\u003d\"markdown-body\"\u003e\n\u003ch2\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eIn this tutorial we will go through some of the basic features of Zeppelin\u0026rsquo;s built-in matplotlib integration. To be noticed, this tutorial is only for Vanilla Python Interpreter (\u003ccode\u003e%python\u003c/code\u003e or \u003ccode\u003e%spark.pyspark\u003c/code\u003e). You can refer another tutorial (IPython Visualization Tutorial) for using Matplotlib  [...]
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
-      "dateStarted": "Dec 17, 2016 3:33:25 PM",
-      "dateFinished": "Dec 17, 2016 3:33:25 PM",
-      "status": "FINISHED",
-      "progressUpdateIntervalMs": 500
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627954_-1473548609",
+      "id": "20160614-174657_1772993700",
+      "dateCreated": "2016-11-02 14:53:47.000",
+      "dateStarted": "2020-02-05 15:47:58.416",
+      "dateFinished": "2020-02-05 15:47:59.573",
+      "status": "FINISHED"
     },
     {
       "text": "%python\nimport matplotlib.pyplot as plt\nplt.plot([1, 2, 3])",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/python",
@@ -75,9 +76,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627958_-1475087605",
-      "id": "20161101-192232_289486976",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -87,14 +85,17 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627958_-1475087605",
+      "id": "20161101-192232_289486976",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "text": "%md\nNotice how an explicit call to `show()` is not necessary. This is accomplished via a post-execute hook which tells Zeppelin to plot all currently open matplotlib figures after executing the rest of the paragraph.\n### Plotting multiple figures\nWe can easily plot multiple figures at once too:",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/markdown",
@@ -118,9 +119,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627958_-1475087605",
-      "id": "20160617-002131_1552178409",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -130,14 +128,17 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627958_-1475087605",
+      "id": "20160617-002131_1552178409",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "text": "%python\n# Figure 1\nplt.plot([1, 2, 3])\n\n# Figure 2\nplt.figure()\nplt.plot([3, 2, 1])",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/python",
@@ -160,9 +161,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627959_-1475472354",
-      "id": "20161101-193533_2096366908",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -172,14 +170,17 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627959_-1475472354",
+      "id": "20161101-193533_2096366908",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "text": "%md\n### Changing the default inline plotting behavior\nBoth the `python` and `pyspark` include a built-in function for changing some default inline plotting behavior. For example, we can change the default size of each figure in pixels to 400x300 in svg format using: ",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "tableHide": false,
         "colWidth": 12.0,
@@ -204,9 +205,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627959_-1475472354",
-      "id": "20160614-174421_274483707",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -216,14 +214,17 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627959_-1475472354",
+      "id": "20160614-174421_274483707",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "text": "%python\nz.configure_mpl(width\u003d400, height\u003d300, fmt\u003d\u0027svg\u0027)\nplt.plot([1, 2, 3])",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/scala",
@@ -248,9 +249,6 @@
         },
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627959_-1475472354",
-      "id": "20160616-234947_579056637",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -260,14 +258,17 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627959_-1475472354",
+      "id": "20160616-234947_579056637",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "text": "%md\n### Iteratively updating a plot\n#### (a) Using multiple plots\nNow let\u0027s show an example where we update each element of the plot in a separate paragraph. However, you may have noticed that each matplotlib figure instance gets closed immediately after its shown. To fix this, we set the `close` property to `False` in our configuration:",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/markdown",
@@ -291,9 +292,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627960_-1477396098",
-      "id": "20160617-140439_1111727405",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -303,15 +301,18 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627960_-1477396098",
+      "id": "20160617-140439_1111727405",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "First line",
       "text": "%python\nplt.close() # Added here to reset the first plot when rerunning the paragraph\nz.configure_mpl(width\u003d600, height\u003d400, fmt\u003d\u0027png\u0027, close\u003dFalse)\nplt.plot([1, 2, 3], label\u003dr\u0027$y\u003dx$\u0027)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "title": true,
@@ -334,9 +335,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627960_-1477396098",
-      "id": "20161101-195657_1336292109",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -346,15 +344,18 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627960_-1477396098",
+      "id": "20161101-195657_1336292109",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "Second line",
       "text": "%python\nplt.plot([3, 2, 1], label\u003dr\u0027$y\u003d3-x$\u0027)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/python",
@@ -378,9 +379,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627961_-1477780847",
-      "id": "20161101-195937_907325325",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -390,15 +388,18 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627961_-1477780847",
+      "id": "20161101-195937_907325325",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "Label axes",
       "text": "%python\nplt.xlabel(r\u0027$x$\u0027, fontsize\u003d20)\nplt.ylabel(r\u0027$y$\u0027, fontsize\u003d20)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/python",
@@ -422,9 +423,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627962_-1476626600",
-      "id": "20161101-200014_2113468597",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -434,15 +432,18 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627962_-1476626600",
+      "id": "20161101-200014_2113468597",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "Add legend",
       "text": "%python\nplt.legend(loc\u003d\u0027upper center\u0027, fontsize\u003d20)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/python",
@@ -466,9 +467,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627962_-1476626600",
-      "id": "20161101-200141_1493024813",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -478,15 +476,18 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627962_-1476626600",
+      "id": "20161101-200141_1493024813",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "Add title",
       "text": "%python\nplt.title(\u0027Inline plotting example\u0027, fontsize\u003d20)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/python",
@@ -510,9 +511,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627963_-1477011349",
-      "id": "20161101-200445_78775142",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -522,14 +520,17 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627963_-1477011349",
+      "id": "20161101-200445_78775142",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "text": "%md\n####(b) Using a single plot\nTo iteratively update a single plot, we can leverage Zeppelin\u0027s built-in Angular Display System. Currently this feature is only available for the `pyspark` interpreter for raster (png and jpg) formats. To enable this, we must set a special `angular` flag to `True` in our configuration:",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "editorMode": "ace/mode/markdown",
@@ -553,9 +554,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627963_-1477011349",
-      "id": "20161101-200541_1283841564",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -565,16 +563,19 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627963_-1477011349",
+      "id": "20161101-200541_1283841564",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "First line (figure will be displayed here)",
       "text": "%pyspark\nimport matplotlib.pyplot as plt\nplt.close() # Added here to reset the plot when rerunning the paragraph\nz.configure_mpl(angular\u003dTrue, close\u003dFalse)\nplt.plot([1, 2, 3], label\u003dr\u0027$y\u003dx$\u0027)",
       "user": "anonymous",
-      "dateUpdated": "Nov 2, 2016 2:55:37 PM",
+      "dateUpdated": "2016-11-02 14:55:37.000",
       "config": {
         "colWidth": 7.0,
         "editorMode": "ace/mode/python",
@@ -598,9 +599,6 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627963_-1477011349",
-      "id": "20161101-200754_739212093",
       "results": {
         "code": "SUCCESS",
         "msg": [
@@ -610,16 +608,19 @@
           }
         ]
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
-      "dateStarted": "Nov 2, 2016 2:54:53 PM",
-      "dateFinished": "Nov 2, 2016 2:55:04 PM",
-      "status": "FINISHED",
-      "progressUpdateIntervalMs": 500
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627963_-1477011349",
+      "id": "20161101-200754_739212093",
+      "dateCreated": "2016-11-02 14:53:47.000",
+      "dateStarted": "2016-11-02 14:54:53.000",
+      "dateFinished": "2016-11-02 14:55:04.000",
+      "status": "FINISHED"
     },
     {
       "title": "Second line",
       "text": "%pyspark\nplt.plot([3, 2, 1], label\u003dr\u0027$y\u003d3-x$\u0027)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 5.0,
         "title": true,
@@ -630,22 +631,22 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627964_-1478935094",
-      "id": "20161101-200854_1676504884",
       "results": {
         "code": "SUCCESS",
         "msg": []
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627964_-1478935094",
+      "id": "20161101-200854_1676504884",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "Label axes",
       "text": "%pyspark\nplt.xlabel(r\u0027$x$\u0027, fontsize\u003d20)\nplt.ylabel(r\u0027$y$\u0027, fontsize\u003d20)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 5.0,
         "title": true,
@@ -656,22 +657,22 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627964_-1478935094",
-      "id": "20161101-200851_314384892",
       "results": {
         "code": "SUCCESS",
         "msg": []
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627964_-1478935094",
+      "id": "20161101-200851_314384892",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "Add legend",
       "text": "%pyspark\nplt.legend(loc\u003d\u0027upper center\u0027, fontsize\u003d20)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 5.0,
         "editorMode": "ace/mode/python",
@@ -683,22 +684,22 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627964_-1478935094",
-      "id": "20161101-201552_651686132",
       "results": {
         "code": "SUCCESS",
         "msg": []
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627964_-1478935094",
+      "id": "20161101-201552_651686132",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "title": "Add title",
       "text": "%pyspark\nplt.title(\u0027Inline plotting example\u0027, fontsize\u003d20)",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 5.0,
         "editorMode": "ace/mode/python",
@@ -710,21 +711,21 @@
         "params": {},
         "forms": {}
       },
-      "apps": [],
-      "jobName": "paragraph_1478123627965_-1479319843",
-      "id": "20161101-202024_1645454710",
       "results": {
         "code": "SUCCESS",
         "msg": []
       },
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "apps": [],
+      "progressUpdateIntervalMs": 500,
+      "jobName": "paragraph_1478123627965_-1479319843",
+      "id": "20161101-202024_1645454710",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     },
     {
       "text": "",
-      "dateUpdated": "Nov 2, 2016 2:53:47 PM",
+      "dateUpdated": "2016-11-02 14:53:47.000",
       "config": {
         "colWidth": 12.0,
         "graph": {
@@ -743,16 +744,20 @@
         "forms": {}
       },
       "apps": [],
+      "progressUpdateIntervalMs": 500,
       "jobName": "paragraph_1478123627965_-1479319843",
       "id": "20161102-124716_1703649609",
-      "dateCreated": "Nov 2, 2016 2:53:47 PM",
+      "dateCreated": "2016-11-02 14:53:47.000",
       "status": "READY",
-      "errorMessage": "",
-      "progressUpdateIntervalMs": 500
+      "errorMessage": ""
     }
   ],
   "name": "Matplotlib (Python, PySpark)",
   "id": "2C2AUG798",
+  "defaultInterpreterGroup": "spark",
+  "permissions": {},
+  "noteParams": {},
+  "noteForms": {},
   "angularObjects": {
     "2C6WUGPNH:shared_process": [],
     "2C4A8RJNB:shared_process": [],
@@ -774,6 +779,9 @@
     "2C49A6WY3:shared_process": [],
     "2C3NE73HG:shared_process": []
   },
-  "config": {},
-  "info": {}
-}
+  "config": {
+    "isZeppelinNotebookCronEnable": true
+  },
+  "info": {},
+  "path": "/Python Tutorial/Matplotlib (Python, PySpark)"
+}
\ No newline at end of file