{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "qgrid - An interactive grid for viewing and editing pandas DataFrames\n", "=======================================================\n", "Qgrid is an Jupyter notebook widget which uses a javascript library called SlickGrid to render pandas DataFrames within a Jupyter notebook. It was developed for use in [Quantopian's hosted research environment]( https://www.quantopian.com/research?utm_source=github&utm_medium=web&utm_campaign=qgrid-nbviewer).\n", "\n", "The purpose of this notebook is to give an overview of what qgrid is capable of. Execute the cells below to generate some qgrids using a diverse set of DataFrames." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview\n", "* [SlickGrid](https://github.com/mleibman/SlickGrid) is a javascript grid which allows users to scroll, sort, \n", "and filter hundreds of thousands of rows with extreme responsiveness. \n", "* [Pandas](https://github.com/pydata/pandas) is a powerful data analysis / manipulation library for Python, and DataFrames are the primary way of storing and manipulating two-dimensional data in pandas.\n", "\n", "[Qgrid](https://github.com/quantopian/qgrid) renders pandas DataFrames as SlickGrids, which enables users to explore the entire contents of a DataFrame using intuitive sorting and filtering controls. It's built on the ipywidget framework and is designed to be used in Jupyter notebook, Jupyterhub, or Jupyterlab" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's new\n", "\n", "#### Column options and new \"live-updating\" API methods - as of 1.1.0\n", "* Column options can be provided via the `show_grid` method. Options can be provided for all columns via the `column_options` parameter, and for individual columns via the `column_definitions` parameter.\n", "* Added `edit_cell`, `change_selection`, `toggle_editable` methods for updating the state of an existing grid widget without having to call `show_grid`.\n", "* Updated the `add_row` method so that the caller can specify the values for the new row via the `row` parameter. This will allow people to add rows to a qgrid instance even if it's showing a DataFrame that doesn't have an integer index.\n", "* Updated the `remove_row` method so that the indices of the rows to remove can optionally be provided via the `rows` parameter.\n", "* Fixed issue where moving the scroll bar around a bunch of times quickly can cause a series of grid refreshes to occur.\n", "\n", "#### Multi-index support - as of 1.0.6-beta.6\n", "* Improves support for viewing DataFrames with a MultiIndex.\n", "* Cells are merged vertically (similar to how pandas does it) to make it easier to identify the levels of the index.\n", "* Sorting or grouping any column other than level 0 of the multi-index results in the DataFrame returning to it's normal behavior of never merging cells vertically.\n", "* Column header is hidden for unnamed levels of the index (instead of showing \"level_0\", \"level_1\", etc)\n", "\n", "#### Events API - as of 1.0.3:\n", "* Added the ability to listen for events on all QgridWidget instances (using `qgrid.on`) as well as on individual instances (using `QgridWidget.on`).\n", "* **Breaking API Change:** Previously the recommended (but not officially documented) way of attaching event handlers to a QgridWidget instance was to listen for changes to the ``_df`` attribute using the ``observe`` method (i.e.``qgrid_widget.observe(handle_df_changed, names=['_df'])``). This method will no longer work for most events (scrolling, sorting, filtering, etc) so the new ``QgridWidget.on`` method should be used instead." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## API & Usage\n", "API documentation is hosted on [readthedocs](http://qgrid.readthedocs.io/en/widget-guidelines/). \n", "\n", "The API documentation can also be accessed via the \"?\" operator in IPython. To use the \"?\" operator, type the name of the function followed by \"?\" to see the documentation for that function, like this:\n", "```\n", "qgrid.show_grid?\n", "qgrid.set_defaults?\n", "qgrid.set_grid_options?\n", "qgrid.enable?\n", "qgrid.disable?\n", "\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 1 - Render a DataFrame with many different types of columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import qgrid\n", "randn = np.random.randn\n", "df_types = pd.DataFrame({\n", " 'A' : pd.Series(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n", " '2013-01-05', '2013-01-06', '2013-01-07', '2013-01-08', '2013-01-09'],index=list(range(9)),dtype='datetime64[ns]'),\n", " 'B' : pd.Series(randn(9),index=list(range(9)),dtype='float32'),\n", " 'C' : pd.Categorical([\"washington\", \"adams\", \"washington\", \"madison\", \"lincoln\",\"jefferson\", \"hamilton\", \"roosevelt\", \"kennedy\"]),\n", " 'D' : [\"foo\", \"bar\", \"buzz\", \"bippity\",\"boppity\", \"foo\", \"foo\", \"bar\", \"zoo\"] })\n", "df_types['E'] = df_types['D'] == 'foo'\n", "qgrid_widget = qgrid.show_grid(df_types, show_toolbar=True)\n", "qgrid_widget" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you make any sorting/filtering changes, or edit the grid by double clicking, you can retrieve a copy of your DataFrame which reflects these changes by calling `get_changed_df` on the `QgridWidget` instance returned by `show_grid`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "qgrid_widget.get_changed_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 2 - Render a DataFrame with 1 million rows\n", "*Note: The reason for the redundant \"import\" statements in the next cell (and many subsequent cells) is because it allows us to run the cells in any order.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import qgrid\n", "\n", "# set the default max number of rows to 10 so the larger DataFrame we render don't take up to much space \n", "qgrid.set_grid_option('maxVisibleRows', 10)\n", "\n", "df_scale = pd.DataFrame(np.random.randn(1000000, 4), columns=list('ABCD'))\n", "# duplicate column B as a string column, to test scalability for text column filters\n", "df_scale['B (as str)'] = df_scale['B'].map(lambda x: str(x))\n", "q_scale = qgrid.show_grid(df_scale, show_toolbar=True, grid_options={'forceFitColumns': False, 'defaultColumnWidth': 200})\n", "q_scale" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "q_scale.get_changed_df()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 3 - Render a DataFrame returned by Yahoo Finance by enabling automatic qgrids" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import qgrid\n", "randn = np.random.randn\n", "\n", "# Get a pandas DataFrame containing the daily prices for the S&P 500 from 1/1/2014 - 1/1/2017\n", "from pandas_datareader.data import DataReader\n", "spy = DataReader(\n", " 'SPY',\n", " 'yahoo',\n", " pd.Timestamp('2014-01-01'), \n", " pd.Timestamp('2017-01-01'),\n", ")\n", "# Tell qgrid to automatically render all DataFrames and Series as qgrids.\n", "qgrid.enable()\n", "\n", "# Render the DataFrame as a qgrid automatically\n", "spy" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Disable automatic display so we can display DataFrames in the normal way\n", "qgrid.disable()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 4 - Render a DataFrame with a multi-index\n", "\n", "Create a sample DataFrame using the `wb.download` function and render it without using qgrid" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import qgrid\n", "import pandas as pd\n", "from pandas_datareader import wb\n", "df_countries = wb.download(indicator='NY.GDP.PCAP.KD', country=['all'], start=2005, end=2008)\n", "df_countries.columns = ['GDP per capita (constant 2005 US$)']\n", "qgrid.show_grid(df_countries)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "df_countries" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 5 - Render a DataFrame with an interval column\n", "Create a sample DataFrame using the `wb.download` function and render it without using qgrid" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import qgrid\n", "\n", "td = np.cumsum(np.random.randint(1, 15*60, 1000))\n", "start = pd.Timestamp('2017-04-17')\n", "df_interval = pd.DataFrame(\n", " [(start + pd.Timedelta(seconds=d)) for d in td],\n", " columns=['time'])\n", "\n", "freq = '15Min'\n", "start = df_interval['time'].min().floor(freq)\n", "end = df_interval['time'].max().ceil(freq)\n", "bins = pd.date_range(start, end, freq=freq)\n", "\n", "df_interval['time_bin'] = pd.cut(df_interval['time'], bins)\n", "\n", "qgrid.show_grid(df_interval, show_toolbar=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "df_interval" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 6 - Render a DataFrame with unnamed columns\n", "Create a sample DataFrame using the `wb.download` function and render it without using qgrid" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import qgrid\n", "\n", "arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],\n", " ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]\n", "df_multi = pd.DataFrame(np.random.randn(8, 4), index=arrays)\n", "qgrid.show_grid(df_multi, show_toolbar=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df_multi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 7 - Render a narrow DataFrame inside a Layout widget\n", "Create a sample DataFrame with only two columns using `randint`, and render it in a Layout widget that's 20% of the width of the output area." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import qgrid\n", "import ipywidgets as ipyw\n", "randn = np.random.randn\n", "df_types = pd.DataFrame(np.random.randint(1,14,14))\n", "qgrid_widget = qgrid.show_grid(df_types, show_toolbar=False)\n", "qgrid_widget.layout = ipyw.Layout(width='20%')\n", "qgrid_widget" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 8 - Render a DataFrame with an index and column that contain multiple types" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import qgrid\n", "df = pd.DataFrame({'A': [1.2, 'xy', 4], 'B': [3, 4, 5]})\n", "df = df.set_index(pd.Index(['yz', 7, 3.2]))\n", "view = qgrid.show_grid(df)\n", "view" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 9 - Render a DataFrame with a Period index and Period column" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import qgrid\n", "range_index = pd.period_range(start='2000', periods=10, freq='B')\n", "df = pd.DataFrame({'a': 5, 'b': range_index}, index=range_index)\n", "view = qgrid.show_grid(df)\n", "view" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 10 - Render a DataFrame with NaN and None" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import qgrid\n", "df = pd.DataFrame([(pd.Timestamp('2017-02-02'), None, 3.4), (np.nan, 2, 4.7), (pd.Timestamp('2017-02-03'), 3, None)])\n", "qgrid.show_grid(df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "1a834c4c69af4c48bed691594ce5e0ad": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.0.0", "model_name": "LayoutModel", "state": {} }, "3fb8c261d3e249248ea7703065634285": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.0.0", "model_name": "LayoutModel", "state": {} }, "7aa5e1ce49fc4d0f9366bea5c684c58d": { "model_module": "qgrid", "model_module_version": "1.0.0-alpha.6", "model_name": "QgridModel", "state": { "_columns": { "A": { "name": "A", "type": "number" }, "B": { "name": "B", "type": "datetime" }, "C": { "name": "C", "type": "number" }, "D": { "name": "D", "type": "integer" }, "E": { "constraints": { "enum": [ "adams", "hamilton", "jefferson", "kennedy", "lincoln", "madison", "roosevelt", "washington" ] }, "name": "E", "ordered": false, "type": "any" }, "F": { "name": "F", "type": "string" }, "G": { "name": "G", "type": "boolean" }, "index": { "name": "index", "type": "integer" } }, "_df_json": "{\"schema\": {\"fields\":[{\"name\":\"index\",\"type\":\"integer\"},{\"name\":\"A\",\"type\":\"number\"},{\"name\":\"B\",\"type\":\"datetime\"},{\"name\":\"C\",\"type\":\"number\"},{\"name\":\"D\",\"type\":\"integer\"},{\"name\":\"E\",\"type\":\"any\",\"constraints\":{\"enum\":[\"adams\",\"hamilton\",\"jefferson\",\"kennedy\",\"lincoln\",\"madison\",\"roosevelt\",\"washington\"]},\"ordered\":false},{\"name\":\"F\",\"type\":\"string\"},{\"name\":\"G\",\"type\":\"boolean\"}],\"primaryKey\":[\"index\"],\"pandas_version\":\"0.20.0\"}, \"data\": [{\"index\":0,\"A\":1.0,\"B\":\"2013-01-01T00:00:00.000Z\",\"C\":-0.09128,\"D\":3,\"E\":\"washington\",\"F\":\"foo\",\"G\":true},{\"index\":1,\"A\":1.0,\"B\":\"2013-01-02T00:00:00.000Z\",\"C\":-0.57373,\"D\":3,\"E\":\"adams\",\"F\":\"bar\",\"G\":false},{\"index\":2,\"A\":1.0,\"B\":\"2013-01-03T00:00:00.000Z\",\"C\":0.4723,\"D\":3,\"E\":\"washington\",\"F\":\"buzz\",\"G\":false},{\"index\":3,\"A\":1.0,\"B\":\"2013-01-04T00:00:00.000Z\",\"C\":-0.09316,\"D\":3,\"E\":\"madison\",\"F\":\"bippity\",\"G\":false},{\"index\":4,\"A\":1.0,\"B\":\"2013-01-05T00:00:00.000Z\",\"C\":-0.20181,\"D\":3,\"E\":\"lincoln\",\"F\":\"boppity\",\"G\":false},{\"index\":5,\"A\":1.0,\"B\":\"2013-01-06T00:00:00.000Z\",\"C\":1.7561,\"D\":3,\"E\":\"jefferson\",\"F\":\"foo\",\"G\":true},{\"index\":6,\"A\":1.0,\"B\":\"2013-01-07T00:00:00.000Z\",\"C\":1.20064,\"D\":3,\"E\":\"hamilton\",\"F\":\"foo\",\"G\":true},{\"index\":7,\"A\":1.0,\"B\":\"2013-01-08T00:00:00.000Z\",\"C\":0.98097,\"D\":3,\"E\":\"roosevelt\",\"F\":\"bar\",\"G\":false},{\"index\":8,\"A\":1.0,\"B\":\"2013-01-09T00:00:00.000Z\",\"C\":0.8321,\"D\":3,\"E\":\"kennedy\",\"F\":\"zoo\",\"G\":false}]}", "_df_range": [ 0, 100 ], "_interval_columns": [], "_model_module_version": "1.0.0-alpha.6", "_row_count": 9, "_sort_ascending": true, "_sort_field": "", "_view_module_version": "1.0.0-alpha.6", "grid_options": { "autoEdit": false, "defaultColumnWidth": 150, "editable": true, "enableColumnReorder": false, "enableTextSelectionOnCells": true, "explicitInitialization": true, "forceFitColumns": true, "fullWidthRows": true, "rowHeight": 28, "syncColumnCellResize": true }, "layout": "IPY_MODEL_1a834c4c69af4c48bed691594ce5e0ad", "precision": 5, "show_toolbar": false } }, "7ec042abef044645a9f8bd38a3f69faf": { "model_module": "qgrid", "model_module_version": "1.0.0-alpha.6", "model_name": "QgridModel", "state": { "_columns": { "A": { "name": "A", "type": "number" }, "B": { "name": "B", "type": "datetime" }, "C": { "name": "C", "type": "number" }, "D": { "name": "D", "type": "integer" }, "E": { "constraints": { "enum": [ "adams", "hamilton", "jefferson", "kennedy", "lincoln", "madison", "roosevelt", "washington" ] }, "name": "E", "ordered": false, "type": "any" }, "F": { "name": "F", "type": "string" }, "G": { "name": "G", "type": "boolean" }, "index": { "name": "index", "type": "integer" } }, "_df_json": "{\"schema\": {\"fields\":[{\"name\":\"index\",\"type\":\"integer\"},{\"name\":\"A\",\"type\":\"number\"},{\"name\":\"B\",\"type\":\"datetime\"},{\"name\":\"C\",\"type\":\"number\"},{\"name\":\"D\",\"type\":\"integer\"},{\"name\":\"E\",\"type\":\"any\",\"constraints\":{\"enum\":[\"adams\",\"hamilton\",\"jefferson\",\"kennedy\",\"lincoln\",\"madison\",\"roosevelt\",\"washington\"]},\"ordered\":false},{\"name\":\"F\",\"type\":\"string\"},{\"name\":\"G\",\"type\":\"boolean\"}],\"primaryKey\":[\"index\"],\"pandas_version\":\"0.20.0\"}, \"data\": [{\"index\":0,\"A\":1.0,\"B\":\"2013-01-01T00:00:00.000Z\",\"C\":0.13177,\"D\":3,\"E\":\"washington\",\"F\":\"foo\",\"G\":true},{\"index\":1,\"A\":1.0,\"B\":\"2013-01-02T00:00:00.000Z\",\"C\":-1.56846,\"D\":3,\"E\":\"adams\",\"F\":\"bar\",\"G\":false},{\"index\":2,\"A\":1.0,\"B\":\"2013-01-03T00:00:00.000Z\",\"C\":1.2584,\"D\":3,\"E\":\"washington\",\"F\":\"buzz\",\"G\":false},{\"index\":3,\"A\":1.0,\"B\":\"2013-01-04T00:00:00.000Z\",\"C\":-1.54316,\"D\":3,\"E\":\"madison\",\"F\":\"bippity\",\"G\":false},{\"index\":4,\"A\":1.0,\"B\":\"2013-01-05T00:00:00.000Z\",\"C\":0.01483,\"D\":3,\"E\":\"lincoln\",\"F\":\"boppity\",\"G\":false},{\"index\":5,\"A\":1.0,\"B\":\"2013-01-06T00:00:00.000Z\",\"C\":-0.26442,\"D\":3,\"E\":\"jefferson\",\"F\":\"foo\",\"G\":true},{\"index\":6,\"A\":1.0,\"B\":\"2013-01-07T00:00:00.000Z\",\"C\":-1.85692,\"D\":3,\"E\":\"hamilton\",\"F\":\"foo\",\"G\":true},{\"index\":7,\"A\":1.0,\"B\":\"2013-01-08T00:00:00.000Z\",\"C\":1.38498,\"D\":3,\"E\":\"roosevelt\",\"F\":\"bar\",\"G\":false},{\"index\":8,\"A\":1.0,\"B\":\"2013-01-09T00:00:00.000Z\",\"C\":0.40905,\"D\":3,\"E\":\"kennedy\",\"F\":\"zoo\",\"G\":false}]}", "_df_range": [ 0, 100 ], "_interval_columns": [], "_model_module_version": "1.0.0-alpha.6", "_row_count": 9, "_sort_ascending": true, "_sort_field": "", "_view_module_version": "1.0.0-alpha.6", "grid_options": { "autoEdit": false, "defaultColumnWidth": 150, "editable": true, "enableColumnReorder": false, "enableTextSelectionOnCells": true, "explicitInitialization": true, "forceFitColumns": true, "fullWidthRows": true, "rowHeight": 28, "syncColumnCellResize": true }, "layout": "IPY_MODEL_8eb3cf5ce7da431db4a3e4e9d3d64511", "precision": 5, "show_toolbar": false } }, "8eb3cf5ce7da431db4a3e4e9d3d64511": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.0.0", "model_name": "LayoutModel", "state": {} }, "fa118ab9f1c840cd83509f56d50ee163": { "model_module": "qgrid", "model_module_version": "1.0.0-alpha.6", "model_name": "QgridModel", "state": { "_columns": { "A": { "name": "A", "type": "number" }, "B": { "name": "B", "type": "datetime" }, "C": { "name": "C", "type": "number" }, "D": { "name": "D", "type": "integer" }, "E": { "constraints": { "enum": [ "adams", "hamilton", "jefferson", "kennedy", "lincoln", "madison", "roosevelt", "washington" ] }, "name": "E", "ordered": false, "type": "any" }, "F": { "name": "F", "type": "string" }, "G": { "name": "G", "type": "boolean" }, "index": { "name": "index", "type": "integer" } }, "_df_json": "{\"schema\": {\"fields\":[{\"name\":\"index\",\"type\":\"integer\"},{\"name\":\"A\",\"type\":\"number\"},{\"name\":\"B\",\"type\":\"datetime\"},{\"name\":\"C\",\"type\":\"number\"},{\"name\":\"D\",\"type\":\"integer\"},{\"name\":\"E\",\"type\":\"any\",\"constraints\":{\"enum\":[\"adams\",\"hamilton\",\"jefferson\",\"kennedy\",\"lincoln\",\"madison\",\"roosevelt\",\"washington\"]},\"ordered\":false},{\"name\":\"F\",\"type\":\"string\"},{\"name\":\"G\",\"type\":\"boolean\"}],\"primaryKey\":[\"index\"],\"pandas_version\":\"0.20.0\"}, \"data\": [{\"index\":0,\"A\":1.0,\"B\":\"2013-01-01T00:00:00.000Z\",\"C\":-0.67408,\"D\":3,\"E\":\"washington\",\"F\":\"foo\",\"G\":true},{\"index\":1,\"A\":1.0,\"B\":\"2013-01-02T00:00:00.000Z\",\"C\":-0.87122,\"D\":3,\"E\":\"adams\",\"F\":\"bar\",\"G\":false},{\"index\":2,\"A\":1.0,\"B\":\"2013-01-03T00:00:00.000Z\",\"C\":0.58722,\"D\":3,\"E\":\"washington\",\"F\":\"buzz\",\"G\":false},{\"index\":3,\"A\":1.0,\"B\":\"2013-01-04T00:00:00.000Z\",\"C\":0.14947,\"D\":3,\"E\":\"madison\",\"F\":\"bippity\",\"G\":false},{\"index\":4,\"A\":1.0,\"B\":\"2013-01-05T00:00:00.000Z\",\"C\":0.89719,\"D\":3,\"E\":\"lincoln\",\"F\":\"boppity\",\"G\":false},{\"index\":5,\"A\":1.0,\"B\":\"2013-01-06T00:00:00.000Z\",\"C\":0.41141,\"D\":3,\"E\":\"jefferson\",\"F\":\"foo\",\"G\":true},{\"index\":6,\"A\":1.0,\"B\":\"2013-01-07T00:00:00.000Z\",\"C\":0.66837,\"D\":3,\"E\":\"hamilton\",\"F\":\"foo\",\"G\":true},{\"index\":7,\"A\":1.0,\"B\":\"2013-01-08T00:00:00.000Z\",\"C\":0.42815,\"D\":3,\"E\":\"roosevelt\",\"F\":\"bar\",\"G\":false},{\"index\":8,\"A\":1.0,\"B\":\"2013-01-09T00:00:00.000Z\",\"C\":-0.49399,\"D\":3,\"E\":\"kennedy\",\"F\":\"zoo\",\"G\":false}]}", "_df_range": [ 0, 100 ], "_interval_columns": [], "_model_module_version": "1.0.0-alpha.6", "_row_count": 9, "_sort_ascending": true, "_sort_field": "", "_view_module_version": "1.0.0-alpha.6", "grid_options": { "autoEdit": false, "defaultColumnWidth": 150, "editable": true, "enableColumnReorder": false, "enableTextSelectionOnCells": true, "explicitInitialization": true, "forceFitColumns": true, "fullWidthRows": true, "rowHeight": 28, "syncColumnCellResize": true }, "layout": "IPY_MODEL_3fb8c261d3e249248ea7703065634285", "precision": 5, "show_toolbar": false } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 2 }