Metadata-Version: 2.1
Name: dtale
Version: 1.7.14
Summary: Web Client for Visualizing Pandas Objects
Home-page: https://github.com/man-group/dtale
Author: MAN Alpha Technology
Author-email: ManAlphaTech@man.com
License: LGPL
Keywords: numeric,pandas,visualization,flask
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
Classifier: Operating System :: OS Independent
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python
Classifier: Topic :: Scientific/Engineering
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.6
Requires-Dist: dash (>=1.5.0)
Requires-Dist: dash-daq
Requires-Dist: Flask-Compress
Requires-Dist: Flask
Requires-Dist: future (>=0.14.0)
Requires-Dist: itsdangerous
Requires-Dist: pandas
Requires-Dist: requests
Requires-Dist: scipy
Requires-Dist: six
Requires-Dist: lz4 (<=2.2.1) ; python_version < "3.0"
Requires-Dist: lz4 ; python_version > "3.0"
Requires-Dist: flask-ngrok ; python_version > "3.0"
Provides-Extra: arctic
Requires-Dist: arctic ; extra == 'arctic'
Provides-Extra: r
Requires-Dist: rpy2 (<=2.8.6) ; (python_version < "3.0") and extra == 'r'
Requires-Dist: rpy2 ; (python_version > "3.0") and extra == 'r'
Provides-Extra: redis
Requires-Dist: redislite ; extra == 'redis'
Provides-Extra: tests
Requires-Dist: ipython ; extra == 'tests'
Requires-Dist: mock ; extra == 'tests'
Requires-Dist: pytest (==4.6.4) ; extra == 'tests'
Requires-Dist: pytest-cov ; extra == 'tests'
Requires-Dist: pytest-server-fixtures ; extra == 'tests'

|image0|

`Live Demo <http://andrewschonfeld.pythonanywhere.com>`__

--------------

|CircleCI| |PyPI| |ReadTheDocs| |codecov| |Downloads|

What is it?
-----------

D-Tale is the combination of a Flask back-end and a React front-end to
bring you an easy way to view & analyze Pandas data structures. It
integrates seamlessly with ipython notebooks & python/ipython terminals.
Currently this tool supports such Pandas objects as DataFrame, Series,
MultiIndex, DatetimeIndex & RangeIndex.

Origins
-------

D-Tale was the product of a SAS to Python conversion. What was
originally a perl script wrapper on top of SAS’s ``insight`` function is
now a lightweight web client on top of Pandas data structures.

In The News
-----------

-  `Man Institute <https://www.man.com/maninstitute/d-tale>`__ (warning:
   contains deprecated functionality)
-  `Python
   Bytes <https://pythonbytes.fm/episodes/show/169/jupyter-notebooks-natively-on-your-ipad>`__

Tutorials
---------

-  `Pip Install Python YouTube
   Channel <https://m.youtube.com/watch?v=0RihZNdQc7k&feature=youtu.be>`__
-  `machine_learning_2019 <https://www.youtube.com/watch?v=-egtEUVBy9c>`__

Contents
--------

-  `Getting Started <#getting-started>`__

   -  `Python Terminal <#python-terminal>`__
   -  `Jupyter Notebook <#jupyter-notebook>`__
   -  `Jupyterhub w/
      Kubernetes <https://github.com/man-group/dtale/blob/master/docs/JUPYTERHUB_KUBERNETES.md>`__
   -  `Google Colab & Kaggle <#google-colab--kaggle>`__
   -  `R with Reticulate <#r-with-reticulate>`__
   -  `Command-line <#command-line>`__

-  `UI <#ui>`__

   -  `Dimensions/Main Menu <#dimensionsmain-menu>`__
   -  `Selecting/Deselecting Columns <#selectingdeselecting-columns>`__
   -  `Main Menu Functions <#main-menu-functions>`__

      -  `Describe <#describe>`__, `Filter <#filter>`__, `Building
         Columns <#building-columns>`__, `Reshape <#reshape>`__,
         `Charts <#charts>`__, `Coverage
         (Deprecated) <#coverage-deprecated>`__,
         `Correlations <#correlations>`__, `Heat Map <#heat-map>`__,
         `Instances <#instances>`__, `Code Exports <#code-exports>`__,
         `About <#about>`__, `Resize <#resize>`__,
         `Shutdown <#shutdown>`__

   -  `Column Menu Functions <#column-menu-functions>`__

      -  `Moving Columns <#moving-columns>`__, `Hiding
         Columns <#hiding-columns>`__, `Lock <#lock>`__,
         `Unlock <#unlock>`__, `Sorting <#sorting>`__,
         `Formats <#formats>`__, `Column Analysis <#column-analysis>`__

   -  `Menu Functions within a Jupyter
      Notebook <#menu-functions-within-a-jupyter-notebook>`__

-  `For Developers <#for-developers>`__

   -  `Cloning <#cloning>`__
   -  `Running Tests <#running-tests>`__
   -  `Linting <#linting>`__
   -  `Formatting JS <#formatting-js>`__
   -  `Docker Development <#docker-development>`__

-  `Startup Behavior <#startup-behavior>`__
-  `Documentation <#documentation>`__
-  `Requirements <#requirements>`__
-  `Acknowledgements <#acknowledgements>`__
-  `License <#license>`__

Getting Started
---------------

======== ========
PyCharm  jupyter
======== ========
|image6| |image7|
======== ========

Installing the egg

.. code:: bash

   # install dtale egg (important to use the "--upgrade" every time you install so it will grab the latest version)
   $ pip install --upgrade dtale

Now you will have the ability to use D-Tale from the command-line or
within a python-enabled terminal

Python Terminal
~~~~~~~~~~~~~~~

This comes courtesy of PyCharm |image8| Feel free to invoke ``python``
or ``ipython`` directly and use the commands in the screenshot above and
it should work

Issues With Windows Firewall
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If you run into issues with viewing D-Tale in your browser on Windows
please try making Python public under “Allowed Apps” in your Firewall
configuration. Here is a nice article: `How to Allow Apps to Communicate
Through the Windows
Firewall <https://www.howtogeek.com/howto/uncategorized/how-to-create-exceptions-in-windows-vista-firewall/>`__

Additional functions available programatically
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: python

   import dtale
   import pandas as pd

   df = pd.DataFrame([dict(a=1,b=2,c=3)])

   # Assigning a reference to a running D-Tale process
   d = dtale.show(df)

   # Accessing data associated with D-Tale process
   tmp = d.data.copy()
   tmp['d'] = 4

   # Altering data associated with D-Tale process
   # FYI: this will clear any front-end settings you have at the time for this process (filter, sorts, formatting)
   d.data = tmp

   # Shutting down D-Tale process
   d.kill()

   # using Python's `webbrowser` package it will try and open your server's default browser to this process
   d.open_browser()

   # There is also some helpful metadata about the process
   d._data_id  # the process's data identifier
   d._url  # the url to access the process

   d2 = dtale.get_instance(d._data_id)  # returns a new reference to the instance running at that data_id

   dtale.instances()  # prints a list of all ids & urls of running D-Tale sessions

Duplicate data check
^^^^^^^^^^^^^^^^^^^^

