{"action":"closed","number":41,"pull_request":{"url":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/41","id":199914703,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk5OTE0NzAz","html_url":"https://github.com/gasparka/pyha_demo_project/pull/41","diff_url":"https://github.com/gasparka/pyha_demo_project/pull/41.diff","patch_url":"https://github.com/gasparka/pyha_demo_project/pull/41.patch","issue_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/41","number":41,"state":"closed","locked":false,"title":"Update pandas to 0.23.3","user":{"login":"pyup-bot","id":16239342,"node_id":"MDQ6VXNlcjE2MjM5MzQy","avatar_url":"https://avatars0.githubusercontent.com/u/16239342?v=4","gravatar_id":"","url":"https://api.github.com/users/pyup-bot","html_url":"https://github.com/pyup-bot","followers_url":"https://api.github.com/users/pyup-bot/followers","following_url":"https://api.github.com/users/pyup-bot/following{/other_user}","gists_url":"https://api.github.com/users/pyup-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/pyup-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pyup-bot/subscriptions","organizations_url":"https://api.github.com/users/pyup-bot/orgs","repos_url":"https://api.github.com/users/pyup-bot/repos","events_url":"https://api.github.com/users/pyup-bot/events{/privacy}","received_events_url":"https://api.github.com/users/pyup-bot/received_events","type":"User","site_admin":false},"body":"\nThis PR updates [pandas](https://pypi.org/project/pandas) from **0.22.0** to **0.23.3**.\n\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 0.23.3\n   ```\n   ----------------------\n\nThis release fixes a build issue with the sdist for Python 3.7 (:issue:`21785`)\nThere are no other changes.\n\n\n.. _whatsnew_0180:\n   ```\n   \n  \n  \n   ### 0.23.2\n   ```\n   ----------------------\n\nThis is a minor bug-fix release in the 0.23.x series and includes some small regression fixes\nand bug fixes. We recommend that all users upgrade to this version.\n\n.. note::\n\n   Pandas 0.23.2 is first pandas release that&#39;s compatible with\n   Python 3.7 (:issue:`20552`)\n\n\n.. contents:: What&#39;s new in v0.23.2\n    :local:\n    :backlinks: none\n\n.. _whatsnew_0232.enhancements:\n\nLogical Reductions over Entire DataFrame\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n:meth:`DataFrame.all` and :meth:`DataFrame.any` now accept ``axis=None`` to reduce over all axes to a scalar (:issue:`19976`)\n\n.. ipython:: python\n\n   df = pd.DataFrame({&quot;A&quot;: [1, 2], &quot;B&quot;: [True, False]})\n   df.all(axis=None)\n\n\nThis also provides compatibility with NumPy 1.15, which now dispatches to ``DataFrame.all``.\nWith NumPy 1.15 and pandas 0.23.1 or earlier, :func:`numpy.all` will no longer reduce over every axis:\n\n.. code-block:: python\n\n   &gt;&gt;&gt;  NumPy 1.15, pandas 0.23.1\n   &gt;&gt;&gt; np.any(pd.DataFrame({&quot;A&quot;: [False], &quot;B&quot;: [False]}))\n   A    False\n   B    False\n   dtype: bool\n\nWith pandas 0.23.2, that will correctly return False, as it did with NumPy &lt; 1.15.\n\n.. ipython:: python\n\n   np.any(pd.DataFrame({&quot;A&quot;: [False], &quot;B&quot;: [False]}))\n\n\n.. _whatsnew_0232.fixed_regressions:\n\nFixed Regressions\n~~~~~~~~~~~~~~~~~\n\n- Fixed regression in :meth:`to_csv` when handling file-like object incorrectly (:issue:`21471`)\n- Re-allowed duplicate level names of a ``MultiIndex``. Accessing a level that has a duplicate name by name still raises an error (:issue:`19029`).\n- Bug in both :meth:`DataFrame.first_valid_index` and :meth:`Series.first_valid_index` raised for a row index having duplicate values (:issue:`21441`)\n- Fixed printing of DataFrames with hierarchical columns with long names (:issue:`21180`)\n- Fixed regression in :meth:`~DataFrame.reindex` and :meth:`~DataFrame.groupby`\n  with a MultiIndex or multiple keys that contains categorical datetime-like values (:issue:`21390`).\n- Fixed regression in unary negative operations with object dtype (:issue:`21380`)\n- Bug in :meth:`Timestamp.ceil` and :meth:`Timestamp.floor` when timestamp is a multiple of the rounding frequency (:issue:`21262`)\n- Fixed regression in :func:`to_clipboard` that defaulted to copying dataframes with space delimited instead of tab delimited (:issue:`21104`)\n\n\nBuild Changes\n~~~~~~~~~~~~~\n\n- The source and binary distributions no longer include test data files, resulting in smaller download sizes. Tests relying on these data files will be skipped when using ``pandas.test()``. (:issue:`19320`)\n\n.. _whatsnew_0232.bug_fixes:\n\nBug Fixes\n~~~~~~~~~\n\n**Conversion**\n\n- Bug in constructing :class:`Index` with an iterator or generator (:issue:`21470`)\n- Bug in :meth:`Series.nlargest` for signed and unsigned integer dtypes when the minimum value is present (:issue:`21426`)\n\n**Indexing**\n\n- Bug in :meth:`Index.get_indexer_non_unique` with categorical key (:issue:`21448`)\n- Bug in comparison operations for :class:`MultiIndex` where error was raised on equality / inequality comparison involving a MultiIndex with ``nlevels == 1`` (:issue:`21149`)\n- Bug in :meth:`DataFrame.drop` behaviour is not consistent for unique and non-unique indexes (:issue:`21494`)\n- Bug in :func:`DataFrame.duplicated` with a large number of columns causing a &#39;maximum recursion depth exceeded&#39; (:issue:`21524`).\n\n**I/O**\n\n- Bug in :func:`read_csv` that caused it to incorrectly raise an error when ``nrows=0``, ``low_memory=True``, and ``index_col`` was not ``None`` (:issue:`21141`)\n- Bug in :func:`json_normalize` when formatting the ``record_prefix`` with integer columns (:issue:`21536`)\n\n**Categorical**\n\n- Bug in rendering :class:`Series` with ``Categorical`` dtype in rare conditions under Python 2.7 (:issue:`21002`)\n\n**Timezones**\n\n- Bug in :class:`Timestamp` and :class:`DatetimeIndex` where passing a :class:`Timestamp` localized after a DST transition would return a datetime before the DST transition (:issue:`20854`)\n- Bug in comparing :class:`DataFrame`s with tz-aware :class:`DatetimeIndex` columns with a DST transition that raised a ``KeyError`` (:issue:`19970`)\n\n**Timedelta**\n\n- Bug in :class:`Timedelta` where non-zero timedeltas shorter than 1 microsecond were considered False (:issue:`21484`)\n\n\n\n.. _whatsnew_050:\n   ```\n   \n  \n  \n   ### 0.23.1\n   ```\n   -----------------------\n\nThis is a minor bug-fix release in the 0.23.x series and includes some small regression fixes\nand bug fixes. We recommend that all users upgrade to this version.\n\n.. contents:: What&#39;s new in v0.23.1\n    :local:\n    :backlinks: none\n\n.. _whatsnew_0231.fixed_regressions:\n\nFixed Regressions\n~~~~~~~~~~~~~~~~~\n\n**Comparing Series with datetime.date**\n\nWe&#39;ve reverted a 0.23.0 change to comparing a :class:`Series` holding datetimes and a ``datetime.date`` object (:issue:`21152`).\nIn pandas 0.22 and earlier, comparing a Series holding datetimes and ``datetime.date`` objects would coerce the ``datetime.date`` to a datetime before comapring.\nThis was inconsistent with Python, NumPy, and :class:`DatetimeIndex`, which never consider a datetime and ``datetime.date`` equal.\n\nIn 0.23.0, we unified operations between DatetimeIndex and Series, and in the process changed comparisons between a Series of datetimes and ``datetime.date`` without warning.\n\nWe&#39;ve temporarily restored the 0.22.0 behavior, so datetimes and dates may again compare equal, but restore the 0.23.0 behavior in a future release.\n\nTo summarize, here&#39;s the behavior in 0.22.0, 0.23.0, 0.23.1:\n\n.. code-block:: python\n\n    0.22.0... Silently coerce the datetime.date\n   &gt;&gt;&gt; Series(pd.date_range(&#39;2017&#39;, periods=2)) == datetime.date(2017, 1, 1)\n   0     True\n   1    False\n   dtype: bool\n\n    0.23.0... Do not coerce the datetime.date\n   &gt;&gt;&gt; Series(pd.date_range(&#39;2017&#39;, periods=2)) == datetime.date(2017, 1, 1)\n   0    False\n   1    False\n   dtype: bool\n\n    0.23.1... Coerce the datetime.date with a warning\n   &gt;&gt;&gt; Series(pd.date_range(&#39;2017&#39;, periods=2)) == datetime.date(2017, 1, 1)\n   /bin/python:1: FutureWarning: Comparing Series of datetimes with &#39;datetime.date&#39;.  Currently, the\n   &#39;datetime.date&#39; is coerced to a datetime. In the future pandas will\n   not coerce, and the values not compare equal to the &#39;datetime.date&#39;.\n   To retain the current behavior, convert the &#39;datetime.date&#39; to a\n   datetime with &#39;pd.Timestamp&#39;.\n     !/bin/python3\n   0     True\n   1    False\n   dtype: bool\n\nIn addition, ordering comparisons will raise a ``TypeError`` in the future.\n\n**Other Fixes**\n\n- Reverted the ability of :func:`~DataFrame.to_sql` to perform multivalue\n  inserts as this caused regression in certain cases (:issue:`21103`).\n  In the future this will be made configurable.\n- Fixed regression in the :attr:`DatetimeIndex.date` and :attr:`DatetimeIndex.time`\n  attributes in case of timezone-aware data: :attr:`DatetimeIndex.time` returned\n  a tz-aware time instead of tz-naive (:issue:`21267`) and :attr:`DatetimeIndex.date`\n  returned incorrect date when the input date has a non-UTC timezone (:issue:`21230`).\n- Fixed regression in :meth:`pandas.io.json.json_normalize` when called with ``None`` values\n  in nested levels in JSON, and to not drop keys with value as `None` (:issue:`21158`, :issue:`21356`).\n- Bug in :meth:`~DataFrame.to_csv` causes encoding error when compression and encoding are specified (:issue:`21241`, :issue:`21118`)\n- Bug preventing pandas from being importable with -OO optimization (:issue:`21071`)\n- Bug in :meth:`Categorical.fillna` incorrectly raising a ``TypeError`` when `value` the individual categories are iterable and `value` is an iterable (:issue:`21097`, :issue:`19788`)\n- Fixed regression in constructors coercing NA values like ``None`` to strings when passing ``dtype=str`` (:issue:`21083`)\n- Regression in :func:`pivot_table` where an ordered ``Categorical`` with missing\n  values for the pivot&#39;s ``index`` would give a mis-aligned result (:issue:`21133`)\n- Fixed regression in merging on boolean index/columns (:issue:`21119`).\n\n.. _whatsnew_0231.performance:\n\nPerformance Improvements\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n- Improved performance of :meth:`CategoricalIndex.is_monotonic_increasing`, :meth:`CategoricalIndex.is_monotonic_decreasing` and :meth:`CategoricalIndex.is_monotonic` (:issue:`21025`)\n- Improved performance of :meth:`CategoricalIndex.is_unique` (:issue:`21107`)\n\n\n.. _whatsnew_0231.bug_fixes:\n\nBug Fixes\n~~~~~~~~~\n\n**Groupby/Resample/Rolling**\n\n- Bug in :func:`DataFrame.agg` where applying multiple aggregation functions to a :class:`DataFrame` with duplicated column names would cause a stack overflow (:issue:`21063`)\n- Bug in :func:`pandas.core.groupby.GroupBy.ffill` and :func:`pandas.core.groupby.GroupBy.bfill` where the fill within a grouping would not always be applied as intended due to the implementations&#39; use of a non-stable sort (:issue:`21207`)\n- Bug in :func:`pandas.core.groupby.GroupBy.rank` where results did not scale to 100% when specifying ``method=&#39;dense&#39;`` and ``pct=True``\n- Bug in :func:`pandas.DataFrame.rolling` and :func:`pandas.Series.rolling` which incorrectly accepted a 0 window size rather than raising (:issue:`21286`)\n\n**Data-type specific**\n\n- Bug in :meth:`Series.str.replace()` where the method throws `TypeError` on Python 3.5.2 (:issue:`21078`)\n- Bug in :class:`Timedelta` where passing a float with a unit would prematurely round the float precision (:issue:`14156`)\n- Bug in :func:`pandas.testing.assert_index_equal` which raised ``AssertionError`` incorrectly, when comparing two :class:`CategoricalIndex` objects with param ``check_categorical=False`` (:issue:`19776`)\n\n**Sparse**\n\n- Bug in :attr:`SparseArray.shape` which previously only returned the shape :attr:`SparseArray.sp_values` (:issue:`21126`)\n\n**Indexing**\n\n- Bug in :meth:`Series.reset_index` where appropriate error was not raised with an invalid level name (:issue:`20925`)\n- Bug in :func:`interval_range` when ``start``/``periods`` or ``end``/``periods`` are specified with float ``start`` or ``end`` (:issue:`21161`)\n- Bug in :meth:`MultiIndex.set_names` where error raised for a ``MultiIndex`` with ``nlevels == 1`` (:issue:`21149`)\n- Bug in :class:`IntervalIndex` constructors where creating an ``IntervalIndex`` from categorical data was not fully supported (:issue:`21243`, :issue:`21253`)\n- Bug in :meth:`MultiIndex.sort_index` which was not guaranteed to sort correctly with ``level=1``; this was also causing data misalignment in particular :meth:`DataFrame.stack` operations (:issue:`20994`, :issue:`20945`, :issue:`21052`)\n\n**Plotting**\n\n- New keywords (sharex, sharey) to turn on/off sharing of x/y-axis by subplots generated with pandas.DataFrame().groupby().boxplot() (:issue:`20968`)\n\n**I/O**\n\n- Bug in IO methods specifying ``compression=&#39;zip&#39;`` which produced uncompressed zip archives (:issue:`17778`, :issue:`21144`)\n- Bug in :meth:`DataFrame.to_stata` which prevented exporting DataFrames to buffers and most file-like objects (:issue:`21041`)\n- Bug in :meth:`read_stata` and :class:`StataReader` which did not correctly decode utf-8 strings on Python 3 from Stata 14 files (dta version 118) (:issue:`21244`)\n- Bug in IO JSON :func:`read_json` reading empty JSON schema with ``orient=&#39;table&#39;`` back to :class:`DataFrame` caused an error (:issue:`21287`)\n\n**Reshaping**\n\n- Bug in :func:`concat` where error was raised in concatenating :class:`Series` with numpy scalar and tuple names (:issue:`21015`)\n- Bug in :func:`concat` warning message providing the wrong guidance for future behavior (:issue:`21101`)\n\n**Other**\n\n- Tab completion on :class:`Index` in IPython no longer outputs deprecation warnings (:issue:`21125`)\n- Bug preventing pandas being used on Windows without C++ redistributable installed (:issue:`21106`)\n\n\n.. _whatsnew_080:\n   ```\n   \n  \n  \n   ### 0.23.0\n   ```\n   ----------------------\n\nThis is a major release from 0.22.0 and includes a number of API changes,\ndeprecations, new features, enhancements, and performance improvements along\nwith a large number of bug fixes. We recommend that all users upgrade to this\nversion.\n\nHighlights include:\n\n- :ref:`Round-trippable JSON format with &#39;table&#39; orient &lt;whatsnew_0230.enhancements.round-trippable_json&gt;`.\n- :ref:`Instantiation from dicts respects order for Python 3.6+ &lt;whatsnew_0230.api_breaking.dict_insertion_order&gt;`.\n- :ref:`Dependent column arguments for assign &lt;whatsnew_0230.enhancements.assign_dependent&gt;`.\n- :ref:`Merging / sorting on a combination of columns and index levels &lt;whatsnew_0230.enhancements.merge_on_columns_and_levels&gt;`.\n- :ref:`Extending Pandas with custom types &lt;whatsnew_023.enhancements.extension&gt;`.\n- :ref:`Excluding unobserved categories from groupby &lt;whatsnew_0230.enhancements.categorical_grouping&gt;`.\n- :ref:`Changes to make output shape of DataFrame.apply consistent &lt;whatsnew_0230.api_breaking.apply&gt;`.\n\nCheck the :ref:`API Changes &lt;whatsnew_0230.api_breaking&gt;` and :ref:`deprecations &lt;whatsnew_0230.deprecations&gt;` before updating.\n\n.. warning::\n\n   Starting January 1, 2019, pandas feature releases will support Python 3 only.\n   See :ref:`install.dropping-27` for more.\n\n.. contents:: What&#39;s new in v0.23.0\n    :local:\n    :backlinks: none\n    :depth: 2\n\n.. _whatsnew_0230.enhancements:\n\nNew features\n~~~~~~~~~~~~\n\n.. _whatsnew_0230.enhancements.round-trippable_json:\n\nJSON read/write round-trippable with ``orient=&#39;table&#39;``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nA ``DataFrame`` can now be written to and subsequently read back via JSON while preserving metadata through usage of the ``orient=&#39;table&#39;`` argument (see :issue:`18912` and :issue:`9146`). Previously, none of the available ``orient`` values guaranteed the preservation of dtypes and index names, amongst other metadata.\n\n.. ipython:: python\n\n   df = pd.DataFrame({&#39;foo&#39;: [1, 2, 3, 4],\n\t\t      &#39;bar&#39;: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;],\n\t\t      &#39;baz&#39;: pd.date_range(&#39;2018-01-01&#39;, freq=&#39;d&#39;, periods=4),\n\t\t      &#39;qux&#39;: pd.Categorical([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;c&#39;])\n\t\t      }, index=pd.Index(range(4), name=&#39;idx&#39;))\n   df\n   df.dtypes\n   df.to_json(&#39;test.json&#39;, orient=&#39;table&#39;)\n   new_df = pd.read_json(&#39;test.json&#39;, orient=&#39;table&#39;)\n   new_df\n   new_df.dtypes\n\nPlease note that the string `index` is not supported with the round trip format, as it is used by default in ``write_json`` to indicate a missing index name.\n\n.. ipython:: python\n   :okwarning:\n\n   df.index.name = &#39;index&#39;\n\n   df.to_json(&#39;test.json&#39;, orient=&#39;table&#39;)\n   new_df = pd.read_json(&#39;test.json&#39;, orient=&#39;table&#39;)\n   new_df\n   new_df.dtypes\n\n.. ipython:: python\n   :suppress:\n\n   import os\n   os.remove(&#39;test.json&#39;)\n\n\n.. _whatsnew_0230.enhancements.assign_dependent:\n\n\n``.assign()`` accepts dependent arguments\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe :func:`DataFrame.assign` now accepts dependent keyword arguments for python version later than 3.6 (see also `PEP 468\n&lt;https://www.python.org/dev/peps/pep-0468/&gt;`_). Later keyword arguments may now refer to earlier ones if the argument is a callable. See the\n:ref:`documentation here &lt;dsintro.chained_assignment&gt;` (:issue:`14207`)\n\n.. ipython:: python\n\n    df = pd.DataFrame({&#39;A&#39;: [1, 2, 3]})\n    df\n    df.assign(B=df.A, C=lambda x:x[&#39;A&#39;]+ x[&#39;B&#39;])\n\n.. warning::\n\n  This may subtly change the behavior of your code when you&#39;re\n  using ``.assign()`` to update an existing column. Previously, callables\n  referring to other variables being updated would get the &quot;old&quot; values\n\n  Previous Behavior:\n\n  .. code-block:: ipython\n\n      In [2]: df = pd.DataFrame({&quot;A&quot;: [1, 2, 3]})\n\n      In [3]: df.assign(A=lambda df: df.A + 1, C=lambda df: df.A * -1)\n      Out[3]:\n         A  C\n      0  2 -1\n      1  3 -2\n      2  4 -3\n\n  New Behavior:\n\n  .. ipython:: python\n\n      df.assign(A=df.A+1, C= lambda df: df.A* -1)\n\n\n\n.. _whatsnew_0230.enhancements.merge_on_columns_and_levels:\n\nMerging on a combination of columns and index levels\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nStrings passed to :meth:`DataFrame.merge` as the ``on``, ``left_on``, and ``right_on``\nparameters may now refer to either column names or index level names.\nThis enables merging ``DataFrame`` instances on a combination of index levels\nand columns without resetting indexes. See the :ref:`Merge on columns and\nlevels &lt;merging.merge_on_columns_and_levels&gt;` documentation section.\n(:issue:`14355`)\n\n.. ipython:: python\n\n   left_index = pd.Index([&#39;K0&#39;, &#39;K0&#39;, &#39;K1&#39;, &#39;K2&#39;], name=&#39;key1&#39;)\n\n   left = pd.DataFrame({&#39;A&#39;: [&#39;A0&#39;, &#39;A1&#39;, &#39;A2&#39;, &#39;A3&#39;],\n                        &#39;B&#39;: [&#39;B0&#39;, &#39;B1&#39;, &#39;B2&#39;, &#39;B3&#39;],\n                        &#39;key2&#39;: [&#39;K0&#39;, &#39;K1&#39;, &#39;K0&#39;, &#39;K1&#39;]},\n                       index=left_index)\n\n   right_index = pd.Index([&#39;K0&#39;, &#39;K1&#39;, &#39;K2&#39;, &#39;K2&#39;], name=&#39;key1&#39;)\n\n   right = pd.DataFrame({&#39;C&#39;: [&#39;C0&#39;, &#39;C1&#39;, &#39;C2&#39;, &#39;C3&#39;],\n                         &#39;D&#39;: [&#39;D0&#39;, &#39;D1&#39;, &#39;D2&#39;, &#39;D3&#39;],\n                         &#39;key2&#39;: [&#39;K0&#39;, &#39;K0&#39;, &#39;K0&#39;, &#39;K1&#39;]},\n                        index=right_index)\n\n   left.merge(right, on=[&#39;key1&#39;, &#39;key2&#39;])\n\n.. _whatsnew_0230.enhancements.sort_by_columns_and_levels:\n\nSorting by a combination of columns and index levels\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nStrings passed to :meth:`DataFrame.sort_values` as the ``by`` parameter may\nnow refer to either column names or index level names.  This enables sorting\n``DataFrame`` instances by a combination of index levels and columns without\nresetting indexes. See the :ref:`Sorting by Indexes and Values\n&lt;basics.sort_indexes_and_values&gt;` documentation section.\n(:issue:`14353`)\n\n.. ipython:: python\n\n    Build MultiIndex\n   idx = pd.MultiIndex.from_tuples([(&#39;a&#39;, 1), (&#39;a&#39;, 2), (&#39;a&#39;, 2),\n                                    (&#39;b&#39;, 2), (&#39;b&#39;, 1), (&#39;b&#39;, 1)])\n   idx.names = [&#39;first&#39;, &#39;second&#39;]\n\n    Build DataFrame\n   df_multi = pd.DataFrame({&#39;A&#39;: np.arange(6, 0, -1)},\n                           index=idx)\n   df_multi\n\n    Sort by &#39;second&#39; (index) and &#39;A&#39; (column)\n   df_multi.sort_values(by=[&#39;second&#39;, &#39;A&#39;])\n\n\n.. _whatsnew_023.enhancements.extension:\n\nExtending Pandas with Custom Types (Experimental)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nPandas now supports storing array-like objects that aren&#39;t necessarily 1-D NumPy\narrays as columns in a DataFrame or values in a Series. This allows third-party\nlibraries to implement extensions to NumPy&#39;s types, similar to how pandas\nimplemented categoricals, datetimes with timezones, periods, and intervals.\n\nAs a demonstration, we&#39;ll use cyberpandas_, which provides an ``IPArray`` type\nfor storing ip addresses.\n\n.. code-block:: ipython\n\n   In [1]: from cyberpandas import IPArray\n\n   In [2]: values = IPArray([\n      ...:     0,\n      ...:     3232235777,\n      ...:     42540766452641154071740215577757643572\n      ...: ])\n      ...:\n      ...:\n\n``IPArray`` isn&#39;t a normal 1-D NumPy array, but because it&#39;s a pandas\n:class:`~pandas.api.extension.ExtensionArray`, it can be stored properly inside pandas&#39; containers.\n\n.. code-block:: ipython\n\n   In [3]: ser = pd.Series(values)\n\n   In [4]: ser\n   Out[4]:\n   0                         0.0.0.0\n   1                     192.168.1.1\n   2    2001:db8:85a3::8a2e:370:7334\n   dtype: ip\n\nNotice that the dtype is ``ip``. The missing value semantics of the underlying\narray are respected:\n\n.. code-block:: ipython\n\n   In [5]: ser.isna()\n   Out[5]:\n   0     True\n   1    False\n   2    False\n   dtype: bool\n\nFor more, see the :ref:`extension types &lt;extending.extension-types&gt;`\ndocumentation. If you build an extension array, publicize it on our\n:ref:`ecosystem page &lt;ecosystem.extensions&gt;`.\n\n.. _cyberpandas: https://cyberpandas.readthedocs.io/en/latest/\n\n\n.. _whatsnew_0230.enhancements.categorical_grouping:\n\nNew ``observed`` keyword for excluding unobserved categories in ``groupby``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nGrouping by a categorical includes the unobserved categories in the output.\nWhen grouping by multiple categorical columns, this means you get the cartesian product of all the\ncategories, including combinations where there are no observations, which can result in a large\nnumber of groups. We have added a keyword ``observed`` to control this behavior, it defaults to\n``observed=False`` for backward-compatibility. (:issue:`14942`, :issue:`8138`, :issue:`15217`, :issue:`17594`, :issue:`8669`, :issue:`20583`, :issue:`20902`)\n\n.. ipython:: python\n\n   cat1 = pd.Categorical([&quot;a&quot;, &quot;a&quot;, &quot;b&quot;, &quot;b&quot;],\n                         categories=[&quot;a&quot;, &quot;b&quot;, &quot;z&quot;], ordered=True)\n   cat2 = pd.Categorical([&quot;c&quot;, &quot;d&quot;, &quot;c&quot;, &quot;d&quot;],\n                         categories=[&quot;c&quot;, &quot;d&quot;, &quot;y&quot;], ordered=True)\n   df = pd.DataFrame({&quot;A&quot;: cat1, &quot;B&quot;: cat2, &quot;values&quot;: [1, 2, 3, 4]})\n   df[&#39;C&#39;] = [&#39;foo&#39;, &#39;bar&#39;] * 2\n   df\n\nTo show all values, the previous behavior:\n\n.. ipython:: python\n\n   df.groupby([&#39;A&#39;, &#39;B&#39;, &#39;C&#39;], observed=False).count()\n\n\nTo show only observed values:\n\n.. ipython:: python\n\n   df.groupby([&#39;A&#39;, &#39;B&#39;, &#39;C&#39;], observed=True).count()\n\nFor pivotting operations, this behavior is *already* controlled by the ``dropna`` keyword:\n\n.. ipython:: python\n\n   cat1 = pd.Categorical([&quot;a&quot;, &quot;a&quot;, &quot;b&quot;, &quot;b&quot;],\n                         categories=[&quot;a&quot;, &quot;b&quot;, &quot;z&quot;], ordered=True)\n   cat2 = pd.Categorical([&quot;c&quot;, &quot;d&quot;, &quot;c&quot;, &quot;d&quot;],\n                         categories=[&quot;c&quot;, &quot;d&quot;, &quot;y&quot;], ordered=True)\n   df = DataFrame({&quot;A&quot;: cat1, &quot;B&quot;: cat2, &quot;values&quot;: [1, 2, 3, 4]})\n   df\n\n.. ipython:: python\n\n   pd.pivot_table(df, values=&#39;values&#39;, index=[&#39;A&#39;, &#39;B&#39;],\n                  dropna=True)\n   pd.pivot_table(df, values=&#39;values&#39;, index=[&#39;A&#39;, &#39;B&#39;],\n                  dropna=False)\n\n\n.. _whatsnew_0230.enhancements.window_raw:\n\nRolling/Expanding.apply() accepts ``raw=False`` to pass a ``Series`` to the function\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n:func:`Series.rolling().apply() &lt;pandas.core.window.Rolling.apply&gt;`, :func:`DataFrame.rolling().apply() &lt;pandas.core.window.Rolling.apply&gt;`,\n:func:`Series.expanding().apply() &lt;pandas.core.window.Expanding.apply&gt;`, and :func:`DataFrame.expanding().apply() &lt;pandas.core.window.Expanding.apply&gt;` have gained a ``raw=None`` parameter.\nThis is similar to :func:`DataFame.apply`. This parameter, if ``True`` allows one to send a ``np.ndarray`` to the applied function. If ``False`` a ``Series`` will be passed. The\ndefault is ``None``, which preserves backward compatibility, so this will default to ``True``, sending an ``np.ndarray``.\nIn a future version the default will be changed to ``False``, sending a ``Series``. (:issue:`5071`, :issue:`20584`)\n\n.. ipython:: python\n\n   s = pd.Series(np.arange(5), np.arange(5) + 1)\n   s\n\nPass a ``Series``:\n\n.. ipython:: python\n\n   s.rolling(2, min_periods=1).apply(lambda x: x.iloc[-1], raw=False)\n\nMimic the original behavior of passing a ndarray:\n\n.. ipython:: python\n\n   s.rolling(2, min_periods=1).apply(lambda x: x[-1], raw=True)\n\n\n.. _whatsnew_0210.enhancements.limit_area:\n\n``DataFrame.interpolate`` has gained the ``limit_area`` kwarg\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n:meth:`DataFrame.interpolate` has gained a ``limit_area`` parameter to allow further control of which ``NaN`` s are replaced.\nUse ``limit_area=&#39;inside&#39;`` to fill only NaNs surrounded by valid values or use ``limit_area=&#39;outside&#39;`` to fill only ``NaN`` s\noutside the existing valid values while preserving those inside.  (:issue:`16284`) See the :ref:`full documentation here &lt;missing_data.interp_limits&gt;`.\n\n\n.. ipython:: python\n\n   ser = pd.Series([np.nan, np.nan, 5, np.nan, np.nan, np.nan, 13, np.nan, np.nan])\n   ser\n\nFill one consecutive inside value in both directions\n\n.. ipython:: python\n\n   ser.interpolate(limit_direction=&#39;both&#39;, limit_area=&#39;inside&#39;, limit=1)\n\nFill all consecutive outside values backward\n\n.. ipython:: python\n\n   ser.interpolate(limit_direction=&#39;backward&#39;, limit_area=&#39;outside&#39;)\n\nFill all consecutive outside values in both directions\n\n.. ipython:: python\n\n   ser.interpolate(limit_direction=&#39;both&#39;, limit_area=&#39;outside&#39;)\n\n.. _whatsnew_0210.enhancements.get_dummies_dtype:\n\n``get_dummies`` now supports ``dtype`` argument\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe :func:`get_dummies` now accepts a ``dtype`` argument, which specifies a dtype for the new columns. The default remains uint8. (:issue:`18330`)\n\n.. ipython:: python\n\n   df = pd.DataFrame({&#39;a&#39;: [1, 2], &#39;b&#39;: [3, 4], &#39;c&#39;: [5, 6]})\n   pd.get_dummies(df, columns=[&#39;c&#39;]).dtypes\n   pd.get_dummies(df, columns=[&#39;c&#39;], dtype=bool).dtypes\n\n\n.. _whatsnew_0230.enhancements.timedelta_mod:\n\nTimedelta mod method\n^^^^^^^^^^^^^^^^^^^^\n\n``mod`` (%) and ``divmod`` operations are now defined on ``Timedelta`` objects\nwhen operating with either timedelta-like or with numeric arguments.\nSee the :ref:`documentation here &lt;timedeltas.mod_divmod&gt;`. (:issue:`19365`)\n\n.. ipython:: python\n\n    td = pd.Timedelta(hours=37)\n    td % pd.Timedelta(minutes=45)\n\n.. _whatsnew_0230.enhancements.ran_inf:\n\n``.rank()`` handles ``inf`` values when ``NaN`` are present\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn previous versions, ``.rank()`` would assign ``inf`` elements ``NaN`` as their ranks. Now ranks are calculated properly. (:issue:`6945`)\n\n.. ipython:: python\n\n    s = pd.Series([-np.inf, 0, 1, np.nan, np.inf])\n    s\n\nPrevious Behavior:\n\n.. code-block:: ipython\n\n    In [11]: s.rank()\n    Out[11]:\n    0    1.0\n    1    2.0\n    2    3.0\n    3    NaN\n    4    NaN\n    dtype: float64\n\nCurrent Behavior:\n\n.. ipython:: python\n\n    s.rank()\n\nFurthermore, previously if you rank ``inf`` or ``-inf`` values together with ``NaN`` values, the calculation won&#39;t distinguish ``NaN`` from infinity when using &#39;top&#39; or &#39;bottom&#39; argument.\n\n.. ipython:: python\n\n    s = pd.Series([np.nan, np.nan, -np.inf, -np.inf])\n    s\n\nPrevious Behavior:\n\n.. code-block:: ipython\n\n    In [15]: s.rank(na_option=&#39;top&#39;)\n    Out[15]:\n    0    2.5\n    1    2.5\n    2    2.5\n    3    2.5\n    dtype: float64\n\nCurrent Behavior:\n\n.. ipython:: python\n\n    s.rank(na_option=&#39;top&#39;)\n\nThese bugs were squashed:\n\n- Bug in :meth:`DataFrame.rank` and :meth:`Series.rank` when ``method=&#39;dense&#39;`` and ``pct=True`` in which percentile ranks were not being used with the number of distinct observations (:issue:`15630`)\n- Bug in :meth:`Series.rank` and :meth:`DataFrame.rank` when ``ascending=&#39;False&#39;`` failed to return correct ranks for infinity if ``NaN`` were present (:issue:`19538`)\n- Bug in :func:`DataFrameGroupBy.rank` where ranks were incorrect when both infinity and ``NaN`` were present (:issue:`20561`)\n\n\n.. _whatsnew_0230.enhancements.str_cat_align:\n\n``Series.str.cat`` has gained the ``join`` kwarg\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nPreviously, :meth:`Series.str.cat` did not -- in contrast to most of ``pandas`` -- align :class:`Series` on their index before concatenation (see :issue:`18657`).\nThe method has now gained a keyword ``join`` to control the manner of alignment, see examples below and :ref:`here &lt;text.concatenate&gt;`.\n\nIn v.0.23 `join` will default to None (meaning no alignment), but this default will change to ``&#39;left&#39;`` in a future version of pandas.\n\n.. ipython:: python\n   :okwarning:\n\n    s = pd.Series([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;])\n    t = pd.Series([&#39;b&#39;, &#39;d&#39;, &#39;e&#39;, &#39;c&#39;], index=[1, 3, 4, 2])\n    s.str.cat(t)\n    s.str.cat(t, join=&#39;left&#39;, na_rep=&#39;-&#39;)\n\nFurthermore, :meth:`Series.str.cat` now works for ``CategoricalIndex`` as well (previously raised a ``ValueError``; see :issue:`20842`).\n\n.. _whatsnew_0230.enhancements.astype_category:\n\n``DataFrame.astype`` performs column-wise conversion to ``Categorical``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n:meth:`DataFrame.astype` can now perform column-wise conversion to ``Categorical`` by supplying the string ``&#39;category&#39;`` or\na :class:`~pandas.api.types.CategoricalDtype`. Previously, attempting this would raise a ``NotImplementedError``. See the\n:ref:`categorical.objectcreation` section of the documentation for more details and examples. (:issue:`12860`, :issue:`18099`)\n\nSupplying the string ``&#39;category&#39;`` performs column-wise conversion, with only labels appearing in a given column set as categories:\n\n.. ipython:: python\n\n    df = pd.DataFrame({&#39;A&#39;: list(&#39;abca&#39;), &#39;B&#39;: list(&#39;bccd&#39;)})\n    df = df.astype(&#39;category&#39;)\n    df[&#39;A&#39;].dtype\n    df[&#39;B&#39;].dtype\n\n\nSupplying a ``CategoricalDtype`` will make the categories in each column consistent with the supplied dtype:\n\n.. ipython:: python\n\n    from pandas.api.types import CategoricalDtype\n    df = pd.DataFrame({&#39;A&#39;: list(&#39;abca&#39;), &#39;B&#39;: list(&#39;bccd&#39;)})\n    cdt = CategoricalDtype(categories=list(&#39;abcd&#39;), ordered=True)\n    df = df.astype(cdt)\n    df[&#39;A&#39;].dtype\n    df[&#39;B&#39;].dtype\n\n\n.. _whatsnew_0230.enhancements.other:\n\nOther Enhancements\n^^^^^^^^^^^^^^^^^^\n\n- Unary ``+`` now permitted for ``Series`` and ``DataFrame`` as  numeric operator (:issue:`16073`)\n- Better support for :meth:`~pandas.io.formats.style.Styler.to_excel` output with the ``xlsxwriter`` engine. (:issue:`16149`)\n- :func:`pandas.tseries.frequencies.to_offset` now accepts leading &#39;+&#39; signs e.g. &#39;+1h&#39;. (:issue:`18171`)\n- :func:`MultiIndex.unique` now supports the ``level=`` argument, to get unique values from a specific index level (:issue:`17896`)\n- :class:`pandas.io.formats.style.Styler` now has method ``hide_index()`` to determine whether the index will be rendered in output (:issue:`14194`)\n- :class:`pandas.io.formats.style.Styler` now has method ``hide_columns()`` to determine whether columns will be hidden in output (:issue:`14194`)\n- Improved wording of ``ValueError`` raised in :func:`to_datetime` when ``unit=`` is passed with a non-convertible value (:issue:`14350`)\n- :func:`Series.fillna` now accepts a Series or a dict as a ``value`` for a categorical dtype (:issue:`17033`)\n- :func:`pandas.read_clipboard` updated to use qtpy, falling back to PyQt5 and then PyQt4, adding compatibility with Python3 and multiple python-qt bindings (:issue:`17722`)\n- Improved wording of ``ValueError`` raised in :func:`read_csv` when the ``usecols`` argument cannot match all columns. (:issue:`17301`)\n- :func:`DataFrame.corrwith` now silently drops non-numeric columns when passed a Series. Before, an exception was raised (:issue:`18570`).\n- :class:`IntervalIndex` now supports time zone aware ``Interval`` objects (:issue:`18537`, :issue:`18538`)\n- :func:`Series` / :func:`DataFrame` tab completion also returns identifiers in the first level of a :func:`MultiIndex`. (:issue:`16326`)\n- :func:`read_excel()` has gained the ``nrows`` parameter (:issue:`16645`)\n- :meth:`DataFrame.append` can now in more cases preserve the type of the calling dataframe&#39;s columns (e.g. if both are ``CategoricalIndex``) (:issue:`18359`)\n- :meth:`DataFrame.to_json` and :meth:`Series.to_json` now accept an ``index`` argument which allows the user to exclude the index from the JSON output (:issue:`17394`)\n- ``IntervalIndex.to_tuples()`` has gained the ``na_tuple`` parameter to control whether NA is returned as a tuple of NA, or NA itself (:issue:`18756`)\n- ``Categorical.rename_categories``, ``CategoricalIndex.rename_categories`` and :attr:`Series.cat.rename_categories`\n  can now take a callable as their argument (:issue:`18862`)\n- :class:`Interval` and :class:`IntervalIndex` have gained a ``length`` attribute (:issue:`18789`)\n- ``Resampler`` objects now have a functioning :attr:`~pandas.core.resample.Resampler.pipe` method.\n  Previously, calls to ``pipe`` were diverted to  the ``mean`` method (:issue:`17905`).\n- :func:`~pandas.api.types.is_scalar` now returns ``True`` for ``DateOffset`` objects (:issue:`18943`).\n- :func:`DataFrame.pivot` now accepts a list for the ``values=`` kwarg (:issue:`17160`).\n- Added :func:`pandas.api.extensions.register_dataframe_accessor`,\n  :func:`pandas.api.extensions.register_series_accessor`, and\n  :func:`pandas.api.extensions.register_index_accessor`, accessor for libraries downstream of pandas\n  to register custom accessors like ``.cat`` on pandas objects. See\n  :ref:`Registering Custom Accessors &lt;extending.register-accessors&gt;` for more (:issue:`14781`).\n\n- ``IntervalIndex.astype`` now supports conversions between subtypes when passed an ``IntervalDtype`` (:issue:`19197`)\n- :class:`IntervalIndex` and its associated constructor methods (``from_arrays``, ``from_breaks``, ``from_tuples``) have gained a ``dtype`` parameter (:issue:`19262`)\n- Added :func:`pandas.core.groupby.SeriesGroupBy.is_monotonic_increasing` and :func:`pandas.core.groupby.SeriesGroupBy.is_monotonic_decreasing` (:issue:`17015`)\n- For subclassed ``DataFrames``, :func:`DataFrame.apply` will now preserve the ``Series`` subclass (if defined) when passing the data to the applied function (:issue:`19822`)\n- :func:`DataFrame.from_dict` now accepts a ``columns`` argument that can be used to specify the column names when ``orient=&#39;index&#39;`` is used (:issue:`18529`)\n- Added option ``display.html.use_mathjax`` so `MathJax &lt;https://www.mathjax.org/&gt;`_ can be disabled when rendering tables in ``Jupyter`` notebooks (:issue:`19856`, :issue:`19824`)\n- :func:`DataFrame.replace` now supports the ``method`` parameter, which can be used to specify the replacement method when ``to_replace`` is a scalar, list or tuple and ``value`` is ``None`` (:issue:`19632`)\n- :meth:`Timestamp.month_name`, :meth:`DatetimeIndex.month_name`, and :meth:`Series.dt.month_name` are now available (:issue:`12805`)\n- :meth:`Timestamp.day_name` and :meth:`DatetimeIndex.day_name` are now available to return day names with a specified locale (:issue:`12806`)\n- :meth:`DataFrame.to_sql` now performs a multi-value insert if the underlying connection supports itk rather than inserting row by row.\n  ``SQLAlchemy`` dialects supporting multi-value inserts include: ``mysql``, ``postgresql``, ``sqlite`` and any dialect with ``supports_multivalues_insert``. (:issue:`14315`, :issue:`8953`)\n- :func:`read_html` now accepts a ``displayed_only`` keyword argument to controls whether or not hidden elements are parsed (``True`` by default) (:issue:`20027`)\n- :func:`read_html` now reads all ``&lt;tbody&gt;`` elements in a ``&lt;table&gt;``, not just the first. (:issue:`20690`)\n- :meth:`~pandas.core.window.Rolling.quantile` and :meth:`~pandas.core.window.Expanding.quantile` now accept the ``interpolation`` keyword, ``linear`` by default (:issue:`20497`)\n- zip compression is supported via ``compression=zip`` in :func:`DataFrame.to_pickle`, :func:`Series.to_pickle`, :func:`DataFrame.to_csv`, :func:`Series.to_csv`, :func:`DataFrame.to_json`, :func:`Series.to_json`. (:issue:`17778`)\n- :class:`~pandas.tseries.offsets.WeekOfMonth` constructor now supports ``n=0`` (:issue:`20517`).\n- :class:`DataFrame` and :class:`Series` now support matrix multiplication (`) operator (:issue:`10259`) for Python&gt;=3.5\n- Updated :meth:`DataFrame.to_gbq` and :meth:`pandas.read_gbq` signature and documentation to reflect changes from\n  the Pandas-GBQ library version 0.4.0. Adds intersphinx mapping to Pandas-GBQ\n  library. (:issue:`20564`)\n- Added new writer for exporting Stata dta files in version 117, ``StataWriter117``.  This format supports exporting strings with lengths up to 2,000,000 characters (:issue:`16450`)\n- :func:`to_hdf` and :func:`read_hdf` now accept an ``errors`` keyword argument to control encoding error handling (:issue:`20835`)\n- :func:`cut` has gained the ``duplicates=&#39;raise&#39;|&#39;drop&#39;`` option to control whether to raise on duplicated edges (:issue:`20947`)\n- :func:`date_range`, :func:`timedelta_range`, and :func:`interval_range` now return a linearly spaced index if ``start``, ``stop``, and ``periods`` are specified, but ``freq`` is not. (:issue:`20808`, :issue:`20983`, :issue:`20976`)\n\n.. _whatsnew_0230.api_breaking:\n\nBackwards incompatible API changes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. _whatsnew_0230.api_breaking.deps:\n\nDependencies have increased minimum versions\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWe have updated our minimum supported versions of dependencies (:issue:`15184`).\nIf installed, we now require:\n\n+-----------------+-----------------+----------+---------------+\n| Package         | Minimum Version | Required |     Issue     |\n+=================+=================+==========+===============+\n| python-dateutil | 2.5.0           |    X     | :issue:`15184`|\n+-----------------+-----------------+----------+---------------+\n| openpyxl        | 2.4.0           |          | :issue:`15184`|\n+-----------------+-----------------+----------+---------------+\n| beautifulsoup4  | 4.2.1           |          | :issue:`20082`|\n+-----------------+-----------------+----------+---------------+\n| setuptools      | 24.2.0          |          | :issue:`20698`|\n+-----------------+-----------------+----------+---------------+\n\n.. _whatsnew_0230.api_breaking.dict_insertion_order:\n\nInstantiation from dicts preserves dict insertion order for python 3.6+\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nUntil Python 3.6, dicts in Python had no formally defined ordering. For Python\nversion 3.6 and later, dicts are ordered by insertion order, see\n`PEP 468 &lt;https://www.python.org/dev/peps/pep-0468/&gt;`_.\nPandas will use the dict&#39;s insertion order, when creating a ``Series`` or\n``DataFrame`` from a dict and you&#39;re using Python version 3.6 or\nhigher. (:issue:`19884`)\n\nPrevious Behavior (and current behavior if on Python &lt; 3.6):\n\n.. code-block:: ipython\n\n   pd.Series({&#39;Income&#39;: 2000,\n              &#39;Expenses&#39;: -1500,\n              &#39;Taxes&#39;: -200,\n              &#39;Net result&#39;: 300})\n   Expenses     -1500\n   Income        2000\n   Net result     300\n   Taxes         -200\n   dtype: int64\n\nNote the Series above is ordered alphabetically by the index values.\n\nNew Behavior (for Python &gt;= 3.6):\n\n.. ipython:: python\n\n    pd.Series({&#39;Income&#39;: 2000,\n               &#39;Expenses&#39;: -1500,\n               &#39;Taxes&#39;: -200,\n               &#39;Net result&#39;: 300})\n\nNotice that the Series is now ordered by insertion order. This new behavior is\nused for all relevant pandas types (``Series``, ``DataFrame``, ``SparseSeries``\nand ``SparseDataFrame``).\n\nIf you wish to retain the old behavior while using Python &gt;= 3.6, you can use\n``.sort_index()``:\n\n.. ipython:: python\n\n    pd.Series({&#39;Income&#39;: 2000,\n               &#39;Expenses&#39;: -1500,\n               &#39;Taxes&#39;: -200,\n               &#39;Net result&#39;: 300}).sort_index()\n\n.. _whatsnew_0230.api_breaking.deprecate_panel:\n\nDeprecate Panel\n^^^^^^^^^^^^^^^\n\n``Panel`` was deprecated in the 0.20.x release, showing as a ``DeprecationWarning``. Using ``Panel`` will now show a ``FutureWarning``. The recommended way to represent 3-D data are\nwith a ``MultiIndex`` on a ``DataFrame`` via the :meth:`~Panel.to_frame` or with the `xarray package &lt;http://xarray.pydata.org/en/stable/&gt;`__. Pandas\nprovides a :meth:`~Panel.to_xarray` method to automate this conversion. For more details see :ref:`Deprecate Panel &lt;dsintro.deprecate_panel&gt;` documentation. (:issue:`13563`, :issue:`18324`).\n\n.. ipython:: python\n   :suppress:\n\n   import pandas.util.testing as tm\n\n.. ipython:: python\n   :okwarning:\n\n   p = tm.makePanel()\n   p\n\nConvert to a MultiIndex DataFrame\n\n.. ipython:: python\n\n   p.to_frame()\n\nConvert to an xarray DataArray\n\n.. ipython:: python\n   :okwarning:\n\n   p.to_xarray()\n\n\n.. _whatsnew_0230.api_breaking.core_common:\n\npandas.core.common removals\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe following error &amp; warning messages are removed from ``pandas.core.common`` (:issue:`13634`, :issue:`19769`):\n\n- ``PerformanceWarning``\n- ``UnsupportedFunctionCall``\n- ``UnsortedIndexError``\n- ``AbstractMethodError``\n\nThese are available from import from ``pandas.errors`` (since 0.19.0).\n\n\n.. _whatsnew_0230.api_breaking.apply:\n\nChanges to make output of ``DataFrame.apply`` consistent\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n:func:`DataFrame.apply` was inconsistent when applying an arbitrary user-defined-function that returned a list-like with ``axis=1``. Several bugs and inconsistencies\nare resolved. If the applied function returns a Series, then pandas will return a DataFrame; otherwise a Series will be returned, this includes the case\nwhere a list-like (e.g. ``tuple`` or ``list`` is returned) (:issue:`16353`, :issue:`17437`, :issue:`17970`, :issue:`17348`, :issue:`17892`, :issue:`18573`,\n:issue:`17602`, :issue:`18775`, :issue:`18901`, :issue:`18919`).\n\n.. ipython:: python\n\n    df = pd.DataFrame(np.tile(np.arange(3), 6).reshape(6, -1) + 1, columns=[&#39;A&#39;, &#39;B&#39;, &#39;C&#39;])\n    df\n\nPrevious Behavior: if the returned shape happened to match the length of original columns, this would return a ``DataFrame``.\nIf the return shape did not match, a ``Series`` with lists was returned.\n\n.. code-block:: python\n\n   In [3]: df.apply(lambda x: [1, 2, 3], axis=1)\n   Out[3]:\n      A  B  C\n   0  1  2  3\n   1  1  2  3\n   2  1  2  3\n   3  1  2  3\n   4  1  2  3\n   5  1  2  3\n\n   In [4]: df.apply(lambda x: [1, 2], axis=1)\n   Out[4]:\n   0    [1, 2]\n   1    [1, 2]\n   2    [1, 2]\n   3    [1, 2]\n   4    [1, 2]\n   5    [1, 2]\n   dtype: object\n\n\nNew Behavior: When the applied function returns a list-like, this will now *always* return a ``Series``.\n\n.. ipython:: python\n\n    df.apply(lambda x: [1, 2, 3], axis=1)\n    df.apply(lambda x: [1, 2], axis=1)\n\nTo have expanded columns, you can use ``result_type=&#39;expand&#39;``\n\n.. ipython:: python\n\n    df.apply(lambda x: [1, 2, 3], axis=1, result_type=&#39;expand&#39;)\n\nTo broadcast the result across the original columns (the old behaviour for\nlist-likes of the correct length), you can use ``result_type=&#39;broadcast&#39;``.\nThe shape must match the original columns.\n\n.. ipython:: python\n\n    df.apply(lambda x: [1, 2, 3], axis=1, result_type=&#39;broadcast&#39;)\n\nReturning a ``Series`` allows one to control the exact return structure and column names:\n\n.. ipython:: python\n\n    df.apply(lambda x: Series([1, 2, 3], index=[&#39;D&#39;, &#39;E&#39;, &#39;F&#39;]), axis=1)\n\n.. _whatsnew_0230.api_breaking.concat:\n\nConcatenation will no longer sort\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIn a future version of pandas :func:`pandas.concat` will no longer sort the non-concatenation axis when it is not already aligned.\nThe current behavior is the same as the previous (sorting), but now a warning is issued when ``sort`` is not specified and the non-concatenation axis is not aligned (:issue:`4588`).\n\n.. ipython:: python\n   :okwarning:\n\n   df1 = pd.DataFrame({&quot;a&quot;: [1, 2], &quot;b&quot;: [1, 2]}, columns=[&#39;b&#39;, &#39;a&#39;])\n   df2 = pd.DataFrame({&quot;a&quot;: [4, 5]})\n\n   pd.concat([df1, df2])\n\nTo keep the previous behavior (sorting) and silence the warning, pass ``sort=True``\n\n.. ipython:: python\n\n   pd.concat([df1, df2], sort=True)\n\nTo accept the future behavior (no sorting), pass ``sort=False``\n\n.. ipython\n\n   pd.concat([df1, df2], sort=False)\n\nNote that this change also applies to :meth:`DataFrame.append`, which has also received a ``sort`` keyword for controlling this behavior.\n\n\n.. _whatsnew_0230.api_breaking.build_changes:\n\nBuild Changes\n^^^^^^^^^^^^^\n\n- Building pandas for development now requires ``cython &gt;= 0.24`` (:issue:`18613`)\n- Building from source now explicitly requires ``setuptools`` in ``setup.py`` (:issue:`18113`)\n- Updated conda recipe to be in compliance with conda-build 3.0+ (:issue:`18002`)\n\n.. _whatsnew_0230.api_breaking.index_division_by_zero:\n\nIndex Division By Zero Fills Correctly\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nDivision operations on ``Index`` and subclasses will now fill division of positive numbers by zero with ``np.inf``, division of negative numbers by zero with ``-np.inf`` and `0 / 0` with ``np.nan``.  This matches existing ``Series`` behavior. (:issue:`19322`, :issue:`19347`)\n\nPrevious Behavior:\n\n.. code-block:: ipython\n\n    In [6]: index = pd.Int64Index([-1, 0, 1])\n\n    In [7]: index / 0\n    Out[7]: Int64Index([0, 0, 0], dtype=&#39;int64&#39;)\n\n     Previous behavior yielded different results depending on the type of zero in the divisor\n    In [8]: index / 0.0\n    Out[8]: Float64Index([-inf, nan, inf], dtype=&#39;float64&#39;)\n\n    In [9]: index = pd.UInt64Index([0, 1])\n\n    In [10]: index / np.array([0, 0], dtype=np.uint64)\n    Out[10]: UInt64Index([0, 0], dtype=&#39;uint64&#39;)\n\n    In [11]: pd.RangeIndex(1, 5) / 0\n    ZeroDivisionError: integer division or modulo by zero\n\nCurrent Behavior:\n\n.. ipython:: python\n\n    index = pd.Int64Index([-1, 0, 1])\n     division by zero gives -infinity where negative, +infinity where positive, and NaN for 0 / 0\n    index / 0\n\n     The result of division by zero should not depend on whether the zero is int or float\n    index / 0.0\n\n    index = pd.UInt64Index([0, 1])\n    index / np.array([0, 0], dtype=np.uint64)\n\n    pd.RangeIndex(1, 5) / 0\n\n.. _whatsnew_0230.api_breaking.extract:\n\nExtraction of matching patterns from strings\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nBy default, extracting matching patterns from strings with :func:`str.extract` used to return a\n``Series`` if a single group was being extracted (a ``DataFrame`` if more than one group was\nextracted). As of Pandas 0.23.0 :func:`str.extract` always returns a ``DataFrame``, unless\n``expand`` is set to ``False``. Finally, ``None`` was an accepted value for\nthe ``expand`` parameter (which was equivalent to ``False``), but now raises a ``ValueError``. (:issue:`11386`)\n\nPrevious Behavior:\n\n.. code-block:: ipython\n\n    In [1]: s = pd.Series([&#39;number 10&#39;, &#39;12 eggs&#39;])\n\n    In [2]: extracted = s.str.extract(&#39;.*(\\d\\d).*&#39;)\n\n    In [3]: extracted\n    Out [3]:\n    0    10\n    1    12\n    dtype: object\n\n    In [4]: type(extracted)\n    Out [4]:\n    pandas.core.series.Series\n\nNew Behavior:\n\n.. ipython:: python\n\n    s = pd.Series([&#39;number 10&#39;, &#39;12 eggs&#39;])\n    extracted = s.str.extract(&#39;.*(\\d\\d).*&#39;)\n    extracted\n    type(extracted)\n\nTo restore previous behavior, simply set ``expand`` to ``False``:\n\n.. ipython:: python\n\n    s = pd.Series([&#39;number 10&#39;, &#39;12 eggs&#39;])\n    extracted = s.str.extract(&#39;.*(\\d\\d).*&#39;, expand=False)\n    extracted\n    type(extracted)\n\n.. _whatsnew_0230.api_breaking.cdt_ordered:\n\nDefault value for the ``ordered`` parameter of ``CategoricalDtype``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe default value of the ``ordered`` parameter for :class:`~pandas.api.types.CategoricalDtype` has changed from ``False`` to ``None`` to allow updating of ``categories`` without impacting ``ordered``.  Behavior should remain consistent for downstream objects, such as :class:`Categorical` (:issue:`18790`)\n\nIn previous versions, the default value for the ``ordered`` parameter was ``False``.  This could potentially lead to the ``ordered`` parameter unintentionally being changed from ``True`` to ``False`` when users attempt to update ``categories`` if ``ordered`` is not explicitly specified, as it would silently default to ``False``.  The new behavior for ``ordered=None`` is to retain the existing value of ``ordered``.\n\nNew Behavior:\n\n.. ipython:: python\n\n    from pandas.api.types import CategoricalDtype\n    cat = pd.Categorical(list(&#39;abcaba&#39;), ordered=True, categories=list(&#39;cba&#39;))\n    cat\n    cdt = CategoricalDtype(categories=list(&#39;cbad&#39;))\n    cat.astype(cdt)\n\nNotice in the example above that the converted ``Categorical`` has retained ``ordered=True``.  Had the default value for ``ordered`` remained as ``False``, the converted ``Categorical`` would have become unordered, despite ``ordered=False`` never being explicitly specified.  To change the value of ``ordered``, explicitly pass it to the new dtype, e.g. ``CategoricalDtype(categories=list(&#39;cbad&#39;), ordered=False)``.\n\nNote that the unintentional conversion of ``ordered`` discussed above did not arise in previous versions due to separate bugs that prevented ``astype`` from doing any type of category to category conversion (:issue:`10696`, :issue:`18593`).  These bugs have been fixed in this release, and motivated changing the default value of ``ordered``.\n\n.. _whatsnew_0230.api_breaking.pretty_printing:\n\nBetter pretty-printing of DataFrames in a terminal\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nPreviously, the default value for the maximum number of columns was\n``pd.options.display.max_columns=20``. This meant that relatively wide data\nframes would not fit within the terminal width, and pandas would introduce line\nbreaks to display these 20 columns. This resulted in an output that was\nrelatively difficult to read:\n\n.. image:: _static/print_df_old.png\n\nIf Python runs in a terminal, the maximum number of columns is now determined\nautomatically so that the printed data frame fits within the current terminal\nwidth (``pd.options.display.max_columns=0``) (:issue:`17023`). If Python runs\nas a Jupyter kernel (such as the Jupyter QtConsole or a Jupyter notebook, as\nwell as in many IDEs), this value cannot be inferred automatically and is thus\nset to `20` as in previous versions. In a terminal, this results in a much\nnicer output:\n\n.. image:: _static/print_df_new.png\n\nNote that if you don&#39;t like the new default, you can always set this option\nyourself. To revert to the old setting, you can run this line:\n\n.. code-block:: python\n\n  pd.options.display.max_columns = 20\n\n.. _whatsnew_0230.api.datetimelike:\n\nDatetimelike API Changes\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n- The default ``Timedelta`` constructor now accepts an ``ISO 8601 Duration`` string as an argument (:issue:`19040`)\n- Subtracting ``NaT`` from a :class:`Series` with ``dtype=&#39;datetime64[ns]&#39;`` returns a ``Series`` with ``dtype=&#39;timedelta64[ns]&#39;`` instead of ``dtype=&#39;datetime64[ns]&#39;`` (:issue:`18808`)\n- Addition or subtraction of ``NaT`` from :class:`TimedeltaIndex` will return ``TimedeltaIndex`` instead of ``DatetimeIndex`` (:issue:`19124`)\n- :func:`DatetimeIndex.shift` and :func:`TimedeltaIndex.shift` will now raise ``NullFrequencyError`` (which subclasses ``ValueError``, which was raised in older versions) when the index object frequency is ``None`` (:issue:`19147`)\n- Addition and subtraction of ``NaN`` from a :class:`Series` with ``dtype=&#39;timedelta64[ns]&#39;`` will raise a ``TypeError`` instead of treating the ``NaN`` as ``NaT`` (:issue:`19274`)\n- ``NaT`` division with :class:`datetime.timedelta` will now return ``NaN`` instead of raising (:issue:`17876`)\n- Operations between a :class:`Series` with dtype ``dtype=&#39;datetime64[ns]&#39;`` and a :class:`PeriodIndex` will correctly raises ``TypeError`` (:issue:`18850`)\n- Subtraction of :class:`Series` with timezone-aware ``dtype=&#39;datetime64[ns]&#39;`` with mis-matched timezones will raise ``TypeError`` instead of ``ValueError`` (:issue:`18817`)\n- :class:`Timestamp` will no longer silently ignore unused or invalid ``tz`` or ``tzinfo`` keyword arguments (:issue:`17690`)\n- :class:`Timestamp` will no longer silently ignore invalid ``freq`` arguments (:issue:`5168`)\n- :class:`CacheableOffset` and :class:`WeekDay` are no longer available in the ``pandas.tseries.offsets`` module (:issue:`17830`)\n- ``pandas.tseries.frequencies.get_freq_group()`` and ``pandas.tseries.frequencies.DAYS`` are removed from the public API (:issue:`18034`)\n- :func:`Series.truncate` and :func:`DataFrame.truncate` will raise a ``ValueError`` if the index is not sorted instead of an unhelpful ``KeyError`` (:issue:`17935`)\n- :attr:`Series.first` and :attr:`DataFrame.first` will now raise a ``TypeError``\n  rather than ``NotImplementedError`` when index is not a :class:`DatetimeIndex` (:issue:`20725`).\n- :attr:`Series.last` and :attr:`DataFrame.last` will now raise a ``TypeError``\n  rather than ``NotImplementedError`` when index is not a :class:`DatetimeIndex` (:issue:`20725`).\n- Restricted ``DateOffset`` keyword arguments. Previously, ``DateOffset`` subclasses allowed arbitrary keyword arguments which could lead to unexpected behavior. Now, only valid arguments will be accepted. (:issue:`17176`, :issue:`18226`).\n- :func:`pandas.merge` provides a more informative error message when trying to merge on timezone-aware and timezone-naive columns (:issue:`15800`)\n- For :class:`DatetimeIndex` and :class:`TimedeltaIndex` with ``freq=None``, addition or subtraction of integer-dtyped array or ``Index`` will raise ``NullFrequencyError`` instead of ``TypeError`` (:issue:`19895`)\n- :class:`Timestamp` constructor now accepts a `nanosecond` keyword or positional argument (:issue:`18898`)\n- :class:`DatetimeIndex` will now raise an ``AttributeError`` when the ``tz`` attribute is set after instantiation (:issue:`3746`)\n- :class:`DatetimeIndex` with a ``pytz`` timezone will now return a consistent ``pytz`` timezone (:issue:`18595`)\n\n.. _whatsnew_0230.api.other:\n\nOther API Changes\n^^^^^^^^^^^^^^^^^\n\n- :func:`Series.astype` and :func:`Index.astype` with an incompatible dtype will now raise a ``TypeError`` rather than a ``ValueError`` (:issue:`18231`)\n- ``Series`` construction with an ``object`` dtyped tz-aware datetime and ``dtype=object`` specified, will now return an ``object`` dtyped ``Series``, previously this would infer the datetime dtype (:issue:`18231`)\n- A :class:`Series` of ``dtype=category`` constructed from an empty ``dict`` will now have categories of ``dtype=object`` rather than ``dtype=float64``, consistently with the case in which an empty list is passed (:issue:`18515`)\n- All-NaN levels in a ``MultiIndex`` are now assigned ``float`` rather than ``object`` dtype, promoting consistency with ``Index`` (:issue:`17929`).\n- Levels names of a ``MultiIndex`` (when not None) are now required to be unique: trying to create a ``MultiIndex`` with repeated names will raise a ``ValueError`` (:issue:`18872`)\n- Both construction and renaming of ``Index``/``MultiIndex`` with non-hashable ``name``/``names`` will now raise ``TypeError`` (:issue:`20527`)\n- :func:`Index.map` can now accept ``Series`` and dictionary input objects (:issue:`12756`, :issue:`18482`, :issue:`18509`).\n- :func:`DataFrame.unstack` will now default to filling with ``np.nan`` for ``object`` columns. (:issue:`12815`)\n- :class:`IntervalIndex` constructor will raise if the ``closed`` parameter conflicts with how the input data is inferred to be closed (:issue:`18421`)\n- Inserting missing values into indexes will work for all types of indexes and automatically insert the correct type of missing value (``NaN``, ``NaT``, etc.) regardless of the type passed in (:issue:`18295`)\n- When created with duplicate labels, ``MultiIndex`` now raises a ``ValueError``. (:issue:`17464`)\n- :func:`Series.fillna` now raises a ``TypeError`` instead of a ``ValueError`` when passed a list, tuple or DataFrame as a ``value`` (:issue:`18293`)\n- :func:`pandas.DataFrame.merge` no longer casts a ``float`` column to ``object`` when merging on ``int`` and ``float`` columns (:issue:`16572`)\n- :func:`pandas.merge` now raises a ``ValueError`` when trying to merge on incompatible data types (:issue:`9780`)\n- The default NA value for :class:`UInt64Index` has changed from 0 to ``NaN``, which impacts methods that mask with NA, such as ``UInt64Index.where()`` (:issue:`18398`)\n- Refactored ``setup.py`` to use ``find_packages`` instead of explicitly listing out all subpackages (:issue:`18535`)\n- Rearranged the order of keyword arguments in :func:`read_excel()` to align with :func:`read_csv()` (:issue:`16672`)\n- :func:`wide_to_long` previously kept numeric-like suffixes as ``object`` dtype. Now they are cast to numeric if possible (:issue:`17627`)\n- In :func:`read_excel`, the ``comment`` argument is now exposed as a named parameter (:issue:`18735`)\n- Rearranged the order of keyword arguments in :func:`read_excel()` to align with :func:`read_csv()` (:issue:`16672`)\n- The options ``html.border`` and ``mode.use_inf_as_null`` were deprecated in prior versions, these will now show ``FutureWarning`` rather than a ``DeprecationWarning`` (:issue:`19003`)\n- :class:`IntervalIndex` and ``IntervalDtype`` no longer support categorical, object, and string subtypes (:issue:`19016`)\n- ``IntervalDtype`` now returns ``True`` when compared against ``&#39;interval&#39;`` regardless of subtype, and ``IntervalDtype.name`` now returns ``&#39;interval&#39;`` regardless of subtype (:issue:`18980`)\n- ``KeyError`` now raises instead of ``ValueError`` in :meth:`~DataFrame.drop`, :meth:`~Panel.drop`, :meth:`~Series.drop`, :meth:`~Index.drop` when dropping a non-existent element in an axis with duplicates (:issue:`19186`)\n- :func:`Series.to_csv` now accepts a ``compression`` argument that works in the same way as the ``compression`` argument in :func:`DataFrame.to_csv` (:issue:`18958`)\n- Set operations (union, difference...) on :class:`IntervalIndex` with incompatible index types will now raise a ``TypeError`` rather than a ``ValueError`` (:issue:`19329`)\n- :class:`DateOffset` objects render more simply, e.g. ``&lt;DateOffset: days=1&gt;`` instead of ``&lt;DateOffset: kwds={&#39;days&#39;: 1}&gt;`` (:issue:`19403`)\n- ``Categorical.fillna`` now validates its ``value`` and ``method`` keyword arguments. It now raises when both or none are specified, matching the behavior of :meth:`Series.fillna` (:issue:`19682`)\n- ``pd.to_datetime(&#39;today&#39;)`` now returns a datetime, consistent with ``pd.Timestamp(&#39;today&#39;)``; previously ``pd.to_datetime(&#39;today&#39;)`` returned a ``.normalized()`` datetime (:issue:`19935`)\n- :func:`Series.str.replace` now takes an optional `regex` keyword which, when set to ``False``, uses literal string replacement rather than regex replacement (:issue:`16808`)\n- :func:`DatetimeIndex.strftime` and :func:`PeriodIndex.strftime` now return an ``Index`` instead of a numpy array to be consistent with similar accessors (:issue:`20127`)\n- Constructing a Series from a list of length 1 no longer broadcasts this list when a longer index is specified (:issue:`19714`, :issue:`20391`).\n- :func:`DataFrame.to_dict` with ``orient=&#39;index&#39;`` no longer casts int columns to float for a DataFrame with only int and float columns (:issue:`18580`)\n- A user-defined-function that is passed to :func:`Series.rolling().aggregate() &lt;pandas.core.window.Rolling.aggregate&gt;`, :func:`DataFrame.rolling().aggregate() &lt;pandas.core.window.Rolling.aggregate&gt;`, or its expanding cousins, will now *always* be passed a ``Series``, rather than a ``np.array``; ``.apply()`` only has the ``raw`` keyword, see :ref:`here &lt;whatsnew_0230.enhancements.window_raw&gt;`. This is consistent with the signatures of ``.aggregate()`` across pandas (:issue:`20584`)\n- Rolling and Expanding types raise ``NotImplementedError`` upon iteration (:issue:`11704`).\n\n.. _whatsnew_0230.deprecations:\n\nDeprecations\n~~~~~~~~~~~~\n\n- ``Series.from_array`` and ``SparseSeries.from_array`` are deprecated. Use the normal constructor ``Series(..)`` and ``SparseSeries(..)`` instead (:issue:`18213`).\n- ``DataFrame.as_matrix`` is deprecated. Use ``DataFrame.values`` instead (:issue:`18458`).\n- ``Series.asobject``, ``DatetimeIndex.asobject``, ``PeriodIndex.asobject`` and ``TimeDeltaIndex.asobject`` have been deprecated. Use ``.astype(object)`` instead (:issue:`18572`)\n- Grouping by a tuple of keys now emits a ``FutureWarning`` and is deprecated.\n  In the future, a tuple passed to ``&#39;by&#39;`` will always refer to a single key\n  that is the actual tuple, instead of treating the tuple as multiple keys. To\n  retain the previous behavior, use a list instead of a tuple (:issue:`18314`)\n- ``Series.valid`` is deprecated. Use :meth:`Series.dropna` instead (:issue:`18800`).\n- :func:`read_excel` has deprecated the ``skip_footer`` parameter. Use ``skipfooter`` instead (:issue:`18836`)\n- :meth:`ExcelFile.parse` has deprecated ``sheetname`` in favor of ``sheet_name`` for consistency with :func:`read_excel` (:issue:`20920`).\n- The ``is_copy`` attribute is deprecated and will be removed in a future version (:issue:`18801`).\n- ``IntervalIndex.from_intervals`` is deprecated in favor of the :class:`IntervalIndex` constructor (:issue:`19263`)\n- ``DataFrame.from_items`` is deprecated. Use :func:`DataFrame.from_dict` instead, or ``DataFrame.from_dict(OrderedDict())`` if you wish to preserve the key order (:issue:`17320`, :issue:`17312`)\n- Indexing a :class:`MultiIndex` or a :class:`FloatIndex` with a list containing some missing keys will now show a :class:`FutureWarning`, which is consistent with other types of indexes (:issue:`17758`).\n\n- The ``broadcast`` parameter of ``.apply()`` is deprecated in favor of ``result_type=&#39;broadcast&#39;`` (:issue:`18577`)\n- The ``reduce`` parameter of ``.apply()`` is deprecated in favor of ``result_type=&#39;reduce&#39;`` (:issue:`18577`)\n- The ``order`` parameter of :func:`factorize` is deprecated and will be removed in a future release (:issue:`19727`)\n- :attr:`Timestamp.weekday_name`, :attr:`DatetimeIndex.weekday_name`, and :attr:`Series.dt.weekday_name` are deprecated in favor of :meth:`Timestamp.day_name`, :meth:`DatetimeIndex.day_name`, and :meth:`Series.dt.day_name` (:issue:`12806`)\n\n- ``pandas.tseries.plotting.tsplot`` is deprecated. Use :func:`Series.plot` instead (:issue:`18627`)\n- ``Index.summary()`` is deprecated and will be removed in a future version (:issue:`18217`)\n- ``NDFrame.get_ftype_counts()`` is deprecated and will be removed in a future version (:issue:`18243`)\n- The ``convert_datetime64`` parameter in :func:`DataFrame.to_records` has been deprecated and will be removed in a future version. The NumPy bug motivating this parameter has been resolved. The default value for this parameter has also changed from ``True`` to ``None`` (:issue:`18160`).\n- :func:`Series.rolling().apply() &lt;pandas.core.window.Rolling.apply&gt;`, :func:`DataFrame.rolling().apply() &lt;pandas.core.window.Rolling.apply&gt;`,\n  :func:`Series.expanding().apply() &lt;pandas.core.window.Expanding.apply&gt;`, and :func:`DataFrame.expanding().apply() &lt;pandas.core.window.Expanding.apply&gt;` have deprecated passing an ``np.array`` by default. One will need to pass the new ``raw`` parameter to be explicit about what is passed (:issue:`20584`)\n- The ``data``, ``base``, ``strides``, ``flags`` and ``itemsize`` properties\n  of the ``Series`` and ``Index`` classes have been deprecated and will be\n  removed in a future version (:issue:`20419`).\n- ``DatetimeIndex.offset`` is deprecated. Use ``DatetimeIndex.freq`` instead (:issue:`20716`)\n- Floor division between an integer ndarray and a :class:`Timedelta` is deprecated. Divide by :attr:`Timedelta.value` instead (:issue:`19761`)\n- Setting ``PeriodIndex.freq`` (which was not guaranteed to work correctly) is deprecated. Use :meth:`PeriodIndex.asfreq` instead (:issue:`20678`)\n- ``Index.get_duplicates()`` is deprecated and will be removed in a future version (:issue:`20239`)\n- The previous default behavior of negative indices in ``Categorical.take`` is deprecated. In a future version it will change from meaning missing values to meaning positional indices from the right. The future behavior is consistent with :meth:`Series.take` (:issue:`20664`).\n- Passing multiple axes to the ``axis`` parameter in :func:`DataFrame.dropna` has been deprecated and will be removed in a future version (:issue:`20987`)\n\n\n.. _whatsnew_0230.prior_deprecations:\n\nRemoval of prior version deprecations/changes\n~~~~~~~~~","created_at":"2018-07-07T21:42:11Z","updated_at":"2018-08-04T20:01:04Z","closed_at":"2018-08-04T20:01:04Z","merged_at":null,"merge_commit_sha":"ac3d1a864a29f6ff30d53de1a43af2c52a91dc57","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/41/commits","review_comments_url":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/41/comments","review_comment_url":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/41/comments","statuses_url":"https://api.github.com/repos/gasparka/pyha_demo_project/statuses/295d3e689308ca2296472b04fb9218c4c981da48","head":{"label":"gasparka:pyup-update-pandas-0.22.0-to-0.23.3","ref":"pyup-update-pandas-0.22.0-to-0.23.3","sha":"295d3e689308ca2296472b04fb9218c4c981da48","user":{"login":"gasparka","id":16946258,"node_id":"MDQ6VXNlcjE2OTQ2MjU4","avatar_url":"https://avatars2.githubusercontent.com/u/16946258?v=4","gravatar_id":"","url":"https://api.github.com/users/gasparka","html_url":"https://github.com/gasparka","followers_url":"https://api.github.com/users/gasparka/followers","following_url":"https://api.github.com/users/gasparka/following{/other_user}","gists_url":"https://api.github.com/users/gasparka/gists{/gist_id}","starred_url":"https://api.github.com/users/gasparka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gasparka/subscriptions","organizations_url":"https://api.github.com/users/gasparka/orgs","repos_url":"https://api.github.com/users/gasparka/repos","events_url":"https://api.github.com/users/gasparka/events{/privacy}","received_events_url":"https://api.github.com/users/gasparka/received_events","type":"User","site_admin":false},"repo":{"id":114386017,"node_id":"MDEwOlJlcG9zaXRvcnkxMTQzODYwMTc=","name":"pyha_demo_project","full_name":"gasparka/pyha_demo_project","owner":{"login":"gasparka","id":16946258,"node_id":"MDQ6VXNlcjE2OTQ2MjU4","avatar_url":"https://avatars2.githubusercontent.com/u/16946258?v=4","gravatar_id":"","url":"https://api.github.com/users/gasparka","html_url":"https://github.com/gasparka","followers_url":"https://api.github.com/users/gasparka/followers","following_url":"https://api.github.com/users/gasparka/following{/other_user}","gists_url":"https://api.github.com/users/gasparka/gists{/gist_id}","starred_url":"https://api.github.com/users/gasparka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gasparka/subscriptions","organizations_url":"https://api.github.com/users/gasparka/orgs","repos_url":"https://api.github.com/users/gasparka/repos","events_url":"https://api.github.com/users/gasparka/events{/privacy}","received_events_url":"https://api.github.com/users/gasparka/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gasparka/pyha_demo_project","description":null,"fork":false,"url":"https://api.github.com/repos/gasparka/pyha_demo_project","forks_url":"https://api.github.com/repos/gasparka/pyha_demo_project/forks","keys_url":"https://api.github.com/repos/gasparka/pyha_demo_project/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gasparka/pyha_demo_project/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gasparka/pyha_demo_project/teams","hooks_url":"https://api.github.com/repos/gasparka/pyha_demo_project/hooks","issue_events_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/events{/number}","events_url":"https://api.github.com/repos/gasparka/pyha_demo_project/events","assignees_url":"https://api.github.com/repos/gasparka/pyha_demo_project/assignees{/user}","branches_url":"https://api.github.com/repos/gasparka/pyha_demo_project/branches{/branch}","tags_url":"https://api.github.com/repos/gasparka/pyha_demo_project/tags","blobs_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/refs{/sha}","trees_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gasparka/pyha_demo_project/statuses/{sha}","languages_url":"https://api.github.com/repos/gasparka/pyha_demo_project/languages","stargazers_url":"https://api.github.com/repos/gasparka/pyha_demo_project/stargazers","contributors_url":"https://api.github.com/repos/gasparka/pyha_demo_project/contributors","subscribers_url":"https://api.github.com/repos/gasparka/pyha_demo_project/subscribers","subscription_url":"https://api.github.com/repos/gasparka/pyha_demo_project/subscription","commits_url":"https://api.github.com/repos/gasparka/pyha_demo_project/commits{/sha}","git_commits_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/commits{/sha}","comments_url":"https://api.github.com/repos/gasparka/pyha_demo_project/comments{/number}","issue_comment_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/comments{/number}","contents_url":"https://api.github.com/repos/gasparka/pyha_demo_project/contents/{+path}","compare_url":"https://api.github.com/repos/gasparka/pyha_demo_project/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gasparka/pyha_demo_project/merges","archive_url":"https://api.github.com/repos/gasparka/pyha_demo_project/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gasparka/pyha_demo_project/downloads","issues_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues{/number}","pulls_url":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls{/number}","milestones_url":"https://api.github.com/repos/gasparka/pyha_demo_project/milestones{/number}","notifications_url":"https://api.github.com/repos/gasparka/pyha_demo_project/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gasparka/pyha_demo_project/labels{/name}","releases_url":"https://api.github.com/repos/gasparka/pyha_demo_project/releases{/id}","deployments_url":"https://api.github.com/repos/gasparka/pyha_demo_project/deployments","created_at":"2017-12-15T15:42:25Z","updated_at":"2018-01-02T18:22:57Z","pushed_at":"2018-08-04T20:01:01Z","git_url":"git://github.com/gasparka/pyha_demo_project.git","ssh_url":"git@github.com:gasparka/pyha_demo_project.git","clone_url":"https://github.com/gasparka/pyha_demo_project.git","svn_url":"https://github.com/gasparka/pyha_demo_project","homepage":null,"size":5590,"stargazers_count":0,"watchers_count":0,"language":"Jupyter Notebook","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":7,"watchers":0,"default_branch":"master"}},"base":{"label":"gasparka:master","ref":"master","sha":"06fd4e14110ef1d9b075dfa1d4537021302f84cd","user":{"login":"gasparka","id":16946258,"node_id":"MDQ6VXNlcjE2OTQ2MjU4","avatar_url":"https://avatars2.githubusercontent.com/u/16946258?v=4","gravatar_id":"","url":"https://api.github.com/users/gasparka","html_url":"https://github.com/gasparka","followers_url":"https://api.github.com/users/gasparka/followers","following_url":"https://api.github.com/users/gasparka/following{/other_user}","gists_url":"https://api.github.com/users/gasparka/gists{/gist_id}","starred_url":"https://api.github.com/users/gasparka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gasparka/subscriptions","organizations_url":"https://api.github.com/users/gasparka/orgs","repos_url":"https://api.github.com/users/gasparka/repos","events_url":"https://api.github.com/users/gasparka/events{/privacy}","received_events_url":"https://api.github.com/users/gasparka/received_events","type":"User","site_admin":false},"repo":{"id":114386017,"node_id":"MDEwOlJlcG9zaXRvcnkxMTQzODYwMTc=","name":"pyha_demo_project","full_name":"gasparka/pyha_demo_project","owner":{"login":"gasparka","id":16946258,"node_id":"MDQ6VXNlcjE2OTQ2MjU4","avatar_url":"https://avatars2.githubusercontent.com/u/16946258?v=4","gravatar_id":"","url":"https://api.github.com/users/gasparka","html_url":"https://github.com/gasparka","followers_url":"https://api.github.com/users/gasparka/followers","following_url":"https://api.github.com/users/gasparka/following{/other_user}","gists_url":"https://api.github.com/users/gasparka/gists{/gist_id}","starred_url":"https://api.github.com/users/gasparka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gasparka/subscriptions","organizations_url":"https://api.github.com/users/gasparka/orgs","repos_url":"https://api.github.com/users/gasparka/repos","events_url":"https://api.github.com/users/gasparka/events{/privacy}","received_events_url":"https://api.github.com/users/gasparka/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gasparka/pyha_demo_project","description":null,"fork":false,"url":"https://api.github.com/repos/gasparka/pyha_demo_project","forks_url":"https://api.github.com/repos/gasparka/pyha_demo_project/forks","keys_url":"https://api.github.com/repos/gasparka/pyha_demo_project/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gasparka/pyha_demo_project/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gasparka/pyha_demo_project/teams","hooks_url":"https://api.github.com/repos/gasparka/pyha_demo_project/hooks","issue_events_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/events{/number}","events_url":"https://api.github.com/repos/gasparka/pyha_demo_project/events","assignees_url":"https://api.github.com/repos/gasparka/pyha_demo_project/assignees{/user}","branches_url":"https://api.github.com/repos/gasparka/pyha_demo_project/branches{/branch}","tags_url":"https://api.github.com/repos/gasparka/pyha_demo_project/tags","blobs_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/refs{/sha}","trees_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gasparka/pyha_demo_project/statuses/{sha}","languages_url":"https://api.github.com/repos/gasparka/pyha_demo_project/languages","stargazers_url":"https://api.github.com/repos/gasparka/pyha_demo_project/stargazers","contributors_url":"https://api.github.com/repos/gasparka/pyha_demo_project/contributors","subscribers_url":"https://api.github.com/repos/gasparka/pyha_demo_project/subscribers","subscription_url":"https://api.github.com/repos/gasparka/pyha_demo_project/subscription","commits_url":"https://api.github.com/repos/gasparka/pyha_demo_project/commits{/sha}","git_commits_url":"https://api.github.com/repos/gasparka/pyha_demo_project/git/commits{/sha}","comments_url":"https://api.github.com/repos/gasparka/pyha_demo_project/comments{/number}","issue_comment_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/comments{/number}","contents_url":"https://api.github.com/repos/gasparka/pyha_demo_project/contents/{+path}","compare_url":"https://api.github.com/repos/gasparka/pyha_demo_project/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gasparka/pyha_demo_project/merges","archive_url":"https://api.github.com/repos/gasparka/pyha_demo_project/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gasparka/pyha_demo_project/downloads","issues_url":"https://api.github.com/repos/gasparka/pyha_demo_project/issues{/number}","pulls_url":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls{/number}","milestones_url":"https://api.github.com/repos/gasparka/pyha_demo_project/milestones{/number}","notifications_url":"https://api.github.com/repos/gasparka/pyha_demo_project/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gasparka/pyha_demo_project/labels{/name}","releases_url":"https://api.github.com/repos/gasparka/pyha_demo_project/releases{/id}","deployments_url":"https://api.github.com/repos/gasparka/pyha_demo_project/deployments","created_at":"2017-12-15T15:42:25Z","updated_at":"2018-01-02T18:22:57Z","pushed_at":"2018-08-04T20:01:01Z","git_url":"git://github.com/gasparka/pyha_demo_project.git","ssh_url":"git@github.com:gasparka/pyha_demo_project.git","clone_url":"https://github.com/gasparka/pyha_demo_project.git","svn_url":"https://github.com/gasparka/pyha_demo_project","homepage":null,"size":5590,"stargazers_count":0,"watchers_count":0,"language":"Jupyter Notebook","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":7,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/41"},"html":{"href":"https://github.com/gasparka/pyha_demo_project/pull/41"},"issue":{"href":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/41"},"comments":{"href":"https://api.github.com/repos/gasparka/pyha_demo_project/issues/41/comments"},"review_comments":{"href":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/41/comments"},"review_comment":{"href":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gasparka/pyha_demo_project/pulls/41/commits"},"statuses":{"href":"https://api.github.com/repos/gasparka/pyha_demo_project/statuses/295d3e689308ca2296472b04fb9218c4c981da48"}},"author_association":"CONTRIBUTOR","merged":false,"mergeable":true,"rebaseable":true,"mergeable_state":"unstable","merged_by":null,"comments":1,"review_comments":0,"maintainer_can_modify":false,"commits":1,"additions":1,"deletions":1,"changed_files":1}}
{"actor":{"display_login":"pyup-bot"}}