From 07f8eaa9f357fce201019d476f7b0f5a1f759ebc Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Thu, 27 Jul 2023 17:01:54 -0400 Subject: [PATCH 01/79] Committing WIP. --- highcharts_core/__version__.py | 2 +- highcharts_core/chart.py | 64 +++++++++++++++++++++++--- highcharts_core/headless_export.py | 2 +- highcharts_core/utility_functions.py | 67 +++++++++++++++++++++------- 4 files changed, 112 insertions(+), 23 deletions(-) diff --git a/highcharts_core/__version__.py b/highcharts_core/__version__.py index 7eb58ced..d48867ef 100644 --- a/highcharts_core/__version__.py +++ b/highcharts_core/__version__.py @@ -1 +1 @@ -__version__ = '1.2.4' \ No newline at end of file +__version__ = '1.2.5' \ No newline at end of file diff --git a/highcharts_core/chart.py b/highcharts_core/chart.py index 632e24f8..ad4d2476 100644 --- a/highcharts_core/chart.py +++ b/highcharts_core/chart.py @@ -34,7 +34,7 @@ def __init__(self, **kwargs): super().__init__(**kwargs) - def _jupyter_include_scripts(self): + def _jupyter_include_scripts(self, **kwargs): """Return the JavaScript code that is used to load the Highcharts JS libraries. :rtype: :class:`str ` @@ -45,7 +45,7 @@ def _jupyter_include_scripts(self): for item in required_modules: js_str += utility_functions.jupyter_add_script(item) js_str += """.then(() => {""" - + for item in required_modules: js_str += """});""" @@ -78,7 +78,7 @@ def _jupyter_javascript(self, :type retries: :class:`int ` :param interval: The number of milliseconds to wait between retrying rendering the chart. Defaults to 1000 (1 - seocnd). + second). :type interval: :class:`int ` :rtype: :class:`str ` @@ -167,6 +167,57 @@ def get_required_modules(self, include_extension = False) -> List[str]: return scripts + def _get_jupyter_script_loader(self, chart_js_str) -> str: + """Return the JavaScript code that loads ``required_modules`` in a Jupyter + context. + + :param chart_js_str: The JavaScript code that renders the chart. + :type chart_js_str: :class:`str ` + + :returns: The JavaScript code that loads the required modules. + :rtype: :class:`str ` + """ + if_no_requirejs = '' + + if_requirejs = """require.config({\n""" + if_requirejs += """ packages: [{\n""" + if_requirejs += """ name: 'highcharts', main: 'highcharts' }],\n""" + if_requirejs += """ paths: {\n""" + if_requirejs += f""" 'highcharts': '{self.module_url}'\n""" + if_requirejs += """ }\n\n});""" + + if_requirejs += """ require([""" + requirejs_modules = [] + for item in self.get_required_modules(): + if item == 'highcharts' and item not in requirejs_modules: + requirejs_modules.append(item) + else: + revised_item = f'highcharts/{item}' + if revised_item not in requirejs_modules: + requirejs_modules.append(revised_item) + + for index, item in enumerate(requirejs_modules): + is_last = index == len(requirejs_modules) - 1 + if_requirejs += f"""'{item}'""" + if not is_last: + if_requirejs += ', ' + if_requirejs += """], function (Highcharts) {\n""" + if_requirejs += chart_js_str + if_requirejs += """\n});""" + + required_modules = [f'{self.module_url}{x}' + for x in self.get_required_modules(include_extension = True)] + for item in required_modules: + if_no_requirejs += utility_functions.jupyter_add_script(item) + if_no_requirejs += """.then(() => {""" + + for item in required_modules: + if_no_requirejs += """});""" + + js_str = utility_functions.wrap_for_requirejs(if_requirejs, if_no_requirejs) + + return js_str + @property def callback(self) -> Optional[CallbackFunction]: """A (JavaScript) function that is run when the chart has loaded and all external @@ -776,9 +827,6 @@ def display(self, 'your runtime environment. To install,' 'use: pip install ipython') - include_js_str = self._jupyter_include_scripts() - include_display = display_mod.Javascript(data = include_js_str) - container = container or self.container or 'highcharts_target_div' if not self._random_slug: self._random_slug = {} @@ -797,8 +845,12 @@ def display(self, random_slug = random_slug, retries = retries, interval = interval) + wrapped_chart_js_str = utility_functions.wrap_for_requirejs('', chart_js_str) javascript_display = display_mod.Javascript(data = chart_js_str) + include_js_str = self._get_jupyter_script_loader(chart_js_str) + include_display = display_mod.Javascript(data = include_js_str) + display(include_display) display(html_display) display(javascript_display) diff --git a/highcharts_core/headless_export.py b/highcharts_core/headless_export.py index c62b1793..520a15cd 100644 --- a/highcharts_core/headless_export.py +++ b/highcharts_core/headless_export.py @@ -760,7 +760,7 @@ def request_chart(self, code_as_str) result = requests.post(self.url, - data = as_json, + data = as_json.encode('utf-8'), headers = { 'Content-Type': 'application/json' }, auth = basic_auth, timeout = timeout) diff --git a/highcharts_core/utility_functions.py b/highcharts_core/utility_functions.py index 010a1b94..49e5bbb6 100644 --- a/highcharts_core/utility_functions.py +++ b/highcharts_core/utility_functions.py @@ -329,7 +329,7 @@ def parse_csv(csv_data, return columns, records_as_dicts -def jupyter_add_script(url, is_last = False): +def jupyter_add_script(url, is_last = False, use_require = False): """Generates the JavaScript code Promise which adds a `` tags), it will render +your chart. + +So the way to get the JS literal is very straightforward: + + .. code-block:: python + + # EXAMPLE 1. + # Storing the JS literal in a string. + + my_js_literal = my_chart.to_js_literal() + + # EXAMPLE 2. + # Saving the JS literal to a file named + # "my-js-literal.js" + + my_chart.to_js_literal('my-js-literal.js') + +Now the way to render this chart will ultimately depend on how your application +is architected. We see three - typical - patterns employed: + + #. If your Python code is responsible for preparing the client-side + HTML + JavaScript, then you can include ``my_js_literal`` in your + template file. This pattern works for practically every Python web + framework, including `Django `__, + and `Flask `__. + #. If your Python code exposes RESTful or GraphQL APIs that are + consumed by your client-side application, then you can return the JS + literal object as a string via your API. This can then be evaluated + in your client-side application using JavaScript's ``new Function()`` + feature. + + .. caution:: + + **DO NOT USE JAVASCRIPT'S ``eval()`` FUNCTION**. + + It is deprecated, and for good reason: + + It represents a major security risk. When using ``new Function()``, + we recommend balancing the need for simplicity against the need for + security. You can secure your code by applying whitelisting techniques, + sandboxing the scope of your ``new Function()`` context, adding + additional layers of M2M signed encryption, or employing sanitization + techniques on the content of the JS literal returned by your API. + + Which specific techniques make sense will depend on your application + and your use case. + + #. If the data in your front-end application is generated on a periodic / batch + basis, then you can save your JS literal to a static file (saved where + consumable by your front-end application) and have your front-end application + simply load it as-needed. \ No newline at end of file diff --git a/docs/tutorials/pandas.rst b/docs/tutorials/pandas.rst new file mode 100644 index 00000000..0da72f98 --- /dev/null +++ b/docs/tutorials/pandas.rst @@ -0,0 +1,510 @@ +######################################################## +Using Highcharts Core for Python with Pandas +######################################################## + +.. contents:: + :depth: 2 + :backlinks: entry + +------------------- + +`Pandas `__ is probably the single +most popular library for data analysis in the Python ecosystem. Together +with `NumPy `__, it is ubquitous. And the +**Highcharts for Python Toolkit** is designed to natively integrate with +it. + +.. sidebar:: What Can Pandas Do in Highcharts? + + The **Highcharts for Python Toolkit** is a *visualization* library. It is + not used to perform *arithmetical*, *algebraic*, *statistical*, or *matrix* + calculations. It is exclusively concerned with visualizing data - and that + data is typically the product of calculations that are performed up-stream. + + So given that focus, **Highcharts for Python** is designed to *read* data + that is contained in :class:`pandas.DataFrame ` + instances, or in :class:`numpy.ndarray ` instances. The + toolkit will take those instances and load the data they contain into + appropriate **Highcharts for Python** classes, and then support the + serialization of that data to + :term:`JS literal notation `. + +********************************* +General Approach +********************************* + +The **Highcharts for Python Toolkit** provides a number of standard methods +that are used to interact with :class:`pandas.DataFrame ` +instances. These methods generally take the form: + + * ``.from_pandas(df)`` This is always a class method which produces one or more + instances, with data pulled from the ``df`` argument. + * ``.from_pandas_in_rows(df)`` This is always a class method which produces one + instance for every *row* in the :class:`DataFrame ` + (``df``). + * ``.load_from_pandas(df)`` This is an instance method which updates an instance + with data read from the ``df`` argument. + +.. tip:: + + All three of these standard methods are packaged to have batteries included. + This means that for simple use cases, you can simply pass a + :class:`pandas.DataFrame ` to the method, and the + method wlil attempt to determine the optimum way to deserialize the + :class:`DataFrame ` into the appropriate + **Highcharts for Python** objects. + + However, if you find that you need more fine-grained control, the methods + provide powerful tools to give you the control you need when you need it. + +These standard methods - with near-identical syntax - are available: + + * On all :term:`series` classes (descended from + :class:`SeriesBase `) + * On the :class:`Chart ` class + * On the :class:`options.data.Data ` + class + +------------------------------- + +***************************** +Preparing Your DataFrame +***************************** + + .. tip:: + + While it is theoretically possible for **Highcharts for Python** to + work with a nested :class:`DataFrame `, such + structures are generally considered an anti-pattern. We recommend + keeping your :class:`DataFrame ` contents + 2-dimensional, organized into a single "flat" table of rows and + columns. + +So let's try a real-world example. Let's say you've got some annual population +counts stored in a CSV file named ``'census-time-series.csv'``. Using Pandas, you +can construct a DataFrame from that CSV file very simply: + + .. code-block:: python + + df = pandas.read_csv('census-time-series.csv') + +This produces a simple 2-dimensional :class:`DataFrame `. +In our case, the resulting table looks like this: + + .. image:: /_static/nst-est2019.png + :width: 100% + :alt: Rendering of the DataFrame produced by pandas.read_csv('census-time-series.csv') + +The first column contains the names of geographic regions, while each of the subsequent +columns contains the population counts for a given year. Now, let's say we wanted +to visualize this data in various ways. + +------------------------------ + +********************************************* +Creating the Chart: ``Chart.from_pandas()`` +********************************************* + +Relying on the Defaults +=========================== + +The simplest way to create a chart from a :class:`DataFrame ` +is to call :class:`Chart.from_pandas() ` like +so: + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df) + + - .. image:: /_static/census-time-series_01.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df) + +As you can see, we haven't provided any more instructions besides telling it to +generate a chart from ``df``. The result is a line chart, with one series for each year, and +one point for each region. + + .. tip:: + + Unless instructed otherwise, **Highcharts for Python** will default to using a + line chart. + +Setting the Series Type +============================== + +Why don't we switch it to a bar chart? + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, series_type = 'bar') + + - .. image:: /_static/census-time-series_02.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar') + +Now the result is a little more readable, but still not great: After all, there are more than +fifty geographic regions represented for each year, which makes the chart super crowded. +Besides, maybe we're only interested in a specific year: 2019. + +Let's try focusing our chart. + +Basic Property Mapping +========================== + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': '2019' + }) + + - .. image:: /_static/census-time-series_03.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': '2019'}) + +Much better! We've now added a ``property_map`` argument to the ``.from_pandas()`` method call. +This argument tells Highcharts for Python how to map columns in your +:class:`DataFrame ` to properties in the resulting chart. In this case, +the keys ``'x'`` and ``'y'`` tell **Highcharts for Python** that you want to map the ``'Geographic Area'`` +column to the resulting series' data points' :meth:`.x `, +and to map the ``'2019'`` column to the :meth:`.y ` +properties, respectively. + +The net result is that ``my_chart`` contains one +:class:`BarSeries ` whose +:meth:`.data ` property contains a +:class:`BarDataCollection ` instance populated +with the data from the ``'Geographic Area'`` and ``'2019'`` columns in ``df``. + +But maybe we actually want to compare a couple different years? Let's try that. + +Property Mapping with Multiple Series +======================================== + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'] + }) + + - .. image:: /_static/census-time-series_04.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019']}) + +Now we're getting somewhere! We've added a list of column names to the ``'y'`` key in the ``property_map`` +argument. Each of those columns has now produced a *separate* :class:`BarSeries ` instance - but they're all still sharing the ``'Geographic Area'`` column as their +:meth:`.x ` value. + + .. note:: + + You can supply multiple values to any property in the ``property_map``. The example + provided above is equivalent to: + + .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': ['Geographic Area', 'Geographic Area', 'Geographic Area'], + 'y': ['2017', '2018', '2019'] + }) + + The only catch is that the ultimate number of values for each key must match. If there's + only one value, then it will get repeated for all of the others. But if there's a mismatch, + then **Highcharts for Python** will throw a + :exc:`HighchartsPandasDeserializationError `. + +But so far, we've only been using the ``'x'`` and ``'y'`` keys in our ``property_map``. What if we wanted to +configure additional properties? Easy! + +Configuring Additional Properties +===================================== + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + 'id': 'Geographic Area' + }) + + - .. image:: /_static/census-time-series_05.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}) + +And now the :meth:`.id ` property of each data point +will *also* be equal to the value in the ``'Geographic Area'`` column. + + .. note:: + + You can supply any property you want to the ``property_map``. If the property is not + supported by the series type you've selected, then it will be ignored. + +But our chart is still looking a little basic - why don't we tweak some series configuration options? + +Configuring Series Options +=============================== + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + 'id': 'Geographic Area' + }, + series_kwargs = { + 'point_padding': 0.25 + }) + + - .. image:: /_static/census-time-series_06.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}) + +As you can see, we supplied a new ``series_kwargs`` argument to the ``.from_pandas()`` method call. This +argument receives a :class:`dict ` with keys that correspond to properties on the series. In +this case, by supplying ``'point_padding'`` we have set the resulting +:meth:`BarSeries.point_padding ` property to a +value of ``0.25`` - leading to a bit more spacing between the bars. + +But our chart is *still* a little basic - why don't we give it a reasonable title? + +Configuring Options +============================= + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + 'id': 'Geographic Area' + }, + series_kwargs = { + 'point_padding': 0.25 + }, + options_kwargs = { + 'title': { + 'text': 'This Is My Chart Title' + } + }) + + - .. image:: /_static/census-time-series_07.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}) + +As you can see, we've now given our chart a title. We did this by adding a new ``options_kwargs`` argument, +which likewise takes a :class:`dict ` with keys that correspond to properties on the chart's +:class:`HighchartsOptions ` configuration.` + +Now let's say we wanted our chart to render in an HTML ``
`` with an ``id`` of ``'my_target_div`` - +we can configure that in the same method call. + +Configuring Chart Settings +============================== + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + 'id': 'Geographic Area' + }, + series_kwargs = { + 'point_padding': 0.25 + }, + options_kwargs = { + 'title': { + 'text': 'This Is My Chart Title' + } + }, + chart_kwargs = { + 'container': 'my_target_div' + }) + + - .. image:: /_static/census-time-series_08.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}, chart_kwargs = {'container': 'my_target_div'}) + +While you can't really *see* the difference here, by adding the ``chart_kwargs`` argument to +the method call, we now set the :meth:`.container ` property +on ``my_chart``. + +But maybe we want to do something a little different - like compare the change in population over time. +Well, we can do that easily by visualizing each *row* of ``df`` rather than each *column*.` + +Visualizing Data in Rows +============================== + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'line', + series_in_rows = True) + + - .. image:: /_static/census-time-series_09.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True) + +Okay, so here we removed some of the other arguments we'd been using to simplify the example. You'll see we've now +added the ``series_in_rows`` argument, and set it to ``True``. This tells **Highcharts for Python** that we expect +to produce one series for every *row* in ``df``. Because we have not specified a ``property_map``, the series +:meth:`.name ` values are populated from the ``'Geographic Area'`` +column, while the data point :meth:`.x ` values come from each additional column (e.g. ``'2010'``, ``'2011'``, ``'2012'``, etc.) + + .. tip:: + + To simplify the code further, any class that supports the ``.from_pandas()`` method also + supports the ``.from_pandas_in_rows()`` method. The latter method is equivalent to passing + ``series_in_rows = True`` to ``.from_pandas()``. + + For more information, please see: + + * :class:`Chart.from_pandas_in_rows() ` + * :class:`SeriesBase.from_pandas_in_rows() ` + +But maybe we don't want *all* geographic areas shown on the chart - maybe we only want to compare a few. + +Filtering Rows +======================= + +.. list-table:: + :widths: 30 70 + + * - .. code-block:: python + + my_chart = Chart.from_pandas(df, + series_type = 'line', + series_in_rows = True, + series_index = slice(3, 7)) + + - .. image:: /_static/census-time-series_10.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True, series_index = slice(3, 5)) + +What we did here is we added a ``series_index`` argument, which tells **Highcharts for Python** to only +include the series found at that index in the resulting chart. In this case, we supplied a :func:`slice ` +object, which operates just like ``list_of_series[3:7]``. The result only returns those series between index 3 and 6. + +------------------------ + +********************************************************************** +Creating Series: ``.from_pandas()`` and ``.from_pandas_in_rows()`` +********************************************************************** + +All **Highcharts for Python** :term:`series` descend from the +:class:`SeriesBase ` class. And they all +therefore support the ``.from_pandas()`` class method. + +When called on a series class, it produces one or more series from the +:class:`DataFrame ` supplied. The method supports all of the same options +as :class:`Chart.from_pandas() ` *except for* ``options_kwargs`` and +``chart_kwargs``. This is because the ``.from_pandas()`` method on a series class is only responsible for +creating series instances - not the charts. + +Creating Series from Columns +================================== + +So let's say we wanted to create one series for each of the years in ``df``. We could that like so: + + .. code-block:: python + + my_series = BarSeries.from_pandas(df) + +Unlike when calling :meth:`Chart.from_pandas() `, we +did not have to specify a ``series_type`` - that's because the ``.from_pandas()`` class method on a +series class already knows the series type! + +In this case, ``my_series`` now contains ten separate :class:`BarSeries ` +instances, each corresponding to one of the year columns in ``df``. + +But maybe we wanted to create our series from rows instead? + +Creating Series from Rows +================================= + +.. code-block:: python + + my_series = LineSeries.from_pandas_in_rows(df) + +This will produce one :class:`LineSeries ` +instance for each row in ``df``, ultimately producing a :class:`list ` of +57 :class:`LineSeries ` instances. + +Now what if we don't need all 57, but instead only want the first five? + +Filtering Series Created from Rows +====================================== + +.. code-block:: python + + my_series = LineSeries.from_pandas_in_rows(df, series_index = slice(0, 5)) + +This will return the first five series in the list of 57. +-------------------------- + +*********************************************************** +Updating an Existing Series: ``.load_from_pandas()`` +*********************************************************** + +So far, we've only been creating new series and charts. But what if we want to update +the data within an existing series? That's easy to do using the +:meth:`.load_from_pandas() ` method. + +Let's say we take the first series returned in ``my_series`` up above, and we want to replace +its data with the data from the *10th* series. We can do that by: + + .. code-block:: python + + my_series[0].load_from_pandas(df, series_in_rows = True, series_index = 9) + +The ``series_in_rows`` argument tells the method to generate series per row, and then +the ``series_index`` argument tells it to only use the 10th series generated. + + .. caution:: + + While the :meth:`.load_from_pandas() ` + method supports the same arguments as + :meth:`.from_pandas() `, it expects that + the arguments supplied lead to an unambiguous *single* series. If they are ambiguous - meaning they + lead to multiple series generated from the :class:`DataFrame ` - then + the method will throw a + :exc:`HighchartsPandasDeserializationError ` \ No newline at end of file diff --git a/docs/tutorials/series.rst b/docs/tutorials/series.rst new file mode 100644 index 00000000..1e728e15 --- /dev/null +++ b/docs/tutorials/series.rst @@ -0,0 +1,398 @@ +################################################### +Working with Series in Highcharts for Python +################################################### + +.. contents:: + :depth: 2 + :backlinks: entry + +------------------- + +**Highcharts for Python** (and Highcharts (JS), of course) are both built around +the concept of :term:`data series `. A data series can be thought of as +a set of data points that describe the same "thing", and which represent how +the data can be organized. Think: + + * a single line on a line chart + * a set of columns all the same color on a column chart + * all of a pie or donut chart + +As a result, when you constructing your chart in **Highcharts for Python**, +what you are really doing is constructing one or more :term:`series` that +are then placed on a shared canvas, with shared axes, a shared legend, etc. + + .. image:: /_static/images/chart-anatomy.png + :width: 75 + :align: right + :alt: Diagram showing the conceptual components of a Highcharts chart + +This tutorial is designed to help you understand how to manage series in your +Highcharts visualizations using **Highcharts for Python**. + +---------------------------------- + +********************************* +How Series are Organized +********************************* + +As the diagram above shows, Highcharts visualizations are configured +within a :class:`Chart ` object, which has +the :meth:`.options ` property where +the chart's configuration "lives", represented as a +:class:`HighchartsOptions ` +instance. + +The :class:`HighchartsOptions ` +configuration allows you to define *all* details of what gets displayed on +the chart, how that content behaves, etc. The configuration options available in +:class:`HighchartsOptions ` can be +thought of as chart-level configurations: They configure or define things that apply to +everything shown on the chart: the axes to display, the legend, the title, the settings shared +across all of the series on the chart, etc. + +But within the :class:`HighchartsOptions ` +you will find the :meth:`.series ` +property. This is where you define the *specific* :term:`series` to render on your chart. + +This property gets one or more series instances, all of which are descended from +:class:`SeriesBase `. They descend from +this single base series class because many of their properties are shared across all types +of series. For example, whether the series is to render as a line or as a bar, all series will +have an :meth:`.id ` option. + +All visualizations supported by Highcharts have a corresponding series type, which means +they all have their corresponding series class. To see this mapping, take a look at our +:doc:`Supported Visualizations `. + +Each series type has its set of shared properties that derive from +:class:`SeriesBase , but specific series types +may have their own type-specific settings. For example, a +:class:`GaugeSeries ` will have options to +configure the gauge's dial (:meth:`.dial `), +overshot-handling (:meth:`.overshoot `), +and pivot point (:meth:`.pivot `) - settings +which would be completely *irrelevant* for a +:class:`LineSeries `, which does not have a dial, +does not have a concept of overshooting the bounds of the dial, and does not have any pivot points. + +.. list-table:: + :widths: 50 50 + + * - .. figure:: ../../../_static/gauge-example.png + :alt: Gauge Example Chart + :align: center + - .. figure:: ../../../_static/line-example.png + :alt: Line Example Chart + :align: center + +And all series (technically, *almost* all) have a +:meth:`.data ` property, which contains the +data that should be visualized in the series. + +.. sidebar:: Exceptions without Data + + Certain types of visualiation - like + :class:`BellCurveSeries ` + do not receive their own data, but instead are tied to an underlying + :meth:`.base_series ` + whose data is used to shape their visualization. + + .. figure:: ../../../_static/bellcurve-example.png + :alt: Bell Curve Example Chart + :align: center + :width: 35% + +So as you can see, series are pretty fundamental to your Highcharts visualizations: They are +what actually gets visualized. + +So how do we start creating series using **Highcharts for Python**? + +--------------------------------------- + +*************************************************** +Creating Series in Highcharts for Python +*************************************************** + + +Of course, you can always construct your series using direct instantiation: + + .. code-block:: python + + from highcharts_core.chart import Chart + from highcharts_core.options import HighchartsOptions + from highcharts_core.options.series.area import LineSeries + + my_line_series = LineSeries(data = my_data, id = 'my_series_id123') + my_options = HighchartsOptions(series = [my_line_series]) + my_chart = Chart(options = my_options) + +And there may be situations where there is the best way for you to construct your +series, depending on how you are managing your full Highcharts for Python application. + +But there are much simpler / faster ways to rapidly create your chart/series: + +Assembling a Chart with Series at Once +========================================= + +.. include:: _assembling_a_chart.rst + +Assembling Series Alone +========================== + +You can create series similarly: + + .. code-block:: python + + from highcharts_core.options.series.area import LineSeries + + my_line_series = LineSeries(data = my_iterable) + +This will create a :class:`LineSeries ` +instance. + +Depending on how we've wrangled our data, we can similarly produce one or more +series from a :class:`pandas.DataFrame `, +:class:`numpy.ndarray `, or Python :class:`dict `: + + .. code-block:: python + + # From a Pandas DataFrame + + my_series = LineSeries.from_pandas(df) + + # From a Numpy ndarray + + my_series = LineSeries.from_array(data = as_ndarray) + + # From a CSV file + + my_series = LineSeries.from_csv('my-data.csv') + + # From a Python iterable + + my_series = LineSeries.from_array(data = as_iterable) + +All of these lines of code are equivalent, and should produce an identical +``my_series``. Depending on the arguments you supply to the helper methods, +they may either produce *one* series instance or a :class:`list ` +of series instances. + +Adding Series to a Chart +=========================== + +If you have created series on their own, you can add them to an existing +:class:`Chart ` very easily: + + .. code-block:: python + + # EXAMPLE 1. + # Adding one series + + my_chart.add_series(my_series) + + # EXAMPLE 2. + # Adding multiple series if they are in one iterable + + my_chart.add_series(my_list_of_series) + + # EXAMPLE 3. + # Adding multiple individual series + + my_chart.add_series(series1, series2, series3) + +Or you can also create a new chart *from* a list of series: + + .. code-block:: python + + # EXAMPLE 1. + # With one series + + my_chart = Chart.from_series(my-series) + + # EXAMPLE 2. + # With multiple series if they are in one iterable + + my_chart = Chart.from_series(my_list_of_series) + + # EXAMPLE 3. + # Adding multiple individual series + + my_chart = Chart.from_series(series1, series2, series3) + +.. tip:: + + The same :meth:`.add_series ` and + :meth:`.from_series ` helper methods + are also available on the + :class:`HighchartsOptions ` class. + +So now that we've created a chart and a bunch of series, what else can we do? + +---------------------------- + +********************************* +Configuring Your Series +********************************* + +You can configure the options available on each series very simply. Highcharts (JS) - +and so **Highcharts for Python** - have a very extensive API, with lots of configuration +options. + +.. tip:: + + We recommend reviewing the :doc:`API Reference ` to really explore + the options available for different series types. + +Updating Data Points +========================= + +However, the most important configuration you will do is to manage the data points +you wish to display in your series. You can do this by: + + #. Passing data directly to the + :meth:`.data ` + property: + + .. code-block:: python + + my_series.data = updated_data + + #. Using any of the helper methods provided on the series instance: + + .. code-block:: python + + # EXAMPLE 1. + # Updating data points from a new Pandas DataFrame + + my_series.load_from_pandas(df) + + # EXAMPLE 2. + # Updating data points from a new numpy.ndarray + + my_series.load_from_array(as_ndarray) + + # EXAMPLE 3. + # Updating data points from a new iterable. + + my_series.load_from_array(as_iterable) + + # EXAMPLE 4. + # Updating data points from a CSV file. + + my_series.load_from_csv('my-updated-csv-file.csv') + +Updating Data Point Properties +================================== + +In addition, all series instances make it easy to propagate information throughout your +underlying data. When you try to set a property on your series object, **Highcharts for Python** +will first see if it is a valid property on the series itself. But if it is not, then it will +check whether it is a supported property on that series' *data*. + +So as an example, if we want to give our series an ID, we can simply call: + + .. code-block:: python + + my_series.id = 'my-updated-id-value' + +However, if we want to set a :class:`BulletSeries ` data points' :meth:`.target ` value, we can simply reference it on the series. +For example, if our :class:`BulletSeries ` contains three data points, we can set their targets easily using the series: + + .. code-block:: python + + my_bullet_series.target = [1, 2, 3] + +By passing an iterable (or a :class:`numpy.ndarray `), *all* of your data +points will get updated with the appropriate value. This makes it very easy to execute your data point +configurations by operating on the series, rather than working with *individual* data points - though if you want +to work with *individual* data points, you can do so as well. + +.. seealso:: + + * :doc:`Working with Data in Highcharts for Python ` + +Converting Series Types +=========================== + +Every series type has its own type-specific set of configuration options. However, there may be +times when you want to change how your data is to be visualized / rendered. **Highcharts for Python** +provides a useful helper method for that, too. For example, if we want to convert our +:class:`LineSeries ` to a +:class:`BarSeries `, we can do that by calling the +:meth:`.convert_to ` method: + + .. code-block:: python + + # EXAMPLE 1 + # Indicating the target type with a string label + + my_series.convert_to(series_type = 'bar') + + # EXAMPLE 2 + # Indicating the target type with a SeriesBase class + + my_series.convert_to(series_type = BarSeries) + +So now that we've constructed, configured, and adjusted our series, we can also render them +easily. + +----------------------- + +*************************** +Rendering Series +*************************** + +Series can be rendered within the chart that they are a part of, simply by following +the process to render the chart: + +Rendering a Series within a Chart +======================================= + + #. When in Jupyter Notebook/Lab, just execute the :meth:`.display() ` + method. + + .. code-block:: python + + my_chart.display() + + #. When rendering within a web application, or saving to a file for rendering in a separate application, + you can serialize your chart to :term:`JavaScript object literal notation`: + + .. code-block:: python + + as_js_literal = my_chart.to_js_literal() + + which will produce the JavaScript code to render your complete chart. + +Rendering a Series Alone +============================ + +The *exact same* helper methods are available on your series as well. So if you have assembled your +series as ``my_series``, you can take a shortcut to visualize it by calling: + + .. code-block:: python + + my_series.display() + +which will assemble a generic :class:`Chart ` instance, include +your series, and render it in Jupyter Notebook/Lab. + +You can also produce a :class:`Chart ` instance containing your +series in a single method call as well: + + .. code-block:: python + + my_chart = my_series.to_chart() + +And similarly: + + .. code-block:: + + series_as_js_literal = my_series.to_js_literal() + +will produce the JS literal representation of your series, for use in a JavaScript application. + +------------ + +Given all of this flexibliity, we hope you have a great time assembling +high-end visualizations and exploring **Highcharts for Python**! \ No newline at end of file diff --git a/docs/using.rst b/docs/using.rst index 31543290..e4809306 100644 --- a/docs/using.rst +++ b/docs/using.rst @@ -326,75 +326,149 @@ can think of a series as a single line on a graph that shows a set of values. Th of values that make up the series are :term:`data points `, which are defined by a set of properties that indicate the data point's position on one or more axes. -As a result, `Highcharts (JS) `__ and -**Highcharts for Python** both represent the data points in series as a list of data point -objects in the ``data`` property within the series: - -.. list-table:: - :widths: 50 50 - :header-rows: 1 - - * - Highcharts (JS) - - Highcharts for Python - * - .. code-block:: javascript - - // Example Series Object - // (for a Line series type): - { - data: [ - { - id: 'first-data-point', - x: 1, - y: 123, - // ... - // optional additional properties - // for styling/behavior go here - // ... - }, +**Highcharts for Python** represents data points in series in two fashions: + + #. As a list of data point objects in the ``data`` property within the series, or + + .. list-table:: + :widths: 50 50 + :header-rows: 1 + + * - Highcharts (JS) + - Highcharts for Python + * - .. code-block:: javascript + + // Example Series Object + // (for a Line series type): { - id: 'second-data-point', - x: 2, - y: 456, - // ... - // optional additional properties - // for styling/behavior go here + data: [ + { + id: 'first-data-point', + x: 1, + y: 123, + // ... + // optional additional properties + // for styling/behavior go here + // ... + }, + { + id: 'second-data-point', + x: 2, + y: 456, + // ... + // optional additional properties + // for styling/behavior go here + // ... + }, + { + id: 'third-data-point', + x: 3, + y: 789, + // ... + // optional additional properties + // for styling/behavior go here + // ... + } + ], // ... - }, + // other Series properties go here + // to configure styling/behavior + } + - .. code-block:: python + + # Corresponding LineSeries object + my_series = Series(data = [ + CartesianData(id = 'first-data-point1', + x = 1, + y = 123), + CartesianData(id = 'second-data-point1', + x = 2, + y = 456), + CartesianData(id = 'third-data-point1', + x = 3, + y = 789), + ]) + + #. As a single :class:`DataPointCollection ` + object in the ``data`` property within the series, which in turn contains the + individual data points. + + .. list-table:: + :widths: 50 50 + :header-rows: 1 + + * - Highcharts (JS) + - Highcharts for Python + * - .. code-block:: javascript + + // Example Series Object + // (for a Line series type): { - id: 'third-data-point', - x: 3, - y: 789, - // ... - // optional additional properties - // for styling/behavior go here + data: [ + { + name: 'first-data-point', + x: 1, + y: 123, + // ... + // optional additional properties + // for styling/behavior go here + // ... + }, + { + name: 'second-data-point', + x: 2, + y: 456, + // ... + // optional additional properties + // for styling/behavior go here + // ... + }, + { + name: 'third-data-point', + x: 3, + y: 789, + // ... + // optional additional properties + // for styling/behavior go here + // ... + } + ], // ... + // other Series properties go here + // to configure styling/behavior } - ], - // ... - // other Series properties go here - // to configure styling/behavior - } - - .. code-block:: python - - # Corresponding LineSeries object - my_series = Series(data = [ - CartesianData(id = 'first-data-point1', - x = 1, - y = 123), - CartesianData(id = 'second-data-point1', - x = 2, - y = 456), - CartesianData(id = 'third-data-point1', - x = 3, - y = 789), - ]) + - .. code-block:: python + + # EXAMPLE 1. Corresponding LineSeries object, with data as an + # numpy.ndarray. + + my_series = Series(data = CartesianDataCollection( + ndarray = [ + [1, 123, 'first-data-point1'], + [2, 456, 'second-data-point1'], + [3, 789, 'third-data-point1']) + ]) + + # EXAMPLE 2. Corresponding LineSeries object, with data as a + # primitive array. + + my_series = Series(data = CartesianDataCollection( + array = [ + [1, 123, 'first-data-point1'], + [2, 456, 'second-data-point1'], + [3, 789, 'third-data-point1']) + ] + )) As you can see, **Highcharts for Python** represents its data the same way that `Highcharts (JS) `__ does. That should be expected. However, constructing tens, hundreds, or possibly thousands of data points individually in your code would be a nightmare. For that reason, the -**Highcharts for Python Toolkit** provides a number of convenience methods to make it -easier to populate your series. +**Highcharts for Python Toolkit** natively supports vectorized +:class:`numpy.ndarray ` values, and automatically assembles data +point collections for easy management/manipulation. In addition, the Toolkit +provides a number of convenience methods to make it easier to populate your +series. .. _populating_series_data: @@ -425,8 +499,11 @@ instance), or to create a new series instance with data already loaded. :classmethod: :noindex: - Creates a collection of data point instances, parsing the contents of ``value`` as an - array (iterable). This method is specifically used to parse data that is input to + Creates a + :class:`DataPointCollection ` + instance if possible, or falls back to a collection of data point + instances, parsing the contents of ``value`` as an array (iterable). This method + is specifically used to parse data that is input to **Highcharts for Python** without property names, in an array-organized structure as described in the `Highcharts (JS) `__ documentation. @@ -449,12 +526,37 @@ instance), or to create a new series instance with data already loaded. my_series = LineSeries() + # EXAMPLE 1. + # A simple array of numerical values which correspond to the Y value of the data + # point, passed to the .from_array() method. + + my_series = LineSeries.from_array([0, 5, 3, 5]) + + # EXAMPLE 2. # A simple array of numerical values which correspond to the Y value of the data - # point + # point, passed to the series data property. + my_series.data = [0, 5, 3, 5] + # EXAMPLE 3. + # A simple array of numerical values which correspond to the Y value of the data + # point, updated in the series using the .load_from_array() method. + + my_series.load_from_array([0, 5, 3, 5]) + + # EXAMPLE 4. + # An array containing 2-member arrays (corresponding to the X and Y values of the + # data point), passed to the .from_array() class method. + my_series = LineSeries.from_array([ + [0, 0], + [1, 5], + [2, 3], + [3, 5] + ]) + + # EXAMPLE 5. # An array containing 2-member arrays (corresponding to the X and Y values of the - # data point) + # data point), passed to the series data property. my_series.data = [ [0, 0], [1, 5], @@ -462,7 +564,37 @@ instance), or to create a new series instance with data already loaded. [3, 5] ] - # An array of dict with named values + # EXAMPLE 6. + # An array of dict with named values, passed to the .from_array() class method. + my_series = LineSeries.from_array([ + { + 'x': 0, + 'y': 0, + 'name': 'Point1', + 'color': '#00FF00' + }, + { + 'x': 1, + 'y': 5, + 'name': 'Point2', + 'color': '#CCC' + }, + { + 'x': 2, + 'y': 3, + 'name': 'Point3', + 'color': '#999' + }, + { + 'x': 3, + 'y': 5, + 'name': 'Point4', + 'color': '#000' + } + ]) + + # EXAMPLE 6. + # An array of dict with named values, passed to the series data property. my_series.data = [ { 'x': 0, @@ -490,6 +622,36 @@ instance), or to create a new series instance with data already loaded. } ] + # EXAMPLE 6. + # An array of dict with named values, passed to .load_from_array() + # method. + my_series.load_from_array([ + { + 'x': 0, + 'y': 0, + 'name': 'Point1', + 'color': '#00FF00' + }, + { + 'x': 1, + 'y': 5, + 'name': 'Point2', + 'color': '#CCC' + }, + { + 'x': 2, + 'y': 3, + 'name': 'Point3', + 'color': '#999' + }, + { + 'x': 3, + 'y': 5, + 'name': 'Point4', + 'color': '#000' + } + ]) + :param value: The value that should contain the data which will be converted into data point instances. @@ -504,12 +666,18 @@ instance), or to create a new series instance with data already loaded. :class:`DataBase `) :rtype: :class:`list ` of :class:`DataBase `-descendant - instances + instances or + :class:`DataPointCollection ` + instance .. tab:: Update an Existing Series .. tabs:: + .. tab:: Using ``.load_from_array()`` + + .. include:: using/populating_series_data/_load_from_array.rst + .. tab:: Using ``.load_from_csv()`` .. include:: using/populating_series_data/_load_from_csv.rst @@ -526,6 +694,10 @@ instance), or to create a new series instance with data already loaded. .. tabs:: + .. tab:: Using ``.from_array()`` + + .. include:: using/populating_series_data/_new_from_array.rst + .. tab:: Using ``.from_csv()`` .. include:: using/populating_series_data/_new_from_csv.rst @@ -562,6 +734,10 @@ property. You can do this in several ways: .. tabs:: + .. tab:: Using Keyword Arguments + + .. include:: using/adding_series_to_charts/_using_kwargs.rst + .. tab:: Using ``.options.series`` .. include:: using/assembling_your_chart/_using_series_property.rst diff --git a/docs/using/assembling_your_chart/_using_kwargs.rst b/docs/using/assembling_your_chart/_using_kwargs.rst new file mode 100644 index 00000000..ee109af0 --- /dev/null +++ b/docs/using/assembling_your_chart/_using_kwargs.rst @@ -0,0 +1,23 @@ + .. note:: + + The keyword pattern outlined below is supported by both the + :class:`Chart ` and + :class:`HighchartsOptions ` + classes + +.. code-block:: python + + from highcharts_core.chart import Chart + from highcharts_core.options.series.area import LineSeries + + # EXAMPLE 1. Indicating data and series_type. + my_chart = Chart(data = [[0, 1], [1, 2], [2, 3]], + series_type = 'line') + + # EXAMPLE 2. Supplying the Series instance(s) directly. + my_chart = Chart(series = LineSeries(data = [ + [0, 1], + [1, 2], + [2, 3] + ])) + \ No newline at end of file diff --git a/docs/using/download_visualizations/_using_custom.rst b/docs/using/download_visualizations/_using_custom.rst index a5351837..9b95d578 100644 --- a/docs/using/download_visualizations/_using_custom.rst +++ b/docs/using/download_visualizations/_using_custom.rst @@ -1,19 +1,13 @@ .. code-block:: python from highcharts_core.chart import Chart - from highcharts_core.options.series.area import LineSeries from highcharts_core.headless_export import ExportServer custom_server = ExportServer(url = 'https://www.mydomain.dev/some_pathname_goes_here') - my_chart = Chart(container = 'target_div', - options = { - 'series': [ - LineSeries(data = [0, 5, 3, 5]) - ] - }, - variable_name = 'myChart') - + my_chart = Chart(data = [0, 5, 3, 5], + series_type = 'line') + # Download a PNG version of the chart in memory within your Python code. my_png_image = my_chart.download_chart(format = 'png', server_instance = custom_server) diff --git a/docs/using/download_visualizations/_using_highsoft.rst b/docs/using/download_visualizations/_using_highsoft.rst index aa9f33b6..ac06389d 100644 --- a/docs/using/download_visualizations/_using_highsoft.rst +++ b/docs/using/download_visualizations/_using_highsoft.rst @@ -1,15 +1,9 @@ .. code-block:: python from highcharts_core.chart import Chart - from highcharts_core.options.series.area import LineSeries - - my_chart = Chart(container = 'target_div', - options = { - 'series': [ - LineSeries(data = [0, 5, 3, 5]) - ] - }, - variable_name = 'myChart') + + my_chart = Chart(data = [0, 5, 3, 5], + series_type = 'line') # Download a PNG version of the chart in memory within your Python code. my_png_image = my_chart.download_chart(format = 'png') diff --git a/docs/using/populating_series_data/_load_from_array.rst b/docs/using/populating_series_data/_load_from_array.rst new file mode 100644 index 00000000..73e91093 --- /dev/null +++ b/docs/using/populating_series_data/_load_from_array.rst @@ -0,0 +1,85 @@ +.. code-block:: python + + # EXAMPLE 1 + # A simple array of numerical values which correspond to the Y value of the data + # point + + my_series.load_from_array([0, 5, 3, 5]) + + # EXAMPLE 2 + # An array containing 2-member arrays (corresponding to the X and Y values of the + # data point) + + my_series.load_from_array([ + [0, 0], + [1, 5], + [2, 3], + [3, 5] + ]) + + # EXAMPLE 3 + # An array of dict with named values + + my_series.load_from_array([ + { + 'x': 0, + 'y': 0, + 'name': 'Point1', + 'color': '#00FF00' + }, + { + 'x': 1, + 'y': 5, + 'name': 'Point2', + 'color': '#CCC' + }, + { + 'x': 2, + 'y': 3, + 'name': 'Point3', + 'color': '#999' + }, + { + 'x': 3, + 'y': 5, + 'name': 'Point4', + 'color': '#000' + } + ]) + + # EXAMPLE 5 + # using a NumPy ndarray named "numpy_array" + + my_series.load_from_array(numpy_array) + +.. collapse:: Method Signature + + .. method:: load_from_array(cls, value) + :noindex: + :classmethod: + + Update the :term:`series` instance's ``data`` property with data populated from + an array-like ``value``. + + This method is specifically used to parse data that is input to + **Highcharts for Python** without property names, in an array-organized structure as + described in the `Highcharts JS `__ documentation. + + .. seealso:: + + The specific structure of the expected array is highly dependent on the type of data + point that the series needs, which itself is dependent on the series type itself. + + Please review the detailed :ref:`series documentation ` for + series type-specific details of relevant array structures. + + :param value: The value that should contain the data which will be converted into data + point instances. + + .. note:: + + If ``value`` is not an iterable, it will be converted into an iterable to be + further de-serialized correctly. + + :type value: iterable + diff --git a/docs/using/populating_series_data/_load_from_csv.rst b/docs/using/populating_series_data/_load_from_csv.rst index 8fb1d018..33692520 100644 --- a/docs/using/populating_series_data/_load_from_csv.rst +++ b/docs/using/populating_series_data/_load_from_csv.rst @@ -1,6 +1,13 @@ .. code-block:: python # Given a LineSeries named "my_series", and a CSV file named "updated-data.csv" + + my_series.load_from_csv('updated-data.csv') + + # For more precise control over how the CSV data is parsed, + # you can supply a mapping of series properties to their CSV column + # either by index position *or* by column header name. + my_series.load_from_csv('updated-data.csv', property_column_map = { 'x': 0, @@ -10,7 +17,7 @@ .. collapse:: Method Signature - .. method:: .load_from_csv(self, as_string_or_file, property_column_map, has_header_row = True, delimiter = ',', null_text = 'None', wrapper_character = "'", line_terminator = '\r\n', wrap_all_strings = False, double_wrapper_character_when_nested = False, escape_character = '\\') + .. method:: .load_from_csv(self, as_string_or_file, property_column_map = None, has_header_row = True, delimiter = ',', null_text = 'None', wrapper_character = "'", line_terminator = '\r\n', wrap_all_strings = False, double_wrapper_character_when_nested = False, escape_character = '\\', series_in_rows = 'line', series_index = None, **kwargs) :noindex: Updates the series instance with a collection of data points (descending from @@ -32,21 +39,40 @@ .. code-block:: python my_series = LineSeries() - my_series.load_from_csv('some-csv-file.csv', - property_column_map = { - 'x': 0, - 'y': 3, - 'id': 'id' - }) - - As the example above shows, data is loaded into the ``my_series`` instance from - the CSV file with a filename ``some-csv-file.csv``. The - :meth:`x ` - values for each data point will be taken from the first (index 0) column in the - CSV file. The :meth:`y ` values will be taken from the fourth - (index 3) column in the CSV file. And the :meth:`id ` values - will be taken from a column whose header row is labeled ``'id'`` (regardless of - its index). + + # Minimal code - will attempt to update the line series + # taking x-values from the first column, and y-values from + # the second column. If there are too many columns in the CSV, + # will throw an error. + my_series = my_series.from_csv('some-csv-file.csv') + + # More precise code - will attempt to update the line series + # mapping columns in the CSV file to properties on the series + # instance. + my_series = my_series.from_csv('some-csv-file.csv', + property_column_map = { + 'x': 0, + 'y': 3, + 'id': 'id' + }) + + As the example above shows, data is loaded into the ``my_series`` instance + from the CSV file with a filename ``some-csv-file.csv``. Unless otherwise + specified, the :meth:`.x ` values for each data point will + be taken from the first (index 0) column in the CSV file, while the + :meth:`.y ` values will be taken from the second column. + + If the CSV has more than 2 columns, then this will throw an + :exc:`HighchartsCSVDeserializationError` because the function is not certain + which columns to use to update the series. If this happens, you can precisely + specify which columns to use by providing a ``property_column_map`` argument, + as shown in the second example. In that second example, the + :meth:`.x ` values for each data point will be taken from + the first (index 0) column in the CSV file. The :meth:`.y ` + values will be taken from the fourth (index 3) column in the CSV file. And + the :meth:`.id ` + values will be taken from a column whose header row is labeled ``'id'`` + (regardless of its index). :param as_string_or_file: The CSV data to load, either as a :class:`str ` or as the name of a file in the runtime envirnoment. If a file, data will be read @@ -59,11 +85,12 @@ :type as_string_or_file: :class:`str ` or Path-like - :param property_column_map: A :class:`dict ` used to indicate which - data point property should be set to which CSV column. The keys in the + :param property_column_map: An optional :class:`dict ` used to indicate + which data point property should be set to which CSV column. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value can either be a numerical index (starting with 0) or a - :class:`str ` indicating the label for the CSV column. + :class:`str ` indicating the label for the CSV column. Defaults to + :obj:`None `. .. warning:: @@ -125,6 +152,28 @@ Python's native escape character). :type escape_character: :class:`str ` + :param series_in_rows: if ``True``, will attempt a streamlined cartesian series + with x-values taken from column names, y-values taken from row values, and + the series name taken from the row index. Defaults to + :obj:`False `. + :type series_in_rows: :class:`bool ` + + :param series_index: if :obj:`None `, will raise a + :exc:`HighchartsCSVDeserializationError ` + if the CSV data contains more than one series and no ``property_column_map`` + is provided. Otherwise, will update the instance with the series found + in the CSV at the ``series_index`` value. Defaults to + :obj:`None `. + + .. tip:: + + This argument is *ignored* if ``property_column_map`` is provided. + + :type series_index: :class:`int ` or :obj:`None ` + + :param **kwargs: Remaining keyword arguments will be attempted on the resulting + :term:`series` instance and the data points it contains. + :returns: A collection of data points descended from :class:`DataBase ` as appropriate for the series class. diff --git a/docs/using/populating_series_data/_load_from_pandas.rst b/docs/using/populating_series_data/_load_from_pandas.rst index cf3e0b4c..666f62c8 100644 --- a/docs/using/populating_series_data/_load_from_pandas.rst +++ b/docs/using/populating_series_data/_load_from_pandas.rst @@ -1,6 +1,14 @@ .. code-block:: python # Given a LineSeries named "my_series", and a Pandas DataFrame variable named "df" + + # EXAMPLE 1. The minimum code required to update the series: + + my_series.load_from_pandas(df) + + # EXAMPLE 2. For more precise control over how the ``df`` is parsed, + # you can supply a mapping of series properties to their dataframe column. + my_series.load_from_pandas(df, property_map = { 'x': 'date', @@ -8,9 +16,15 @@ 'id': 'id' }) + # EXAMPLE 3. For more precise control, specify the index of the + # Highcharts for Python series instance to use in updating your series' data. + + my_series.load_from_pandas(df, series_index = 3) + + .. collapse:: Method Signature - .. method:: .load_from_pandas(self, df, property_map) + .. method:: .load_from_pandas(self, df, property_map = None, series_in_rows = False, series_index = None) :noindex: Replace the contents of the @@ -29,7 +43,28 @@ :class:`DataFrame ` column. :type property_map: :class:`dict ` + :param series_in_rows: if ``True``, will attempt a streamlined cartesian series + with x-values taken from column names, y-values taken from row values, and + the series name taken from the row index. Defaults to + :obj:`False `. + :type series_in_rows: :class:`bool ` + + :param series_index: If supplied, return the series that Highcharts for Python + generated from ``df`` at the ``series_index`` value. Defaults to + :obj:`None `, which returns all series generated from ``df``. + + .. warning:: + + If :obj:`None ` and Highcharts for Python generates multiple + series, then a :exc:`HighchartsPandasDeserializationError` will be raised. + + :type series_index: :class:`int `, slice, or + :obj:`None ` + :raises HighchartsPandasDeserializationError: if ``property_map`` references a column that does not exist in the data frame + :raises HighchartsPandasDeserializationError: if ``series_index`` is + :obj:`None `, and it is ambiguous which series generated from + the dataframe should be used :raises HighchartsDependencyError: if `pandas `__ is not available in the runtime environment diff --git a/docs/using/populating_series_data/_new_from_array.rst b/docs/using/populating_series_data/_new_from_array.rst new file mode 100644 index 00000000..d2c7d4d6 --- /dev/null +++ b/docs/using/populating_series_data/_new_from_array.rst @@ -0,0 +1,213 @@ +.. code-block:: python + + from highcharts_core.options.series.area import LineSeries + from highcharts_core.options.series.data.cartesian import CartesianData + from highcharts_core.options.series.data.cartesian import CartesianDataCollection + + # Creating CartesianData instances from an array + + # EXAMPLE 1 + # A simple array of numerical values which correspond to the Y value of the data + # point + + my_data = CartesianData.from_array([0, 5, 3, 5]) + + # EXAMPLE 2 + # An array containing 2-member arrays (corresponding to the X and Y values of the + # data point) + + my_data = CartesianData.from_array([ + [0, 0], + [1, 5], + [2, 3], + [3, 5] + ]) + + # EXAMPLE 3 + # An array of dict with named values + + my_data = CartesianData.from_array([ + { + 'x': 0, + 'y': 0, + 'name': 'Point1', + 'color': '#00FF00' + }, + { + 'x': 1, + 'y': 5, + 'name': 'Point2', + 'color': '#CCC' + }, + { + 'x': 2, + 'y': 3, + 'name': 'Point3', + 'color': '#999' + }, + { + 'x': 3, + 'y': 5, + 'name': 'Point4', + 'color': '#000' + } + ]) + + # EXAMPLE 5 + # using a NumPy ndarray named "numpy_array" + + my_data = CartesianData.from_array(numpy_array) + + + my_series = LineSeries(data = my_data) + + # Creating a CartesianDataCollection instance from an array + + # EXAMPLE 1 + # A simple array of numerical values which correspond to the Y value of the data + # point + + my_data = CartesianDataCollection.from_array([0, 5, 3, 5]) + + # EXAMPLE 2 + # An array containing 2-member arrays (corresponding to the X and Y values of the + # data point) + + my_data = CartesianDataCollection.from_array([ + [0, 0], + [1, 5], + [2, 3], + [3, 5] + ]) + + # EXAMPLE 3 + # An array of dict with named values + + my_data = CartesianDataCollection.from_array([ + { + 'x': 0, + 'y': 0, + 'name': 'Point1', + 'color': '#00FF00' + }, + { + 'x': 1, + 'y': 5, + 'name': 'Point2', + 'color': '#CCC' + }, + { + 'x': 2, + 'y': 3, + 'name': 'Point3', + 'color': '#999' + }, + { + 'x': 3, + 'y': 5, + 'name': 'Point4', + 'color': '#000' + } + ]) + + # EXAMPLE 5 + # using a NumPy ndarray named "numpy_array" + + my_data = CartesianDataCollection.from_array(numpy_array) + + my_series = LineSeries(data = my_data) + + # Creating CartesianData instances from an array + + # EXAMPLE 1 + # A simple array of numerical values which correspond to the Y value of the data + # point + + my_series = LineSeries.from_array([0, 5, 3, 5]) + + # EXAMPLE 2 + # An array containing 2-member arrays (corresponding to the X and Y values of the + # data point) + + my_series = LineSeries.from_array([ + [0, 0], + [1, 5], + [2, 3], + [3, 5] + ]) + + # EXAMPLE 3 + # An array of dict with named values + + my_series = LineSeries.from_array([ + { + 'x': 0, + 'y': 0, + 'name': 'Point1', + 'color': '#00FF00' + }, + { + 'x': 1, + 'y': 5, + 'name': 'Point2', + 'color': '#CCC' + }, + { + 'x': 2, + 'y': 3, + 'name': 'Point3', + 'color': '#999' + }, + { + 'x': 3, + 'y': 5, + 'name': 'Point4', + 'color': '#000' + } + ]) + + # EXAMPLE 5 + # using a NumPy ndarray named "numpy_array" + + my_series = LineSeries.from_array(numpy_array) + +.. collapse:: Method Signature + + .. seealso:: + + * :meth:`SeriesBase.from_array() ` + * :meth:`Chart.from_array() ` + + .. method:: from_array(cls, value) + :noindex: + :classmethod: + + Creates a collection of data point instances, parsing the contents of ``value`` as an + array (iterable). This method is specifically used to parse data that is input to + **Highcharts for Python** without property names, in an array-organized structure as + described in the `Highcharts JS `__ documentation. + + .. seealso:: + + The specific structure of the expected array is highly dependent on the type of data + point that the series needs, which itself is dependent on the series type itself. + + Please review the detailed :ref:`series documentation ` for + series type-specific details of relevant array structures. + + :param value: The value that should contain the data which will be converted into data + point instances. + + .. note:: + + If ``value`` is not an iterable, it will be converted into an iterable to be + further de-serialized correctly. + + :type value: iterable + + :returns: Collection of :term:`data point` instances (descended from + :class:`DataBase `) + :rtype: `:class:`list ` of + :class:`DataBase `-descendant + instances, or + :class:`DataPointCollection ` diff --git a/docs/using/populating_series_data/_new_from_csv.rst b/docs/using/populating_series_data/_new_from_csv.rst index efe51843..6d6201e8 100644 --- a/docs/using/populating_series_data/_new_from_csv.rst +++ b/docs/using/populating_series_data/_new_from_csv.rst @@ -9,7 +9,15 @@ from highcharts_core.chart import Chart from highcharts_core.options.series.area import LineSeries - # Create a new LineSeries instance from the CSV file "some-csv-file.csv". + # Create one or more LineSeries instances from the CSV file "some-csv-file.csv". + + # EXAMPLE 1. The minimum code to produce one series for each + # column in the CSV file (excluding the first column): + + my_series = LineSeries.from_csv('some-csv-file.csv') + + # EXAMPLE 2. Produces ONE series with more precise configuration: + my_series = LineSeries.from_csv('some-csv-file.csv', property_column_map = { 'x': 0, @@ -17,7 +25,25 @@ 'id': 'id' }) - # Create a new LineSeries instance from the CSV file "some-csv-file.csv". + # EXAMPLE 3. Produces THREE series instances with + # more precise configuration: + + my_series = LineSeries.from_csv('some-csv-file.csv', + property_column_map = { + 'x': 0, + 'y': [3, 5, 8], + 'id': 'id' + }) + + # Create a chart with one or more LineSeries instances from + # the CSV file "some-csv-file.csv". + + # EXAMPLE 1: The minimum code: + + my_chart = Chart.from_csv('some-csv-file.csv', series_type = 'line') + + # EXAMPLE 2: For more precise configuration and *one* series: + my_chart = Chart.from_csv('some-csv-file.csv', property_column_map = { 'x': 0, @@ -25,29 +51,44 @@ 'id': 'id' }, series_type = 'line') + + # EXAMPLE 3: For more precise configuration and *multiple* series: + + my_chart = Chart.from_csv('some-csv-file.csv', + property_column_map = { + 'x': 0, + 'y': [3, 5, 8], + 'id': 'id' + }, + series_type = 'line') .. collapse:: Method Signature .. seealso:: * :meth:`Chart.from_csv() ` + * :meth:`SeriesBase.from_csv_in_rows() ` - .. method:: .from_csv(cls, as_string_or_file, property_column_map, series_kwargs = None, has_header_row = True, delimiter = ',', null_text = 'None', wrapper_character = "'", line_terminator = '\r\n', wrap_all_strings = False, double_wrapper_character_when_nested = False, escape_character = '\\') + .. method:: .from_csv(cls, as_string_or_file, property_column_map = None, series_kwargs = None, has_header_row = True, delimiter = ',', null_text = 'None', wrapper_character = "'", line_terminator = '\r\n', wrap_all_strings = False, double_wrapper_character_when_nested = False, escape_character = '\\', series_in_rows = False, series_index = None, **kwargs) :noindex: :classmethod: - Create a new :term:`series` instance with a - :meth:`.data ` property - populated from data in a CSV string or file. + Create one or more :term:`series` instances with + :meth:`.data ` populated from data in a CSV string + or file. .. note:: - For an example - :class:`LineSeries `, the + To produce one or more + :class:`LineSeries ` instances, the minimum code required would be: .. code-block:: python + # EXAMPLE 1. The minimum code: + my_series = LineSeries.from_csv('some-csv-file.csv') + + # EXAMPLE 2. For more precise configuration and ONE series: my_series = LineSeries.from_csv('some-csv-file.csv', property_column_map = { 'x': 0, @@ -55,14 +96,39 @@ 'id': 'id' }) + # EXAMPLE 3. For more precise configuration and MULTIPLE series: + my_series = LineSeries.from_csv('some-csv-file.csv', + property_column_map = { + 'x': 0, + 'y': [3, 5, 8], + 'id': 'id' + }) + As the example above shows, data is loaded into the ``my_series`` instance - from the CSV file with a filename ``some-csv-file.csv``. The - :meth:`x ` + from the CSV file with a filename ``some-csv-file.csv``. + + In EXAMPLE 1, the method will return one or more series where each series + will default to having its :meth:`.x ` values taken from + the first (index 0) column in the CSV, and one + :class:`LineSeries ` + instance will be created for each subsequent column (which will populate + that series' :meth:`.y ` values. + + In EXAMPLE 2, the chart will contain one series, where the + :meth:`.x ` values for each data point will be taken from the first (index 0) column in - the CSV file. The :meth:`y ` values will be taken from the - fourth (index 3) column in the CSV file. And the :meth:`id ` + the CSV file. The :meth:`.y ` values will be taken from the + fourth (index 3) column in the CSV file. And the :meth:`.id ` values will be taken from a column whose header row is labeled ``'id'`` (regardless of its index). + + In EXAMPLE 3, the chart will contain three series, all of which will have + :meth:`.x ` values taken from the first (index 0) column, + :meth:`.id ` values from the column whose header row is + labeled ``'id'``, and whose :meth:`.y ` will be taken + from the fourth (index 3) column for the first series, the sixth (index 5) + column for the second series, and the ninth (index 8) column for the third + series. :param as_string_or_file: The CSV data to use to pouplate data. Accepts either the raw CSV data as a :class:`str ` or a path to a file in the @@ -81,14 +147,45 @@ class, while the value can either be a numerical index (starting with 0) or a :class:`str ` indicating the label for the CSV column. + .. note:: + + If any of the values in ``property_column_map`` contain an iterable, then + one series will be produced for each item in the iterable. For example, + the following: + + .. code-block:: python + + { + 'x': 0, + 'y': [3, 5, 8] + } + + will return *three* series, each of which will have its + :meth:`.x ` value populated from the first column + (index 0), and whose :meth:`.y ` + values will be populated from the fourth, sixth, and ninth columns (indices + 3, 5, and 8), respectively. + + .. warning:: + + If the ``property_column_map`` uses :class:`str ` values, the CSV + file *must* have a header row (this is expected, by default). If there is no + header row and a :class:`str ` value is found, a + :exc:`HighchartsCSVDeserializationError` will be raised. + + :type property_column_map: :class:`dict ` + + :param series_type: Indicates the series type that should be created from the CSV + data. Defaults to ``'line'``. + .. warning:: - If the ``property_column_map`` uses :class:`str ` values, the CSV - file *must* have a header row (this is expected, by default). If there is no - header row and a :class:`str ` value is found, a - :exc:`HighchartsCSVDeserializationError` will be raised. + This argument is *not supported* when calling + :meth:`.from_csv() ` on + a :term:`series` instance. It is only supported when calling + :meth:`Chart.from_csv() `. - :type property_column_map: :class:`dict ` + :type series_type: :class:`str ` :param has_header_row: If ``True``, indicates that the first row of ``as_string_or_file`` contains column labels, rather than actual data. Defaults @@ -156,12 +253,29 @@ Python's native escape character). :type escape_character: :class:`str ` - :returns: A :term:`series` instance (descended from + :param series_in_rows: if ``True``, will attempt a streamlined cartesian series + with x-values taken from column names, y-values taken from row values, and + the series name taken from the row index. Defaults to ``False``. + :type series_in_rows: :class:`bool ` + + :param series_index: if :obj:`None `, will attempt to populate + the chart with multiple series from the CSV data. If an :class:`int ` + is supplied, will populate the chart only with the series found at + ``series_index``. + + :type series_index: :class:`int `, slice, or + :obj:`None ` + + :param **kwargs: Remaining keyword arguments will be attempted on the resulting + :term:`series` instance and the data points it contains. + + :returns: One or more :term:`series` instances (descended from :class:`SeriesBase `) with its :meth:`.data ` property populated from the CSV data in ``as_string_or_file``. :rtype: :class:`list ` of series instances (descended from - :class:`SeriesBase `) + :class:`SeriesBase `) or + :class:`SeriesBase ` instance :raises HighchartsCSVDeserializationError: if ``property_column_map`` references CSV columns by their label, but the CSV data does not contain a header row diff --git a/docs/using/populating_series_data/_new_from_pandas.rst b/docs/using/populating_series_data/_new_from_pandas.rst index d3401aba..92c943af 100644 --- a/docs/using/populating_series_data/_new_from_pandas.rst +++ b/docs/using/populating_series_data/_new_from_pandas.rst @@ -12,14 +12,54 @@ from highcharts_core.options.series.area import LineSeries # Creating a Series from the DataFrame + + ## EXAMPLE 1. Minimum code required. Creates one or more series. + + my_series = LineSeries.from_pandas(df) + + ## EXAMPLE 2. More precise configuration. Creates ONE series. + + my_series = LineSeries.from_pandas(df, series_index = 2) + + ## EXAMPLE 3. More precise configuration. Creates ONE series. + my_series = LineSeries.from_pandas(df, property_map = { 'x': 'date', 'y': 'value', 'id': 'id' }) + + ## EXAMPLE 4. More precise configuration. Creates THREE series. + my_series = LineSeries.from_pandas(df, + property_map = { + 'x': 'date', + 'y': ['value1', 'value2', 'value3'], + 'id': 'id' + }) + + ## EXAMPLE 5. Minimum code required. Creates one or more series + ## from a dataframe where each row in the dataframe is a + ## Highcharts series. The two lines of code below are equivalent. + + my_series = LineSeries.from_pandas_in_rows(df) + # Creating a Chart with a lineSeries from the DataFrame. + + ## EXAMPLE 1. Minimum code required. Populates the chart with + ## one or more series. + + my_chart = Chart.from_pandas(df) + + ## EXAMPLE 2. More precise configuration. Populates the chart with + ## one series. + + my_chart = Chart.from_pandas(df, series_index = 2) + + ## EXAMPLE 3. More precise configuration. Populates the chart with + ## ONE series. + my_chart = Chart.from_pandas(df, property_map = { 'x': 'date', @@ -27,6 +67,23 @@ 'id': 'id' }, series_type = 'line') + + ## EXAMPLE 4. More precise configuration. Populates the chart with + ## THREE series. + + my_chart = Chart.from_pandas(df, + property_map = { + 'x': 'date', + 'y': ['value1', 'value2', 'value3'], + 'id': 'id' + }, + series_type = 'line') + + ## EXAMPLE 5. Minimum code required. Creates a Chart populated + ## with series from a dataframe where each row in the dataframe + ## becomes a series on the chart. + + my_chart = Chart.from_pandas_in_rows(df) .. collapse:: Method Signature @@ -34,27 +91,61 @@ .. seealso:: * :meth:`Chart.from_pandas() ` + * :meth:`Chart.from_pandas_in_rows() ` + * :meth:`SeriesBase.from_pandas_in_rows() ` - .. method:: .from_pandas(cls, df, property_map, series_kwargs = None) + .. method:: .from_pandas(cls, df, property_map = None, series_kwargs = None, series_in_rows = False, series_index = None, **kwargs) :noindex: :classmethod: - Create a :term:`series` instance whose - :meth:`.data ` property - is populated from a `pandas `__ + Create one or more :term:`series` instances whose + :meth:`.data ` properties + are populated from a `pandas `_ :class:`DataFrame `. :param df: The :class:`DataFrame ` from which data should be loaded. :type df: :class:`DataFrame ` - :param property_map: A :class:`dict ` used to indicate which + :param property_map: An optional :class:`dict ` used to indicate which data point property should be set to which column in ``df``. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value should indicate the label for the :class:`DataFrame ` column. + + .. note:: + + If any of the values in ``property_map`` contain an iterable, then + one series will be produced for each item in the iterable. For example, + the following: + + .. code-block:: python + + { + 'x': 'timestamp', + 'y': ['value1', 'value2', 'value3'] + } + + will return *three* series, each of which will have its + :meth:`.x ` value populated from the column + labeled ``'timestamp'``, and whose :meth:`.y ` + values will be populated from the columns labeled ``'value1'``, + ``'value2'``, and ``'value3'``, respectively. + :type property_map: :class:`dict ` + :param series_type: Indicates the series type that should be created from the CSV + data. Defaults to ``'line'``. + + .. warning:: + + This argument is *not supported* when calling + :meth:`.from_pandas() ` on + a :term:`series`. It is only supported when calling + :meth:`Chart.from_csv() `. + + :type series_type: :class:`str ` + :param series_kwargs: An optional :class:`dict ` containing keyword arguments that should be used when instantiating the series instance. Defaults to :obj:`None `. @@ -66,12 +157,30 @@ :type series_kwargs: :class:`dict ` - :returns: A :term:`series` instance (descended from - :class:`SeriesBase `) with its + :param series_in_rows: if ``True``, will attempt a streamlined cartesian series + with x-values taken from column names, y-values taken from row values, and + the series name taken from the row index. Defaults to ``False``. + :obj:`False `. + :type series_in_rows: :class:`bool ` + + :param series_index: If supplied, return the series that Highcharts for Python + generated from ``df`` at the ``series_index`` value. Defaults to + :obj:`None `, which returns all series generated from ``df``. + + :type series_index: :class:`int `, slice, or + :obj:`None ` + + :param **kwargs: Remaining keyword arguments will be attempted on the resulting + :term:`series` instance and the data points it contains. + + :returns: One or more :term:`series` instances (descended from + :class:`SeriesBase `) with the :meth:`.data ` property populated from the data in ``df``. :rtype: :class:`list ` of series instances (descended from - :class:`SeriesBase `) + :class:`SeriesBase `), or + a :class:`SeriesBase `-descended + instance :raises HighchartsPandasDeserializationError: if ``property_map`` references a column that does not exist in the data frame diff --git a/docs/using/populating_series_data/_with_data_property.rst b/docs/using/populating_series_data/_with_data_property.rst index 5fe5289e..c264faa5 100644 --- a/docs/using/populating_series_data/_with_data_property.rst +++ b/docs/using/populating_series_data/_with_data_property.rst @@ -2,12 +2,16 @@ my_series = LineSeries() + # EXAMPLE 1 # A simple array of numerical values which correspond to the Y value of the data # point + my_series.data = [0, 5, 3, 5] + # EXAMPLE 2 # An array containing 2-member arrays (corresponding to the X and Y values of the # data point) + my_series.data = [ [0, 0], [1, 5], @@ -15,7 +19,9 @@ [3, 5] ] + # EXAMPLE 3 # An array of dict with named values + my_series.data = [ { 'x': 0, diff --git a/docs/using/populating_series_data/_with_from_array.rst b/docs/using/populating_series_data/_with_from_array.rst deleted file mode 100644 index 27efc8d9..00000000 --- a/docs/using/populating_series_data/_with_from_array.rst +++ /dev/null @@ -1,134 +0,0 @@ -.. code-block:: python - - from highcharts_core.options.series.area import LineSeries - from highcharts_core.options.series.data import CartesianData - - # A simple array of numerical values which correspond to the Y value of the data - # point - my_data = CartesianData.from_array([0, 5, 3, 5]) - - # An array containing 2-member arrays (corresponding to the X and Y values of the - # data point) - my_data = CartesianData.from_array([ - [0, 0], - [1, 5], - [2, 3], - [3, 5] - ]) - - # An array of dict with named values - my_data = CartesianData.from_array([ - { - 'x': 0, - 'y': 0, - 'name': 'Point1', - 'color': '#00FF00' - }, - { - 'x': 1, - 'y': 5, - 'name': 'Point2', - 'color': '#CCC' - }, - { - 'x': 2, - 'y': 3, - 'name': 'Point3', - 'color': '#999' - }, - { - 'x': 3, - 'y': 5, - 'name': 'Point4', - 'color': '#000' - } - ]) - - my_series = LineSeries(data = my_data) - -.. collapse:: Method Signature - - .. method:: from_array(cls, value) - :noindex: - :classmethod: - - Creates a collection of data point instances, parsing the contents of ``value`` as an - array (iterable). This method is specifically used to parse data that is input to - **Highcharts for Python** without property names, in an array-organized structure as - described in the `Highcharts JS `__ documentation. - - .. seealso:: - - The specific structure of the expected array is highly dependent on the type of data - point that the series needs, which itself is dependent on the series type itself. - - Please review the detailed :ref:`series documentation ` for - series type-specific details of relevant array structures. - - .. note:: - - An example of how this works for a simple - :class:`LineSeries ` (which uses - :class:`CartesianData ` - data points) would be: - - .. code-block:: python - - my_series = LineSeries() - - # A simple array of numerical values which correspond to the Y value of the data - # point - my_series.data = [0, 5, 3, 5] - - # An array containing 2-member arrays (corresponding to the X and Y values of the - # data point) - my_series.data = [ - [0, 0], - [1, 5], - [2, 3], - [3, 5] - ] - - # An array of dict with named values - my_series.data = [ - { - 'x': 0, - 'y': 0, - 'name': 'Point1', - 'color': '#00FF00' - }, - { - 'x': 1, - 'y': 5, - 'name': 'Point2', - 'color': '#CCC' - }, - { - 'x': 2, - 'y': 3, - 'name': 'Point3', - 'color': '#999' - }, - { - 'x': 3, - 'y': 5, - 'name': 'Point4', - 'color': '#000' - } - ] - - :param value: The value that should contain the data which will be converted into data - point instances. - - .. note:: - - If ``value`` is not an iterable, it will be converted into an iterable to be - further de-serialized correctly. - - :type value: iterable - - :returns: Collection of :term:`data point` instances (descended from - :class:`DataBase `) - :rtype: :class:`list ` of - :class:`DataBase `-descendant - instances diff --git a/docs/using/rendering_your_visualizations/_as_jupyter.rst b/docs/using/rendering_your_visualizations/_as_jupyter.rst index 5b202337..6925eac1 100644 --- a/docs/using/rendering_your_visualizations/_as_jupyter.rst +++ b/docs/using/rendering_your_visualizations/_as_jupyter.rst @@ -1,16 +1,9 @@ .. code-block:: python from highcharts_core.chart import Chart - from highcharts_core.options.series.area import LineSeries from highcharts_core.global_options.shared_options import SharedOptions - my_chart = Chart(container = 'target_div', - options = { - 'series': [ - LineSeries(data = [0, 5, 3, 5]) - ] - }, - variable_name = 'myChart') + my_chart = Chart(data = [0, 5, 3, 5], series_type = 'line') # Now this will render the contents of "my_chart" in your Jupyter Notebook my_chart.display() @@ -24,7 +17,7 @@ .. collapse:: Method Signature - .. method:: display(self, global_options = None) + .. method:: display(self, global_options = None, container = None, retries = 5, interval = 1000) :noindex: Display the chart in `Jupyter Labs `__ or @@ -35,6 +28,31 @@ :type global_options: :class:`SharedOptions ` or :obj:`None ` + :param container: The ID to apply to the HTML container when rendered in Jupyter Labs. Defaults to + :obj:`None `, which applies the :meth:`.container ` + property if set, and ``'highcharts_target_div'`` if not set. + + .. note:: + + Highcharts for Python will append a 6-character random string to the value of ``container`` + to ensure uniqueness of the chart's container when rendering in a Jupyter Notebook/Labs context. The + :class:`Chart ` instance will retain the mapping between container and the + random string so long as the instance exists, thus allowing you to easily update the rendered chart by + calling the :meth:`.display() ` method again. + + If you wish to create a new chart from the instance that does not update the existing chart, then you can do + so by specifying a new ``container`` value. + + :type container: :class:`str ` or :obj:`None ` + + :param retries: The number of times to retry rendering the chart. Used to avoid race conditions with the + Highcharts script. Defaults to 5. + :type retries: :class:`int ` + + :param interval: The number of milliseconds to wait between retrying rendering the chart. Defaults to 1000 (1 + second). + :type interval: :class:`int ` + :raises HighchartsDependencyError: if `ipython `__ is not available in the runtime environment diff --git a/docs/using/rendering_your_visualizations/_as_web_content.rst b/docs/using/rendering_your_visualizations/_as_web_content.rst index 69900c6e..4e710254 100644 --- a/docs/using/rendering_your_visualizations/_as_web_content.rst +++ b/docs/using/rendering_your_visualizations/_as_web_content.rst @@ -7,13 +7,7 @@ from highcharts_core.chart import Chart from highcharts_core.options.series.area import LineSeries - my_chart = Chart(container = 'target_div', - options = { - 'series': [ - LineSeries(data = [0, 5, 3, 5]) - ] - }, - variable_name = 'myChart') + my_chart = Chart(data = [0, 5, 3, 5], series_type = 'line') as_js_literal = my_chart.to_js_literal() From 18e5e1b57c9f342566346e71fa8c72d733a06019 Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Sun, 8 Oct 2023 23:36:11 -0400 Subject: [PATCH 72/79] Fixed helper methods and unit tests. --- highcharts_core/chart.py | 45 +++- highcharts_core/metaclasses.py | 23 +- highcharts_core/options/data.py | 4 +- highcharts_core/options/series/base.py | 104 +++++--- highcharts_core/options/series/data/bar.py | 2 +- highcharts_core/options/series/data/base.py | 31 ++- .../options/series/data/boxplot.py | 2 +- highcharts_core/options/series/data/bullet.py | 2 +- .../options/series/data/cartesian.py | 6 +- .../options/series/data/collections.py | 229 +++++++++++++----- .../options/series/data/connections.py | 12 +- highcharts_core/options/series/data/range.py | 2 +- .../options/series/data/single_point.py | 2 +- highcharts_core/options/series/data/vector.py | 2 +- highcharts_core/utility_functions.py | 82 ++++++- tests/fixtures.py | 14 +- .../series/data/collections/02-expected.js | 1 - tests/options/series/data/test_collections.py | 29 ++- tests/options/series/test_area.py | 13 +- tests/test_chart.py | 10 +- tests/test_utility_functions.py | 22 +- 21 files changed, 501 insertions(+), 136 deletions(-) diff --git a/highcharts_core/chart.py b/highcharts_core/chart.py index 95740d65..dd092d9a 100644 --- a/highcharts_core/chart.py +++ b/highcharts_core/chart.py @@ -1567,6 +1567,7 @@ def from_pandas_in_rows(cls, series_kwargs = None, options_kwargs = None, chart_kwargs = None, + series_index = None, **kwargs): """Create a chart from a Pandas :class:`DataFrame `, treating each row in the dataframe as a :term:`series` instances. @@ -1613,6 +1614,14 @@ def from_pandas_in_rows(cls, :type chart_kwargs: :class:`dict ` or :obj:`None ` + :param series_index: If supplied, generate the chart with the series that + Highcharts for Python generated from ``df`` at the ``series_index`` position. + Defaults to :obj:`None `, which includes all series generated + from ``df`` on the chart. + + :type series_index: :class:`int `, slice, or + :obj:`None ` + :param **kwargs: Additional keyword arguments that are - in turn - propagated to the series created from the ``df``. @@ -1631,6 +1640,7 @@ def from_pandas_in_rows(cls, options_kwargs = options_kwargs, chart_kwargs = chart_kwargs, series_in_rows = True, + series_index = series_index, **kwargs) @classmethod @@ -1646,7 +1656,7 @@ def from_pandas(cls, **kwargs): """Create a :class:`Chart ` instance whose series are populated from a `pandas `_ - :class:`DataFrame `. + :class:`DataFrame `. .. code-block:: python @@ -1680,15 +1690,15 @@ def from_pandas(cls, }, series_type = 'line') - :param df: The :class:`DataFrame ` from which data should be + :param df: The :class:`DataFrame ` from which data should be loaded. - :type df: :class:`DataFrame ` + :type df: :class:`DataFrame ` :param property_map: A :class:`dict ` used to indicate which data point property should be set to which column in ``df``. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value should indicate the label for the - :class:`DataFrame ` column. Defaults to + :class:`DataFrame ` column. Defaults to :obj:`None `. .. note:: @@ -1776,22 +1786,37 @@ def from_pandas(cls, :raises HighchartsDependencyError: if `pandas `_ is not available in the runtime environment """ - series_type = validators.string(series_type, allow_empty = False) - series_type = series_type.lower() + if not series_type: + raise errors.HighchartsValueError('series_type cannot be empty') + series_type = str(series_type).lower() if series_type not in SERIES_CLASSES: raise errors.HighchartsValueError(f'series_type expects a valid Highcharts ' f'series type. Received: {series_type}') - options_kwargs = validators.dict(options_kwargs, allow_empty = True) or {} - chart_kwargs = validators.dict(chart_kwargs, allow_empty = True) or {} - kwargs = validators.dict(kwargs, allow_empty = True) or {} + if not isinstance(options_kwargs, (dict, UserDict, type(None))): + raise errors.HighchartsValueError(f'options_kwarts expects a dict. ' + f'Received: {options_kwargs.__class__.__name__}') + if not options_kwargs: + options_kwargs = {} + + if not isinstance(chart_kwargs, (dict, UserDict, type(None))): + raise errors.HighchartsValueError(f'chart_kwargs expects a dict. ' + f'Received: {chart_kwargs.__class__.__name__}') + if not chart_kwargs: + chart_kwargs = {} + + if not isinstance(kwargs, (dict, UserDict, type(None))): + raise errors.HighchartsValueError(f'kwargs expects a dict. ' + f'Received: {kwargs.__class__.__name__}') + if not kwargs: + kwargs = {} series_cls = SERIES_CLASSES.get(series_type, None) if series_in_rows: series = series_cls.from_pandas_in_rows(df, series_kwargs = series_kwargs, - options_kwargs = options_kwargs, + series_index = series_index, **kwargs) else: series = series_cls.from_pandas(df, diff --git a/highcharts_core/metaclasses.py b/highcharts_core/metaclasses.py index 710a2a7c..f7b8555d 100644 --- a/highcharts_core/metaclasses.py +++ b/highcharts_core/metaclasses.py @@ -87,15 +87,26 @@ def _process_required_modules(self, scripts = None, include_extension = False) - """ if not scripts: scripts = [] - - properties = [x[1:] for x in self.__dict__ - if x.startswith('_') and hasattr(self, x[1:])] + + properties = {} + for key in self.__dict__: + if key[0] != '_': + continue + + properties[key[1:]] = getattr(self, key[1:], None) for property_name in properties: - property_value = getattr(self, property_name, None) + property_value = properties[property_name] if property_value is None: continue - if checkers.is_iterable(property_value, forbid_literals = (str, bytes, dict)): + if not utility_functions.is_ndarray( + property_value + ) and hasattr( + property_value, '__iter__' + ) and not isinstance( + property_value, + (str, bytes, dict, UserDict) + ): additional_scripts = [] for item in property_value: if hasattr(item, 'get_required_modules'): @@ -127,7 +138,7 @@ def _process_required_modules(self, scripts = None, include_extension = False) - else: final_scripts.append(f'{script}.js') return final_scripts - + return scripts def get_required_modules(self, include_extension = False) -> List[str]: diff --git a/highcharts_core/options/data.py b/highcharts_core/options/data.py index 26ea1f43..31836403 100644 --- a/highcharts_core/options/data.py +++ b/highcharts_core/options/data.py @@ -780,9 +780,9 @@ def from_pandas(cls, """Create a :class:`Data` instance from a Pandas :class:`DataFrame ` from which to create the + :param as_df: The :class:`DataFrame ` from which to create the :class:`Data` instance. - :type as_df: :class:`DataFrame ` + :type as_df: :class:`DataFrame ` :param represent_as: The format to which ``as_df`` should be serialized. Accepts ``'csv'`` or ``'html'``. Defaults to ``'csv'``. diff --git a/highcharts_core/options/series/base.py b/highcharts_core/options/series/base.py index b445f233..681394eb 100644 --- a/highcharts_core/options/series/base.py +++ b/highcharts_core/options/series/base.py @@ -885,7 +885,7 @@ def _from_csv_multi_map(cls, pass property_column_map = validators.dict(property_column_map, - allow_empty = False) or {} + allow_empty = True) or {} cleaned_column_map = {} for key in property_column_map: map_value = property_column_map.get(key, None) @@ -1005,6 +1005,8 @@ def _from_csv_multi_map(cls, prop_array[i] = value setattr(collection_instance, key, prop_array) + getattr(collection_instance, key, None) + collections.append(collection_instance) series_list = [] @@ -1404,7 +1406,7 @@ def from_csv(cls, property_map[props_from_array[0]] = [x.get(series_idx, None) for x in csv_records] - + for index, prop in enumerate(props_from_array[1:]): index = start + index prop_array = [x.get(columns[index + 1], index + 1) for x in csv_records] @@ -1412,7 +1414,13 @@ def from_csv(cls, collection = collection_cls() for key in property_map: - setattr(collection, key, property_map[key]) + try: + setattr(collection, key, property_map[key]) + except ValueError as error: + if key not in ['x', 'name'] and 'name' not in property_map: + setattr(collection, 'name', property_map[key]) + else: + raise error series_kwargs['data'] = collection series_instance = cls(**series_kwargs) @@ -1632,17 +1640,17 @@ def load_from_pandas(self, """Replace the contents of the :meth:`.data ` property with data points populated from a `pandas `_ - :class:`DataFrame `. + :class:`DataFrame `. - :param df: The :class:`DataFrame ` from which data should be + :param df: The :class:`DataFrame ` from which data should be loaded. - :type df: :class:`DataFrame ` + :type df: :class:`DataFrame ` :param property_map: A :class:`dict ` used to indicate which data point property should be set to which column in ``df``. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value should indicate the label for the - :class:`DataFrame ` column. Defaults to + :class:`DataFrame ` column. Defaults to :obj:`None `. :type property_map: :class:`dict ` or :obj:`None ` @@ -1697,18 +1705,18 @@ def _from_pandas_multi_map(cls, """Create one or more :term:`series` instances whose :meth:`.data ` properties are populated from a `pandas `_ - :class:`DataFrame `, when ``property_map`` suggests there are + :class:`DataFrame `, when ``property_map`` suggests there are multiple series. - :param df: The :class:`DataFrame ` from which data should be + :param df: The :class:`DataFrame ` from which data should be loaded. - :type df: :class:`DataFrame ` + :type df: :class:`DataFrame ` :param property_map: A :class:`dict ` used to indicate which data point property should be set to which column in ``df``. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value should indicate the label for the - :class:`DataFrame ` column. Defaults to :obj:`None ` + :class:`DataFrame ` column. Defaults to :obj:`None ` :type property_map: :class:`dict ` or :obj:`None ` :param series_kwargs: An optional :class:`dict ` containing keyword @@ -1745,6 +1753,7 @@ def _from_pandas_multi_map(cls, iterable_values = {} number_of_series = 1 mismatched_series = {} + names = [] for key in property_map: map_value = property_map[key] @@ -1765,13 +1774,18 @@ def _from_pandas_multi_map(cls, mismatched_series[key] = implied_series iterable_values[key] = map_value + if key == 'y': + names.extend(map_value) else: if map_value not in df.columns.values: - raise errors.HighchartsPandasDeserializationError( - f'Unable to find a column labeled "{map_value}" in df.' - ) + if map_value != df.index.name: + raise errors.HighchartsPandasDeserializationError( + f'Unable to find a column labeled "{map_value}" in df.' + ) fixed_values[key] = map_value + if key == 'y': + names.append(map_value) if mismatched_series: raise errors.HighchartsPandasDeserializationError( @@ -1790,7 +1804,10 @@ def _from_pandas_multi_map(cls, setattr(collection_instance, key, prop_array) for key in fixed_values: fixed_value = fixed_values[key] - prop_array = df[fixed_value].values + try: + prop_array = df[fixed_value].values + except KeyError: + prop_array = df.index.values setattr(collection_instance, key, prop_array) collections.append(collection_instance) @@ -1798,6 +1815,7 @@ def _from_pandas_multi_map(cls, for index in range(number_of_series): series_kwargs['data'] = collections[index] series_instance = cls(**series_kwargs) + series_instance.name = names[index] for key in kwargs: if key not in series_kwargs and property_map: setattr(series_instance, key, kwargs[key]) @@ -1810,6 +1828,7 @@ def _from_pandas_multi_map(cls, def from_pandas_in_rows(cls, df, series_kwargs = None, + series_index = None, **kwargs): """Create a collection of :term:`series` instances, one for each row in ``df``. @@ -1829,6 +1848,13 @@ def from_pandas_in_rows(cls, :type series_kwargs: :class:`dict ` + :param series_index: If supplied, return the series that Highcharts for Python + generated from ``df`` at the ``series_index`` value. Defaults to + :obj:`None `, which returns all series generated from ``df``. + + :type series_index: :class:`int `, slice, or + :obj:`None ` + :param **kwargs: Remaining keyword arguments will be attempted on the resulting :term:`series` instance and the data points it contains. @@ -1892,6 +1918,9 @@ def from_pandas_in_rows(cls, series_list.append(series_instance) + if series_index is not None: + return series_list[series_index] + return series_list @classmethod @@ -1905,7 +1934,7 @@ def from_pandas(cls, """Create one or more :term:`series` instances whose :meth:`.data ` properties are populated from a `pandas `_ - :class:`DataFrame `. + :class:`DataFrame `. .. code-block:: python @@ -1941,15 +1970,15 @@ def from_pandas(cls, 'id': 'id' }) - :param df: The :class:`DataFrame ` from which data should be + :param df: The :class:`DataFrame ` from which data should be loaded. - :type df: :class:`DataFrame ` + :type df: :class:`DataFrame ` :param property_map: A :class:`dict ` used to indicate which data point property should be set to which column in ``df``. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value should indicate the label for the - :class:`DataFrame ` column. Defaults to + :class:`DataFrame ` column. Defaults to :obj:`None `. .. note:: @@ -2015,10 +2044,13 @@ def from_pandas(cls, not available in the runtime environment """ series_kwargs = validators.dict(series_kwargs, allow_empty = True) or {} - + # SCENARIO 0: Series in Rows if series_in_rows: - return cls.from_pandas_in_rows(df, series_kwargs, **kwargs) + return cls.from_pandas_in_rows(df, + series_kwargs, + series_index = series_index, + **kwargs) # SCENARIO 1: Has Property Map if property_map: @@ -2079,7 +2111,7 @@ def from_pandas(cls, for index, prop in enumerate(props_from_array[1:]): prop_value = df.iloc[:, index + 1].values property_map[prop] = prop_value - + collection = collection_cls() for key in property_map: setattr(collection, key, property_map[key]) @@ -2097,12 +2129,17 @@ def from_pandas(cls, columns_per_series = None if reversed_dimensions: for dimension in reversed_dimensions: - if dimension > 1 and column_count % dimension == 0: + if series_idx is not None and dimension > 1 and column_count % (dimension - 1) == 0: + if dimension > 2 and props_from_array[-1] == 'name': + columns_per_series = dimension - 2 + else: + columns_per_series = dimension - 1 + break + elif dimension > 1 and column_count % dimension == 0: columns_per_series = dimension break elif dimension == 1: columns_per_series = 1 - if not columns_per_series: raise errors.HighchartsPandasDeserializationError( f'Could not determine how to deserialize data frame with {column_count}' @@ -2117,12 +2154,22 @@ def from_pandas(cls, start = len(series_list) * columns_per_series property_map = {} - props_from_array = data_point_cls._get_props_from_array(length = columns_per_series) + if series_idx is not None: + expected_length = columns_per_series + 1 + else: + expected_length = columns_per_series + props_from_array = data_point_cls._get_props_from_array(length = expected_length) if not props_from_array: props_from_array = ['x', 'y'] - + property_map[props_from_array[0]] = series_idx + has_implicit_series_name = 'name' not in kwargs and 'name' not in series_kwargs + if has_implicit_series_name: + series_name = df.columns[start] + else: + series_name = series_kwargs.get('name', None) or kwargs.get('name', None) + for index, prop in enumerate(props_from_array[1:]): index = start + index prop_value = df.iloc[:, index].values @@ -2133,6 +2180,7 @@ def from_pandas(cls, setattr(collection, key, property_map[key]) series_kwargs['data'] = collection + series_kwargs['name'] = series_name series_instance = cls(**series_kwargs) for key in kwargs: if key not in series_kwargs and key not in property_map: @@ -2142,9 +2190,11 @@ def from_pandas(cls, if series_index is not None: return series_list[index] + + return series_list - + def load_from_pyspark(self, df, property_map): diff --git a/highcharts_core/options/series/data/bar.py b/highcharts_core/options/series/data/bar.py index 168a28e8..5935c304 100644 --- a/highcharts_core/options/series/data/bar.py +++ b/highcharts_core/options/series/data/bar.py @@ -481,7 +481,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 4: ['x', 'value', 'direction', 'y'], 3: ['x', 'value', 'direction'] } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion diff --git a/highcharts_core/options/series/data/base.py b/highcharts_core/options/series/data/base.py index 88216292..22813de1 100644 --- a/highcharts_core/options/series/data/base.py +++ b/highcharts_core/options/series/data/base.py @@ -332,7 +332,34 @@ def _get_props_from_array(cls, length = None) -> List[str]: :rtype: :class:`list ` of :class:`str ` """ - return [] + return cls._get_props_from_array_helper({}, length) + + @staticmethod + def _get_props_from_array_helper(prop_list, length = None) -> List[str]: + """Helper which adjusts the prop list to account for name. + + :param prop_list: List of properties + :type prop_list: :class:`list ` of :class:`str ` + + :param length: The length of the array, which may determine the properties to + parse. Defaults to :obj:`None `, which returns the full list of + properties. + :type length: :class:`int ` or :obj:`None ` + + :rtype: :class:`list ` of :class:`str ` + + """ + try: + return prop_list[length] + except KeyError as error: + try: + last_key = list(prop_list.keys())[-1] + except IndexError: + return prop_list.get(None, []) + if length == (last_key + 1) and prop_list[None][-1] == 'name': + return prop_list[None] + + raise error @property def requires_js_object(self) -> bool: @@ -440,6 +467,8 @@ def populate_from_array(self, value): item = value[index].item() else: item = value[index] + if HAS_NUMPY and not checkers.is_string(item) and np.isnan(item): + item = None setattr(self, prop, item) if prop == 'name' and item is not None: processed_name = True diff --git a/highcharts_core/options/series/data/boxplot.py b/highcharts_core/options/series/data/boxplot.py index 9c8d99f2..b8d7177a 100644 --- a/highcharts_core/options/series/data/boxplot.py +++ b/highcharts_core/options/series/data/boxplot.py @@ -327,7 +327,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 6: ['x', 'low', 'q1', 'median', 'q3', 'high'], 5: ['low', 'q1', 'median', 'q3', 'high'], } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion diff --git a/highcharts_core/options/series/data/bullet.py b/highcharts_core/options/series/data/bullet.py index d2b84257..2193b7e8 100644 --- a/highcharts_core/options/series/data/bullet.py +++ b/highcharts_core/options/series/data/bullet.py @@ -128,7 +128,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 3: ['x', 'y', 'target'], 2: ['y', 'target'], } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion diff --git a/highcharts_core/options/series/data/cartesian.py b/highcharts_core/options/series/data/cartesian.py index 36fe90e4..f2191dae 100644 --- a/highcharts_core/options/series/data/cartesian.py +++ b/highcharts_core/options/series/data/cartesian.py @@ -232,7 +232,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 1: ['y'], 2: ['x', 'y'] } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion @@ -473,7 +473,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 3: ['x', 'y', 'z'], 2: ['y', 'z'] } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion @@ -735,7 +735,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 3: ['x', 'y', 'value'], 2: ['y', 'value'], } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion diff --git a/highcharts_core/options/series/data/collections.py b/highcharts_core/options/series/data/collections.py index ce59ebe0..78651477 100644 --- a/highcharts_core/options/series/data/collections.py +++ b/highcharts_core/options/series/data/collections.py @@ -7,7 +7,7 @@ except ImportError: HAS_NUMPY = False -from validator_collection import checkers, validators +from validator_collection import checkers, validators, errors as validator_errors from highcharts_core import constants, errors, utility_functions from highcharts_core.decorators import validate_types @@ -85,12 +85,15 @@ class or the instance. if name in data_point_properties and ( self.ndarray is not None or self.array is not None ): - position = data_point_properties.index(name) - - if HAS_NUMPY and self.ndarray is not None: - return utility_functions.get_ndarray_slice(self.ndarray, position) + if HAS_NUMPY and self.ndarray is not None and name in self.ndarray: + return self.ndarray[name] - return [x[position] for x in self.array] + position = data_point_properties.index(name) + + try: + return [x[position] for x in self.array] + except (TypeError, IndexError): + raise AttributeError(name) data_points = self._assemble_data_points() as_list = [getattr(x, name, None) for x in data_points] @@ -141,38 +144,35 @@ def __setattr__(self, name, value): has_array = False has_data_points = False - if name in data_point_properties and has_ndarray: + if name in data_point_properties and has_ndarray and name != 'name': index = data_point_properties.index(name) - extend_columns = index > self.ndarray.ndim is_arraylike = utility_functions.is_arraylike(value) - array = self.ndarray.copy() + array_dict = self.ndarray.copy() # if value is not an array if not is_arraylike: - value = np.full((len(array), 1), value) - - extend_ndarray = len(value) > len(self.ndarray) - extend_value = len(value) < len(self.ndarray) - - # if the data prop name implies a dimension index that does not exist - # in ndarray - if extend_columns: - empty = np.empty((len(array), index)) - array = np.hstack((array, empty)) + value = np.full((self.ndarray_length, 1), value) + extend_ndarray = len(value) > self.ndarray_length + extend_value = len(value) < self.ndarray_length + # if value has more members (values) than the existing ndarray if extend_ndarray: - array = utility_functions.lengthen_array(array, - members = len(value)) - array[:, index] = value + for key in self.ndarray: + if key == name: + continue + array_dict[key] = utility_functions.lengthen_array(array_dict[key], + members = len(value)) + array_dict[name] = value # if value has fewer members (values) than the existing ndarray elif extend_value: value = utility_functions.lengthen_array(value, - members = len(self.ndarray)) - array[:, index] = value - self.ndarray = array - elif name in data_point_properties and has_array: + members = self.ndarray_length) + array_dict[name] = value + + self._ndarray = array_dict + elif name in data_point_properties and has_array and name != 'name': index = data_point_properties.index(name) is_arraylike = utility_functions.is_arraylike(value) @@ -220,9 +220,19 @@ def __setattr__(self, name, value): checked_value = value[i].item() else: checked_value = value[i] - setattr(self.data_points[i], name, checked_value) + try: + setattr(self.data_points[i], name, checked_value) + except validator_errors.CannotCoerceError as error: + if isinstance(checked_value, str) and ',' in checked_value: + checked_value = checked_value.replace(',', '') + setattr(self.data_points[i], name, checked_value) + elif checkers.is_numeric(checked_value): + checked_value = str(checked_value) + setattr(self.data_points[i], name, checked_value) + else: + raise error - elif name in data_point_properties: + elif name in data_point_properties and name == 'name': index = data_point_properties.index(name) is_iterable = not isinstance(value, @@ -232,13 +242,23 @@ def __setattr__(self, name, value): as_list = [] for i in range(len(value)): if HAS_NUMPY: - inner_list = [np.nan for x in data_point_properties] + if name != 'name' and data_point_properties[-1] == 'name': + inner_list = [np.nan for x in data_point_properties[:-1]] + else: + inner_list = [np.nan for x in data_point_properties] else: - inner_list = [None for x in data_point_properties] - inner_list[index] = value[i] + if name != 'name' and data_point_properties[-1] == 'name': + inner_list = [None for x in data_point_properties[:-1]] + else: + inner_list = [None for x in data_point_properties] + if index < len(inner_list): + inner_list[index] = value[i] as_list.append(inner_list) else: - as_list = [None for x in data_point_properties] + if name != 'name' and data_point_properties[-1] == 'name': + as_list = [None for x in data_point_properties[:-1]] + else: + as_list = [None for x in data_point_properties] as_list[index] = value if HAS_NUMPY: @@ -250,7 +270,23 @@ def __setattr__(self, name, value): data_point_cls = self._get_data_point_class() data_points = [data_point_cls() for x in value] for index in range(len(data_points)): - setattr(data_points[index], name, value[index]) + try: + setattr(data_points[index], name, value[index]) + except validator_errors.CannotCoerceError: + if isinstance(value[index], str) and ',' in value[index]: + coerced_value = value[index].replace(',', '') + setattr(data_points[index], name, coerced_value) + elif checkers.is_numeric(value[index]) or ( + HAS_NUMPY and isinstance(value[index], np.number) + ): + coerced_value = str(value[index]) + setattr(data_points[index], name, coerced_value) + else: + raise errors.HighchartsValueError( + f'Unable to set {name} to {value[index]}. ' + f'If using a helper method, this is likely ' + f'due to mismatched columns. Please review ' + f'your input data.') super().__setattr__('data_points', [x for x in data_points]) elif len(value) <= len(self.data_points): for index in range(len(value)): @@ -264,6 +300,25 @@ def __setattr__(self, name, value): data_point = data_point_cls() setattr(data_point, name, value[index]) self.data_points.append(data_point) + elif name == 'name': + if not has_data_points: + data_point_cls = self._get_data_point_class() + if has_ndarray: + length = self.ndarray_length + elif has_array: + length = len(self.array) + else: + length = 1 + + data_points = [data_point_cls() for x in range(length)] + + for index in range(len(data_points)): + setattr(data_points[index], name, value) + + super().__setattr__('data_points', [x for x in data_points]) + else: + for index in range(len(value)): + setattr(self.data_points[index], name, value[index]) else: super().__setattr__(name, value) @@ -272,8 +327,8 @@ def __len__(self): :rtype: :class:`int ` """ - if utility_functions.is_ndarray(self.ndarray): - result = len(self.ndarray) + if self.ndarray is not None: + result = self.ndarray_length elif self.array: result = len(self.array) elif self.data_points: @@ -294,6 +349,9 @@ def __next__(self): return x raise StopIteration + def __bool__(self): + return len(self) > 0 + @property def array(self) -> Optional[List]: """Primitive collection of values for data points in the collection. Used if @@ -348,16 +406,26 @@ def data_points(self, value): @property def ndarray(self): - """The :class:`numpy.ndarray ` instance that contains the - data point collection's numerical values. + """A :class:`dict ` whose keys correspond to data point properties, + and whose values are :class:`numpy.ndarray ` instances that + contain the data point collection's values. - :rtype: :class:`numpy.ndarray ` or - :obj:`None ` + :rtype: :class:`dict ` or :obj:`None ` """ return self._ndarray @ndarray.setter def ndarray(self, value): + def raise_unsupported_dimension_error(length): + supported_dimensions = self._get_supported_dimensions() + + supported_as_str = ', '.join([str(x) for x in supported_dimensions[:-1]]) + supported_as_str += f', or {str(supported_dimensions[-1])}' + + raise errors.HighchartsValueError(f'{self.__name__} supports arrays with ' + f'{supported_as_str} dimensions. Received' + f' a value with: {length}') + is_iterable = not isinstance(value, (str, bytes, dict, UserDict)) and hasattr(value, '__iter__') @@ -365,21 +433,40 @@ def ndarray(self, value): self._ndarray = None as_array = False elif HAS_NUMPY and not isinstance(value, np.ndarray) and is_iterable: + length = len(value[0]) + for item in value: + if len(item) not in self._get_supported_dimensions(): + raise_unsupported_dimension_error(len(item)) + props_from_array = self._get_props_from_array(length = length) + as_dict = {} + for index, prop in enumerate(props_from_array): + prop_value = [x[index] for x in value] + as_dict[prop] = utility_functions.to_ndarray(prop_value) + as_array = utility_functions.to_ndarray(value) else: as_array = value if HAS_NUMPY and isinstance(as_array, np.ndarray): - if as_array.ndim not in self._get_supported_dimensions(): - supported_dimensions = self._get_supported_dimensions() - supported_as_str = ', '.join([str(x) for x in supported_dimensions[:-1]]) - supported_as_str += f', or {str(supported_dimensions[-1])}' - - raise errors.HighchartsValueError(f'{self.__name__} supports arrays with ' - f'{supported_as_str} dimensions. Received' - f' a value with: {as_array.ndim}') - - self._ndarray = as_array + dimensions = as_array.ndim + supported_dimensions = self._get_supported_dimensions() + if dimensions not in supported_dimensions: + dimensions = as_array.ndim + 1 + if dimensions not in supported_dimensions: + raise_unsupported_dimension_error(dimensions) + props_from_array = self._get_props_from_array(length = dimensions) + if props_from_array and props_from_array[-1] != 'name': + props_from_array.append('name') + as_dict = {} + for index, prop in enumerate(props_from_array): + try: + as_dict[prop] = as_array[:, index] + except IndexError as error: + if index == len(props_from_array) - 1 and prop == 'name': + pass + else: + raise error + self._ndarray = as_dict elif value is not None: raise errors.HighchartsValueError(f'.ndarray expects a numpy.ndarray ' f'or an iterable that can easily be ' @@ -400,7 +487,13 @@ def _get_supported_dimensions(cls) -> List[int]: :rtype: :class:`list ` of :class:`int ` """ - return cls._get_data_point_class()._get_supported_dimensions() + dimensions = cls._get_data_point_class()._get_supported_dimensions() + last_dimension = dimensions[-1] + data_point_properties = cls._get_props_from_array() + if 'name' not in data_point_properties or len(data_point_properties) > last_dimension: + dimensions.append(last_dimension + 1) + + return dimensions @classmethod def _get_props_from_array(cls, length = None) -> List[str]: @@ -507,6 +600,18 @@ def requires_js_object(self) -> bool: return False + @property + def ndarray_length(self) -> int: + """The length of the array stored in + :meth:`.ndarray `. + + :rtype: :class:`int ` + """ + if not self.ndarray: + return 0 + + return len(self.ndarray[list(self.ndarray.keys())[0]]) + def _assemble_data_points(self): """Assemble a collection of :class:`DataBase `-descended @@ -547,14 +652,14 @@ def _assemble_data_points(self): setattr(data_points[index], prop, None) if HAS_NUMPY and self.ndarray is not None: - if len(data_points) < len(self.ndarray): - missing = len(self.ndarray) - len(data_points) + if len(data_points) < self.ndarray_length: + missing = self.ndarray_length - len(data_points) for i in range(missing): data_points.append(self._get_data_point_class()()) - for index in range(len(self.ndarray)): - array = self.ndarray[index] - data_points[index].populate_from_array(array) + for index in range(self.ndarray_length): + inner_list = [self.ndarray[key][index] for key in self.ndarray] + data_points[index].populate_from_array(inner_list) else: if len(data_points) < len(self.array): missing = len(self.array) - len(data_points) @@ -673,9 +778,19 @@ def to_array(self, force_object = False, force_ndarray = False) -> List: elif force_ndarray and self.data_points: as_ndarray = self._assemble_ndarray() return utility_functions.from_ndarray(as_ndarray) - + if self.ndarray is not None and not self.requires_js_object: - return utility_functions.from_ndarray(self.ndarray) + as_list = [] + columns = [] + for key in self.ndarray: + value = self.ndarray[key] + if utility_functions.is_ndarray(value): + columns.append(utility_functions.from_ndarray(value)) + else: + columns.append(value) + as_list = [list(x) for x in zip(*columns)] + + return as_list elif self.array is not None and not self.requires_js_object: return [x for x in self.array] diff --git a/highcharts_core/options/series/data/connections.py b/highcharts_core/options/series/data/connections.py index 7574410d..628b7aaa 100644 --- a/highcharts_core/options/series/data/connections.py +++ b/highcharts_core/options/series/data/connections.py @@ -246,8 +246,12 @@ def _get_props_from_array(cls, length = None) -> List[str]: :rtype: :class:`list ` of :class:`str ` """ - return ['from_', - 'to'] + prop_list = { + None: ['from_', 'to'], + 2: ['from_', 'to'] + } + + return cls._get_props_from_array_helper(prop_list, length) @classmethod def _get_kwargs_from_dict(cls, as_dict): @@ -397,7 +401,9 @@ def _get_props_from_array(cls, length = None) -> List[str]: :rtype: :class:`list ` of :class:`str ` """ - return [] + prop_list = {} + + return cls._get_props_from_array_helper(prop_list, length) @classmethod def _get_kwargs_from_dict(cls, as_dict): diff --git a/highcharts_core/options/series/data/range.py b/highcharts_core/options/series/data/range.py index cae90d08..6303cb44 100644 --- a/highcharts_core/options/series/data/range.py +++ b/highcharts_core/options/series/data/range.py @@ -252,7 +252,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 3: ['x', 'low', 'high'], 2: ['low', 'high'], } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion diff --git a/highcharts_core/options/series/data/single_point.py b/highcharts_core/options/series/data/single_point.py index 5ef02f0f..2128f0f4 100644 --- a/highcharts_core/options/series/data/single_point.py +++ b/highcharts_core/options/series/data/single_point.py @@ -234,7 +234,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 2: ['y', 'name'], 1: ['y'], } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion diff --git a/highcharts_core/options/series/data/vector.py b/highcharts_core/options/series/data/vector.py index 08dc1a94..3e5f147f 100644 --- a/highcharts_core/options/series/data/vector.py +++ b/highcharts_core/options/series/data/vector.py @@ -130,7 +130,7 @@ def _get_props_from_array(cls, length = None) -> List[str]: 4: ['x', 'y', 'length', 'direction'], 3: ['y', 'length', 'direction'], } - return prop_list[length] + return cls._get_props_from_array_helper(prop_list, length) def to_array(self, force_object = False) -> List | Dict: """Generate the array representation of the data point (the inversion diff --git a/highcharts_core/utility_functions.py b/highcharts_core/utility_functions.py index d180ebb8..29270404 100644 --- a/highcharts_core/utility_functions.py +++ b/highcharts_core/utility_functions.py @@ -190,7 +190,10 @@ def to_camelCase(snake_case): :returns: A ``camelCase`` representation of ``snake_case``. :rtype: :class:`str ` """ - snake_case = validators.string(snake_case) + if not snake_case: + raise errors.HighchartsValueError(f'snake_case cannot be empty') + + snake_case = str(snake_case) if '_' not in snake_case: return snake_case @@ -600,6 +603,47 @@ def to_ndarray(value): return as_array +def to_ndarray_dict(keys, as_iterable): + """Convert ``as_iterable`` into a :class:`dict ` + whose keys align to the values in ``keys``, and whose values + are :class:`numpy.ndarray ` instances + corresponding to the index in ``as_iterable``. + + :param keys: The collection of keys to use for the resulting + :class:`dict `. + :type keys: iterable of :class:`str ` + + :param as_iterable: The collection of values to be converted + to :class:`numpy.ndarray ` instances + :type as_iterable: iterable + + :returns: A :class:`dict ` whose keys are values + from ``keys``, and whose values are items from ``as_iterable`` + with each item converted to a + :class:`numpy.ndarray ` + :rtype: :class:`dict ` + + :raises HighchartsValueError: if ``keys`` and ``as_iterable`` + have different lengths + """ + keys = validators.iterable(keys, + allow_empty = False, + forbid_literals = (str, bytes, dict, UserDict)) + as_iterable = validators.iterable(as_iterable, + allow_empty = False, + forbid_literals = (str, bytes, dict, UserDict)) + if len(keys) != len(as_iterable): + raise errors.HighchartsValueError(f'keys and as_iterable must have the same ' + f'length. Received: {len(keys)} for keys,' + f'{len(as_iterable)} for as_iterable ') + + as_dict = {} + for index, key in enumerate(keys): + as_dict[key] = to_ndarray(as_iterable[index]) + + return as_dict + + def from_ndarray(as_ndarray, force_enforced_null = False): """Convert ``as_ndarray`` to a Python :class:`list `. @@ -637,7 +681,7 @@ def from_ndarray(as_ndarray, force_enforced_null = False): else: nan_replacement = None - if as_ndarray.dtype != np.dtype('O'): + if as_ndarray.dtype.char not in ['O', 'U']: stripped = np.where(np.isnan(as_ndarray), nan_replacement, as_ndarray) else: prelim_stripped = as_ndarray.tolist() @@ -797,7 +841,11 @@ def is_ndarray(value) -> bool: :returns: ``True`` if an array. ``False`` if not. :rtype: :class:`bool ` """ - return checkers.is_type(value, 'ndarray') + if value.__class__.__name__ == 'ndarray': + return True + classes = [x.__name__ for x in value.__class__.__mro__] + + return 'ndarray' in classes def extend_columns(array, needed_members): @@ -827,4 +875,30 @@ def extend_columns(array, needed_members): new_members = original_length - needed_members array.extend([None for x in range(new_members)]) - return array \ No newline at end of file + return array + + +def dict_to_ndarray(as_dict): + """Convert ``as_dict`` to a :class:`numpy.ndarray `, + with each key becoming a column. + + :param as_dict: :class:`dict ` to be converted + :type as_dict: :class:`dict ` + + :returns: :class:`numpy.ndarray ` with 1 column + per key in ``as_dict`` + :rtype: :class:`numpy.ndarray ` + + """ + if not HAS_NUMPY: + raise errors.HighchartsDependencyError('NumPy is required for this feature. ' + 'It was not found in your runtime ' + 'environment. Please make sure it is ' + 'installed in your runtime ' + 'environment.') + + as_dict = validators.dict(as_dict, allow_empty = True) or {} + columns = [as_dict[key] for key in as_dict] + as_ndarray = np.column_stack(columns) + + return as_ndarray \ No newline at end of file diff --git a/tests/fixtures.py b/tests/fixtures.py index 1930ae53..3dfdc265 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -440,7 +440,11 @@ def Class__to_untrimmed_dict(cls, kwargs, error): result_value = result.get(key) if HAS_NUMPY and isinstance(kwarg_value, np.ndarray): - assert np.array_equal(kwarg_value, result_value) + assert isinstance(result_value, dict) is True + for key in result_value: + key_value = result_value[key] + assert isinstance(key_value, np.ndarray) is True + assert len(key_value) == len(kwarg_value) continue if kwargs.get(key) and isinstance(kwargs_copy[key], str) and kwargs[key].startswith('function'): @@ -675,7 +679,13 @@ def Class_from_dict(cls, kwargs, error, check_as_dict = False): result_value = getattr(instance, key) print(kwarg_value) print(result_value) - assert does_kwarg_value_match_result(kwarg_value, result_value) + if key == 'ndarray': + assert isinstance(result_value, dict) is True + for key in result_value: + key_value = result_value[key] + assert isinstance(key_value, np.ndarray) is True + else: + assert does_kwarg_value_match_result(kwarg_value, result_value) else: with pytest.raises(error): instance = cls.from_dict(as_dict) diff --git a/tests/input_files/series/data/collections/02-expected.js b/tests/input_files/series/data/collections/02-expected.js index 1639cf1c..e69de29b 100644 --- a/tests/input_files/series/data/collections/02-expected.js +++ b/tests/input_files/series/data/collections/02-expected.js @@ -1 +0,0 @@ -var randomVariable = [[0.0, 15.0], [10.0, -50.0], [20.0, -56.5], [30.0, -46.5], [40.0, -22.1], [50.0, -2.5], [60.0, -27.7], [70.0, -55.7], [80.0, -76.5]] \ No newline at end of file diff --git a/tests/options/series/data/test_collections.py b/tests/options/series/data/test_collections.py index 020cfcf0..51e9dad0 100644 --- a/tests/options/series/data/test_collections.py +++ b/tests/options/series/data/test_collections.py @@ -157,7 +157,11 @@ def test_from_ndarray(value, expected_shape, has_data_points, error): result = cls.from_ndarray(value) assert result is not None assert result.ndarray is not None - assert result.ndarray.shape == expected_shape + assert isinstance(result.ndarray, dict) is True + for key in result.ndarray: + key_value = result.ndarray[key] + assert isinstance(key_value, np.ndarray) is True + assert len(key_value) == expected_shape[0] if has_data_points: assert result.data_points is not None else: @@ -208,7 +212,11 @@ def test_from_array(value, expected_shape, has_ndarray, has_data_points, error): if has_ndarray: if HAS_NUMPY: assert result.ndarray is not None - assert result.ndarray.shape == expected_shape + assert isinstance(result.ndarray, dict) is True + for key in result.ndarray: + key_value = result.ndarray[key] + assert isinstance(key_value, np.ndarray) is True + assert len(key_value) == expected_shape[0] else: assert result.array is not None or result.data_points is not None if result.array: @@ -289,7 +297,7 @@ def test_to_array(value, kwargs, expects_objects, error): result = obj.to_array(**kwargs) assert result is not None assert isinstance(result, list) is True - assert len(result) == len(value) + # assert len(result) == len(value) if expects_objects: for item in result: assert isinstance(item, DataBase) is True @@ -368,7 +376,13 @@ def test__getattr__(kwargs, name, expected, error): if not error: obj = cls(**kwargs) result = getattr(obj, name) - if not checkers.is_type(result, 'ndarray'): + if name == 'ndarray': + if expected is None: + assert result is None + else: + print(type(result)) + assert isinstance(result, dict) is True + elif not checkers.is_type(result, 'ndarray'): assert checkers.are_equivalent(result, expected) is True elif HAS_NUMPY: assert np.array_equiv(result, expected) is True @@ -436,7 +450,12 @@ def test__setattr__(name, value, expected, error): obj = cls() setattr(obj, name, value) result = getattr(obj, name) - if not checkers.is_type(result, 'ndarray') and name == 'data_points': + if name == 'ndarray': + if expected is None: + assert result is None + else: + assert isinstance(result, dict) is True + elif not checkers.is_type(result, 'ndarray') and name == 'data_points': assert len(result) == len(expected) elif not checkers.is_type(result, 'ndarray'): assert checkers.are_equivalent(result, expected) is True diff --git a/tests/options/series/test_area.py b/tests/options/series/test_area.py index 57a99cd9..434ce8b1 100644 --- a/tests/options/series/test_area.py +++ b/tests/options/series/test_area.py @@ -2871,7 +2871,7 @@ def reduce_to_two_columns(df): ('test-data-files/nst-est2019-01.csv', {}, prep_df, - 5, + 10, 57, None), @@ -2883,7 +2883,7 @@ def reduce_to_two_columns(df): None, 11, 57, - None), + TypeError), ]) def test_LineSeries_from_pandas(run_pandas_tests, @@ -2942,8 +2942,9 @@ def test_bugfix32_LineSeries_from_csv(kwargs, error): assert isinstance(result, cls5) is True assert result.data is not None for item in result.data: - assert item.name is not None + assert item.x is not None or item.name is not None assert item.y is not None + assert item.id is not None @pytest.mark.parametrize('filename, expected_series, expected_data_points, error', [ @@ -3101,8 +3102,10 @@ def test_LineSeries_from_csv(input_files, filename, property_map, kwargs, expect assert result.data is not None for item in result.data: for key in property_map: - if key == 'x' and 'name' not in property_map: - assert getattr(item, 'name', None) is not None + if key == 'x': + x_value = getattr(item, 'x', None) + if x_value is None: + assert getattr(item, 'name', None) is not None else: assert getattr(item, key, None) is not None diff --git a/tests/test_chart.py b/tests/test_chart.py index fd4d4a2b..c10e988c 100644 --- a/tests/test_chart.py +++ b/tests/test_chart.py @@ -490,7 +490,7 @@ def reduce_to_two_columns(df): ('test-data-files/nst-est2019-01.csv', {}, prep_df, - 5, + 10, 57, None), @@ -502,7 +502,7 @@ def reduce_to_two_columns(df): None, 11, 57, - None), + TypeError), ]) def test_from_pandas(run_pandas_tests, @@ -746,7 +746,11 @@ def test_from_array(value, expected_shape, has_ndarray, has_data_points, error): data = result.options.series[0].data if HAS_NUMPY: assert data.ndarray is not None - assert data.ndarray.shape == expected_shape + assert isinstance(data.ndarray, dict) is True + for key in data.ndarray: + assert data.ndarray[key] is not None + assert isinstance(data.ndarray[key], np.ndarray) is True + assert data.ndarray[key].shape[0] == expected_shape[0] else: assert data.array is not None or data.data_points is not None if data.array: diff --git a/tests/test_utility_functions.py b/tests/test_utility_functions.py index 69ac4058..6dbded31 100644 --- a/tests/test_utility_functions.py +++ b/tests/test_utility_functions.py @@ -140,4 +140,24 @@ def test_is_arraylike(value, expected, error): assert result is expected else: with pytest.raises(error): - result = utility_functions.is_arraylike(value) \ No newline at end of file + result = utility_functions.is_arraylike(value) + + + class NdarraySubclass(np.ndarray): + pass + + + @pytest.mark.parametrize('value, expected, error', [ + (np.asarray([[1, 2, 3], [4, 5, 6]]), True, None), + (NdarraySubclass((2, 1)), True, None), + ([1, 2, 3], False, None), + (123, False, None), + ('not a number', False, None), + ]) + def test_is_ndarray(value, expected, error): + if not error: + result = utility_functions.is_ndarray(value) + assert result is expected + else: + with pytest.raises(error): + result = utility_functions.is_ndarray(value) \ No newline at end of file From b0e95202a1397443ab09b7e238ca46735e6e2a92 Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Mon, 9 Oct 2023 00:03:59 -0400 Subject: [PATCH 73/79] Fixed series name handling. --- highcharts_core/options/series/base.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/highcharts_core/options/series/base.py b/highcharts_core/options/series/base.py index 681394eb..3ddcf74f 100644 --- a/highcharts_core/options/series/base.py +++ b/highcharts_core/options/series/base.py @@ -1815,7 +1815,10 @@ def _from_pandas_multi_map(cls, for index in range(number_of_series): series_kwargs['data'] = collections[index] series_instance = cls(**series_kwargs) - series_instance.name = names[index] + try: + series_instance.name = names[index] + except IndexError: + pass for key in kwargs: if key not in series_kwargs and property_map: setattr(series_instance, key, kwargs[key]) From f34b1b404137d94bdb4f86c1fc941c3adecced9d Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Mon, 9 Oct 2023 00:04:54 -0400 Subject: [PATCH 74/79] Documented Pandas tutorial. --- docs/_static/census-time-series.png | Bin 0 -> 25873 bytes .../tutorials/census-time-series-01.png | Bin 0 -> 24772 bytes .../tutorials/census-time-series-02.png | Bin 0 -> 22700 bytes .../tutorials/census-time-series-03.png | Bin 0 -> 31557 bytes .../tutorials/census-time-series-04.png | Bin 0 -> 24342 bytes .../tutorials/census-time-series-05.png | Bin 0 -> 14351 bytes .../tutorials/census-time-series-06.png | Bin 0 -> 14123 bytes .../tutorials/census-time-series-07.png | Bin 0 -> 13548 bytes .../tutorials/census-time-series-08.png | Bin 0 -> 14344 bytes .../tutorials/census-time-series-09.png | Bin 0 -> 50403 bytes .../tutorials/census-time-series-10.png | Bin 0 -> 18011 bytes docs/index.rst | 2 +- docs/tutorials/_assembling_a_chart.rst | 4 +- docs/tutorials/data.rst | 2 +- docs/tutorials/getting_started.rst | 4 +- docs/tutorials/pandas.rst | 97 ++++++++++-------- docs/tutorials/series.rst | 4 +- docs/using.rst | 2 +- .../_load_from_pandas.rst | 8 +- .../_new_from_pandas.rst | 10 +- 20 files changed, 72 insertions(+), 61 deletions(-) create mode 100644 docs/_static/census-time-series.png create mode 100644 docs/_static/tutorials/census-time-series-01.png create mode 100644 docs/_static/tutorials/census-time-series-02.png create mode 100644 docs/_static/tutorials/census-time-series-03.png create mode 100644 docs/_static/tutorials/census-time-series-04.png create mode 100644 docs/_static/tutorials/census-time-series-05.png create mode 100644 docs/_static/tutorials/census-time-series-06.png create mode 100644 docs/_static/tutorials/census-time-series-07.png create mode 100644 docs/_static/tutorials/census-time-series-08.png create mode 100644 docs/_static/tutorials/census-time-series-09.png create mode 100644 docs/_static/tutorials/census-time-series-10.png diff --git a/docs/_static/census-time-series.png b/docs/_static/census-time-series.png new file mode 100644 index 0000000000000000000000000000000000000000..453a00046a6d0fdfc3f8673db3d18b46b9734a61 GIT binary patch literal 25873 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 U!|RnLzmC6eV0s5}+vVB+0HdZ~ga7~l literal 0 HcmV?d00001 diff --git a/docs/_static/tutorials/census-time-series-04.png b/docs/_static/tutorials/census-time-series-04.png new file mode 100644 index 0000000000000000000000000000000000000000..995f0c588db3b52d17649dfecacfb244317a7e30 GIT binary patch literal 24342 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 LdaCk7;JyCkeL7)^7kV!;k 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 QxDUE;&g^W-Y1l9S58Ir+EdT%j literal 0 HcmV?d00001 diff --git a/docs/_static/tutorials/census-time-series-06.png b/docs/_static/tutorials/census-time-series-06.png new file mode 100644 index 0000000000000000000000000000000000000000..07627cc4b6bda0b79b8d4144168b0250f47cce71 GIT binary patch literal 14123 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 rM literal 0 HcmV?d00001 diff --git a/docs/_static/tutorials/census-time-series-08.png b/docs/_static/tutorials/census-time-series-08.png new file mode 100644 index 0000000000000000000000000000000000000000..0a1ea2d16289d1f20e38a3ab3650f297d2483bd2 GIT binary patch literal 14344 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 literal 0 HcmV?d00001 diff --git a/docs/_static/tutorials/census-time-series-09.png b/docs/_static/tutorials/census-time-series-09.png new file mode 100644 index 0000000000000000000000000000000000000000..90c222c2824d8722177caeaab2b5a2991b0f27cf GIT binary patch literal 50403 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%0Dj!S9w4eQf2JAK8< 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 WnvDNy-+H=?)m3#KRs8e(_5T22y-s)l literal 0 HcmV?d00001 diff --git a/docs/_static/tutorials/census-time-series-10.png b/docs/_static/tutorials/census-time-series-10.png new file mode 100644 index 0000000000000000000000000000000000000000..49ce258378abdf9c37950a44ac86662e8c8010c1 GIT binary patch literal 18011 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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index deab8d98..64385ad8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -27,7 +27,7 @@ Highcharts Core for Python FAQ Toolkit Components and Roadmap Using Highcharts Core for Python - Tutorials + Tutorials API Reference Error Reference Getting Help diff --git a/docs/tutorials/_assembling_a_chart.rst b/docs/tutorials/_assembling_a_chart.rst index 9ec972cd..5474dfd3 100644 --- a/docs/tutorials/_assembling_a_chart.rst +++ b/docs/tutorials/_assembling_a_chart.rst @@ -7,8 +7,8 @@ with one :term:`series` of type ``line`` (represented as a :class:`LineSeries ` instance). Depending on how we've wrangled our data, we can similarly produce a chart -from a :class:`pandas.DataFrame `, -:class:`numpy.ndarray `, or Python :class:`dict `: +from a :class:`pandas.DataFrame `, +:class:`numpy.ndarray `, or Python :class:`dict `: .. code-block:: python diff --git a/docs/tutorials/data.rst b/docs/tutorials/data.rst index 4dbf0e2a..9f41e544 100644 --- a/docs/tutorials/data.rst +++ b/docs/tutorials/data.rst @@ -163,7 +163,7 @@ different ways you can represent this data: ... ] - #. As a :class:`numpy.ndarray `, which might look like this: + #. As a :class:`numpy.ndarray `, which might look like this: .. list-table:: :widths: 30 70 diff --git a/docs/tutorials/getting_started.rst b/docs/tutorials/getting_started.rst index 61dfe60f..2cd09aea 100644 --- a/docs/tutorials/getting_started.rst +++ b/docs/tutorials/getting_started.rst @@ -83,7 +83,7 @@ That's all I need to wrangle my data! **Highcharts for Python** can work with series type-specific details of relevant iterable/array structures. Alternatively, we can convert ``my_iterable`` into a -:class:`pandas.DataFrame `, :class:`numpy.ndarray `, +:class:`pandas.DataFrame `, :class:`numpy.ndarray `, or Python :class:`dict `: .. code-block:: python @@ -254,7 +254,7 @@ is architected. We see three - typical - patterns employed: .. caution:: - **DO NOT USE JAVASCRIPT'S ``eval()`` FUNCTION**. + **DO NOT USE JAVASCRIPT'S eval() FUNCTION**. It is deprecated, and for good reason: diff --git a/docs/tutorials/pandas.rst b/docs/tutorials/pandas.rst index 0da72f98..9fe46e67 100644 --- a/docs/tutorials/pandas.rst +++ b/docs/tutorials/pandas.rst @@ -23,7 +23,7 @@ it. So given that focus, **Highcharts for Python** is designed to *read* data that is contained in :class:`pandas.DataFrame ` - instances, or in :class:`numpy.ndarray ` instances. The + instances, or in :class:`numpy.ndarray ` instances. The toolkit will take those instances and load the data they contain into appropriate **Highcharts for Python** classes, and then support the serialization of that data to @@ -91,13 +91,31 @@ can construct a DataFrame from that CSV file very simply: This produces a simple 2-dimensional :class:`DataFrame `. In our case, the resulting table looks like this: - .. image:: /_static/nst-est2019.png + .. image:: /_static/tutorials/census-time-series-01.png :width: 100% :alt: Rendering of the DataFrame produced by pandas.read_csv('census-time-series.csv') The first column contains the names of geographic regions, while each of the subsequent -columns contains the population counts for a given year. Now, let's say we wanted -to visualize this data in various ways. +columns contains the population counts for a given year. However, you'll notice that the +:class:`DataFrame ` index is not set. Unless told otherwise, +**Highcharts for Python** will look for x-axis values in the index. + +Secondly, if you were to look under the hood, you'd see that the +:class:`DataFrame ` imported all of the numbers in our CSV as +strings (because of the presence of the comma), which is obviously a bit of a problem. So +let's fix both of these issues: + + .. code-block:: python + + df = pandas.read_csv('census-time-series.csv', index_col = 0, thousands = ',')) + +produces: + + .. image:: /_static/tutorials/census-time-series-02.png + :width: 100% + :alt: Rendering of the DataFrame produced by pandas.read_csv('census-time-series.csv') + +Great! Now, let's say we wanted to visualize this data in various ways. ------------------------------ @@ -118,14 +136,16 @@ so: * - .. code-block:: python my_chart = Chart.from_pandas(df) + my_chart.display() - - .. image:: /_static/census-time-series_01.png + - .. image:: /_static/census-time-series-03.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df) As you can see, we haven't provided any more instructions besides telling it to generate a chart from ``df``. The result is a line chart, with one series for each year, and -one point for each region. +one point for each region. But because of the structure of our data file, this isn't a great chart: +all the series are stacked on each other! So let's fix that. .. tip:: @@ -143,8 +163,9 @@ Why don't we switch it to a bar chart? * - .. code-block:: python my_chart = Chart.from_pandas(df, series_type = 'bar') + my_chart.display() - - .. image:: /_static/census-time-series_02.png + - .. image:: /_static/census-time-series-04.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar') @@ -169,7 +190,7 @@ Basic Property Mapping 'y': '2019' }) - - .. image:: /_static/census-time-series_03.png + - .. image:: /_static/census-time-series-05.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': '2019'}) @@ -185,7 +206,9 @@ The net result is that ``my_chart`` contains one :class:`BarSeries ` whose :meth:`.data ` property contains a :class:`BarDataCollection ` instance populated -with the data from the ``'Geographic Area'`` and ``'2019'`` columns in ``df``. +with the data from the ``'Geographic Area'`` and ``'2019'`` columns in ``df`` - and even though +``'Geographic Area'`` is not technically a column, but instead is used as the index, +**Highcharts for Python** still uses it correctly. But maybe we actually want to compare a couple different years? Let's try that. @@ -198,19 +221,17 @@ Property Mapping with Multiple Series * - .. code-block:: python my_chart = Chart.from_pandas(df, - series_type = 'bar', + series_type = 'column', property_map = { 'x': 'Geographic Area', 'y': ['2017', '2018', '2019'] }) - - .. image:: /_static/census-time-series_04.png + - .. image:: /_static/census-time-series-06.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019']}) -Now we're getting somewhere! We've added a list of column names to the ``'y'`` key in the ``property_map`` -argument. Each of those columns has now produced a *separate* :class:`BarSeries ` instance - but they're all still sharing the ``'Geographic Area'`` column as their -:meth:`.x ` value. +Now we're getting somewhere! First, we changed our series type to a :class:`ColumnSeries ` to make it (a little) easier to read. Then we added a list of column names to the ``'y'`` key in the ``property_map`` argument. Each of those columns has now produced a *separate* :class:`ColumnSeries ` instance - but they're all still sharing the ``'Geographic Area'`` column as their :meth:`.x ` value. .. note:: @@ -220,7 +241,7 @@ argument. Each of those columns has now produced a *separate* :class:`BarSeries .. code-block:: python my_chart = Chart.from_pandas(df, - series_type = 'bar', + series_type = 'column', property_map = { 'x': ['Geographic Area', 'Geographic Area', 'Geographic Area'], 'y': ['2017', '2018', '2019'] @@ -243,19 +264,15 @@ Configuring Additional Properties * - .. code-block:: python my_chart = Chart.from_pandas(df, - series_type = 'bar', + series_type = 'column', property_map = { 'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' + 'id': 'some other column' }) - - .. image:: /_static/census-time-series_05.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}) - -And now the :meth:`.id ` property of each data point -will *also* be equal to the value in the ``'Geographic Area'`` column. +Now, our data frame is pretty simple does not contain a column named ``'some other column'`. But *if* it did, +then it would use that column to set the :meth:`.id ` property of each data point. .. note:: @@ -273,25 +290,24 @@ Configuring Series Options * - .. code-block:: python my_chart = Chart.from_pandas(df, - series_type = 'bar', + series_type = 'column', property_map = { 'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' }, series_kwargs = { - 'point_padding': 0.25 + 'point_padding': 5 }) - - .. image:: /_static/census-time-series_06.png + - .. image:: /_static/census-time-series-07.png :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}) + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.5}) As you can see, we supplied a new ``series_kwargs`` argument to the ``.from_pandas()`` method call. This argument receives a :class:`dict ` with keys that correspond to properties on the series. In this case, by supplying ``'point_padding'`` we have set the resulting -:meth:`BarSeries.point_padding ` property to a -value of ``0.25`` - leading to a bit more spacing between the bars. +:meth:`ColumnSeries.point_padding ` property to a +value of ``0.5`` - leading to a bit more spacing between the bars. But our chart is *still* a little basic - why don't we give it a reasonable title? @@ -304,14 +320,13 @@ Configuring Options * - .. code-block:: python my_chart = Chart.from_pandas(df, - series_type = 'bar', + series_type = 'column', property_map = { 'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' }, series_kwargs = { - 'point_padding': 0.25 + 'point_padding': 0.5 }, options_kwargs = { 'title': { @@ -319,7 +334,7 @@ Configuring Options } }) - - .. image:: /_static/census-time-series_07.png + - .. image:: /_static/census-time-series-08.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}) @@ -357,10 +372,6 @@ Configuring Chart Settings 'container': 'my_target_div' }) - - .. image:: /_static/census-time-series_08.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}, chart_kwargs = {'container': 'my_target_div'}) - While you can't really *see* the difference here, by adding the ``chart_kwargs`` argument to the method call, we now set the :meth:`.container ` property on ``my_chart``. @@ -380,7 +391,7 @@ Visualizing Data in Rows series_type = 'line', series_in_rows = True) - - .. image:: /_static/census-time-series_09.png + - .. image:: /_static/census-time-series-09.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True) @@ -414,15 +425,15 @@ Filtering Rows my_chart = Chart.from_pandas(df, series_type = 'line', series_in_rows = True, - series_index = slice(3, 7)) + series_index = slice(7, 10)) - - .. image:: /_static/census-time-series_10.png + - .. image:: /_static/census-time-series-10.png :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True, series_index = slice(3, 5)) + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True, series_index = slice(7, 10)) What we did here is we added a ``series_index`` argument, which tells **Highcharts for Python** to only include the series found at that index in the resulting chart. In this case, we supplied a :func:`slice ` -object, which operates just like ``list_of_series[3:7]``. The result only returns those series between index 3 and 6. +object, which operates just like ``list_of_series[7:10]``. The result only returns those series between index 7 and 10. ------------------------ diff --git a/docs/tutorials/series.rst b/docs/tutorials/series.rst index 1e728e15..d978ef67 100644 --- a/docs/tutorials/series.rst +++ b/docs/tutorials/series.rst @@ -151,8 +151,8 @@ This will create a :class:`LineSeries `, -:class:`numpy.ndarray `, or Python :class:`dict `: +series from a :class:`pandas.DataFrame `, +:class:`numpy.ndarray `, or Python :class:`dict `: .. code-block:: python diff --git a/docs/using.rst b/docs/using.rst index e4809306..7ccea4d4 100644 --- a/docs/using.rst +++ b/docs/using.rst @@ -465,7 +465,7 @@ As you can see, **Highcharts for Python** represents its data the same way that However, constructing tens, hundreds, or possibly thousands of data points individually in your code would be a nightmare. For that reason, the **Highcharts for Python Toolkit** natively supports vectorized -:class:`numpy.ndarray ` values, and automatically assembles data +:class:`numpy.ndarray ` values, and automatically assembles data point collections for easy management/manipulation. In addition, the Toolkit provides a number of convenience methods to make it easier to populate your series. diff --git a/docs/using/populating_series_data/_load_from_pandas.rst b/docs/using/populating_series_data/_load_from_pandas.rst index 666f62c8..1a4ae6a9 100644 --- a/docs/using/populating_series_data/_load_from_pandas.rst +++ b/docs/using/populating_series_data/_load_from_pandas.rst @@ -30,17 +30,17 @@ Replace the contents of the :meth:`.data ` property with data points populated from a `pandas `__ - :class:`DataFrame `. + :class:`DataFrame `. - :param df: The :class:`DataFrame ` from which data should be + :param df: The :class:`DataFrame ` from which data should be loaded. - :type df: :class:`DataFrame ` + :type df: :class:`DataFrame ` :param property_map: A :class:`dict ` used to indicate which data point property should be set to which column in ``df``. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value should indicate the label for the - :class:`DataFrame ` column. + :class:`DataFrame ` column. :type property_map: :class:`dict ` :param series_in_rows: if ``True``, will attempt a streamlined cartesian series diff --git a/docs/using/populating_series_data/_new_from_pandas.rst b/docs/using/populating_series_data/_new_from_pandas.rst index 92c943af..e62f862f 100644 --- a/docs/using/populating_series_data/_new_from_pandas.rst +++ b/docs/using/populating_series_data/_new_from_pandas.rst @@ -2,7 +2,7 @@ The ``.from_pandas()`` method is available on all :term:`series` classes and on the :class:`Chart ` class, allowing you to either assemble - a series or an entire chart from Pandas :class:`DataFrame ` + a series or an entire chart from Pandas :class:`DataFrame ` with only one method call. .. code-block:: python @@ -101,17 +101,17 @@ Create one or more :term:`series` instances whose :meth:`.data ` properties are populated from a `pandas `_ - :class:`DataFrame `. + :class:`DataFrame `. - :param df: The :class:`DataFrame ` from which data should be + :param df: The :class:`DataFrame ` from which data should be loaded. - :type df: :class:`DataFrame ` + :type df: :class:`DataFrame ` :param property_map: An optional :class:`dict ` used to indicate which data point property should be set to which column in ``df``. The keys in the :class:`dict ` should correspond to properties in the data point class, while the value should indicate the label for the - :class:`DataFrame ` column. + :class:`DataFrame ` column. .. note:: From 0738fd11a2b6bdba69fbd3fd085006afb1c28115 Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Mon, 9 Oct 2023 00:19:58 -0400 Subject: [PATCH 75/79] Fixed image paths. --- docs/tutorials/pandas.rst | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/tutorials/pandas.rst b/docs/tutorials/pandas.rst index 9fe46e67..fd5fc431 100644 --- a/docs/tutorials/pandas.rst +++ b/docs/tutorials/pandas.rst @@ -138,7 +138,7 @@ so: my_chart = Chart.from_pandas(df) my_chart.display() - - .. image:: /_static/census-time-series-03.png + - .. image:: /_static/tutorials/census-time-series-03.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df) @@ -165,7 +165,7 @@ Why don't we switch it to a bar chart? my_chart = Chart.from_pandas(df, series_type = 'bar') my_chart.display() - - .. image:: /_static/census-time-series-04.png + - .. image:: /_static/tutorials/census-time-series-04.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar') @@ -190,7 +190,7 @@ Basic Property Mapping 'y': '2019' }) - - .. image:: /_static/census-time-series-05.png + - .. image:: /_static/tutorials/census-time-series-05.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': '2019'}) @@ -227,7 +227,7 @@ Property Mapping with Multiple Series 'y': ['2017', '2018', '2019'] }) - - .. image:: /_static/census-time-series-06.png + - .. image:: /_static/tutorials/census-time-series-06.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019']}) @@ -298,8 +298,9 @@ Configuring Series Options series_kwargs = { 'point_padding': 5 }) + my_chart.display() - - .. image:: /_static/census-time-series-07.png + - .. image:: /_static/tutorials/census-time-series-07.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.5}) @@ -333,8 +334,9 @@ Configuring Options 'text': 'This Is My Chart Title' } }) + my_chart.display() - - .. image:: /_static/census-time-series-08.png + - .. image:: /_static/tutorials/census-time-series-08.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}) @@ -390,8 +392,9 @@ Visualizing Data in Rows my_chart = Chart.from_pandas(df, series_type = 'line', series_in_rows = True) + my_chart.display() - - .. image:: /_static/census-time-series-09.png + - .. image:: /_static/tutorials/census-time-series-09.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True) @@ -427,7 +430,7 @@ Filtering Rows series_in_rows = True, series_index = slice(7, 10)) - - .. image:: /_static/census-time-series-10.png + - .. image:: /_static/tutorials/census-time-series-10.png :width: 100% :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True, series_index = slice(7, 10)) From 5d4f395e32f9fb3dcb3b287ed8c1421f58cac339 Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Mon, 9 Oct 2023 12:46:16 -0400 Subject: [PATCH 76/79] Addressed from_csv bugs. --- highcharts_core/options/series/base.py | 68 ++++++++++++++++++++++---- tests/options/series/test_area.py | 6 +-- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/highcharts_core/options/series/base.py b/highcharts_core/options/series/base.py index 3ddcf74f..5add8b8e 100644 --- a/highcharts_core/options/series/base.py +++ b/highcharts_core/options/series/base.py @@ -934,6 +934,7 @@ def _from_csv_multi_map(cls, iterable_values = {} number_of_series = 1 mismatched_series = {} + names = [] for key in cleaned_column_map: map_value = cleaned_column_map[key] @@ -955,6 +956,10 @@ def _from_csv_multi_map(cls, mismatched_series[key] = implied_series iterable_values[key] = map_value + if key == 'y': + name_list = [x if isinstance(x, str) else columns[x] + for x in map_value] + names.extend(name_list) else: if isinstance(map_value, str) and map_value not in columns: raise errors.HighchartsCSVDeserializationError( @@ -971,7 +976,12 @@ def _from_csv_multi_map(cls, ) fixed_values[key] = map_value - + if key == 'y': + if isinstance(map_value, str): + names.append(map_value) + else: + names.append(columns[map_value]) + if mismatched_series: raise errors.HighchartsCSVDeserializationError( f'Unable to create series from CSV. The property map implied ' @@ -992,7 +1002,7 @@ def _from_csv_multi_map(cls, if checkers.is_numeric(test_value): value = test_value prop_array[i] = value - + setattr(collection_instance, key, prop_array) for key in fixed_values: fixed_value = fixed_values[key] @@ -1013,6 +1023,10 @@ def _from_csv_multi_map(cls, for index in range(number_of_series): series_kwargs['data'] = collections[index] series_instance = cls(**series_kwargs) + try: + series_instance.name = names[index] + except IndexError: + pass for key in kwargs: if key not in series_kwargs and key not in cleaned_column_map: setattr(series_instance, key, kwargs[key]) @@ -1352,8 +1366,12 @@ def from_csv(cls, for x in csv_records] for index, prop in enumerate(props_from_array[1:]): - prop_array = [x.get(columns[index + 1], index + 1) - for x in csv_records] + if series_idx is not None: + prop_array = [x.get(columns[index + 1], index + 1) + for x in csv_records] + else: + prop_array = [x.get(columns[index], index) + for x in csv_records] for i, value in enumerate(prop_array): if value and isinstance(value, str) and ',' in value: test_value = value.replace(',', '') @@ -1377,9 +1395,16 @@ def from_csv(cls, # SCENARIO 3b: Multiple Series, Data Frame Columns correspond to multiples of Data Point Properties reversed_dimensions = sorted(supported_dimensions, reverse = True) + columns_per_series = None if reversed_dimensions: for dimension in reversed_dimensions: + if series_idx is not None and dimension > 1 and column_count % (dimension - 1) == 0: + if dimension > 2 and props_from_array[-1] == 'name': + columns_per_series = dimension - 2 + else: + columns_per_series = dimension - 1 + break if dimension > 1 and column_count % dimension == 0: columns_per_series = dimension break @@ -1395,23 +1420,43 @@ def from_csv(cls, ) series_count = column_count // columns_per_series + if columns_per_series == 1 and series_idx: + series_count -= 1 + series_list = [] for index in range(series_count): - start = len(series_list) * columns_per_series + start = 1 + (len(series_list) * columns_per_series) property_map = {} - props_from_array = data_point_cls._get_props_from_array(length = columns_per_series) + if series_idx is not None: + expected_length = columns_per_series + 1 + else: + expected_length = columns_per_series + + props_from_array = data_point_cls._get_props_from_array(length = expected_length) if not props_from_array: props_from_array = ['x', 'y'] property_map[props_from_array[0]] = [x.get(series_idx, None) for x in csv_records] - for index, prop in enumerate(props_from_array[1:]): - index = start + index - prop_array = [x.get(columns[index + 1], index + 1) for x in csv_records] + has_implicit_series_name = 'name' not in kwargs and 'name' not in series_kwargs + if has_implicit_series_name: + try: + series_name = columns[start] + except (IndexError, TypeError): + series_name = None + else: + series_name = series_kwargs.get('name', None) or kwargs.get('name', None) + + props_from_array = props_from_array[1:] + for idx, prop in enumerate(props_from_array): + index = start + idx + + prop_array = [x.get(columns[index], idx) for x in csv_records] + property_map[prop] = prop_array - + collection = collection_cls() for key in property_map: try: @@ -1428,6 +1473,9 @@ def from_csv(cls, if key not in series_kwargs and key not in property_map: setattr(series_instance, key, kwargs[key]) + if 'name' not in series_kwargs and 'name' not in kwargs: + series_instance.name = series_name + series_list.append(series_instance) if series_index is not None: diff --git a/tests/options/series/test_area.py b/tests/options/series/test_area.py index 434ce8b1..dc16abf3 100644 --- a/tests/options/series/test_area.py +++ b/tests/options/series/test_area.py @@ -2973,7 +2973,7 @@ def test_LineSeries_from_csv_in_rows(input_files, filename, expected_series, exp { 'wrapper_character': '"' }, - 11, + 10, 57, None), ('test-data-files/nst-est2019-01.csv', @@ -3066,7 +3066,7 @@ def test_LineSeries_from_csv_in_rows(input_files, filename, expected_series, exp { 'wrapper_character': '"' }, - 5, + 9, 57, None), @@ -3078,7 +3078,7 @@ def test_LineSeries_from_csv_in_rows(input_files, filename, expected_series, exp { 'wrapper_character': '"' }, - 11, + 10, 57, None), From b0742a184e0d23487daeb6f9c999a67dd5561e59 Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Mon, 9 Oct 2023 12:46:25 -0400 Subject: [PATCH 77/79] Updated tutorial documentation. --- docs/_static/highcharts-chart-anatomy.png | Bin 0 -> 55001 bytes .../tutorials/census-time-series-04.png | Bin 24342 -> 19968 bytes .../tutorials/census-time-series-csv-01.png | Bin 0 -> 146187 bytes docs/_static/tutorials/raw-data-as-numpy.png | Bin 0 -> 17841 bytes docs/tutorials/csv.rst | 273 ++++++++---------- docs/tutorials/data.rst | 17 +- docs/tutorials/pandas.rst | 248 +++++++--------- docs/tutorials/series.rst | 2 +- 8 files changed, 239 insertions(+), 301 deletions(-) create mode 100644 docs/_static/highcharts-chart-anatomy.png create mode 100644 docs/_static/tutorials/census-time-series-csv-01.png create mode 100644 docs/_static/tutorials/raw-data-as-numpy.png diff --git a/docs/_static/highcharts-chart-anatomy.png b/docs/_static/highcharts-chart-anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..60ec37b62a8250d58a7c738514f0ea23679aa932 GIT binary patch literal 55001 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 E0A(3dx&QzG literal 0 HcmV?d00001 diff --git a/docs/_static/tutorials/census-time-series-04.png b/docs/_static/tutorials/census-time-series-04.png index 995f0c588db3b52d17649dfecacfb244317a7e30..16ed17bd9b3e07558cea04d6fc54103a4cca48ab 100644 GIT binary patch literal 19968 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 literal 24342 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%0DkL2qOxAPgBRV!&oUT`f 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 Dmp$&qK8MVgz8H_6DzXkNdP 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 M07*qoM6N<$f&h6CiU0rr literal 0 HcmV?d00001 diff --git a/docs/tutorials/csv.rst b/docs/tutorials/csv.rst index 8ac6f482..11cc4379 100644 --- a/docs/tutorials/csv.rst +++ b/docs/tutorials/csv.rst @@ -63,7 +63,7 @@ Preparing Your CSV Data So let's try a real-world example. Let's say you've got some annual population counts stored in a CSV file named ``'census-time-series.csv'`` that looks like this: - .. image:: /_static/census-time-series.png + .. image:: /_static/tutorials/census-time-series-csv-01.png :width: 100% :alt: Rendering of the data contained in 'census-time-series.csv' @@ -84,20 +84,20 @@ The simplest way to create a chart from a CSV file is to call :class:`Chart.from_csv() ` like so: -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_csv('census-time-series.csv) + my_chart = Chart.from_csv('census-time-series.csv', + wrapper_character = '"') + my_chart.display() - - .. image:: /_static/census-time-series_01.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv') +.. image:: /_static/tutorials/census-time-series-03.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv') As you can see, we haven't provided any more instructions besides telling it to -generate a chart from the file ``'census-time-series.csv'``. The result is a line -chart, with one series for each year, and one point for each region. +generate a chart from the file ``'census-time-series.csv'``, and to interpret a single +quotation mark as a wrapper character. The result is a line chart, with one series for +each year, and one point for each region. .. tip:: @@ -109,17 +109,15 @@ Setting the Series Type Why don't we switch it to a bar chart? -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar') + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'bar', + wrapper_character = '"') - - .. image:: /_static/census-time-series_02.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar') +.. image:: /_static/tutorials/census-time-series-04.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar') Now the result is a little more readable, but still not great: After all, there are more than fifty geographic regions represented for each year, which makes the chart super crowded. @@ -130,21 +128,18 @@ Let's try focusing our chart. Basic Property Mapping ========================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar', - property_column_map = { - 'x': 'Geographic Area', - 'y': '2019' - }) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'bar', + property_column_map = { + 'x': 'Geographic Area', + 'y': '2019' + }) - - .. image:: /_static/census-time-series_03.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': '2019'}) +.. image:: /_static/tutorials/census-time-series-05.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': '2019'}) Much better! We've now added a ``property_column_map`` argument to the ``.from_csv()`` method call. This argument tells Highcharts for Python how to map columns in your data to properties in the @@ -179,21 +174,18 @@ But maybe we actually want to compare a couple different years? Let's try that. Property Mapping with Multiple Series ======================================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar', - property_column_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'] - }) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'column', + property_column_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'] + }) - - .. image:: /_static/census-time-series_04.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019']}) +.. image:: /_static/tutorials/census-time-series-06.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019']}) Now we're getting somewhere! We've added a list of column names to the ``'y'`` key in the ``property_column_map`` argument. Each of those columns has now produced a *separate* @@ -209,7 +201,7 @@ all still sharing the ``'Geographic Area'`` column as their .. code-block:: python my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar', + series_type = 'column', property_column_map = { 'x': ['Geographic Area', 'Geographic Area', 'Geographic Area'], 'y': ['2017', '2018', '2019'] @@ -226,29 +218,22 @@ configure additional properties? Easy! Configuring Additional Properties ===================================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python - - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar', - property_column_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' - }) +.. code-block:: python - - .. image:: /_static/census-time-series_05.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'bar', + property_column_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + 'id': 'some other column' + }) -And now the :meth:`.id ` property of each data point -will *also* be equal to the value in the ``'Geographic Area'`` column. +Now, our CSV is pretty simple does not contain a column named ``'some other column'`. But *if* it did, +then it would use that column to set the :meth:`.id ` property of each data point. .. note:: - You can supply any property you want to the ``property_column_map``. If the property is not + You can supply any property you want to the ``property_map``. If the property is not supported by the series type you've selected, then it will be ignored. But our chart is still looking a little basic - why don't we tweak some series configuration options? @@ -256,25 +241,21 @@ But our chart is still looking a little basic - why don't we tweak some series c Configuring Series Options =============================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar', - property_column_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' - }, - series_kwargs = { - 'point_padding': 0.25 - }) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'bar', + property_column_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + }, + series_kwargs = { + 'point_padding': 5 + }) - - .. image:: /_static/census-time-series_06.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}) +.. image:: /_static/tutorials/census-time-series-07.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}) As you can see, we supplied a new ``series_kwargs`` argument to the ``.from_csv()`` method call. This argument receives a :class:`dict ` with keys that correspond to properties on the series. In @@ -287,30 +268,27 @@ But our chart is *still* a little basic - why don't we give it a reasonable titl Configuring Options ============================= -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python - - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar', - property_column_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' - }, - series_kwargs = { - 'point_padding': 0.25 - }, - options_kwargs = { - 'title': { - 'text': 'This Is My Chart Title' - } - }) +.. code-block:: python - - .. image:: /_static/census-time-series_07.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'bar', + wrapper_character = '"', + property_column_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'] + }, + series_kwargs = { + 'point_padding': 5 + }, + options_kwargs = { + 'title': { + 'text': 'This Is My Chart Title' + } + }) + +.. image:: /_static/tutorials/census-time-series-08.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}) As you can see, we've now given our chart a title. We did this by adding a new ``options_kwargs`` argument, which likewise takes a :class:`dict ` with keys that correspond to properties on the chart's @@ -322,33 +300,26 @@ we can configure that in the same method call. Configuring Chart Settings ============================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python - - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'bar', - property_column_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' - }, - series_kwargs = { - 'point_padding': 0.25 - }, - options_kwargs = { - 'title': { - 'text': 'This Is My Chart Title' - } - }, - chart_kwargs = { - 'container': 'my_target_div' - }) +.. code-block:: python - - .. image:: /_static/census-time-series_08.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'bar', property_column_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}, chart_kwargs = {'container': 'my_target_div'}) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'bar', + wrapper_character = '"', + property_column_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + }, + series_kwargs = { + 'point_padding': 0.25 + }, + options_kwargs = { + 'title': { + 'text': 'This Is My Chart Title' + } + }, + chart_kwargs = { + 'container': 'my_target_div' + }) While you can't really *see* the difference here, by adding the ``chart_kwargs`` argument to the method call, we now set the :meth:`.container ` property @@ -360,18 +331,16 @@ Well, we can do that easily by visualizing each *row* of ``census-time-series.cs Visualizing Data in Rows ============================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'line', - series_in_rows = True) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'line', + series_in_rows = True, + wrapper_character = '"') - - .. image:: /_static/census-time-series_09.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'line', series_in_rows = True) +.. image:: /_static/tutorials/census-time-series-09.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'line', series_in_rows = True) Okay, so here we removed some of the other arguments we'd been using to simplify the example. You'll see we've now added the ``series_in_rows`` argument, and set it to ``True``. This tells **Highcharts for Python** that we expect @@ -397,23 +366,21 @@ But maybe we don't want *all* geographic areas shown on the chart - maybe we onl Filtering Rows ======================= -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_csv('census-time-series.csv', - series_type = 'line', - series_in_rows = True, - series_index = slice(3, 7)) + my_chart = Chart.from_csv('census-time-series.csv', + series_type = 'line', + series_in_rows = True, + wrapper_character = '"', + series_index = slice(7, 10)) - - .. image:: /_static/census-time-series_10.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'line', series_in_rows = True, series_index = slice(3, 5)) +.. image:: /_static/tutorials/census-time-series-10.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_csv('census-time-series.csv', series_type = 'line', series_in_rows = True, series_index = slice(7, 10)) What we did here is we added a ``series_index`` argument, which tells **Highcharts for Python** to only include the series found at that index in the resulting chart. In this case, we supplied a :func:`slice ` -object, which operates just like ``list_of_series[3:7]``. The result only returns those series between index 3 and 6. +object, which operates just like ``list_of_series[7:10]``. The result only returns those series between index 7 and 10. ------------------------ diff --git a/docs/tutorials/data.rst b/docs/tutorials/data.rst index 9f41e544..a9ec5f37 100644 --- a/docs/tutorials/data.rst +++ b/docs/tutorials/data.rst @@ -36,7 +36,7 @@ chart as a tree. .. list-table:: :widths: 30 70 - * - .. image:: /_static/images/data_structure.png + * - .. image:: /_static/highcharts-chart-anatomy.png :width: 100% :alt: Diagram of chart structure: Chart > Options > Series Collection > Series > Data Collection > Data Point @@ -168,13 +168,7 @@ different ways you can represent this data: .. list-table:: :widths: 30 70 - * - .. code-block:: python - - raw_data = np.genfromtext('census-time-series.csv', - delimiter = ',', - names = True) - - - .. image:: /_static/images/raw_data_as_numpy.png + - .. image:: /_static/tutorials/raw-data-as-numpy.png :width: 100% :alt: Rendering of the numpy.ndarray produced by np.genfromtext('census-time-series.csv', delimiter = ',', names = True) @@ -185,9 +179,12 @@ different ways you can represent this data: * - .. code-block:: python - raw_data = pandas.read_csv('census-time-series.csv') + raw_data = pandas.read_csv('census-time-series.csv', + index_col = 0, + thousands = ',', + delimiter = ',') - * - .. image:: /_static/images/raw_data_as_pandas.png + * - .. image:: /_static/tutorials/census-time-series-02.png :width: 100% :alt: Rendering of the Pandas DataFrame loaded from "census-time-series.csv" diff --git a/docs/tutorials/pandas.rst b/docs/tutorials/pandas.rst index fd5fc431..0af4d9eb 100644 --- a/docs/tutorials/pandas.rst +++ b/docs/tutorials/pandas.rst @@ -130,17 +130,14 @@ The simplest way to create a chart from a :class:`DataFrame ` like so: -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df) - my_chart.display() + my_chart = Chart.from_pandas(df) + my_chart.display() - - .. image:: /_static/tutorials/census-time-series-03.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df) +.. image:: /_static/tutorials/census-time-series-03.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df) As you can see, we haven't provided any more instructions besides telling it to generate a chart from ``df``. The result is a line chart, with one series for each year, and @@ -160,14 +157,14 @@ Why don't we switch it to a bar chart? .. list-table:: :widths: 30 70 - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df, series_type = 'bar') - my_chart.display() + my_chart = Chart.from_pandas(df, series_type = 'bar') + my_chart.display() - - .. image:: /_static/tutorials/census-time-series-04.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar') +.. image:: /_static/tutorials/census-time-series-04.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar') Now the result is a little more readable, but still not great: After all, there are more than fifty geographic regions represented for each year, which makes the chart super crowded. @@ -178,21 +175,18 @@ Let's try focusing our chart. Basic Property Mapping ========================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df, - series_type = 'bar', - property_map = { - 'x': 'Geographic Area', - 'y': '2019' - }) + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': '2019' + }) - - .. image:: /_static/tutorials/census-time-series-05.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': '2019'}) +.. image:: /_static/tutorials/census-time-series-05.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': '2019'}) Much better! We've now added a ``property_map`` argument to the ``.from_pandas()`` method call. This argument tells Highcharts for Python how to map columns in your @@ -215,21 +209,19 @@ But maybe we actually want to compare a couple different years? Let's try that. Property Mapping with Multiple Series ======================================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df, - series_type = 'column', - property_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'] - }) + my_chart = Chart.from_pandas(df, + series_type = 'column', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'] + }) + my_chart.display() - - .. image:: /_static/tutorials/census-time-series-06.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019']}) +.. image:: /_static/tutorials/census-time-series-06.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019']}) Now we're getting somewhere! First, we changed our series type to a :class:`ColumnSeries ` to make it (a little) easier to read. Then we added a list of column names to the ``'y'`` key in the ``property_map`` argument. Each of those columns has now produced a *separate* :class:`ColumnSeries ` instance - but they're all still sharing the ``'Geographic Area'`` column as their :meth:`.x ` value. @@ -258,18 +250,15 @@ configure additional properties? Easy! Configuring Additional Properties ===================================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df, - series_type = 'column', - property_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - 'id': 'some other column' - }) + my_chart = Chart.from_pandas(df, + series_type = 'column', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + 'id': 'some other column' + }) Now, our data frame is pretty simple does not contain a column named ``'some other column'`. But *if* it did, then it would use that column to set the :meth:`.id ` property of each data point. @@ -284,25 +273,22 @@ But our chart is still looking a little basic - why don't we tweak some series c Configuring Series Options =============================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python - - my_chart = Chart.from_pandas(df, - series_type = 'column', - property_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - }, - series_kwargs = { - 'point_padding': 5 - }) - my_chart.display() +.. code-block:: python - - .. image:: /_static/tutorials/census-time-series-07.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.5}) + my_chart = Chart.from_pandas(df, + series_type = 'column', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + }, + series_kwargs = { + 'point_padding': 5 + }) + my_chart.display() + +.. image:: /_static/tutorials/census-time-series-07.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.5}) As you can see, we supplied a new ``series_kwargs`` argument to the ``.from_pandas()`` method call. This argument receives a :class:`dict ` with keys that correspond to properties on the series. In @@ -315,30 +301,27 @@ But our chart is *still* a little basic - why don't we give it a reasonable titl Configuring Options ============================= -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python - - my_chart = Chart.from_pandas(df, - series_type = 'column', - property_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - }, - series_kwargs = { - 'point_padding': 0.5 - }, - options_kwargs = { - 'title': { - 'text': 'This Is My Chart Title' - } - }) - my_chart.display() +.. code-block:: python - - .. image:: /_static/tutorials/census-time-series-08.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}) + my_chart = Chart.from_pandas(df, + series_type = 'column', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + }, + series_kwargs = { + 'point_padding': 0.5 + }, + options_kwargs = { + 'title': { + 'text': 'This Is My Chart Title' + } + }) + my_chart.display() + +.. image:: /_static/tutorials/census-time-series-08.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'bar', property_map = {'x': 'Geographic Area', 'y': ['2017', '2018', '2019'], 'id': 'Geographic Area'}, series_kwargs = {'point_padding': 0.25}, options_kwargs = {'title': {'text': 'This Is My Chart Title'}}) As you can see, we've now given our chart a title. We did this by adding a new ``options_kwargs`` argument, which likewise takes a :class:`dict ` with keys that correspond to properties on the chart's @@ -350,29 +333,26 @@ we can configure that in the same method call. Configuring Chart Settings ============================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df, - series_type = 'bar', - property_map = { - 'x': 'Geographic Area', - 'y': ['2017', '2018', '2019'], - 'id': 'Geographic Area' - }, - series_kwargs = { - 'point_padding': 0.25 - }, - options_kwargs = { - 'title': { - 'text': 'This Is My Chart Title' - } - }, - chart_kwargs = { - 'container': 'my_target_div' - }) + my_chart = Chart.from_pandas(df, + series_type = 'bar', + property_map = { + 'x': 'Geographic Area', + 'y': ['2017', '2018', '2019'], + 'id': 'Geographic Area' + }, + series_kwargs = { + 'point_padding': 0.25 + }, + options_kwargs = { + 'title': { + 'text': 'This Is My Chart Title' + } + }, + chart_kwargs = { + 'container': 'my_target_div' + }) While you can't really *see* the difference here, by adding the ``chart_kwargs`` argument to the method call, we now set the :meth:`.container ` property @@ -384,19 +364,16 @@ Well, we can do that easily by visualizing each *row* of ``df`` rather than each Visualizing Data in Rows ============================== -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df, - series_type = 'line', - series_in_rows = True) - my_chart.display() + my_chart = Chart.from_pandas(df, + series_type = 'line', + series_in_rows = True) + my_chart.display() - - .. image:: /_static/tutorials/census-time-series-09.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True) +.. image:: /_static/tutorials/census-time-series-09.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True) Okay, so here we removed some of the other arguments we'd been using to simplify the example. You'll see we've now added the ``series_in_rows`` argument, and set it to ``True``. This tells **Highcharts for Python** that we expect @@ -420,19 +397,16 @@ But maybe we don't want *all* geographic areas shown on the chart - maybe we onl Filtering Rows ======================= -.. list-table:: - :widths: 30 70 - - * - .. code-block:: python +.. code-block:: python - my_chart = Chart.from_pandas(df, - series_type = 'line', - series_in_rows = True, - series_index = slice(7, 10)) + my_chart = Chart.from_pandas(df, + series_type = 'line', + series_in_rows = True, + series_index = slice(7, 10)) - - .. image:: /_static/tutorials/census-time-series-10.png - :width: 100% - :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True, series_index = slice(7, 10)) +.. image:: /_static/tutorials/census-time-series-10.png + :width: 100% + :alt: Rendering of the chart produced by Chart.from_pandas(df, series_type = 'line', series_in_rows = True, series_index = slice(7, 10)) What we did here is we added a ``series_index`` argument, which tells **Highcharts for Python** to only include the series found at that index in the resulting chart. In this case, we supplied a :func:`slice ` diff --git a/docs/tutorials/series.rst b/docs/tutorials/series.rst index d978ef67..f9ab4466 100644 --- a/docs/tutorials/series.rst +++ b/docs/tutorials/series.rst @@ -21,7 +21,7 @@ As a result, when you constructing your chart in **Highcharts for Python**, what you are really doing is constructing one or more :term:`series` that are then placed on a shared canvas, with shared axes, a shared legend, etc. - .. image:: /_static/images/chart-anatomy.png + .. image:: /_static/highcharts-chart-anatomy.png :width: 75 :align: right :alt: Diagram showing the conceptual components of a Highcharts chart From 37e1c6be0e43208f0e40b64e813476a27adb54c2 Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Mon, 9 Oct 2023 13:29:09 -0400 Subject: [PATCH 78/79] Fixed faulty unit test assertions. --- tests/test_chart.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_chart.py b/tests/test_chart.py index c10e988c..6e07646a 100644 --- a/tests/test_chart.py +++ b/tests/test_chart.py @@ -565,7 +565,7 @@ def test_from_csv_in_rows(input_files, filename, expected_series, expected_data_ { 'wrapper_character': '"' }, - 11, + 10, 57, None), ('test-data-files/nst-est2019-01.csv', @@ -658,7 +658,7 @@ def test_from_csv_in_rows(input_files, filename, expected_series, expected_data_ { 'wrapper_character': '"' }, - 5, + 9, 57, None), @@ -670,7 +670,7 @@ def test_from_csv_in_rows(input_files, filename, expected_series, expected_data_ { 'wrapper_character': '"' }, - 11, + 10, 57, None), From 1964c09eb37d464d7bec8d7c52ee810b50e69f69 Mon Sep 17 00:00:00 2001 From: Chris Modzelewski Date: Mon, 9 Oct 2023 16:53:20 -0400 Subject: [PATCH 79/79] Updated documentation. --- docs/index.rst | 2 -- highcharts_core/chart.py | 8 ++++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 64385ad8..427c632e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -13,8 +13,6 @@ Highcharts Core for Python **High-end data visualization for the Python ecosystem** -.. include:: _unit_tests_code_coverage.rst - .. toctree:: :hidden: :maxdepth: 3 diff --git a/highcharts_core/chart.py b/highcharts_core/chart.py index dd092d9a..26099432 100644 --- a/highcharts_core/chart.py +++ b/highcharts_core/chart.py @@ -1239,6 +1239,14 @@ def from_csv_in_rows(cls, which is Python's native escape character). :type escape_character: :class:`str ` + :param series_index: If supplied, generate the chart with the series that + Highcharts for Python generated from ``df`` at the ``series_index`` position. + Defaults to :obj:`None `, which includes all series generated + from ``df`` on the chart. + + :type series_index: :class:`int `, slice, or + :obj:`None ` + :param **kwargs: Remaining keyword arguments will be attempted on the resulting :term:`series` instance and the data points it contains.