To help guard against users loading the same data to D-Tale multiple
times and thus eating up precious memory, we have a loose check for
duplicate input data. The check runs the following: \* Are row & column
count the same as a previously loaded piece of data? \* Are the names
and order of columns the same as a previously loaded piece of data?

If both these conditions are true then you will be presented with an
error and a link to the previously loaded data. Here is an example of
how the interaction looks: |image9|

Jupyter Notebook
~~~~~~~~~~~~~~~~

Within any jupyter (ipython) notebook executing a cell like this will
display a small instance of D-Tale in the output cell. Here are some
examples:

============== ========== =========
``dtale.show`` assignment instance
============== ========== =========
|image10|      |image11|  |image12|
============== ========== =========

If you are running ipython<=5.0 then you also have the ability to adjust
the size of your output cell for the most recent instance displayed:

|image13|

One thing of note is that a lot of the modal popups you see in the
standard browser version will now open separate browser windows for
spacial convienence:

============ ============ ========= =============== =========
Column Menus Correlations Describe  Column Analysis Instances
============ ============ ========= =============== =========
|image14|    |image15|    |image16| |image17|       |image18|
============ ============ ========= =============== =========

JupyterHub w/ Kubernetes
~~~~~~~~~~~~~~~~~~~~~~~~

Please read this
`post <https://github.com/man-group/dtale/blob/master/docs/JUPYTERHUB_KUBERNETES.md>`__

Google Colab & Kaggle
~~~~~~~~~~~~~~~~~~~~~

These are hosted notebook sites and thanks to the work of
`flask_ngrok <https://github.com/gstaff/flask-ngrok>`__ users can run
D-Tale within their notebooks.

**DISCLAIMER:** It is import that you set ``USE_NGROK`` to true when
using D-Tale within these two services. Here is an example:

::

   import pandas as pd

   import dtale
   import dtale.app as dtale_app

   dtale_app.USE_NGROK = True

   dtale.show(pd.DataFrame([1,2,3]))

Here are some video tutorials of each:

+-----------------------+-----------------------+-----------------------+
| Service               | Tutorial              | Addtl Notes           |
+=======================+=======================+=======================+
| Google Colab          | |image19|             |                       |
+-----------------------+-----------------------+-----------------------+
| Kaggle                | |image20|             | make sure you switch  |
|                       |                       | the “Internet” toggle |
|                       |                       | to “On” under         |
|                       |                       | settings of your      |
|                       |                       | notebook so you can   |
|                       |                       | install the egg from  |
|                       |                       | pip                   |
+-----------------------+-----------------------+-----------------------+

R with Reticulate
~~~~~~~~~~~~~~~~~

I was able to get D-Tale running in R using reticulate. Here is an
example:

::

   library('reticulate')
   dtale <- import('dtale')
   df <- read.csv('https://vincentarelbundock.github.io/Rdatasets/csv/boot/acme.csv')
   dtale$show(df, subprocess=FALSE, open_browser=TRUE)

Now the problem with doing this is that D-Tale is not running as a
subprocess so it will block your R console and you’ll lose out the
following functions: - manipulating the state of your data from your R
console - adding more data to D-Tale

``open_browser=TRUE`` isn’t required and won’t work if you don’t have a
default browser installed on your machine. If you don’t use that
parameter simply copy & paste the URL that gets printed to your console
in the browser of your choice.

I’m going to do some more digging on why R doesn’t seem to like using
python subprocesses (not sure if it something with how reticulate
manages the state of python) and post any findings to this thread.

Here’s some helpful links for getting setup:

reticulate

installing python packages

Command-line
~~~~~~~~~~~~

Base CLI options (run ``dtale --help`` to see all options available)

+-----------------------------+----------------------------------------+
| Prop                        | Description                            |
+=============================+========================================+
| ``--host``                  | the name of the host you would like to |
|                             | use (most likely not needed since      |
|                             | ``socket.gethostname()`` should figure |
|                             | this out)                              |
+-----------------------------+----------------------------------------+
| ``--port``                  | the port you would like to assign to   |
|                             | your D-Tale instance                   |
+-----------------------------+----------------------------------------+
| ``--name``                  | an optional name you can assign to     |
|                             | your D-Tale instance (this will be     |
|                             | displayed in the ``<title>`` &         |
|                             | Instances popup)                       |
+-----------------------------+----------------------------------------+
| ``--debug``                 | turn on Flask’s “debug” mode for your  |
|                             | D-Tale instance                        |
+-----------------------------+----------------------------------------+
| ``--no-reaper``             | flag to turn off auto-reaping          |
|                             | subprocess (kill D-Tale instances      |
|                             | after an hour of inactivity), good for |
|                             | long-running displays                  |
+-----------------------------+----------------------------------------+
| ``--open-browser``          | flag to automatically open up your     |
|                             | server’s default browser to your       |
|                             | D-Tale instance                        |
+-----------------------------+----------------------------------------+
| ``--force``                 | flag to force D-Tale to try an kill    |
|                             | any pre-existing process at the port   |
|                             | you’ve specified so it can use it      |
+-----------------------------+----------------------------------------+

Loading data from `arctic\ (high performance datastore for pandas
dataframes) <https://github.com/man-group/arctic>`__ (this requires
either installing **arctic** or **dtale[arctic]**)

.. code:: bash

   dtale --arctic-host mongodb://localhost:27027 --arctic-library jdoe.my_lib --arctic-node my_node --arctic-start 20130101 --arctic-end 20161231

Loading data from **CSV**

.. code:: bash

   dtale --csv-path /home/jdoe/my_csv.csv --csv-parse_dates date

Loading data from **JSON**

.. code:: bash

   dtale --json-path /home/jdoe/my_json.json --json-parse_dates date

or

.. code:: bash

   dtale --json-path http://json-endpoint --json-parse_dates date

Loading data from a **Custom** loader - Using the DTALE_CLI_LOADERS
environment variable, specify a path to a location containing some
python modules - Any python module containing the global variables
LOADER_KEY & LOADER_PROPS will be picked up as a custom loader -
LOADER_KEY: the key that will be associated with your loader. By default
you are given **arctic** & **csv** (if you use one of these are your key
it will override these) - LOADER_PROPS: the individual props available
to be specified. - For example, with arctic we have host, library, node,
start & end. - If you leave this property as an empty list your loader
will be treated as a flag. For example, instead of using all the arctic
properties we would simply specify ``--arctic`` (this wouldn’t work well
in arctic’s case since it depends on all those properties) - You will
also need to specify a function with the following signature
``def find_loader(kwargs)`` which returns a function that returns a
dataframe or ``None`` - Here is an example of a custom loader:

.. code:: python

   from dtale.cli.clickutils import get_loader_options

   '''
     IMPORTANT!!! This global variable is required for building any customized CLI loader.
     When find loaders on startup it will search for any modules containing the global variable LOADER_KEY.
   '''
   LOADER_KEY = 'testdata'
   LOADER_PROPS = ['rows', 'columns']


   def test_data(rows, columns):
       import pandas as pd
       import numpy as np
       import random
       from past.utils import old_div
       from pandas.tseries.offsets import Day
       from dtale.utils import dict_merge
       import string

       now = pd.Timestamp(pd.Timestamp('now').date())
       dates = pd.date_range(now - Day(364), now)
       num_of_securities = max(old_div(rows, len(dates)), 1)  # always have at least one security
       securities = [
           dict(security_id=100000 + sec_id, int_val=random.randint(1, 100000000000),
                str_val=random.choice(string.ascii_letters) * 5)
           for sec_id in range(num_of_securities)
       ]
       data = pd.concat([
           pd.DataFrame([dict_merge(dict(date=date), sd) for sd in securities])
           for date in dates
       ], ignore_index=True)[['date', 'security_id', 'int_val', 'str_val']]

       col_names = ['Col{}'.format(c) for c in range(columns)]
       return pd.concat([data, pd.DataFrame(np.random.randn(len(data), columns), columns=col_names)], axis=1)


   # IMPORTANT!!! This function is required for building any customized CLI loader.
   def find_loader(kwargs):
       test_data_opts = get_loader_options(LOADER_KEY, kwargs)
       if len([f for f in test_data_opts.values() if f]):
           def _testdata_loader():
               return test_data(int(test_data_opts.get('rows', 1000500)), int(test_data_opts.get('columns', 96)))

           return _testdata_loader
       return None

In this example we simplying building a dataframe with some dummy data
based on dimensions specified on the command-line: - ``--testdata-rows``
- ``--testdata-columns``

Here’s how you would use this loader:

.. code:: bash

   DTALE_CLI_LOADERS=./path_to_loaders bash -c 'dtale --testdata-rows 10 --testdata-columns 5'

Accessing CLI Loaders in Notebook or Console
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I am pleased to announce that all CLI loaders will be available within
notebooks & consoles. Here are some examples: -
``dtale.show_csv(path='test.csv', parse_dates=['date'])`` -
``dtale.show_json(path='http://json-endpoint', parse_dates=['date'])`` -
``dtale.show_json(path='test.json', parse_dates=['date'])`` -
``dtale.show_arctic(host='host', library='library', node='node', start_date='20200101', end_date='20200101')``

UI
--

Once you have kicked off your D-Tale session please copy & paste the
link on the last line of output in your browser |image21|

Dimensions/Main Menu
~~~~~~~~~~~~~~~~~~~~

The information in the upper right-hand corner gives grid dimensions
|image22| - lower-left => row count - upper-right => column count -
clicking the triangle displays the menu of standard functions (click
outside menu to close it) |image23|

Main Menu Functions
~~~~~~~~~~~~~~~~~~~

Describe
^^^^^^^^

View all the columns & their data types as well as individual details of
each column

|image24|

+-----------------------+-----------------------+-----------------------+
| Data Type             | Display               | Notes                 |
+=======================+=======================+=======================+
| date                  | |image25|             |                       |
+-----------------------+-----------------------+-----------------------+
| string                | |image26|             | If you have less than |
|                       |                       | or equal to 100       |
|                       |                       | unique values they    |
|                       |                       | will be displayed at  |
|                       |                       | the bottom of your    |
|                       |                       | popup                 |
+-----------------------+-----------------------+-----------------------+
| int                   | |image27|             | Anything with         |
|                       |                       | standard numeric      |
|                       |                       | classifications (min, |
|                       |                       | max, 25%, 50%, 75%)   |
|                       |                       | will have a nice      |
|                       |                       | boxplot with the mean |
|                       |                       | (if it exists)        |
|                       |                       | displayed as an       |
|                       |                       | outlier if you look   |
|                       |                       | closely.              |
+-----------------------+-----------------------+-----------------------+
| float                 | |image28|             |                       |
+-----------------------+-----------------------+-----------------------+

Filter
^^^^^^

Apply a simple pandas ``query`` to your data (link to pandas
documentation included in popup)

Context Variables are user-defined values passed in via the
``context_variables`` argument to dtale.show(); they can be referenced
in filters by prefixing the variable name with ‘@’.

For example, here is how you can use context variables in a pandas
query:

.. code:: python

   import pandas as pd

   df = pd.DataFrame([
     dict(name='Joe', age=7),
     dict(name='Bob', age=23),
     dict(name='Ann', age=45),
     dict(name='Cat', age=88),
   ])
   two_oldest_ages = df['age'].nlargest(2)
   df.query('age in @two_oldest_ages')

And here is how you would pass that context variable to D-Tale:
``dtale.show(df, context_variables=dict(two_oldest_ages=two_oldest_ages))``

========= =========
Editing   Result
========= =========
|image29| |image30|
========= =========

FYI: For python 3 users, there is now support for filtering on column
names with special characters in them (EX: ‘a.b’) :metal:

Building Columns
^^^^^^^^^^^^^^^^

|image31|

This video shows you how to build the following: - Numeric:
adding/subtracting two columns or columns with static values - Bins:
bucketing values using pandas cut & qcut as well as assigning custom
labels - Dates: retrieving date properties (hour, weekday, month…) as
well as conversions (month end)

Reshape
^^^^^^^

This is very powerful functionality which allows users to create a new
data from currently loaded data. The operations currently available are:
- **Aggregation**: consolidate data by running different aggregations on
columns by a specific index - **Pivot**: this is simple wrapper around
`pandas.Dataframe.pivot <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pivot.html>`__
and
`pandas.pivot_table <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html>`__
- **Transpose**: transpose your data on a index (be careful dataframes
can get very wide if your index has many unique values)

*Tutorials: coming soon*

Charts
^^^^^^

Build custom charts based off your data(powered by
`plotly/dash <https://github.com/plotly/dash>`__).

-  The Charts will open in a tab because of the fact there is so much
   functionality offered there you’ll probably want to be able to
   reference the main grid data in the original tab
-  To build a chart you must pick a value for X & Y inputs which
   effectively drive what data is along the X & Y axes

   -  If you are working with a 3-Dimensional chart (heatmap, 3D
      Scatter, Surface) you’ll need to enter a value for the Z axis as
      well

-  Once you have entered all the required axes a chart will be built
-  If your data along the x-axis (or combination of x & y in the case of
   3D charts) has duplicates you have three options:

   -  Specify a group, which will create series for each group
   -  Specify an aggregation, you can choose from one of the following:
      Count, First, Last, Mean, Median, Minimum, Maximum, Standard
      Deviation, Variance, Mean Absolute Deviation, Product of All
      Items, Sum, Rolling

      -  Specifying a “Rolling” aggregation will also require a Window &
         a Computation (Correlation, Count, Covariance, Kurtosis,
         Maximum, Mean, Median, Minimum, Skew, Standard Deviation, Sum
         or Variance)
      -  For heatmaps you will also have access to the “Correlation”
         aggregation since viewing correlation matrices in heatmaps is
         very useful. This aggregation is not supported elsewhere

   -  Specify both a group & an aggregation

-  You now have the ability to toggle between different chart types:
   line, bar, pie, wordcloud, heatmap, 3D scatter & surface
-  If you have specified a group then you have the ability between
   showing all series in one chart and breaking each series out into its
   own chart “Chart per Group”

Here are some examples:

========== ========= ===============
Chart Type Chart     Chart per Group
========== ========= ===============
line       |image32| |image33|
bar        |image34| |image35|
stacked    |image36| |image37|
pie        |image38| 
wordcloud  |image39| |image40|
heatmap    |image41| 
3D scatter |image42| 
surface    |image43| 
========== ========= ===============

Selecting multiple columns for the Y-Axis will produce similar results
to grouping in the sense that the chart will contain multiple series,
but the difference is that for each column there will be a different
Y-Axis associated with it in case the values contained within each
column are on different scales.

============ ===================
Multi Y-Axis Editing Axis Ranges
============ ===================
|image44|    |image45|
============ ===================

With a bar chart that only has a single Y-Axis you have the ability to
sort the bars based on the values for the Y-Axis

========= =========
Pre-sort  Post-sort
========= =========
|image46| |image47|
========= =========

**Popup Charts**

Viewing multiple charts at once and want to separate one out into its
own window or simply move one off to the side so you can work on
building another for comparison? Well now you can by clicking the
“Popup” button :smile:

**Copy Link**

Want to send what you’re looking at to someone else? Simply click the
“Copy Link” button and it will save a pre-populated chart URL into your
clipboard. As long as your D-Tale process is still running when that
link is opened you will see your original chart.

**Exporting Charts (not available in Demo, limitation
of**\ `PythonAnywhere <https://www.pythonanywhere.com/forums/topic/8612/>`__\ **)**

You can now export your dash charts (with the exception of Wordclouds)
to static HTML files which can be emailed to others or saved down to be
viewed at a later time. The best part is that all of the javascript for
plotly is embedded in these files so the nice zooming, panning, etc is
still available! :boom:

**Exporting CSV (not available in Demo, limitation
of**\ `PythonAnywhere <https://www.pythonanywhere.com/forums/topic/8612/>`__\ **)**

I’ve been asked about being able to export the data that is contained
within your chart to a CSV for further analysis in tools like Excel.
This button makes that possible.

**OFFLINE CHARTS**

Want to run D-Tale in a jupyter notebook and build a chart that will
still be displayed even after your D-Tale process has shutdown? Now you
can! Here’s an example code snippet show how to use it:

::

   import dtale

   def test_data():
       import random
       import pandas as pd
       import numpy as np

       df = pd.DataFrame([
           dict(x=i, y=i % 2)
           for i in range(30)
       ])
       rand_data = pd.DataFrame(np.random.randn(len(df), 5), columns=['z{}'.format(j) for j in range(5)])
       return pd.concat([df, rand_data], axis=1)

   d = dtale.show(test_data())
   d.offline_chart(chart_type='bar', x='x', y='z3', agg='sum')

*Tutorial: coming soon*

**Disclaimer: Long Running Chart Requests**

If you choose to build a chart that requires a lot of computational
resources then it will take some time to run. Based on the way Flask &
plotly/dash interact this will block you from performing any other
request until it completes. There are two courses of action in this
situation:

1) Restart your jupyter notebook kernel or python console
2) Open a new D-Tale session on a different port than the current
   session. You can do that with the following command:
   ``dtale.show(df, port=[any open port], force=True)``

If you miss the legacy (non-plotly/dash) charts, not to worry! They are
still available from the link in the upper-right corner, but on for a
limited time… Here is the documentation for those: `Legacy
Charts <https://github.com/man-group/dtale/blob/master/docs/LEGACY_CHARTS.md>`__

**Your Feedback is Valuable**

This is a very powerful feature with many more features that could be
offered (linked subplots, different statistical aggregations, etc…) so
please submit issues :)

Coverage (Deprecated)
^^^^^^^^^^^^^^^^^^^^^

If you have watched the video within the `Man
Institute <https://www.man.com/maninstitute/d-tale>`__ blog post you’ll
notice that there is a “Coverage” popup. This was deprecated with the
creation of the “Charts” page. You can create the same coverage chart in
that video by choosing the following options in the “Charts” page: -
Type: **Line** - X: **date** - Y: **security_id** - Aggregation:
**Count** or **Unique Count**

Correlations
^^^^^^^^^^^^

Shows a pearson correlation matrix of all numeric columns against all
other numeric columns - By default, it will show a grid of pearson
correlations (filtering available by using drop-down see 2nd table of
screenshots) - If you have a date-type column, you can click an
individual cell and see a timeseries of pearson correlations for that
column combination - Currently if you have multiple date-type columns
you will have the ability to toggle between them by way of a drop-down -
Furthermore, you can click on individual points in the timeseries to
view the scatter plot of the points going into that correlation

========= ========== =========
Matrix    Timeseries Scatter
========= ========== =========
|image48| |image49|  |image50|
========= ========== =========

============= ============= ====================
Col1 Filtered Col2 Filtered Col1 & Col2 Filtered
============= ============= ====================
|image51|     |image52|     |image53|
============= ============= ====================

When the data being viewed in D-Tale has date or timestamp columns but
for each date/timestamp vlaue there is only one row of data the behavior
of the Correlations popup is a little different - Instead of a
timeseries correlation chart the user is given a rolling correlation
chart which can have the window (default: 10) altered - The scatter
chart will be created when a user clicks on a point in the rollign
correlation chart. The data displayed in the scatter will be for the
ranges of dates involved in the rolling correlation for that date.

========= ============
Data      Correlations
========= ============
|image54| |image55|
========= ============

Heat Map
^^^^^^^^

This will hide any non-float columns (with the exception of the index on
the right) and apply a color to the background of each cell - Each float
is renormalized to be a value between 0 and 1.0 - Each renormalized
value is passed to a color scale of red(0) - yellow(0.5) - green(1.0)
|image56|

Turn off Heat Map by clicking menu option again |image57|

Code Exports
^^^^^^^^^^^^

*Code Exports* are small snippets of code representing the current state
of the grid you’re viewing including things like: - columns built -
filtering - sorting

Other code exports available are: - Column Analysis - Correlations
(grid, timeseries chart & scatter chart) - Describe - Charts built using
the Chart Builder

Instances
^^^^^^^^^

This will give you information about other D-Tale instances are running
under your current Python process.

For example, if you ran the following script:

.. code:: python

   import pandas as pd
   import dtale

   dtale.show(pd.DataFrame([dict(foo=1, bar=2, biz=3, baz=4, snoopy_D_O_double_gizzle=5)]))
   dtale.show(pd.DataFrame([
       dict(a=1, b=2, c=3, d=4),
       dict(a=2, b=3, c=4, d=5),
       dict(a=3, b=4, c=5, d=6),
       dict(a=4, b=5, c=6, d=7)
   ]))
   dtale.show(pd.DataFrame([range(6), range(6), range(6), range(6), range(6), range(6)]), name="foo")

This will make the **Instances** button available in all 3 of these
D-Tale instances. Clicking that button while in the first instance
invoked above will give you this popup:

|image58|

The grid above contains the following information: - Process: timestamp
when the process was started along with the name (if specified in
``dtale.show()``) - Rows: number of rows - Columns: number of columns -
Column Names: comma-separated string of column names (only first 30
characters, hover for full listing) - Preview: this button is available
any of the non-current instances. Clicking this will bring up left-most
5X5 grid information for that instance - The row highlighted in green
signifys the current D-Tale instance - Any other row can be clicked to
switch to that D-Tale instance

Here is an example of clicking the “Preview” button:

|image59|

About
^^^^^

This will give you information about what version of D-Tale you’re
running as well as if its out of date to whats on PyPi.

========== ===========
Up To Date Out Of Date
========== ===========
|image60|  |image61|
========== ===========

Resize
^^^^^^

Mostly a fail-safe in the event that your columns are no longer lining
up. Click this and should fix that

Shutdown
^^^^^^^^

Pretty self-explanatory, kills your D-Tale session (there is also an
auto-kill process that will kill your D-Tale after an hour of
inactivity)

Column Menu Functions
~~~~~~~~~~~~~~~~~~~~~

|image62|

Moving Columns
^^^^^^^^^^^^^^

|image63|

All column movements are saved on the server so refreshing your browser
won’t lose them :ok_hand:

Hiding Columns
^^^^^^^^^^^^^^

|image64|

All column movements are saved on the server so refreshing your browser
won’t lose them :ok_hand:

Lock
^^^^

Adds your column to “locked” columns - “locked” means that if you scroll
horizontally these columns will stay pinned to the right-hand side -
this is handy when you want to keep track of which date or security_id
you’re looking at - by default, any index columns on the data passed to
D-Tale will be locked

Unlock
^^^^^^

Removed column from “locked” columns

Sorting
^^^^^^^

Applies/removes sorting (Ascending/Descending/Clear) to the column
selected

*Important*: as you add sorts they sort added will be added to the end
of the multi-sort. For example:

========================= ================
Action                    Sort
========================= ================
click “a”                 
sort asc                  a (asc)
click “b”                 a (asc)
sort desc                 a (asc), b(desc)
click “a”                 a (asc), b(desc)
sort None                 b(desc)
sort desc                 b(desc), a(desc)
click “X” on sort display 
========================= ================

Formats
^^^^^^^

Apply simple formats to numeric values in your grid

======= ========= =========
Type    Editing   Result
======= ========= =========
Numeric |image65| |image66|
Date    |image67| |image68|
String  |image69| |image70|
======= ========= =========

Here’s a grid of all the formats available with -123456.789 as input:

============= ==============
Format        Output
============= ==============
Precision (6) -123456.789000
Thousands Sep -123,456.789
Abbreviate    -123k
Exponent      -1e+5
BPS           -1234567890BPS
Red Negatives -123457
============= ==============

Column Analysis
^^^^^^^^^^^^^^^

Based on the data type of a column different charts will be shown.

========= =======================
Data Type Chart
========= =======================
Integer   Histogram, Value Counts
Float     Value Counts
Date      Value Counts
String    Value Counts
========= =======================

*Histograms* can be displayed in any number of bins (default: 20),
simply type a new integer value in the bins input

|image71|

*Value Counts* are a bar chart containing the counts of each unique
value in a column.

Menu Functions Depending on Browser Dimensions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Depending on the dimensions of your browser window the following buttons
will not open modals, but rather separate browser windows: Correlations,
Describe & Instances (see images from `Jupyter
Notebook <#jupyter-notebook>`__, also Charts will always open in a
separate browser window)

For Developers
--------------

Cloning
~~~~~~~

Clone the code (git clone ssh://git@github.com:manahl/dtale.git), then
start the backend server:

.. code:: bash

   $ git clone ssh://git@github.com:manahl/dtale.git
   # install the dependencies
   $ python setup.py develop
   # start the server
   $ python dtale --csv-path /home/jdoe/my_csv.csv --csv-parse_dates date

You can also run dtale from PyDev directly.

You will also want to import javascript dependencies and build the
source:

.. code:: bash

   $ npm install
   # 1) a persistent server that serves the latest JS:
   $ npm run watch
   # 2) or one-off build:
   $ npm run build

Running tests
~~~~~~~~~~~~~

The usual npm test command works:

::

   $ npm test

You can run individual test files:

::

   $ TEST=static/__tests__/dtale/DataViewer-base-test.jsx npm run test-file

Linting
~~~~~~~

You can lint all the JS and CSS to confirm there’s nothing obviously
wrong with it:

.. code:: bash

   $ npm run lint -s

You can also lint individual JS files:

.. code:: bash

   $ npm run lint-js-file -s -- static/dtale/DataViewer.jsx

Formatting JS
~~~~~~~~~~~~~

You can auto-format code as follows:

.. code:: bash

   $ npm run format

Docker Development
~~~~~~~~~~~~~~~~~~

You can build python 27-3 & run D-Tale as follows:

.. code:: bash

   $ yarn run build
   $ docker-compose build dtale_2_7
   $ docker run -it --network host dtale_2_7:latest
   $ python
   >>> import pandas as pd
   >>> df = pd.DataFrame([dict(a=1,b=2,c=3)])
   >>> import dtale
   >>> dtale.show(df)

Then view your D-Tale instance in your browser using the link that gets
printed

You can build python 36-1 & run D-Tale as follows:

.. code:: bash

   $ yarn run build
   $ docker-compose build dtale_3_6
   $ docker run -it --network host dtale_3_6:latest
   $ python
   >>> import pandas as pd
   >>> df = pd.DataFrame([dict(a=1,b=2,c=3)])
   >>> import dtale
   >>> dtale.show(df)

Then view your D-Tale instance in your browser using the link that gets
printed

Global State/Data Storage
~~~~~~~~~~~~~~~~~~~~~~~~~

If D-Tale is running in an environment with multiple python processes
(ex: on a web server running
`gunicorn <https://github.com/benoitc/gunicorn>`__) it will most likely
encounter issues with inconsistent state. Developers can fix this by
configuring the system D-Tale uses for storing data. Detailed
documentation is available here: `Data Storage and managing Global
State <https://github.com/man-group/dtale/blob/master/docs/GLOBAL_STATE.md>`__

Startup Behavior
----------------

Here’s a little background on how the ``dtale.show()`` function works: -
by default it will look for ports between 40000 & 49000, but you can
change that range by specifying the environment variables DTALE_MIN_PORT
& DTALE_MAX_PORT - think of sessions as python consoles or jupyter
notebooks

1) Session 1 executes ``dtale.show(df)`` our state is:

======= ===== =============== ===================================
Session Port  Active Data IDs URL(s)
======= ===== =============== ===================================
1       40000 1               http://localhost:40000/dtale/main/1
======= ===== =============== ===================================

2) Session 1 executes ``dtale.show(df)`` our state is:

======= ===== =============== =======================================
Session Port  Active Data IDs URL(s)
======= ===== =============== =======================================
1       40000 1,2             http://localhost:40000/dtale/main/[1,2]
======= ===== =============== =======================================

2) Session 2 executes ``dtale.show(df)`` our state is:

======= ===== =============== =======================================
Session Port  Active Data IDs URL(s)
======= ===== =============== =======================================
1       40000 1,2             http://localhost:40000/dtale/main/[1,2]
2       40001 1               http://localhost:40001/dtale/main/1
======= ===== =============== =======================================

3) Session 1 executes ``dtale.show(df, port=40001, force=True)`` our
   state is:

======= ===== =============== =========================================
Session Port  Active Data IDs URL(s)
======= ===== =============== =========================================
1       40001 1,2,3           http://localhost:40001/dtale/main/[1,2,3]
======= ===== =============== =========================================

4) Session 3 executes ``dtale.show(df)`` our state is:

======= ===== =============== =========================================
Session Port  Active Data IDs URL(s)
======= ===== =============== =========================================
1       40001 1,2,3           http://localhost:40001/dtale/main/[1,2,3]
3       40000 1               http://localhost:40000/dtale/main/1
======= ===== =============== =========================================

5) Session 2 executes ``dtale.show(df)`` our state is:

======= ===== =============== =========================================
Session Port  Active Data IDs URL(s)
======= ===== =============== =========================================
1       40001 1,2,3           http://localhost:40001/dtale/main/[1,2,3]
3       40000 1               http://localhost:40000/dtale/main/1
2       40002 1               http://localhost:40002/dtale/main/1
======= ===== =============== =========================================

6) Session 4 executes ``dtale.show(df, port=8080)`` our state is:

======= ===== =============== =========================================
Session Port  Active Data IDs URL(s)
======= ===== =============== =========================================
1       40001 1,2,3           http://localhost:40001/dtale/main/[1,2,3]
3       40000 1               http://localhost:40000/dtale/main/1
2       40002 1               http://localhost:40002/dtale/main/1
4       8080  1               http://localhost:8080/dtale/main/1
======= ===== =============== =========================================

7) Session 1 executes ``dtale.get_instance(1).kill()`` our state is:

======= ===== =============== =======================================
Session Port  Active Data IDs URL(s)
======= ===== =============== =======================================
1       40001 2,3             http://localhost:40001/dtale/main/[2,3]
3       40000 1               http://localhost:40000/dtale/main/1
2       40002 1               http://localhost:40002/dtale/main/1
4       8080  1               http://localhost:8080/dtale/main/1
======= ===== =============== =======================================

7) Session 5 sets DTALE_MIN_RANGE to 30000 and DTALE_MAX_RANGE 39000 and
   executes ``dtale.show(df)`` our state is:

======= ===== ================= =======================================
Session Port  Active Data ID(s) URL(s)
======= ===== ================= =======================================
1       40001 2,3               http://localhost:40001/dtale/main/[2,3]
3       40000 1                 http://localhost:40000/dtale/main/1
2       40002 1                 http://localhost:40002/dtale/main/1
4       8080  1                 http://localhost:8080/dtale/main/1
5       30000 1                 http://localhost:30000/dtale/main/1
======= ===== ================= =======================================

Documentation
-------------

Have a look at the `detailed
documentation <https://dtale.readthedocs.io>`__.

Requirements
------------

D-Tale works with:

-  Back-end

   -  arctic [extra]
   -  dash
   -  dash_daq
   -  Flask
   -  Flask-Compress
   -  Pandas
   -  scipy
   -  six

-  Front-end

   -  react-virtualized
   -  chart.js

Acknowledgements
----------------

D-Tale has been under active development at `Man
Numeric <http://www.numeric.com/>`__ since 2019.

Original concept and implementation: `Andrew
Schonfeld <https://github.com/aschonfeld>`__

Contributors:

-  `Phillip Dupuis <https://github.com/phillipdupuis>`__
-  `Dominik Christ <https://github.com/DominikMChrist>`__
-  `Chris Boddy <https://github.com/cboddy>`__
-  `Jason Holden <https://github.com/jasonkholden>`__
-  `Tom Taylor <https://github.com/TomTaylorLondon>`__
-  `Fernando Saravia Rajal <https://github.com/fersarr>`__
-  `Wilfred Hughes <https://github.com/Wilfred>`__
-  Mike Kelly
-  `Vincent Riemer <https://github.com/vincentriemer>`__
-  `Youssef Habchi <http://youssef-habchi.com/>`__ - title font
-  … and many others …

Contributions welcome!

License
-------

D-Tale is licensed under the GNU LGPL v2.1. A copy of which is included
in `LICENSE <LICENSE>`__

.. |image0| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Title.png
   :target: https://github.com/man-group/dtale
.. |CircleCI| image:: https://circleci.com/gh/man-group/dtale.svg?style=shield&circle-token=4b67588a87157cc03b484fb96be438f70b5cd151
   :target: https://circleci.com/gh/man-group/dtale
.. |PyPI| image:: https://img.shields.io/pypi/pyversions/dtale.svg
   :target: https://pypi.python.org/pypi/dtale/
.. |ReadTheDocs| image:: https://readthedocs.org/projects/dtale/badge
   :target: https://dtale.readthedocs.io
.. |codecov| image:: https://codecov.io/gh/man-group/dtale/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/man-group/dtale
.. |Downloads| image:: https://pepy.tech/badge/dtale
   :target: https://pepy.tech/project/dtale
.. |image6| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/gifs/dtale_demo_mini.gif
.. |image7| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/gifs/dtale_ipython.gif
.. |image8| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Python_Terminal.png
.. |image9| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Duplicate_data.png
.. |image10| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/ipython1.png
.. |image11| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/ipython2.png
.. |image12| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/ipython3.png
.. |image13| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/ipython_adjust.png
.. |image14| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Column_menu.png
.. |image15| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/correlations_popup.png
.. |image16| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/describe_popup.png
.. |image17| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/histogram_popup.png
.. |image18| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/instances_popup.png
.. |image19| image:: http://img.youtube.com/vi/pOYl2M1clIw/0.jpg
   :target: http://www.youtube.com/watch?v=pOYl2M1clIw
.. |image20| image:: http://img.youtube.com/vi/8Il-2HHs2Mg/0.jpg
   :target: http://www.youtube.com/watch?v=8Il-2HHs2Mg
.. |image21| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Browser1.png
.. |image22| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Info_cell.png
.. |image23| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Info_menu_small.png
.. |image24| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Describe.png
.. |image25| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Describe_date.png
.. |image26| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Describe_string.png
.. |image27| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Describe_int.png
.. |image28| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Describe_float.png
.. |image29| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Filter_apply.png
.. |image30| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Post_filter.png
.. |image31| image:: http://img.youtube.com/vi/G6wNS9-lG04/0.jpg
   :target: http://www.youtube.com/watch?v=G6wNS9-lG04
.. |image32| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/line.png
.. |image33| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/line_pg.png
.. |image34| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/bar.png
.. |image35| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/bar_pg.png
.. |image36| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/stacked.png
.. |image37| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/stacked_pg.png
.. |image38| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/pie.png
.. |image39| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/wordcloud.png
.. |image40| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/wordcloud_pg.png
.. |image41| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/heatmap.png
.. |image42| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/3d_scatter.png
.. |image43| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/surface.png
.. |image44| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/multi_col.png
.. |image45| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/editing_axis.png
.. |image46| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/bar_presort.png
.. |image47| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/charts/bar_postsort.png
.. |image48| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Correlations.png
.. |image49| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Correlations_ts.png
.. |image50| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Correlations_scatter.png
.. |image51| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Correlations_col1.png
.. |image52| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Correlations_col2.png
.. |image53| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Correlations_both.png
.. |image54| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/rolling_corr_data.png
.. |image55| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/rolling_corr.png
.. |image56| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Heatmap.png
.. |image57| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Heatmap_toggle.png
.. |image58| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Instances.png
.. |image59| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Instances_preview.png
.. |image60| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/About-up-to-date.png
.. |image61| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/About-out-of-date.png
.. |image62| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Col_menu.png
.. |image63| image:: http://img.youtube.com/vi/We4TH477rRs/0.jpg
   :target: http://www.youtube.com/watch?v=We4TH477rRs
.. |image64| image:: http://img.youtube.com/vi/ryZT2Lk_YaA/0.jpg
   :target: http://www.youtube.com/watch?v=ryZT2Lk_YaA
.. |image65| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Formatting_apply.png
.. |image66| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Post_formatting.png
.. |image67| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Formatting_date_apply.png
.. |image68| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Post_date_formatting.png
.. |image69| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Formatting_string_apply.png
.. |image70| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Post_string_formatting.png
.. |image71| image:: https://raw.githubusercontent.com/aschonfeld/dtale-media/master/images/Histogram.png

Changelog
---------

1.7.14 (20202-3-7)
~~~~~~~~~~~~~~~~~~

-  Hotfix for “Reshape” popup when forwarding browser to new data
   instances

.. _section-1:

1.7.13 (2020-3-7)
~~~~~~~~~~~~~~~~~

-  New data storage mechanisms available: Redis, Shelve
-  `#100 <https://github.com/man-group/dtale/issues/100>`__, turned off
   data limits on charts by using WebGL
-  `#99 <https://github.com/man-group/dtale/issues/99>`__, graceful
   handling of issue calculating min/max information for Describe popup
-  `#91 <https://github.com/man-group/dtale/issues/91>`__, reshaping of
   data through usage of aggregations, pivots or transposes
-  Export chart to HTML
-  Export chart dat to CSV
-  Offline chart display for use within notebooks
-  Removal of data from the Instances popup
-  Updated styling of charts to fit full window dimensions

.. _section-2:

1.7.12 (2020-3-1)
~~~~~~~~~~~~~~~~~

-  added syntax highlighting to code exports with
   react-syntax-highlighting
-  added arctic integration test
-  updated Histogram popup to “Column Analysis” which allows for the
   following

   -  Histograms -> integers and floats
   -  Value Counts -> integers, strings & dates

.. _section-3:

1.7.11 (2020-2-27)
~~~~~~~~~~~~~~~~~~

-  hotfix for dash custom.js file missing from production webpack build
   script

.. _section-4:

1.7.10 (2020-2-27)
~~~~~~~~~~~~~~~~~~

-  `#75 <https://github.com/man-group/dtale/issues/75>`__, added code
   snippet functionality to the following:

   -  main grid, histogram, correlations, column building & charts

-  exposed CLI loaders through the following functions dtale.show_csv,
   dtale.show_json, dtale.show_arctic

   -  build in such a way that it is easy for custom loaders to be
      exposed as well

-  `#82 <https://github.com/man-group/dtale/issues/82>`__, pinned
   ``future`` package to be >= 0.14.0

.. _section-5:

1.7.9 (2020-2-24)
~~~~~~~~~~~~~~~~~

-  support for google colab
-  bugfixes: `#71 <https://github.com/man-group/dtale/issues/71>`__,
   `#72 <https://github.com/man-group/dtale/issues/72>`__,
   `#73 <https://github.com/man-group/dtale/issues/73>`__

.. _section-6:

1.7.8 (2020-2-22)
~~~~~~~~~~~~~~~~~

-  `#77 <https://github.com/man-group/dtale/issues/77>`__, removal of
   multiprocessed timeouts

.. _section-7:

1.7.7 (2020-2-22)
~~~~~~~~~~~~~~~~~

-  centralized global state

.. _section-8:

1.7.6 (2020-2-21)
~~~~~~~~~~~~~~~~~

-  allowing the usage of context variables within filters
-  `#64 <https://github.com/man-group/dtale/issues/64>`__, handling for
   loading duplicate data to dtale.show
-  updated dtale.instances() to print urls rather than show all
   instances
-  removal of Dash “Export to png” function
-  passing data grid queries to chart page as default
-  added sys.exit() to the thread that manages the reaper

.. _section-9:

1.7.5 (2020-2-20)
~~~~~~~~~~~~~~~~~

-  hotfix for KeyError loading metadata for columns with min/max
   information

.. _section-10:

1.7.4 (2020-2-20)
~~~~~~~~~~~~~~~~~

-  `#63 <https://github.com/man-group/dtale/issues/63>`__: filtering
   columns with special characters in name
-  added json_loader CLI options
-  updated moving/locking of columns to be persisted to back-end as well
   as front-end
-  added the ability to show/hide columns
-  `#61 <https://github.com/man-group/dtale/issues/61>`__: added column
   builder popup

.. _section-11:

1.7.3 (2020-2-13)
~~~~~~~~~~~~~~~~~

-  added the ability to move columns left or right as well as to the
   front
-  added formatting capabilities for strings & dates
-  persist formatting settings to popup on reopening
-  bugfix for width-calculation on formatting change

.. _section-12:

1.7.2 (2020-2-12)
~~~~~~~~~~~~~~~~~

-  60 timeout handling around chart requests
-  pre-loaded charts through URL search strings
-  pandas query examples in Filter popup

.. _section-13:

1.7.1 (2020-2-7)
~~~~~~~~~~~~~~~~

-  added pie, 3D scatter & surface charts
-  updated popups to be displayed when the browser dimensions are too
   small to host a modal
-  removed Swagger due to its lack up support for updated dependencies

.. _section-14:

1.7.0 (2020-1-28)
~~~~~~~~~~~~~~~~~

-  redesign of charts popup to use plotly/dash
-  `#55 <https://github.com/man-group/dtale/issues/55>`__: raise
   exception when data contains duplicate column names
-  heatmap integration
-  combination of "_main.jsx" files into one for spacial optimization
-  `#15 <https://github.com/man-group/dtale/issues/15>`__: made arctic
   an “extra” dependency

.. _section-15:

1.6.10 (2020-1-12)
~~~~~~~~~~~~~~~~~~

-  better front-end handling of dates for charting as to avoid timezone
   issues
-  the ability to switch between sorting any axis in bar charts

.. _section-16:

1.6.9 (2020-1-9)
~~~~~~~~~~~~~~~~

-  bugfix for timezone issue around passing date filters to server for
   scatter charts in correlations popup

.. _section-17:

1.6.8 (2020-1-9)
~~~~~~~~~~~~~~~~

-  additional information about how to use Correlations popup
-  handling of all-nan data in charts popup
-  styling issues on popups (especially Histogram)
-  removed auto-filtering on correlation popup
-  scatter point color change
-  added chart icon to cell that has been selected in correlation popup
-  responsiveness to scatter charts
-  handling of links to ‘main’,‘iframe’ & ‘popup’ missing data_id
-  handling of ‘inf’ values when getting min/max & describe data
-  added header to window popups (correlations, charts, …) and a link
   back to the grid
-  added egg building to cirleci script
-  correlation timeseries chart hover line

.. _section-18:

1.6.7 (2020-1-3)
~~~~~~~~~~~~~~~~

-  `#50 <https://github.com/man-group/dtale/issues/50>`__: updates to
   rolling correlation functionality

.. _section-19:

1.6.6 (2020-1-2)
~~~~~~~~~~~~~~~~

-  `#47 <https://github.com/man-group/dtale/issues/47>`__: selection of
   multiple columns for y-axis
-  updated histogram bin selection to be an input box for full
   customization
-  better display of timestamps in axis ticks for charts
-  sorting of bar charts by y-axis
-  `#48 <https://github.com/man-group/dtale/issues/48>`__: scatter
   charts in chart builder
-  “nunique” added to list of aggregations
-  turned on “threaded=True” for app.run to avoid hanging popups
-  `#45 <https://github.com/man-group/dtale/issues/45>`__: rolling
   computations as aggregations
-  Y-Axis editor

.. _section-20:

1.6.5 (2019-12-29)
~~~~~~~~~~~~~~~~~~

-  test whether filters entered will return no data and block the user
   from apply those
-  allow for group values of type int or float to be displayed in charts
   popup
-  timeseries correlation values which return ‘nan’ will be replaced by
   zero for chart purposes
-  update ‘distribution’ to ‘series’ on charts so that missing dates
   will not show up as ticks
-  added “fork on github” flag for demo version & links to github/docs
   on “About” popup
-  limited lz4 to <= 2.2.1 in python 27-3 since latest version is no
   longer supported

.. _section-21:

1.6.4 (2019-12-26)
~~~~~~~~~~~~~~~~~~

-  testing of hostname returned by ``socket.gethostname``, use
   ‘localhost’ if it fails
-  removal of flask dev server banner when running in production
   environments
-  better handling of long strings in wordclouds
-  `#43 <https://github.com/man-group/dtale/issues/43>`__: only show
   timeseries correlations if datetime columns exist with multiple
   values per date

.. _section-22:

1.6.3 (2019-12-23)
~~~~~~~~~~~~~~~~~~

-  updated versions of packages in yarn.lock due to issue with chart.js
   box & whisker plots

.. _section-23:

1.6.2 (2019-12-23)
~~~~~~~~~~~~~~~~~~

-  `#40 <https://github.com/man-group/dtale/issues/40>`__: loading
   initial chart as non-line in chart builder
-  `#41 <https://github.com/man-group/dtale/issues/41>`__: double
   clicking cells in correlation grid for scatter will cause chart not
   to display
-  “Open Popup” button for ipython iframes
-  column width resizing on sorting
-  additional int/float descriptors (sum, median, mode, var, sem, skew,
   kurt)
-  wordcloud chart type

.. _section-24:

1.6.1 (2019-12-19)
~~~~~~~~~~~~~~~~~~

-  bugfix for url display when running from command-line

.. _section-25:

1.6.0 (2019-12-19)
~~~~~~~~~~~~~~~~~~

-  charts integration

   -  the ability to look at data in line, bar, stacked bar & pie charts
   -  the ability to group & aggregate data within the charts

-  direct ipython iframes to correlations & charts pages with
   pre-selected inputs
-  the ability to access instances from code by data id
   ``dtale.get_instance(data_id)``
-  view all active data instances ``dtale.instances()``

.. _section-26:

1.5.1 (2019-12-12)
~~~~~~~~~~~~~~~~~~

-  conversion of new flask instance for each ``dtale.show`` call to
   serving all data associated with one parent process under the same
   flask instance unless otherwise specified by the user (the ``force``
   parameter)

.. _section-27:

1.5.0 (2019-12-02)
~~~~~~~~~~~~~~~~~~

-  ipython integration

   -  ipython output cell adjustment
   -  column-wise menu support
   -  browser window popups for: Correlations, Coverage, Describe,
      Histogram & Instances

.. _section-28:

1.4.1 (2019-11-20)
~~~~~~~~~~~~~~~~~~

-  `#32 <https://github.com/man-group/dtale/issues/32>`__: unpin
   jsonschema by moving flasgger to ``extras_require``

.. _section-29:

1.4.0 (2019-11-19)
~~~~~~~~~~~~~~~~~~

-  Correlations Pearson Matrix filters
-  “name” display in title tab
-  “Heat Map” toggle
-  dropped unused “Flask-Caching” requirement

.. _section-30:

1.3.7 (2019-11-12)
~~~~~~~~~~~~~~~~~~

-  Bug fixes for:

   -  `#28 <https://github.com/man-group/dtale/issues/28>`__:
      “Instances” menu option will now be displayed by default
   -  `#29 <https://github.com/man-group/dtale/issues/29>`__: add hints
      to how users can navigate the correlations popup
   -  add “unicode” as a string classification for column width
      calculation

.. _section-31:

1.3.6 (2019-11-08)
~~~~~~~~~~~~~~~~~~

-  Bug fixes for:

   -  choose between ``pandas.corr`` & ``numpy.corrcoef`` depending on
      presence of NaNs
   -  hide timeseries correlations when date columns only contain one
      day

.. _section-32:

1.3.5 (2019-11-07)
~~~~~~~~~~~~~~~~~~

-  Bug fixes for:

   -  duplicate loading of histogram data
   -  string serialization failing when mixing ``future.str`` & ``str``
      in scatter function

.. _section-33:

1.3.4 (2019-11-07)
~~~~~~~~~~~~~~~~~~

-  updated correlation calculation to use ``numpy.corrcoef`` for
   performance purposes
-  github rebranding from manahl -> man-group

.. _section-34:

1.3.3 (2019-11-05)
~~~~~~~~~~~~~~~~~~

-  hotfix for failing test under certain versions of ``future`` package

.. _section-35:

1.3.2 (2019-11-05)
~~~~~~~~~~~~~~~~~~

-  Bug fixes for:

   -  display of histogram column information
   -  reload of hidden “processes” input when loading instances data
   -  correlations json failures on string conversion

.. _section-36:

1.3.1 (2019-10-29)
~~~~~~~~~~~~~~~~~~

-  fix for incompatible str types when directly altering state of data
   in running D-Tale instance

.. _section-37:

1.3.0 (2019-10-29)
~~~~~~~~~~~~~~~~~~

-  ``webbrowser`` integration (the ability to automatically open a
   webbrowser upon calling ``dtale.show()``)
-  flag for hiding the “Shutdown” button for long-running demos
-  “Instances” navigator popup for viewing all activate D-Tale instances
   for the current python process

.. _section-38:

1.2.0 (2019-10-24)
~~~~~~~~~~~~~~~~~~

-  `#20 <https://github.com/man-group/dtale/issues/13>`__: fix for data
   being overriden with each new instance
-  `#21 <https://github.com/man-group/dtale/issues/13>`__: fix for
   displaying timestamps if they exist
-  calling ``show()`` now returns an object which can alter the state of
   a process

   -  accessing/altering state through the ``data`` property
   -  shutting down a process using the ``kill()`` function

.. _section-39:

1.1.1 (2019-10-23)
~~~~~~~~~~~~~~~~~~

-  `#13 <https://github.com/man-group/dtale/issues/13>`__: fix for
   auto-detection of column widths for strings and floats

.. _section-40:

1.1.0 (2019-10-08)
~~~~~~~~~~~~~~~~~~

-  IE support
-  **Describe** & **About** popups
-  Custom CLI support

.. _section-41:

1.0.0 (2019-09-06)
~~~~~~~~~~~~~~~~~~

-  Initial public release


