From 0e581ad06efc2ddb581c01ac189ebfe89cc55d9a Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 10 Feb 2019 21:05:33 +0000 Subject: [PATCH] merge upstream/master --- .github/CONTRIBUTING.md | 10 +- .gitignore | 4 +- Makefile | 1 - asv_bench/benchmarks/__init__.py | 1 + asv_bench/benchmarks/algorithms.py | 3 +- asv_bench/benchmarks/categoricals.py | 19 +- asv_bench/benchmarks/ctors.py | 2 +- asv_bench/benchmarks/index_object.py | 3 +- asv_bench/benchmarks/strings.py | 4 +- azure-pipelines.yml | 2 +- ci/code_checks.sh | 13 +- doc/cheatsheet/Pandas_Cheat_Sheet.pdf | Bin 339134 -> 345999 bytes doc/cheatsheet/Pandas_Cheat_Sheet.pptx | Bin 105265 -> 105004 bytes doc/cheatsheet/Pandas_Cheat_Sheet_JA.pdf | Bin 206153 -> 420841 bytes doc/cheatsheet/Pandas_Cheat_Sheet_JA.pptx | Bin 76495 -> 82359 bytes doc/make.py | 86 +- doc/redirects.csv | 1581 +++++++++++++++ doc/source/{ => development}/contributing.rst | 2 +- .../contributing_docstring.rst | 0 doc/source/{ => development}/developer.rst | 0 doc/source/{ => development}/extending.rst | 0 doc/source/development/index.rst | 15 + doc/source/{ => development}/internals.rst | 0 doc/source/{ => getting_started}/10min.rst | 0 doc/source/{ => getting_started}/basics.rst | 0 .../comparison}/comparison_with_r.rst | 0 .../comparison}/comparison_with_sas.rst | 0 .../comparison}/comparison_with_sql.rst | 0 .../comparison}/comparison_with_stata.rst | 0 .../getting_started/comparison/index.rst | 15 + doc/source/{ => getting_started}/dsintro.rst | 0 doc/source/getting_started/index.rst | 17 + doc/source/{ => getting_started}/overview.rst | 95 +- .../{ => getting_started}/tutorials.rst | 0 doc/source/index.rst.template | 156 +- doc/source/r_interface.rst | 94 - doc/source/{api => reference}/arrays.rst | 52 +- doc/source/{api => reference}/extensions.rst | 2 +- doc/source/{api => reference}/frame.rst | 36 +- .../{api => reference}/general_functions.rst | 16 +- .../general_utility_functions.rst | 14 +- doc/source/{api => reference}/groupby.rst | 14 +- doc/source/{api => reference}/index.rst | 52 +- doc/source/{api => reference}/indexing.rst | 68 +- doc/source/{api => reference}/io.rst | 32 +- .../{api => reference}/offset_frequency.rst | 272 +-- doc/source/{api => reference}/panel.rst | 28 +- doc/source/{api => reference}/plotting.rst | 2 +- doc/source/{api => reference}/resampling.rst | 8 +- doc/source/{api => reference}/series.rst | 58 +- doc/source/{api => reference}/style.rst | 10 +- doc/source/{api => reference}/window.rst | 6 +- doc/source/{ => user_guide}/advanced.rst | 0 doc/source/{ => user_guide}/categorical.rst | 0 doc/source/{ => user_guide}/computation.rst | 0 doc/source/{ => user_guide}/cookbook.rst | 0 doc/source/{ => user_guide}/enhancingperf.rst | 4 +- doc/source/{ => user_guide}/gotchas.rst | 0 doc/source/{ => user_guide}/groupby.rst | 2 +- doc/source/user_guide/index.rst | 40 + doc/source/{ => user_guide}/indexing.rst | 4 +- doc/source/{ => user_guide}/integer_na.rst | 6 + doc/source/{ => user_guide}/io.rst | 46 +- doc/source/{ => user_guide}/merging.rst | 0 doc/source/{ => user_guide}/missing_data.rst | 0 doc/source/{ => user_guide}/options.rst | 8 +- doc/source/{ => user_guide}/reshaping.rst | 12 +- doc/source/{ => user_guide}/sparse.rst | 0 doc/source/{ => user_guide}/style.ipynb | 4 +- .../{ => user_guide}/templates/myhtml.tpl | 0 .../templates}/template_structure.html | 0 doc/source/{ => user_guide}/text.rst | 0 doc/source/{ => user_guide}/timedeltas.rst | 0 doc/source/{ => user_guide}/timeseries.rst | 204 +- doc/source/{ => user_guide}/visualization.rst | 0 doc/source/whatsnew/v0.24.0.rst | 185 +- doc/source/whatsnew/v0.24.1.rst | 80 +- doc/source/whatsnew/v0.24.2.rst | 100 + doc/source/whatsnew/v0.25.0.rst | 35 +- pandas/_libs/algos.pyx | 26 +- pandas/_libs/groupby.pyx | 51 + pandas/_libs/groupby_helper.pxi.in | 133 +- pandas/_libs/hashtable.pyx | 18 +- pandas/_libs/hashtable_class_helper.pxi.in | 2 +- pandas/_libs/internals.pyx | 7 +- pandas/_libs/interval.pyx | 1 - pandas/_libs/join.pyx | 46 +- pandas/_libs/lib.pyx | 77 +- pandas/_libs/missing.pyx | 7 +- pandas/_libs/parsers.pyx | 23 +- pandas/_libs/reduction.pyx | 2 +- pandas/_libs/skiplist.pyx | 19 +- pandas/_libs/sparse.pyx | 15 +- pandas/_libs/sparse_op_helper.pxi.in | 20 +- pandas/_libs/tslib.pyx | 2 + pandas/_libs/tslibs/conversion.pyx | 2 +- pandas/_libs/tslibs/fields.pyx | 2 +- pandas/_libs/tslibs/nattype.pyx | 9 +- pandas/_libs/tslibs/offsets.pyx | 16 + pandas/_libs/tslibs/parsing.pyx | 5 +- pandas/_libs/tslibs/period.pyx | 7 +- pandas/_libs/tslibs/resolution.pyx | 19 +- pandas/_libs/tslibs/timedeltas.pyx | 5 + pandas/_libs/tslibs/timestamps.pyx | 72 +- pandas/_libs/window.pyx | 13 +- pandas/compat/__init__.py | 11 - pandas/compat/numpy/__init__.py | 4 +- pandas/compat/numpy/function.py | 2 +- pandas/compat/pickle_compat.py | 3 +- pandas/core/accessor.py | 18 +- pandas/core/algorithms.py | 10 +- pandas/core/api.py | 1 - pandas/core/arrays/array_.py | 2 +- pandas/core/arrays/categorical.py | 30 +- pandas/core/arrays/datetimes.py | 17 +- pandas/core/arrays/integer.py | 41 +- pandas/core/arrays/interval.py | 29 +- pandas/core/arrays/numpy_.py | 2 +- pandas/core/arrays/period.py | 2 +- pandas/core/arrays/timedeltas.py | 38 +- pandas/core/base.py | 38 +- pandas/core/common.py | 50 +- pandas/core/computation/eval.py | 6 +- pandas/core/computation/expr.py | 20 +- pandas/core/computation/ops.py | 11 +- pandas/core/computation/pytables.py | 11 +- pandas/core/computation/scope.py | 4 +- pandas/core/config.py | 4 +- pandas/core/dtypes/base.py | 6 +- pandas/core/dtypes/cast.py | 8 +- pandas/core/dtypes/common.py | 140 +- pandas/core/dtypes/concat.py | 8 +- pandas/core/dtypes/dtypes.py | 8 +- pandas/core/dtypes/inference.py | 15 +- pandas/core/frame.py | 323 ++-- pandas/core/generic.py | 164 +- pandas/core/groupby/__init__.py | 2 +- pandas/core/groupby/generic.py | 98 +- pandas/core/groupby/groupby.py | 32 +- pandas/core/groupby/grouper.py | 7 +- pandas/core/groupby/ops.py | 2 +- pandas/core/indexes/accessors.py | 4 +- pandas/core/indexes/api.py | 2 +- pandas/core/indexes/base.py | 120 +- pandas/core/indexes/category.py | 6 +- pandas/core/indexes/datetimes.py | 22 +- pandas/core/indexes/interval.py | 29 +- pandas/core/indexes/multi.py | 49 +- pandas/core/indexes/range.py | 12 +- pandas/core/indexes/timedeltas.py | 5 + pandas/core/indexing.py | 4 +- pandas/core/internals/__init__.py | 2 +- pandas/core/internals/blocks.py | 66 +- pandas/core/internals/concat.py | 6 +- pandas/core/internals/construction.py | 16 +- pandas/core/internals/managers.py | 30 +- pandas/core/missing.py | 28 +- pandas/core/nanops.py | 6 +- pandas/core/ops.py | 36 +- pandas/core/panel.py | 13 +- pandas/core/resample.py | 69 +- pandas/core/reshape/merge.py | 20 +- pandas/core/reshape/pivot.py | 6 +- pandas/core/reshape/tile.py | 23 +- pandas/core/reshape/util.py | 13 - pandas/core/series.py | 284 ++- pandas/core/sparse/frame.py | 16 +- pandas/core/sparse/scipy_sparse.py | 10 +- pandas/core/strings.py | 4 +- pandas/core/tools/datetimes.py | 4 +- pandas/core/tools/numeric.py | 18 +- pandas/core/tools/timedeltas.py | 10 +- pandas/core/window.py | 55 +- pandas/errors/__init__.py | 4 +- pandas/io/clipboard/windows.py | 11 +- pandas/io/excel.py | 242 ++- pandas/io/formats/console.py | 38 - pandas/io/formats/format.py | 37 +- pandas/io/formats/html.py | 8 +- pandas/io/formats/style.py | 8 +- pandas/io/gbq.py | 2 +- pandas/io/html.py | 6 +- pandas/io/json/table_schema.py | 15 +- pandas/io/msgpack/_packer.pyx | 38 +- pandas/io/msgpack/_unpacker.pyx | 48 +- pandas/io/packers.py | 2 +- pandas/io/parsers.py | 11 +- pandas/io/pickle.py | 73 +- pandas/io/pytables.py | 181 +- pandas/io/sas/sas.pyx | 11 +- pandas/io/sql.py | 3 +- pandas/io/stata.py | 50 +- pandas/plotting/_core.py | 57 +- pandas/plotting/_misc.py | 11 +- pandas/tests/api/test_api.py | 1 - pandas/tests/arithmetic/test_datetime64.py | 230 ++- pandas/tests/arrays/test_array.py | 4 +- pandas/tests/arrays/test_integer.py | 4 +- pandas/tests/dtypes/test_generic.py | 5 +- pandas/tests/dtypes/test_inference.py | 8 +- pandas/tests/dtypes/test_missing.py | 11 +- pandas/tests/extension/base/groupby.py | 17 +- pandas/tests/extension/base/methods.py | 6 - pandas/tests/extension/base/missing.py | 8 +- pandas/tests/extension/base/setitem.py | 1 - pandas/tests/extension/conftest.py | 57 + pandas/tests/extension/test_numpy.py | 248 ++- pandas/tests/extension/test_sparse.py | 3 +- pandas/tests/frame/test_alter_axes.py | 136 +- pandas/tests/frame/test_analytics.py | 608 +++--- pandas/tests/frame/test_apply.py | 7 + pandas/tests/frame/test_constructors.py | 22 +- pandas/tests/frame/test_convert_to.py | 47 +- pandas/tests/frame/test_dtypes.py | 7 +- pandas/tests/frame/test_query_eval.py | 8 - pandas/tests/frame/test_reshape.py | 9 - pandas/tests/frame/test_subclass.py | 25 +- pandas/tests/generic/test_generic.py | 52 +- pandas/tests/generic/test_panel.py | 23 +- .../tests/groupby/aggregate/test_aggregate.py | 3 +- pandas/tests/groupby/test_categorical.py | 33 + pandas/tests/groupby/test_groupby.py | 50 +- pandas/tests/groupby/test_grouping.py | 26 +- pandas/tests/indexes/common.py | 37 +- .../indexes/datetimes/test_construction.py | 51 +- .../indexes/datetimes/test_date_range.py | 6 +- pandas/tests/indexes/datetimes/test_misc.py | 4 +- pandas/tests/indexes/datetimes/test_ops.py | 8 +- .../indexes/datetimes/test_partial_slicing.py | 32 +- .../indexes/datetimes/test_scalar_compat.py | 24 +- pandas/tests/indexes/datetimes/test_setops.py | 12 +- .../tests/indexes/datetimes/test_timezones.py | 19 +- pandas/tests/indexes/datetimes/test_tools.py | 114 +- .../tests/indexes/interval/test_interval.py | 43 +- pandas/tests/indexes/multi/test_analytics.py | 102 +- pandas/tests/indexes/multi/test_compat.py | 6 +- .../tests/indexes/multi/test_constructor.py | 67 +- pandas/tests/indexes/multi/test_contains.py | 23 +- pandas/tests/indexes/multi/test_drop.py | 24 +- pandas/tests/indexes/multi/test_duplicates.py | 12 + pandas/tests/indexes/multi/test_get_set.py | 15 +- pandas/tests/indexes/multi/test_indexing.py | 56 +- pandas/tests/indexes/multi/test_integrity.py | 15 +- pandas/tests/indexes/multi/test_set_ops.py | 155 +- pandas/tests/indexes/period/test_asfreq.py | 4 +- .../tests/indexes/period/test_construction.py | 88 +- pandas/tests/indexes/period/test_indexing.py | 41 +- pandas/tests/indexes/period/test_period.py | 46 +- pandas/tests/indexes/period/test_setops.py | 20 +- pandas/tests/indexes/test_base.py | 207 +- pandas/tests/indexes/test_category.py | 9 - pandas/tests/indexes/test_range.py | 2 +- .../indexes/timedeltas/test_timedelta.py | 16 +- pandas/tests/indexing/multiindex/test_loc.py | 6 +- .../tests/indexing/multiindex/test_partial.py | 4 +- .../tests/indexing/multiindex/test_slice.py | 3 +- pandas/tests/indexing/test_categorical.py | 52 +- .../indexing/test_chaining_and_caching.py | 13 +- pandas/tests/indexing/test_floats.py | 227 ++- pandas/tests/indexing/test_iloc.py | 50 +- pandas/tests/indexing/test_ix.py | 18 +- pandas/tests/indexing/test_loc.py | 53 +- pandas/tests/indexing/test_panel.py | 22 - pandas/tests/indexing/test_partial.py | 10 +- pandas/tests/indexing/test_scalar.py | 32 +- pandas/tests/internals/test_internals.py | 4 +- .../tests/io/data/legacy_hdf/legacy_table.h5 | Bin 211111 -> 0 bytes .../io/data/legacy_hdf/legacy_table_py2.h5 | Bin 0 -> 72279 bytes pandas/tests/io/formats/test_format.py | 89 +- pandas/tests/io/json/test_pandas.py | 14 +- pandas/tests/io/msgpack/test_pack.py | 4 +- pandas/tests/io/test_clipboard.py | 20 +- pandas/tests/io/test_excel.py | 16 +- pandas/tests/io/test_pytables.py | 642 +------ pandas/tests/io/test_sql.py | 6 - pandas/tests/plotting/test_frame.py | 16 - pandas/tests/plotting/test_series.py | 13 - pandas/tests/resample/test_base.py | 9 +- pandas/tests/resample/test_datetime_index.py | 86 +- pandas/tests/resample/test_period_index.py | 39 +- pandas/tests/resample/test_resample_api.py | 59 +- pandas/tests/resample/test_time_grouper.py | 25 +- pandas/tests/reshape/merge/test_join.py | 91 - pandas/tests/reshape/merge/test_merge.py | 126 +- pandas/tests/reshape/test_concat.py | 39 +- pandas/tests/reshape/test_reshape.py | 19 +- .../tests/scalar/timedelta/test_timedelta.py | 29 +- .../tests/scalar/timestamp/test_unary_ops.py | 15 +- pandas/tests/series/test_alter_axes.py | 11 + pandas/tests/series/test_apply.py | 12 + pandas/tests/series/test_dtypes.py | 4 +- pandas/tests/series/test_duplicates.py | 18 +- pandas/tests/series/test_period.py | 9 + pandas/tests/series/test_repr.py | 8 + pandas/tests/test_nanops.py | 3 + pandas/tests/test_panel.py | 1706 +---------------- pandas/tests/tools/test_numeric.py | 951 +++++---- .../tests/tseries/holiday/__init__.py | 0 pandas/tests/tseries/holiday/test_calendar.py | 77 + pandas/tests/tseries/holiday/test_federal.py | 36 + pandas/tests/tseries/holiday/test_holiday.py | 193 ++ .../tests/tseries/holiday/test_observance.py | 93 + pandas/tests/tseries/offsets/test_offsets.py | 20 + pandas/tests/tseries/offsets/test_ticks.py | 23 + pandas/tests/tseries/test_holiday.py | 382 ---- pandas/tests/util/test_hashing.py | 3 +- pandas/tseries/frequencies.py | 2 +- pandas/util/_decorators.py | 5 +- pandas/util/move.c | 25 +- pandas/util/testing.py | 32 +- scripts/validate_docstrings.py | 3 +- setup.cfg | 5 +- setup.py | 8 +- 313 files changed, 8137 insertions(+), 7393 deletions(-) create mode 100644 doc/redirects.csv rename doc/source/{ => development}/contributing.rst (99%) rename doc/source/{ => development}/contributing_docstring.rst (100%) rename doc/source/{ => development}/developer.rst (100%) rename doc/source/{ => development}/extending.rst (100%) create mode 100644 doc/source/development/index.rst rename doc/source/{ => development}/internals.rst (100%) rename doc/source/{ => getting_started}/10min.rst (100%) rename doc/source/{ => getting_started}/basics.rst (100%) rename doc/source/{ => getting_started/comparison}/comparison_with_r.rst (100%) rename doc/source/{ => getting_started/comparison}/comparison_with_sas.rst (100%) rename doc/source/{ => getting_started/comparison}/comparison_with_sql.rst (100%) rename doc/source/{ => getting_started/comparison}/comparison_with_stata.rst (100%) create mode 100644 doc/source/getting_started/comparison/index.rst rename doc/source/{ => getting_started}/dsintro.rst (100%) create mode 100644 doc/source/getting_started/index.rst rename doc/source/{ => getting_started}/overview.rst (50%) rename doc/source/{ => getting_started}/tutorials.rst (100%) delete mode 100644 doc/source/r_interface.rst rename doc/source/{api => reference}/arrays.rst (92%) rename doc/source/{api => reference}/extensions.rst (95%) rename doc/source/{api => reference}/frame.rst (93%) rename doc/source/{api => reference}/general_functions.rst (84%) rename doc/source/{api => reference}/general_utility_functions.rst (93%) rename doc/source/{api => reference}/groupby.rst (94%) rename doc/source/{api => reference}/index.rst (56%) rename doc/source/{api => reference}/indexing.rst (91%) rename doc/source/{api => reference}/io.rst (78%) rename doc/source/{api => reference}/offset_frequency.rst (84%) rename doc/source/{api => reference}/panel.rst (90%) rename doc/source/{api => reference}/plotting.rst (93%) rename doc/source/{api => reference}/resampling.rst (91%) rename doc/source/{api => reference}/series.rst (93%) rename doc/source/{api => reference}/style.rst (88%) rename doc/source/{api => reference}/window.rst (95%) rename doc/source/{ => user_guide}/advanced.rst (100%) rename doc/source/{ => user_guide}/categorical.rst (100%) rename doc/source/{ => user_guide}/computation.rst (100%) rename doc/source/{ => user_guide}/cookbook.rst (100%) rename doc/source/{ => user_guide}/enhancingperf.rst (99%) rename doc/source/{ => user_guide}/gotchas.rst (100%) rename doc/source/{ => user_guide}/groupby.rst (99%) create mode 100644 doc/source/user_guide/index.rst rename doc/source/{ => user_guide}/indexing.rst (99%) rename doc/source/{ => user_guide}/integer_na.rst (95%) rename doc/source/{ => user_guide}/io.rst (99%) rename doc/source/{ => user_guide}/merging.rst (100%) rename doc/source/{ => user_guide}/missing_data.rst (100%) rename doc/source/{ => user_guide}/options.rst (99%) rename doc/source/{ => user_guide}/reshaping.rst (98%) rename doc/source/{ => user_guide}/sparse.rst (100%) rename doc/source/{ => user_guide}/style.ipynb (99%) rename doc/source/{ => user_guide}/templates/myhtml.tpl (100%) rename doc/source/{ => user_guide/templates}/template_structure.html (100%) rename doc/source/{ => user_guide}/text.rst (100%) rename doc/source/{ => user_guide}/timedeltas.rst (100%) rename doc/source/{ => user_guide}/timeseries.rst (92%) rename doc/source/{ => user_guide}/visualization.rst (100%) create mode 100644 doc/source/whatsnew/v0.24.2.rst delete mode 100644 pandas/tests/io/data/legacy_hdf/legacy_table.h5 create mode 100644 pandas/tests/io/data/legacy_hdf/legacy_table_py2.h5 rename doc/source/api/scalars.rst => pandas/tests/tseries/holiday/__init__.py (100%) create mode 100644 pandas/tests/tseries/holiday/test_calendar.py create mode 100644 pandas/tests/tseries/holiday/test_federal.py create mode 100644 pandas/tests/tseries/holiday/test_holiday.py create mode 100644 pandas/tests/tseries/holiday/test_observance.py delete mode 100644 pandas/tests/tseries/test_holiday.py diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 21df1a3aacd59..faff68b636109 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,16 +8,16 @@ Our main contributing guide can be found [in this repo](https://github.com/panda If you are looking to contribute to the *pandas* codebase, the best place to start is the [GitHub "issues" tab](https://github.com/pandas-dev/pandas/issues). This is also a great place for filing bug reports and making suggestions for ways in which we can improve the code and documentation. -If you have additional questions, feel free to ask them on the [mailing list](https://groups.google.com/forum/?fromgroups#!forum/pydata) or on [Gitter](https://gitter.im/pydata/pandas). Further information can also be found in the "[Where to start?](https://github.com/pandas-dev/pandas/blob/master/doc/source/contributing.rst#where-to-start)" section. +If you have additional questions, feel free to ask them on the [mailing list](https://groups.google.com/forum/?fromgroups#!forum/pydata) or on [Gitter](https://gitter.im/pydata/pandas). Further information can also be found in the "[Where to start?](https://github.com/pandas-dev/pandas/blob/master/doc/source/development/contributing.rst#where-to-start)" section. ## Filing Issues -If you notice a bug in the code or documentation, or have suggestions for how we can improve either, feel free to create an issue on the [GitHub "issues" tab](https://github.com/pandas-dev/pandas/issues) using [GitHub's "issue" form](https://github.com/pandas-dev/pandas/issues/new). The form contains some questions that will help us best address your issue. For more information regarding how to file issues against *pandas*, please refer to the "[Bug reports and enhancement requests](https://github.com/pandas-dev/pandas/blob/master/doc/source/contributing.rst#bug-reports-and-enhancement-requests)" section. +If you notice a bug in the code or documentation, or have suggestions for how we can improve either, feel free to create an issue on the [GitHub "issues" tab](https://github.com/pandas-dev/pandas/issues) using [GitHub's "issue" form](https://github.com/pandas-dev/pandas/issues/new). The form contains some questions that will help us best address your issue. For more information regarding how to file issues against *pandas*, please refer to the "[Bug reports and enhancement requests](https://github.com/pandas-dev/pandas/blob/master/doc/source/development/contributing.rst#bug-reports-and-enhancement-requests)" section. ## Contributing to the Codebase -The code is hosted on [GitHub](https://www.github.com/pandas-dev/pandas), so you will need to use [Git](http://git-scm.com/) to clone the project and make changes to the codebase. Once you have obtained a copy of the code, you should create a development environment that is separate from your existing Python environment so that you can make and test changes without compromising your own work environment. For more information, please refer to the "[Working with the code](https://github.com/pandas-dev/pandas/blob/master/doc/source/contributing.rst#working-with-the-code)" section. +The code is hosted on [GitHub](https://www.github.com/pandas-dev/pandas), so you will need to use [Git](http://git-scm.com/) to clone the project and make changes to the codebase. Once you have obtained a copy of the code, you should create a development environment that is separate from your existing Python environment so that you can make and test changes without compromising your own work environment. For more information, please refer to the "[Working with the code](https://github.com/pandas-dev/pandas/blob/master/doc/source/development/contributing.rst#working-with-the-code)" section. -Before submitting your changes for review, make sure to check that your changes do not break any tests. You can find more information about our test suites in the "[Test-driven development/code writing](https://github.com/pandas-dev/pandas/blob/master/doc/source/contributing.rst#test-driven-development-code-writing)" section. We also have guidelines regarding coding style that will be enforced during testing, which can be found in the "[Code standards](https://github.com/pandas-dev/pandas/blob/master/doc/source/contributing.rst#code-standards)" section. +Before submitting your changes for review, make sure to check that your changes do not break any tests. You can find more information about our test suites in the "[Test-driven development/code writing](https://github.com/pandas-dev/pandas/blob/master/doc/source/contributing.rst#test-driven-development-code-writing)" section. We also have guidelines regarding coding style that will be enforced during testing, which can be found in the "[Code standards](https://github.com/pandas-dev/pandas/blob/master/doc/source/development/contributing.rst#code-standards)" section. -Once your changes are ready to be submitted, make sure to push your changes to GitHub before creating a pull request. Details about how to do that can be found in the "[Contributing your changes to pandas](https://github.com/pandas-dev/pandas/blob/master/doc/source/contributing.rst#contributing-your-changes-to-pandas)" section. We will review your changes, and you will most likely be asked to make additional changes before it is finally ready to merge. However, once it's ready, we will merge it, and you will have successfully contributed to the codebase! +Once your changes are ready to be submitted, make sure to push your changes to GitHub before creating a pull request. Details about how to do that can be found in the "[Contributing your changes to pandas](https://github.com/pandas-dev/pandas/blob/master/doc/source/development/contributing.rst#contributing-your-changes-to-pandas)" section. We will review your changes, and you will most likely be asked to make additional changes before it is finally ready to merge. However, once it's ready, we will merge it, and you will have successfully contributed to the codebase! diff --git a/.gitignore b/.gitignore index 4598714db6c6a..816aff376fc83 100644 --- a/.gitignore +++ b/.gitignore @@ -101,7 +101,8 @@ asv_bench/pandas/ # Documentation generated files # ################################# doc/source/generated -doc/source/api/generated +doc/source/user_guide/styled.xlsx +doc/source/reference/api doc/source/_static doc/source/vbench doc/source/vbench.rst @@ -109,6 +110,5 @@ doc/source/index.rst doc/build/html/index.html # Windows specific leftover: doc/tmp.sv -doc/source/styled.xlsx env/ doc/source/savefig/ diff --git a/Makefile b/Makefile index d2bd067950fd0..956ff52338839 100644 --- a/Makefile +++ b/Makefile @@ -23,4 +23,3 @@ doc: cd doc; \ python make.py clean; \ python make.py html - python make.py spellcheck diff --git a/asv_bench/benchmarks/__init__.py b/asv_bench/benchmarks/__init__.py index e69de29bb2d1d..eada147852fe1 100644 --- a/asv_bench/benchmarks/__init__.py +++ b/asv_bench/benchmarks/__init__.py @@ -0,0 +1 @@ +"""Pandas benchmarks.""" diff --git a/asv_bench/benchmarks/algorithms.py b/asv_bench/benchmarks/algorithms.py index 34fb161e5afcb..74849d330f2bc 100644 --- a/asv_bench/benchmarks/algorithms.py +++ b/asv_bench/benchmarks/algorithms.py @@ -5,7 +5,6 @@ import pandas as pd from pandas.util import testing as tm - for imp in ['pandas.util', 'pandas.tools.hashing']: try: hashing = import_module(imp) @@ -142,4 +141,4 @@ def time_quantile(self, quantile, interpolation, dtype): self.idx.quantile(quantile, interpolation=interpolation) -from .pandas_vb_common import setup # noqa: F401 +from .pandas_vb_common import setup # noqa: F401 isort:skip diff --git a/asv_bench/benchmarks/categoricals.py b/asv_bench/benchmarks/categoricals.py index e5dab0cb066aa..4b5b2848f7e0f 100644 --- a/asv_bench/benchmarks/categoricals.py +++ b/asv_bench/benchmarks/categoricals.py @@ -223,12 +223,19 @@ class CategoricalSlicing(object): def setup(self, index): N = 10**6 - values = list('a' * N + 'b' * N + 'c' * N) - indices = { - 'monotonic_incr': pd.Categorical(values), - 'monotonic_decr': pd.Categorical(reversed(values)), - 'non_monotonic': pd.Categorical(list('abc' * N))} - self.data = indices[index] + categories = ['a', 'b', 'c'] + values = [0] * N + [1] * N + [2] * N + if index == 'monotonic_incr': + self.data = pd.Categorical.from_codes(values, + categories=categories) + elif index == 'monotonic_decr': + self.data = pd.Categorical.from_codes(list(reversed(values)), + categories=categories) + elif index == 'non_monotonic': + self.data = pd.Categorical.from_codes([0, 1, 2] * N, + categories=categories) + else: + raise ValueError('Invalid index param: {}'.format(index)) self.scalar = 10000 self.list = list(range(10000)) diff --git a/asv_bench/benchmarks/ctors.py b/asv_bench/benchmarks/ctors.py index 9082b4186bfa4..5715c4fb2d0d4 100644 --- a/asv_bench/benchmarks/ctors.py +++ b/asv_bench/benchmarks/ctors.py @@ -72,7 +72,7 @@ class SeriesDtypesConstructors(object): def setup(self): N = 10**4 - self.arr = np.random.randn(N, N) + self.arr = np.random.randn(N) self.arr_str = np.array(['foo', 'bar', 'baz'], dtype=object) self.s = Series([Timestamp('20110101'), Timestamp('20120101'), Timestamp('20130101')] * N * 10) diff --git a/asv_bench/benchmarks/index_object.py b/asv_bench/benchmarks/index_object.py index f76040921393f..bbe164d4858ab 100644 --- a/asv_bench/benchmarks/index_object.py +++ b/asv_bench/benchmarks/index_object.py @@ -138,7 +138,8 @@ def setup(self, dtype): self.sorted = self.idx.sort_values() half = N // 2 self.non_unique = self.idx[:half].append(self.idx[:half]) - self.non_unique_sorted = self.sorted[:half].append(self.sorted[:half]) + self.non_unique_sorted = (self.sorted[:half].append(self.sorted[:half]) + .sort_values()) self.key = self.sorted[N // 4] def time_boolean_array(self, dtype): diff --git a/asv_bench/benchmarks/strings.py b/asv_bench/benchmarks/strings.py index e9f2727f64e15..b5b2c955f0133 100644 --- a/asv_bench/benchmarks/strings.py +++ b/asv_bench/benchmarks/strings.py @@ -102,10 +102,10 @@ def setup(self, repeats): N = 10**5 self.s = Series(tm.makeStringIndex(N)) repeat = {'int': 1, 'array': np.random.randint(1, 3, N)} - self.repeat = repeat[repeats] + self.values = repeat[repeats] def time_repeat(self, repeats): - self.s.str.repeat(self.repeat) + self.s.str.repeat(self.values) class Cat(object): diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f0567d76659b6..c86d5c50705a8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -104,7 +104,7 @@ jobs: if git diff upstream/master --name-only | grep -q "^asv_bench/"; then cd asv_bench asv machine --yes - ASV_OUTPUT="$(asv dev)" + ASV_OUTPUT="$(asv run --quick --show-stderr --python=same --launch-method=spawn)" if [[ $(echo "$ASV_OUTPUT" | grep "failed") ]]; then echo "##vso[task.logissue type=error]Benchmarks run with errors" echo "$ASV_OUTPUT" diff --git a/ci/code_checks.sh b/ci/code_checks.sh index c8bfc564e7573..5c9d20e483ce4 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -93,7 +93,7 @@ if [[ -z "$CHECK" || "$CHECK" == "lint" ]]; then # this particular codebase (e.g. src/headers, src/klib, src/msgpack). However, # we can lint all header files since they aren't "generated" like C files are. MSG='Linting .c and .h' ; echo $MSG - cpplint --quiet --extensions=c,h --headers=h --recursive --filter=-readability/casting,-runtime/int,-build/include_subdir pandas/_libs/src/*.h pandas/_libs/src/parser pandas/_libs/ujson pandas/_libs/tslibs/src/datetime + cpplint --quiet --extensions=c,h --headers=h --recursive --filter=-readability/casting,-runtime/int,-build/include_subdir pandas/_libs/src/*.h pandas/_libs/src/parser pandas/_libs/ujson pandas/_libs/tslibs/src/datetime pandas/io/msgpack pandas/_libs/*.cpp pandas/util RET=$(($RET + $?)) ; echo $MSG "DONE" echo "isort --version-number" @@ -174,9 +174,10 @@ if [[ -z "$CHECK" || "$CHECK" == "patterns" ]]; then MSG='Check that no file in the repo contains tailing whitespaces' ; echo $MSG set -o pipefail if [[ "$AZURE" == "true" ]]; then - ! grep -n --exclude="*.svg" -RI "\s$" * | awk -F ":" '{print "##vso[task.logissue type=error;sourcepath=" $1 ";linenumber=" $2 ";] Tailing whitespaces found: " $3}' + # we exclude all c/cpp files as the c/cpp files of pandas code base are tested when Linting .c and .h files + ! grep -n '--exclude=*.'{svg,c,cpp,html} -RI "\s$" * | awk -F ":" '{print "##vso[task.logissue type=error;sourcepath=" $1 ";linenumber=" $2 ";] Tailing whitespaces found: " $3}' else - ! grep -n --exclude="*.svg" -RI "\s$" * | awk -F ":" '{print $1 ":" $2 ":Tailing whitespaces found: " $3}' + ! grep -n '--exclude=*.'{svg,c,cpp,html} -RI "\s$" * | awk -F ":" '{print $1 ":" $2 ":Tailing whitespaces found: " $3}' fi RET=$(($RET + $?)) ; echo $MSG "DONE" fi @@ -206,7 +207,7 @@ if [[ -z "$CHECK" || "$CHECK" == "doctests" ]]; then MSG='Doctests frame.py' ; echo $MSG pytest -q --doctest-modules pandas/core/frame.py \ - -k"-axes -combine -itertuples -join -pivot_table -query -reindex -reindex_axis -round" + -k" -itertuples -join -reindex -reindex_axis -round" RET=$(($RET + $?)) ; echo $MSG "DONE" MSG='Doctests series.py' ; echo $MSG @@ -240,8 +241,8 @@ fi ### DOCSTRINGS ### if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then - MSG='Validate docstrings (GL06, GL07, GL09, SS04, PR03, PR05, EX04)' ; echo $MSG - $BASE_DIR/scripts/validate_docstrings.py --format=azure --errors=GL06,GL07,GL09,SS04,PR03,PR05,EX04 + MSG='Validate docstrings (GL06, GL07, GL09, SS04, PR03, PR05, PR10, EX04, RT04, SS05, SA05)' ; echo $MSG + $BASE_DIR/scripts/validate_docstrings.py --format=azure --errors=GL06,GL07,GL09,SS04,PR03,PR05,EX04,RT04,SS05,SA05 RET=$(($RET + $?)) ; echo $MSG "DONE" fi diff --git a/doc/cheatsheet/Pandas_Cheat_Sheet.pdf b/doc/cheatsheet/Pandas_Cheat_Sheet.pdf index 696ed288cf7a6067e73e819213b014e6d4ee6b32..d50896dc5ccc52afb31899a9ed704149d3e1688e 100644 GIT binary patch delta 262099 zcmZU)V{|4>7d9H(HYT<`u_l_>=ESz{IFpHS#}nJOZQHi(oXqon>wIUe^P^W?U3+(R zSJkdvyRNG4SjLEs#*7gFlN5;+;)7t}VP=j6VE;>5s#CGR0358`oB{%fa8AySriM0% zaPH}QKHBkn4b=y&-|mQ;4!50wxuK$dAi}ilf2t@(OA&`3q*v~HBOb)$+{T?fN|`P$ zQl`rmUst)9Kw#rQ@Kk#}dHz&M%BciA#mJH~rVM$1yuJ>ur;Ya;UxyNRFn(M=|58;1 zs;Y)HVCA6X07|5%G0H1Ow6GpmCk0v!93y6s-^toFFz(k&+###sTd-v+v=nIu)c&V}Q zdcCRc>Wa=(f(X`wE=R)rotVw?AbgOty>&McJWM%56@N9;X=V{akxxIps2T?G?^Q&H zR@(f9F4BCevXU(0OO@y+-0_a`Rx%?bd3 z#`nW66YwyY`HpJ}p^|}6r2m-gF{nNjs#o92$ z0un(+>PL17XHk18mO5lrx)3HW(|c?cpjNZ7bg;fiEp5lnO0)7}QK z;zbpk+3zmTxF8sh;Y~8}B{|AxiC+(Z33Bgvd*#fP8r(9SV8eGJt_{TV0_EsK{rmJ{ z*{T`td9U&2T<@z^*|6#Yt$#ZFksNt)SU^BiaC{vJZ4X zvO=BOjC{velc>qRxVgPLU8>C6s$_T*|C3zmO+%wh0-Dz_(RMRpsdHdfH;vIaQM<*;X!rAj1* zgtiLGy#>X+U7ImL47s(gbSVHn?vJzSODLwm(gwgaVN^LO!R|*(I8RCovl(i#ihoV{ zRZ9#uJ#kP&w1d^dNSib+&?V;!1!CYv=$NRoNv_W4n;V-OdQwCds;Ai*ngwe{ILs7L z%8t9$(G63=vRMb#@30|ws%0@c?CK|Jb;k!_!V;QOA7>mPfH^Y{RWmq9;#A?+Qas4^ zbd2*mX!qhu&}H#Ox`hCydpK1Z#XnhvZ-qBg?PmkQ`yicvce^)txd!VW5EaqLi}?1w zN1t`nSr_6uk1JE4RR` ztR35CtGd7t4JoFlbTaw*+u7^8zFt5Tw2gAmr#Os0G_~pq#+L%pIDYymX{UP8(+RBY z+S&%*wIwOb*0$0th*VrGJV<(K4q!>u!QT^cmc@&sn=^lJQqHgQA{Rg{>;Me@^$J0| z`%SniEQxYENZ_w!l0TT750|3`g*;wR!~{wXAlr^O|w%}M_5LM83r5K&P!bfMOm3a^zOQY^HL zm)ds)7arjSE8{at_G9P9X0mfpXv#?YX^kVQtL~j|rGv16)3u-sVT^LB*w(2)tLX0Nikekp};%DZH05XF$cS8x3Y_`N;7H>IyTjUV#S(^`~u$%L^) zD+(|aajP_JUv>O^{h-}-QRBK;%&xtHS_B}tVf{8hzI0KmzhelU0Ao;u;Nv55hbL5> zOfuBkiR$ZWfoe#cg&Zed1XDA>R>uuzY#w6OghJ^FD#(S|tjyQ2F+XozZQHP8^UJUl zFSY#c9tqkHc?Mo_M9euf_jqbs->$>OBdOuoeQ$lV%T;Aseqd!UCOc~X7N}N@+z(** zI0UyPVYOcjm+bWes=*)9`8qxV8I+JY`BWPdOA!?>}j1q`>j>+y4c_cWp?m z14~+E$lUDewB|@jteM~2%uL?5w5YaJpvQA&A(^sPm&DX>4R}|Wa&G8SJ%+CcVb!p^ zwyIN;RcX~SH@>8K0Ea|Ud`#_dcm$+EIeV&miA}(4b`B`sA&S@e>dJeT@pZPg+`g7r zb>_b9-8-&{o4$QS@+}@oO%AN@Wa?%P5bi7vc;-^J`=^M!yl4Nalw{7A>Xg4&KE)(b zetr))54`h|==AcL%>jsSmiPpp29i1OJ6GCwwo>lItGCBAb5{{Bf|P)w_yNRArtapq z@9HONFy_L?s##&s7r<084$e>OHTkU#(N66J;^}IFFKq3us7axpl&Dmkw(h1~5SsqZ zW3xw>EeZU~4-IGqIhYOGzh5W%SktpRCWAQ^5Rz!bO39mV)8>|(q0ubT z)>q3p?9hHTQcBVs0T>i9X=rS+sJSl zD}W(dDWg|+M!nYko>VgcNs$ilB)lKS7c#9*jO5Eue{d%nKr{HP3KXsl6?p?xdr1C~ zSw-!)Wn=zh53(b)dbZ7#7ZkfR4S(r?w=7^iTnYt6Mbnqg(zsPe_|{VO3R8r3vS@|z zBNYu3uCRKg@1d3p@Ew5Bl^5N#F&O8@KIzt#kVfcjea44%eyoxKM7?`WX|QXP?6B3- z99xgMOPQpi{d`x`Al|C&*VKqN3`A8 zKX8T*i#tol;I)gX7I~1{>ixhSoo7HjoSsP3R~xQC2J@c#CDyDvv~-*hF|o0(s@k{q zXyCpsO2Z_d+X=93X|Rfbb}PlG<5{e_1A$i|C^i>-YANdZ%0O$F99P-U?;ALwNUX@V z-r<$Ev&yw_<`ve5KP7x7sro&JivH*-hRnJzamC-4BNfTE^??MxsC0R&_~%mJ;g2hb z7T*AZmheaCE->tCMJkD+aHq1O?B8J8QuCuc#11PcfY>McfYToTh0| zk8&^CJHAVATE=7rhj0ch?suf609Zz|$k1^39anxIRx3>^t2M7|)Dk7he7XH0RysT^Ps-T8Q$wtDao5(o}=GK_2oIRgd~o_7C<~u z7>cxWZE*oZI>TZRksNuWQcRSr=1{jSM222UF!E-w=US?%I=Bd$B4n)8wCsDt6hS`o zK^PD0G%ROf8Hu9bFpY(+Az4{Se)C_Gge5K{^<|8pi_37LiHFW$*MK%MMfl|b$#@x4 zW*k~O*d1GqEzYhzcFeE&X`-lF(I{w>$Hg0j%-jKdN8+waEnRm7-6rVE=>*VrIv4N!2k4_!MwdG&arVI2|5 zjy4lJFL|A~`rW)$rVS3BzsosXgOFF9xi>X+b0A&VT)`;d5ZQ99eA;wx&@t!VU(A0e zGDHN}Cdg0YnB?f^*K9~tpgwwIcFtF};usaJkl9YjgLb5duf-BWVV=E%StXJV0HDw=MMlu&E2?J#-wOT51AgGFl|;Z8^4lnv>Rkr{>}bpAALr_`YX z9*SSL_Bk(cIvY`+bvh$~vZ0Q7$uUgB!oCCU;hpd93i_vxjmwXV1Qbi-HDtC0bDSoC z97I>-w8H~a#ULM6I%3dE!HvfSB2noL+CuuFR=CQuy69(#ph}(E*II=0th&aUJCAhJ zi6V)O&MVXYCD*S&bGm7!yE^VR{cEjaUy2p!J36&e=-l+n+|Y^}Z{p@_e@mfV#bv+% zR7ti=v~*ng<{uPZ>M$sIG3)N2KZ3s{`yr!7eEqWfx5E(_j8ylPn*&G~DgIU#*~G$A zs*EW_|AB7(j@G(_j2f-yxUx?APL; zu~VNKl1G#_vto~c2+yoX1BsFtxV{Yl*{w$d*##5lVL)KUh}Wf1K3*`85$adHgon)?5U!|R}Dj>ziNn13rIBls>y(g zS_~BJKWX%_qJyw}Ke+SO;uQzKufN)*#M@2)bLW%yl;|WRy3QLczm5*`3ZGZF#&+u; zx+S7+kvdR}xP?VHHaAn_aEJyl`Zp2}wUd~%O=$94 zG7O(0%yH1apqEP8U=Yzsz;bv8b3W%7Xt1xg<$dlkP7oxzmrw1CfkmiGg9gzQ@e>%d zseu`^DZ!D9`KsnEcsm?iQP2is{lYTHQ6nJv*>;Hj z`Oc3ZB1T5;EAMOzJU4ojG*U3UDhtH&5cJt@Z@^sIpTzYrX;L1pdV6RR=m?s{@+W5$ zUN@(8Y1wa}?Rzg@1Ihm4;KgMrX#WK>Q(Wm?dW=8p{~b_l5y7Ck>oUz&ZG|^e?kWw{ z{+8xGS(XN(i>?_&B7p&Cl%7M1_g`1!UCb*8_{(;QlPNwA%a9Tv7jMw$(=Gx$A)HSv&-OU;i?Z{>~ijm;gK#B{=)Z+ebwL6I@; z-w7n1EL|L0CA}{z?1-*9nI-_N0d$NzY+TTA==y|a`_{crzD}9`PN7$@mKKcFKU<(T+oKd_Yx0=_;91O7F&L^>A` z%Fs21%W*=uBGN=99BaWClMJV@4TB#O3crH&_Z~@`i3Ab|V*d z9pGaecBbQZt4UW58Oxb0#BS;Qs0_rDMEWg&;^S3jLBy$e^cBsWJ1kdC8HN%g%{A)z z5raJAV|imsI-coz)>2umZbhYS1*3G8t0`}+smUVoPd?ivB2wr|pXV*2c-yaA)!pD= zBweWqM?(?O6n~2F?(O*VoLu~bII;2=Z2%ml=?`_dW;E;iG|9pFx7Hkks-j@CUy&1Uwzc*F;Q9tb9{^v;+=xK`xqq2D14QIIMLLr3& zKcHwA$9}`T6u&4+cSy2duY9e932DHA49N=Bb%6hMR@ik>)0Y>~AOFvb;NMUCG$;}q z;u=V(=%5?~nGZ6o{Bt8}|J;auZ9YfqWS0PXoms3P*%llMM2UAuWy?I@BF9w|9(i~z%!?QnaG+;j!XMD~p$GlBXW~G1i z3?A=PTT*naF8Dm$r-j?O3s65KZhF)p-4HGo8W3NE!J3%!SGzC`E{XtZ$)Kdd+YKR{ zS&zbZ z?w&dFHM<^Ue@(I*Szl&IfG*jTRf4l!11YRiesPPm@?IOBv8~JkIQ(h_?m0H$cxcQM zfA9mEKRmHzm^juL8El#~M=2mJ?NVHrHCwB;_0V!*6<@(lHt5zrmu%AA_%2-sJWAp* ze{p&LvnYK}H?5YVU#*3Nz$kj2a55E1sb{;E>uByxySgMa-zeaTZMRYm6Z;v^?Xip{ zTcp)!ZLd<^X$`0%?&{s|7=lrk6ZC3oBKa+&Zo6!tUH3KB4=~^pFtX`$MnrM0%;NYe zes(pg9T5v4H+XGrt9#+4*^%L`C5bUhAazcJk5}?FsD-BoR=J|a+js5I!t(uaBuT!$ z9NzPkoS5LkAwG=jQ5k9KWg`ksNzbi%V8=3%^^K%^wg&(@x-;&wNjuvMe^`4APiwhd z=$b-J^?0DkEw}B(xXWn3jC2S8g<nKs^Qq?*^UC=kT7V@6(NbL>$lW5p;&km_vLGK3LxXNeQ&t*gbU ztk;+&4EL<}^18PqjJoAATd+`R1q#UuF$Q#)4FaULEY`frAfURjlN4lb_q=cItNR7*7;7Cx+zOkE$!Uc%Fj4E6I@V*THo=9*@#YGfn@phDGmKMs#yZ!G zNhU^z|K>L@&ROL>X&CVI?@`1qu&28S*52By`D210AJXB}yamPDEknYqAu;#)3wi?C z5&`nYxz5J8Y6+l3-5MR68!>?!E)qo17wi?~^f_pb`ei@2nGEjZsh66ow~Dtc7WNFWyyG_`$f>pC(j#$`D`cm{7hD$z6Wg5 zZI~H5(UqdNkMpr~*w`~2C`**q`;Lms?f~fX#L>?FmBl}vcTyK}Bx3)L*>!OcSKwdv zwnCMvK^HvwMzYieM72pC-U+K}oqtYYK zhHu=)!K(@TaE>namWQ6ZGZfMt7K_atO}$$;G#+<7D;w(y#253bi(ooPLXUHpX9wWO zu$PVb*M{_`H44g0Jy z?K_$bU?w;IXZ6u{YStdLgrvttHy(hwJlkLcqKq0$dHb3;H0UB1GSgRF!iIHdl#+hz zq^pU~JC1Dp?(22?aQ$Z@e`50E)K!x2vNXcUxmtGSu1lo7U>mR7EAgCz7E2~g;Q66m z$cmmG+j3jY5hETd( z(fA`3Pa$U9F%@>F@QaW9<_+j7zK%t^dE4jszNO{Ix&=%3#U`euuNfGn+%3Cg;o~JX zsn+3FGE2fxZWOB%GdHV!4=qd*4^Pb0l|0hDFa&VI0KWKjq=DeL z;_-Z(KpHMqFXoTQ`h{e|@EMvz3U>@gQtcZ8??P&FA7>a}ADLg(w5)HA-Z@%|w1(6u zjAo2oTbl_9Ssp#Au#v+Uo)lX0TadMTY2q@lobfiH1c3x*!m!M}_aYa(NKS1Tz3Ew1 z$;vi`%uY*Ly)1*LJb*D+xNx3%SFl=%q&6~UsuRsI8n}UUTWw^4o;~j4ZWnY-o-F@dkqUTBepdkerld6RVmc zNYmMzc2m8wlMisX9>YNq=Y)`jaNKA~W`nmRWs5vjMtl+pyko43y-Lto0UVr=JjgvQ zL;jenH-?spAw6j+fhmwysH!r5N;bv}!w590!IkNBaGOq=?1LSO5p-OvLt64__41%rvFwrYeXz6rFHJq*0@S~2tl@R={o|UFEPX_Lp3-_Myq&u;G>FS<9 zoLlI?3d8Tt@H838{G>7;+%^)1@3nL?5C?W())6hB24DqnVAT=KqslqkLCPtY1n)v1 z4#uWBRZRF}&VQ;+Wei|q*TGa!LaSSY*$221FroqKV9FSw)tteq0v39Cb*2KU1_Bau zc@w211d&}xWQyR)r06kBwCUsZd@p#JMmX`0!qa^oSaJ6bKW=#^6z{GFotkgb#>seo z`FM3UQ=&T~ZOkr}1}T|h*#3NStCmfDY;F!6qr_3;M`?e{{FGQE|0pL(D%+v>DE;H) zqsI<-5D`JTQf}6a3vX3Jn`|f;f_*wgwRh61I}~>Vx$37^V>2!TXF|-FgY0T74F`xC z-(o*e?Qm6*^GWs!$R^*Pr2i4lpD)$_2o}u1hSYqo<}S3Nx`9(P4ZW?-@+)z|uXS;y z)r&#jkr6iQ6Uo57XKJ3PGDo;TtrBA8f(vbwO_)3=d6~v|j@=YvKe#8my;3bOC|x6J0hP>| zRv=6{v)rG|IWAD4ZSp5xVJ^> z&<0V9PRZyPSWYG9eMvD@G_%8Y=~+J>Xz$G~RR08c0ke)$Y^mpu?_nx20PVnu8uu)` zDG!yzaqxM+soa_}&Vn-DhNpXKXj&`O+CU@*BlqQ2r>|&|NJuQd%0_!jt1Nx;};V&}e_j`t(t7f;Q8>3Yb{tpG{-5jB^hP9=ymXV{QDU?w4UaJ+!|G#(AO z=01vl7+=NKR>bwRgGZwT{2=5fFQa)te6fIS%Z++H^v=bT$n)btFx$D{MmPCd267}o ze*Dlu+^>q>8mSiMbYP1mEzH`rcfoO>2%#H=W`4W;jXbQt`^R7h^ zjK>;dmdC;XE`Er^gG)_nCOI`>k4K2!05GVjJ`EK#Z;0nV)IKr?fH9w6kMFv&8+F8g zetpU_^6p5rtz_;V-?Jc667UnHqIZ0CRBQm*1m8~}`(Qdb#uk>ZhgJCU&=q3Kh;xdb zPsA&Sz)CJXH`7FtTXBd#8;?K$wM{c5Xdmo+ybMsTtKN`2Jgkx|%wn>~X}(94rmgCK zpym_RkBD_hNXmrn#AI-8%dA#Bca=G-(V7HXfel$ zg(>eQ`PUdcF!n@rCrRq3^n4qv+pveO-`fB^t2rIWcoRXOg=;`)Q zn8v83)N{MLq4elE_E1S+1%GgKBGj7kjnGU7@wF(Ww+ZN>uFs7O07t#4XRtRHeE7r= z5MXvFp~lbdk0E^6Nu1t5{W^D}0jZ*EyFk~UIFk7yvRCWZZRpsi7u!3xljaV`8IORc zHKPY~$?-+fwX`$zdViO5Hay3s8oHP!1DDExYD4Vx2fMNn<|9-(t%$pbsb|Eyq=rSG zN>6H|fD| zEz~^dHQiypOOByAzy3CI+=qSw8luLdqKd|n0}kYfM;_}D8(}a**+E{{AJBTEXVOBB zI&z;Pa3grf@#1lUi}&`vdwmBWW zZQ@*gML~C5UkPir$e43)MdWMrxvO2$wow`7F%S}(Km(O0njGeMDs(7Ojt~k0_+=@_ zu*D~0{dFiy4&MkG;d{NCa{?1bZ#-qXyV$^rhS9}uFp|wX!n((dH!J`X+Ch12y%hb| zV$d}8153>;SZ3A_`>dechg1PIWti&)*5E_To; zYEG4c_lGL3qMc3OPg{VOnGKXC@dtZtOdqutD+0&W_9M>^c{W5%)N#>N>@ht?bVfGw z%33X%lC6@mx4~8piDI9HiVMMjjS{DtxFORWgAgXCnjwj;j?Jwc#?xIUPQGzc&YUwN zm`+cB&Yzm36SQ>WF*=k;yWY*@4vR{_TYed}qPi&{VuZ=Bs}+ElDY_2+I_BTQ+9<_` zI$4yW5>n_6Zh!K|NC^L)_^78#%yru!z;i^MrR31*2&F+ZX*3%5o _n%!uxt;3y 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%0DbU7`_nH;AP=zz|w9Ob+M;s2M1( zpdKKEITss@ku(U#d73|Mc%FZ@cNju7F(xk7@y)i z+&8^rP?G1NK(57Xey_?2Y{?!KC>7={(I16d(Hk*IWMCgv?y6dyD((ujsu1 zA4lPsO`z?Zis{}u#h&@oY{b;*PR|?EFwOE^JHfoRUa+aT2B0h4CHgZsqc8PXk##oY zN5nObysE8tRe2+g$A^lQ@ewt=;2ZCQ*CcyJ;g4gZ5E%R#5d256AJX_Q@5#GU;yMTV zz`f$okzaA%`-WdJ)-(i|%5DY&0Ky!8MTkRjhZTg;qBJ^spA@jQA!H{bJeOt5g`OXuN7&OsQ8kp!EL+55-&h^66p@n9IHxaKw|*x)u*dp za}>)45^ZbnUKId8J+`SZHBYbd4ufd!BE(bweX>pNf@5V-p0A@w|emfYPK3KUW& zk1llKPSqkRiY^gxoF|rj)c14`Xb6n%lI+&%)-x{1DQLg#Z>uz`=z(cT*6xv4d}=}wfEs{5nWbz4;5x8n&k}Hqj17!NGRqN zvum_4{K2(}z*e4Ai25Xu4-STVr)UQXzVS)rRXhT7l4QD_R;GZbp*P0ec|aiA($dht z4`m*zx93%)%;WO`pm~(?Gx@tfadZ5w?Cj*alI76=HS_u2Ast?0(Bn({U5;?h(6=r} zhu4JuNPJeXSoK*&tK0YSRDTN?VxSteEG{1Y&OW-=E{2f#L0r!dR|Jf~v7=e8dVLvR z0$D44b^jv>$Yc{!PdY?MuHO5{p zF-5WaJyA&Q<7uGC*niYiQu?m3@?9byDr(TNt#=p?+2*SkB<`;xU{u z%S*!>`(-QZv8x%YT`g5W+X<{Gv+3j;I6OV0zwk7^w83U=9mqJOr@s*-lhYEuJU|Ya z&vbNI$O!!6zUFfA)la2p9Vf~0F}^S<)!QAcTFss3bnv-~jYa8hcMG53pH$DX&empK z)_1*tonhA$pGFkjdWG39EtX0JwtMJ{9jRE>QLOd( zuOvnNp;hsyoYyj~9JmJR+TH6+cT{nr8K?DXXwaS~^lqJYVU{RxjafJRX(S`44Bkyf zED2i>N&m){=!J^mhlLT-kyl!?;YlRzBYPdXB=QHqh-P&uD>uuEiQ?<~CZ}68Qv66= zX=7<)-#tz9yIWjuo3G$^R)69tLRKGw#1o@*lY4$!QcDbB$tq-W9|zZp=x2T5AvFW_Gmf*S zcLoLr?X4$LRv!lR+49`oZ6an@y;%pIVd|)>$*sZda@jK5uoGJgA7HhQzT|DP$-GjFzb!awgm@#}^M}lX`^v z)@XfFe-X|Zh0|KYRAI~E60IPev4Lu8OfBnmEgP0QKxIcx)gd=nYGFq!0I6cHXX?W{ zikP6{K`V2A-0(rF%?oal{v~JXATt&o+Aht_8`f4K6s?H!8Xx^DscWD>^u{2xQ9k7Q z@@IRjVNm-Du%0D2Zk?ZsN`*N4q=$`nGsd9KqS@t4fvq%|Aq&KQvz3 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
  • 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%0D@siwb`Zu?H`V%-Y=d#VR2%fAYT2wUY7Pxp}s zMpJg(ftPt*ZRzXbkGPVzpm6F(?+1gg3FA=Wod^m}EIaJ7rj(qpvoq@`KMZys<=!W* z3~k6C`RPmc8BN|cUes_=6Yf6IIP@?YsW*z|Ry zudPG^^+|}mA2wMV2(;jEI-NIifP`pgR!_8q$&m@z}NWHan?F5DVeB9w>9KR4B^~GhJ zj@Fu{LjnND3%)wmF~R%9wLwo*IYR6qF0mqk%ea_Rr-ce%CA*u8g9@XRT~3s3iwCKi z1rPg!%UzYE9vVH;KPXx8>KBeGzikT6iL2MCw2WG`DEYE8bw>6so~w`KQq=E-sK4Be zJW7GP3j&@rs19#8xVBXvNVf8%aGcwp^k5fVV#$El;B}>l-xp>L#kl71C%yk!7y8aC zoT)pzc&1ei*Ynrl>0g(U;6lqrmv|?Ia~jP?4o>_s99#QlEweQQ;(;g=m0OjC#Ab2r zblQsbRcs-_D8+zV)@ng^{1ZeD;*Ff35tAR3oAw(5A?#WTzcn((;0%)sSWXyh;nOS{ zG>ZVnGAe0Jt8P`4Uz$AVQZ|c@o_YhE)?9XX&c*`@P9a3ayZgUz7dj6RL*h(+fEAl+ zmf5DHNe3JZ5Qp_j&24{2<0)$sJA{MQd8V4(nA!%woeEMZd(W)8J^h0vI?glZOY;kL zw4j!q=8V2DE4b~EE3@Y9_2W;{AyB1%DT4qD!Z0Td-_YSBI4&N;;L~t>j+vC;n{o3V ze1)sW_DrWO-;CW0^2iAjmA#Mh)EFT%yqFuacDs`ScA+jsLIvN>3t|cWO9mUj5Jkx?4R{v<5xd^2vob_&-Q;F@FTSm zv6udFWF%Yh$l;hjIB#zaL|0b(BF6<5mE_EGxA87yb}zp9*|rqzlk-+^>R;puvXyl1 z6a^VMKkbeR1lXp;*&bgP|2x}2Tf4$KSt+bBpP{j$y@(-9D$Ds&^CW7;^X7jAU6g$H?4)n zRxrtw*IEs&CD{e*pt+fe-lJ3dUhhLpRIXB1Cvy#hVya&1S6Pcen&LH3)EWVx3& z)CK2{*+YtFqSb}xRjrU4u)*Udamg1Ts#bJK6}GLUub}*chOR^>zlFW5Y;}q+Jt*bJ zw-a^!ODb!DO&@SW)5Vdfo|tn;w5w2KVxW;t&Rv%MKEo z`liBkT4!1SoNFyDWIbmS?X5bNPS*$V9zm7>=T_4hI)wh(B8}wx0utj|SKUGzKR2(B zW$SoK@^63pX%m9ImW$!o2Mj96I@sWkAM=XIe#01;#tkW*$SiBNw%l)OgMe z+*KJJL*24fX{mLkR@aOgvDi12jBW*9yB5YO&d4OoMW{lhE#!s=T|7?+W%`WH1%Rah zlobeJr!+QWDvq$r#(^$~WHz0rCKbV3b}Gh}@mo15SJo)O$|FpxiLNrF+ayHzrDs$zx72`?}BmFBQmH7C(>0=`13;xZ@WWnrkDA? zi3;s+Z1!)y73c(DqeQu%{8>$O8N>3F3@?md5Aj9?dzXs!p%!7pi95ZkwCK%Aa6{?| zul!|>pd|LF=w(jfj^YcErOUdgOzNF4W4~#&J=Ux}4OyX(G6P$ufXy?tJp|G|tA~eA zENTl;OtAL~&~G2xnwbl7~qg zHH~t0;hnuZFWG_q;Odxp+$lPFcWx`c1J&)S*wy~M7JO83H?==EAf;b3RWO>>X0AJw zngR_$=BF%JKyZwCVWH1TvY%4p(VZ3!8ME3H6H%W+t<*~>!x19{8xVi^9kZMceg%-mkzkN`XcR^0=07-yb@xdY zKa>~`V?#FZDegcwK0KYU;JqMOzBipo?XcJ|6lep84ZL)seEq4P7m_yi_>XlZ9!%te zo|X?bR>Aao)2By&e_w$&Rlz6``13tQIAUW)tSrNye!FW#c4Sm)Qf zn0Kr*^(|A<>i&p^w9_o}w(hm|Y~ob4nK%fJ-9~H@*2D&=GeZ>Ge6WH(ikRJ0#@rjs zpfyx=846OaGeTOtEZE22%RC&aq1xFd?M~3)xuh$OahuRxaTF!mT^~MnC*=&e%|a9( zf+_-n@SRS#yvudeF(h4PNDnAspN2sTlwo=doRPJqMIkTMUx(eFus=C-iz-i0wowg9 zg{q(K=>wKb1HUZp4{5E%!kQG?ki28?P;u3mcn9>g9T@mU4*f z44S)6jr3GWW=GcAP5Sj{$#!3l+&b8cA zIwzVuQCz*)Vsu)7%}aS->PQl3-<>$B?n1%v+s~C((1CULKoYK)dZ!tzE<`Yv3Oj(^ zrm>^K0`+mLeYH@+(_rwb2Da(p!g9_m^5UWugdaGnux!0+ln!~)cOH6uHsB;amS7D4 z0SR`xW59v}QLgc#tTDU71uPdT&VuOm=6`PE+xI?NW~4Dor|c}Itc^5cvFo;3N$L$j zL$s}#9OcAgt}f}$MGIJa&P=8RyaCr7%bom9KP)fpht@SLtG}@Z#;?Em{r~p=qvbYZ z0v+g=Hj6^?9KxI?*ueDol1u2dtcGU&jr+*jR+HL zjBS4IcHX8l@HPl@F7CblrrDu@x#f6>GZHmN!%B3Z%T^?0xLwWc)_OxuEZG)nzkA90 zIXQHy!hB^wxoFI~YtPr*2@e1hH|Y$V=iSN<567uR@BpwiF%+)(Fjv+rx9KCCG#TOw1h~ zB89v*YCpr>az!8NxEs+5XfLY< ziml9$Q?D4dm$^)X$*~SfNy<_?)OEzif%ZK+BHj|Ax5E!gQmxz8bmEts#q2oHH{Tr! zeSXezLWvc%)Buj_+SZFAHb2lil*X*WF#3%LcCgdKwZgDP&7^EAAfWj%Hlu;BpuL#D6T{1@Touk)2t!>(*uB% zOj@a#Gxxd0nk?@o>2{n`ugV@`ZtPq~>4G{`t$oeA%JAfHBY(*>L$=jgn z9a1*oDdtiSs!hsGgSjC%#+BWO{T*^a;J~MRAA^`Z>QX}0sZj0%z|0fn>%8vnV7EIl z0IQq1_{9y*8a2}j6l@DIYO&LGGiq&pUQBju#TnOgEj|Q&d!qFQ(h?#+e>Ibx&rt$> zE~8thxk^wZfCUW8zZYUNYZN0{Mk2Suk)X*;Lgn9n3~}o(sBUHQh6WE*^HkT*2&3T0 zLYl54DxyVCJqRU8sKg@`$J=;VA3VI025N}-aW=*nC(O%b^2g9Vr6W|v|Lj2_1m8iI zfzaQOfm`L4CV=sv+&ILhfjM4&AU}M5_oNc50V>*q_o36)n%lrfTHMO%Q)SCf{H`I+ zI6SA?@FrI+9^NzvEey9oYp&Zt?k`{W?}GRItxr+W*Eij*Ui8}QMg%P{Bd1A#qpVl4 z+XLAW%7Z&|i0bU0fes`X4}oELA$lZd|9_x?=l>}pXaIt^Pf^G zsDctPfjQyB)jBSv!>LR`h-vKFMp0$7h|Z( zqzUayQ7|y7Xt!CCBzyn{HmySa$CdnJj}4W&NMzJ7{*m|+MYtV{l$Y>Q%$q8q#&cK- zTx0rowLw{E0BMkAJPL5$H+YY%QXEgfk^Lqd|iN}}Kv{2Czt@2^upr-p#leX>V*cZ#qe4up^T zrt9%fxYugkL)}vvs0TmIT0PAlIIDlLJ;8@943!V3>*M+=GK4EK0$_@A#jEWrWkH;% zL!Kx=%0!Sx#=(^4VO*kgy^BybPE>+G17k||k`KYak?@4;V2eU{iy}x7T$;eRqiNK) zmmC4`Ipg>r_~@h8|45klKrsjQDU-Jj7ebd|BV>1=gNh!gU<;(_K!aY(689Ihs#yq>jcFVGev*WPM7y>3AQY68 zWN1|pEK8k*3R@T!0=o^1Q2Q|{qhKMPFGd9**?{CwLWv42gA>ak_0O3vL-eX4)%*#; z5|R0@7mAXU2s==P@C3}Ao^{m8V$>*r0-a?*3zbn|NZjyBTj!+ym+NU<7|tTnbT!65 z8R!r$838E;ffKVp3W=DIpVS`Ys)FD_K^-u06g^|qs%%cSm=*TNq-cvvCVI5#-9sZl z4FAOzKZdn(Rra(*oQ$mJt$evbwqhsCwUgE@i^n@>^flTH&nF$0wf=c@#8-nH9t7e2 z^)l)HTu}t&1_nIx69qp^EWoouFD~9Gy#cOhjByjnQzWJ>P>;0}0rmH2UVNXbK{SP3 zTR{W`G+1?PuUgi)I?kw?C1}tfA}tBn`j+(<-P+D0|4-v--uP|bMnC}z_5%;*2Q{Kf3yuQ6jEEVVYQJUn zM*ubQpFPyCRf|6a%H{y};n)51xY=i2zq!8`!*kZ!nrK_3v1qWO$d6RpV4%uwOytiY z>9RTq3z420@%PCW+4uwAJ|C}F9W}4#u^68Qz&Gr zfKL*KMvnrqGy2AtRrnGBriE&eAR1%z&@WhLuhC7evTJr1X$%?_1#=Z3O@?{{p)L#E zt}`n~n>1l7LcZscDU~YFq>fpg=2lce?df6;tUd&FK8mzNY)?eldYbg4N6Qh zoiesPE-X@#i0xLK^fT0ChPM>^4zF|?xyn+nh8d#w42Ge4R9Jt>p0?XC3rG>Kw8GD- zQGhbB&B!y%_*g!TT7o2dsSzzlC~F0MIOzzf5hjh=pGgwM09e(Jy?us}6^<}FV&F|N zz3T&Nbn6qhi~AYZXTjoSEvxLd?PS|Y)xD(C8YZjLI@M^E48YR0e~2AWj}kGun{m*) zFN>1VSMKB|;;i!-@z$Sx-XG;|Y)oieZ!sIl&|XVxT5qw~dDL@r-uB0LcNT@9?|w;_ zH|;6dH}Dw(9*qMDaCw5@+l&RcPFvGEl~!u#aNH8`)@Ey{J6URs)A-cyHw(1#Pzp>J z*GI4(hWCm+(v1i$Sy$jo86%^Dj>U?I+#-KV@UG%pP0y|Qg@IA7p?UZ2C{OI8FBeYK z9=tOy=Mvz`zbO0W{t}xkK6Y7TH*QKAKj!LWj+wqlZ zrc5s+$T6Tr{7wra(k4tTWK`)xIJ@l?{QttU2z__>RQ6?$;>+t`Mbrgk@3g4vB6 zjCgRHo0&B||NE;tRqFGy`FsxExGvx-P$n)0h;$SJJGD`h3T~5#N%5qjb+QM35=*6W zPwSjDpSfe}t>t|~VYxv&6=LCIzkhOTtz%{VnT>KFSL4k~w@oaMov`_Z?OeXl-x5|A z3yK3C>v%+M4;CbEIhwJpdR?&;Ua%m%et!gp z6u@seteRzLwgt2CzvxFFBxbQ$?fWv}S9BSoykrJdi_U0Bi6|R%*>mZ#qf#>D$95@oQ?wJb6}JhIs0Zi6f`3P57{{ zH-+=QO5QY^Gau~E2}_tp5zUeKY=8=bM1khIj%aS%I|*9UXfRF%colgx{-OqSEK|+FXVE{TOpcmRNTR^ZEGuLwiNa` z;2b60Jb_37zWPxapacTA#)T1f9DGwcoExb+Gl~d%II7+!Iu1@SMkGs0@oKD}Rxo4+ zE-&sd`9pS$)$v+Y5P)BCB)Mw(%5M`nU)eI{KFO_YGB*!h`_-jc2%4yj@Hn@=&byzo zB9Jxei;2kBxtC&zhOB59S4gzk1!}0!P_c9Bp!p!i6*bL z5#@{QkN^I@IxisHf7M+k2eGFGK$aeEsJ!`6v(8jKRM^6tEvYQE4$K~FW$kKGTzwu^ zFw(yd6>t@VT-n(vmWxK-iWKT&cw|SVY)6Gn!Vj4Si>ARx zXH}=v^s>Sfu0rjNITezeaoBCs_QmbF3oADphhm#8FFur&us`m4)$SguJMcxRg3(*Ux4e<|-PVE@?&23{#5xWPV zsH#kZmJ3rnYUE`3Zx>?D*TTQP|)OL$#7VAPTdo)FI{^il;F5w>FdA{5z zU@JyIL}&kedFhSw5DBN7kT_vGMAii?;1WUNqnhl|afB1rR!2!kR!L`iO9Zn~V|}OH zHadBAuSX>wHf(u*qv);wdnb;L&Jt%D!w^L(# zyce_(HSM$C4+^5uJEs(t9rvA78V$MP1`l!6o%WOKLMRdsTouPGc@Zs8C8htV^vV}I zL(~~G-qnZ9HpWm6eE^dS3S2-O)YwC*%^$G;VEz*-#k0@mGVo$U2|ty1SP(~2k|ioG zErsIhfhi9*@`BeZjzUme%5I$48?+f8Lu5S5p)MCeLsT`)fF8&Gq)lEhoQ}3L@QB|{ zG^|8C;te`<&PH|VZa|Tp(W#$D38Xti-3y?z`jf^Suj3k`Nw#Ud@1hQXg`bdnu`ozL zxrUO*88FpOdh4%mZE#bt`ZHR=j7I&p<-&J!z-7j(#RxYJ4PPG&0U>mOx;y1ju}iY7 zL`82R_?V+-hucqZecL{AR^avIDcgNtO{|BhY#Qk1*8R1>+dbzR*R6jt!Kd;tNKm{8 z__6WoU~_Y?ln#C$m;x~+j)9BxP?P0oi}#x=IdfVR!y=h&vg zP^}k@nDqRKY{0!RjMzrr7CW@LTRLOZeU7E@#$A&32M88W$YC{o7`FP*=h>Gva-@&x z)a;tA0V^U>D-3Q<(PM;qZ%`&hqAVMERqOwGlZAp=*Dfx#j}fBA`TE944EZf&VEvn_ zafBI9i_??K=)|wn4yC|{Fj)1d_2(cb^aR?X8E@`iMUgvzwis=Wpth$zml#ZbSmtyH z8Yc6jF_8+QSuG4vUnA+|14Q%(ND}`i2o7Ml4B^T0?=pPgcMqiZQy*0;T0Nh8AzSkF zZOyrlsz%n+M)cwNBIML81j=F#bMA@+NwO@sS^3Ga_S(rKoF1d4l-N2gOo3ooS2M{{ z+P^<;wxv#jJ)X*ieQSHWyi`ftC;NKRbms^Z;;!(MExtZD6^59KNHXP8d5T_PAIM27 zpCA-K_Jt)xC=co*l|*7A7NXis1C>N$=8swjP^fp3{KU@?BhvUiAwtzZ_yB%E2E>pH z1iUCcOR`9wZ@TDQm(-AD4^{A*aULdff3@MVxyQ0OC3St%WJ%nAZ_p^nAa66Dh+XYp zBwt|en4*9ELDBN~zNvYNNFNw)dUlA%Emb)fpi}d?W;eQX3(pU)mIp&JzIM@+&hC=&vF)~lN(jxO=I3mkcdXA<@gP%4l&izLw>pzMG( z1)uymcpYQm2AiXxi(WY|_O_ zqo<@g*G7ZMLnCjJ1##LEB(cb$$RQA@A@3U&iF9g%f_K>Aqm)p1lNVnD#b zcSf?Shzb`U_Saj5Q)+ak6!&b2b*@vMU#_dNM&<)Q^YQJWOS~hM4!zDTJ31PsMTkCd z@|*N>z2yemqT{FYhfkhM;fKeD$VMDw-GDbAnB#yE0#7u3)HiXIAZOJrn;AH*3zoeD|AWs4DJn|Nh{dpO7{Mr`~h=89O(7=q;;djYrNDRw)-tY>jlPuH6y(I_HTz6 ziedE={#eTkMUcoV?UAHmyVvu(HaGwK^K2V-B$+1Ke;f zCX$QKaP}5$CPTGfXPAjv`%ZP(WvaB+@29B`Tg8pw{yN?JcTm_p82G^QDliAn6_7ns zhu%V`N50i(b3>{4)d>d>^w~JkShwN7x&HRjn*vDFEi!~*d3!Ze^ZUGPigtoDKwaD8syq*s49m@Vagz2{;BnpOpk-3?^ z-4`DX16K$UT_ch|#R0w}))r(dFijFb^b3veZf}%3olt)J(>M1MZ~6L(;>Io28`*jH zN?x|z3GsvC`NQJitxL&{C=up@`T33R`f0OgD{Ej&{U3i}`aRHnHAVFR2wnErJPM!h z=?GR9(HDJzs9%E{!J83SI)cmeqil;68$4_mii60~Gw6m30WTb82UdEd3jC_K3GHvE zZLHs=vNsG1D6IulDst;QY4keP9*h(nq4+Z-M44u_*c`; z^C7}vEmxj+*aNsI#_PXfe!s54I}L2O*LSk_ej8|_VH~Pp*5RxQ4x*VA2*6GplOps5RPZgD064_f8IS$jg^oki80PbeYJ)vY zo4*%z@vFsPCZ`2BQ8R0DS2U%9F*_D}wXl@cOIu7L4|Q{L9)G#i+jtZ$g({h9_3J6- zA-nsu9EW(~mSa-Evtx*->T2oDp3xQZMVYM^gplku^jS>^S6`@9U!ZR{df|`FDJ{D~ z)_8wn0!;;=dS8qmkj2VtrhMiZpizY+63ei2QkxABb%ZPdK`@wPR z!Tj^jduq`!IefFFD}Sa;_FU#+rxdX_4P9EXw1ht;jbhRwy;n_)shnMJF*(bR>QM() z$HBzt_!Ui$`Mb@1e?tPx_ z;d!)Ws?|h4lw)AL(cpDHJ|iF^hRmFxEf*qgnz$t@j%!!i;j;ZQ=R@V{21rgvMAHDV z&kPi2(rnh#ykKNz)B-g4{VEnNG|AHYQ?J1g-&%F)ypZ+AQMWqStYWMf4?jVRxyDgD}FEIT=B-{^^iFF(C^h)UjA z!mi`BuxA5Ls=OJ%4XS6H$89r+roj4F4D{txdiNXtv)+HQiLLvU?tm662;l)Kn8s;f z3|QWi4`w-%ZM@rYxZysO=F<#1CNIwo3WeVGD9}-{x_7P5ja7R#eu{eV*MZ%ew%9 z;GPFP=3R)=QuP^8c{AC2GaQb7j@n*pS6_c$kVUkYqj0mnv$1k&;#y03h>Uuq1?ap~ zwAlb3WqiIzWww&~o5Tb<90(%{0Oh#rzcZThu5C|Uy&;ZV34Lg;ERkc}h9qLbpNce7 zSQY#fmsHIP845Z^V0;wFei>j^@_gRTw>t@PrCkAE^|BR*lCR{>JSH1B>^Z~|zf7Mhyf z+*0Xr&>og@Md}J`iw-l}pfhXbh?Z0j#8#Z9%Cp|7E9~tzrBe&%H;#n`psxuX=p~lM zix&mz$qNpNZ!phO#1^PEmVqDNl4moPlvHr&LI%d#5yDtYT{f1AxvF%z!GyHiTqE#@ zosr{f@)-fu^;xz22LM^%}RUk?I{a(gpvO>7O1F0`!iA{<*!~i|8Uh z&o=}mf`ejeh9*EJ1W}VhJ{%ie7X%lTF*%YG$?2&d-DfB;w(N=gYG>R`tLuMPOHecZ z^($BHipjw&Ajr4lla>NVO#6=epK5B^If|rfrJ6M?7AGl~{TFfw6@0$MS^h)*&w;&< zr5_%YB?QmDVOx4PJOBzCjq@Mw_HDCR1&JJj5l<=FCKk=FITz5Aigx8OZrN)|i`U3F z?ww-P1jRSIQPAC^Zpv87F=WJGWmnRWo^t##?uaEI*VA{21kC92HuPIv*R^EeCX&11r=(3iBj42ixbL075DfxMSt8? z97JA#`ds;MffjO;cNynV{Nz3vLpWN_SuAGWALznpYcSkF@@t^K16OcH%9*bY^;J{1 z>$xJq7HiRCY5-XlsG1D-*ETOoD7icNoJme0xYf(3SWd~nt?|3oNMQS?PP7CI5LO;uAEi8<4 z>GT;mn18{hsT^^1=dL(PL!wBw?fT!I?b%ylW_52@l?ZY)>SR| zsmK)Cp-|1+a3JPw=BOvwE-mUs6=zZ4-gg(W?9xArKON$>CTge*t5>u?;S;802I?m? zy9&Lh5ZuDNB?oINa<2)_lF!xRl8Q{^0{@M0qw25 z&~bE?3+OhQdTjYzxJTkKIP9{9(p^QV?~`$d(vCI$)KntnY}E9Z5V9u}`14Q6U{e5^ zSwTlW3WO2cCAqsA6Xe*6jX^NUzW@UnDqzpXz2t_zEcBF~;y66+f?Om?uN+-&Iy7c#mczh-){KS=AJwW}y^W{Ub@=|ll3-fsQa7%$la#w_@>QKZK z5LJ!KPIM$`#+x%5!F@0cm-2oPKK{LtE#M|$b{kV$MIA|6gPpKN7A;aEuVDXjf2aMG zMzoU6$B(D*rgk0$H;8Joy^MNHvB7NEwJCPbe1iFdPrH|Nr!14In>vv7dc>KkAHY69 zdJFPC4P@d)GGZx_;Lm`jKTvZ1oByxMQTol*H5r$;pmaH+pQ9XNgbW`1FZ{rWl(Ck# z5QJ?s-?8%(#$lCi_0EE}!FTcpaHbiHH@4me#;EP$ke>)-U}R@{1o%#nTAZvWvXMKV5z+)uf=%%&5@MC!D9v+8!7|0OE)gHD{ zY(8ltKGt8_m*YSAMVaIsz&*iH&EOGWk)NgWnqud%OzeE#ZrQz(n6c40$FprY*2z{g zucBp2{fjh#ZO_XW?&);#O}ESn4^g9O<4Q}lZO;!c%??vTiLnKa>V0!`%|m8@hm(8_ z-FXXHElassWFHnQSy>4QS?T>oSurvb3W`!Umz+sC*XZ(E*% ze`5@=clv1|FtwFu4NiL;tFmzpFKX0vLejZUrB{w50vYVmeX}^fDt**SJ;npA?9b~rY zkF-7)Djpe(x>NUqQl(N8D_iVN_5p6VmX(%+7HucpmeF;c1L^=K!OY$zD$ZC-=~IbT z1L3AnKlToEFutTmz+ayviB>umC<#B)Vr#ataS*rZ)GCUY+gEE~X!CS_yU*UlEF;iZ zRZBolYpc!9ZlRXXTk2iieVyE0u~L%8xubb2V{VCGm6i3Fxq-Hn6&kF4j(`54EUxdZ zCFQMTC~Lb~yB?T7pWj@+PntnaMP$~iv|P(1-$&(Gx*AdinAMCm3;xBUDem6qO+hch z2szP$%u2~$DvO(+`sYE7=+Qq#{txo~p2C%;K++gA)4zFQ2SORLmWg=|UG5Yfn+~Uf zN~5*ho$!Iq*3Yy#-&A}gU?$IjbHzjKk#p<$?68}0*Z?4X#zQD7YSryGl8Bc{ZNE$F>zfhRzYokNGmh?|U z^TjD@Ot%98P8s=%B;@JmId*t7nwruCENsG{b!m$tpoxM1vXdHq)eilx@KJjOil;ft zxWKz_EfqOhifvz^yHFObX7x~-|DNCxd1f{D++K3nSm9ElXDlczxp7D)IgCDr9lqP# z%4Ovy`LU1Jr^;=8mIk{!k4^Hj?2u8oTZ#uS`SK!rwzSVqD?2K6>BeGiqRJAxB4M87 zC>*8;kf%uUOi~zFxxF@%2;M@@9H?5p2DDyx{mSfzw{U^|mic`1Ni&tJbz$>@ij#jo zGTexXdT819zDOFQek7z1F)Mw)sKZ+VG6qg96Wd9XsEjnp1+uFuHim{4R19}}Nn@NO zzwT7;DMrhWgYA2^gKg;_qoi+N(r0n#*$FrS@9oT*8h8>;I+P2WyvP(1oWUVm{k63v z3tA0bPwmlHo3qy-_9}wi`AS_Bl#R6{v{fzXHmf@3q$Z4p2nM>knlv?*$`U!v)GUmx zdi(OmCJrFm%te}6_=7O(Rgm#Ak2GmYYGTz<{WRwO-jeUnha6YGW=3(Y=8XH;cO68@kmS8rQ^3l~>s9X(lJNtedV@XIcTyW3lMc7(?(qOB+EH)p?7GtD3m0y!|U*#wkb3 z%^+5~4-J)D=Jn{P;BqT|!j%@}Gp$eaax2RYvmH4bmH5Z$4u=`bkG#_Tz;U4YjOCR% zbg&uBBp_Ps-hm3*p;Yp(P#!116V)%ue@923l4UfS+*<^v<0zNTVTtf`=s>4Vt;Qkw zH|KgF>l#*2bA>$-rnoER*FBR`bzPfx&oEdXWcs`qBIr*3ER5-)a5L#i5 z;K+|jFW0R{W3r}14~|tC-Q<*MpsB~P#HS}_HeV<5iB)hGA;W|_2F1$N0p3X)s`dhT za~24gOiFb|%i2cw%K$EX?GoL2UY5*|cZ&2jJ2RThOHD0H>VKo7@g4)jH$2CVj5nfc zwPW-qW1(l{`%T*F7;Ln%%B8A|r}6%)y`8cFiRY!L!ZPW8Hj*+r9BB$MOm6UA;uH45 ziELb9>Vp)pij0bMypiM$L@|HEF&KOj>*k(f2c$0cMso^Rq3r*PV^R))|dBU!dvOMqtf@| zM@H_blbT{qeQ}7HN9{@;iGhhkK4O%SF9Hrp3wK9x!uJ-b+>0orBi>$S91utaM%M z^l&zDpJ)Y%Bk8K4r8Bkgxr{F{NJf)VFQ=rlMN*@E?`(IFY%FOnZ4^s?sscOgc-Qch zweRti)2iA;T`Jp)N*?%lU`8*W?()%|ILL1t*Xx)!iI}mdFYQmSJwMG1Gog3N_gqj- z2u*><0ha3RD&^|Mpc@LnX`GBs+h|%_gub8MKWZ?k?9_79QA50>pOu+jB$VD=q+Kl|#GN`Ns#9yTj!NcO= z;g94OvaMPh;mN16B z0FhlSB8Gtu)GFv0Vdz(+8hs%>d3Rn1%A2EH(hJy_tI$}Tmg4moC8U2vN_!x++NiHP zbKz24NuLSXCf;;+IGPOR9qGIzVG11~>60D~p|&G59?^$giuM-+O2=&)VXNOqmENi% zlXfcQ$crfh3e}tGOK`0U53RH*UcwQ;5Q|8|uj5;4slA}ADqpcIbTE@$?%mwVE92YH zJdaz+sk5f{mP+X&4_WZJl*=+6R$FSS`Xze1cuKL@UVAtJTX2&mtBrx8Ea_w+AlJkK zzOPYS?^>T}Nn__#?ql)B?}B@(ag2NH-CCAAw)iljb+&5WcGmVKE-yBv+#wBk+MW4S zU0r?#eztsOeRh}%uq)uiguKJ=3nae_#g{P=U6x%I-GUCUC80Rgd$WT~^AuT|US+3ba<{bc8@ z^;kP3u&uFvxjt=B|5{U9T2u#`7VO>%O;>N*W~?eA7uyCqjn~Y)Ywsb1uo(jQH6LJ+?h^r9Gj`7$(}1KSMRBJC`)*ka!+07xGNqHlSQt+bH=yS z9a|3@OdtAg6BGC2a1*t4t1AQ(nJFJnD^KS9nabm$Q)CmSQ)m;aQc3{-64O)nIzeU2 ztJXk+(~__E#^;%@cgNdnwCGBQ>yu9#e{;@Dkoo)Chq-P2`ty|+_MeaXT(&2X5VRzN%_2qFD+VO=P16a3|eD9sS751d*b)5{ce|Q56pFtmVZ*5PALTndJ zms>SkZC|S&z$);02(;OCejNteea=lBk^GDa5g{c;e)&>8WEb}3{#pZdfyC#(ex_S! z;&B+Wv#SU`=Nl$ihkP07$y#4@UaPXz_jrrpj{UzALnTB$bIACKk-rDT|JxWqlG3_2 z!_CL%e3653Io|H{Icc|%;Iw3uMa19Ay<-c!ZP*d$Il4dXY^}$6PO(0{`wt^WNxA;t z`TxJEis>yn&B24%=sZGE`b7Ml6aBUD9M;TFv^LBE6r~jNThu8@Q&9;Vvbfx5_L6cK z&Pp>^s!!qs)^Vi++mdoqum}8-@;!XG`Xy$PQwGTcO0$wzAYCOYO3}iE*BDb=Ddyen zr-tmTVaYht={{sW(@?SUX3Qv0Tys!wf|vaC|4 zvRDJ^_vl$j>Y_p|&KO$KBzf?gHS3kE1h-EGHd+8B(Hk8XqsUp>G^S1ioiqG@x^IKX zoZ*0}>afHAyZC?ZeRl`P$*4PYCA5yd5y;60GT_Q1^V#!b%UCpfhB^@#Uqe^~Q4QJq zhU@ob;Ns_$oGDD{jEo2&-N_Et{we*O3>7Qa8$pY0*Di2$c`0)7Vh;U-rOd)|In8L94O|xvZzWCW2y5pY6Mv%b< z1Kio*gcYI&-SAb?sMxx>=_#CQbEu(j!Bym>I(to$L*6#8S4d z!j@)wPmim}^_X}{ZyLdI6O!({c@`FiZXTPvp&!4x&;LugS!iCNen@BtDZiyLPkgov z{6a$CsdyrLKksh)uTLH&cd;D)sQ>+}+(d zxNGo(2M_MeitIQn4ST#)6CF3rOMicT=0(c1E#? z)zALO$-r=arRb<&G_f1ClUygBw~e5Ym(7)H$`sQ@8h)J3OqyywTOwz7#&RafNz`W= z_egF*wjr`XFW{1^!>ri|^u~`_pIKoj?pBy3IrtWCO)D$z1>QJJ1`1>>Gfzc@dk3Et zaq%q;x~_k*l^~`m<}#SCP4Ir~M|2MJfUy`8^9zyaQ%l!(Ij9%IL?Yg#i!qdH1ViW0 zyBzHJssj@iC=w4xa}8q*q zzgq@*12WQhiKtjP6y3@EF*mA$PeeH2TjF1JC%$*jPp{8=Bn0^qXDpy3ccoh&e6vo7 zW@h>8V#~{{RkEf~*pAG*IS3N_IsGkXbh`K!qoxjVKdKHkqyE{ zP!%%nIEYTA0CW4MOrvYN6*Ipxq&2DC3Cg8w{(A1C^24sd0RQ1I7<}W9T4L=?)*bYh zmV=x8NPAFbjp8rKKzLyK9`TO~g;nM@M}J4Y!JA_;jcW|nE1XOf_3=c7j~z#c#B}d{ zA=K+)K>FLiKI3Jp+}r|wME)EPf>! zKK*T*uV#8P-{aQ8Z`W=6}1Jnr8yVF-Sga3#LR-N-_XM9Zqv_q08*x8p78%T z;D_E>`#TBR?{`*e?t;#!8+)&8;JWEShDNQ`noejq(V1Jal+(tv6q`8-oh#C7Gxb=2lGThakO7XCQM7#&;1o-rC=O$Kw@YwO55H1@sDS zN^mk0KVnt$TuJs9j50U$BhBo{2%=}}%qG63om&~BX!HA~jg6QbkQU*L(i`|`;k4#| z$DQPfy6nhti;36Fn0aOQ%F$vd3o+a;X&1|`QXab)TG9hkSP(5#~T z;Z!{P9bM;F?wHS8n}cqZGv6`WgXWiD`#1gGEt>0&OIkP6I*o$@iVCQOSF4Uoth`u_ z%gO$7nLL#_C?(h=6^pw2`j2gN?pk5qLiw+d zjX3{QR7;aG%IK(hVvPy^fTaYV_(8<1OHj`GFOXDkFi`#ar<3Fz#l{X~1IU(jz(<5onCG@mK)T7dL4wz}AtXAM=lbVk(2;u&ja9sNaO zo{mM%V=TV1kuIQFc7aT%rc=lR`^63X2x4yVo+`5gcw>?VGk_D!nYEer)>)-S(KpdheSKWfCC+6)Do+($}(8X11 zvlh{Va$HWdF?y-q5nxv<+u&}eJ`QO&mA2DVF}?nk8U}cIS3YfwDZmtM>!~P0%W=O_ z>Qv&23?ZPHHKI%H_8j7zHN<^h?*$WwqOt6U_xpqqyGs?vsaa?3TasL9DX~x|p*~+( znH@>f-KuXBRNdA?8w;U??%jn`n?;CBANHB5L(~Gza!ybjD9oY_nv0J$)m9I$S!pJA zDA2b>n-s{@atTU7NX!T|FdpB@#;pF6uA=N1G>tGyf@F8S+#OOr$wnpLImUA24Eeq5 z!FFctFi5mBLI&pxCJR-pWcCQ3^|c6VR@sDIR=S6lz?a_2wD4M*50DFV#3+_p8e<*2 z_~otEu$?N-G^z<)&Rl?{VnACKQA>wW&mV`|)O(=3ZWP0Y$wcAIwsX60l2Be}PnWNS zMX8-^Pc8B!*w58rDP&|PH=DloWmsP^Pt)cky+x<%4#FCjXoCOTga6El$fZ_(c`FmP zp4XUwX^&z`78MhqAzw4CK^MK!?Z5-#DR77*wyd!-`R$2RI(v}O@alWy;1;Vx)k*QA z-w~)s($1nN^{so^`h0N=FloV3zHaR<|NAj`wKMxF zncSxy4~J}W_V<1hb`g9}tk>gkq_Jd4kKE2d> zCvO~dYyqSLqZeu8)k7&9yhe0(nJk&C-^4&gEH8u}dM+AFlQL&EYtrUdY5z!)pz&QM z3`Pla1osLSn`<%6H1>GfJ(+KbzWoObS@oBoPJ2@ixePG7vZBqtRlE8)?NGYG2@VIW zGQ_Qtp~0hxfMVTm69uxUqAsP+4vV5pLc+KY#J=u87w4WZ4l5l zctWd!hK2B!2xp1coeS{cJ-I95;ZUiv8y;@pZ zF;8-$%mZ!|D}m&9H8yOC{Cl@aljQ? ztA-Z{i(U^(-g9~7d3GogS^L8>$`6!*!qJaYOxn6n3{Fhz8*st9XimU7clkRM?Jc7| z6fhERG9z7Ffx(_sTLE5{9xz(n4PoP2?N3MIO+IN@x40ie#kn)(`ApA&HRwLtNmX8A z(j5&tb$gZ`jTl>F3avk)ouj>^)JBuCH%_ocV4W8adwkiF_mEdM+HWUnug&s(Wfsj^|hX47_-MedPQK9J5K&#Y3AIw zWa#oKb8>p#yP?>B!(QzSdjU%4ogd9pBBxJ?>ofiqq;6zku_HMmwflWlbJS8-Rkt3k zyz2e;B@DFpu$?}`6%@&`Y<+TEAf6Fc(4BFzG$#z|Ut5^vrF46EY--syawX(o=X`AX zCEj12N}{UiSTSRB!s*^LTlF#(`O%E*e*cKht^<5|4Vx%W9gw~K zu{GzeA8cO|G`7Ym9nh5ZIxE=!i~hx$rmeP4;Vd*CXTSnlLE7&ph_PJGHmd^84<#{5 zoG?w&a129s34Fu)w+)6rjV)?PkkHEs-OK4(6BHxR_B8F|R8aIufyVs7N@@_%i0c)A z{(s_Z%oQg99E1l(kp1~3FdFecc>-RFhADm!!*>ZO7(cK_b@Lpz!s4~SfBGCblImTQ z{J@fwthf68T-)U5#$i33*ERP53uRpw-7)u2Utip9^PbYeO(5fQKTB^;-QX_5v2ngX|TYg2Z+fl0BIW$ejZ|7d$}gf75u4i^X? zuoqq%)9=h5QWy3g@Q@M^I7=1^#*uwxj%i4c1?N>Gz=pZz@JJ4zPL6BAf}G=-SC10P*R0q!G^*6 za1)dr_YJc~8L+AQM%rkpIprupB`^%cMqVgd8_21T0sCoAdw5zxXsLBU`&mZMNT4?g zE&mCUJq{y$v{Y>)ZOGIGBWp-Gb}ff5;BzBhlvJPo8x4>EWGY&~zB0%cks%KV15Pq} zCeX_L0&aXm&)x3rvlXGnVQB1YfM&4mZ$M#~G-}8Gw<9lH>TCav1IQP^&lXfD&v5eV|c0A%o)=Fmup8h0!yXRu6otW57N>$T!a28JT|)e_3CT z$wyFgm}Ki@MYo*^q=%MjYIF<>UN`bW(jxf+{%0^~tz1a(Qs0fG(X%e-4Zt7_ivV*O z*!%p1{8OC?2-O?(czga9bJa@mMyYiH4Yn0IfY9>)!a({3Ow)e@gaN%VY4xC__QHYV zp3tyuK9nLQKBgn7-gt-DJ}4wn#8$DUR6b4M!D=7|NH77&4i0P#qU847Te%MK>;QePiD2DHSb1QhI*4l7su)tKg{ss~TpMDo8t<}Ccxc@wa3hE+dAcX>B8a+d5`I9nC2kdtmJ+lf= zoQl#08crj^HbbDbN`d_}>Buur_E7E;W1rs6C7t29k#ZV}R@+zz(1_=v4kb7hx?S z=>K972INc3uxZ?(&Dj_`Y0d=#_y6bOAS#FL6~ew7A&|hA)Vjd^zedmBL2v1kJB7>S zOew?=tub3Ip{KCmnE&=U?Z5H(Um!q$9Rv5PjGno)K2RAxCvvyc&t!yhfqsFw%Z|77 zD``&_57>iyI)i&Gm#|=7kVMa(BNX^wOyC{)p)mX_O7iTxvHuqq!i7I>41Ww>J<=sU zmtp_QGOU_6QY`T|QtW?m0R{H^|E;ZRtw*mF8?cY3bpa{2CwCEL^vt7`3k~M(yGi@!CLh5%bF{0mvl?G?pZGdc zv}@uszc-fuoQstDFFVAIo;g9jFbqJ*)XRWWY?>dCL?VfBsj7CFX`io9wMS+ZF!durI9E@hnX1xc6Dz z6(wBuM)N^IwMeqRH0J-kXt;NIxv+5Y^xF;o;$QV&u5s)suDOsz&c;pkGaMQxK96nWnXtM$wfVGs?6TR?ril4Brn~ znkgHOYN^MasJN~BA?7($#T-8GyQ}SBIBRncQol)+_43p<=_*v-qC&12)$oJE3YWjA z&sibM;(s}0rHc4yQ0VDtJiY_Jo~`^@)d_h|lA5-{A30DzXUT?uJ;k%vhx1F0n}ho?gyqohc7L?&IG1`AUdgn7m1Mq8khL4%uK5ktWl&j>HA{j!(uJ_L<1TxtNvY{ z>EF8~zE`3s&e@SuQ;4_y!6Y$=8_H^K`m=rQfnQGOu)a!0jJLoYt7RumiSQTD{&2SC zP-%>e3=9-M+>)4IDi@ctw8<(5N2IvU^X#DR@LcrabLV6)vm=fJAv@@$s{?lM>t~=H z+uTM6Di$c;-u!9bK1j%_%sF3h-yC;KS-P`fbpARNic~ zH3<7&fY^PMj{?rXn;?kN<5KHucny8(AoYHD4MvRq0v$u4kmfw>0dG|OF|z2H5_jG( z=k!G=(KBJ%#VoPkTJ)jysUfU4y&7@@KksUzcJWBCqfOOZzc?Iwuf&!9pwv&rw*Hq-#cRUnnZd+ z_{pwa%&YJC#J!cr%BHN{tGP}n4bV6R=iP8qf&mh>8jl0wXzN~EeG1&?CC%!S+=;kh z&x`<%vR4yzf{CX(rx6{f4vIGaE+yn?meyS15LrcT(QB_gM znC9*UiQn?2F2I!a*DW@jl+$ErS|MVG(vjaY(l;v+Y4G`<;6rApQLP(?>hxEZ%x}?{ zCmysUR8V0u>Z*vo7OnRi1^pTngfy%%oqt&@T`Vo}Czm>_8T#{C*2at$Qu+GX>*>*` zoEmQqWJu}ePX(;}ij-KzZBS3843#!b=iHE|H9irj8s@os%LQ(-}*~NeSO< z_Z&|5_D;PdoxXI9-Oqk}U2E)0TYAm5y?{y2&DE{IPzXFXeMd6;!HxUFn8=-n1p+_d zYZyhokV2R-n-)zZCJ_D*kIKUsWi?UbGl&xJW=nv08jNR=RAnlM7@&&_~6E!NPHM6=8L? z7OJ+ETo-E_Rs(Yzw#snucd0G63Z@Pt$f}_*Hn!??@e88)GT|4G9}?XVSAaseMHdKN zAct1-&n|dYr3g|nhywHw2(bXGK^&G!5w)8X>jGI(HHfbifCls@=mU4Nbh=PpTtsZB zBbO4pv(TIR)_x7)zM(fxbSGs(61?Gu#&2HYX~?@0)zQ{)uG z7)_Q9>AWH({c5n&X@^Kg{GMpGXjcp8K!$nCdPQX(^c{pgWV%VIrsQoiv>#Aev>gm& zEi>i4c9uw@0`(9OU6fSL^_&Gg7xck4!LniHSgbvx5lfWNEb^5=DLllGsl1Fqf(;Yt z{OB1@gzLT(E6VgR@*v8IcuAJvYxv$_e1b~#0CtmnGAIMclQSaFY}9A{U!Vj5kN~~Z zI1yJA1trWH!}}!;1gmd@9JU?wNnmTm63Z3M`3Y%f1w`Y*ijc-P*)h(9Ue5m-oFFv= zYi>e`(Do&Og0h|x1CdwE3u?5$I9@y{$eIIb6v0drKF~t+Z~i0z*LMU07wVwAqJp>h zm}75mFGRcjNFr)HFQQ0A%LEz&=v=Q3I)fctz{^Kg7Er+o257{<$)#=S{QVUzt%dzN zKIi9JIwdQ&RIz1bKy>&K^ejUkYXT|&zFV3_PYMb-2649B&59$HQ>10rZZBZ_jK_n6 zO&*h%5>|!-vApUTA=Lh`ENrpjeN61f4)vqyLu^nYe2Ub`G8!tiqWfqX&=l^=y?AHn zyOS^P31FB&c{)C%(%%DW;@C_I0*Tlh8q`;goK8Kdx<`9(vUgJ4QQA>RX3TER9xB%_ zwe9R8stDsnPlI6gk1ueby+Y(e_-m42d6ft`t5GNSgmVRORt-BKy{#TF*p`lLlGw+G zj##NkfL|!nmp-9{M0z|0gdN}rKKbJ7%)zpr&sP{6U6X*MvBy9$!FOchYJO&RCgG_M zQTv4=KgpO6Hp-lPHfMRVfpjVh4;OCE3^)0dP1~(Oq8`QRSD!S4R38c_+&FxP^Dgit z8;lK$Q~v|+iL8>cul}bShWrSGa)^_R8(yj0Nve23Kh}Y{0Vll-kleIvc3ae+Cv#4U z2XDssetRJx)cCs!`kb>wr!PltfD>dP(%4k3VH*chwdOX22=Z2l?DIZ?JKhzj7DRz7 zB9Lk3x@GwL5P8cw+n+DGD5~{9IDiCZxZu0X5zTy&sXR4)VUly3@fv17i8J0q@ihx^ zs35;`Z~owbm6kOg@bQcXuVx<(Y=b^WnSd57^ulsCJNE7F3q{$V(3wN%V~DF;=!>AB zJPNbPBIN*d(=8ea;fbSAK70)%1;lH4?3Jgl8gVj^h-CQ?JSuST5x>8bi3El+(UhI< zC38UkK-)zk1B74Cb^xHhzmQ_dz(sr)=t;U78TI`^|Md=v2xu0)^>yOwFXtaxQqJ*; z!ABg_gCWBv8I#7YzFvg=Q*i5VGqfx@d_VN{{ao`irw=vJW=bGLi6gh3!~}kwA$>am zP->Z?5UfMrN1s-*GccHZ>m8jK_}FlnNy9i$`V-UXGDaC3glF3nw#1q`Tt&8tH+I~ zLYaKI2ud%a%hIBYc%*2F>MX-(En;yiMmq}&BCX(Rd`ct7#h!m1@I8eR-=7HsjnzkP zG5W9(gn?-NhwM%)!F{`d%WT)Y{bh1#Fs#5}(py7@Vo7qqdnMhPQ z8DZOFiAvz;ayP{F&jEfYQ7zulOs4+RpJAC;vVc0YYHWT)&K6{}zzy<<_Fr_7xfsC? z)-n{}=Dru47^slo4IGh6@fUHcT<8YGQ5E^CP+(?WuZfd|NU8O&W|3LVSzMyb;%{&H zUu`8%^S=tcFD=mpMT;y`!X8CN!p}TGK!ux1|AdLBKu6n+FcK0#g$JrgsI>v;3^{Nx zSh>VUNhHJ4%`ko`!uin_nn+a$q(flJK;m`Na1SPkvPwwfK3CK+2cg#|ek<^e{`NG> z2Llu%zY)g(3}sS4MitB#{1OeuM<$eRTl+dn(6AK>X(%B&oM(BCv?rQ|;eZhanhb&( z6(@o_<35NXPeHX!QEZN|CVI#viv}2?%p+(Z4RVQn)lPzF<|DaPqArG|g;0)zV|V(p z!8=GMYBj7wlTR0m+bo4(lm7G%l7tAdI|(S!fHh4EpOsz?qw&xxX*rALQ6c{ibDkO_ zU|wDYiB3A#s0}&fFZo+C_{!4At&f}OD~EuVnuaz71Al?}t8}k9EW^n1=ntsH`O!WA z)LALRIEe+CFOA!oyGCNQ+-yj!@%iOM%Dd$dF@;{#4`U~f z__Ogx(O=81_RX@T{w{M|j6qnMYV-^rt@(Q}X|e*gF`nRY4U?lr`gyXe5z==;RS5@L zLZV4Iv9qpVLdbF%m*qvIIk*(M&;o&!QMcC?VDh3FM9EaXCCAAd?CpN#s(}?YcucB9 z^D%?KFUC~^P|G$Eh_VIaK$M@JPtDk*65ej_N)cF%E=sQc)pek_q6ZhC$>+?hdf10UU1z zOV4Fwd@y?irndedw91*@aouy^hoDaV)ab1$|BQ=uBw?*$zR6*dUqWQ7bK$eDA3ATY zUHA~qo2%K@rWx7z1SQ;`8C(Gg6xOd$e5S8PI)$d({ALdb^+cbFI{XfGLR)k-`IpDo z*2!eoanKBNR1+;Pk1KUDQhGT}MkfEY8dl&;kjNf_42>AIXqPEfh}(Fbn~($WDBwmm*@As;!% za20`G3ZT3rPxX5?iqqX3)s-*V=Dq7R&)E$*Hf^Uj4NL0c8NYTF*ZvkidA-p2wT;re zDR0tLwEyD0e$cd0{6TMBt7xAZi!D5yexncvdVesG zo59HDeDlWgo|LF3P-Zldh1Rf!&ir~SjkT37L5?4Wz#eZMaq2|ePo?|059P275tsn{ ztX#@Leceh$0K8kj~Y$4M<}OC}xgEuyjFL~GXR zAzrt1AhnHqs$Z&9hoB6&(15PFdW=FeTd9lD z>7jFxRAY!#iQqMfOb5kG$^+yAREF)UZG!R_K8bxlFlUISkOcp}&2uU+3k^yin|qyB zRYEm32`B+Ky=spN7~d}pw!87miU5n{+Td(8uYLvcmo4!EGL*0R*=sBjC=#UTC6`^seOP0FZ zsfuv@0&CS^DTNsnzT8=lykws9(WT-6W!3%Sw(ulxUlZ7E26d%z3u##Ahxdg)LoWhI9|HhWB&vT=V>P|F1EYwiz}Ls^q>|0%DP_nxohI2=m7#r ztfF|02A{+nV%kcN5*q142r>*(ExlNlK{hzI_YIOQh#CA^Ej4E5yLIko)~Cy=cNEsG zhTrA!SLIXedqnU5QvKB9I*1vGjZwFFk&D&nYHtZV06g~btLzf1_;6A?&5Hd*R*zk| zl3=<`y5Ga}RZn+8>w%=%Z}ikJ1ca4t49b#y?bY=9)e zy+e+aBv-4;z*&@~rs7I!>(r(1&)l>6$Rt&mBF*>ub)LI5quc7gv^t!k`@EI9QgB

    fkD-4j%fjIKScf|-mXJpzW}+1r>i63a(2W`+P-mJ$JZppiAl$t z%?gWr!-Em)*Zf6%Ud!lnb4bTr)7)<|z$8;u5SSi+l_%1G%4TqsevnRX>^u@ z2a!CRMphq6sLPdQ?_d|LMbP+9H+9CAS-bl*HKn(S{fs*J#1lSg6#zQTD2-ZI8hmcS zf2R2A1bZsJq!ZN1Y+7hyjbV8%xh=*#9&BoY?Xv7ip@XXU}B(8QTBFMY7_*my$kEvp8gz+4ngP}ail%JlM{FV{`=;*P8>^0^flq< zwxSzR2PQV@s>Kf@R+nw69huql?}CSWgo+p5hD(?>*F#=9?+;ZGxZ@;}5P#==1Hi(k z<5;XxRTA2MrkK#igs05n6M#>dz=N=ZB>9!FtvhtHwu#O8>6!V#`5$pAB;;^rC1;<_fi+YqsxPl>AlW#q*vlp9o-gW1u+4$%n7nFnkg4#mIUIFAB07~ z;Gn)y4g{h>qBdY`_dS!s;l;uO*(Lsw>3z2)f_&fG(E8!D8phu|(0O?`4kO5jKHt}FKDKUufT2cOc}`dbd|13TZFu8;TFH&v=)Q_J9TomsQ1_%D?+ zzux`&d|d}pf5%{0Wc1pwTy&)a+i06~hpTki`Xbo3O6F`gho=V8%+X)hSaYUD5ge!} z3EdXrPi8nZak86U)Y{Sv+{%)exr2JovpQ^l z*K5Qr_YA+%D_{vwZ1C$%CZCX0$~|gJS4iLTDYgTjdrsfu*LUl*lUzR95nBPEjr8yWT$V`qdtY6nxcs0J`ycWSihy*yLqk+jqPV8flq4f0}|w% zD`|i@ag24Yq_1 z3x&f)w`c$!SxU_7zTSQmW|!=^ucNnq`fzuXHk!*H!d~kE$XDEbwBWVcS=3<(X?^jw zy?gkyHoGU^K6(2-lP@2KTJdf7!u>j?(CEORs*B#0l9&(}E*?28JPM1{fuupo>T#)= zlTQIVXJ;TPJP*g$Es=kp>Y9{KIJ8A3ZXK*|l$yiqcjMtvw;ZVa(F;h&23uYY(Pjnm zPMr-2N}4_nBr1X(3DlrA=KwXAzc*wIBOYzNG3bOKD&xF5536gk*5Gw;8V84^Pad#{ z;3_Ih@hDH5S^e$j=bMh9xrygY2a{>tbrFpRjnLWqaevsY;$zngV2V1v&ujL~JA<`5n%&oSUJ3r#cR2tJ(rv3^ zaMyHuop!`)G|{6kgJat55!g!aeMQsex#*t`F*DRtL@jzhvSLN%YjvYl?ukJv7mEjem_=bDk&0)3S0}){`@p@ALbdP1Ih}u0HS< z1)x@jdXBZZ*cB3UlkJFacj8Az-l>-KT*TQ4bx7`>3q*~fc(-6V}O*cPV_64oLVj>rrxMkf_&MFEH@%t0_6JSX_?o1EQ}~45UrRi zDLo;A@ksW|XHbl7AlQ%GgkOLNRfFZZY?%Nw4n)yfiDc;=)%uL!lmZtG0QjBZcm~xb z(@PL117?8ZK|%_>SU$i^gQtg3tslA+-pmsDPv>}23=4*mn_FmOFd2-ErYSKO+)^;M z7JnY%ypQud`iwur!nC|?%(ql1ptAh^_qss}!Atg?<;@z{|400yK}HhYtIA*Nl#yBf7rJxd)MaH7>o*V1KlgIw~^Q$TkT&)|E?bv zewy@E_N-NN`>tg?>>vobo8NVPHiGcZj7;6AVV0ZKYwz_`IUuL(%TIocS6ycMyE(-j zt?*iQUATL#TiHD24fb%r{oKPl@cVOAcPiDb`a6v|CAaYL>1Td?8t3-@B@F)kCC=;L zUL9$nwxKXAg^urhof`TV9eJBD{f#H}A*YiMt?7K12GEK?->hq1$Jr05BjsGV=eM3{ z$cp1yHaMP>`*??il`}})Lo3e4lQ4?!sC9;Q&y$?`-AAu#j8kRe@7QE%rIt-S+Jr@K z56#bkT0_U;ak9;+b?4tcxInuoF}L2K>emo+;_3BO?OyijpSiS;E(bp+s<$QP!_BzMfDjGl$s>71nu#C zursBv#fdMe57vuBCJOtRCUuK&m{1pAzhI=zthmMlSK7UaatwQ#Y#;JA8?(4`i{8_6 z1$E!%I2M)aGx|acYM3|H>oW3kHt#FeT;j8zGmeYCk(zrt8;;(7A33@={gd&KurmBh z(s7e?^B}8CZsG)wbFB78Q>yJFLC9uA$7 z8NFTg(K|+D-&-w!Ii*6W;y_@%o#0N#ikQd3{z86+x>w7HjL76bw6vM83?TmaphHHjPc*SjvurO z1J}Qc+nYN-4^i^^)G04b@LSqlRa4;no>EXMj*GRpv9Rkc_-SAZ{(IO+!C&pcf<3VW z+|+NKoqW5wUW(#cS*mRnq=~S!>0Rmk8RQoK@)R7H#B|a7=cs@FyvK92`gt&42Rsma zX&FIlocB)Zwmn^1mt(^A{8%nJ^e!IP4qWB6M}hL$q@v72ZA|FD6ds;Gdy6r+ng2Oa z)@tbA%O|{S{&Infdfu#`7X6+AZrgUQe(GGY4v)fJ_{`OPs%Aynyr*PZ>|4CJd(TZl zaAn};)^%G~&aKS!FSg3u4G2;Q8z5$;B(q0vtoUxdK*F?PWoSH|J}@sxv{GrVfP1C& z*)eG&$wFa|yh35COLq4O@#dpynzWUQ4b8^F&e>X{3>5+SpUTzBs|Ka}EnOYT z^goR!tzY6FUpOx-FB`MGxr3#f73)`ab}nu%At4k*S2q`PV|x_DpV{ZW2u7-sAD>;1 zi5%A6#khZl#Y6U3KWgOnyB z-7Cm`R~Y6lk0lrZ4Si8bn3SS-KMQJA#G{Lj-gWoSPvB&i|HdIZ`)0;t&gDdxj5Tcn zJlSlUb%ec?@-x<4+*j9qmSm}k>e2BGR@cT{fHmuldM#|3qvV|?DLPwIEWj(zw!l!3 z<$b>-BzYLKkg@i9foo!dfnR6 zbcJ|e0gw{e%Npw@_>|x+DynKAPyB;eY)-=`OK+-bv&Vy-Ofe;Xa1Qp+#Bi?QgYD!T zq)8~?e;92^pwVx*y0LL&cSR(dF(WZ*LQ1yX`kblrw!WEks$5t0&|?wjXm&%dgwD38 zBt56Yr&9P@`xYa2#((f#iANrJK01Cxm?bX%4QMeD^crjEx?^z;=||q+O^%s6qv&%q zNOmlyFnMj;0d7LlQu0&LqGMzg5^(`&W}2ChYnxF7dBfz&B^6dAXkaqV+Bz;B6oRp) z#%+tGsJ(;j=JCz6i$*j3B$k2$?yn9p*owr|f5pTHQmuu9+8gvFi<^BmrB0!A*okS+ zfjP^88_>jx{$fFX4@&iDC7;|F2hH20c8@#4f75;-mi)n7TnR1PHxytre80RuB9;5u zDSYGldi6*>c(;-FH~im}&!!MThEMydf9ij7l694_^Ec0eS@NUG7vX=G{=Xal8-b1k zhp*-TEqr;ToM;9fA3l&Ji_!j{91DM?6-9>sXjzus%Qq9A1u);dM<7t~l}oclM1O@b zgLO`_@cP}Cm`k!qo>-i#%ydsgE#dNTcC-?x5zMinbO`$zC%FElLY9ew?_UiW5#PJ# zVtiU~@AgBh{|W8=@#TD^?Z=eXRq=Cz%O9naeP9}}meZ{(F;k(5N5DU}NsvT2%d}JOEao-$ zI8skyMCEjfKgO50{a1iT$yQNeRe(dapr8SzlA?q4%|L6(K#dds-5u{Y5@TrYRkYh2 zxk_IsfNRoB`7atKk0bBTt$7SfkVKjVpL}_-_!$c3NhtLd3W@$$HzVgzUB&)_vW20F;;ZItrhOrGLE>W5ugr}D^;9)JbxHO9x=?qSz!n=$ z3gTHyL+dB8Zh{|SYU-UQ-}nX3Q^%6L)+|<_TE+lemQK}@#1xH2m(>GbPpt9A&jJ~u zm;sI%gD5}p=XlHOK#kP>7J*L#5EVcd7+si#NNUyI`ND_Fu{F`vw33OQ(7lJVQ@oN) z?!83iLD6^kJNm(5WLlfnPFqM?bqnrA%NQH(GFUs*kZI$3A0oF@hSI((zn^+^KIFEc z^*I)d(Z{2|=k6-?x#&^(bie(Ga&DB*3_!#zjWR!uR?N&_rD8|7_$fORRH+Jl5tWjm zXDCodwAaxxQFJf9xzp5RgY%m!g}L*4VJpaAqWQ=sb&t_i4G*i5%pLP15-3r%pXoPp z6h14HH%0el(K$MHOO2qTLgB|XXX`MQbi+xShoDtI$B7#5NRWK&rA^pMg448E zG%R7;f|23>QkWv(4j=%!=(a7Ew&L5NyA(&q&lM^r+lAJMk`s~_OOLGu3W2qq)8-eA zK^d)}-0|R4dr+~teYg2lcIN#t{PZqVod9ppIPU`rI`n%ZKLhn_hfx;mF(cY4P_T>q;AC~o|7;K%TWKI_xbHt+d)}k%Aq^7 zfm~@xFQRnkP4-%=YH3jX>Td8!6Ky%@% zr^I$}S&+qpE?hty;Y(Hi5TS42SrXeZ<2s77kEc6dZg$;ozK_k4hK{u*^rrJBwpufTs22j@ z8hC=OmC^uo5|m@iaU&=RICa$u<|mymnia<$s|wnpfVQ@0vq&K3t`&TymO3XuI zM@NZY=Gj)&Wp$FKptzhaj_6ncNaqpyf~vzW;KX?$giBO!lDYfu6S^SfUq$bCL47cb z(Qfa@B?;AS-TI`@zfpd6-6eESAntSE3exns_1E8*;>`a3nM)t?-dTDw*}*f4mwY3VH( ztSJgNb!7L0VDhl6nsVo;9zsKgf@6=IAni+RQpABZ1L5iw6SIqvDx^aqLl6xTJ3%khjldKm!rUnbY$9Ff z05%bwB_e){`BDrniTP3ul9Bab?I4i};qK%E;6k3{BYNSlD*$=$*YyA(&JG2c5Y`S5 zifjYdq!;iSvP?gi7xGgnLKyKHj?ABVuv4syV(_n67u8^v*cti`3Yh`!4kwub_6|0g z2U5LUL|W)m4uBcqx)8t&f87O`M!2p9@P{sw4YG^b;hJOtl#s5I0ZNG1A%Hlfdi4lK zF*k&3T{14DdYOnAF*`t^Y6L17q!_RocSo6w1bv5FOn_lfTuk8GAe7h|^Pr#D8vUT4 z*c#&?AK4<}wJq5N)($F}1FlI7pcTQn3eXDg+z8-Ca4rIH!#j5aszTcoBWy#ps3bZ8 znn?935!hmHDiQl)dQ^icVtQnQY-CKhJO2i3lL~-bh!(>jIT;S(Hg2ILFv5Z?GsFt3 zP!zrnfE3au9pO!O5>k#`C~M{i^*dbYDLJ1VZj??k{d?+5{t$qSBh{Ji^evI1{8(j zQAyMSc*V?+SXCkz$k@1nKa^QCKB%0*U}p#PHL7RXy;`vg^|fOJPi$+*MJPlD|G)<3 z6+xuO`+(?I>@$f$eFyPVb1VHwAHuJgm=|1qaNlmsb1s6$nVxT^f^w4?Z&aS=6g_3# zL_2(G6<6i1i{-A9@7pe6tp3W)-ugac>@kb__jEzqAk5?5n9NrLEgq>oxMw^6InXfV zFw04EU$RA`U7JqYS_M&sU_U7NCAwpLH9AvPDXeoYMOpuNqM~x5a=b3_@K8@HgYEE` zx506$hxg_zdVKs%)>=bK(%e6^sYXl(+%wKTPAA81q48oNtIb~0OqEzCv8qANnIheS zQNdGG?&2b4yk88A4wBVPTU)k{VA>$}*@wyDr5$B9dd{_XnS>RWxUPx=GyXrS-YK}U z=a1KpZ9Bi%wr$(CZR{8m+nCsz*v`b-vF&8f#6I)Ccu$?T)>U^`eXFawFV^b*tmkpv zpf>3x3vgtsVYwwr*59ULD6m16AF6~=RzDjw`)^qG@&Gt{0abaFpXi0s6qe}zR=Dhw z-+$s6v23Qi=b8IU)WqZM$1<6+iThjF@>xELJOAJXhce*cfv!>oz#BAkF`qAd_&`>P z%GBZ$&kv@EO~!1o!u9FYI@`vNsTc>cmj`OeipZ`mM!_qa8BnXuqkeF3ig?9rXH z+?W3qy)2Y}d)k_~tgr0j_Qq8yz_&AW;jQezyEA^Ft=!?-owKZz?|keDS$V}*f9gqG z>A+Wi_`smN=4yYZm=DpNyDYEF!26lH?5?ci)}6Y{!fP}Hs7_dBSI+Y2j$ba%&vfsO zSjJF}<6}B(P1azb5vjycp3P@IJw5`CR;Oq{(y&xQ=QAH_&Q~XDFjW#LlPEhYGb^v; z=jYe(&YpRaRr=+hx_5^x6Dgx8Kg|Va6yNjBo@!3o;Z!0hpX5*RX1M20UI;34@G6~g zCM*Y;MH(1@N=fBUUMklgXIK+-nHoqmn3cB5 zYWd`RQl8Q(kobI&9_+459tcNeM`b5v2W76Qd~*3Q^{|SI$oXK2kP{)LgU^FLgB^qD z`>Y^j5ElsB748M&1>%K>7mf%_81f4u5FrpE5a|Q|1?~my1kGa;Dn*bqBINWdIcC@tB^_HNf1e31F?)s zes~{fp#MN%t|G3at}GytL7~B&L4H#vR{$=^VPAP4rC7n(t~ORtsY|GY&I;L;(3Qaz z(Urp$)0M&%(p9L5pcAEYb-l0!;RV}NJ~MFAX|kmeU;yA_pcApPPEAeC&d4sRs#7v7 zqTRxnr5l^hprLxQ35ubtr~Xy9+&%0+RSEr2jtf$jho+uG&PZsBJ9|k6C)_DqkuLm4(Bjha;*yt|L+Ppv-BoE}Vro&MKb5^px_KPG zje2w2*xu%neOr5LYc_FeTlvb~65x<#_4|YJa~tKu0YiKbBRv~K#2Rw=&ZX^5tWOJ# zY3R6;Ph?vC2#4YOkA_%M-F^TPelnQ&wmRy<|8@YlOz2(cU5HC4#h}?f;l9H@!#)~_ z3Iq+}b4B9?3xxTAe!+Tydck|)0HK4(K;R(ZCen4-Yv?biUf2)x7f28wVBct;c;9KC zX(ISOA1J=?zUaQ-z9haVzBudf*IxXCU2@DAY2^0y~E$l7iE%Yt;EzByoL#PR) z4}=d`2c$#DR)|3;z#t?qG%tiOlrZEfbY<|LN@tM1n7ETb7rqV*)YsHX)QK?YGrWX7 z$iDBs&%VC|;ctS#2#y082Nt+S_Zo^*jBg7;5DGJh$Oy&^aT&^Aj8g?J7((a@z7m32 z1#t?A3vnOPH3%I7*#vn8`72c36h{>$9lU%{abM6B#+8{BfK3ZS4GtZG{2P`U;wV(m zl!z4v4>BG`8oWysB^fy$swG76@XOEpR)m2s*ctY#F}ANmzg{jPnYEFb@E;8aW5 zUKY`grX%@%GB4G5YK-5OYyqL&uE2@SX9hN1aXQ zQ|)b1_t_-|Ai#68Bj7LtvRAn$U($2!f#||`_0xIYbvE&~OGr{@nWOhiVMF?%1a?*( zBd+DHm22~46Sl3<%y8rabNKcRb~`r|Z-$0s^niR&A#lITl4Qu3{PDL@yzk4TcuRz# zcxLLfEQKCafBr|9pHu+u{hH+24VdxU}vAsJo;1yd>s)1_l=RbeW8G^1cCSw;t zAn~vAAVwLMR;hp@?zJ>RHj0iEu48X^SiOV~WZJIS?f4~wfayER0qe}l%)M8gn>%s` zwho`PfZu)De_$s^vTcmLTaI~-(OU{Vi$6%T|Kj;!t_3eCC8iu5Bf7&~Q5ycpNNv`q zmgfLH0YJ(8IOSb2`V@9lN-;W!_ZIkeBXAe%%oc3A3g@;KpX=$)aj z0K(ql;GGyY)$gvm?~$pOmpLNh`o6}Fujp}rO5>~qo>PctDzYWThGKABibzzm4|xat z8+iQJPg6+}DJ3wqgZ8}a$MB%b)grYmsrJ+fz$E6e+;tgq3-pg&sSOQF8`gP`tx1%0 zL4`t!`LwJ_X2}nyD%{_9za5Uf{=!TTDD2V{rIlK;yyD%1NKTI_{@VP7e~l*+eZ@Ui zaE~DxA|jqJB%YWnzfTX%xl9tukJ^}eKf68#D0H99kay|(>wVoy`sm&nAiaM}Tb0DC z0UiTmS9r1vw~QhW;dW#T)B-f$q1o(Z(p>BHc6U4^{Ux5s*v=2R;Duy&1s<5hke}Ag1e|m`2I#FJ@vA%f4Hk*)P&Y3Wwcj(|BXQ z{8K4UHWdl@{&J_;>3(xfb{k}b*<$ax0bGbGx}@kSUunKP&3T+*E$&-TI5^x@Un2b7&>QOm?i>6 z7~!X=7`$)O!{V#FqNeMXp;-7=3Kk8Ps&~dtPptJk&{{R)QfqX}wt1x%XM#?{ zFyBv|Q}_pR-gg6*25(VYPmg@2lZt3d23U#`oTYzh{r!({dGI$}-!2{rF@Ug?R&vR% zwDjn(Ew`+Ra>Kew%IC4y;)>KMd4%(aFr#=S$N0FUG*(13Ayq8i#d=u7F}n@M{rF-! zAtu9#(kLj^`}BCxj5;SQtl@{{P119gr*w2zprd@Yxmpzc4=QFJW;aK}2I~il$?@2& zEN>+srLb)PMKX`~bdP*yI-uiq)Mtr@#mj}SU&rA#ao{`n%>>DEY2m)Bh4}ry!m`vZ zParY6^xOP|zlV5M>ky6v%mqc8oQ%@Rcnj!9`pBkwDu7i)gcMOgg}tv0FhBR{2fXLi z%}Gu4?<(LvX~NCa9bg^XoDHvZ(@pK-`^2ztw_ud;;_sH97=NCg1>kdVTmMFz{?AC_ z4|ZOz^xU*Apwjtrq+vs+uxPid*ncU(YPEaYVNL#ht8lDe?<}E`5s-I zJ51P64Z!kCKJ02c-oGf1*BWUX^;i5q!GpVQ{K;6G{zU1Mz}+fz`VaN# zbh}^DFzJv6IGTMAA6jv5Nd-cGM%6DjA|q&J4svoB%L<+1lP2W0pgT%ZQ-{+qVJXK3 z$S&S8@VhBXXVFMDN*R=bGrE0Qzef##3fC~p1_C~ZvnkPQumCS$Hjw2DnZ*ffPG8Dz z#4AO}*oaOpcxC#d{nVhSwBgqZ3sqt1LMIIpJbz(sGCzR_D?#J@(6V(8O`<0<;YK!F zxA|MwMe5_IpUXf!QRjqyb`DkpfS13)K& z%<0#pyY6>O41k%=+{4mQMYmcqdz}^UrsvC`U5l=wv|+7gHAj*!YIAMu*V+O}G6v-X&o)NO>ua->N->P&uOunyXz1&iuEwAs zt%sYS5F6stbKd%26`ybA0^)rH?nPlig#;g8!1<4nYEOFx1E@#A*VZUcEHgW|Ox~M? zRzPdBK9!D~0+4=-#s`q^Ycz2C`Ks>x+(15=?`Z^>G~E7dQE#zzcph20uCMRd-F++L z?0G+^%-WScqGtdfn>{3urvBS$U#60xR;J>_%l-)Cq#IeLI)CrO=JKZt%-OkOj61R? zbASO)GhgpVtIuE`vT{3QXbYrJ>avRTFh<f*Ny;6XcNrqqD%}7efr7|fcv`S1}JB`QO!9gBxR9Utd&YfcYr2$c#1Auqu znNF-&^mVo{U3cjFJ-q6q7}g~YZG^j2b{>3-^mW}ODyt21%E_wp$3=dl2sUbJa&dO| zvp>K(yf?!c^2bk86zV-sRv3zqt07FT%b85MN^UD*1_`$qlyaWlP>hMhS*`0f-%?J+ zhPK}+w?jIeGjd+jT<}ZXZ5};I4*=lqo)N>ITV2avyn;tszi9P3!q^nu-x%I+cq13{ znZq+~#j}*df})F046IWOa_QUB!zWgw|FMwM{dTx$6l^-;q-Il@;_tLM6C=2rt&`In z2%}y1Rk16#y6LU60{Kd5@WXib!l0DQV6rsxdVvjN0syvg@|;}GSA{t{$5rNx5*U5hW1zBe4HwUGlEFGZ=X2ff zSgM_eZ`6i^tbccgSAV}t9KMrG+^x^wCf8<%t}uh?;=ZBRo&aOz_(a`b7R)l|2u9z{ zYpbOFt#m&bJR=(xu)Dt)8VJ7`8lNR}{tf=$&K?%=-*ABHJkUUdY)sxxb!JTLNmZsC z)++@%fXxl=RYBF^ZQWK5Ep`$88 z&rpsV#{XlXXeDkSCA&0;yo#!1Etmwz4!@iLXCFCw(Gsq|JRz+>?wJ;@zg8(2uXw)V zpIW?w4g|oMFU6h_#A@ka1JNnPe3VpW%MMInJF(b0AS^@DuD> zeP}-TbNsJF{{QVd{eQ+u$>}G_DCD^DA-TeVn7DS-N@dVhWWnj!;#`=dJpyX#s4KGU zY8s-woto)uY5MBX-2j}-`w*f1$j%-!z2Eu^Bz@CX%=_QmUKea|8lI5^JjZ~zY&I4k-%;H3V#Vd}V3 z4(q?{I8|=6($@z2bESgBTmT|iu`dQmR&NCJ@e6zs8T|&SZ3# zTc~j?_&Yq2eP#LMz}xPde>0g;alSq937-BW90dQtVFEbL<;~MpUl2>Y?X^V(GTvF=U)ng0)||{M-385EP*mA4SfIzHAwH8P zZj|h{?ZPpz6ds}6MsrxGZ29I8zyx&np9fc=jGsjNp9z1IHVbX^=BcGK&iR{l}Ww$2PAooVJbS zLp$ShH-HTeH&;8SUjdVSP~4^F=d5x^<#fxZ>4nGJSBuK*z3tdi0f|G=J)xAtm@R2(~@ z)UkV{T`g8|X=|@V zn6Cg_#X$|6@U?BebWt~&C8^v?Yv{f*2sA!R^<3FF*AAL}tnwNfg_H&hEIf_!A0XY) zVllILUhNS~Xl2oCtx}p52QJW*72%Vac%=2LoT%v7*)DPyw4JI&rr^_qw3oVsf1nX%6H&7pI?>WtS4`_Fund~zqW{VI!f9m(66^&gW|`^ zYA2XumGZ4; z@+DB>4Y;h5-mGTf?C)h;L=E6zVD%XJa0*!=~a1Lh9@hDd%ykjwFgjA3Vyt)X{c%NzdXMzd>4wvdO*tk<@W$ol{OFDYkWUgp(y9s}j!eRxi`bj|KDqu9duni7k?%$3h(wM7)TbYae~S@=&Zy)xuh z3buK2494loR1H-5U3~EQ^f-d42!J64=x4SyfRaKgn}uBB9++_FU1GcZVT=PFgu(93 z7S$K>t6qa{WS-}_6FzYsO7KGZNCBJCi2c@Gpn}5qU4fMj`ySSM6yD^Kz{^Je0rOv) zi2m$>E0+c*sW7}wVKHpl;vAb^5VG0JNOlVm+W+n!vO>%B2cJU;JTDD^db*ZKYX10z zhsDbtrP}jd@`p9gVn;IJuNU258ur8}gHHvAny@#Db9o^*zIVtoLE=uhOaSci5zX{# zD7BjY&4WLlkp&1grR}J^0JIDQ8#g==Sgj46+vIn^o|y=fl#^uJPwG+}S_|_Qi~%jV z4ke<}aoRs82vXfURa^h);y>$XiKnWGT)qPyUvS%QzU_&g+CB#s={^}e$N0+nAlfd8 zmg@OAX6nvTokc%d#SRL>hXGvS!_DSMUw!_c3`EAyv?=vcOj?Kjve&1}7rLV&ce&RW z9sawZRh3zdv0(c)zYx?WX?7cULyOr;rv}d`ScAJY;$N zL-aGaw6;w!GXiSY4UCGni>6`AaqSw#oz#~^SZO~!n~NlZ6g^0UB>==YS1f<=E+gD; z*F)a6!_StJi@pW!3rm%@V2I+LK6kuaet-J#6A|uxR9>+j&v~xXOsJ4@WDVmZM3+v% z=Hp)J&TmYcQK&Y{=a_suI0zj_Z6_1D|C=3h7a7n08t>I8&sSvO!#`>N6r_L8_-@WG zlaLl_9)3N2_JXnip?9imAJG7#n{OZ9*65QN(7+u&UgOP6Fwx7LcU=TvcWvPRDMsl2 zO-V!dqhwFk4LJ%VdkK#Hjzv)sP6$LxlnF(H9WjN9j|ij<5vL7h&xX@5C8)?jjysTF zhaU(xYKpdUMco?{D2*$nkyeRq_|XvCkW>gj4+?mgJMTmJRXWx@hIccH|#xGCcjp*-Bkr zll@+X6v0D}cJufdPHYDI*-@1lGf%@Y@Xg2l7(R#!0WJ)udZ!j#O&u)3hHNd4S%(L( zoTRFX1B9KhTwZ~%j@If4H<~+a@VBRMHR(B07tQ1T8T)_;CNmk%`WyGczB_DfdL0qOy$-W=fa}V!4bd^|@hn*+u5 z?Bv|ke)gDtbT(W3y?6I$k*Q2jRKhPr6PdxrbwF&(Rtl94H?CZ%(!#JwR==coaQDT? z6|8~M@$;*J>&ay+@e`Fyn+R32vZ?sPn|o}T$f42Ab`mB=x0AlKQeT|DzOm z0wSVwxK1Ulsq5S5CP%zU{ zCAD@m&GWU$asBwU5KBj{nr0(1QVaNC65@A_mu3_=h#Z=00ZWEVg{nH}RD*EQ=iy^*kM1~Bc{Hu-kV+mIhJ~$57-}ps zb^#jjTB_+MH4S@^dSA~1(tOuFEv8tUG5)^8am^YS@>^GDOd!B0_r}@5i{XA%hk(#6 z45vwWZE$e-IaSt1+Jmt19G!{UT%;3WdN)h6Z5OxkS=E_$wb%oWH1E`c2X?|3ru8*5 zAFY3@ZCz>M#!nV}V<|bZ#5r16NcBLsE?%nGy0H^)oA9*lB+bbNpd9htA~NlCJo=|s z$<>GH3T<1JYAT@AGk7utp-`<#zq(j`bK`0>-EE!P z%oF&$I&Jmo+__;YSBm>9h2Ic+ziHI=XmR7dVt=`|&VrkT5QU)4R!_?XjayiPg4@&H zJu=%+?^L&E0pn^YP`^8k&*DsPe~uS*cKOWfYL;cu6@#5ZzK;g3rj88b>F)nd!ZXPK zS|^{FJOc0#!2j*m-Omf-A;345^M1%XUQIj4GyxwiWN8rbG}hJ*WK(&Vy^NB&Q9?Gi z7UO-Q_+mr#NPtE4Nw_mL#N21=JjL~kZy-lE`R@>s*7%?FnU`LdSK=rJy1H*NG7c-T z!oP`wAUc(HY4PG&rPha}*@uVMEq_*$Yc=3uvJ(KRJ)$w|h8I`D6B_#E?EI?=7Pu1E zyZI99LFhX3gdHPC?f;+~W=sdJkv{1+synLa(d^O$dGc|^y05pkZzqd`TW_-cUy{`? z*eRpe^&8C!elbJZ`kzAU8FVU&`LIzh$PoT@guqpec;ay1W*GKVZZHSowaCg-ZoY+0 z`fPwf+)+M`dU%2P>5+exd^XFpsg81(Z6=lr5~uG2MYHG!=EQi4xp2)<8#1z{A787O zT*w-CK)h~g1bBred$AV?D5-|~u@$0)Emwp!rs*S|aK&z@Em?k&+UmQBi6_#GuM<4w zGK#0;Y+_xY`(L~~J}j*^gFZ=!ch+I0*Bju@tKJ>OwVICE%?1q;^E$xQR6^o?A8tPW z7>KpAzb?wx-DiaB`-Ei4Vq_}9){=Gy%AFYZ{wvU1(Xu}5_n|C%BJdMs_sHjf@jUgD zxaCe1K>UN@AoI)h9~(NEIxtw^bO8DCrT(`;^4g%_Zqy0*8%jFiN`!v&X6&VSUlL#` zw6JlaRmWm8YtiQX8)^OnX?icLziLeDoCm(BaU|V=t(@=^2TM5ZXHlZPxLja@kFl8% z&A^huc@k6pT;t$z?TLKdxMVHcqJ3bttr&pj(uyxV>dO%;I&0y1TE?dAthOnAx;fqR z!9dmUNvMiN4MVf!JC*1kL>8>N&_VGc62PWb%WmF8!(*<7jE|PTY;pQTpbXVTYkS zPS5O`osQ{=+!(Ki*Gp|@7zpikuW`0At5l$|mcOBiyOq8=YGX53v$gcQhF}9XVP-pf zcO6Kpq*7mdRbz2=Y20wMtnP4STw_(J-(H@X<6vOV*CN+M-PYYe-`3JloeCJ!Zb=0m zc9#H$`F&^xe%JD3+zc7LMDEV$BAIj|ju-{_F|4l4X5CHwrW;v5*`>A7qiF>38}d3* zqf=u{^)3Y9$c0Y&;V zYe9lnidXK1@Br$dG2#wx4Fk!5x?l zI}bC5Wi5z-&`ADD;{Yf~C_fTGU2#ntHRu9`v>nI>jU?@wO=i;Rfs2)f;5-%(2!SN4)H)>zgQRpo3^T8eZG zdAKoS#D=%J7*&9*>vRCCwkVzoo(!G>p2TmOV{~_Tz6i%*+hJO99I~`zF2p2_CU7<G+UoJBhi1JtpvJ zbUR)Jd}vv(YNd7l@grdqqmAP7C+(xYK*0Q0WI@l((>i;H5HFFCglUcdy9JhiEXBev zfknjj5*s-B+W2hZp;|{JZWQjM`e|ye4SmOw7a7M_DXR-@>IN+HF?YcOqXVL_*&(K( zD?peQO#B`;QTV&dzca#i=}f+v3+oO&hr z>Ws~X9DtHN82r-GoB&|O zM&u_i*1>mql?-MKA25X>7K{-mEn|+5jv;xbEP~L{`%EurAB^c4zo@+*RbGUz>Xe;u z_lVy_9*y=L?rEwAo`R0^s+-@qE_r~Yax~}p-N@pB^KN!3&Han%9A2 zKhp~aF)!$dINnF-OYSzEAkExsL;$AF!tNhbO$QvtC@WQzE7(BXUVP^8X*1-gHPgBm zVW+$grA;RgLnmQFw1F9gqquYA)?($|TEiID^I(we^!ow$3$Y+vl4#|J(v`3;QK4kO z?dS_E+n9?PEJARJ#ecWh- z90}46#B=&@vmbX$v3`$YOJRMVRbO#kOgCf`AliOt7a+I>ctH3tZlB3{`pNyMchfq% zJB0HE{{?%qkdWzbr2JawIFPjHUu5>uD)miiaBcAdRlk`fvHs-H3b^fYZ$M4gB)=Qf zH2HmzIN}4+;e{949|=ISp|7y!pNS(Ae6A0Cg8D$#$RFnH+aKX$T#|E_M_y(V;-Fo7 zZ+-}>4$qFw$&tDh!sTcJ!=WXO{v~T|ql`0;p@&U4!LG~wbS}vqTW&^rw(llP$nxxp z&R|XD2vL|bRilS&07wkl9oBAA(A`3v`^Sq{;0Z(t2rW8)w0qZK%m3z)KN`Jb`!E?+ z{4l(8z(5S8Hn4ySe`_?=#0}STI%9bou#n+$30JewihNB13|!v{7&?VDZ_fwS^9m;( zB4F3yv}p}#K9Gazp!8h_X|uaf^RMA$qeNFbw;Wfc?4N(#141Nd4Ui7^9&3EIGzD8m z8sOzsR9N?L@T!)!nX##>oNdNb7v9aqI;iHiiSx6bN?v!IGoO^7dv;EDB{F+kZ*_V& zmU71IQm_d|jr6n9GjfFdfwH&m33F5N2dOa$gp)E!1oKk5*oz$cQ&$CZgqSqU%)nMy zL$+qx?&2<90L$5-3Co7RYZDvRDjQoAtcl=Q>N3HmX{IkfqPiL~0KM)Nv|k>uc+a;c)ZwvhXmt%llMN zWuHiuSy@SKCR#RZxbA~#WT!a$Yz3R^;a?ytPttX{Ijd3=a4C@N{-e{pj!OJm z`3Kh-2s{o8(4TlRe5`nh)TC*5C0&(6_0lYj=3BGNu1Wj6K}QZyDPIB;F1hh`Ks-^1 zb0`IGGVg<(f&IJG(}M$Svj(9c(`tOQZtM_Ua77e)xnAnI79mAeJkPHICNq*g)iUT zv+{mMi=@B^O5yQ{8?!gbn7hW}o8R9zz&(Ri6dz=(erb+J9J&Y$+$tfkrnoqHVc%Tg zr~FYe(Tn4K%N7x(U8|v!W-an5n8i;qZpTbPt~$T2t}Z=j=%D)<@Bi*aE2vmlkk3$q zBDj!5x&-|irEh}z2xT;k@2)0!Nl^|I+kRu3vrv9OQa#L` zbw-RXvUR>CPPBQKRk-xEMJ1#g0^Gy|89AjX9yN^trenhmdK71~MOoV1Hi4ST7FScN z`#0CCkYmpJMY ztg{!{UEUq%F6twRIHDl`OMWlfK6!{lfzQK>b4H<>lF*5kl90RPYet1VxUmfE$`maU zWPPIC_D}7j7YqLSQN+;6TGm7aA{@@nQH;V!z~2yl19mp+{29Bf{12`@i~f_Dx48&8 zfF(g&U**=B1&&-~?O$~w0J=+cm?@s+V8T>(Ogv{df0tWUQd#%8#?X!%u{wzzA zS+c3}K0h59nYC`)qp#x1Z{v=N3KunPoUDC8Hmu_nf%_0$cqwFyuM~1gM2zsVF9Vm% zK$XO0TNxXhI5%`_wJ0fG=1;y<o-sA|y~!!+BLw(%#vNzM8_tFg3-}I8T(Nn{2M|1HjKu=J%$x96-}d<3!P;@@zrs*wrj=^m^!A31UL`Y1GNU_CuA- z7n%%FOHv5WBq-MgY}&%3;@*p58+CO#ytdHH2{`}max*)s*vJWPD#uC08|eM7o0$sW z{fCvL^&%2Ea*o!k)a982vm&cQsNZ?BJk997;$1#o?BdbEExzqlB&$&KVi3Bv3fVY| z%A5r^d~RktDVuSIQBQmOM&YXv+danaE;rgfjX)5X7}1u{)b@p zLP)cdi;+w$XUUM0L&m@5W7V#a;CUyEarL+w8 zXWiA*G^$fBk@an20->IV+{P&O%A~)7?|)CrmP8YGrXrCNtG|2roT6r6KNz|%%98lW@Pg>IBkx9%z05! z)e2-XcU4k-LwOu460zN@QxsvTozNSr^3M>wrnB+N8hEaJan%;>>FWh<2;DX#zpCl9 z(hgYZ05(>5!ih`XCaUyE*C!!&hNycn^As1^hThUDl0(1@lKaxw46Ooo+U>+vTBpo+ zm~p7uP6&UPuqWEwHdM@%W90t50$4`&9PbtQzA_<%n!Yb zK2Hm637PlLGD1Q7Ij?a%;zfF$r{U#S`r9w-^ ztg`KcG{tURVjj8fe^1x!kuiY*-+kA1&G6Ya+w%KFl`ZBi-*E=kGg>C2hfhV90m%Vi zr;!a%eo)EhH9X6cDCh;N>S{6t>t- zb$YCBbE~Uf>vEU7xNc5CuRc25i%A5aE>q7oC@?9*)0ohEDB&AF|9S&9{imQ_wt;SD z?N4H|Bp5uLab`o4$#vEARPVKRXzh0r1?3GTRN z!K}e7wa?#M(R#6|dxK4ns&mzO)ESrI-wWD5>IOl#$-eso+U%%#9vMftA89G!+mw)qS}Jy&0&ObYUv5_dg`Xr zQ?KF#Eg3sqT4LXdrtxdfI;HXh9?ArIQ=^7@%)Kf<`>`j)^>e#)f~^Bywp$+ez*SgS z6a^7}qe6XTGx3QqJ1e%#W(ra>GmC7TzHj=(%QU?d64%KRAJ3>H#>me3@ZW2YldJy? z8vhiEe!9aAsB!Ad#WE$uGi`3EL|Aa}d=X_Zp0vetcHSOxhDTcImUk)#M9J0YR}=gm z=Pg4Vz1JjYK!zQSBG!Sm+H!t7cqmcH-X{LL%=*$G5S%}2h2QVzD020u8t5bhyAj?W zzsu9)ZTZQ)jjW@7?2q?N=L*MaYXPx25j`b#AJ=$ddP$!M}`JilHRpWIgBhw+RP0f9)XY)~Dl8daGprh#}7;#hAmO)ZLz)$(5m zpAR@K-`JCdq`Uw?=4&}|#=?Nz_>Gm~WcP$N^K%0;ecxrX0`pS?^FzJif%8m9qXBmV z8_$ngW`V#@V96uwS|fj}o&28_6%&t%#F=|-teZ}bqh5uR&*nxgY^E*lW*3)3WFTLJ zAF_G)N7G7(084YMJ7IWjd`1-i+8|R?AgWrX5L<-z=gueq@_D9GDQH#6WB7Poc=;RD zzfpYORr1|D4gUO(XzrI?|`(vDd%!<9*8YG#>3;UII*|U3=_Vx5m6_w`XUQ zph|<}<9GspQ3AH*oNG0yGMyCDV{Y3)&jZGV;gx2*D(uG_<6_CbnXk&k6X#)i@9ig) zH)bda9ZvyB&9L*PwdQwKs~2JIk5rh`8wgr^ESm_|pb(#mu`}s@QK$}N8H^?$fg7`) zkFtnC6lwUd*Kh5kG_>d=uX9Z8t6;X7>^NKr3#mMX+#0gStXiYye(>^^!#TTGOjvhh z76!_YsTpf1Hi^#U=V44#Zb}1K-cH2T-nZQLz7bZ1A)Pg(O$?!~ zPeulzM*Pxsa1X96x1FMRJ%~^<4-W@OoYf~ZFGwt2i=TbE9>p@aBcM>iXK0eo1(oYUwZ* zVHE*-t_!V{cuop@6r{%D_ZNRvu9|Q!4yDfbnEzm4e7KQZ>qK%0W7s9&?hb4Z_>gM5 z_z50eTDNhrYUcLm0Nw9|V{D4$x{L%CJ?NKb2bH)B0?sp$L&$DOk!+9fi=}EvHO2?} z!B=RKtDemHSNOBfedun#j(-KIg7Chd%5@2ViSKWm>IvUxMv24t+!nvU$}{w@d`rTh zEX`Sh0Jq#BEJ1VsEybsk;0pSOo1MEjfkrY;)rUV`y3Zo=G%(jy5J={six8NYi~7|i zUK{G+Ox3G8h0TFJ%YBpY7S+c&G8rQRowaw1bHl6gEO<1Hdx<4<9PSmy>|AR6iveN) zr=5?Bz@Q}MVE^gdw*K6`q_);W!I~lc%YAdJdGwMMx$Pm*-U)b3nc6P7a-6&O^bW3! z!5Wo;`pL1M?4X+ubha!Kp-RW8IFi?b{{WlM%`S8tq)d3<1k0vQJtX&k-IKrPQB`NL z_8LQEs!bv`O&3_x;5lCw^~1b22f^S0JiDQ9%HPV3>CV10-_+S3E3YhEb(%ZTY zSf+H!tuV-~u*)sGV)86ya?+ckPIqoC4+(+B-(El;MOVWof)X3EvIeR(A(k_S1F#N6 zR2C;BJn@Q3j*3fFML&`NFy}Xb_c! zytrqCF{(;a=w96ZhabKO^^A3zvH?v>nmcDEd_d5M3_P7_q*j0NJR|`#-iF5!dJ!M_ulMAy zZ+prT_TNK<31F}#{UmXbmIq-Ape6%!%G^)`16Fm%Esa$SyCu7#GDV>;_`gm}w{8JV${51xiMHh zOrk*UiG$}IES@zg-ix%XP9GMb`G$1v{Cr3v(KtK( zrA%ol<3Dy&ewT|&%mI7Li7o7?7jxvbOEjmBtk@Z2sW_*_I{Pi#beYbM7{{~m_&8=@ zb$x$Cmr(Bg*ljuiEWdgt{=@en<5gwYT;3V7vx>_0Up-1`6c)JeF!72lBi`!zpTpGC zb3K~^OAmecOG%GnSg1&^6hb!{`zMpS+j=C=65djZd7+hq8*BV65isJH2-@_yet4a) z#Exgzx>p;!XhDt+)?u-YtX}A!XmK$H(DwK$n!+=P2q5eMK(}yiw|~wn;;s9~p>m;= zjhd>~Q~CI8N47dquKT})wOwhNqEUH-_Awvg%&CT5J7bqg`6C7rpz@C+j6vk`p~kqm zLi_F;_0@m8hvBQW=`ltqsI(+xxonX~b-eoJH~r6+2tIT`F{(iz(MJzaHz6SV;OC<= zH$-xaccQ_6zZ{}@8y^crK70W4g&%Y0hi(G!@NKB1)GAFzq)tGTM!Pt;fUO4pr-G`& zQ@aQkslTJLNKk&Csky7T;!6->QEN7iC^!*V*4_CudQTksgIGV=Dih=2+wC1aw{4`Y-pi*T;?LxKJRi>f8!D)gPaae=eN|br7oAe2 zKZ-*Z1465SjvF1{gx$^$%m?$W#dOKEkPUy)fw8;$G0Rh));kMXHPg61vorkCSBUxU zPz^J)AytTH-%+ZWK?+{c;Q3Y|eK{QD6-x?pDPU-W!l54jPUf9*F7s0GnyW^TY^i3A z9T4(}ZN48Snb!vzy91fNhkpu<$?e=Gg~k`>MRNKy6f=s83z>NWQ-1ahd-=eZYKiQ- z(wJHHF>{ukxU|!2Q0ga>|Dc+<8yG_2P>(@aDR2&JV6&=7)=~D=YoE71jxhKZcm;Y3 z$qw!ayh{qlb167FAoyOzGmH%$>m>Jo5d700Z@BJDahz=1=1F0?&EtEo{l~eaxIi41 z#{XL=#f_(L8w~|JCl*2Fj>v&gTC~*+wawDUnLHU5oZSD3v0{Me?!XKj60+hz_W=_A zDyEn@xCCDDG(a$j;UpntaWqh1ja)B|-ME1qfFhRa#Taj(W76=7D}`STvkeL>z}-oA zbnda|FG`auFK7}AMB87YN?YmK0s=~bSqY@I`~mI3!Q$tq2XKff5z@Yh5Gf&_Yh`E{lAgo|#3hCbX z`;&rFvvHq9I57^pfURPvY>Dfp%J*d%$hq@Wc(8q8L$=&7Oq1@JzM7@V7a9BOsYVkq z*{3edM}e&=38lnoYU!QOxcFMKS2w84plL^{x%HL1t9|-tUUq)m*4)eB;^ZD1XTLj=_TyECj@*q1hw}Pn$-78#XW5 z)#W(Y2aVy`sGQ8hYHzJ+$(;0G3V5a{w!(M=?2Fpiy=yLG^_ z)>S5MxD)Fq<|Vjk!z_2NC3cm+>Ws*TtVSK3o^sMR?c{6w92o$aS&3coo9d}Yfsr8d z=zJ7qfPJy@OQi~6tRd|dwV3uhDtY}av6LFaJAG0&HcsQD8Kp~S_}vi;Xhe~(C`%Su z5YQoyC%d+@!7LqVli!SbRmdj57G5s>wkb|ajY9E>b}GEHsFHI6R^!NK_H$TR?AOVa zq6mZsdx5pJVzwuZ_@B+I*OmTazZx*U$7`btuH6B<=v7g3ir*R|h|@m|HK1*B8Fkh{ z7*SFC5Z+iv1UY;=J)jQRfP7gc$c&zBQs%IH>6Z+7dYpo|*L{s&YeZH0h0cdzT69aR z#eIhukHFA2?ROJDTa=!KKKCS|d$1gC_@@T7H^#KP91W&|HeJt-fI-G{5mHj2XU#iz z{SeeW_7Z%f6S|J<{_bwV#{RJmEl%x;I}((-hq;2F8+2NIAf-GHvRB!{ZodV=%RQia z>OhH6FCLz| zUJnN>46LIiqZ2->^<-JbsWiNXH2YHrEGG^B`1-Kc3q#;2uWNNMFY0 z>$}&(2)|H8c3_9hRE4GZjo9^Ge12?Mg{yHi4}slXsIg=ooZN$S;s@v?o$x!q97G{z z>0D&vulwqCcISSFE5lMI3pXSLZXU^5VFrn?HGTi$x3TbzXBr%P%nHWPc zt6q+mV^0qg36>ejcq7EhfLG^E+JV^HJ;%l6%8GNQy#er91x2v382!G{zN;!E0oEug zR27XvvMsQ47wfGOa=t*c)jL!}W=(}^CJF?b%w~y*d+53@Vyl!_;g?*wxlyq&8sjtxVF07tlI54vkN3!&Oub}gc3ui=r z=PF;_vG6fMx~A|#XP~v=vH(TZunV|P@iD>&2k|%UAG1d=F>S_T6{FWR^XMEDHO4S%ayCOiG6=SpluZ%g{%c6gEfMN3BL^y)C^L}I6k(CM zO&31AN9-3m7Vyv8Vi(jJsqPB>pW=_yJ+lo%4a@gNi>lD#UJ-IglJ{JiS z2Ews(DJGTk%9#-jG_ywyg!f_fI!#EBp#%_po()iU$rpVOho%#u6cP;^7ir=>^AQpl`&!Ygorc`^)Ukr3IRtHG=%h_VM18lFK8>` zIZu?03@y*B$Z(l4nft&$D*gn>nPO>~MT`3QeLVao4}a0gz?Y;j+N5&~h+F=LUDSg9~)`8C` z`w)Wu0YV3q4sZcY2?}Q)gndbN%uoOj7%m|zMmHgTj3Q>M^cd@il=JR&ikdB%I*l7>`9)Zwt0QQ4 z|3-4%$U65DLrywMQ_NQftE)jUEhR_2XUA0t9LfcX(qXKtsG7eV9~VK2$uEO^Qvn%qr9=q{A}{{9e7l}#^+Y&m0sgzSTp zQ*m&%-9_2a)qF{QhASM3h6Cq!E1mh~@K=m7(?S|aoOi`4*Kt0{PG%Eu(RE>}$uqs* z?4$Sm5%G4^@EP*6W1$$S2i+tp*6r`M_VC zp;=6bWRWJ^9%OsMZ!RjLDB3ck1}P2=l0-szn9SlATRnMA$M*y%rtwq;+r?k$wc%&F zo9T=GBNbGoh;gZ^zbj#s4%v%;kD?6M&D-pcY89#wG7b%^gtjqu()l$eYmh>(1_knG zP4El&-lc&ApGto&|HOgcBpQY`zXz^ZEj04gsdeCPVV}5c?DpKf<%4baf=l*oB_}bc ze;zeT`(1$i%Wh>V;4n#Qr>vd?a&{N^<#>}Yix#UZ1jJgu8BBCkJGHHI&*BO)Kee|# zZxvDEST1h^z+e`mN$^rydu>HIEM+H48-BH85sT`CE}N%J?JNsX*RW$u=nH$%m1GJQt-sACdaG z4r3m0nqfXA(E?!}ItWv8g%$shoJ>%ms+;?Y=CXbZu551@7=O& z6Lx%6vxB~gp!PCVD`%-G$jH2A(*={xPD&d;In9Z zr;U79h$MSKy%U(UPVYOzHSUe^<(7dFRxS;Z%;Ur*^5U-o8#oXL#9nmDb|sX?xm6PkE0kJY^>puuHQ|r3?Cy5Ce5krcny9ro%d@q(&VjI4Db90jab$2Z&p!Ymq4g}+n_G# z0TCI@JAz9VDw0hBA%^QzHt71OuGF`-fk4o&&{k06`E1B*#MjdmiI$zXaufs!!r>bb zIQEnHBW#hXYz!98pW51&?Tprv_LZHsvsY5_k-wbky*&+%3uC1} zmy0|Ph4}qlHFetE)ZvGfx4}(-x)Puz)t@)FiZnfWH_=k=zSoCcczu|+R@C<;U^>j7 zCCk%Uq${!rpG_HSlNTNwj6!rpTso<{8K1DC%aB2K;przSZHjIy=}H zbj*@sqW$4mD8FkF@>XwUrabRZteOo$V;pLh9?=d{vs?d84UdnMd|-;Usw^IMZTMlF zU9$m8Lc@mq-NPy}(SEDs5+2#wj{A05pu72?bSrV1&0`?pbGPo9HwjC*Vs&%%<0TE2 zAxiSBZmFfO&u3~U8xZ!oxm(5JfxDwrJiEyF!?Mbn)Izq6uRfwFTVp09rlS@)(gyUQ~y#=IKMbaE9e z#$gR&>J6&B#AokH4#LikJL2$NJ4;?m3sXG#B&rIAuZ_;@37Dv7l_nId|GPV#mC1~f zb#HFL*V#Z;?sm(f>=(DL9D~FNG!XbP6yF@PXv)kO!;TFdxmQAj_{h9spNOA?B&bLp z$s|jgr!SCdlNJ^##=rXIliKb=?qxK;MIHBjWb02|mv=!Vy!ItPrm#x#fP**`rDkCd z`>66XHyD{r0ow~}t%dBY_2%}dF}WgrTDj=34A0@ z7c(zC?Y)M~Qw~7<@b%w0lt%K0K)&jzmY#&mI*^!D0luD|P7|D;IhBz0Q6KQ2RUi& z2wHOby`z`^QPVxEs#kl(tk}<;eA4SXryTkalYr~&h4?==uCk*IDNq1MS>DEHf>5x&lqXr zY4pQlZoeI8%az)1h9g~Jq-)C=Jssv|v@|>f%98JDMDbO|3T9rx z=2yRFN7?oZPu!W*1D?U*1AV8A+^0O;11%Z3!|C6&PxFhHMKh z=pH5W{NQ>{906-|Mu9~mn;r6J-|E9TJ zZxEk?9K%k|;Zgf)8s+EBO5fwdh1yh??&7;z>RJ-dZj=>$mbtjp=;3;HMrH=GurO)q z9a4`6v9v*90x~i(ny-+TpR<@VH#|_+fBl03)Uj)yA=r0n*ze(%FoGo0sRI+J7S)FO z_3cuaLWt+RVj))?e2)vAeL$8u1cDW#x};j)9~-nBJr`ZmSGK%y^v|lUI@ah|cM@vV z^A7I6dKfM!kwfBE6I5xO7h5f(eN(+OTXs1*u<>D;ss^>Bn*!R_BIxiXso? zI)7nLZwT*+1dMq7$8HsHl{VRBQQbag*>t2bSdj2q(WK{viDWHpqG-A&ZOT}l z(Ox=9Xy#tiR$?iixX5ScZYs6eUrD_EPuUp43L#!CTu?2=XnLF}eKRn$D$d7rAR%5g zE<@umoYO-(ZW9ASz`h%C1t!n#9~GS3@voLpN8(s$@>tD9oDOX8q+u#RYkRP4u`d8F z3Go}vD1YBniH|tb^Gxio>pU?ZMQ_*|=;6J@GZ)7VXRGBY&bB5e%mLV2@7V2^iM@_6 z4_#|(@AnT2hFq`FJrjb8W6$~0H`0x49&1ak)Ww=Qx?U3mC#&>s$485%r`qmJFTInv zb}}0Oj(X%MzJ8{T~qYnxqbHwzQoZlEn@t7+>yYP%&dr2AYY`%X7 zxu9g81X!5K@HbZA&)o?3R8;uTs-3&4&M+El8KK4a_?c@*?qM#3o9>x*E6mb{lK&Kj zWXQA}JEF7oBkcdzvj}titz> zittV%?1WX9vi=dk_=pWZ;AmPa4WYtEnv9Q1?8J)kNf9>HqdFzl&&MQ8bZQe3zSR>@ zjs!8LRjXs;Zs=}#J>_Ohi^JD6(~wcxa{4#3+FhnD&M651Z@2ob(nZcz-^1Hj)~5`O zo*ArtTx21{`{kVPU6XTg%$HBg&Y7B=#+$*UoL{bh7m}5BPcd%`bN_oU)#;z&yeB-S z?#z<6!n{lzc{zFJgy*zrN=AyMdx$1sldojj%lI50fra0AUoC#w5Q?hWCDtvKDV->x zO;g69av25q#l_+Lru^RW_RA7~&r!;&G4*?1YDo9YRF@k%a#XHahj>X_OD~X7obFdk z9vJWlG>`GS6{!ed?Vo?Y@}|Vtt8@aPjYJs@h>#@`c16B4P6Yiy5^>Vc(qo=b5^C`l zTl(P1m zov0>qLcId@tKZ~@1qwtk-`L7IM(!AqNjtY!$TmsiA6agP(@b}EBzDWNj-Ey!0a9Y7 zDV{B^YPyd1Qf?lbD23!YrUkCwnatG9$#r(`i1vv!^$k{jnI-{#s^qmNSuNm=$e+!< z%F@6koQCgnD*8XWE-bl>` zq3ZSWfOtMOiWvum3*FrHfmW={vzX^7eJ6wI#U=*hg}k<>?Ja&cb;;xc3?16}w7`96 zw@|7cd#FD|t8YMDQfO%VD-W=&{ZzLWYXxA18D2gcOE>)_%Pn4b8l`Rn zOYj!)#7+X(C92&L-dCsV+b++f~XKPOpQxpGL=r_q*3x=9sFn+umrS> zd|P{??3NOD6#G!O8Zc*Z;##pIac3;wnm3g{-Y(BmxiuPj2lvXpx zrGBRUJ!5I#z%kE|!jDf##GtKPgBK?jZPO-&W)Gl)OJ|ktKy-_k)J{oKPBx`1Vrk@} zRnL_iW9W^9l*yg4o|7hPYaz4t9|X)5LjzB_R5SXiRW$ohV_{K$4dyrYb=hX@=vA|f zOOc5f-cg}>{7p1x^xb9*vq^dg#gULvjfxL|0C*FB<>KGJy*D!z#PV7o%d{~RcG!(( zx}9aw+KkMxB$YkEj29a}A8o3t*Sa@FdvK#KkQba8t5{};8H_#E8UB{ZQU>1YcxIvE zPz)z5%jm3AcWgP{EOg|<26HiDxw6<3P@u}6H%H*^^xrtLUD)dsQ6jN>L5RJONvDx# z%O##1JqnsK1w7yB@Fl!!o_elQ-))`wGop0lmSbMa?ktSPggt!{Ya(Rb+lQi(@(k)v zT54Au@o@PMccY_j4wBxyzy3dwvdNL7g}g|QX@2QpG@bM^Q+e63mQQ|OxyV0v*#5Uk z;JLWiYVv#Y?2|ino7?U*lSldzLyJk*ws8g_EO&CW&EyT8cl8qF!Aso>4pDn%!U;j^U zGoJtSKeBrjaLpLZ8T;guM9=Y}5z{UoowKJTT?vgUp=$XqV+Tj)rwJVID$4xM9oDZ0 z+cB6c{Z7X`?-1J9o1(;l;3QGGTx`xrQrzEzvYqZW&KPGMN`trD!`p8wo1tw$4CfhP zOkzJ(R>o)ige?pRfub2DB~LO%hkl=^p%hFcPDRFlI|)y5zOahErmcZmxF??+fG%3s zrvOIfMfYcbCpJB>(nqc2-&rqrBgGrN+?}ACYmEyJyATP!uK^2#+&tW1>G;W8P2)& zN9PK)PU?)m)iGQ9V$bPALaw@lT)^*PgQaXi143^lt4!$KXaPE?VSV)Lwn;)z>F(|j zx~VYl?K#~za>f|@hYmE~ezTOuDV8qmZ-Ws5;5}}zw8@|>iKCrmEMog_WX z7q4?VME_cUZC`r;yVZj+2ZedUhMM`bxYY1j=bF0R!bfBz5b|+FCF><6Mn&@b1{3E4 zJfRZLxvPDLwF;c6jV8B{uLZ%pN&>pqf zBA@2EV9pnBt{lB4U(70R%2&EcVYh~S(d_{hQ)d)SIT~TgH^ABPYS-NSdinVIy3OF) zz8o3Euzn8RO(tAy8I12}h90(71=$!1G`1go!CmO5UlwPicL3j}-{jwU=lIZ%6zRN_ zQ3JXgKTeF;g zn${D-^M;az;)6tK?Bep-6u0m#t)mMYyFV9Y$u;()ze*Juep!^!A~;d_w{~Fw(Jz$RQed3Q-eT3QxdYx=iTGtCMn)uHUt+-_lc-ZS^G|ITRbNh!g_`8@O|E8t$ z?07j<`yZlGFrL}=V@^4)w&E{9#quw^1&dnw%n3TrWXCAa@(@I;2UpMmycXK9ZN`>k zq(IxgSz10B;~eEEZy98bF(ePsTMU$mbkYeCed*gq2O(qY!z{#d!JfP2oeTD*Z`Bt6 z$Eig3O%K?4FlQq_SBt*IN+a@GN3Y3kA|TGN#9IjfrmM0b>Keo;39fxYjAF z+cY+BxM}&}{vshOdm8M`8x6|kH;7qYHX%Kc(Dx_hh(@;{ngl{yt*nZi!6~iEg%PUNPx_Sm^2^QvsyhT{sUEF?QST0Rq{Phdk)1Af{Vli#1j7AqSkShnx zQf)YU5QhMR9bFmx)nGhqdirlFt+U7%qScu%^VAGE=sIN5l)5epca)-Cy5;4ygr(ud zv(D4Lx?o&-;;4~wkcqUlK33QLcCOmIz1~L4%Tg<0Zg99i_WkQA@)Bt z!)!W9fo_hCih~X77sFYco*~4w7UhU^HkL{)JrzK_f>H98&m~|F&f*BNiEB{0f)^>% zSRzxwf44q28G8%RqxdmD`1K#wIeTy9`(f4myWy}4?`HmUW%@jC2G&Wh+@?QlX#a}I zKU_aO^7QhBHkWAt9trconWtHS6Y&A@UTFKT*Qx1*oilF)TF{LA-IakUrC$xU_MO#w z(Xi9;W%HI30(5h`)>0(RM%+^6Ss$W}RSgID(Z#$X*jlDW+R|ELT`Rq2$JuPgG$+eZ zAdQZWpsH7-cSre||J$;C}}Z3+(Pxi{fQe24j?)4$VQ+69a>SbBwVvi^K}UiUwX zSqPI;k(j>$32ld*Du$Ik-1A-aqMA2Yn;m#|oba^R6P(iQCXY5PD@4MmjXS49>?=b= ztCoq`IZGw7k|6mSRQXz#w7*mbw0Fz{a}dWtnL_BHNUkx6zhFGTFF4Fc`r(jsN92|+ zk$S$pr>1wiemrl}+Ud2C13#H}$K?U}ao zL~`qUKVU_8MpxaL&?2BChb&T6#xpCoN_-#-po|?0lrxe2F|s7-1g3e3xTw3HUjuY8 z2UF!+&|J)vu(GrXo@KmP@#&+>^Nwy2YDS9I)VI?ER5ik zyAq9vHqYILYezXQ3;(j?!ObEd=<$;D&zjI$Kf`y)^t{;{{EBEj zO^YtF5MQk1Qzw3|u}-ge+a9XUW4N9pm*LQH_923p&Xg~Rs^vQITvYou!(P=Grj!?! zjk%=_K8lxl>f+^e6zUXKIW8 zy*c40oDYpFWOr+5dHdqiK$fZ|6ZYTFg4Pp++&GN{E_;S)C#vL)mAN@VL>)T;Nt!F@ z=h{VA58PTQ5(*M)k9U49Z!3~Vgw4;S^6QW`=f0a!wovccJm=5VHXeEt<%?O>wcj;4 zJt&=3Gy`InosM_!`b+*^(Au{qI7%D#!dAuoF6A1SNQYlOCY6D;*3k&nh0Nb+>hpTz zs)>ZLRxiY>ZC0&eRVi<{F>s>?zM;j#{cFI>P1(B%yacwnJN5{;E1ZeiR+9x>lMP^xSX)qQFMEp&n>E6gxeJo`s`qWCm8*-QZ=@VHPKdtLJZuL z$#Kq-uD$ezx+g=}J&~-jOm2-g*o9_jHwEclV%N~H(8;L01bb&4pwcbS8<~a^ zY|@(Cy~@Ix%eo4jdPAo7S7>U-%$ni)QLC*l0->NI_}3VeLAReb^604DFmzXkR%<6~Dos<4^4e`S~^jP;RSJ!?f6f`gnuXGQw`Rw9Qf z3+&8CN5F?2-*nk8+g)eISH43&`qaL%+H5+!&;Ay~dv7|*r6jP?2P~7YO78~=XGsS) z^>S6IZ|F`f7Z46Db5aSc+VXN8dFcD-WvheJC->u2N*7LRQF$VNz`c?eTIdjycY^!_ zW@aGA`cdZo^+-mvd_cqafWVetH@Yk#0L1Ou>(;Cu2w<IThbmzHGf*UMqH`f1-Zsivs;<2%pPp+fQYa=C`ZvRxYbQ{unm-H&L(auY)!H z1~>gao%Q3RQ%iJp6Zlk^RS=UFeUp5b)W551-HGfS$zkRS- z$*$LZ`Thph>w$QVqoTij1gU`90rS*z?K^+a5xrA#d#SRcarpweqp(~P#9pC~kd6D+ z?32`+RNeFz{q3>&+vi#v_7x?Gwfmo}R~UlV2|I0{W#Elh-vJv5t%D&)Zv8>RQmr3n z>Hp6Lpos#slu)WWrF1%Qi8bkdONw^sr~a^)CK-db5VZ-f16QAU&6^-$9Sp5QS1)nO zqZ4I4@Z28>R1Ko21HE2={8c4nXhhCU=a4fUM^&C8QJS7t@dJi~q5~U6K;WS`PnNh< zi3Av9i<5i|Vey}s%b}8qk#5sYP#=(b468$rk`Pl5dKr5jiS>P_{G~z^c~?WFnuB>F znm0l0f9FS4Ub0+R9a@L;eBgROES-n^jBezsAdLC+f4fZ|p+tM;2=f9r{%n4GR1qvx zfpu3{qTE~@;EIriqa5H8SGeo(BVeW+dEh?5f9=>pi*~ekR+|H@yM>wqH9M~8@cxMU`$Q6%w&DS19f1j{ByX-N@xXSo{ z*clLZWq>uE2=vh^eDzd+<*O~!L+G_ATzFCoV~VDa;wKH;2>2>7V~}e}BbTU=v*k9= z%e1vpn;@t0#-fX*!0dV3AK~^~1fR{{M}Sexr>YIkNwyVFauqpjBCWN@-^d=TpWF8c zSYel_`l>$oS=FvJC1Ht7De#+!FHqmZbPDzWGbTU@hKiD;DQ>-Wc$q9@-{)?n+m<#J z*{${Wg&$%!Z8I&bXD6A5p7c2 z0wIemlGxpNPe#XZRq;@5#XXghM4}@pkI{JA+9q<#q?=x9G_o|$j%ZjEMrsWc@<&Cu z&~Q4#&)ye#NH{*l+0^6l+SMle-SSE?38C~Z7f zDocf>K+gX*B<43gKv`_BE`T=qgH<9AW%?&gsvNn9xWP^NPu94wGg^H>kQg7H++N3ySdxOVv5CczngTf@G{;I^nJkGl(FTleO(pEthj3*$a8OMjJAaB5W#B$BV z@hJ`RbYrj682}=ICp{`&Tw86l_tSz*S&~9Acck)PAb43GwiZ4UA?8i1qW~1<;NpOJ zQC_IoU1fydUvksI{S~4Z;wx5+>=6H{EQP;d17IDoW^@S(`+T{7+=~_z0;hwW?>M0o zUxUg8(Y-04?DFV5@mh+%OMO+HtY%>B6D4iF4NW-CO(IR2pjuze9usp4;*F6DUOat* z#Uv|n|F^)+#+>{maN{L^Jc7ymN8x7qkHSq3Ftc*9F#iw3&C1Qh&hft(?hF_`rNQ?n z)2;Q_uDbS7iq*{yBhfk-+&b>oI&K*I{UNy)RFRfwTURBEK@A8nXo3k_NZY74nu_XLvFcdsKaPU0UHmG_^`pC15g`sM4yM0zUcZRVwx4Hh(c z!13;v$!DH;A0Lt^v~x%ovbezZWM8aXwm-%pD^yCKVKH+Y^879;Uu3O%_56xfZcG&P?nNPUWp1YUVsy1K0oX4+{+ z+D1bXcUrm)uQizmC)@bGh&+?Eu1@r*Y zW1{T4zaP;jc%y!-#iUNQ*)y3&A@Qa)Y^Ox2Fz%Cno_Ng2gys;Hc<9+OFpTOw{IUgN z#GAzTqOqfrAKdmSq_E`0NwnPZd3$6w$m;0mn1e^CES0?nB-SEbJ2i+m>Uhi2$LH1E z@Ib4A6n;fv#oh619K^mR@5tvs^ECh7M?Bt2FL=zKm~ev+qPxq*o`RM4cA^f}LxAiD zqvUQ3OVO|q{vqWVlfcW&<7`p=eHek^&G~J7yTQS~H&gS^b-ad5Fm=$mTZFj>rt~Ms zlMdNr(SIiyZbV(L8`rb({d1AHm|eTsi@>g6uN3A?*=0K-sr5i)%jH(@iuGI98Pnd6 zjgVJ&sJ}}0Udy|ms=-GQ$1>a6ZVi9iX)M3Sp>Y0Z0IuDCO+tADrh9d|{-|*g8nH;u z*SJn|-^lYzY{18a5$`@+)^&X{^33?&jO*V_Jt`;XBA#Af&vfDZ*IeMg-}D-VPZ%%u zc8<;sLwsd-i2~yW(#JgjAprK&Ko%%V3O9;c7g0fm6&HT;y((rsUMY)>+gwA@OOeUk zWUi`!S1Z}8S3KW9U1Ki@&&r5-UrktL*gk-Gn2dS&*`J$gKWBCtI#d8s0sBqNMXX6? z$(!kOJi8fD<`EdSNWY)NmDX&%4UPEf^d%5|KxnV|hJfRM_v|haobU+rVRz}b(T*sL zB<|DH`TikO6?H{hgMJr^gHWARlN zR&Ub829=J3dwOPJS)`E8bI>um7+*$1J2oy2Mvg`qK?ra*wUpElZFBPQS|(7^D@)p~ z(SM20^0B}hL}h2p6P425a!6gXgqc-23Auv2U|ePH zrgTzRdXGOL3gv&&3Ck+sR8+V&E=-uC62grGjSh%g)sifk%UM_VPp5bm8e4~j4jbLs zZv&sL>ivkj5Lle96ScK*MSj>&iIzYcYu!ZQrvV!%W2iJVqB576+-*DoJu)$TA zO~Gjx@4W5~Qkv8v=q9hQ^>vm8gxP!FK?Hr);v$O z7l2}@DUtm1m#@1ed=Mzc4ot(~n#OA8U;jI+%9)TsSp=uv7=>ea^#B&xZzv2)P~o_K z21#m7F@=0$8taCwB3)y!DvYYes+JHcF^S|05RYiUUE~E{vSD=geyoW~bW9^2&*1M> zjErug{Xb3NLaZg#>d?+?^?(j4d~O8ij-B;&r~!l7dd&h@sQUPUIjm}o z!_{O(Gf|&11Xk`Jz6~ZJmr&uQeB-~`!ly)FqdU~K=o62H_C!6!iK_LQeB&BA=eC^f zvtDwEc(puI^CDry#@Iv#HS$jxfEv5(Bu&C@*}szSioJ{&G?B_oDr>E0qs-a^1OPlY zdIfJel=ZbalRa^izrg_2Qn<5f$U>W+Nbn4u4+4aRe}$FovcadkIdaiLBlzG}l)BX4 zWD(bHvn!nmti7?`Z{;0Pz5*Ei@dHJ{Kj|6PA$$ttAOm~MSN&SCzU1!obfSais?&K9KXN#28*Zu$vh1D z(JZmlU$MQqGo~z`@h0e|+A@9)F0O{(t3I*4)gSmE?yGart1nAOxEj& z7##1VDM|FRUkO-Pr0F4pSVAX5409f-C(-7gH8Y&?nwVYw2g#cbF^39I-N|$2~Fb^w^iuc!B#K*0u(#fwT)31icOC@O`zrO=BMIUnO53o(DX zLkBEz2B&rY%k3SU%%jH@DbV;1w;5$D&Hqoh>yRNnh89uwJ5*T%0=#qyt~sLQ8bcIR0(_h+nTRtyt?*|4VY3QxmN7P4l8@yiMJG81ZI(0ArpvnqJ>(PD7}h|MlCS+qj?;UJQp}YTO_+xbx=+0 z6n)fTZ>B$U8|-`}Z1X^RX5n{&a*X`;HuNr=locVq_43p{ui5kzUve`A3}pVg9RE`nFdJ?kT$7b;ZI zJ&E?b#0{eG=RSDS7ZlLj@cR5(rLL7AtFSk8Apv~Do6y(Ey-olvw8xDzbaNf83)p@q z!42fj8Vo2Ua?7DlgWuIgTOM3JpI+W#nZn;RH$BOHY2HX>Z?Yp)IFu&fNV0Ltvk& zL|B-aS?vMQ#6GJ(OS7oAOw+I|sSi>yO6E*7W_4-^&IAPLrO!aLvE4dQ5Hj_LTJQ{x$NL` zKz~J1i6)SMhM*3J4S)~04sZ>qi81Fv{|ccJ`s#>^>@CJ%08aw7D;j~wdjql>LKlD) z8#*EsAyNQ*X#{LyG$KL;L>tgpeW8*+$cRx<5XC@A2=paZkX6L+`uvzkWuZy?d}c@; zq3K2Zf08OelZ*JqkQzZ#i}>xJ;Q5h+K;wvuA-{*PhA<)*qW}^aB5w%S+r#wK2 z@^zj`a1FcX5|WI}6`)rEH@GvF2C zfdV`ddHb$Jw%}en3``@t5MPMBpq`T`t2fpT0^+MbK^3@F{91;nf(AqIU+S7N<)rRQxjbQg`=@3t=LNR2!UEr( z(MDd0E`2-TZV*S-iEMm3U~V8s&WNggJ78}lVg!BO2=*~zwtYL`Z%{|Vi5PwGpq}YR zZi%LS`QUEgN0?)_efSV=EMtm=vcTOy_o+tyw&5HBC^5rAi2i)AsIITbT1b9(ete)e zOd}vM!9oxIcRqa3bx1~xBVa@xLVZM=M8q+=z8gq4GBK}07mHK&TVOYEF`Gm#{%?5u zrbI5j8!$J&V?IGz!S?jM>t|C ziIz(MU}qyw=Xe92EL17`Sau_ABp5FkPfOwMr(PE+Z}Hg46*pIB|H;Z}%jPw0@Le7F zi+f)vI77^itqKIHtV&BsgR-xyb54lDbWpgcPdGIJ1C19(?YxRdai+tXXVbD3<)1hq zynSK{|I+z}EwW#|{tqc}o67%uf5g-0jv0>t%;4~R%zs#Id7PJH(iyktnT?E8PwwUU zRr9mUbxWg9$=%=2Uvy89{3vr6zyCk3&MCT+sNK^Y+a24sZQHiZj+1|qj&0kvZQHh! zj?Kw;=FFK{v(~<;y?52Bi+xe`uJ?I<+C?jze{?82@D_P1ymZNF=ax>7e-!`i8-H-V zAyL28L4?lO=1;TciDQ=Kp(w4)gHMMQv_Lw*&$Wc=qa1|n(=acKAJUKQ#*^5CBQK}o zF}eXx6KL@&Y@~^ch_Lr=n{g`3Jfw};uOL8k_@=(VlIbgzT?W%w*EoJDx@$q6D@+LO zP3V63{e$oN`=`&k{@*MRyd7q62~E45vm28qy3TBUSc=OGBUg2^TCmk%)_oh+Mr&Pq z+=L?Ck@S(1SWl+&(09a6w69>C65EAlS|R}S1vnFsHh-6dkul{%TjU}%Em`d|`L7`R z%`g81uF#~|(~vmQIO+n-`5v+DsLA-Xe5SLBdAC<(cX>}zM)744em|BP5oVGZF*DIH z8$lLg&v@c}H(c)+Gr)d50k2Ire>&e(ci(|IELYo8XG? zPFbQWV^i8ypj-FQHM9%6Kk^cLGGvVSP|*qFj^|e!9?APqtDciYq)#M{Kb|}A+wRJt zR)Kz44|=vMKNLW)CTI+g!oEhs2qBU4rcm#6FOM{b_CWLw$0HjD zqFY3dtcSQJb|-;9mOoy7?BWpaj%>BJ!1!U6;Wq*elKaTG%rO&fA-j|yM zm)bNp^1whJM^%BB)qh6%Uhu;Ohc*vLOAg)tNLPw|Hp&F9El>x%t5)(dp$TwEv`aQG zsU|3IbgpHx18Ejzr)ziF3XkRRxcbEEzse>(e1%39xVvBqC4l`oY|PG~~W&0cU~ z2jpKDk4TFQc@13KcXaBt&mDk#_BP~jhA}GJPl=BVK$-)4k+1^pb%cLn+{Q2L9{wE)buV3WLhhh!sKy~_)_0OFK^=L9-NQB6=JCM3 zS@sp`?EoIwCPq9FR~Dw_2~3hxS_prYc6##AdWoSZ^-k)jc)LPWkErO|)ag8FZQaY} zJ7LB|k%lPw;M4lhs|&~;m4qH6R>vg){zs~pU(^uhuW=>{6xDAnp+bQSrx&K8SDufK z7%g!YbXn#?W|BCo354qcBM(*5HDn;Me9}uuk&8*XGnB-AC7FChR8&~_J->44v)}ZM zsa#hR^A`OZ{oOm5?*qdY5d$)MEN@Y^Y;8(8A{ymTD39NbClG+!l}~fv~~B3I=k9)uxlDApMA3GDyDnh#V#dho3YjQ5J>>Qlc^j+zHd{ zVGnAPOPZFMfJv$preeyFY_(Wa?xZAlNlHrkh1?THIcP#nM@5y-_Z_!sl*7Mr$}Z&6 zIdjGQb~2szk3Bqxkuw^iTei;FDSgYVArt+@B^$kT!v;VNO6pv)@`?_qU8taLyY|qM zT*CXzB)51w*xX?G9FySmIUF0k_+%?1u0MJmIWsNU3A)Nb{1i|knnUEq7$;?vrI6*y z8jerHqdvmVS z1R7wUf&kdYF`+P^{(f<;Y8KKP`I~p@etru{$t9UNG#*(TOV?&7{#o79BKt1*^qIvJ zwVdlIWLS~j6|T2S^(>>swUtvzNrTm8F-=lcb%M@K0WfgPq^tT)wZ5CrNO^`#7%90| zUcv$l#G^_xTVc;=d&z>mKdQPu&?5thDd3EeqyUWGpM||W1?*MZGPR<#3mhv{uNK`o zVjv#4%G%Txa_tnBio`(X{geHeQH7;TuT%L~9L~VE;)umdw{CzndWb)!>I0xlgA&F9 z6X$fe9`EnMcuIw`$*BbBTA1J@NQ8dgzB#Gd!v0BVp(JT3`aZz6jr}t8HyY=}g!CP6 zH~>c-jKTb|2`24WQRvcMjnVsMR{8$S*je#!sj*AS2 zG|FZ3i6_WF`slPKA}G@sm}S)ZN8%stJ~PtXl1Eu82+_? zq?#e!@aXz?|FodVP3OB{?GbC_s}7 zzu{cShQ>`>&`0VYIRZl61=HMS%!tjpdDT;XoU{rR=9WwGZKdJJWLFQ`zqddk`gG2Q zYl6mYqB$h?+cIdbZJnQj)#)jiF=K;;8I*tJ zb-7NlSQ?EPk|T#4_;MsibKvjr320?f@)BiEJK2-OcPlJ>+pHGrwbf#6U%=8UwpmQt z>f^a>`p^aW+66VVx$ND=nO)QZPs5hkzb3Nd$u={)l`@bCaaA{&R9DOURKWYcGmo&> zAIjqR5QWb3k4f@j>Vw%n;o0GKDjerOtr8h(Wv*T0I}*yoInbu%>J(0}5Mg@6=&nd) zvsCzA&g>{KI-FT{_~xo_3L0>})S11R>+6ZBDB66)$SP={g&u8^Q<-QsGgtI>7)K}6 zkz^S zRHFq0;l5!N#=x>`iyasnmijX_PtanWV&l;7AQe+jw6O*?o1b zVm+tp^x}}>N!qqn&m+=XtCl&(?bmy!89LRtmSB4M@MzqK`-S-dx|4m;HCjG<(#fg6 zFv}DAx&>F^zP(oAP z@fx_zy9X_y+6ToO>e{Ux=G2_JTa9(gW~1|$1T7`hGa;Cn{o^H(H17#| z?yuH`s7Q;@!Kl#J(dpDFnooVyQfJceXN#6TZbEK8P=Y|VdeoARYK~qE!?yUb@vQ#6 z8wx*ug9C&(uT}qqgudNo9HKmLg0+$!fZdC9&(dEl{J8LDbRCNb2Xb^2_2N$yr(ay! zWU5$8a}?Ieru0;`TBr;dbjP+`@s}5i>#pOcuL{?+sBoGiF9R5HioKlyk6rWnhj=TOiG?9Up<8Oa#eDj zeraJzeNHi`3>P1DAI)6Rz{t7t_@w5t9-!Rs>tU|WVYE3+ADg4x7BQhWXRKWQg~kAH zm7$(=^yEIA{B+fze;_-L9{p>T^LB>{aWNnQi`%=z%ZS{rf)<_?)m-w}M$H-rZ)Bl_ z-o5lGpeT59%$VICzH-BD@5B0T!|o@Gj*)$u#q+H-3cKWsq|;z(`#eTTd4{^V6_Ai1 zyM4h0QjtE4u_RBDw$FoUrd>W^dZ)Lv?fn`V$$_%4#Z`OdeFmyA)I3tzU%=kCZZKy_ zi&Z34y~K5R!&utLm7s*$H0sectRRfz`t+&qhrf!BM}6Di%y4NRT@Qk8m+pY#5Ezhz zF-wgn(BmO_2^-KM<=9{%cd!O72}qs{BafY+uEFC6SQ}?HkvcI&VcnH=M%qb5=*;Hl zOB(x#Qh#t2kXHOTfqs*qPf8Sne-M-UTyVlcgR^Ge@Q*o=@3YXrw{BUhWUy+2W|cff zHiZ^-s;5%yXQM9m>)Os7wM12FDw8X!mLy|UP~~`TKm~ySmC+e`*(Y$j0etrP61|e8 zt+no&*1_$?9za?%`MgVgQuMTPrrnO!=b6X0s}^}KsD6}vk-|;c@Cyxm+Gq2+|8BJB z%;}K3)Wx`Onw7%UbbtE&4~_zaD^2B0X*B8bGgwTru%4?;C~v{=p9ajTHQZA&3E`K9 zUG*neUGXg0(MmBoIzn{97yxX0My$1PdA7dHd}u^ov{~g3+acwv@{0I&_{V1#+Sg(l z^HGocM+`dB_?NlKm|ST=x)#JaMa&oFE)r;vk^+hqx`|S%Y0>zv5$PhPG^IR+<D3_F z2BC~i>nN+Gi;F~y9?d#1%_0V{xecZonU)G(-3=i_a2N1*wLrj~iir3XY0?KHfNDC&V`TB5qbV0kyv<)Ay!K9p!sBJIXvt*XlaFn-1 zsa!6N(%mYHtaPrzb#o8$=wrUcAV$RabBM+EJlSwEO%CS*s{mluj7e{mEqTIr* z2RwGMTRIH@voRAaif(U|)2-j8Vx``#9^9m`Bm$AnfqMio$K=1VH~Z^pHuB&M+C+>B zrS02c&$d9lnaN8w!mC5ChK)K|XPmE3r=Z0vL)gF`oV>inPI|XDHq%saK-b=HwwBUO zAJ3?RF1Bzc8-L>AJ9XZymk#b6=pOCAv>-?Zj%*455lnAE$x?0pV>A0PikqsCPxMW{NcxmE_m_Okz^$6wn; zu9!j$js4cQ-nA$WCmw^=kX85+jZXFQXX6df9rg2>jr|3Y;d-kdjXY*-plMgn7Hcw# z!Qu%pifJIxSmf$bs*#x`*QmU4EJ1WbPz8r&sJ^t4WsytCm1)+Jt^K$EM9Qx9pojun z->q{?JF$C;Ji`I*cw$I{SBnb*xxk+~l>&|mOO2>Ov$g@of-`2^Omw=D-(Jtt^!MsU z1Z}!tEt`49z0_Cl&;#MIt+IjbG8?y*MEVZkr}LAL7m)h!sL8TCQ*tJgj0STYH-F0C$ND5ghKgYYn5LuBjc>8pPpbQrl(8NX)%4x*83D zV)aWNC6CclYxNSB`g5p^utcKGT@BT;Y>So9R>x*;CtS8I=fx9uE|p-eGagA3wvO1I z)BJd)<0}1r%CU9O?yhaOk%<2!c4e0he}VI0j}V!_y-Q+Egg4)sle$+}BRxNHl$hQK z-o@vm0-ebKBGn;@6gN@i3Buw~lUxpvWmQ^M`BPa|TW9#m=`hak8ktri?@cW`6g9Q` zV(7#15!o#&d2r8Uo$f?8>gAqdZFuOwrOpzOHLVO0onpLpwyBY z-n%BwH+iXa^BPQ<<|S={TNpok4xaY)zU%YXd^4R*2m%H6OpvszQ|JQd*(Hu(Mv={> zKRf_7yykb=s_(b2fFs_)CHx5bzyt%(A^mEw1 z+%Oi$lP?lm7A05v0iC()tlFAPw9Eg+DM!>Tu*}P3ESHs3o8y!yf0vS#{Yx{minw~- zrV}`K;;rINBROPW{k#D@;qH8Pfy_%yU6`sLVomzFY%p2h?IGIsT1yfNtZYhA8+S6B zK5d*K+MY9f^=nL2)_} z81-^0iI)x0cuZt(CU=-ieQpTir%`{)w>i0ZRC|BWwZ(sVI357ttoPVo08s%tn*LW& z0{e;-uvCBbY!@q*Jc*U_R5@r&*Tbb%UVv$4{Q0hf>fuCq(WfpRV?!HB{(*-2Ie7P@ z1)0+vE@E`Y{(+;h9vt9DHXRU5&EzmOicYgw-(pDJVP4d#s?2k_!rr=)M(92+#}DA-)BQ<7t=>lklog;8a)c>z z7FyTbcW$fTnZ$4lJ>HlpH_;{6bg%-Wc)FB}lG}!rU~xB&m8eFkTqpQlB)3xeH6Pg0 z0b?0Gs=8@PW5%%)AgDo&jvhS(R%3u-=nt`WM*^{LKIOhbAOkp`33}pTGGc^HO@E(4 zWojv&TjT~b70YbZQahWJSobb9ws^|g&9pm22~`F5^0Z?jX8~3Qu* zB%ZtRqLX?`mfMIoo=Ckbe0U$pxJ9U}eqH*4dxr}aL8|ys9CJdW5h8~wqc?^!>E?^+ ztJ&n&S@*T?YWd*||AR-=-5vX^x_!CX`NTB+UY!GM>Z+nvQChmfkBvrMf;`EzIdOQ}ZFa3gw z#yl4w|3R3!`N!?Hs!FP3V)L-fZEf`_2UhYBy6A(Z!v1XM@M8T?xy)_8VX{`^LuFe{Uvagy(Zu1`{Za3*EZ=a7q+!RX-wm_2CmDv-X@t8Dbx3FX zy<5P>aIzm9OR!p7YyDeqoyTdMqM^3ru(}Gc#6-5IBEl15{H11%!SgT~ta{?I{%G)s?p1;;-reB(qN|-S@xeZD zk&?7KRW4gXnMKAyKDgNCyFd`t=;UIkS?XK7HCwF?#Yvk?i-tz_W1?S-L5zA zC1|WD5#vnU+F{nZcCmGwU+Jd{+1fccZYW2#%o%f7HDG6hYhisu>yb}ldE1PJ-XE!Y zkWXz{LuBf0cSE!fYAugqcxA?TxRYM&i!c@InzP_60@|maO(HL>nHw4H0sS|exy$ko zW}jC-r?#9N!mBqja&RU8Pr3|%lyoQuX^%pNAB}}wHpun*N`|+t;(l-XL|V40Ik<@y zUd_CPqg^Npi|t{f32!Fvu=~1%TiQnEIm#3B0yE>BNkyya>B;NIJB!#wQ1|P|Oy%#g z_+mU(1STWP00DIUTA%tN+6ARVFM&6do6;>AWR4(<53-^_S1%AKnE@~$8I6N&FXv+y z3~W2@7kq%s?WO(=j;7&;Dvvmi!&6a-3!1*P`O=fc#i94&(VSYUaPzXEz9g!-{?>M( zfv~=}TW8_2;pp{_FIkJ&Fb`dVn@tQW%M$0h*r&#m_8IjgeIYTTZKuVfH1s=Zc+W1I zyCngCK6|e5*7oCem)NdA3`+T9X6Jxs{O}?F~a6f?Y)J{Ht%w&8@qFsKNi?Mb5Xlv zlHhyn-1%kHGv`*<2io_`@Nt~ldt`B;j&&7F+Xwt^zpSn)UpzdZz;iK(OTUircO%;` z2zu^6toPB<4`(oW%4*CCfVwl27N@RwHDt72pnyY~Lt7fJePBevpwFp*$$`oGfvqK% zf3!WlFL8-M{Me_t#gs*dj_5%(}lLhOuX1-hLl|7UW^0|2pc{ctPPA(zXiSX9e zmRse+&|Q(f6NfGU6)arelDLaajNbFPa#{ALcXl_`HJOkp&#tY{obC1TX2l&xwLP1& zGrNH|EFhmQm@j)j$X#C$%ifcyQrJYYrb+5LU#eq8LH>P0gr-4wwIGLRU`sC4 zedDwxO~0PTDOX_d7d1=BTzT@v!|?+6-}6Q^6yqFo=s{4Ql^SpdSRKRy**S@RcNEIV z6Px<|8P-&kskP?jf4Z6Ndqa2VS@cVa%XdRDypb%68g0ZP-%_?LUdzotl`}k_P1``orBycasSxg+3AHPG6Io!g1>8H9W9B)B;!B67Z#5_73B96YCf@CnM9=$5RuH zJ+pe5fA%-M6YQanr$nq=S;5(xxTUQA!e85|xACtm<=|Ca%Vcez?VP3Xl&EoY52v56 z>v(1Xj%)jL7Vs~&Jz4P7dOx5)!`rDa4b}ZuY-1K3P>-ga$hGN|%QcdOhsH^h-<*=F zgvPkGGA|pIERE$l`cP*!});t`T5OK=f>z{!Lo3G5fz%f4dGD{EgKh=DG}27;9TF850V^} zvJ}2@1yNjdL4=|bL7x}px8P@hM~-d`4dT*Yq^zkk7DX{)A+rRjXIL1XPMv)QUNAdX z;MSL2Dzrx-0)k2>ANRRoNXEjO2t*BPr6HL>(it7DQtLG*3+YD#5))Wea?cQU%%2qa z9A^c7E9)i|2r4eEDOSO<&td+mE&kK^GM4(0rDNKRviE3ZTD_E|0~Rk`wwQ&$&@O%B zYRN5w>+K#PuJE4HLPRAkTf_=^JqEt2>TXx^|~~wJl9kQuVg-BE2=hL%<@R?(tsadoy@DRvXszTHD+=<0M4Ri&gF= z;I~6?^MW`g>V3XR)M5K!`vYM!v>(Ka!m|8sr}y6v^KiQ%$00}4m2aeNMcWT4cdXrp z9n@0t#qV;=Zn$WRuOqctswRl0nqS_HpzX<~4nl#?V6)es0KXFT-55yUc3=R&!rXFJ4^4*4+Vx)&uSLDos*MSD@52&MUu@M}LPiErION)mHi zA~|Bz3^Ye@)p~AGoq$Ojp}``Fsp&9|2$@Smq?EjBBYr27IA5xL=tA=z>V2xk(JzI; zrP2N`ok7+`;P<*vYek7KU|-@G5yElhUN8^nRswk-^g{sUZU7IMPHc%E%-wGX!E9i< z(f?=lzZXyLLxq73#iuAhS1F|OG4>U~k9L{;?-Z6HFkGV z*-?RkM0hXgWO#dsT|QS`u}STXyx@d#jkzy30Va`*qMP5Bg_`T8q|SSytTc|r)m zSpn};u({WO%~ysO`aZs zdeEQ6K@sW8t(!Gr^UIm&CZ7BNl?YybdzVH0k{m=yDuG=<^m@F^z-um}l1lI)9;pUc z9hgt}!!)>Ya1pIh^ArHFA`{2q?1qhMWT>?`sdNp7AQ`SS{Pgz>mpmTL}2M918BRDwL=nSRL3tO?M;nUFCrI5QzSq2;^W z4c~e&Q*yMUz?UU8-az(-A3hS=esb9JK=GyH!AlEU5_Nvm;pv0BOOx@X%9(L}@os2n z*gg{)(ZiTb$(b-Cd$n-2nns_HH<^FU)IdEznRDdx`1O-;z{;L5RU9A25kl?WhMR_I z$Hg@=b%@-Hasvp9X!8z^xDB)5+uPe8(_ur+x_6j!$(*>8bjSKj1=R{7z6Q#lHF=WP zamz`BlFJ)6?9=xbCuI+26cn$|x#O_jn~V=-!i$5($>O5V78-Lt@Kh}NKJmSN(}izf(GEkgAa3{xt8UZo!(_dfW3CUw;i?w?$ zo{Y$n`2-RoyD2Dl&;z{ckQ_O$)^1L|BOnl2oErz?Iqx^Sqi;9~2gt?$Ly$42xQc*^ z{|6pp`42osLB_!OKjau269*g1|4)uVcxx}U^`;<*f)WCd85ATKGHRdo&SFt1-~$!Y zg|s09lZEhUF9h{VG;M#V>ZkYVPm&S%0-p7q0v~?-_swt4o!4o%nb+w=CP-n(xqe}h z{zuk7xVYA6-NK_2hC&?HK2sm-11VtBWQRq@fwk&1TJidg7nLbHB!O!XP5oQgT?rl; zRzjKT&(E$;AEqAxrUvq0Pf~A!xxT#)hANvKA;53vz-OjFl-E@1TotlzK^<5!T!|}; zwpdc8ezGvlWK>FxIc*WfJ@Pa2JufKD+Q1XbalL5U*zIvo!5b3V13dH#3;DkG;K@Kr z!8F6v>6eq1(}}+#LRj6UGAuJB~{4->~-eg-0$tDATtg@M5V$!wp4@Q1#+Ui!?QW1yVu=f{iMSQ$Ae18;O#@elqhk;)GhfN+pr z0xZ1x(xYZPmI85{I8}2H*@J!l#Xc@n1G(Uu?hz258m&w%hx5w|f;v*JG%) zy-1$QV6zL&tn=0VUhm$nX01@K(y8P54eLUqxw+kJu@~@KMLQ)M1qXQi)5LoJvE*Dq zb)u4(l9W6-Ju@*i_TV|cWhqyoSR$)L{U5N42+fg3*y(%=&XDgMPFz&aO<9?4s)Ji_ zmQxfl`i{UVwHoDUAOMSBcL5>Yr^ND2ae=>V%;Hr_DJ^4QrQ`KqO=xv_M zEi@(?>I_Us>kyU63NYHLqwu$;l>fv!LQV?>y zl!PerR)%=$WLspc0rLg5mH4zPWRoP(b7&baQ_EdZ|k7P)&g? z8Tvgjr#zfKQ#q-wVNUtT)R=Af4_kQkn$spQBJhV?=^oz@13Cz(#J+EPqNw^U=N{ z|5<>HODS)tN4CqF(O}LsjOZEztp}B&5%g?)p2(QVW9^1$NI4(Q_tv(36#SptHqKq2 zy%mrig=uk4dq8VNM^1f%+p4a5i0=iY*yo?v8@J(iEqB9a_`eHX8361=d_X<<`hi-@(9#~?7VB}@CX_pw-5r{GOExVW-oN-o<=qBkeDc-K^j5 zav9cdHRl;=Lyk;SBaqR5lQY@SPWFN4&@xsEbt{g_n`OvR+sXazuxYDL{5O<$N~AxE`|qwzw=t`Ylb9*r=}(}wVHJR_*Y(8i)a72Q+pyKy#i-QUeefE8 zTL=HD#_tc~rQH>#D?OCjdf+fU{8e3+7$B1z z%Lpj+N)$~)(?3MjI}Evyd@hBQ{(!PY8a1K77Wy~Y+6*hz*m$VeKTnNLJIEkZ`u7vM zPX9RNU9~bDEJaBXmLw*iI+GAWH8Q;}%5Q2Yz&#NYEAHJk1XMcWAYC|D(o{Hs$%0cg z!w7Oa1Q#LmT+qPdCO6#AXAcUCm8F-a@d+@16L4RceVuo2?^X)nz{&4`U>wj1(kB~l zJ&C8d$cCX!F3pE_vzJvltIoT#qN)*V3mh+ExW{A$`76u5wO5PHW~9L=Xk_eA<+w<~ z&&4>0A z@Cque9fE=ShjyY^j;iQ^hY_fst_C=s;}yS*3l>^+Cv0J_{&l@9mNZLr{abyQ+RrVw zG_4uT_gP4}>>Qyq?MbnIwF{+LZr!3U{&#qRmAo@~rk#d96tbIUeto1}z<6sEF-6jR zc17=XEor3O=E?R^Iw!X9_k?xs`jx;4yftx40*_y8WRHmMhF{f?ox z^OkKM?KFnE2++KtqW{X){FJ{#&X&AYS0S=z;Vwd6?+jPH)%)5A?_BBO1_(uGi1aYd z<**NXp{7{SfrU#co)tthKN?xFy@@Ldvz3we+!7FyOaoLc*7gk=Y4eCGNzzyMBkGfx zCc2)sm zBVscMg4~Zx^}#dXHPW5b138UZvj(z8@(I-wLCD9Zb}<>vH{Rc2>sAX3JVc820<=?*cU~4#V~!unUE0uc+#4X5~8a{lo7uuLrnrv zCuksJDTt-@P&9E zq4dsc@EWmasQz2%1N@e5A6Mm7esF`r8|Id5A8zo1aYCuL2B{}pGZ{!v_yYnO5ax~= zRP%$TxntfstGr?!>-BFk4n|OT13CV_<=N*Plvlhb55+II(HvwB#V3p&oUEm1O4*^H-Cv4X-*v zuXD#+kRT8di0}k9V;-*tpr7+^@CLU+I}qK7t^_utTj3n7Cl|q5!5p0@7vWkd&CY=~ zF_<5L?LyPueytE!3+qI*f;+Mr@$Z+X0?JSvNY^`oZS|tr=!JE{i|PBI(TRfaazHq;86g<4@6!yXF``_KP11P}$gy;R)Zy+h zgxX>X*bF?|4xMWwW*}uCVk2QAA`N1$COy7%{|Ws{Ed#AZn?q;LhB%GFJlp&i2Ed#F zav6zi)I*2nHWuS2i0o&j(7|QShSNZ0&PLF{WY+tofyCTPI7t(OiQ|VzguzVlYXVW) z7@XrcOd=E5k z)Q%%yDWeWgAvhU*b{b)}7ZHvm%82`DK$uTZTo64eerTxegv7Z@g3m^Y9Ty}!E@EOp z-1!6E;qDDXTb7>nlijXDl6TMe*A|#j^#?C0BaT5*TWKMh+2leQ4!U9iZbW|$^Mxgn zBqW?r6cyDZrSZDzFHxBeEP@!zm0$nGY$6sEL$Y%Iu7?B{{6Oi2n#G354t${;>=EPv zs+Z5*ABp{<9{dh=$Jy79Z_fk-zbGoT+z%Auoj@S&guLJlGRA&G?c?WNBE)|44(baY8vcfx_gXM%e~zZ-ia%V%kL~(Eelid*%w|m7^X^C;0vn;NkLcyl-#zOl^ zB`?I&hgFO|z2YT&CML&4Z<@cZKdyfkgexeXDLs+TB_F`l;N8E^&tjH?gJJa3G?tTL zbP@Tb|c+=kxf)Xr98#o*8T2_JPW?S5KtSzc^6u{QovRbl@>F)v*dE8AaXO>@| z9WCWeaN58bz!?ZO&^DJFh#ClRI_k}Avj79z+?q=AS+893S>0vSQyLhE<-{uJO1@gE z+IkxggCYMTe+5m3TG)q_nF8QB!M{lZ18p zP0W<hRCo?!v{$+RwivR6B=Q7!| z$*YlT*w~0QF^ZRwL(%^34r_~bfSq9ooCD^-JO%I!re?xz8oqryBQqMNQj2jVzj#*_ z%!dtCDQa$nQ#8<@YYOFjJsl~IbyGmm=p*46rcMa;w?rutf3|Ck>N}hj5t|hUuUcyr zJdyTcxV`^-N>{LU2`&EgCFB)c096qZ8I4Spl>KQZ-`Hi-pXFBn56+i2^7uXxH@~GKk-$3=mYU3J#TW*UFJ-BWBIy{@njV14}!A@@*-$8*ljQKbjcL z*emjt_=~_z+e0~u9@lg_TJ9nMOdIMCZt3QCtjpka#Vwm+wJippFk&djE1d1O_C!*c zO%_7%$>NdFDY{MCL)t^!W9}^jwIIPq1R$gjcz*A_SUkxHI^lA!&U$zOz~9*RH<V*CD$lfgxS%aV5geh>`PUITs=ODFF{1;eN_Lc9G&&x$RfOnOXn0fyEpjFDg zWWK=bUOg_B#H$ zPme(eK0ajZd5qY^h3Oj+a445F0xBtVa(@&PKN6^UL*gNY@r@r(9B?Tqfg7H}he_|D zBEc`49i)58dB?*kJ`p2MMuI-_)X;n5($dbBhBKlL~yXtx?=FW8=5$Y~7-&1zX{dC{4!|Uy z5*dF$Oum^U6#;ik!0XW)^pqmi>5#43*qm-$kz9jU`h3H#sqs8`Ea)we`MNN!iL{jO zW-6wqpP8W#q)sMN1Zw=uwX2fzhj#o7=tnGYJ`1#1tW_!#*_WFzmX?;53Xh05u5U0u zs=H!=6S=e=s@!R1$ojL+B9@f8HzXHP zX{DG=IL6A&ypVI9NJUbqK^AAKx>&SSRV{%DNKK$Bg5I`~n+p|HN|Ko-$Bt*szXh*5 z9uzm4+OZOi>(QM;o!07T74hy88V)CkA7G0xm-|b-Hi8`wfYnM8vthU(Rr;%UR%ONM zQ8yWH6i4;@r(2h>MQe(wO(=gpo8~X~_I?;jJn`-$G?Q4@Cq+jHZw9E(0~I>to3)dU z*dM)Y!W0S_F+TOY*}IezCa^XcCAxw`CuizARfn_8rRbnf#Ml00GyybJF#9MI<(H~ z6@!zP)rfI~FH&old^sSYhG753&<`lCXzaGHZ^^6}W#NrG?Wq`@gsV3y6C%b(m@!>W zH}Iiit-r-SPkWDKsY=fJ_&c7976C8G9IyG4Wx8KTRdf{aYqg=BB zC`cw$YMsN=K72=pJ&Vxh1MibR&wq_5HP{qPhWL88x+W(cco<;>-KtK?`OtUtUR2SP z;+ayxOBJc1e!dmf&q(zcQfjboQMTWGFlq?B1{e=VC!T1JH`!l|mno}kFFq4lNJ`1_ z;s9wUEv^d3jdufE{jewLye~jre2wgYvr-nr8I-h0_#dwpXfmvw@1nGl91&;Jeb{Ly zQd2EanGmh&3Cq(8El){L6$@*FsqjJN*Je0lkW~I6bsAlTX1#{Va+5E2?U{d-Gt;qs zx08wRZaJ#d)eqA;RIbjw`E;4Q?N12!d=rbAo8(}{66MOdl)}AcDwf*Xp8o<|3{2p) zer>8YbPbK|t^|jn?5i8-sm5jmda!0tP$iZN{Sh=2%x2w*zm$}GF4U%#5|xY*&5Exk zcm*3%OJb^-RnGfk_Qdi2___Z@>D!wH{J$7`3!u1yu5B;`3mzc226uOj;2PXrgS*4U z-ED9ZG&lrzAKW3hyAJO1!~1^!?!Q%AwOch)&pj>op6)tNpQ*Xs=Umf&-U~n5RhF8| zdv>iWfbgcIHSPDPEpHVVC5Nj-F7;@Y$z=xO8OT4UDd7_VrU|mlM#P5V>Wvd7vMwEM z7d1Vgzf6?mD$I?#Jp#Ggf{mlk#)ZT0#X}`v&}{k&S22e2GbG3o?3#sJ%@v=m@GB}! zdF4kVvlAesX(KNnZ{qCRgw0gCWheiI1eOkF9-{~(mwacPt z`O2j!^|z&1D*KvRy@P3@&8o`oPDh)y^~)|Jb-|A+IE=PUukWO^EF!wPpYrK<^VNdK z7OK0|>I`)?d($$_Air8IGk7|6&@S>~hbeCm*hTd~cX}|`faVVCUb(1^i*a$@Nhx9T zvd*=STuiebx3^ng;LLj?8Pz+m{w~qbSfMz+OoCZ>1eGgI$eix8rg2ka#@`$AY@=}y z%U%RzxOCd8PJP&PE>GQH#dyp9}r**e!1Smy#j+)ei;1`q}+@5Y-TODyQOgA`BPwX3Jw-c)W*rH)_YkiFm zi_bh%W2ewD!D1aaH98XjOMR6bS$MLLcCl@eg6z!zH_`?CP}(03ZI7H=8vNL6j5OB; zl)N=i4wwVxL-`fqs7u)^>hluU*EIZ*BFihtsx`<=nzKQ8)su?u0g=t#kMJ0^^G1$l zKeu1kK(zc)rYURrDd~BFRPC_Iqrc66b37v3IQit&tX@a!{iQ|g$Gk9p{ds>DF z{TA^7=P0X3GSd*ke;|nj!(iT7Ayz87kg<8*yflF**HXv1-%73wLG<-}D2UrX^K(nP zvkj$&*4gmC(16fiqunM% z`eQ~`uy!p$!XlzzV>9#z`GnLdgCJiO{&Einz-?%79fmwF@EymsWIl#dw2HWx+2{u#f#GoU}j(4-&99PQIe67m~i?uY85)ziRJPGi7F4WJ&f)- zH5`k-r;5UL2W=Eu_gxu&J!3Ax7m^DS8dQ6xGI{dRJ7cd`a(V@6`p=f-$5WHp&m84| z$mSVQXVTHfg|_Vlf`2C6nj#!(l7%$`pLUp*;qw~q<&S?&AD1etKh@vfw0d266g7Az zv{%%AVFE=MTcj2j=N8g98PHHS8t+G^H}k=1O%a=0rp{LXQl70pnePR4~m|x}?6cpqCjwMC~LO_jPN8W1)s@ zXSdQpD)}GwYdqKQ`D*I??$-P`CQS^8-{X6%>hKc_K2`G;G6B7Epu$>!FV}oN`aYcg zMz7^}L6Jw0YWINhr0~ov4r7?reBz-cor|*QbvNGz6)}$3ZC{=r1GQP~?mq6A5(c>= z^60qBj*g<7Y9;;#Mbt2ByKa`6dJerSb~69AgPHs9(91|R>L-`%t&xR-7S0OlA!(-! zU>_-M%NX*Q`pa=s@Df3{tarks24OHnt;Hf7xjfM{Xk|vl`tUzi$`aN7CuJn@4xA*6h`5 zP%@1ybml|LqMmrDqz&a{52-11DzXZK3*y1GYjTd#M4=b6m*{afz6eTm5c5t35T)PbO~PGnE}VBThf?E&zxgIuzvc8Voa+GeT}8okHo zqjcuZ@PeE6J|-WTdgNRF8w34P+Nc*km44n`dJ&S> zNKu#yFL1LSoMG|t%W`4QGdsA9FgQU+FdMZiIQKwsJ-)T2uqf#>ke{_jG=2DtV0rp2 zOm0wT)SQB@dT8hLfS2>)#4Q2*3uCI{B<17`(8`kvlPI0EOz9q8CdIMG2yzk_tbyW* z>-yzadrkU4UM`nIuB#|jjv*BFC-1H&Ss_iTr6~U{cbLd0UGAG=E7@o*RL|XM9LodK zVRDYA3iJ}!-df|4`&?%gE%nx1Tu;)ELbJfB3Hvk@%WECrT@q)rY4Hw*G&`Hhz5Xryuu zo$p6&`do`2H5(EPP&)Sebec&e$=R>~dFYaoS&yuyIFjVH}?9aqJt1*P!>Y?PN{ zeltZsWii48Eh7$8A3745VpKM1Q4^5LwJ*B~Dhb=)p=X#u@oNNei&9W>i@-p;%#_8w z7(gV~a_H*YU9W=-2wb3;f4yhxFj2q;%^4();Mom0r{L)ur{I~vLDhd8$R8dCYGkVI zhGe8)Ke8yCoLOmFnsup`CYq`R$jdtH~}9ql$-(m%Qes-!DEj!uV13T+5YS_yX^7{#+g(@3 zZI++N5}KP~*ADMFx5l*PE42_=L+8SesgRUWrH--x93{s~ISqa3{MSuMM){kdbMvMa z#td01YBvN$9gqL>xAUBk5cz9*1Fme7$1oz9o83)3!qJVGKF^P|v`T>4*$s;tWh*~= z6j9~m2V+4BW_&+8^=o=C3&E;cY8CXECvgQ~y==;&JerX1U1ed(^#>iYC?f47S(H#D zOvDB4f;mNz z%0Yos7<%J{>EpdB{Rsd9bhCS7Lu3DY@_?>~0dJ2GH)lvmq+t#Zn}F`Y2AMm;hU;E~ zU6ZXFA7;Dx*hL2#vB(G3_(mzJ{_Q|&^e^QS36cWPfh$AHR4`>97x=aKdhG)!M~Hqc zwSWkgsXhd#;s#xhnp!qz53LkJYf!WrQi?p9l&<01N2}0hZfdWb@t3F}hIVL2Z?mt|R{SAubgDJ{roqecO|Fd5Tm|>?%@w zrZMa5fuDz1x!4T{!yjY~0c(HM1A)CPFf*BH=uhOm22iqT5!kN++=gIehlFdPPBBwe2 z`742eyQ49{f>iMeDwExqeR(H9=#ONAmO(){db1arj2-!ro8a{g4=m4*MWru`8X=w# zaa+rYb?_o}M^vB2nDf~o`Z%NV=%x>CY?Gu8mI0K3!)Lt>CVL1G#`Je43QG~Dy-4W3 z^c&+WMWIA%(Be$_`nmxIw_03!c6zCrhMR3%A< zaIpf$`yzo5+Ed>Zi!RniWM#+f+9rP0_qioZP^of}o0TpGCW*h(ZxF5GP$XJ?Wn>Wv z)ggm7uZNn0lvH_?y8bkut;!N|@|;-sgVX`*>ukt*e5~X*TE1S%Ano7dqQkq=+9K`3 zWch!96EZcms*w6&N)86xCbH5)6dPW(-ips#B0LFYr?smbWGQ>7eNA>hyzoDN-Xg5$ zsN%?gtdh?P&dxh#Lp~eHe`{!dIpdvlMOqauW0&aI_2jcWAV1>R%Ao2c_OYX7+KhA0 zo93Pdp>8gRk@lWIvFvYf3}o)V{%eSPwX_TYdYrR9pR71*&p5ys(?S^;^6!4I<$Ylg zClygdtP=WpEQ0`EK^{bh>uvkL}? zf8{@7MEAWg3azmBl7H@evOPPR`7##r%|ISnsl39mB z4PZ_%^Z=ZyzYcR9e!3|%0NDl|U^0MC>H2+io!rE}{EBt#?d@L7#C+*vDvD@E+Km$y z>e#G@4(K`maz_Le^2-CRv&!%FK;1+??+ey3b%A~9jm6R$&{WIAt@{YQIQx>|Pv{p)#=;Wk+VX!hO`2+l7B3UW`mgX>`G1%FA40QU_o@x%$X8*7 zfM*MgPWwJ~?Z;}da<{;H!mc3Kc)LgEe76;`x-o$Kz5BzQQ1|JSf5rh6xy+ ziD??T#^bM`q#?`t6~;q`-~k)xH;$p&B{R3CA~$Eig!v*!j^s1j5eel%MFyuji9pT~ z{-cxd-i3l+|92d*(A7IZ^cClKwB+Z%)Zo}Xaz$72-W7b za9h>2`%3=p>jS}*4cP+QbEu!tVodP^ASvoS=E9IP_&A5-uF!SI~!aFch^N8 zi4k(rV9?F?iz@zxRDN5fG3_JAysjlL$4h6`#uZLeZylbiGr|3Ag zX>_{cd~M28pc+LxZNxua**rbJ61~S>6&HDF_Gs8Uu@Xa54Y1i~L3OWBDty_|Aks1^%$!(0NRwc(Bw{LRKU|_)Ib=7EONs@E$9X znQueHwWINcsnW>ZiAO5VO2zv5=V~o5`Wwq?SZm>zf-?Jr{(CpU=n_DlDcQ+n^CitH z11;V>>_ZDQ`Mh&@f3Jc87>J)g<3=sOs2aDhkLbi}Fxu*=Ji|tM@*ot(;_;8w8)uIF z^`sJQ^3{GSt{8pDm%=>6ZoFA7a=|V`tMVigi_opVguHS)l|ea%aYP-wvSSTjLvCh1 z-xAH{`+o6Vr^ehLyU}%QD>ck?eq1^amr{d^T4FN-=zp)DS~-y&Q-Dj zaUPkOuy?opsOVm{2a(7xrPi4@@Je^IbuNolyEQ}>=4L1h^rmKw_q@IDCIcsecqMrp z@@tQkbGn`911~~%+JH2+s>1z`Dl$SW)sRS4nRYk`4wdk}T@-s|W6Z3?V|*6WkfZBRrIo!w-G)C5~B#Etq6{ z+pvP8Q?<7>1|2Knx-%Vwe}BM^iVtftNIO~;F5wNFtXx}7_yCG_5*IPbg(0PI%KFs! zcc}QvKeRYvLU_UQ(SHo&n8fPBYs7B?=rYLZAbQ)eyWxv2(IfjAUAO6B?*)e<1{SFP zK@dx;lgfmm9bp|!i}jz5LXD`(8ICkU*Y&|>4k-Vo&}s2=S_fT6%>X~<1%|xNCh}&y zIqeFgo8n}_5Fov>bd+<-SN?#DFugSL=7#ZdhUiehjel}LjIXc+e)s8g{4(^Ko*4eJ zwK_dV$;EN5jlB+Cj}@11|2Vef3He`}2Z7O=7R=!e@ zNgh-8-@SP$m8l)+UG1)0mgK7j6bObS7XY}vi{x{!n zV>)=5LVlg%M!`XQeIEbTFyCW0Oiu8ph&2y!iph80>vq_5{i7JwYZg}AD@S{5)`PiXa7DzJV%dbCedtG z-JgSVS5I?!FxjxxBJtbb?Xo~9|0wF48pNq$bZAn|^?hMyQ=wTkvha0@?Jw?!(->#= zRkH!okCksT<3zVb%5sl`*RNb?#M+&%1u?bCKg8hL8gD2dTw`gfRJJJ_2=X}+1(UN9 ze9t$Enz2TY56A_@t)OQj$BciD+uk24z1J-6&*4s**1A+~D_GGsDvaDg3`m|#W4uxg z{Q7y&>HQ3nHw7(C64<;b@0^3GOhXH{I$$`7>UHC)*>^7~Iux$KJ(23k1*Ocx0HND0bk-=;wP-o*mW=u&xcyUk>{HVeoEOL;o?Npba z!9Pk$EGrncnSMQ{e9DjDZk>CfV#e_BwJ1@%Vnxdsh61Gr;rzAT$_%qk}7YY+ag zo-jX7>=c=gEBng!1&TqShd!lQy}SVl&a6`}h{WA}x#8wob1PSFUq^YULx zov)PhDU5gQ^Y>1k{#$ROjh`-*X&U=$@0(R}r_?MWl;Q$ous ze0>!pQjgndU;e9q76HqsTZ0Exs?n7&311&m%A)0XH-6n#pL|4X!Y|YD>v90d*62P) z2SD8x)lL2?bBZs;PQjPaG(tJ@bJ-uE3QhU&ouXPWqr_`r#=NMyAoILWV{EMau z7>O7W?+^@Apu|yG*PaxA(y-3~3R&?__Caj=?NiZbB$zTZ;ksu%J1v{zqi_3dBc$6KKfBQp7Xj^4v+ymMwcj*tp> zorsP>$mQDS6ectO*w`;0!!kO*lwQBD4|6<7#6 zjB;|lwEuQJ%Z_I?=VzgvQssJZo+|?Z%Ev-vTalqbWrj6hZuH3?ehy8)3B3=hzA|wB ziY>#iRVUR^4dALkk^QUi9>53tZ*U1p&6q~`4V2zsCC#69#Lsh-=2v~JP1-qt-wUn# z8Z`scwZ{sTiRVC@Y|^4@=?bInN%;Nr5ZP@rpY3xwExY_QKbCI7d~_Xh!ZgYemnm70 z&R>vxN_p(Up#uL zD2{_&!;g~;CI(DNP;Nn@KUR|}G5yRX(SvaR<|WQsh?J6QC8ff5Um}~d{WT8sA5=*G zM3%<;g(H(rPA!RsUHSr;Qc<=qDsGU-L^-PVwfg;+MI2W9FVbHm>0g)FU4%)3pWqVt zm<5GNs->7=_f^!}hI2O1=}c^N5t7srvy)H~@a9Q1Jj8ssx)Boxhvn6&!w&mc!$|_*yp;>pwc9u~6L3Tz%YZzxWKd*;)>dr-R1UL~QIN*uR%C(oAgX zarT-p+7x z!Nf$-5!)0J1R7xRy6Em|ZZx=MM?->~M6dDsyy9yN0cm1vT_$+9TZ(a8%~KYEm@n-= z<6!%t0=e;I0^@r{ICzsJD0eaDw}f(1_(O3KaFgDd?FU){kU#>s23FriG&{$4t{>K- z-$$OkGdm9S>_nKwvGato5m+mLwt-rUey1&{PfD!BzY(uVtqpWU!7K^+ro%S$`tl>% z(L?2;t`)d;3GN0iqS#^iroV5H>L5aF(Cnyv2X^xH%pqs$+X^IrX?TKi{kRqlqYb_G z@BN8DhdEpWF#AIwyeCg0=jS-bpI?k**yxVG!fx{$T*QwrWQNrj@P;ziV7#vd!`34RScLYVA z1fLCv%330g&iZS2SMdCJ&wE9Ntuwc$>NHd4awk(7QULawsj8E#FWi8JtZX%7CN3gw zupz4WFq<(?IJ$Th5^b_VrLI7EgN7t+(N|?9O{Fvu38^pNdNAW~5G6j7J!^gcPQ-v9 zdemZG2g?}tQBR*?E8*MoseMY&4~Y*!c!Fe0G=p`1o!D(IW3!(ka;# zH>B<+(0c*&-rnAeiyivqY`bhpP6fr!w6NDiw-F1snBNra%*Di1eaIl|x6+My)1BE^ zU&3Ky2PKLKFnq<{e@nkB zLoAPMMP4+c%4QsIn4ZTW--T0C5+(cLrW<<5?GPt17#ohsQ9EgWFi`Yvbex}iw?h_c z3sGTkq=_div@|uZiPC6Nw5Y`}JBNGP_y}dihInr4EoYgkQa(m(;A4CsA&Wf?P$SDI zyGCaNglI8u@9ri}(cXpWG~a%UmQmJSS>RiwmH#a;GJz+HWwqJ|zMQblx-IRtSekr)R{y?1?=^!K&j1Ywat~94tDH-^6O3|7FS3bY+-;O|k!{4YKA3r3+pP zJnH=3_dbdAAj}SG^QbQvl%(#)Mi?PmoF)68fts$LRCc0v-$^Mnro&IerXwrRC$NUU zOz(Z9HWa9UfEKt=&n~^4wq3lpe}(E2Gzoh)H#Sbl%X6P=?unf=nKFfJ*=-?^ZtPqs zm6)kqo%i>?w=FQSo{aa3Ey0c$VBAL7%20I9$hiIj9jDDEV^qSCLU&}Ul)---P8HXtE}~BW7vsrP7Qk&B=S!!f*j&o6l+7IQ@aHK*{wr+i;f=++p8Iz*wA}ePD3o!>5 zQ>XWtS-6>>Kqu#s+KDkml8*fJ29(8oH zlsPF|Ei0{i=yFu}y5WjMZSEVntWvgjZob+Ib;Ly*4|lmCH6+G+H@o&k?lM^}{(RyC7AJbmo_ZcXjPo}<^+l51=D|XL&{&jy?wrGo_3t_j8F}v~`-ezLX z91!NP>2Zr#7!%;V+Ips%nhcnF*%SQg)S#mL;B)BDdf5JFG5*txyuI_iZwG}^noG6M z`cDXFK>Lc%F>jlx)_C(@N?{Vsc0hUd$MwWIbo;3HHw;0@@?YDV6&-=r-Gvyl+b6y` zLeX-1&diqQ2shjiqz7{oa$2~E(|uBwpRx2~A-kO9ds=j7_dSO`*Ji?uDXzS3S1GhH zo4AOGn|BjJD7pq=?U}0E>J(~|Hu5d4v=&Cv*|IiH2=Dhs>3_jb4el)M9094RM~+Zs zGjscmzWIZ`rbhGP({*!P++@s#)ZdiB?>-1>lln&u>>^3VgXGb2E(nd%*sEW>Nd)xa zJPx607Ju@_*He!LCG$u)h-Pw8;E0CVO_i-C#bB&*dnq?w1q6J*)@jV-ad0{u&rd^w z4O- z`fy#s8~1$f4GP=@kvy{uybK###>D8c;F83p58jN)x|voSbtpkrNP){{_V&YC`_bC< zT%Wm|-)cXFZ-+hIWwK)|HbbUI_Sl~ktuNLsAw3kz!^hkg-lNeGcSDFSc{{-s$eUOf zU01VIXiJ`*c9$cdL@=>}0yW#}ZRhdE$II`lb4-MiELaM1Fu@oJy z!43hcMzc!$oYzv-Gx`?JOVPmCQe_Nyq{Y|F3ue`)Af9k z>wn!O7URBDxMn<=LXf_9h3g4lHtHFm)sqP6Uf4e$x}=@o$^mXU#&Puy2KAA!whY9g zH}{EunmFA1ZX5$`xV7CQDn@=DKP!BT(HQc%ZzTJ1_OKOE9njXQ-r#U|!gAGFXk$Wx zO@ddw-Va7z2~V%U%`Us8*pP|#*c>L`C3i6FnjK@Hd(D%uNoNz2Eu76Y(j?@s>teYu zu*I6xUbpwr7YV4>I0-h+zP(?i~AIrr^sO=4-&@v(ihq4pT{! zP5fK&zYHff1Nk!@O@?p`co(llKrJnw8<+&k>zwyNPo@IR+THVn6rLA11k$TyXhEn< zjh+ds=TMZ+6lu=-ahx>-3vPDK4xqlm#?$pg_mfohA3)Rxhs`t6XVb}(_pDlfS|vHY zk5A#Sr~bV6^0-$*(JenD=*vez0iM0&?;x%1$$xO7cp$G*8oW-*y6=ERTYSEsY5PnijwpVC%Y<2}V<44Uu|CG+HW3-E=EI!J{Kyh!kg zco?%OlK^a3{$hp{#8cOXzNH zMM%L&_2kj!LHQ?mYtzEAAMLW!+WB6ATv9I#bT}d3iv2SAvV6Xto@2zk;^k#}82cLp zBx_*f&lYZxywv*aTKXgml2w$eK`_W_rILCm*^zVOpq{dPD3B#UqPuR-u&@6ul($Z4+w`ayyqn_t#2ge%IM71q z?7leWUKYMtxIu94c{O^-dOcwqqU*g4MBpS7$#6nah;4A(9$8q8cPGKi>y(fdUZ0MP zZA?zv^yDGE`8&-MPWcNG`5uDRri<;^C&zBoM2I>z$Bf5LH}b%yjS6e2b;3OmzZ=ZhOkc^9Mht35;IcR)*Z$`)cC zw`h!&;$yR1uYJ+R+~F0E`ee~n(@sGtKHi!VHNWhxQ&>11jQChB6`MGLRsv>)Uu>*szEWv$bUBy%pR*%YIgW=t^^5_!PYnRmK&tNCC8q+C(k?XTWbg#pu* zyq=nOsu-M4WlZx?GkS$I@aKw~_zUdsKa0^)AAc-FW%je~}- zr-DDYs@F>K6f_Me4Mn4FBI5y;yOX;@p82!NXXDal<(H+YHGFDU7N`0oS63uU$u+0g zq9-<1nw%UbH#^i>8a3{_xgr1Jmz{ZsmAm!XA%Eu~AdIuK8)$1Fm#U(v_64X`%Fb`Iw|rhn;>X@!?GGcy z=6&4qw*<@A3JYac8fu>Rux9H)98I3$eN3ieKHbX?r2kd8cXF`2yvC%xuZ?hV9An}+ zJ!#7Arl`nNkTePot`KOxy)(F|s~|EssM6Qn)Tk;ubIQgmV-~(L^ zBiYwu?*OCe_k;6Y_lJeiQSzs>b&n}k)>XIX%l}04$wm2b{^(*I-aEyyYG0T#Ig~DP7dW12>ZKQRG|5mh`{RrgZ1cQPEbl%zBayNk9!AYTfmdAwLzwZ9P>|R4 z<(8|WtALQB<>7S^MXQO!_`<}pOAYqz3d=TChQx!zV`s`|E$(*Dh9K9{)jM0J=CLQ6 z5l_9+a7kPeyhF~t#kJ+%1KzhWdQZOM{lzZX9;5VQp4}WX;Ihr@KU`=QOXqI3-{zZV zBY{)#srEVh9PLJ(d&5l8mQ0&ZaybNdCeeq`vv=b5jB76Cuv2C)l#N_j1*u#3cPxc9 z*MC34&teR`&grKesT^iv@Pzp-pj(H}3ov~kRQ|~GpqS+mQ~0Wt2yJ?)fb)Cp`D zyGuM6pLQ3_|pT3IDq))RKc2nlgI+O>tw6kCcxW=Flw zIUC*Sf9oQJYN>;@s>{#s#b;)f#2Ihycz0VX;++p=n}nPzI4qZQV)6wa7P<9404CI8 zGZm_0x{0l;46n(Z*L_Rs+rvDjTRl6+L$MM{_1p_=6ry>Zx21O2+2!PYEYF8+3gO#$ zT`%)_MP;Fc8Dog-ZG77IxG{nu%WS7|k5#fuP_}Kg24Bx>a)FQI^v8jw9)shIF{=5@RzNl4+!EEA|H6V4W=Wl zd_dN!u6y*9y*bkprvXJ}de`ml8GR0bFTS=SzLr2csg0qIiWEe@jxwoPjLle(ZAaI$ z)f@Xs_%P1|k>zh9VkYupHECSjX4!UWFVj%^J9cbSC3ipQQPl_HchsHp1g-))46;Yu z4j$f9wwf-tFt?N3od>T9ud4gF++0ji>+!mqoQj%k;k)b5S50*rsVK$ zvaf^SFk?MGE`g7EN5H+}Ksz6=r_Cbl3>Hl&2x2cgtqTRwhM^Da$QA4!gGA2I&FKJKYU2-8&SMF>EHN%ZiK^OyF#g_1 z&DdO)T9o+G)R9p!FWG+d%{+O7O#P%C9cV>=9m&ce0ez1c0pL4;w2!`$Lyp@#!*HAj zomj$SxWgsKPjHxzN{rR$o3o{qj|1ztS!!dLXwm>|uLmAwBOIz7bPBS}R^%sRJTF{D zyvfcI!j0E2X^A17UyI?MN2c;^F{L1^hE=WYePLZbJ8_`0)V@xeLVP(#x@X#2_m(7k zX2FbZ@m8uG3n!o}-*?ito)ghH@^U@jzQ$+Ly6U~XF_v1NaPxY&B$GIOf$ewQA|vS~ z+*n?kwBia|wsl5R0F%{i`qNyrj=bYFyVicbTHRo>e3jQF+jd@rwP@10+4_PBrc|0| zdxol!!xY~%Wu@nUlxo(zExV7&o~+IN?E%C0XO;CI{;zv{u^U-}sHR z>5*K|4gp&c|C*SXJr8~*HQm}-{ZL#qm^ZH8x4yCUem;}5T4%TlF$2l9pE7aHpV@Of zWVrCxIn+g15lC-~UQ<%pJlXB0a16CQMEBistSn2<0PIhTT`51gamyK<776a$?-k{2 z(fm?T&T()#Vr(*6r&nsVM=$5{MI(09RA`^hQvka5`}$^w?pb%?Yct!Mtmi%FpFz{< zYCG)olr1lMi=`O~_f}68!pjwn1iB`g6)#4o$-RY;=cmb~t*|2;j!*3->HFllL>7U;(366mt-kDJ>8k@k9tZy-CC&u zCNKmSK$XlX6B!8?r3Bx!(X~P?B9qKuF7Tet>sMGx!h9^eI~Cj>B23I;?ASXE)#)#I zzvFs8s@E`B}t>kXIts&ZFzu(Ew342_l((j9wTY(YI=&P|cM6HC}_zDWT9oH)=0NXJs z>AD5`_SAt~ijGGaw(iuRnL{qGb!D81^lDqR9)FHT@|~GTCVnA3-HPHm!;{3TOx+=W zRR&>87x{jk-ILbm=&>N1X1&bF8$jUWΠ2Wtb%NoPfgD9`tkr%mkVr5+5@-9^kB; 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�dATGLagwp=GYx<-h^}C9#Y5Y~i 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 diff --git a/doc/cheatsheet/Pandas_Cheat_Sheet_JA.pdf b/doc/cheatsheet/Pandas_Cheat_Sheet_JA.pdf index daa65a944e68acfc9ce5e4b47929d806ae6ba41b..05e4b87f6a21063011f0c161d0052b3eaf01ab35 100644 GIT binary patch literal 420841 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≦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

    -ObnU=`9k=RWhkUBiEQ!LYYEVK7MGO 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∋FV-&2drG_Y)Hd#xf*P$cwb4DD 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

    U~Du z2eS{zi`CeNDS{18oy z;wOFjW@U|SpYE6`>_B_xCexXkZZNzdg}LNYum8$i&9XmB!f2!pdHlZu?Us9gUT#Fr6lk zJh!~#Lo-XOM^By2RG%uSnLM>I;Wwod6%q0f@UU~V15QKZVP|XaBH$rRXJqPNY$gDF zzKZ6eqxo&(Y9mYsA^#8~~+|0$q*~-z?%E6xIDn}z@2RBz?Iy#!a z^L6}}eC=I0e;16?#KDdW_<{?<3FErT2>2|ZH?%Gm9qvY_! z%vs67%KqxW+`*Yf(cIk1#Eb@p;1RmY;eS#Iab2DLUrO`0!heYYEuX2$KV>_*Iotjg zZEC`0W@~0=X7B0(6cO^fh^8h2u2!zLW+K1q?SZZ9Umt9(u5=368rfS2(|K^1nwcB9 z*}Bq+{7=DYl$_06fUJzJs_3s$+FFVH_2G9mT>q2x|D^_?`Tr^6-|E=I$Pp00{aXNF zB=FGL%*fTjSSdBUdvKC^v+kgB!vD<5q(p1h}~cczD@>|GBw^ zxc;#Gol@Sx)XLoR|0LzVSpMI(E>Hk@`Ty^_v9tR}^~lQ$h&!0LUA4QkxQLsZm8k%n z?*T6Y!VBe)cz_V+fJ*{yz%R}N{0E1_C3$%yc(@-({FeFeX|IF=G1B%fu15AIX8$+2 z{YzR9@ihMr{;>WZoP*}SC;5+R`M=fm-|G60YT!RI{%`O4Z*~1gHSix9|F?JjXVvu= z_JJ8XFj@TP6kp_jmI!9{z`EcGumJeqEk$_$Who+V<>F{-?SB z1Tt|jw#LSS@FV#C#r*fmMN7rZoJ-Z}sTs}Hw_KXKG!Pm%4OE|oOU1##6*%CgQQ?xd zH+P`0f6{BLDvuzzHO+Y+cQqxg>3Y38uK2 ziG!)xKbK4hKFGg61e9mmEs4jC+<#&FfmkhZyyT00RaD08PdS1__z&*u5aH$M$`G-z ztl7Vk#Kb4Mmi-WKO+~udY|HF&;xwhg%l-4@SDTDEug`r+5PE8A--)hOmd>bOVJ^F8 zO?;iV*)JxV2vm(c>ky^iRMBOrcuMylp!fEPmTqp=;61@+uSPGS(zS1o!FFYS!Y=&zy z**bMtdf1D;kp?Z@azfuIMwDI@c-R{T7GfY~yba%4-9Th`8^(EI#E81gXRFVnW;~r} zvT|8soe_0Bd0b;RAGLu|;^R2qPK{j$zn*c|HDO^7U@W_n&<@qQ%VsE16f;^%pwYpqMNDbJ;Z0~`C~q6| z#jo0}lyj{0WCDfKn9w$S+fdauq<@#gn^JfFbmE5YlGg;*Tzkv}s%X>U1kUtg=mhpB zW75s2^c|D4o1aX$Hp7K?R5znD4GlH}GmS(yW6>RHa9Wy=8FAWa`EWuP9Pb2VE6d$8sgiYU|5dJV5FzqC|)t2c z3HRbzg+l!nJnQ^Pcd;IK zq0MIvDNkH9+RDxI`GG>Mt%1*S6aW~Q81EM_fT5yWk*iPn!!opVvZlnXGl9y5v+P*O1?NMsbKCQF$mK%GceK56hE16I!X~+4=FLTXw_S{J zyzwiRZfTM28Q<-T{VNw$nO6OLfsG%TuRdr^WI3FJw##`oBdf%DMLcjq84he z2|s(ZStKBXgK2_bu9@VR zq#>Hxgwi&8+lb9J_D3m4L#%!&%)JG-6uk})dfSSAGltq&b2H@OF5zada2dv7^T3tI zp_hstwl?rx!&suZ6E^I~8q>DGhbG#o%!ewqM0O|AV4m-cps{85m`9<_!I40rgN2XE zVqR`0s$xeM*r9a7`P}ZwN1Zq?rWX|H#KYNcR&z&lUPdo?ZizxKa&Cc1FLc8R-M;Ns z4RQ7Sz;9=B6x?b`KPKF25w4+(UEn%q+iLeYrrhd8_rUY(eCRy+^xzER!k}Z2gL->jzi#yf zrq)%bj|RFqubc&a7vMqSK%ddL>NRrwWzq^M@#t5UEw7yKT{R&DZ;F;3;zdiHH?6(6iCT!;VU3n&8)@=w)ssa2|>z^GI zILdcWNgT`o3jY@V`rEY}VPL74J!IT$pq2aeg zfHPvNwq6A@BEC3N$Gef|5l6c)l~y=sj@+?Ioj3$vVM!&jlKxy4d$@xL@K&T?gtriI z>MJ+yFy;Q+o6lvXuRMK0RzmeJhac*A#hWh z>6e{ui?QohL)Puw-}TOnQ!!O@3&&*g=3C*XE~ciGUc;q4&P#kZD-6w}B6k6=Yq|%a zWol^yyv`UZ7sJBMnA?GyJXbAHJaMv=E zgaJ5QUo6)W+cE1(>v$;&Ny~T{4M}s07TR3X8?D=sCg|*uIi>J~W-Kk7UK7TmF!fTX zMr*+_lSXHX7P^fIM^U6(smNHX;*Oo|vuMEO+Nw+W5v{q$A`OuoyHvITcBMQGp~a=Q zeEolvQGICtJb@`_jIkN~b@$`m`AIGF;z~Ok;;T{^w=XhwU%;h(hNL z?*wHo-Mkai>L?V`4&kGaTF^XZjA`X^q)=!H=ReafwAJ{2l;9ti~9>1^zR_ zfkno;Fwz~N$E}4P*SVI^&oC}KQpt*^1U)Dn78;MKXFI(-#sf+7fsx*(GK6~SW$jfj z0(kJ70EGF!K|$F5?}01(@;?Uq*5RG2F&`M^uK<#Ll^k$_xY|m{RcHF03*B(pZw3wb zU*UxEpPAhujw`zAfj|e&=HvnTBM|&X)d;^^2XhAp+{r{0OFbfHwDV{ z`_xxu;wEf&W&bDJjtTn2Ayl&epcz5KHJGy8WjVp4-%M?nr5-A~N<E6zHOn%sQ_ZZ?E1bE!pHLnG{ z&Dir&uEXYLzMB|}D0c$s9rk4g{$2>8e4otcV%>s_USQ#_pkCz0j@L}oZ`R2JtXqgZMz`;z zsv(SBk$H{ndZo zYcjPj7XkVKGco2|zkJIGUe|EE%p4nw`)Xm#4}^dJA^2$! zJUlQSnyc^r{(}Ik@T)%>`+vqkc!8H<{1FF*0k6vVBM!mC|3@4I0fQsQ!MUMGc5oix z6&wGS9|VDb0`KPdBaRP&WXH=52bT8#ZpRDd1GWeLh=U{k)B)k;MJ@|39}GDy-_@4E zzvsut4MWnw2jK=TsQzIGQU`o+zCY^^!uR|2BY&ht@FMBu<3+AhK7M|rI^c&Okm`>g zj$A%|9-cqj9Ox#z$Z2^&&cV<9XT3nVxuJiS8Mx%eha3lk{aIH~;Qc9o)(e!I2dV!- zxe*E0)Zfv1p-BCODF`n-JlRS0;$Xp9;CK}LU@t-Box9A z`O_DmP@tFpS!O7V=g)o$g(A3-$_(X2@;4~-_qN!-^&uz>f?Urq7zF9OFdhU_ox*{J z`=fj?ei)MP10Id!A8>9s^v^yChX5z}BR@EV2dO>a5MW$FvO^&CAvn;j{_HPs2tV{s z9Y9Ht`ZFBx^FPan;D+)c$H9^M27(&_|I_yoK>z!*eSwAm`YzHK%L@UCgM!4tK;qya zaXcV#2#`2lkT^b&I1n!If#?A03P~Fuhz`I%knKQp0PTxx2ciS;ePlZj9ef}<_(604 z;~G+a{2)5`L3Hqg=->y@!4IN?A4CT~hz@>a9T0%ff0h}-jjRI#@D14xSqB6dJCW^> zbzJcc*$!C;1mFU)9f%GHhzrw|1JMBo(E$h10SD0m2hjls(E-fskjetg1(4%F zbnt-a0N99}7DNZYT4XyA9l$&h*$zYpFfT!}1LoeyaUePnAUY5rI)Hf{a(*B>fcX`& z9f%HK{(@`=q638I5D=aN_h2FC#|xqZn3o`(7nt)S$AReJ1<}C^qJtMi2MEt0AUubF z@Eiida|rOF0;Dp7@EpPiq638I5Mcd=oF9k|5S{}QZRE5dJcoer90I~~2nf%C6%xof zK-vR@=fFLxNNIsp6G$Ag4k!rEq1?#*3Rp>jJvq638Iz={hw zEeOwn6&Hvdhz<~*0}CmTv>-Zw^~|6B3RsyT$AR!1SgnEBA^SNLgy+Dm1t4ib+5?2= zP!OI&p&&Xycn$^OIj|x`E(-|Hul9J5>I#JCz=9RT4x~Lmcn$^OITQxc9w0o2g76#) z!gDAbLAUubH@Eiuha~R0_90tO3 z7zoc{AUuZwdxC$~DGY??Fm7ZWFc6-@fc-0^{6KgP1K~OF%OH@n$m1>yWPJ_;;rZ46 zByw3mbb#<22Eua~2+v_4JcmI+bb#<22Eua~u4!zzCZ{BlE5n)&BkE7n1uub;}OVW z82syfLt_k`?|_%yi6mZky^6>@it5Z;d9Vq!m=AbAeuw9Gcz%cHcX)n>=XZF1 zhv#>Aeuw8Bo_BcO;dzJW9iDgW&pSNt*q?WJ-r;$N=N+DRcz*6TyRNGa&(HlibzEIn z9iDf1-myRL@VvwG4$nJ0@9@0C^A68DJn!&44+_@z1)g_!-r;$N=N+D(J2uOF!1E5z zJ3R03yu_F% zcX;06d57m6o_BcO;dzJW9iE^21WOT8DQ z1D+3fKH&L)=L4RfX93E456=fYAMkv@^8wEXJRk6U!1Dpm^FT!H1D+3fKH&L)=L4P( zcs}6yxv#mr&+vS}^8wEXJRk6U!1Dpm2Rt9}e8BSo&j&nD|Mfk9=L4P(cz&LXDeoyf zAMiX6!JxMKG2r=t=L4P(cs}6yfae3A4|qP{`GDu=xs&oXtLt+?L=VQY2iT(M6=M($$3C|}ypYVLb^9j!E*Cy5i|aJ|C* ze8Tey&nG;e@O;Aa3D5IDY<Sq{(Qpo3D3`SxMlsp^9j!#BO5aadQ?^Nho~s-9;Y)>ZX9(NyT8dY*CUqk5ik=%ad` zapUoY~T~*IB4(qCVo^e=L)$@$Qx~iTh?hEHf^*rOyNA*18&`0$= zx1Vf!?es1Ja6#4!Se>s8$56DyutGZ z&l@~XfNbppo;P^j;CX}R2~@4W1D-c{-r#wI=MA1Wc%E=vycV42@VvqE2G5f+U4I8W zPpB-$VLsq_gXayNpRDY%PT@K7;aY>|C%3l#JoEw2lWvV#%m+Mg@ErMYx%}a}3(t`c zms<1z&l@~PK3skt))hQQK3p!@=mVZ3A1<}%1D-c{-rza%;lf8}mvQy{xWRMe!=)B|z;ooog=x$OJiozn zS_dOr|dL2SOT*jdfcz%QDH+YVGxcmS z*N_jFV>mzHIr8CBi}`@($cIZU`he%ihs%HUaDKpZ#Rfc%E-s ztZNsZBOfmRjm5fx=Qr%nkq?)jR~@{;bL7J{;ZlqFfal1EOKm;Rkq?(`cfIbu!u}ljaH++*g6GJG zOD*OD`*Y;OdIr8CBi|Z9U zM?PF?alL})$cM|viS_(IK3vAt`9MBg#??OV*q0nd>SmydTbAMhOcaH*~52lC-E4)cM}+mR2KkD9Tr z;5qW)Qj7V3=g5akE#?EBBOflcm=Ac4e7Jm!j`@J+$cIZU<^!H1A1<}^dWC$re58;0 zz~}AAhf6Ky1E04eA1<|+4|tAzxYS}k;Q1Y%BOfk*!ayJJ9QknHzd!H#Ino`T-?2YO zK3qdST#n&-h5b45;Zlq1F81fhhf6KabNv1M4$qMfmp=ia4|tAzxYVK#c#eFy)S?e~ zj(oWMi3;ZjJV!oUYO${1Ir8CBi}M4XBOflc_546ST>jKn=L7k08CUy2K3vAt>lO0h zGOo@C^5HTLePDl%e7O9{uwHkO50`OuT_GPXqSbr<9)a^5`|}RZ zkq?)jhd$sr^5Ig8KHxd>;TrPcat!kU&yf$8TJ!$cM|VN9Y6lbL7LNww@ozhs!wh0nd>Sms<1z&yf$8uaB>u zBOfl~&<8w6K3r;Xe!z3&!=)DI2RuhUTy6!!x`OA(hx`8BSms<1z&yf$8TJ!;qvp)2RuhUTyA4TANaf-`EaR4ANaf-`EaR)ANaf-`Ea?- zvR-$Q50`OuT_GPX<7yuh`*Y;OrMC8ge7KCO*DK`1|h#=I!{z7U{J{Pk`EaSly2Ac^!t)8wkq_6950_(DSJ;Zln};5qW) zQj0#|Ir8E1xIw*MAs;T|>U9_Sa2Z$oKt5c?)$<(ra2Z$659Gt;5ef7G&yf$8+Iqc0 zK3vAt^Bnnb8CT~6`EVImuUE*2%cCB3T_GPXT$LhL5K3vAt`9MBg#??NM50`OuT_GPX zj|$fLKt5c?p$~YDe7Mxs^8@*C8CTa8^5HTL^MU<2^5OCrB>I5o$cIZU`he%ihf6Ky z1D+!vt|1>T$Iu7%=Nq0QA1*%+>k6JDA1<|+4|u+@KSw@X9zm_=x$@y^rc+*BK7-2f z{BQf$$A|C#$g!C6?AS?g$?LlwJO6Kbek^z0w4^%_xxDCojq&!dhGoF?{X}E z-YT{EQ_-wJJ?G4S$9?S@$t)-Z%?Uw`uO5czkdGmbl%DH?{|NDolnl%+r;#bckkck>C+GU zUG7)OZIvHpf8SreegEcvkNEr3n>UXS|NQpT*Kfan{q*_qA$OoBOylw4hacYm`NQMG z9|zOS4?5av(28Y+-a|L}g=dWMv>eJ_>Vma%Ev{3U~q4o!zn=HIqX?)*pA)s+G509P}+^d^CNPDq%5-@Wg)x9_)|{`dZN zR_S58yFMLvD+hY;dI#Wi9h{u+|p#|y6gSfMf=@IC#S8#)=IHtla~zF{jOtx zyR&w+-S5D6H=GkfUXl&Q$^hj9v@$vzcIWH<)SnWxVFw1M@jyxJF)L9#H-NWFheI5V zfQk+4WswZtp;2n%XjuuAd6|&)(l^_O?P>eBVXlAoCDYi;bPgk*_WPk5jsp{V*d0&% zq2GS_JC;hP>)=;ij$54D+c(?&^{#{LCn~+!9#7--dDyW!po)FjgfFM-Zhw?tj;HhW zdB5LpJLdG*cS9<1V7IBPKlIn#@pM#(q2;Dhw(Sr5>){N^kEhsGe>hxsXQst4p-wEh zb-aNU%U*j~s>jkXB)#4)btNAocI=joqyL&=7GE5Sf5iC3)KXY_t>fz zsU0=Th*p?Z`BJVyR-;dU%o1B&CM1e1+_&8{aDs)?dx7vQqK|&E2#@B zNieO-CF4omc0_s|&-*Qm=s!I}pv8r)f1bVB{`%Q75oXUGHdlZB+4k8#ZvXSMpLt`+ zgdcR>w?-v&Ek?Bw6xmkUsE$nYicxK^{LhK;pH~BNYP5;R67HB?5Oo3acF} zf5+Hvx9lAmcKq|~%?7bGgkfL(@zsZy+wX4P-rc;v2rn8nkV zM$S%f9XUIl&m57h?6sGrdX#bE-W||;yO91Ypu`M#R=>p);?fX@CxAsoqc_yGEp}s zBBCGQY6p1YVZT4o;gPL}IZ70b^ZqzacV@>vpNJ{U3Wp=T=rN-YVk-U-KJ+_j02})4 z?tXXL-R~d1*vz?q3B#EXhLGJh=d%rF7MjaiK~gF=>xG+P@lsKI+KwoUOq4940vv4n z|8D;Z4))iGLwMKC8+f+x+>M@wl6Wc*OmI5@AG%Qntz(T6`L{a`*1OYqzq=XxG~Ua) z!OVilXfg|8f4Ihq)14v%2yE|+m2TfhenJt8xK=c;j-FccjCja6J8h)^#XQa91k-UE6JXYW6aC; zV7Na+U8@%u#gPK*Pg$B2L`0489eq5`ZeV<~(obi6AQq=b z*76>+Rli3m3VaWP!1*-rMQD_Nff=0+XW2B)y;$yhbODjHfyZHgi@-9zw?FDw3%*w` zld-Y|gzrgLoBfePFAFna;w54}j9qz|m=EV=hGc?<;qMr`l8+HPVSe5|m=7Z``C?G~ z1I*8BoB1%-7ebo(us>rfLR}CY`+7fOFK0lA7K}&xYq;X+j5T7DTO%%NCByE3!5nq* zv-{ku)|}u9i@aZj(gU2EZLl}4xNv964b;W zYoXS6)K*XnMI63Q2t;6Mf16Xs$yA1)u(A>{!`q0gOw91LGOYBB(Q3hJF)u4|V}Dsm zz*B%*B^!&N&XU{Lx9yN5pt;CEVmbxg@UlsKh5f-^|Z#Nh!G*_q&@H<8HV` z(LdvodhsF&>=wXG0T@KXDD|BFrvJiDxSJLT&VwikL#d{S&@~Ok4)@!uXL1rBPMfPc z`Fq@6{VD#HLnQW8IsI$795dy2Ib}*Y-)rZ`NSvrHrLnM#u6M_z%)lgq;?~~`J|MR@ zaqf2_Z&14uk$bes49>G>aVYhJXo8ZIw~Z)oK?@XBVuVAzSbcgF8)z+I8?y zV(Z{kDeCHGZkYd_Ymv3ZX)7z62n9HfHlfj`9RB2LX)(zC-51y*Wsrx5FRJUL1e>YV z-oYL=ER-#D>Z{*mmJ}fmbj1{$v}b%>kCR9&O(T{!`k4$!L2{PIn4#4; z9STUPHk=RLhR`B3Z5)=`O$Fcsy5XZp3ZcXr%Ar|e={}OCdk(T3^wfuDB;5Dl0n(d{ zgnP_FL{t)Ol1RAk&ex}okb;7QHHZ(JeYX<>C_*ria5eyFv**-BgpbsU6qH^%qW{nY z0|iw~*Wf*#f_qNa2U!E3LP6}q#E3Gov_Az3FCPNZzMoKP7h{VAgcEu{K?Kyo8Run zoBi&-?{+uC4F|*1?sRwD-QeI5v;V`37jl%WotU))0*fmhs53g9{O zZtl<#IjAMO0vqR~A;uVluTL71$|&rU#QddU$x--7a6#ym6NU^c{wYsx|1PO4)?A}< z@cea3Ol<3ieS?*u2p=Te72sn2%DxCI3v3j;n0{<`SPPCP?1%y_ge|f4D8v6GJpduq zI}kx^WrSEAu%2c0US>5DMB)ZV6m!Me+T%%t-4-LEpHwflmNJ$pJA_>s@zEWaY9@$j z`4oi0(T$-&NzQO{o)4sDLd9_l-@u2wNm(Ecf>RNYvYa{zVosjWUbHJC4;v{C;Poc0htPTiW?VU0wSqhe zU|KkYy@~SyuU>^MOx%j_of=<>0OAf8(<0$BYD9A$rra#-_GDT7_Qm`AcR$>Sy%6W; zt8d?8xk;uiV*zah(K1G4q`2HO{-~z3f+x0c#{aTn&_}ht3Bz6HiN4^v?SWeh7?5j> zc7kce#3md)*?@`L8RR+#gSzKqiQG!e~6GsHzUr|)1Yz3k* zk1y_Snsb20y@HQE^t;=h(K5NWCs_y>_*KQC?0lO$!COqoXBOx=;4JM2j%yx=Cf;I#Bu?mNUZ(EcS{ZjM_F1eOEg>5Cf!1&&(j^sW z3>&&gDng;gpCYo`YsDf&Z7R}`GKHj_#oz?ANvcGYEI5s$sShWX0cuu8k8(e&Bbp;Y z6YuRI&^Gp%l>|)nMwr!Nnc=Gw>{GpJS)@ej(L&S`UU?|nymW=XI1A$~L)kLiEL?69 z$|h&9?yLc8qA-Uq_(tUmXH--cHh}nbb(vXgS1Lij4RLYeGPYV4F$R!Ww(%&kR0icZ zu1P4HcV%H}hRD_mQYf1Tsfp7#_HDHYO0ifwE4m!Y#uCXQ)#Qr<@ef%Aa~sF5^Jor< z2!Jsl`4N6Q{$cosYa(EXI+c5TT;vmr|9|h?4>d zF&*`1D@HAXMWPU3DsnAOBcaN8a8pA#ZT`VUW{Hf7tx0Sk=T136r8xEEUcQW0@}3Xq z_Q$eQ6B7}%^&ZLMnqkdIysu)!G z&RI+!M6O50CEBCHpP#xwPm1#Ife0^VvP%vQmCSxjJ5mW2kvt#K(~oyVo5<}I<= zy8}gUZn0ho^!Kuvk7Cl;oGPq#%-Y)69W6-6FPYHE?WYNV%pc?cye#xSajHZBG7D>* zDp`LGrwUUr@p@%#%tsd8H~w{kqj540=oxQu#tN>Uqx90*%WmOikyuzZ8YcbqInUw@q zd@{2VAQzaGRJp*cq{<3rRS>|bww{d4Cp^D^qU2 zEWM8$({yQk!ev!_c{PTWZ;J(nRW@E?SaEku8CD6vH-5Igyv!MvPlIgd1Yi}z%Bve> z#wt#a)_vNn3+Fk)Ix=?Skml?rb?A+)b`D|MeY_Q2j!+p^E)6PP;0#--?#wBpsFg)- zr>f$PTO3Kb!l9`G$F(aj$QV=?+E|I~HP&+hXEo1~BjhZr1PT`Ln3~5kE#O%e2#3<* zT0u<u2954mYjk5hIba`r!zKq4xz@wG}}w21C{k1_A(Q*Mlw)mL^9&+tAlEi zNd{@HQ|L=7Ti~LGfYT}CW19*eo7Q)xrM(4Z*vkUKFfvR>3&%M<>=o7y4T8XV!?=jw z#z8FY!=HFSCl8U{ApZBYgYa3bM`7(r__r9VIG=|<;m{JAZ}LnWHkBg0aM7%2zP(CH zgbP2KV?DurR6{=c5Gu$AZjVSOnw}e<94ojsC5ng^;qAq7(rFY6Gk_flBf}9-_KqA| zYyhvuK0o(d3-%)JTHq!+b2WiO7so-O76@^um071jURbw|Ni(eZ@9y8--hcPu` zcdujvF@!UzHiYI_X}a#X!<4OOxzKq;TbBHm}UT$A6@$IC}e0y{I}eEfY@y zfi*fbD1hsWdV`v0m3M=2Xp44_r9Dz06fy4INzAf(BF4W!(^^^RR<-=paYCjkHy=R* z@opr<>okx|G}uwPj(Z~68o+*d;6jg#%$5MbB=~>HHiDxjP8mPp6%;RWDnjfY2#3#? zz*s4ZeWvl3i2M}84@)4TJzoL?Yz!9z$O#LSa3idw`b}cc^c(JSHL!=8@!Lxbz`6(71!t3FXT-~#Ly$dZpJ`j`msDo_?}!eycb$v?B+uc8mxTm=Wxv+; zLKZF^EzxIOg`JL;>mWo9u$giGn2R|i6WlAtVYFpiAFa2=tt35Ouh)RVQ@B~xAfrXn;KF{>2*n?@EihOLKpIZ%d(9v4f7s#aZ zVun2!paCd{(~qmL@6lWp^@>uK!4|N>Gt)E>F<1z`E30WJV_fh;|%$j_|ai-r! z%rZhtt+};tFXMM>IbA8!%cD|sO*ZAap^ zU?{VnNa+XjXeT0cgh*yrVSzJ-4{BMIO+={PmRs{k8DaBW`h*AK%fUaXX_lndh;iB0 z8OjQb@i{~1S2%g1Y@LeqwTVoi8LBZNOLrRA79@=suD~!mOt(QbfI!tr4bs?nfMm6pO+%iaM1+oSsDe zow!f322)|W*uX?xl#NIST+CJ3nDrpyBFaW>5M<-j9x`bVg_1VNgi@vuqy{=(9S0G{ zf|7n-8nmFq0Vh`1qmEK2$=?KBMX#z2vATX;NJ*}7DC4ru>VUg7+2a+d3 z7L0Vnv6M(>azjfvBS%fnq5efEKf519>Sz)|bMx{b$>7LU2tD_l>5uq*4Z0X9Qayqn zh>{Ow=j)v$fr?m285&6iVjjCZaL^uMTwrXum#`UOyskubq8+L^>ASn@H}|hUe06pA z@YQFZd7PcCQnc0r=p+@B{^&XRl)52}Lf&IEU|A@~wi+8!LP{7DDo(;84vQhKCWUe| z!mmp>iqV7y9I6E*#<3DH@=x7{+UJYZAFtEQ ziM-Xj3h@vE8${DeN0RW(4k4jt{6?OuvSmx&Iw!hh@{u%B^Rt7ReC+s<4kGE3Xz|L4 zCvAg9F_O!vb|g`-7mg%~Q2l5yQ}9vBvLi`EsBCMthN$490@jZt0pohx1&qaNrWlt; z1M77i#${VmBQG6E0>))q>o;P|XiaHNpA6&jXy7f|wmKbanDj>53rc>#xNK{qU7)cZ z8Cj;q@t}!sd4vjUqTX^1wnfXw;95UcTu|^Mw)M7`6nv%b#~n#z1&`&?!05XU<9ge5 z7?*7WjX!}!+WoG;TtD$hLKfP`9Z9kV>y9L`!TKXf*2B6Z$)v&MBS~to@<@^z=qZE6 zv~VPuRK9#9$r@Zbl4Moa9Z6yXqyEy7B!hk7NOF+-(JtGM+{F}kjx-|RKYW90%Xv1| zjNiEbn77n0&)V^3m24NLDWUUK`FzoxBZ-!qdO@^W!Dy@QoFhl+rtqJ!6Sc6YJ4eLJ zQ4U;FoQ)M-5D_}sQh*!7zTnP@qb=KduR%;O+NwJzj<()5x^o!g%$<{sw%&HlXiMS$ zxY3qvA2-^1+jXO@wH0<>tbN-j^Ie0Rc5&CNw?LucPan&`(U`M)b8d)d2ew&pw!{X) zKc?({v4I@VryMFYm>QHal!Svsla+co>L#nyK)H7`Sp_GG3}j~VNe!|v>qYEkxBy(? z&dFe_utG2dObm@=s+v>asDx9sYP76DZL3BJG$AL!DnvnH`I=aO8di-K z9JGW8XO&f>1%|73JHm=225glDsDx8nNu;li5X(tiXE-b2C$cq-K@G!M6VBs|K}|5L zj6ou_h|7Q}i@QXF7de6r@f(+6!?zu_WVUgvDc>~GsBHPkW}JaE$0MoJD{in0HVE$A zBNZlXO_i8AC{blH2PHQx>2cE5Rf*upZP_3cV_er2H`s!@CTdf}xZajLO)+w(s;)(h z%eFq+W!JM}%mh|k&ohigU5wBY#`U)AFfQ8$j6Zq>s#wWZ;3uAviNs;m>pg!_H*&{a zU605btW%p}13RZhEl9mbbuB3CK@|_teBzj~eC_2Bis9$+?MqV-!g@z!!R>tRXHf(GT3 zDcfRCZ0+M%Puj?hwyRjrr0pX%GVY{Rtf#h-8*Nu@*94l?tVO+L- z48|9F4sNy4pEBqF~5@tg$@$ZZ@6W=4$gNOC8s{dq}wHxlaW1;lBR#75SK z7olCE%Sa^u#+q?|iR%TpE6JYEjRdFXv5Kxm$tYk zZjd>Fl8^F`bx*wVxF_d7yTU4wXN(uaInVlt$d|rowEI-lm$qzgWUfryO}0J_H@a)0l=|Nb-_nHBm_kr+RWl|4tzDw;0?0c%h09 zJR#SyYAo}1MmlZ8pDp@W%lJd*#@POeTXQhq($l3{b7 z`Q=3s-s|(@WZqMKhzy-_6w_}6`Rcd*NES&}vDVz!H$rNPmaFw4jzV^I!as>VwCDZ^ zVL^}7hqNUKauh4uy1Z>WX0@$k7@oFWc@$HOA<^THVnRePuD87)tM>upvaOGH`6wnB z^Zr;(r@5eA1dJPPS7AJ9`xuNFaYd(DhjG2_I*iM>65+cEYzqUCDI*s>HzTq+No)^_QF zky0!LBUu+@Ay?a8@RVw=EXz!~8CRKcGVw+yvt8`9Y`apXYOfHoa_U~_H5+TKt#Flc zPJa5?oJHza{G{S-B6`}mik;}h$i}*=_(@{}Tda{uz*Treu^M=v^^h?MZBV!0Wew7< zTtr5&7rqwlcgo@}Hn3e8Fq!Yl$v}Z8UQDg6pVO|Ci0TBm!lY3AsDUQx{y7(2RZw36__)reIrmqf8JO@1O{IHp6kWoD{5J)xC%{c{$|a6-iKNpTZe3tb3wQ#So(U{ed`nZb;}ixLEjxAQrww?pUt- z?c+D$VtLEeT&$(v%M|ZPIZ)9xF4!zbNk}qnYrJS7GDh_K!%j{Vt$qW~g74PDJq2U( zQ)C>_xmep>5_pkfTyMJ&?~!3#wzbh-}tsxD2EdU7K2q9%r5jWVb!XxG+1>)DPz^z zpuwtBgNv*>RTZV?va2NOeTE9JVX0=Yj%tAj&oz)GKW-u&o1G2QV#^{n|#pz_xfs z0cCg6)|t;T+mg}BVY|Y%E~rppw2ihi2BM7K8AurIq^*ti0s{%7owR+-Xjw)TmbY%S z^|tFqTef}NXv?-?v?8!|?Qbsb8urQKc8y>sJ87n-;tALFz_TI1A{TMF1w0GXA<0(B};@XUj!oRtEG1*d`ss z*-{4dF$K{PG8t&(uUb3juZ=sL9^|ax5bViqF!J^XHd~q0_7%q%p0wmPc)Gp$@zwj! zySimM^&+n+&%)fq<5JwR{K?!0+Ofk!NO*P_3_E$N zcp3xO4CZRU!S5B|tc-zcfg$+^*C1I(vlzI!C!vTT>w=S)Syd%lvC-@b6TB0V-q<0Z?!eSsgnjIAbo$>9@P z$_+L``U?0b$)afR<;w=jk^YMZSrmTy(tyvy1*BCI^6VJnn3g5nbEc{3x z&8;2jV<1cTr2XMFGC3^@ef&!e|BjrC1a9MfTx1E+oo6h85ZL$MzWeYGA>#F`t0!;1 z`$j@uJQ-lm$rz|xJ03R0MyE5+B%F_# zGj_6VDucwpl*7tUvfbCFRYvljM2I}a2xBUD*HxBW05t+u{2r_e6+%bJ&G@iqbwfvm zL+x#q+7j)M?eKY=!W!=K^ydBT{oA`&Z@>BcuWw$zzh`Y!vMmU5skOo$^sxzAwEYfafurieD%*Mf#)atS1kXqC@a{{xD*^H#HoHHB7 zC;!b@liW33WHyu24XVt$`?oi5?)^H?_VevOJ^9m<-#q!#J=c2vcUuV2RgPH3yoC^? zu+8w8t2L47S%lQ)>aT7--2C;s&kzpn_$cKN4moie;!H)!%(rzjHmZbCJ=}=NRiI^I zQIFt+75qBF=*~NFPbm4*hG`sZN*vQTc_AvoDY3h1%u+EC85op$9yLpwBm`Rhc6Wcv z^MU#@V*YSZDNy}SSME1_0P zcsk&U@Z6JPdT~vcBWKC1UDFA2nxwF%C+npV?@wvJ zPVf>=+)Fz4xDUhTuw|?gw5Ft&dS@*kQbc?%@K9z4&dWZNmd9uv&)gsFHQIbN0j$b1 zMMP)wI#_zfvRLwNnL#XM86FpTrmruy?=sI! zkkeciJkwNiSzooSF~_dDzT&pC$qMW1BD{oCzP?C_hL0zls8p|zw}aE8YnRbXV2Pzp z>sGB*0kHEXGVQk1eHpnwM7nA<^^Z0t+`aquJD0zoKY#K!_iw-X@bbyiC;#RC)i*Cc zJdrTv8Wqv@_t=5Lnwc^z`H?qV7Z+5?un1DFGJ^tAqG~g@+Ue%N3%hb)NBie(-WPXx zaYlW>wsrcPU^;p6nwv^7=UTbIRtn{S|D4BQOD0)bh+EEATT3WA9ZHpx6zw^jq~A4! zvV$qr#7^vJxwSE0{HO6@hgO@&CvK70)=04C9z1Nii{u5+W=dDZZRazy_|nkz9wE>1lvr5;fGzaJ-SdT=L#MtqKmzCsWvNCSA z;XUEWUI|QzEh!7{*$xR>eEC%<9DB@4BCfy>uijG2#w4(4z>A(~oT)5P!+J~)1_#mab3g!?8VF*^d$T2{)?O~s?iDiVVhUD;c;-1;y~uL8xK}71wGD(6TfA-6v6n&dIK!Tx zDjuQ00(BNQHDu}8H1F;;ZIA8Lj_p5r(-uoUZvdE{oHSoVfao>xPtbgcO%u@xhy3p^ z^i1{s{@o8ZA6|X?_I*1yWez?8?TE%gFK{!C;I(AuEYZy1U~~&`;^8HV_r~F+2}Z(# zB$6tg_c}Yg0DH%a@Vh%v6i`R+xZ)|VfuBbXHHTfvJ9%V9IFp2_Den}fg$I3yeJs8L z{&?PbB+P?18Z!PTkC6bDFuAmI<(-jG=KGH=K^ftX7)hOXin&6b0gtRxYQ*o#IC)3g zO9I;rP(qzbi88RPpTPIH2j&=B2{C#;5-THIrCP?)kOU-=i}DT&&#CerIh!_cOfR5{ zGE7*4)lrfo13-MC2+FDK00HaFSYtxTN`zU?OCz)7Dc|?qRI-WtzVIkb&r|clERoEzx}1Y}iSZA48Qp8;jL}+F$}(mdyD~Po zaZId4qbcW%(YohOU1X~B2f#Z9>Ro+2vxE-T8vtdl>?^;#(SQnJma;c_euz~iw{hix zc^>GYgnNvb(sfRNgE<^cJ8r%Jj=x5pX}%e5gh6a3T67CYX3cXh zR<%<`08#l&Sm5jR_rB3Rou@W*&xD8Qo(T*BF$3ezhBsJhf`aOqL*XixygeR_4UP*h z^T0@X$~t4L+|=CNo=+t+Wz9?b16JyRh+qN?u~Uiuz{?q-NZi+<2p0q?xvBkn8=Iwq zmsVuW=2_wA3azNKjfaUup=I^(${HIU(Mv*Ya`Hk&$}<-iqR@C!N?SF7keIf^ zr;3|i9zd#e6hfjpbmLJn8dvLt&?kw(m9PQKgw<%=jf{m5iONtkJ?@1Nvow?njEJR= zq*5gynFi9TqOrtFT{va=;di5OXbl`rM2pwUJavi0;_)t0IztZeV@K3noh(K&lQ&*cN7jB=t z_A*H2hPpT=9noY=x}kb=8qNo0*4ce+P`1#1`nBg9YCfnnYfm=R!c5tqj=$*IOB-rF zsGRkQidtEHoopx{lpg5!^5RB&&br+%IzHQ5VrX1s?5(}!?zH)kOmFUM%P`v!&Kf?B zuV;|Ty>)R+)fp3E)$N*m-In248`Lkbx8{RdySEl*$_91%Mb}>1Tk}D!-CI7WReP)Z zMaLKS7K)q7uSd(RQ8N8#9D93j4Yg&M?TDXgZ(SZ!Yi}{Ai+k%(8`RIgwP z%J$az7hQY4wF^^iSz2IgwA9D|+Co+t#m36i~_mU%Zw!dcG{+BiN8}EvwEq>Jt$lXP4SSnx18yJUFPZP#z1P zy9ASDvCsl<8k$7F9jVDesE`KYCI0q@Xooh)kvC3^l+r7w?H~-2TPS(z=e=@=ApY;4 z{_^H8x4+pw-*2CePq&A!pKjAmExY$FD&3Dow4V$*i?*iwNd%2`&fmX$q1_*!Zck6Q zXX)Ng#AWx^#nePAqra31ZbI|C`&;e4+dYM0@c;hn|NT^cZV|zIst^HJ*Ww&Bh@eq2 zEQ06s-#^_Bt)z5}(|V}U;8Ltd89I?-J+fD(!!mO~X#o|X9(kxl`HUW(INdP14;)Nw zMW(#zC0Z8IvAJ4&MGsOq_=Kf+^1>r}3N(ffktMHTRF{=g0aLu8mq!cLqi|YKrcdYv zGnR&>`n8rUo(UHvmiF_$7T471f;5nM#7GJ}u{|`MTGB%9X6nl@uYkwLfKr%OuESC zT*`}@)k}g53A4o27<5-D;k6#(CPE1&;#i^q5u%xPI1=?~6bTSeed?mp4hi92B_~xJmCP1teirbNN|2QtZ@9FoNC!x(2F>kU znTKr9I%es^$6TvpT`YS;xw*^h!UPCpT@b<`R4sbo)ni!|1s2xBC6B2SwFX2x+9aAb z>trNt*O8gwG~VykeaaisXeK&a`boT=PP56N&7IAtS=f7SJd?f4-wm6%PJKjeAZbLk zI&mfWBB|90Q{W@Y#*vR`BNIqW&tzlF*GRjLkC#zO(4a)e(M9HA_3^fWr1943OvhWR z6UMvD$RcYK2i~VLvdGsqgR!mkjI4tm+;*497~zS;WSk@gI7^6GkfC030dm2Zz@jL3 z+lI%RbbeYz7MOLDEE)iov-1XjcXr<-3vVDNQkkStuYe>H;JKqJS!8x+WRVnS>3rI8 zHeN%PiM!X3F(HQ|(bvYuiai#X$+;l*{A-ge#9+-JGRO2=eEa zIWCF|g0yyxrwrwf*@;F zh=|`61epYfObCL|djvs#39ZD%Z$XeXD@25^6GTm5mjg@k6Zz(oXyZrppou7{YA5oK zSu8ONYGNlPlWm6_=DLZ9ouTb%HjXk0O=;7_1kr*PJE6(XVWmjQ{gfta_K+|Y;%i&# zi7}P&UzvL1Ol3-w);7x36X7c>XmYBHVp|oD;wz1H^7E+mYiW}29bqj-6OP?GNo%nj zvo?vI{FlCsOnc*`|425|sIkk69)cF70`n@yS2}#z-9^tb_l8T0JB$)(BT_nk$Tf=w#Z97ksEMr}qlHPAV|4nbjM3sc19xU6G6rcDyeshS z^o>LXLHC^GMGfsl-@y~6u9Fa%6u)gQw?j~rIi(RwJE;vB0b=c9$?IthR%!=DJMmW$)+IE|+QyPbpB9Hj ztd>~!vv#qh(N4ygBE$kc;A=8-9kF}6?LVp=ai=MCqwiJj=;{(s0x_meX`*XDh8n)| zygHY#1E_43rA4KmYAdS*t8gOm74o`C(||OQqcZIlkfuZ0TpUtrmeJ8*OvZvjW?Q8> z7AQmh1zkgFEyR*QATh+|+j9jAMc@+o%tEfLf#bS`bF;{xOkn z^t887kaay-R2!jcgk|C-wLu@aXIgRim#7Z2{Pb8_Ho-#^m8A>-q`P7yp&ijqgbr z^_FZ=KS&^r{MRC^cQi+$I~UWtBA6!4YC8QEyEcJLVKt-x;c6uLN_3u5=*n=+@^dtx zD0L=?5doLM^9Z<@dhbCqpS)YnDG7h6VM?+h-cBY{%M4Y?bVoL;n~`|E7_;YWOE@R7 zjU*r;RI}q92yW2x4kl<4yNuqCE+TnrW(@UGS|*8J7*CuWI!tQ)K)!5IaKycEI^(8` zWtg90S*k}F*+xjFa!zG%YSIR9KUbWLdy*iyNuH6(%2LiF2;nVLk`XWS%pZO1D&PEs-*xo6@cIHfugB?wW&eUV+Q>sP+&_G=O<6LhT39?ahAcL6p%fiXLx%Wt?mNlr zCZ9AKZ4?(8Z)mZ@$vF}C;vh@|W^f#E>06nY4W?zf*Lhs=L{1B<7k59|yoIfukG!uC z_<@$}N&0gp?_pL(mZm{dxut5ABG&GSJXo}g{jsY_*>vbPj+K=NQ?e0x8Q9m#NEb6O zcAlL#XuA8!K1LKo?9odiTE;e{5=%e^qy_|GI9Zw6S-i|hVI3xN8CqVVY-3uAJL3V1 z$KQqw36IQ86xfF1rp#778el>Ym}Fg->6Z5uNW~P`M)`$>aMC5~8(r2Bv5eetu%eAa zgF40|?It~l_%xqtoP ztE;<*dIH!S^5h`KPvhebopueHYcNBTxpDDa&|W|+Fv?;{k;xEKItn6 z6=MbD^nT_jAm%=XoY#N&{{G#cuu;(Q_KVNAJfM}{meNb9cFT_Lt&hq?qZTZ7U!y>7 zIuP}9;N`dw>?lUuJ;zwIRR)c(M*?zF0Vx`!Al47xh_)@;OWd1q=IPCBzfilBj7$sMVBwgD{lFuPETE zbq^AKu9&eRV}Wn=SI4*fHH;Oh9TEbA%7p5$Gn{yJb_pe^jtMLq1K&b}sj)=1fGk%@ z`B5CNRRTrdSh%N&rRPWn0ZcHn@7xU~tW^TzIF<~9KI|Y83=A+Db$hvP1Om8Zd8{~o zk>%?WO?yKU$ivQLUnNQ&%K~rV^_=@hE_88Jqbx!PQmWUJOTS0EkTNa^%6+_4?PXRm z0esN)7@kcgqd&wVcR%l81(~e{B-Zx=!5Z+fe*8vCUV?(Tb{X5Zw!DvUNoI=?N;1An zID5tv1ABtxL1vdf22RYQr$J^{e-uM3+qn*x7gVFnuC=`=0~KG6(QSOoA1C-$e{_7y zUjrQyzU8kGu#k@vZiY_$!N^zs7-?(dD}RhF9i7^*37zuS09dx!FSEeb$dnPTN|IvX zxGqEj3-YhnguQckCe61t8qLJEt%+?{bLwo)=XMwb8_K(FCI0Os_iQLa7lEiUqo{ z#BzKyTlFF%ScUxoBF52X;t16mqBnN?w=vjnB^d!+Lop*l2nCoDjKRUb((OIf*Ly1h znOJUU!WH3+DL~cE8M-`NC$ZgjgtN}k*Y=i_|Cj^2+M~?tw47qO9}FW+^52*k?7JTg ztOV%`$6Md>mMrH_y09%f4A}R!(ZauZclQc%(D5mlyo?IyO5+nPbAYg%*#gtf8tp2F z5ZoBe@U8C*`#5>r3S>MxX@*2^#4x z1w&YDJSZ$D6;VU#Kk~&SpWlVrVkiimxQ1P%L-&~}YhpAb;J480Y;LW4Io&UU z$6nX51BIxcR&znJnYa|qj5t%4j3)u``t&fbG*a6(699@M1z|#Wxn$X{k$1*5tejmH zDCDUUnom($$8F8k*Lh#lSaEy?nL4j0sgbmdj)$YLUBOQVqg`=?N_qx3K0o2d!4a64KFvtN>X|R4lf9#BJ*(1>X?Y|Y9Nen< zK$+6Sd}M-m66}=Bw|GyCxu`KY0F`0L5n#_$B)uDP_JS!>e$(A#;a1m9*eeE5>i}zf z5q-m^8p`pSKDFG{_i&>5JeHoZ)&3%-^SwBb8vF%aR)oS8fFH}B+wb$zw)`SnGXY+~ zU|p#rA&}iYl|DMB!=DdVMQR$N6LPxS&fSZ)CO4`QB9o}kcTUUa|0^g8nzu89tb9Q*0{5!5ct6g z>4P72`%Xe_`upwwH%cM?Tzp8&1=qrqln1k z9$WDf{WgMG0B?P98Ncdc7OLmt777a-CNM@4F@Z_mQzwzUn3063^Z=GwKuCsa%DIff z`+=VQdRG#!b@9QRxX|0xBNSMS7rI>o}<4KC3 z2FuMn<>k&geTl1ti#Aah#m6johl$O-D?~;Poi6v!lL|3hj{&lZP)WHKI#Rk`iI?#1 zWPKp_TKOdp7WPswvxsu!b3r)7?+{^CzBf!qMri$vc(R~&_Z2(du-~)U1E>7$Aku?S zrF2>XFA0p8M;k=i*4P30;=M!MqwnB>%xFxt2fSEl}e%*Ls&2hsELEgKasdN0ZwN|0ie>CRsPI3+$*93H?S<61 zn-pxeLX`(ZOaf(bc*71NnThaZoSn!mxEQF7t;hq1SuJ0=W1Nv1d<*hWUk;Rr9W^ov`Guw{qsYJ|M`+&jNXfd3y zobkHYPZAOf9BdGwUO#D|l4YVr`T{8w2t`7ZFXllKhLY=$RGz|0w2i|&Q5>al;1(kI zE&&HI6YZOjMlMfiM2C0;^T6vIk1XoeM{ltp{=yJF5&nXN$lb#l{8)x5@OJ1%+!(p| zL%K|BcNk7a1rb~ZxLd$fb81DQ6z)3!t~~4vzbDjFP2wTjACcoH@jN4OIQX`1f49x| z;v=*t43T{u8tjdXR3nqEc*Oh98w^B~(ruz=43YT);gQhErml9kQRC(45$PH3rBF{L z3yhgAkC(2jkL+Tf&%}hA3C+Bg7E4-u-7afN<_@zVi=6Z}o~KkF8N_pqD7w%KA|^_4 za?ViEktsIOSwM9bxMXwM6oazpEytqe_@B3a4%O&3^FfiF8IY#5SGt~EX$R`f+!@99 zX`Ar}T$&@LxLce{iOeR|n&`EmCRMnh=`d&45-Jt1>6=NPdQM58KNto(mk?*1HsKeV zqLNyL0t@Qi32!qpLzmS8ZlSpCqA@wF$24&siQ^B<&_xG1sH! zsWpMG>862cbg6Bv7gyY+OLr4wNx1C18TXY%fjW2)Ps|rT1X>^^mQrhA0<3*OdUGS0 zKfa-ePbh@UB4c2_*)!VGif$1Fec+XD5aN4W@Te^iVIW!Jr}`24vdUVh+b4fYp)5+6~h$G1k{K5ks2k1yX~nt+l`N_*}9oTb(AmEMPjDI z1*3YNt&Voe6gO|Gx&H`WA`6!W-xSa~N6u4I$4EJATm1-?uYYmB*f)OW zuZ3%iS&+IOV;!QzV9#rV%#_{Pfrhza^8>c7^0rEP4_HcdDCPn1kxhAkYy6M=Y!=F6@(e$qzKv5Ub*|(onF>8+e*Mq?wi7n*7X?) z+9)R8w_Fyx!|V7A+bfQEPpf_8y=UuflAoHuEV!=qY-;Ix+bTm>b;=X^Nkq#9XWS}F z?wvELgA>|y5t6AcZ=dgZ#w|4VdiTuy6TR^e-)h^ZK1xh{XoGXH#)go%vgbA{?Y0$i z2hx-eu0N%9;tBgS4HmO#H0~PlZ4_;(yg@dPc&|VE6UAd$i=%flpaQOM6g`$s8M`5W z1>BQOl}jjNzfK=4-|K2rhrDt0DgUush%C1yW}xON3B<^c%gU0mJsh5`@-A|#AR8wd z*}l^qH!uJCgK4IS@#B*D0bb{EmELLg<*B)xPLdCYL<5KIBy-RX9>dZDr3GqeV31)U z$}9cddlbQQi7W4eFj_yM-WEK;jxAMPY@6?06_@;Ngv{TCI8mL`;{&^Fr)(lQ*5zEy z>vn!v1pF&U0%KCw95xgn;dssv$%|*OxeafUAOs2c+IL)xu?TFFbXj2iVmNvYe6a7G zvBoH`^m?oA4>ZGT+CwZO=&(Q~cHT?r_a}M3ei6}KzdKj=Hx)cX z$=S+Wg_n}EeWAVmNsd3GF+Wi`eZv*}@tih>bypM>XrU!K$Cxi=M?o938gmoJu;RPA z61wI?{-AW#N!_)TW0!#2%wFQFUEXN3{(fU|&Bb2;uPsDg;Kvj&bh9M+CZ&b<3~6NN zc4y|6^BP@_LB^dd+@QrgO>CyN&l%L;-?5VQdlUfCB40trVDb$IoP?EiF=k80dh`LQ zuAaS4@^UvU%y<6h`Zm;czL2advYHU8+koX1EJWVJ(@$2$N(AJU$*8I;agD4QEK^1+ zyj|>)R@>o%=dj4McY%wVC3h24he5=A;pZ~oF5flCveRYBYWr3RnX3~BEYTaT>Yje ztTZX}=l|bn;U7LAf16rhrb(AI)A%s&R-LQ2{4h;hOlvA6LeE(e7fy(mFI6eX8;qBt z&OPG3(KWl?_s4DlSGq+!HQwI(QFeY>nCRa_VIhROb%F^nu z3WZr97r|xpm8gKzo-Q5hzKWkjt8a;yJ9e(p)Md}C9ch!`ieAE20I2|Y3u;mF zWUYYRv62#rMXYs+4Ay=ND%_febx^sV0w%PjEGMXP1DWwsxp}(=_6QZ4^GJm)1r}@E zsP!tNIW{P?EDD?BSv&p}!DHh3L6p0GoTlF|g&)5zTnCRtWattznk5wk=Fu8Hf-#J7 zH^;12I%_3I6??Q?PJmtAjtE7?t~9DBl?h2b6}ON^~#krn$|sVErJ z#Sd`Q4y_bvUF0UzeqV^A_3?t4Wua6aQJ=|ktZ)--eJLZ>{=kYw16H@*sGmb`;w6hW zI2ConvhJUcjlgfPy4 zC%?&V?!*4M^U?6Bn(Slf02JqANcM=jFRum)#(K3y2hMq$t zib9{!SG$5v*N^>}stexseLKIUub0MV;4iz{y1bk|KSq`oq%Z({2^N1|@yjF%gMAS`i7x zFk}V{jb{?Dt_&*S8c@I(&=+Y=7D*UeHpcF8ezayuDnSZPUK=??S7DJ+ANb)^vXfIY z)E?91+c5C3%|s$tm}Xt$XUVqj(+@bekt#?vZ2-C(U{#9jGHt47UGZ4e9-MECdT}&} zz7-w#6>kjS(K*Tpc=ZX)Ug0S^+Ci&C;Vnx${BGv3mX>v-I^qry*)Qx$?nqXZ@87cGjeeFK55`$tVj z!uo>d?fHW@Rk}VNuWxL!*>B5y&l3swkFr=N65rie7kFAt&sZjekEoDq=_wxhtDdh6 zv)dA+(a}f?R0gmdLnXM3&_C%)XpCFd!3yPV7blkNWfy>*Y2D1 zCGpT02gZ2hQ>|bm+30?9=~aqbP%JSZLRYjn{a89|?8A5AzOApU0sE!uX{EOiU5eDe zl|!0!RX(Lq-GEZXiGe2vrKi+N;&1H214Y^nCrrfeAx(p{Z-zi4aBQDcT4boyGt!q0 zN2^&(;{`=r@C|G6DEmPL#jX6Y?P{>^zHCY0F)8Yy-D8yxmjl(P2C3z3s#V-Ve0_mr z#@N2t+{Z#-H)HCFU%8EPkUB$^p$&pwzk!@A{jT74!Oo?5Wn=5MRK$x>V*TX?OyH*} z9J3~s>Wj)I@fFu4&=V=;wV zEtgN5reqmRqLH0M4(+KL&#{}yoBFLvrrIndAv1)VFJuu3R5IDXscXRQn;r6qg&noV zv0kllm;2q%yyVzc-~ElcuzkDadxz;;948GrNV5t>!+)PbjY;I&u`PqC zU9ds<9>S186q^Nvtc z>Gp@=pmHW5xBD8l^t_)kVX`E$-qWeB^wARfU=xZqxG*W5IOAzTHlR>gXWLW4!bX9F zlFqY~#40J=sWUa-9MBT^8={p6*OPm^OTHCoHi3+eoH}zO>^aYqspOE&$QjAew&BqI zG{z-mLPBHo;<4G5AG-yn;_5*gbHm}_*R&Q5tDU`*a2;oR^-(JGf09WIH_2tKrmRYF=MDCl`5ab5yOBx`@;>2v@UAKu2KRV z7#2{ui?MuNkK2d5cNC7(7L`9?ZOLw*s`VS zdoms)wdSqXZ7XGR=032B+XA$~H?K?ia-$@n;^cCtGraT~E<< z*VY=rRc3kKFE|;qq({>11*FSjV?!sI;9viQ+N;^Q29w)ogt2MOqUs~gVS>991j*oX z{LXN>O}jlamljAZQ0N3m9EEW)ZhZT5>QkwmPfMuo;Z}h{Xn5E~0xkR&xUceO<2@Q^ zQ8TMK;nt6vM0C-~>-YV@ez-fO60boEVVTY#>aU2R=5@X0;)OA*Qp_|}qYZm#%Ja`C z+7`!{w?A0A8uqOH1|!NYN^UV)CQBivbyOC0j)Lo3XD%+}Zo#om^eA;v61svU;AQ6!q=eKUPVjhq}6gGSsDWply5KL#xy zyy1*P$!yg+IGJRs#t{Pa#c&(LF+bi@9=EQqbU3Xho(QXCh=$ScdzIV0U(sOuo^qqE zZgw+r5*O zQ~c&LsH%WfLhkdqcYC3_x75WwRL`KJlZYBEek6ynmuPsHaq)>+{K`;~xLZ&T?eHCH zPB$c85wYS4NX8_iCygy$v-W!WtR0i9uqs|kGFf}SgCd&(30~iI?6nTjvaUf)m}(Vg%gMGi3aY!ypNfTD2~*D@tcWIXq8d%VWUWCeA&Kes9~y3 zxpN?lh7UF312geEjDb6pP7^qzb-st5iCe8|&B2$$3kyC^5p+Tj(_POeb*Dbrb*2xh zVf*AYN5B6B#|oIt@UD)v<@V-z)i+|y^2Usk+J8!#6ijNon^$hZIVpG3#ujBN27Vk( z64uwQ2dcGlp{X)5q>hOq*T)q|yIPeb?ut$%&L%IDgM220UZ|iis)|W6v@~->&1rR7 zv9)aHOevlCpF%h@t%*tu8UWOw3u3+KVI$!Y0@ILaO(_-SoQHcN8GVHZM`>9PqnPpD z12&AJDyTQpm{o{!Zva#5AFis!mS+H(`h(w8ruj_>oXV^ZwJL_#OmS6T(yX~wfC$4w z{?Z5L51AwEsD%Rxw-Mqrj(X)6PP6fAWmb7}%lvufAFNa?ZY++4o_mi!MSyB=3zs^Ym)l@H3{r^zK?7+ogQ9avFmF~Uz-Z+ntW?XMMCr& z>fnLI$EcBg?2ibF%C@ZYH#k0wvRQpHBQ=~MMG*GcRUskK*alp1u`l0lXAi`atZrNN zk!ym;Vjz*(ZVxa3p_?F~#y*A$K`yx3MHmJ$kE_{T?w1RLOg#~#YC39vpByq|&8~Jl zN?l@_*)twtKB2W3NcROQq_+5J!t((+$c#58pFXNPU+%mXkU|7|B>ZeCUZK|8HUD`m}hGn`d zfw(ucZiufp^&QNr2vNGD;uY+270bbLHYRu? zTsU0~47hg2tZQkQjM~DLe_fUyY$(YQ)-a3zaN*o#NOk{R=By@+^C%@E`IVWt`X%=o zFrtZ{4V~XwKc;)D-iIa2SOG@?EX3&7C8A5enp?Ynr-) zv$VD`uI9Xwl;+xs{3+Ku(&C2FBxZ^TE&AGL&UR<4%?HP8HTp$$$?Hhd z2F=;zA2+@b=s_pDMlh+}!s?jbNK-s@!Nt?}qNN?*H2#i;&x^OfF-qz~4;)9k;>SSp zH6eD&qK`TMwSBZ+-S<18M}pYOK5+6jxC#9@khtCJGZ?J+R{6vPRk0YhF<8gdxFjjcGr0raM{88#{$&IJ+)pw=670v3<`3Zee!6kqQC~>@R zq`HV_0;ae@hK;+f0t=a3uk;v@B9iY$!}mw14?ax=xKp1uAHV045h#GQ(Z90iU!}j) z(*Kf3|Ld2LiH)88uhV~5{+pD#lAA4nfKE=|}?Dc0geQkU&Wsy1awLOS4RSE0y-fZOB;JdTYW-~Q_;N`}iGhIqpP~@MmrMU?WhCJEPmz^?;h#ai zIN3Uoo<= zH*)w2-QRKl3OoH@k^5<5rEg~acPj(I*HaL7{d!tPUv)=&C%`|4uU;Zf)`pH|Hr51; z|3vk_Is2Ef|M>8)!an1_;gKO=AfOZYOJ?8tOJo1b7Qore5Fl!=@Afs~|02I%s0yx@ zu!P0?Db_2otSGWP%$ReAnF?$KFQ8@>?NVS#!1f6lBiyL(3!Y)Wj#w$D^l-=PA#Y4-mihaFST99T0ysyDk>em`qk` zMsL9eC=@^XZxGR((Srl=<(U~oTPTD-;opvUt{-cm^~CJ^fX`X%&bl5bJO%LJCpo`q zBJ#zgfC3%D0#(G2#~p&^m;xUhLf?==gb0==q2gl$+5G^5`jKyui}5QEq93FrbOd+{#QUCe4I2I^Z*4!F1;Hc5Eb>ux(}vj5VpfyxI22Iq)Iny2THoO~~`t z5NtU1Kn(QHusDQQP~UX%o8losobT7%>M9`E1|FfObA>&S2(N;kniSB&u2?{UGBxzP zkOqdKef_sY`2-JvYQtmDVt&itcd>GP18%?!MYK>39CitVUqXv#*VUM}(12#s=^$XR z;u4P4TXu%OGf{lfRuRCB9I&E8gT`jcp|2#3z(xcwL+zsbpCK^gUkEY8?u+L0=w~BQ zOh*57e?_|cS2x^qyn-lKA2@N2mMUfDS!+DY9Ask7* zg&7Qdk@*oJ+$n@_)&pV(5>B`~pis$70cLqW-^2Zs0^XkkPA`Cm;0MAn z3ZxYaijAzH2d@c{K^iO#WwP%_O)=%${J6({l8R+iKT8~rOc2A z!`ZjDX|a?#C7+73dB<;<3~7vh^!98YH1Nb4q{6?*faO7n86=0-xP@EIWNCd-WIn)J z!WgzBi7!=V$lz$OkBGY*S2)%}yc|90`HXFlUBQ~WpeMAE-*Y20f%>#*_id$EqEw}X zr(gp{?)1rZRCpn1m23ge=E6S@!y5ue@#x1ve53N`jb_jbROfC1J0Qa5rJ(a^x>cMM zd3YX!!ysIWU>{4q^v6gB#U3r^&sswGoeg~(2cAz8z%9IP>l=xg-G)fBC&TX{UWTXV zT*2)GOn-vMVnb*7#oC;R|lk25|2mt9Tj7UBiB)nZA|u9$gtln_`tf8gdTp{xBI1Oh^J^3F`(i z4M7=1&2(lcCmn}$kRugQhG0ZWC!N~i%K)4Gw67&S`r;apbI<@h&`#Wf_yN2_DFCO4sZhTA;&6Hrn=14Y4C-VDICz0;l2x@RB-@# z0$Sv-*j*kFscZHu$jeokIb7Ew+%y&2_P4H7fh#zKZ@U7Fzd+v+dZi@vjU>An<=}qw zU{xbpe&g!FlLN=<*0+VJ_n+Gaw}sUDmbp#)mUZV(u7}VL)`t;1L(f?hc5F!Yi_|!T z!|>u49a^BUUX2=Kaxg&8Kq@#%FIzupnbVT05xT6eb0Do|Zu#38mNWQi&r1zobrZW^ z*|tVAqIHmL&xRcu+3JFH>aP$$mMj#`^e-a`_lJ-^X z@mIvMNNr+y_6eS|1dA~g&M2}_-~eQ#0kysgG9`KQ3egIaJy08xZsLUsPI}(!dYkbj zsq;beN%QCP0rQIU7V{zVgji8UvUT~-(|M*^8oU)5jX^51T;gpqr-dCVaw_!lwki-R zV)6)7i9eJm&s5oSZMApedaLu&@(S~c4HAiTYsBmtcJT(#2B^Y2!uupnBo-xjC9Wk> zCB_n2saPm767AO(mj@*y^44cT${QwJ~3W5E}$qhC#RTtOglGL z)MvbC3~5|w3_fv@PLvn+Gi zx^08SBfKM|W4UwiBRL=(bS<}g$5$vOKiV+Ruw;*6s92G@s6a}ctI%uIBN>_s+k4}J z(~LccBZ;$t{e8#sbljoRxsxM_m&NrYzC>CvTe>ct>{p}Vsuj9)3MTEC_Nvy0qmx5Y zD{J#Zn|gC$ikv|mN(@_8W!7_62#?RB{nhBr>gB>8t8<#G z&As>Oq4AK@y0PN5l;iZn*Cd;!>=OK?s=-SW9|xaKpNdc72P0>)wybwYPK#E@mzm=# z5N=SkZy8V|AVMHiAavknV5DGHur}1g`Y`q(=I~C2|s`u1BlWnmEL8F^WT& zFb>d~D9)@}q};Tg7Ee=%jfk_M$(T=()tILy>k;*lD57`~Ao3Z%@8uu!EAsz{`rr#i zg+-S{KeH@SHj*^*$S_%3uYWYBT+i*P4sA(Si^r1Ila`Vdku8#TN0HQ&_{gnBtjiHo67018tIRB6srnfOhF_6RVNCCSD|T(st1GksEr6bWO{uk>VhH z3vCR~0t6dhjC&@bCN;2~3OOr0^xy<#)Mpsi1hY$evM#YV(Lbj3%P7zuXI*mm?7az? zHP^GkkELfWC02d=>^X~F8Rkv7M|nb1LT}fJZQd5kbb8c0UHqfP4AHjen4j4mv%lnz#fZ|i=~%b#Iu{<74lN{G zY%a-YJ+^tjh-^pUTiaXfoJ5|rFD6Ypy{ep4T&%sVdAZbHa=(^r7w@!5?vQrwc7E-T z1OJlb{9t+31#i=Ci+KclaD2mgyxj@c)F)VpLlu7md}_pJQ%yo@lTTMf<&!D}CP<9I9G zZTL9#vRU7%?~-N^082pIoCiT?*oGX8~i|1TiN^e>*3`9k;q6UZru3jXgnE;HFh zNpS@&WU7O$V;YHwfb3&2kdVjvA3-n>fZ^1DyLXI@!9<^ag3P~l@T8{x78|U4xS;hlYFnf3k|T3i{Pc+< zViO|y4g@84ShJFB&s8~0E$@mF2dY44W7|g(kmJ69zPPErwW%*EiNYys-D}`)7 z7fXE-vz<9B@@p$g8tG1cBv`K2FVbz3d{1ydhmv?2(7_|c+}u-!6c9a1s_yt7vRunB zMqw1pi?ACIAc(|%j&^&vh-VJdEFjk+ll^e8FmZz-#HC+m2S>xkFV}U7&jt)siG9*L zp{`O>cl9vQ^yt1-Hp#-kr0Q0wrg7&LIOpf;i-)GqT`OC7-iq%$!|t!j*JNi?Sptz+ z>RXm)<#ZirKo2Au>9}>BNycsc&!jMBpoSj)Z z0B2j!QXR3qX8YTWb_H`hrjA{_s&Eyd^Z5~rqcQ=64~mM5B!7;N!@#9X8NELueC~B~ zm`#lIQDV~~#4x&l{CUBL)(W@YkrE(MJbZwOF|sGk zqsGkN3bgD2L5c-;%zjGkt7N)70;{uvhz+)y{>E{?5t zGlmwUHA^K}6Z}$So9}5K><-zrYx|E)luLj39)~LfPr^XNtr+~lF7jAN4KNFT zc*0}?5=#;#1T2U@5buGAz0C4{zhxbXf)U*MwG1e0qL&5Q#c{}F5>Uj0NzfHYC{yeG zl*G-6w8?nLItUX+IE_T@G1U2WWGhLs33N%}X zB{)~;Hrre;UC+4+Sf$4mWh;1{OE@05!$0b{g9MNQG!G~aa1O8z>P8j5_tNVGO|7w3ndyACQzkwCu>RqhM3iKl1e_F8Dy3|*fU=NTYE>#bPj60U zu5Z3#{<=V07By8o<&rg(smuJi{}ysm-5TcJ{9=CJcfxa$fR%>TiG_)!jFrMX$by+> zoi>tokoJdpsNPfqx&ch%K;ut?4t-MU#ki6&X(KgU@sn4kuX-=u})hX4#sae&ZRKN7C z_NQ5B8+r`|o9`LcO%`n&HdK_*Y&mzGdvT>{S8t%T$+S&9z&#MXlD#s3^MtsDbih3> zJ33Re1$r$Yo*wNqPhLmvfs=cX*UX6*Z)K`aQcl87=0n4vU!l*_VA#*t?KI=q$I%+m zM(VoS=FTgxCGBaPzKlyRMg4K^x9Z}fex-t!gpU)A7)mTo_=7bCtrMD3r5dMN z)fE3|aA|&7%*)9e#v8?p-09p|=0*3U{|@r*{IYSoboJ+D=~Wht9jqMk2&w=~1WW~- z7n%_g>6;T+Uk`9kn?F9?tS*VxJQ|4Ln~-x5HzW&;HtLH51}!ynIoX+8v$CtVs|y&7 zf$&eE{x-3g;n`u)h$u8kG#8N((E;HFQE6ch;S^!X6g6t~x_yyIjYxtb9yEMxR1Xqo z`;y1m4atzbvt6jY3tA?vf-5zzjA9&dKxLXLHVaUBD2U3-Hx-BjT zU`q*YA+Pa&2C4o;U28u9-r~Sg0&4?jex~$mhZ%}jild6}fyfFpY&+HJ-uUg8B*rG@ zQ!IMw@Dl?&3XA8`RYzR)4I#ULBSS5`JE1$NliG* z0ZUZN^9|#=3iGuTBAuCggR$N4U0Krg_|q+QFV*Lb@rS_kj>3n+SC?&Ph_BBF9k<@9 zr5dQ~tV~yKYgZhM-{jpiwW*$Us_1Ll>A{=D7{$~x{;utis4^E_C_X7T@xzKqJM1{| zXgbea9a>xJ+OqPQ1C9b60O!R+!D;syew4HL%3}xg*LTYMrcU!tTDweqbbWrFi(SV} zi3W)l4)w-3EpW{*vHfOCWbKWLAFSE48?t%dz8CU9E<2WE%5QlBV<+Ue-W__vzs!Q+ zUU3WeDm^BD&wgl})(F?gU0h!bYb;KU=SBOKZu6nl>md3w6B{(*`^yDw zr^lzxI?u7!=KBnI3A_&9xI6p1>AT_CULHA=?2oKczKZvSrzPW(j=Qs*CB3P-P?MP8 zW+A%Iq~|KxzHd_{Q&b}LA}691qEnI2ksIzccLP^rktuU~L0yy|jgLt)W!c^?uN@`^ zBmGwvGpDJ15}Us}IbIeYto|4s?a#TGT^1FGZ7D;j8h_Ix^aON*W{wVW0DDD!D_cvz7ac^WXyy+1;z1agSXusyDEZ=KzDTRT>I(YS zU+mXE)xVnlZT{bQjfGxtU1U`tpsN_w0_D<*d~@6dm5PDd$4!q*RDM>HK&e{f_*h}G z70B2?LTo<4+i0$f%?%IyoX;)3d!Bgz;Djwqn_h8u3O6B{^}y|(e%QNhGFMwKE?e8E zPM>qpuA58U^PPdGe|7kYdSfx{2esXU?9&{=VyCagClG(Z|H@5L&413uxMuU6Pw?XR$RglV4S zj+bF!=66{+9x{zbLz;NMdmJon^G`R1jFxIPo%+kaL>;(d9Di2ahTh7Za?fAjm|rb$ zh2#XV6gn3ujXxxY%bUp(u6{{pN$5-NT5BXU+gm7DOZ%cZr;-A1$P9&Rcj3O6|7K)5Qt2tODOyBV_uaT_#$`ny9J&tYK_f; zkmF-T>#Ism2bFa{z~!>GE#%@vJ=mG9#kMV3YkODQWQnN7VFps$)>(lIEhB>q_g0U~ zchB59$4sMItVDuWhA-U`t)(-3(E5+0zf5o2_jEZ~i z-NXj(QH>B?EPY+@Ym);D^6l6PT-G9;VVkJG^#%><^3ksM;|Ay z$PPSC+Q>)^@^7^BZ{X$p-Wuhv8-cH-1N>W`i|}4ry^(9IZ=E&{shpq7IBzZ+?AKEo z?5l&-A8NmQ_Gr*}2zcqx2$je4RKH6$WY%x8J?KDRjx%;5S!@B#GbaTbFYBkymMna z_+9a}J|WqB-bLTW-|ojf1&r}_JGg;)RBdAzh*kObP4*QWo-q6I?Vmm`KY^9G$|3(h zX1BlQj=yF%26{%;|IBVoe-Xd`HyZz!LI2;TnDY+J7!tPRKhGE0y-g1Sxj{chCnl<3 z#rac8+f2SQMP*g?KLjY5x(*7bb|9vfv?msL|AObJ!#DN*>}$g`v&M@v*Yisv2*REa z%M!xF%fg2D(fD{gkR3z)blxy;;I>p9dvqD|QSVg$*lB~`xH;^rt@GhqkK}FDt*nH9 zU3jonyFG2bXl(1V?xFiAe_SI~ZvAj?TPbH9^LA<1xjnzJYq?xp3h8@@9mT@}q@SKw zUZT}pbgs=#yogP_-`8m3{zjK{UOMgEqP9^`ZvszV@UByOy=W6Iv|NE~^j^45I*p6( zpg*O&t{#jJoFhu+A>qEQy?Ci!JC81Duy*RuK9BY~VMrutHs$kNxa5|p=hHqE&A;U- zLd1^woVZc;XN^AFyYY5Y`(R`Hv-O^OtYx9`N;B88a;M#ONx4?>5F*{B^YP3jR>b7~ z#4{hKckAGJ+k94~`rdi!?Aae#wYc>DVXIcojQZin=Dw^|)yQ=elD&2ci`shX?XiA| z;h~F=ZeZTWHq_@tH!BC-nMPMDqCMl@(5hpV)3Q9~zMyTRQpQ3Gmj|FwUnhwb!jvB9 ztgD64qt={>ybK4R=*{_u-Qx$t*Cag=zq)_J>E{rLS3r`<;wUK50@{ZMr^a4!^ z`J>^oi?f_t#N4NLJZ7NNg{SB`+;#wQ9wth%A-1+5uJx9wQP0Yft4HSroG1&sc4OBCd?OBP!C z`!$wI>NdnTHpnBnJ2@(-tLK=UbyyUm%%kEENh)HH$|QO2K-S)^yR<{*lk3xJ+WG+8 zD%BzD4gg{K!_wNlgc|O)njCBW+GAPg7+d2v>@_Hv{ECy<8dm3e?>1h>`PB~Rr48dI zbvk$$xh`#7b(^=A&3oH&x$p2;NoM;^?<}6hFREKx53_yxpW7A0RZ02%VnN1`t`_Kx&6*n5EXRV%r10f&XX4h+prZYP#e}w zxE`?-iu|TN_BD&Bo-&)*dvq_wfs@yV>`7q~6~f!~18P5O%yrq~5Ow;;s01%RX;+ z5eb83lj$zdb*o;m8yokG7rwrO#a*krVbi*>@&4X4hW^?3)`o6bVt`w{b=rr;S{*Xq zbZP}J2fD}rc0zr6wDJMxkroL2xONW5xhix6Q5hmkZOC;4IOa;aU&1!ZQ93M8CCQ5d z<9_hbt)BjHP$SdZTQ_ zgw!r2g?P_xO?F8brJJ=#@P(^zy5EfEo2eurifWmm#DMNnf+_t`2G;{Az)i63{?JDN zsh-VQ{lUx)NqYWdf*#@@;K&-KuBUAZ@owR=u6(p;%=7M3spq>$Ija!upJL&9$tx`- z)2U&gxps|KrS8(fy|hu~v25R3_ilrD%UzhhTmkRD)?Ei1%pV}(5rH`xfZjJ_pT2oL zSa7ky=jHKk;g@f9zdca!@os*xe@;1w_}pceD+8aJdYU_rbzK~GsJy;x4QhD5KlwNq z>mM<$cVIs}$B2dYZGYJrqazl|m>EZ$&=0^t?za2gYpGuya=vj=uU!m`60l(ra4fGH zT#K2}NR&Qu)ct}#YWzDd)iRjX-iy5!5{!fTNRVeSRL%GVs&?%+46I#SX!f^EvQT62 z5-J@&d!jMIrC>N27_MKYd!0gx^oSI6(EjlaMR57l2la#jKg9GERB=Qi2<*awM5+5+ zeymk%r=A>=FiG&w45EKT8Vxq?Ng}D4^Le7mDQG4D$WlvKmJG3~!BlBeqa@SEorARr zd(d8EFPM!RaeG64QX)^Z6CIF{@wg(E$y!n*_YdaTF4E-z{XYPYKybgL7EL&#W)O<9 zvM4io;Y_M-DV<@s3MH3|XQ{O$o`GhBem2so?#{jua8Q?^OHTa~>dR|CE0_r|5W z1zZ}D(KTd$9FyKU&UJNr|NR#~fAN>=zn&gG-Tmv$+fQ#ke)yrm61JwR-wbVafR<@g>t<-{~J8U6gqxsJ7GheUn*4^sVpNt6~wOd%~W1TCe)Mdxm|JhPVNK)+NHQ`efkTutnJYuCWm5_~Bg&?%ggQ0}!o` zK^XpryEi{D2kb(Pafs~=##>u18hYpji))#2Drc5#WB}B+#mO~J-X2}+q|{yn||?PIM%jI^RY%O%J8p_ z^#XY$jCCOOH=o|T{^`@*6qU!8E2F;N`4x~xMXO6=9fsq3t?xSs?uG%_tavg->?B33 zU%fo=cTAQNz`kAV^mV_xU&R5eiAx$njA#z~1P5ySbr6*pKPM|)Eo%~vXtjeK+FEw3 zVnjcl<{3W|m2U5^Z|^?bynp?2a_nNOs4`oiUhkM6Cn;GbTH;@3!4_ix`X{pbFxn^&r|xLV#Is=E4*UQ}KF zaK-2U@cykYfA_~^_k{GNr{#`Kq-TqEANq$^Wj%@U zjzJe*s73HXVRe&NNp_g)9Y+5Hj5hsZ|A9&D4)`sW>+V|S=IevDD*323y?j%9L=LoX z3@S*j_@dk|DjxQH->7<&DG&<`jT~24ZCQEP@Z{+_E@U7?DqFYeu5teCc9?ImK^egO z+UKq@fjH<_b_RibG_RTfwQkX2(l3uIPOHrr*Zm$F=#hbx^+C9TwRO&FiMZCQ9%I!# z=4oovNEon$YgsqI%f{X95%B3YdW+D|^p6=*B`q;SRggWd0NTWLi#cWnu5|Bl)#SK& ztyi6gYgzX)T+6zF6ldVd@;E#Z*Lu}?xR!Msi-`h`p4+m>~zra}At7PNQd#60>Z z2vPft|I$Cb3eSFrYV0)T`*v=jGdqo(O9Q^`XkNPmav@uWWJ6fc8hx$tZQPbJE?aC% z)=SAT-KtbCiBs;xUwuF2*OBK;?_t(Yja#+*seBFhKC|ChKQ&G<=qDSu+Sikmpt*N+ zp}7}bIGVYT5=N}WwA?c4VU3A>g0}=Zhb4JB_Z75+MCg9;+v-V+KW9c+54MKH!5-c6 zbgO?c;6{TAw&Z<<`tnZ|7U$M~`qV8^L1b;W7>2J9(AA@n z7-L01TyB>?m!T{6m7gppVq>V?Z?TW{%h5A?#%_Z-6L*WmljHti(z!Zfo(LQ0Hd1`q zuuy`-Z;gADORYP}M|=4AdIe9yBDg+au6%(ZRS!T23|)cZ;cumbme)m;-;K=~ogCDgwb*w~MqjVC z{mlx6c6Gq9F(k-SHO@i>? zVEDUR!;9r@Rh;c^{Vlc>vk~rbX(sbhNgJ^XXIn4L`uO=XvmerhbHA1>xJ`G5wYSP; zM6$MUkiqO~@7t_y0RO&cY$*)7mpa%{HkvHlEoov%^-osX3SXW?W|4q zrD)Z2^kGBW8mdZtLu+bRL@QyZijEWW$+ys1H;|LE;dGKN6o5LMOYPer>OV}LGZwYBbnB$<_ENg9!h3|&D zhwA&V+U6~k$Gh9tC%ltQww4+klfi}n($Bb7kRG<(ZCo=%60dHKhvu4by=xU`lS$xI zoXW7F;DoNx1DqefMNVPPk3Lv4V*Y`x{PgMc=Hu%JJY(OZbZozpHS90#q1zDeTyvvC ziNrsC#-Y2tzggiFnLl*a`}2klr;$U>5t_*=6GL};_wM0W?d9Wzsfn0ujaV1#4xCmB zs~tOPr*4Lf%LqLb zN+gLRp0^+&PcHD({WHi^_{D8(9-Tg(era;UqPYPv7`z;ycnUvk57$fd@cF}K-9K-* z()KfRxb7x)55_CCR~fI(A&4xAgFkik>{oZvMsLtYSw&|_tJZZ#7~X7wOSr}DFRsKO zjmDLjOI&|Fy`Lhj)ZAdF6=`j@WA$z3P)QX}RzMR=wO#+A0b_HgB!?T3%IVYo&%#G<*{aKW4FD>12rvjx=E?dh~S?oMbytJPs$Qdl-* z^4xG52eaLt^LTO}Y`Z;Y4u~vs1sqrj1v^ez>3od)-k$L0yc*P>^5nT7;t5Zl{7jn- z#y^4uG46N$nge~o(`Suc^w+JX>njVoyYou${6VTPS5$N)* z1NxauA4cGp{vxoB*3uujZV`otQ6U>nbRup^`B-DxaSPuVQheN^J&#?uzM@zs78({f zR#J0>F5=_aiX89M+7JHL_!uf?`vSJ~tVeakX+zGDZN)S>i_Oz00;H_4z-XRT;OR^S z4w2>+c=8oeyhhmr%QLUQ(^L};7LyQv})|miHJYAYg0s!kvp~y)bG`Z;oXb7yVw}tBL!8UEL!4`G zFTlB8eGbm$mUl7EW%VJ><=Y|7wYL}GT(3R{=W@rq80WJ35a;sk5a-(43vjMgZ*xt* zdAGPG@!(GApTRZl)aRVNo$PRa&E3T=g~vs{qaZ6tZDi-oD#p#-Rg9056(wE7 z&D~XukCPPzYTWItB4?NVUU;^mzBeI(z$4qJYBGXHO%UpPlM%xAH4z~j3Vm-PLipZE z2&K?6_}(Oh@O@1{$iBzfOb=}VA^Y^G=qa{hS0Oy55sJ3Daxx8LdI$hjq=T#zeQnY~ z_`DDfL@L9qS@XluaPSlRqMQdVJWbEg9VdVe%44!S;HkyvscBM2Ash|fn&Q#?Lp306 z%eG65iq0nxZGxi`A!p0@Y!oo!TNn2JJEET@GGTJHG6Gl0f)l<|8OyTLVoG&5;_*{Y^zYM*QzwLNqAsGIsx}xp+S~y18erBn3+zqhJ%rEy&F!QIwMl)gyeEXuz z(!GSIoOC+Dc@SKk&ESFr=g=z45uVgea#Yow5UCl!$>WB$gm6LB9?1ZX3|lgS;&8^w zXW=<1+Gh3gZY$S24u-|}gnrReM%HVNQLi`>I2_LCS<4utUnZD9Gm3PPA2~&O$8B)G z=-l4_txN)UU;JhHO>Jptk^JfI-N#qW6%xCwtdJB;WaRR^6_Ofju8=SpA??B>EvNP} z(`cmSEs0BNYj0khjHWcTpWr&YJga?m9;kCNbhMf6(bf_P=iq?>}q64K9|X5;Td&U z7VmDaf4cefQOAd`IlcJR^37MvhttcuhY#QU{psPu-NYc1smAp*1Owx_RL&6?k>G-3 zA$yc+zA$~BpxTSvpssy*KY&V=cfIA;# zzHkM26=K0k?g-@;;`;?6l0A`mv8aFEYJ-iMlc@j~(v4vj2#LqAU=Rd|?1ZgwY?3`= zwds!}JHtRZtnRctlCU_dO{4LHWn@L1Kn^q`MfNLzMLbsqmTMO^tnEmUO+JBDR(I-U z0;_x*8lM9e2fH({nmTc5z)oP*swc2&Zy6&uT57U6T13{)0V|oIWWY*b)v713YHuT0 zY3ecn!z6MR=`yg&Ni3@mX{&ters9G{7MGP@R2MF?T*+UMnO5ffp+R4XNw=KMhGhq> z-m8W2G3kZ*5i4I&8$s0Sojw^KCo8H)eQzo^>b~wc@HxtMHcEx+Egx#)@LPQC8v8}y@S%WEOvlsx_mTL@`V|ge>&RG2`$X z1iS_lK4To0%e%(m-8$Qnh}P`#gT`mFQUj}G!hw~ZNfeO4s#Q;5)!s&)m2s-XRN+|$ zR-Fltz+#-UGyMsyTJ;20?QI0B#YzpVIuo7%ORO}3RaSS?l)x(AhN(ES9~xLC6Asfq z8?3VWkhaRVu5oera*?DpWpWjUBfsjV7nxs^k9KIkW--e-{IbE}H%j_P{_2Z4yss!m z9a*|K(c@W{t?RMM;p?8)1mZjnpMh5A@I!_@s4(X6!}J8HLUz8l&ZyI;XROv|fRg7m z?m89QYSs@(V|&lPFE~6$V>1p94(!?_Wo zBzh7r^%V=22vcQQaQ^bS5ZmKeV;SfUFi31$t&FNh^Zp*Ix7{n&pWSz=kg z!V)hNdSxXW$faSqc(aDFP~%8iE-Cj_49sX$pIE0MB1EzGm+QQ#X@Ofc3f7!1mlvYU5s(9dWsSllC#_4iS~UyIlDYj zi}QJ+V#em)o_Cnd)33zi7~LpSF<^OhL3)rPI@ z5f^kQ!#=8;F%)q^(F&9QmW(DVoo}Kneuf@%+;SH|UPhog-k(loRL|c@WA`sk&T28 zR$TSs9$1cKL=IhO0%GM@>Ml;Q!HCmHZ)E(~q259h98y`!q;)*@Vu_lr5RK_fjmWb< zdCDY2qC+NT)qy0QZ#O6I|CS^~HI#Nh-jdtxw_L1Yr%QZ(8TWKY28G&*-g?tI<9OasRe!<=@Y+6EaM`H&3dcR-;fri zrwNS$6;Q}1^WPze=p_LlsfpLmW81#XmB zcSIW07LuF9!9p?$t}Y}F-gvMAN@*eaDBv0W2I4uhkZe6mHyqxgmIlWUqBlx67ZPrT znG1<^5*J2TJ4{DfNcIqy%)~;nFa{5)NQDzBJKSEwg(L~#%tG3b$Q2PzNKP#zEuWbS z$qUqqnYX3~Yt%0!A67BBkTxU=BMj>dY-u4CuE&~%OAN&_3o_<|Y~}K>v!*<-weSX2 zDYHQMlvr{7CiYaembsWG(s;>pIy^vDwv$DKL?5^kvt^0Fa##4Aj4Nda2~e#11myU9 zW62k8Av?IAPcM};hUJF)^SW; zvLm5D@TAx1s)TfXfOT3Q0}^dUlO$SC!$uA{f>qffhLD~ew-RHndh+d9AVnNFCRHcv zk)23{HcXm!K0QoiEH={IZRmJbf?hpl?Hjk*x#TpTV^nr;pgstM-j0{!= zJMQ*K7;ni7LhNCl8f=^a3m&Iw+SXIQ*eG$@;5-?U_uQg(e10@r@k-32b=BHEV#7uO zgS>Ti8D&AJwzdcvWk#-)*HEL>WXZAZY-*7q?C!NRP6|hJ48M{MttJk*)Iy|F3+J_m zxy2SSx0p{icCZ{>%FERT7Ac}K!eyW^*k8_1SOF#^5Ei5qE8}ehNzCP&vSpUI3g2rA zo1CT66tR(6Q;{Rq)4_Ro9NJkNE&dz?XRe(~bEM_R;%jGwYqe!LO;cMDqS+&v9Vj2{ zPn8Mdif9=CG~mWK{8|pHaDq;nDZ2{9^3*z{a6P83K+G|zdd@B`7(|8%$x)nyVpmVp zLx3$p^TVsx_e45&4MtS7IE-oJ<=Ui7ajC4kD9?pG?8OU0iJXpE-@}WRvURK+G~A0& z8EM^!!ez}yEqkRyB*%%7@{TBLC&-CUDHk9~^uikMPux>;%Vi*b?P}AiGL{ICgn=5~ z1mD?0Mg!!i1;~-Bw?52<_xsbE|L2FR$GeZO-rj!m|K8rc`Ed6|d&m)jy%<>Q8na@B zhxpwy4s=xJ71kng>vp#f*=%ob$Og1MRe5}?T_Wz)u%Ev~ z1}-PjNI_^dgH^CW1~-J-y9sCyuJ{oBiJ7kqkuKoI zKo$hw3>EgKifmh;Qkz9I+?&V2!kJA#KH?*yO9DI)s6}-oJkT;p4>mNUf{u0e{30es+D> zR$oKaa`3MAWE6{hiS%18gKL}Lq%I@DWP(zMFpCs2Tu-mx+}{1tn!waznn0xv+H9pf z3|03nsU_1=s!D<^9hOOLUT%;;WBvPn%{j1fq>xI61wPx+KQ*IRujum>Qy-NU)VNQ!u&t^f-~X)w&}B zwz^R5CFe`s%S32F>Psx*o@)Y6`|axf?obmS%7$u4kz3^wb^uZnDdnuY*kY}__1K!y zMoJm>e9E{MwXb7?wcZ%HN#wj_7fvS$IiFszvdI~8vBgSv2r{)9D`*(wqMxxWeP9c@ z)S&Av?(G7li`nKPYnzmlLGIoAx6K@6Ws^1Ra5mNHG1+|+cF<(PN)9VjcpUC~EUr4@ zb5J6D|MU=^xT;`_@56toCmbEG!n3bgiGnG77dSp$G=&^U7RsXYG~pM{L8Mu3yu{au z@lm&5TK+IjaPu@OKAYRi8pHWkYiv}kj@jk?w=ST=cbtknJo=Wy^0jt{#oA_PjxOUl zIl2~41WuZ%oel^v2@KL^hJ%PRI7`Hpe7&t(NmPT0?w4#=I71^`Wo#7VsbUffqX!M_ zu8IZZ`T@T10liuO7XD(=;f=6pDWG6sdj2o#BrBZ3BB%6nE};7wrTe+yR>tOBh#+4G>UfAdj?p8Uk-EThX zBhY7zI`>7KANBsX8+EP0VNR4eCp->V=7@_BwG%uABW2e7Phvc@a}PrAd<9{vZ^^wu z#0n9y`eh$SZIP@hgO71A`;Yl`u4U4c`;W<&G4(M_&;hNels3dd5kSM&_H(jAKrsRx zVfF&t7(qNO9%g(Qf(HwQJP~E}E!TeJdjAd(m<&peQ^V^Q1UzIOqBYPtrtsX5oW}% zp)^Hxl#s!S`X)*GDZ<86;3JyJgQhCN%n|isPYP}~MKvdelfxEQ139b&;vytWkSyy9 z$}}%SJchD;!Xv7i#~w*~1|G|+7tP6lCtrjI%V}aV|_k_m^&FW@K|2`{eRG8kOu2Xlfl7^^DE;|O(fVcKksA=@t8XqGw}EiSQ)t>7nZ{u zK~7;vdx8a+3b?%AfSAzqxTs4zS;ZvKDe>%@#TA6Q7>kX}<12{0tAZ2iLWP=OH|POz z4k0O2kZ?CVwvbf_;u?YXRpBoClw$%10qswVg~#(1g@p-j0j40k{gec~tRH>u1ikQm zA?)Q7n3G-+iHdEDBclXT@AYF(3Ve)dx_6FPhE#^O9?NjSapx)QlnXGgxBYR!4qKKK z^~j^OS(6$lwok=ard&h4&SJ#2h9#uJw1gA(QG}sZmTG#G7W-I)DWrnuef!>Ejh&?G zSj*ukQd=##0G$9WBR4{@567P2h-HWbq0G`WlKrU18Amnl5DpLFYxp@ggzvG-Zt@ml z8OgdxiNSf1tZuCgjp@+gPn8TGdJkpPjb&L~w6xUts}d_Tt;LbS<|;#p-~y(kved?caorQlqT@t1 z$l+nohSXWz5}|)^)gtAN4@yQA76OwEj(qbVP=@d*6oh`<9~Ya)?rEVcr(41>y=5qC zit9{hDnyZH*8Yj6Ue=r1!!>c6hJAPB#ZHc;a7oC`T0v~RU69GOf62+D+`m6F4uq(( z?3kB$;)n>rp8Vm+D0Zti%A)?^qDFzf-m&~R4we5V(l>lUj5kXNcl>?@lk7HGI@KQ5 z&#ja~I%&vzPE{aeleACsd|)LWXv!DBr$WIFNvq>TCdA{agaX=n<%>cqQ+jf7O-ake zfKQS$^*fz)>L5;(H}7VEH&{vK?c$yxnWnDgp0%q_D%F>&?vqyoR=9p7{ld&`V4*Qi zfHit+V4YFl6Ii3_v%x~Um;h_^_A;;oY*1usjcBJGjofbkh>I>D)BAKR%}T{;+w+8wiH95a7A+3 zN7(pPHHFR8Qi>GkCWh@VuB~hbbf9MiRR+QC<0x*3&5+_W9YdESLdTrBSqx1`<)}vB z=dT}=Jj+%xc1NsylgwHZBQo0tb~iOK14B{?M2X6?CMJ^E5StkjV`R3C5@FMLyttah z*xKuVv}jrr6Ul6dO|BG|a}zCLa+zcsI(r31@ zqRe?YLev;|b!FukSKG|t0|N(VhSEqh{ygN?!fGzrVZCtbQF{?BuAaH=Tuyc^tVZOw zsBk&VO%W^GSGTo&RoR~XzRE$Ge>~Z7tbfc;Vm(LFTbyC!0(-8@H>#m%=X<8uE>z0ht00yQ@Z)LxK$fe(9Imi27NpA#tjU6z^6;PCr9~noh)RSYg?~fT+mn zu!u^m&Z+Sct8)#FfI)}BR%5Bp3$1gyApyOG=(xkM(9&%x!U#@WoMjqr0J_=G+z|{m zkg0~2_uRn*&@v~AVADu*G;+V^WSyV)b9#A%y4g~|e>Bz*Wo@k6Fu9g~%LU1ph$j&E zz&+Nis-)$|Rh0`P7IdJsn5kG&_2Xs4ZN)L$;I3knr_XZact>CqQPi5xZt(jA{Uo$v z5dHiDoxK=2^d|55}^2Kx^{(9tKUV>iYh z&(Nm{%LDq9Zsx9!!|L7^D{~V-+5-`sp1cRLDHcSD7Eu!AMOY1qlEg{w0$i|imyk8j z#Rhu~$seLKA)&Z56mu2ll66<2h$!+eQgI?#J_AKl+#-ro6E_Gknc^n7mJ?)^k?=B{ zIAImdpr+!UI#)sO_v=lKBD2CuPp7D_zu%1Gws+HLD}toRaF-V5@d1A)$v%? zsvMMfVj@=So@}C7$FZzcSr`Yi!Fn+Z$7o#;#MYOyJ>-?gmI|gOm|7Ivbk5q4J{M3V z>|oZiTCr?sZ*a-2`4Z)fSYX;$ zv=vBSB&da4H>NLcS8ERNk*I4=?zzn0tMZ8tgF1NDlP?^n8Vc(0IlWq7>$DFk%%tW{ zgWdcvfPGer^OpBek(4t(lp2ODHW+qYP4y_cl*u-jv z?5qgIIg{0pCj&g6odAhKw_X1%i)<0#ta$vI&i$Jb;3a5P32?oeL4Z{!eSNAv3jsE< znoEE)CTlS~$>OC!lNToh$o3xH;D9v&a;`#y0H*0t+G@A2o5&p>Nx8k-=$789cu!?h zXt3F>wz_`9DKz16R%OZfXfIA&CH7mDb!aP;fpbNr@ja_Dk+($tOHqh*Ls6@$FpfHj z(u$wQ5rf*+!DRy!9v8DJ3ry)G5x|BA)K7*!r(Fbiivo|eV%bP1;f5O1lzK@sRNAUQ z3ndh6HtsZuBf;<#wGm%mJi10q@_xFLwsW)*Ta)ROswTi1 zy*04Tc_ooV-Dr)f&jyQ2A4XtJhAEp*KF)Hz`V8&S!Ch8&w3{hk)m13Vz^qlcutf`( zFiFV?wU*Kbfx<7QxlzsARoHVcbafVy6&{{N1m6|R#m6zBfDZy~@7KSWVM1xR;hF+D zkYlkPg3?(9GP9Om4YS+$y?5>ud7JnYqdcru*JQvmo>ZbF-l9qLK_jM4jog{@P%3od zK{|~KQS!zpk5W?hGv4nU?J%=Rd~Aytsv2leo8uf+qozScQYlI8X&V^XoE)i*@EDSs zwz?r6s7&DDNo~qlU5#E2OSr`23=7Dmx@MpW{) z2F~@IrEjc^ovb9PIg=rx!oundM^lqg(~25I^|Z-IL^Z@?#$@b8R5S2c)?<}z>_5|F zB%&JPF=IZAsAk~NQheqz-<(r57Ki6lock;`llEj3r!7eIF+(S<#wFKR_;Wec5RVy? zVMIm3lJkqB8i`!T<7tZ{5!Dcn_IxBxg+idjD-I8nSE{biY$q&Tp^F#)#pPpvwj?&S zCvv*}NtCt;l31I4HGJ3g8G0_I4e^*mX?A}^V8iVh%EYg7hL%s5p+ykA&TFiR{D#OG z`JG8-rj3$2fzB->ZIne0qHLo?#=UT(tWsJ{^PX+SSz7`>>^5FifLhI};~w|Q$5pq6 ztSx<>va9bq&N|EX@VJPNXDjM^WMFI?c$PVBt*p?^p2T!j!R0gv66TC zLoJ1d{Oef-%U2OWiuo!+M5qsLcNMbhNYA2+Ee11?u+%uopyM80#bI8L0Z?WF3Rt&H zKoMyYUgX2dQ!@M1NF|1-kEPlJKKmV)XJt~RE*Ivexjm9~~{SNYaFT+2t-v0c}7Y}#$AHVo&`S#5>U;NTF z61b;cba}!M1ae~R%I(F0Fv=ki?})il5`wta1Id7D(G+~c&4MMkSj$vb-u}W}8ON7O zCOo_@plruRWn-spVvC&q@3R&YWXiN~0c7yQ^>N1xjUYpw?Qgjpbc7NcL!cS!r*h;@`FUiy3XxC;p znj>kb)>OPlph0ni^w~8^uMM&&JvKcgGre4eOr(u|Cn^2?>mOguBX#ShLF(IhS3!-g zG+f2CT3XvJf=W$gq^`(4^49xyQre9PQcvwVFR zlW}mi=zJ4H&a;879E6^dPa0f1HC^G_>7L6*zms(S_S46Cbnd!o(D{Y~YHqEi!4JGT zP^IQRyO&m1e>2;5joF^fT9=<4U&fhdGiuL#C1DSNh9q<4jGg6mNt{55|M9NQg08=1 z)ofRS?8x1@cJocob&35;C{*y>A#89FY!EIoTGaWjpUX69AwiQuAUQgzo2+s4R1!4d z`n7QWZr^XwKt>OiqKS``qKQMkpu-J%-0Uu{szF9gB16;a$Ra2+G|9HKA;Lw1zS68) z4r5n9WM?SoxkKEgXVUlfgrF|ZYF>ZJvueyg#CZzc+Vu~pn@ety*Ubi~tNciwRpsafyp_R#6hf+oDR81%?X5G>#DT%68OO0cuneUe$f<$#CW4ja z#IVuO_-uxzjgEbF;D*`b(c8qlV#WZfp^2GkBb^J3&a#Nlc|zd~;0$~S3AeP=Oer*_ zQ*)L4%8*UXvqT=fStw=pG&##6>l{qc9F)o_GTTNzB<9bwd}ol-BtEtt2NFGr86nUh z15H`cMxLb{h?35*qQ!zhSr^R92#+DDiLVUtAjLR%1WsDn+1v@ZMSf}OGbh6v&+~D} zCSyNMT+PWyw;4B)SdPzzcQVoi*G)Vs*<;#xh*uT6Ldm=ulOaNx zo7EzoXg2$mc4o^n$cE+_gzZ)Fk+T_9tDjXAA!;?6@ouC0)h(55urdV^AoUa~nDH)D zXr!e`pm{^t8VA@JVAzB$ovp7CA61dD8wG(CSXeq+k3>DcMEKmYJ%;Pf@RJ^}R31cK^`IXW9LG(#&#ULB8ki6!MJW#BIs!8YT#|KXiMy zk}GbxxfHp+k#JF)JJ`5W4pHF9dm}+z=xzE#e}q@7CX7b5NFcys^`{}6HKuOk=W;g{JvEL{FmuS%{m#1>r zdI%tJ>zaJ(f!T+$$;v6%ci5NrL;G#c_Z9aZ2WWg8R`!OvR9RT6&YbNi!;5y|Rt!MG zYZ1$y<@Ldif06YNd+_)Ccl}Fu{rZFMl*A0n!w+BD&A=m1hLlo{W4N_9G_Igfa|gSB zX`I!$Ir1gyjVr;hBy)7gBprnv=Xps@B^`hmaSk~W9VoMQex0M4Mo!8AUA=Es2Cvj! z&F+JR*S9=?P-f{1AViE<_iMK3F@!)@_rRnJD1#6-F#_y;>cC&&dy$DwgAk*6a#OS! z=mz{qCOW)C`D~6|c>~9ai0OYcs44238IDC4HEP0o<4EoK)D)ZgOw<(H`)t${TTBpM zKuz4dP4@GiyO%KyCW<;AE6owv18Nz9J=Sqi794G*^Z$4)Vj1@Y)XP*y{(V<>!B=}q zR1>3H-?7e934)~(u-{~5bkp_RWohmEn!XI7DbNMv3dS#CgVD;uC|+ZkvpzmdoC`+iahTu=(j_L2ZDXtlnZ$GKNCIAk4!< ze1Ie9fiomKW@p7u<+SI-q@o$Rj?2hnNo?#Um2ubh^|r&xs774PMWu|;ex;Zr(jj(* zn@#s8U^)q4#gdx{H*NW^9%317#j*%wEL)|n^wUFk0~d|p>sE#0A+-{4&OTrdWUk`( z45Y<^m_i94j891Qzv;L;&^-}JZ%sY8ax+!HQRlaz zaCd{SQw9%Y24osju~R0c8BXhnYD{_aD~+XMubJvwC9^NCE_NLci}(6ggjH!b6}xsX z8r{Xj=tA};xgTYtU@Y|ii5rB=++Di!aUHU)Gxn{d8ni(d6AuGI?YYb~fbcJ4qs!T-<#ogH&Feg)w2-j-x0MRPHsB2I`3=HR)0KdhS{FGuW4k`)*VsH#w(P9h`Z!v& zgLYN6oXjCyJXUiNq;}`sAUuHD%pZay!kn2|N(3!Xmrj(v)FUX)K$2`>?}aABQH_AR zdt~9B)>z>Ly8ALbaRXaXQ%tuu(Vh{r(Q(7*hMS!vJKOC;%=2|;x7{4ILmr8?<8(P) zd5MHyW^N}FtqD%Wt7u>+UI96rrVdALWhZa8Vi(lvJ~q0iVJGAan#^Cg1`PB~ z#tjC?%V0LNOa|hV?%cwT51y@bojiwcEIJNZuK{F4)?epfl1lKrgm-Kkg&Yr?>W_MtvKO8ccyc z*xH+*KYi5Axs;FlIbV{E`z)u+pGrZt3H;N?eFXeD1;R$&T|9Uuhx8^{uqXH0Cyab; zubm@Qu}w-wstQ%wIYy$7uaJZ)KEjeEK?1KpyMlT!!OEO1`rK~eB)TBKG9&{>A8#aT z_}1-r3mk)A?X!L8N|iH!jD)MH3IWxzaFyIp1Gw@0dZ_tT_ailT0i6G&Gly>xUSoj( z*d=zHOHs&NEJF~8We7>@V}FovfKj&BRjv}8R7T&aEVM_NUazoo=k3L^9fsI$SGMQN ziuM$UaNr)e9F}TXYA>LcnnP|3g#o@t!W<8oF5tG9(wrJA1>~WwaB(j=_c$OHuE}** z@lpmO4rMZ`Ladw}^s%S$A$-kX#!Grb8I@w0zgt(68|&7}+$Fu7B*=OXWjRDyUAt3O zw*ss2baAg?rPXrWDw~VMJHy?amq&hb%dDn_!NxBKPc=*&xH~QqCP@-8;c&$mCT@N)G_KLhSyAF@mdnH2 z&6Y2nuBmI@yWJEpwU=fXOrye18pg0Xri`K+!>KU^5=I%^HP$dvH#D;%#L1?-W*nh` z$>g<@5#k9Oh-elz-0tnn8+d_=+R}*j%;k}Y{}Dbzt%y%hu?q!TX(Q&~Q+O+af)uD%sWs}%RwzrVDAXe0q7Y77N%r~ zL{q-{$xCgR{NPL=;YqBmGL3_gpE?h=J(fdYbmdlw<)?hYJP-@(R!JKL1>wc$nZZII zE{*5S!w`wN^MLSj4vF#Ij-PoRYCFKJL=eOotvgFNLLvyyVJ>yY zEYzfcU>{p;>o*ma70gNFwtgvalr0X-3E2Q(T>bdBpykshu<+`< zj+*BqIP@>*+UScBH1Q|-7lJe}mmQ1{oSr@w(9Ucu)3ayN&_K46G=w?p+y*wjMNWf_ z$oXW9h78VoPb8?iDZ2!z(j&ytUm-O^v>3)k6ckj_p~)5lu05KjAyV-EOiDt(LxzQm z4OW?!dA`b8QY)M6xp^Ajur`4b&_)~spBSOkqP#dyEv!be`1laNP1FpmhFK1|@>DAD zXQ94G!)c;)hn3qS1`{s)^Mc^3#fnDs5X>Z^*fIte!=F zrgt3R6>fu_Gf`vChbi*hf*NPq`>h$@Wk`)V-(gPrz=1z!YCS!N_y%f;In(BP5>c%j2tVH(tTy8nmAF$lmSWMM3n0g2qLdljdn~g;Ad62<_rOj zV9l&;&Psw|8J^v(oc_()bclucrsRHfknW$`p=fMm{gLt>*F zABUBbzsQenz|vGE!e6YB^OHflh?mS-!b>yh%G{tNaaUh5VrvT#P-sNkJhinYK5_bUEk~|S7oZs*&(#w|Ij2ssndNq{H*31Sc2>Or ze~drXEY$`!m=!A2eBka$oDN=x%e<5MQP9ER!IYH|Kjl|TJd8hl8EwbelJ{+U{xv)` zNStHG>7hyHHaOv#yG3JUE+;UHrqYr`{2;)SghS&Ko|Z&zl#sM&$6Z7{I2Vhu?3*k> zBdhYi-+sA7w7KFC>R)17qu4y-1p=~<>nXM_=nXU*8EE1!booU zy4E_W^t&bs+>x7S7!7iB`%aknr;l&nfAiw~r@M@O=4>r*-)y+$I*1o{&l`a2 zpFZ8a|MiEfFaFh%M=!tmX8AkiaQ@e~ZytXAof0@V)?4hSfgxV)uYeA_r&=mE2L;3s^Ni zy(cMPzO4-%t0V$gUHKfqPWzJtU$!-+{1=K!hulo#5{7?)u*(C+D7b?tSmRb>I5`)(Y8sX3unYRdrWaPk&S2 zj|){{Rqz?TZ%D+W1!X-d6lO*m`5khV>q(b44J}8#>|c=geMy7IrUXNdl6qAt0;zU8 zU2cN0-e0SG=L7WIvn0W(!tZw6zF$_2%z7fyzk$n9v5w&lH-w+8c%^3sdm|viKCz;^ z-sn>J?R*arnafvc4PNr<6x30R%hjz4?2~02F8h;x=XbU2+KZccRf7#{qUUhw4OnGU zh-pmhjZuOpCj{kNF|ernY@fR20uYULSHqB|U1jWcTW7tvwi`f&b-s>(TD-?3q zdkfNAXe|>Ym+2vfuL1~cQR;SLAh0+*$A2&pxEw zrixU^hzM@w%j@GyAq9qX27@uE4&xk_;phTxM*fbNakSI?UAL^S9IFg}4gwHE`~zuJ z5Si#5rUCF5SpIft_gj8cnot;LE=xk#RY*Tng0K`wUqCuq3F3J^>X|dW851qmgDxoC zv#qCbK=}ME$^Cu1JLl3e6aU=#_KdIG=Q0D)vkjHc%kzljXCi$CqUb)7)umYg(eR7< zL-nai5rg#;r_!wEV+6dNx31ritq*1$;~TvS7%H!?K9m;2iPhy4F}}_TKZDzwP&w#H z&)+A<$d()^59i{6wd$bIB|4Q+^2y)jM*Yh5=IM%46GGiBsD&%TD`db5=Hak@ROTcl z>+apnyj^xUB!TLE-@}1PcPbuTk02(+hML=V$SPrmfeUmBHSa~fu2;&h6}vK0zSBVy z#ppAWd=@57HxVi-GdjgvoYm2GUL3+8l105zpBRs8i0A7UaOzekON;mMhD4HoKBvTx z#aB+VWG*;Rj z_=NwV^vIE1-O&=Brnh_^nS0dEg?Zn_S|o>gV~v^z_U`$7>o9@W^Ro3BP5HU#h=@AH z|9xGFd%Y1$w{1|w%=~4OAKbuvlcjZVt<>sp2Y)TEUJq%{qqI?Gwi*2>TgLKHWXc|R zN56l{>J*KZ&UDb13G4fSYyV_{lkoY$x6$B*v{(FH%H*B zU~n=^?@+qnz~ML@4Ol`ioZJ{3$AeTSA2nw54&`NapQB@D9P7SVUOH;q@x`p#|r96K;2aPWwv9>YMz}uK4-wt=4b5(OYwGwD40Oyv_e7B1qsl>ZjIx!Ha za%Ey{%q`Pd;NHLDtj-uzR=ndSD#nEEL=ynQ179==oMfp z6MLZ`U=@Lm(8nGj!rCYV^9M9Wpu2i@T{`W8_P21B+J$NdWMM~p8IaqC`+F4SqEhL{ z_x>Os#&J5nzAruO^@q?>c>sVC>Zf|v-JR^7o)XuT*WKBRb;72ej;EwVe8YivCaTfU z9C3EMuy}}~2Z29%)|J8Q9O;$9vf3(=)yrl(V>ce!e0N4fyMCjg^_qN*Nf!A+pJyq} zYlf7bPtr0Tr+KdbyVp0wWE)WJhGXs08Z1_AoU>B*I`+W=(c>*Gb%-KF>YyJ2l7J@V z1Bg%sED=YDx76)iCnU3-3`DaO!K^wOfZfNK{W%)KEAh9Hq}5GWv{&V~jBz;BjFzup zi{Cry9#i^?;t7KW>lZVN&^nq+xAQ`Z-KM;I9VffhOh;`wCLgpBN*Q`cvxbd|FYk9= zqRo}=v5I@7t>t;+UxYr)!an2c(xqpMm%eXfmidV;-BPr@d{f$_G;U%6CviIAM)#ml zj9Fk|y(ncpvj*oToYSm;s9@UXjZ2(RKyF-VdD|tom3gY0t^N5)vPnchEzfe(^Vap^ zUXjf4(rJ-8oow9apo)Ng-b-wfudow3LsqUwd&{1Y5fHL=#=N~o;go`>F5!%}a}f`tnaoU? zSi`-A5bB*cWJ(fzOPV5mm34UrueJR`OlkXbk*^%*lWL2-Ku1x=^eb@Gvd}f2oCZ+F za=#$KJXizo~9P@zETqR(ixSHUV=11Gqv+EMmUP1Kb*GT8Ckt zQ9)5iaWPDOApi7TPleup;+;GEL=KgLs*hD5=3U7$9784%1=Oc3i{1d9nTo`I9^gy) zPfPE!fLV&jLs2#s+cPT7pi|FF{QF{%#!D>WS|#KOyR*K3gI=RXC(H|&D0L@5+i)s9 zAB|-4ZROP)6YW{hC9<7@4C(He+0Q-&-!d62>@2pCr~;wq|B5-nCc2005#Nn<*5 zJ_v=vcTuHWHSyRUn5{}dGLBMx!%(pHz=Yd9KLpkW0Rdu=N@PA9M!W(^V|gSIg}ta8lMO|BxES7#=rcHL43S+LCmZ2-pDH2Kp_bF(`); zooh9=)<~G7gZO%S97?A&+IU(nKVhq;+xfpP^i{Te)t@Y5VG99;rW|uVYE|hy$nPi8 z|1`qRvBEhOAt9Y6nR6lLVMfM1ge+cGy!d!_B&hO`f+xjZKn}@I!pwmnJ%g;1VDClM z;$f*XPK&knXxhSlSZi)?Za5nsaCBI0+%I&TC`G9=*>IG_#}K?BiB*WA5c;@s-0W+p z&vWyp;Wf$EezJSMsJw}#UEZjsF^vw`3S}PDN*su0xPD9s#NmY~l04aqL{AaAs`3c2 zEO%g%;nB=+Fu99aTy^1+sE>taY1QEmv2TrHl1PJ=h#wOHD(KhCE$&XVdvxb=T}IJN z>^tzXHGFL*$E(^9e0ijfKu{%!0VT|LgECIqCjA-AYTeBoA5m{Hgfgkm$(AJQ4mL zHrd1=t(;&vYfg`17SM$YVF;)4QL$-&j^+y%?04aXuZpR$pfldGjT8J*SF$$L-wlN_?LU^$SukLf|K%L?~8hY;OMBmLrUbF1{#~J*rr1g(M$2 zsfLKwL4vHj6rqqn&u@bm090_6c4TPcnQ-Xy4&D$L`$#aQ1Hv7AY|S441mdu--Z#r7 z9lY#oYw)+M1R4P=3P~K+9n@GT2r3CU?e7OtLHL_Ld7_h>p!R(6?DYQXv6C38K>02N zmHo#+<6TrUXwQrsD=ZlHE-ivZUI*_JK@E~8*kuPeRRNw`MiJf&#E3{=Ssj_QWlN=< zlurk5{nsT~9$FlMPXs&)WAJOJ?@)Z)Jwqx*x6%$I5n%O+jK{XP#k$W?{OcwO?dLDm z*fMJCd=T>~iMi8A-R;Z{^$JG&nT=?4*;FHj#WZ&5L@gbhYLDt)Jyg(bgNH?<5iF=Q zpE$<(7j;eYJRRaKxw-HH6II%g1d4s=8nK?~+gO`BYt&w{G18w-lNFC(f~q!`8H-iC zA^h$WsJ2|STnVywy!@oGtT-Ty9EoET$#j~|*K%RjF}<1ABZgpB(?KOuigPX@s7ZlQ z7NS|T22>ipHTtbwe0#!aUov28LMH(g2Q z@5SK-p8`fl?uy5<`86s@iJU~QJ>!}~PoD7MIX#>D9G&Xs*N*}?Uk_|Gc4x#XQj+by zE*`v`sj9u6EwBWV4D+(W`$*M@*g`a}1pGY(leJVSCw2-~9OOV&xGrb2!uyHat(A(E&ydSh|D#B5Rc*W%( z4Tg5u^Uc5y^V;sccR_y*%R8xIBe?e3{}F@fT_5xi!bk!MhWr$&n9OzF15&hFF!Zw8h*VN;VcaJV_z4kz-G@fPkO*EmQ!L zta-v5&Y>f^kHB1G=UE470_6a`oG-%M6F4HTR~&Q!$Es_SK7@5K9O-ewmMpJfB5+-HkAZ&VfEZ>=Aku#zr^Hu!1Kcl)$_%a zm`-BF0cay0HpYHc#1$_Hnc8{mIqiKJXRDW9{XyF&kIO zb4(!&k~0)_fWqr`0k^fhoKM87X_}oNn&;|8A}d_fS9OYPyTqdlei=nht*_t)@N@dI ze^l#UJ?lzdQyzpEeSHpuBn11m7GW|;HXN#)c=W8pLwnqVcZy|otF8FqdG!4W->E;N z9nM@xbx@51m!M;tDVVZ3sZ!6>r!N6c-FUAl<*Kc5Zvfo_{J5y{%j9-ReXjM^sEgPS zvTzlflQ74}PAL8acZ?uL<-=j_-lAwNLN#`vI3g5qfMS$n4CUbJo;a;}(arF<5lQSN zNMrPZ84YYJ_>Q$b!_S<py%Cx`RJRtg2ZmI?!TI0cLC!DW9aXVnPLGEbMKETW$i)V2(z?~LSMC11! zdhKi=g=va>S&Lvzc|90pcw0FNX0i@xb90_eRE0$mK0t;bU_x`nm^#_@k-5mSuS=LP zGob4R-6fQhu>FLZ_tN#=e->vlyb{YRD2LsxT2zA^1iOcPMEEm>v;*zK{81Hb)e)PC-+*H!2Y$NN z7RN1sdFnLj=(ecIhb$&}^ zOI%3eMKRy#@^P^noeR9}Ra4od;|C&FxWk}$Mcg@W zdYr=0!zywCCqUrb3E9RB$wjF2ZDo**Q8^0;MYfOZyTEI*(BO`F2w3bqpJ=UJr;RmN z1CA`aDad~8gLShTBF!#(#on)KK)My-oM`8|-cmm(kkvhG4GCu?bL#C@zm#O_budut z!#a?wvhG$CouQSveezYMYZUOhD-f6;C)<9&Ofzr2XFyfM`5psWm1~ z{fqSIFImrDGNA*>$Ql1+e_(i_*Z!R!{eQzo&hQ6K_n&m+KQpZVg^wKizw(g-`Obdv zku&}#@BTA2`%6i`tNxdSUQ{zsy6Xdr3%--*h9vVyx!1O-_ROhuWJtE8IjVp`-IQ!J;|N3vx>f|;Qrik(?H-4ro;4fbg#?fx`TC;xS>&ts1Z!9t!d-L z--P>>c3~}iw}%lI2n0i>EcX+-OHO-qoi2R}4^IydzbVzU=^q}xNzlHE6~7^Q4n}R` z5Yj2&5CjPq)q{+U%pDgi!^CU3T5>hajgO<~(JP9TlIoh85-ev`pyr_aeBEzUxuhP$ z{=r|qzQh7S(3cLNOCB1TD{oh(!dF#RwgT5#1`?8~Xz61gAgWe_0(!?!0Ds)snOKiH z>w+>D(JJp42!>5bg`^nM=gBCD>Q5TtU4|83HY2UQNPr|~STX45MW0}Y9TJBc6u<%| z(o0x2fkWse6fa5{NRL4#U3MlUAt9l3!wVZyuQ+xC&PN<$NHVyPs&Ar%F!bZcJU>`S zoMM&s+pNC6zDnaCNVv!<(V@JiC}^|d;WLz!(!xfDCN)ih+1l`kV|t{qL_|cy_|xCC zGm?{CE_M(H3`t`MN>wHj6hS0#k;3Ks->{+7#s*(g7RboR(BWifw=gpyz8iX9jUHl1 zo{}tIQo_}@kuiJFcr^RocXPJV*itiH7CKDPjik2h23H)$a#zVW)Z}5M%?Fm#`aKv) zIa<*UCN(LgH%-4$8h%gz2<9A`&}S1HI#59+f7G@sqOxKZ#*Ns0sVZ{s25C~`-D&77 z|L~B`1qz*jXTN3@fCEx7e#N05@Iv!QR8^sA!WxsPI2yANY^m-~DZ3qU()o#olz}Sl z?I;)a&?@FA1xIScNN=d4aCL(ym3W>X_G@aKT<_<$*CRY1F2<4Z+^YiKB6JKzLZv0MzEK^LNsPp3uH24e(3YtKzxd!ITP`tZq8V?`Tcj{zY zelFt|y)D13WYUW|9mwdVj&|22WSg`QfQS3hOpFY32R_5}(Az(b!lceA`XdEeNN#cp ze04RBrPVR;Ux#CL^`*y^s;9d8bbI^4gIo8ZnoEHLrT5U_U|l;TNv^VoHW4K_-;z5|=DzCWOq|NktXgDOYscxQL-W z!;bVt)Ju&R0Lx$-j@qaByv|T18wl+;cvkVOLaY;+E)rI`kN#C?<8r5)Qu`e=A_1Go zBkrsABKqA`0B-QxF+vD$wb5pH!Ud)bXZ66~uEr8ni=)!)*0Iskj-y2%ZMV_M+1csQ z(FRu*!-rO{C;6aV2V+iztmo!T6liJO!ikytV}%Nel5V|Ci+OB3iP*1`{ah_qd|+H^ z8`v~z-}fs@8m`bIO{>HGmArP6{R1zP%jyllqdJA2cGxG-m{J=&a0r#Gt4t=*31!9S z@3P|Jz|VzH0y{^F@sR}7%lrZz3CxwNh8FGJa0uxb?WjOx zJ(4E!U8It=SXWcrw?=q(`(=wTWCZXA;~(ij2MaRn0|9^Xlu4mBN@z0;D>x`p;g5GY za>5*%3{QXnrkO07Fp~ zu^~LUiCOT1kT&^_aH@`%MT-c_IR?yEaKM#{YIEmnboQg?Vl~H`m>3pFFN*qn$y^gS z_}BeGrS@HJLJZ6HfVW}P2e5}!2ke-<068L}Sug=wUr0p@GqiEU|O7|JZ6Aku@w2>9Wnwa6_VrO@V88w_K`tH98D^I&m7A_AtuyoGwoUG zJ8%RchiSyDPZLPyR6zMROyUvfy8P8TX)Tl)dw|4}gosOKzZ5j&A_TKIrfOx0Wo1&K z{q8#kl4{6-+h~KXNmTYHPEKA`3x8fbkSO2r1K~3wsoD4(PWQWuAY`)c?$Q*nd8|Ak zB#2}zH3KSWo9Wxe^Xyl-mNiu;(NKu(k{@bD7DAn1=4%}XB2+Jn*7m8)5BvQ2eD(R9 z>;k`pu9TASzVRvy@pzNf;*{iT!QxFBUV8Cl;Cz48Eafc<8#XeGO32A6P)5%fFG0t6 zXZu-xFJ8XqQtb5(om6bHoG@q@~zlK8=f~gM(qJZ8%C1LR^}#n0{yP-CczH5Rv41^ zGdnxv^=?em>2{eyA7UMk7EZ5Jvf*IP0QUB}DHES$`<1<6pQS)1 z3jH&-|6Baa_y;-O|0@2aqoe;b0A>L)=>6XUV5UD-E&ovftf6YIAcDrcD5M_D`|(~j zDi1OEF81S z6#=X(9}to|XVcuT;w-+|S}lxNUM$)iv-UV)a1(*)~2IlFG(Hq-116 zMhqKmSa$Yd!X0NF&IW$|_@C8Ej4TmzH8nNi@whKU^Cr!>#y+nsdp>tT8svdd>R6Vm z%&dzU2C9+9Ksi+)rl{F80jZz!aMy1kd5-isF`hQ><{uvWJKVbIuM#errJ^fATn)Nby zby9+}%{guNy1o4_E9-m?$NZ#9#{<~qid_ItW;1?$j;6lA0OAnYCW{Rzq0sFI;G)Z zy!~jL5ytAyo*t<|*e5CW-e5N5?#`vPeNxNiWQEV(o~ii_tX$|1rjq5i;Ks(iGc&zG z$YZgw^dKGn{zh?yX(Z`ddyZ8VdDA~09{LaGzZn_CR{9PQVNBm1by_p+IEHk^#w!sZ z2tGc!LT8Gk`f9jUYc&_ol&@20sjJUN;DivJy#>FA<08u^F044)owrY;z zes&X7SFa=rA+3fx!NxvtJ7Oyr%-Y$-__9k9WpTg%?cjPTW<`kl2O1>5zdyLTnwq-W zk&wtX5Jy;-p{=5+d6>p={Z-P)2q15YyY&>o(=8(zDi^Yl=e!;iB}RL3>sG5WSWu8_ z=_+D`8RpwCpEW%nS3O(IV^8sci_2ml-ghWP1_~_t?96{*0W&&Xk~}U9q|LrtS7vMu z`QgMD4Kul^rUn%P&w5%vpsTx}IcF8c83P?%kb`u5Fr90DTzH*K>!Pj(+r2Jc2i#+td6;25#Zo$Z#q9NgqT%^zF}-o?4ttOa-IX zM+b!T(sm0-2ngCrN>`WDas&kBU{VGK-+8U6nVDV7q32s3P6SJel)vf0z!PUCBKYuW zKFroMJpjra`ukUmt;ua>q{*Z^{d~#UIdHV3nzRB`{1UX-i4X*l`FAfF#Ke-2ktgEf z;C$=*`9KcqGx=u zM2Q?)L}XF@jexGA9jLR@JCmmMIq%VxC4krU&*147v5}D8z*RJ@s$`>4#B}+LxOp!*Z6L38hT!9YFJq*3k%at zT{+XwCoxp)?Wr|p?e>WcE1*lhs*s<}lBb%TQ!vCIH$Umrpe83Lr=baWEu%z?q;YC) zbqo!waWc+cZtISNhsW)~DU4sYvAxZTC@?KadZsh&|FsWI`<;@~nlFfeoaYK}l@iBB zKQx=BCYP62MNLikTdYoz2=;kt%c966^bJBeB}GN*@_E8@O=MtYH=W$Q)zndylIKkY zyGK(c%GXC+&yUw_L`1+8Ip)mmQi2ZWs~x+2eRQmTJ2^s6RxP;(hPvTpVPpn6n`)il zGSh0ke7um}7)Of@A~O;ZZY@Er6ErQ72#^MBY(ml?DkYNTQS&u^zy~)zB+%7m?{tiJ z72Q>}Zx2~|y1T8#k+88-6b0h5P`clPRsJC;iq>OvKfE8h4xllu=GpA!Z~~c00*7iDzC0}9M=Ez zO^^ALjmPQj_E>xS{E_MhyV3+Fe)d5}hkHku513|FoolcKjG%1x_V%V4fE3}TWJ$T28{lR$L!Cb%O<$+TpnmEiz2bOfnfkYg&GL-|2 zEk;dTJRdLpRUUpEEfQ$EAqt&UsQ@70g)J9=sXUj(j7rM?Hz2c z(_(E-WR0E3hZQvm@x3!6vOIW><(=N`OK=kb3(sku5YZWsX5xsFCVu_zlTKX9W2g6P*1=Wmlt>4x& zBfU>{@VdATgl{B@2&ria*C{9n-c7L(f>JN`vt)F zpu-k_5SvI&%Vp;kWiFyyMdn;RF!Zd4zrT~=4x+H6k?nw}PReH@qi-~CDqksf9 zzIFn6UF}7de=pL}k=@Y|{wmRMFX7uvdqPMI)72dgG~_V5pv$_l#z_(1S2#`^5I;Pl z(~oFM9~&Ugyd2Z6ov~dX!x`!(CZPSYK&I7|P(UJ-(1CO6dr()-%R4$A9s)}dX_6<8zgTQ=e2u30J_=qb^??9ge@9eEsH-ak zZGCO+)q8FXb2(OF9gbBbmPODK2;*4(%r8W|+^j3f=q8DMvUk_Zo&x6JO5`9I9=h0L=^{^F>4u^LGjz+f#vgexKrh3&?LbCG zNWHcUUNt^~boKE<+J_CqfRy#E2^0=;78ePPgO-*snjKLM^ofa=x7iqjl_NK_2Rr~dJo$Y7zhcg|2-EA+}YLDRacjQ z9Fb0luP{*S4teqFiG$bTscP%w2*cw+adTVpDjdGwBT5?25KmauU130~J zi2i8zTLu4!z|0UIt206h9F`Ryyf3W*!Ym&tP!^}X9#mLb5n9hWVx&L!+*ZIG!uX zKtYF{eTe>97e9r35uAzj&kpgj-}iT2ylhzmw`GOxE%gDWR+c}Xu>c>N{9!@`T?=b- z!x#H0n7SC^tK-u#Ff+Yu84Frj=$cvrw^V8I>0XZIbuEowet$Xq{Rce#@2noy4xv77 z^6J$J4;gi8>UJ6-MOHo`MNMctNN%i@NHU}5F77Ta;Fu~9diycE!FMA$XE|ZRed$y1 zYIQks@T#x8HEkwXV=1ETU-bFCiW+X!=Y5j?R|H0j<-(HRWN^_4ND**5Q3BJoDU12}H_Z zKnhjR+?2pwY|Wdw)Uk@%WCiu1WrHauJSZ02-B+H=mc0)u%R19|`t4yF=atI4u5jy{T97s(LhUl%n(Oq#a#U+`_t-gNX=mNNvPv}X4YnmBI--eKR= zJ)}N&*^kf0Gz8@s;o3>Sh zwsJbR`Y_^|>CCpAbz3{*DMQ@SA-$xU+fuug=ycSy!RLAfy5Y?= zu-{94VuXr45wV_@6!9e^6@yoKD~59DaW)Q|Y%JpzE$Cuqf-p)AaPDD~-{~T+Jp(Nh z%usN0;u-_}eJmw*M}lHkqM4YZe8cC0EZz`~Sm~=xUy;|1ne1>P1-gQt!N&l-y|Uh~ z?2?-Ip2Xit)sTbe`@RY%PDBpcM`MRY@1J1FMY9N7$`W~}lm}XKRzMYoiQII|fvqSJ z!luJoo$g2LI*2B0NcsU%=L--3>{UYrG66e$?wE|o6XTBbd_l7-aPBNvk?Al8eS6Cs zr^f@Xk=G$tI2%a;&da)dcXDkaR3NSq!Pz}RG}XkTvS;D(P2hPwvZ&1QT-hiQh+~SU zCrXQ?qIQ#18g?l?giI_cyk-aNUZK?!P_5v)t0Guni+;@A%$nq6QvkkN4fOdrTXA!a z5(AEyAs zu(GtW2AEoyy6C<*XKH;b3!3-8&G{3>@)se0p;`VTAsHAMshOFWf%us}#AIfs|8?SD z3i?vh?~4D>;J*^|@7NZm-}BE;LGAvK)YcAQZ(wTmQ#MCyDt)V;XcQWIYjZ1I13Mae zS~?~gT6!7-V0WT&v;|Hx=BAd$RQe`{x&S*9Lqhpw<5mp6pMn|JDg3EiE-0El|yL|4Ju+HO7BG$br$|i;@0f{NLU5xAFgn zE)DE<|LD@c>JSDF|G#+Rmy^I~RLD}_$^ba*fr||TApFb};7lb7j6n_U^bLXI#S-vx z7jS-J{^^6CU_cLS0Y5NQfL5nsU}eUqVqjsw zr=thX*>v>G%)kj%3^?hV>hl4;v>~u0^qZ<0>A$<7XY7%jvjaWvAMOi++xjMeX-WrRxS?_jOOb z8eCjUukB)Ec{pm?ZoYnU`ovX|%L{Wj_p!lYQd#>WmShT@d$N~TTMyds5s!VR-lW|1 zD_3PlJZ%Qoj8>*?7OBU*y6_42tYo4Ice5|Z(#tFX47Z~jgEB^vZuINQ0y^Jr0drAB zbZ$e~!AX@HG0w|Fst>zWrk>_WmG9hBY%V}A;`Et~G4703n5;03bXwCo45pUd?)E*% zv>~?FuRN}}u|nM++d&sJ7rjwS0T1S@{)h7{C9`!N9eI8bhl}nDj}LC{sL5>LtQ_|r zICs~+J7kt0&rQNed8bZMFC1@Hj{x?LLC})fA=n{&Svg9$Tm}KpQTqAPGyr%FlNMU? z)}_ALdG1!b%x?ocnwH|5$XDrY#vpDo1aa3g?$|C?fzNjnH=b@TYo2aqXWALkDa;lw zofo~kg}Z9QP{U%wro*b?7(GDU>bKRm*7ugLso0sb)?jmlbM<(w_u8!0Sue0^VOxdM z^hB)xfLZ~w^=8dXrIqFs8H}>d!A|b5R>Wo!=@_+@XDvwmAk9pc5YyAQ{mwR+l_XVO z8Y4eip{rnP!X}w@D77dRRhlwC%+6=LZFlv;_Kx*2m2Mbp8+Ds`8*UqSn{FFw`~5b? zw#2Z+Fy-*4;o4M|)C^<6;m9Adm>yf<*R%G$O0@KyaM&Q<+`=2fvXYzEtpSj zX#<+ABy~mg0retvH4Csu`0(2$tB2b-YxU<3&IFCHOSH#K$KN=)t}tp)D!Zt4ZB&p* zyCzg9;(g-uKxcfCV2nH%V^W=Uwsw=yjMaWzB<}JsSm&7-?G3gkT{4ImFQwf&Z8fL@ zlW!UyCfYm1?|wK}jj!}JCK-+%EKHwdEpncUQ}wB|{NcjpI&9u%zG`lEbvG+wlrn5& z^vM|QM>EU)>4CCco!!=uD!cJ*YAc(V9kE@G-Pra6^YxBKM18v5Y<-;F{+3qyJdY#b z$jXlF7Tpu~8Tkpwar&h9Wcwukg!yFjB=%(5Ov4kWJ&3o~vifYXWPDyTJkMtJ%o*UE z!|G(BlbI(&F6Wo7-z_rFIMwb zq&iYqER1TcYwE0=&;0t(h}6-{tCy5&7cG0D((sNh=Bv%Gdm5|`cIRCUGY+3}A&fBc zaZ^15IUg=|;?_4wi=?U9Hm&cTW+k>bhSMqnxt<#~w?d{%f{PC=&McN^RA=v56WN+= zDF8=+$C*nsN1_OcbapG2wda>Y{#A zwR_rQ19%?18Lj{QZ7O@7dwI+>NoLcJ?|!}0_Eitbvrene%46L)Sp{f{Ni zZ?1@!lTQh{+7c~LPE60$T`4ikLCp~le9sPZKfo#3FL)f#9~LrMc2^#XpWi$y+qsXo zB%U|3Ms$?-MXc5x=?gq=AG?gU0PsLBOmB`V9T!>ec8O@&Z=+TleqhN3nR&%9!6D@1)%y9>wMqGO+Ao>z{8mr zP8v3`s%f!q^VqAbZ)&QqPg~n}fq=cx`mXhWu3=j5zJ8`)(d=xDMLh@I%xH0fL661w z?F@Z(+F8@uvNiuE%U{&+RuW+Z^CDZSZxCgc(f|d$_he z(57N2m$775!8zA4F%fkl4=TCvUCLoQb(-LcXo*K?e9eFY$mT9hHQT%mEC$U5jaRD+8 z**k3=basU7j;>H&4dYDF%KXn%=IyH*lU|`*{L1PPHHI zYwVkMl4RcvC;P=SEqj!(2YoXZ{9Nr;3g$Pxt!ar4YR(g=X|RPOcsg&`1L#2AZ$RO` zj&Q7gwgx|MZ=Ld;-~g$U0#88kP>N`K6O*y_G2*lR;Wq;j2|WPaw1VLq3R;uX+`KZou+fL8by)qFz z4A)DPn5koha?3d4;ecHZYb}KlIg6TA$;(WLYviI6x z*E`TYxVt$VEYytO?3j)xvevey$9T^TWUpIHmj(Qo?`Q9QNcAOW$_a&RLiET4& zOH_E8Jh|VP1ox{+`JUEK``&y(fG@IZX$Le%Dw32XId~x2AUL42Nz5 zMD&Uwdk$0huKA(j8w&{u&%S&uzVJIrsA!#X^_9#SDFbU*BA72Xz_%?#_>6g4?|Ixf zK&IaAUr7#HO}iIpd!+;H)d$nBdX%=OytO7)I?Gv-uEI0jrxajWM~@i& zIwGXAfk_&cqacwaS;3j2Yxh+gqr*fMHhnYch7IhylkT=T$N@ECX_8i)2Y-GM(Q7UP zbvZG#Hye#(Gy&uOVkf8P3K??e?lmcCv+k|;{Z^)-O7TRnf#GPbBxCW=RwWQdsq^b6 ziC~RZT3$)l8vYSX@`lX$3~WM3#Mep za%2joRb~WEt45S>b81gDov!r2@{d_)wvo^j@{Yr4=Syu{{V1RIp_p&UZ(gJoKciYQ z7$!p={Yc<)8VbCZknq#Jb)yq+u7Rc3+Qp(;sx7fFu_5?ovtZAwxQsL3*Q;-&-pZ-g zDwu3V;+Vi8)GP`L{Gv+zI-{z4w0{rRQclI{_#ERf;@wBR3-nVeK8r&5`;u2)({UhR`9u2M1|CfJvNnjA-WeNAtN^hBu5*{!TTe?Uc$^B;)T4xF#10FaXPRA!XU|#TK!ge@|Se*8G z@fx8rjFre@CRBnNO--t`9oS^=}_5?Q3oAe#pHjEG;f4@Zr^ev+r|c z-?I1ityfm78dJ*EayDO%?CTeGI?^~!Iv|kt(Is>?M&~k06|%5;%ED4bsN6vb_x-zt zmB_;U>^r*4Lk8d|0x+@qPw;dZEzO}4M_!0-k-atYlzu8cS;{1dW0R$HT(WIIVAKh_ zb_c;vx4-QkED?oF?owwTpt|4_e9v)bljFqU#tZkogkfzjVt*jN{$7*$ zlFCNmH=Rv*CI~Wvv!mb#v#suFu79fKWk&`92mXh9Ma&cq2GrF{<{XcbI=Me_iEku@4@j>7dB9ZH`p|v zD6qa!HWh~&Y`QUi=om=5X#jSkt*+9Q;Id35n@a+L41AFCHbWK9NK-?uY%O-^IEWS4 z@5LiZ$TY$w=+3LIA%GOdkL*tzV!oq^6mH8^*>W_5BE92=>aPlqbjOWJOvsfe1BU~K8Ae>PD^8#dS4F4#=h$XBX1ZfBYoKA``l;Ze@Td5p z69ypUE(b*E^Kp478yiAIGGVm0FcFT^0Y{0&85T{}LYvD&fiFlf^Sh=mZ&O#>%WpP- znVwm(8sDPmL$OXlRv6@(t~(89ljm(SihU{X(wJ&-KSmeQ#c9MfIru~Y<_P8BLq)r) z2IKqvyTlA!9>T_j5D`rHKbQC%N$i-ChfUa3>!|#4~(S(+Z14uVY$D3mKC{d-=Wp(#*h8bc_pW= zf=bI!rD}`B>)nnYFn9F66uLVgKUkHJ?RmHCYGG3a_SH!1x4#irld2+`h2SDj_B0hC zCNR5}7S~g^c^=|DQh1ieQhATqOhuJ&A9u=T{scYA!w*?m9X@5>)Ysp7ZKyO~6qhS3 zk4z8oAo#%S@0z5K0e_@Pt9})Jp57=~{@*mI(tzqruu*2@$4g=o<73!F5#fpudgMP8 zSvsZ2#IYYbkRp};P(%b5Ze9!rf$PO8z^2ie}DoIYrrphCxlz6Y4-FxMRg&s)i z$|)@@H=zbgDwj+Ev~W6;lT9!gOp1bF6pTVe03+=k1(>Ul?vZ*VUcxRW#76p(KGwN) z<`j!mjU(b|5gjG;=)WA(NOn}0-^`*?E~{^`FEFO6fXyP=>JmmvHmewEDJ8w_A>J+d zOlnlhV@C{|c~xw&JWsfXtMp>M*AuZ!9ID@#Bt|457zrarT6`dKl)^6(hLlc%#^mH_?k^i9ty<4p;CVmuHJI} zS%tQ+u!1V9YpHE7!fNlm&HXFMC^Sq8nRF{wB4%P}qfn{0#6hw*=~S|V1g?&85?xIA z`6l@2m!G~bDORhpQtdkh(aE9WU=+9y!llU@NQZD%?nUwG5#0x4*9HxAN5(mTqwB_5 zEvh_824!QRv{B2{lJ#i}n@7383wvPLeu&@o5_AH7`Ge{|OJA1(!_3ERiV1CdYMz2& zG^}VsU=?{Tes`j>LY|?lO1q8BRkTYZxFn4Th4X|`pExFzv~ZNGJSn{x&c@~YqL?sp z>+!?@h*9bzuZwSKzhR7;%cP=KYSI8M!!3?Pd)X2zUt9p&I{TDqW5Q}B!=%cR?h8Uq zH%9M6De_cRf04E%E1y!Q%H?@Q=xjbmZW@f-^f>qmugJ(!4rE|uVD`hbF%rxjzPNtl z;k}USLWP;`jy*|=#SEKFWqBbs$rsGcEK&^QVt~5(>aSo1(G=GdS|uEGK3KVw+_EXg z3w}(Uj1tiSs2bHhpD@s0f5iDy7mH_W(iP2VSS#2MJ}&%?1fM)Vg09?*JsaSsmegL~ z4bgCh81W9V8aJ>m{ma~MuVR20x%WHxfB?0 zZK>aAfMW*WsBb85rZ|WDM|*`}aQ4n4sMy7b?U(o8wi5O_^@qHT$dV}NRB8HC0fY3B zlFlX>ITxvoH5bOdB%WV+`eaPlef?J5SPrIbs8L)dlkZ20ti@(hBZw!%yWwzl0w(o} zrK3qEDIT2$U&p`A`Cj(~uhW9*DZnb@cXgk#_dn$CI0C05`P(iZ_;>j^64~G7|8L^6 zv6R1yzZWeIlWq|inMytA7#cxKBe)?ReM_dz#72ML3EBu7M(O?rjqwTu8;UGYe)&gD zHC%@BOVfYA22{TAnQ?@*P>C{xYA{u#Or*6hfeUgEm2E%i*x1I!QOG|>pHNc9~{#({X zR{76hs@|pt<9iN)eK*04p%201F_18FVRXI@JlA*NQk%#xB26(S%!3Xk&AnwRcZxo& zLadXFF+$V=ok}s8HFP$aS;Ml$l+S7(W1ICZ#(tMP9Z~73)Tq+584aV_?4s7I-`2gU z{BuAtsAV-$ti7wJW#?>f5X01FfOmzxSxRAEa zNl|W;S&)n6Ib!2|GX#C+{|@-$y}za~DrpvV*LldY5h12zunA{mUa|X}+_&tqs%-D> zs(o>}Tolzz@tenVUZVzp90ey)fUrQwOd2GOkGIA=;L6xVa51r1ZJfJEC=X*rvdB9s z0i$M=a-ydW%(?bfXjSNWAj~}asFAo+dh-zh=4ijp|6Q0lp4OIm1q1WpAv|fMQPM*` ze4^C!QL3wjav3SQeKdSS0^~48yDutI?Wj927e9G0;M^&~CB-{0KzRPjoj|}P$H!C| zx2Qan7}MGKhl1d9U&O2@A#PH4?`m=Djc$s6@2Xz8`7?!P_}IFORxZ}BYtpyX)+)jKK@xPoIyeY z8rW{yNgdtiymA=<7v5g-{hgcrK+q?=_Im?ZlZohBV;YZv3tZqzhc(z|c8=EefVhsFt!T8U0F(AJY%E^@9Xd|IHr;#-kv9grno=(vkI9h9zZkhE`HC)l{vk zNM)qil(e>>8oe!H;$#H`yuDE>fUlav{#JK}k-@ zfiY23aF|ofCGwC>RojjB>PMGLM3GI@WPt8lRLIiF370S@xIbnwG$NL#EX`RfR0Odi zHsQ8fAkAP{C2_M6%)kDV@M57fNh%g67`bmx3Jc#SW(7_ z^RO+k@RNAD6EO_WP(CV^f0xmL5KJ~J8W)&{FO7!61on=sRgsVF;VOcWbs-;PJls)y zfd)%7X?7HSM8zr@Ib)4OVP*V2=TFu zk?MUc5)EFL_LEgNShkL0{h2T}hV@}W*aVD8X2mp-fP_heYP)FGgS_M|N%E#Pg`Piu zjBv-J>#~^r0YHm83{iUMzRdIaiiCpy-nSm91yg@|=CFKpxH} z1QSanb_r&}rLFt(SEb~1s&fm*FN3)82wLI8FBr&Z-oQ zoRp)Z(ooW}Ji3(3E@jzz3K^UB5Yiq@FddJ{;**(Va{ZAb>-M&qjTELS(sL-5jtNDT zak5dAe}acEvGI{JI0`=cF1w~%*jSv`*g>?1k9&;^J=j>8hZd_jQ@ry6;TREUA0dpe z{~~r9dB{?g=0*9Y#%322m1$LFt-_WEnu1oMC8pe`P>75ndns&__h~v)vJ`SAjTMav z+@p{$PrA&lQMt~0%9@cW4V zbAo6en zxw{kciStobKK4TIOO~#Od@O>U;!Q;*9?C?G|CJOaszD#;->GfCf{phyy?#T0RV#r3 z+)*i1=E_o)+4`WOfx_p>nEn3#!WzvV|VFR71-|>25DVM#G+BHGRX`w@F5+rBg|- zg_o9D?@x+jXi+@I4;%%W0dREC0CbJ(R^Q=(55U)W8ZBqCMAzb468n?sDQ}3vBms12 z2w|FPmFFQm(fGvmcM=$bS>J<2cZ1pvKBRnN;v^noY}mZg%!F99`7k6-S!I@a3cX6B z8oG&WS+%T4$f8TBCZyN0m}2t!6`87?%3$TF_aYk;#5)~GHYTH^8P=In^{^>ffQL!D zvzaWiyn>ZiQa2Fn$dkz@1aY<|$@|Di^dEgGWtl8RUZ6$bj@7E`5`k#SCXzLCtAes7G2z{HA#2O!T9c@;1FW)h+ClWHb-ZU zIATR0lgM6V;Sx1Gr-3{Sm4;H9V8skACS)i@Nl8>oup&ws;;Qf_;o`L?SFL+&2Jq*@ z#aAn-tO9L)Gm$RMm8J@{B9_TWu8HdQYVqoFEf2`|zkW*)kjbzinM>|(zq+GPG%Wg2 z^5b*axaw8L71dOnO}HlrHiru$;dD}Zn@KGo9N(5K$#fZKX^{2K>`84ex`WEil(qwJOd z8f3%OH+Eme;2gMniXBcA`9*IHhgkexu_v7%34bINWEZH_S!r1J{a>s8N&@~JtL@7c zAA{SsuFkF8OR4@#TAiod}pr&1}2#f9RPwprGc$|N2nCiJ)Gctynt&1PPt*CyO z?qP9Q7?+Tg6ca6F1u`uwW7Fh?GIbGHrtMZ1X)7_lemm+mS|EU(t8d3+X%Xt@1i(WH zYd#|w5tEQW$d<6-j1(QK$mouo&P4cCVRSe5VeMTZnAtnr`+)qRXD!?UH=8epGmlbd zJ*Z;=Mlx1tlx+ipwv*ng4IeeM_r}D zSafW1QicG46n!v^QDP#)Bqtv}0yjcx;TK2DUHx4{uALD42{5p67_1-x`NVY97v`rH z`%uwW9Ym@MPCmI)JpZ(`NWnepxZOB}7AI z(TzJdtkxF@`SJ-JGyb9elZoUz^Cu7z`3pW(PiN(1=VoN3rqwhsOlEd!x?HZ%U^1@6 zmSGTqPs0UBCl~AyS5m=fzybnz@qYiMthoOw)-v2$&`8$ghj{pjJVV!0^Iy2az0$Y~ zgjt4Lb&xP7rzEk2?7UXkc9|+HOU)_k3@b?1hSbM8g*pVdVIG0*!G5GuNO4P(sTL3wc{8n-D_8(6*AjLebVs5($}*%*Y}s#oM!Prd$eKvB%Sp8~To>?rbBEbwf_(*d_jj;*^t0ZN#NW?G_iIG@L z(_+!ORqzvtFIj*3f``9L@Qss#{QSb)nnG;iXE3`7-JN+4EH*D)bP%rF@_AvSF{Sj9 zMMV%IG|`YK^mubO`ab#eaaKtu^|Yz&-g5%*mp_D?)|-T$Ss|3jpZ2yif#qO@(VI8u zOj7Lo1hJw-X$U&-!*G7`TJlsFt3hS@MU`yYFAY0rJ^*a zWsIh}$V!r~|4y1kBAmx6sN{I0fyfvx*tYnvMUR;vtF)l7u^O9r`nZ0Gyj~P&uAz?l zSoymLU`H;vpEoC#zPtdAJbbB6e=N+Cqx{7tAWF{^aw1ofaM8)~(f*F>;FDpBjb)^f z#3{)sNw9F7MG#rTWEg3g47NbX<}n57L@|>hEfInb+Fn(3XgzNUBI6|V#fVFhrXdG> zuzNAK_4~>577?B{RD2S{xcbs8$~!WQK}Ss?n8;Ert5m3!3VB{(N?Pre;>#5`5l#5J z=C_O-xr)tVlcyl+ideWg5u3_bv6NDqUYcH&-Gsn+`pyi2#52~-;}ELnCqT!Tflf5R z(aqC0~`a=7OL`k-i^G+KG|_v|Kj9xarPlL*jAVG4hKmO@3h<)DmF)4+(C@< zdPP;SMZ&spr$RgO;04#!$0(6Zf#RV;ZKO<5Xk?0}uNbEC@lOC{x^zTu>DP`J=qL3d zcv3jS93>}fxTa`2z@6H|Q`DER-K1`W>tpJ2(Zb^N*rXr)5J%uB3AMz|J1txEh48$cWx$TWq5yS#rYD%&a_`2#!||`m-pavFwgUw+ zln`}^sLAcAo5Z7n;$pmgzW8GOQ8?Y~fYX`a6@Kq)PJi&1h8GP#4Px*H&ytRj1PUK< z#l>_{BLQCXe!PFT+9nl#%Fkf z6N7iF!ADQ9$-nT-=^&B6@FiDVN*DAJx;?zF24CDA8Z9nmWjX0+r8_7|Z@dqJ?{ReH z`VaBH@`_}6@?7Cot|E|)^C6Z)H=c9Q6w@gWWc|GeNb>xpp3(^6Gp;n3F03NJ=ejGr zFnH+z{1h(y{HX02ztsUHzN+{PZ!qWbkKGS$|L}SM%qs$`(qABd$#Q5EB%_I*lO&%R z0B_Owg53mXL8q=nw+aVqxt$tDTuR;Ii30^Wv^z0<8Q zR6TW+M}7c{!GbPehzMYYm19yLX@HcF!FEG2&y9(Z_zNF!#f7xCg%IhC41eHWE}_Lm z)C5oLAAwf?oJ-#`%;FWY8S)&VF)G&BNEd=dU4rXe>-YOQ#8VU&v(1PGe62f%C-W4O zGo~gYm^dRe)gt`Jk*9W!fx%HUTj*dzq_!7k5h;%>WmVqoHuGqbG%2ehiV+4+~ zF=!gZ%>9s&Ih?U&6P#^Q9IQ#q@d1Y8Z@%mK_3D>}&(jeVQq2lzxH17Qh}wm%42ulB zNP5_7a?Vj&e_3?U6x}aLCSp4qMOEahiaPLVF_k`%23Db1&(>fC~EEx;Hqq^Ds=Z@{{yBk9Z<8TN4}A|VatpO}K6V)L_ikHsxI8>1 zAv@rwdr!U|_zApH3EbcZr{T;!Yga+uqP=j{Ni?^B4iGFK1=AmY`}>QxcflvkU{Puv z0^@0R&4T1;3GGJ0W|S^tB&j*t?2@kZvZ+vvF7qe)8@SXz#M1Hb0r+R;KH}yx~2r-fYj4NsLdf^+-N8g z3&Ij;X(E-9ky=>Xo`wooBm<-=@hXpNhl|gnDIKr=;OdKg*iaeXY*lAoWQn?6t|Jj8 zmIE07&bTgg+&~|HAKh+!{2l!C6P_eTT31i#w7fbdTUIQj1ET2|ax#c}Jc?DhQ9F@C z=d=B!&T2Ar(vN#GnpJsFyLcsXhIz`O=|?a9IlMOl7#a6mY8n&lZrgQvJ(^mZ1v~Ml zK7e=frcL9xVAqXJ*ES;_bg~Z5RLYnFC72us4qyZL5cK%x#HIw67(+L>4sM6%4q~or z;0%A$_x_{1ueZa?|MTn-YOfFd{V-8`{qJKwQ|Wd%#~( zi`8iYNZNBuAW&>g6~d;AWvgE3hyZK|)5srl5$}U)qalGFh2A^20Momk-hA-%Pr!Q&HZ}v3tO+ztSb}_fmwpUSbPcofJbN7Swy%TJc9*>0+S|vs zAB_V8@T*ebw#at%nTsN`@|l*3k3lSWI^a#OOkxdjLqr{^N+3-qJ7$S1_g zxjJLhu>biX8JxWu`!x!OCPxncC>=aFjHjcBPGAvNVvUnOLb&N_J{) zN^WYAIzy&VYGn#d8U_mD|K~ecZ(cZc2i-=(-`_zUf$CMIz7qEg^^Y@)z?|U%xGexK zAfuufnJ<;;DNj)OgB7Z;v_t9GCfZDTNeC}2r(~K9F*iC4Bz9k&)MWK{-N3gkifELdU~J zK`AlmJ|N`lF9AOdq+#$KNX8Xq+3W-fdbvY%1D#G|cX(nqfBGB=ySc|hS(P`XtM13k zJX`h_o@*}?_}=upYS)e3O~>o4FCWXZLXW(L0vqj6D+zSp=jcB4!o_8DK@S1Cc*S&v zBu^+~wMlAmX0j1jbQTEre|PN4JpnZS1!CQBZ8ru^^Lp8QMTu|=R}ml!v>@IY@XkpC z#eTy7Sg(jK=>PkAS(2Rh>uJOpQ|p}p8@Amyn_6$%_fR+jm$Xl<%7Q>%H<^?vohiDePlx-t* z3%G5iw4?&fqKiC&>GR~|hurgsK=q)OPxj!7nliSN)QxgG%V}{n^(9Z_8bY5TCx^Lb zLRh6M#ZMVC0PctcXw>h=uOJq$M7W(R4`3r4h)H{%1DZ{U5Gt+He2PLbpW4w_FpHc3 z0=0UWx{sn=t}OYnz$HFRY?qA1@7|bvl616|DZD5LWw0hD9gD~o7v6e5|DYfcBPL@B z6rg}f4fwPTYj*qvR(pacFNMqyMrubxg+J_l71j%xGMrGK46c3{&%BRXJ;5uOa?o(q~fNR+`Vie!CLGTh+uvvB72wHubf#hW1EQWTgP zo#6#Oy#8I!cQ3%q-|vABy1>cwHkm@D#lk@de%ZR&1Wi0u2;8P7p1P1&*z7<4OY?_% zX6g{;U(iSDPvc0P|EHo>bOXb?zX5~S-w&h07#v2YKZW(@UlV7fAgXq#y?to#LiXIePlHdm7zKLX;wzRFkAlYDO?EFV^54D(i}-!|FFGg z6y(C?#}5R=VY-((0|Y(V_Wu_g*?=aD{}1Q^qIBDF@Hw0dK7-p{!({{Qf}`I!bT~JG z5C8fHnDY}@lV7FQrlr~65F|&65JH@M!aWlA|lwMe4dx;h({ZlWAHavOj!e zgZWt(Ckrb(*Y$5)YW5AHAjRsfaIhm3xLARYtxE0+;K^>drW)=jz^vgL92^M%2kpS3 zb0z47g~L5?MJ?P_g28F<7yRd_r;%W;H`wa%%_EUQ1eX=x$&(&oF9uMZ&BbS27w)8OXas76XaSLz5CH#!@9Riu4VnADRo$~ah}%~dw5jNWG7nw+P0lZ7yW zMh`O*iWnxo+sIfq2eh|kB4kx3h>wh4@2WvQOw#J^GSshQf#swFUO0 zcwRmg&vUspaGve{gU9zB-ee02=OQ0K?jV{vDRnr~VpjBET$O zD+=0$C|4Gs)P@3gtSbRsqv6M1n}r^0&lzt&UJ;g(kmvvUW$ReYn}%OB_cWkLHh^l; zVhrp^n`&1u$BE?0XN(=4m>gkr*+#2GB)ifm1Cg9L>YIg^^R8BWb#wH28{qjBBx*xS z1NS%`GdDeNalvz&mrD1GpoPs*79sgzdMz#sW@AGM7oK$T7ULp~6QT7iGgL~pQDX%1 zI>3rIh)A~!%uCh;)Sg{*)Of|ootEppATLa=`&rN|Loeo_b=K<_;V&&7AHTD^V^Cmx z`()d~am@amIbMt=Y)e&OXTz^ezup3Z*KfegC*XiDYGemh?mz_(0aw6tTh`jaIbORZ z82?zG&b_Cn=PjBiJw3?zm-)IJToMsNJCNJCS$(+=H8p8B5nj8BNrHkTXdM4!hljo9Z6g;uM!tSO8{b!N!DR}HtT!L;)4({81K&&%Ml zmc`GO?%1)<8h&7fqnCpzG4rvbqcmrtm@%ll}YxWJ*_IN}xQF z4Z`T`JUW;BwlJfc0ylU!^0U>~3&ni`+u*1q%P+IW18{EdMGfGpl^71igFtYQR*&lWNC4D)=xuf}DuJWPcK8r|M?49wu z1-N~bf1-VS!2v;DidIpP3bqgZ*#YL(i3Q;Z*eQ&)@HFI$GdZ^Inj9sLJ5T*tNak)eY1 zFe2M3WgVpMGj4O06rnoAeEE7yZAf?uaJbd7d}V=fH&=-ODI!0QytBY9y{Fv6n5V3& zmR%!t7rD)~Qc)#^u(Ge0^dbq@bDMu}2J_0n^kUS5O{v^lD2RoeV=(dzq_9a3Ep9IL z7P$!@az*vhnifJ=&a1ndbG777YK2Ux&N)~p5V=L23%9m~GmkCVu_Y@aJ5U{Qt+TMY zrXQ2o(C(KA-F(R4ZeUlyYfC_w1PgA!56YI6!)+*Z58eb~G!MUbNLM#B#YDUWgLrF| z6x9T`d14JZ!ynYha+ZxAfZ?u3OeuoZGx_VsP{(4#XguCxHvZ7V#&s!H-hMl;d(R z4Fe)5=JNHHXvXv;;?_^1cNO0)<5@^OM4l*KimIelU4+h)_uQUg@?*X~*XlWOu5nNR zKX~bp3oYMbfD6WWEwxf{EvkdW?(RtEcb{-A-DQgRbx>`Mtd-DG%g5KRAjpt*wo~A4oP* zEZ7M?Z_`#63-ik}degx45LJjaFe?#Gi?@gj#=@hVlOdOcSd_Asg0Et58;P^naf;(^ zk~TFGx_n;!^O`5x!t53lf>ZYA3q($dz9AMDAbx1^;-wi;If1ERH-{Q-RCHrf3ns>l z;QI_{`*dObiarC~^C94f4%iwr=|9F5U@Lmpwq)x3eAvhngclPc^%b7wTDr=VfvEOV zme$CwlKtFxc+?NhzW@!qjs>`yohS%TkIo8gAI`5T@2ws#=+AkW_cHZ?8qCGOaxT44 zY9?Bpyf_Sg9OHpSB*i58kv{gS6dOwIBTHm`u%zo(#g*hle&NqKRL*Z{V1pcNXMaMf zlw%TaKSUe@)#O_oI2uoI#TC+u20~Yh5>$zzQYiL}oQku%xXvLg@+pNE>uW0;Op|U_s(sfN*L;hHpIYQ~J@_3EN4JxKw-`ibkPrlp8wfi?WuB?$=CUwi9AKt{~ zD2jy=zd+iKg!Wv!KvwQgDFWCaCjw6J{G|S<{=EGf#B@@)NOsHcjE@`^H96A99}HfL=e z4_ccz>~}dBlpUTLnH~T(jDR^We?rEmy=lKt0%E-L(g5V~_qoZHbP;-!X(lh1PLbXa z-aK66*>88t@|nYrZYf2Y%$%YPMce9kwwpFM)mV36pqh)up;6&^3z6&oQbau8c@3<% z1Ld@+j1pHeSwjTa#~Wg@&`F4V{b>_&@(lNkH>(Vw6z*)~83OL-ouNa;UP5JA1v@~3 z!{8B)Kx71%#sgPB0&?`ToO{XwNANNNO#jET>F60hr1!f{aHtck?gIQ?gRh2u>jUfh z!InNS9a-aVow`EZ-*8lLjl4gW%BeW(=`FP*-+jToXghI~kH-GZl1 z0s*FQ9|G!l-gGo-RmjWo*?QCk;MV8Uk}^tCLT6MEK*uX*a}aux_=nI4BwC-t;cB=J ztmXmFkH8l6^A_%DwBtkQ*`a?tJA|Hr2f7Wo!dDhxPfR+$v(P#5uE|P}GwegJ)5^Ti zLkk|7IYy?q)vGr*y~Pz*Nh|sY-Fe<+Sv5+B{D?mAMK@4)gY|s|-;ID(gFrb5){h`% zb!&CQxTWuV1p?SG4+8q|Jn3MB_~hl;Y##{@a$69EP)Q;9mt98yA6^}shd__S-+CD;W!0SMA8-!vPAKHSP{EB_OUILD*Eg>cw}1KemF|7&ya4)LrNam#vQ1+$vACVEm{a zVAHK5(X0L;Lpo#RQV&5$2JS8O6MG6L`gO*q-$$BK)S`1h?vRHvTtj48{6vttI3+J5 z9~xGiD%g1CVv$$Q`I@_ft?j*cGjddFZK~Tff!N;g?sf5m|l zaGFVOR7z|{@Y5ST*9XS0AFp@3X$5C*fqyv*w_D`|DH2n>M+);aJ;mtle>N(J(3$Dn zaFd-b&c`fF+8mqCPoQQOdKU#dGD+ew=#`~N3e4(kE&FQlp2a;!z`ck`!=srXa&oUZ zt}})B**?Ecu(ETa^XZM-?Qc3h9KWd=1iW4_Z6LLGco57UUJ&!if@%5lV<*9o zt`$GHnCFDTXaIGZr$A8fGWq)smCBRtAggtO6J#2&80`&CaNT%6A~ zk`KTI94_ZtqFd@mq26$q58=S`p(7+A!XYqQhxnHMsg^048mZ?Mvw5;yp~TB)%DF$( zaO-3Riu|d!)`MjsuEhGuV%#Z!l?PCAAJ)%>fOB|`DD3(Q$J;=)>*!Q-vapT#lXnFj zYWe#+j`~4a7C5Lz7^Ir3bJNG*C}0Ph5R;$sOz1Fl3GQ&kC3OA>p%e1DW##Bf&ySz{ zqXS2C6JDo@cbj+tiOH_+j&ijP!o-SbWdJ6rt&$d#KjvlLqx743y|OxGnUL=`0PJr9 zvzx%Q-vIcG>W-k?GpR2r!SzPGc61dl3&l=;=qkeR-(N+S|BI^k0B`C_w}v4h`xpy1m-a8#a3Xp`5 zHj^@w$z*2B_n3RXcZ; zw>JacSlWyRTa{o;{umfTf-RS4pTHr`y=(}zycgFn*bAO}k>^?lAA{$|D7WBQyf}>? zn#K=Iul!~K&s}J_fV1ZxTqAY{LYe|=M?qq>HeLW8G?*Xv!}OR6v&%*N?9y@e*$W7k zDN{4|BGs&}0jH88E|Ih#M>_z|*6Ypu_mN(vk;HOYw7i2+Mk~`5Nm;wX_Im_`oDP@2 zDXd8`Bv&LZI=an`H5Yn@$C@uV#!9=2zozkX>ORdj-D?m&ekUwX&uP7!$jZEq&ds$!tXIUhZRPx zlZ$$+Wb|F43dM3&2ydB-Lgb{M> zODmXkkGR7jM@1LX&u4ZJhI^uxT)_R!|UDxb!+p)tb=P4dpTwd_Wu zY)~1ixMoNqsOIlNx>R+ZI<5F1hy6S9i_mCe1zMM$Gs<(TyI!_MzE;LEfOf>mL?@tTLx8#Y}I? z&WMongaLgQ!UWx;=9cywwLNN0F);1}Mn)k`R>kmGFBF}u)=C8)l-6NZxAL$TYK8U9 zCSX5e!x^bcuFT+TOx5H!n@}fM(&_}t#v;9q`yDjqtKmB+lffyB886L^G6$4L zJA{%0^W}v>yy!D}lK{&s)Nr**;UEC1Zh(vb317Tk+rlptCP8h% z`k;_RSMeZLC;D;Oe}U{r4gw;L)ue9Z8BpPeIT2!iS-4mj5>HQ1?(sp2)Kt|eUhsF_ zsHaY)FbO6p!T|;G!oTc69d?zX)^$V%Gf&v98PpB}8;f8H&U%U}fai@&4do`I{df&0 zGdf$E5>G#anujXPrY;)4gPQGR-hy>BSw@ytKB{aftuyq~AEO>vbeqU}Dos!Z@mNn} zv=-Tzb2IcFR#{hoG@8(WqyFt;$hg<@%c2Gg5Z8u_on^qcVLd}--0gR218SD_QD za20Z2T?HX7H1Nj|Nx%48_j$UuLj+;lVXo<4fD|Ddwz= zz=~N=4<(a=3Ls%4%uwKAd>(ZG;g>UxK&eiS+KMT zdiX%d^A%7Io#e3}Adm`aMFLH{IzAelPgImDUYWqx)VF~83M$hK1VR~cf{Rfrvy~W( zwa+%}KIeCtzUZ7_uzClpMggm^dK)}0AB1!4iOx2wlnnxa? zEAjsGPQ!VENgl+N41Nx;E-fi8)@s)3LEWfUmjL+GYQwuZFnIvJUEYKu6G+m)0ZLon ztm)u6w<6Fx3m#(oP<)bFn*_C%i{#o3Rj;T}$iF)1H26c+)1Y)fjkSwvay4faNpe*j zZ@I#YaT?eUmkkKVFLg5B+YTPy=&|$U_OSP3Z8CjcwfM`P%RSe|KAspGxpoIX$Ucdm zejXp%RB5lMGMVY^^_~qo2A{cjU}o=Knhjuw7#)b)-~#VMU4R4X2vkj!ll$oaf}j`@ zj}S45ADqDdIeug8+Sqj{0u1xO3gC5si2gep84RVK1$m31#>O%&n|tX#?5DcE2i2s zjZl%o!kVO!gmUMXA7^gh-#(<+-|%YY8vbn;dG;7{9sjnIVxyP0GVEh041|Y?g2Qlm z2*AdVfp1rZeBv~K3}7h(%HkZ)c^&n&5!jH?dUX48T)KT4m!Yz$mwsVRy)Jy@Q1T=b8GyzuX%2T`}gDc z@7T#S!0lTnxD2Via1f`JYiPY^tIdSLUO_~UTf{_!- z4Wf#2i!$Wg-6&Q<=xM-t^>$4Y?=ph$25)67{lV|Q04k*30ix)uC~t4psU)A+cVh$h zcskNb^QvXv-yQ$Of&bXPqs{N~Zfgga8O+-+M~wKwMQUZAU!nPtEx+D%SY?Gn;jjk166}%cj#NJ2pzA@`~veT%JDigUs{q`l3Z1AFh3?Il}Hxogt&5*eA%&|HMF8HB3cA@4Mr$zN21PFiwspVqPEtPX`ji31FwNS)-*Wxt^UD^igb^_@w~j021F@x+>q{%ihVaaTXK^e;$9lt-jW!@}fe za~gB{{|=@BNMO?O+F?Pr!1)ptq^bf{>;o!Jevjg;g6AaFQ1c4{$f9ru|z|ZezA4U-_j=&3!S;?`7_du}~;CdY_)Q&3k2+#R68mS?Z z%q$dWL}ASCzk(Um4jtG!fLw&3hyW||MZ6JpyGp_tssMD(LA?E_%2MU1>F}uGqy}dv z$^habl-!qXPU!ZQbL??OnL$XqKM=I+naOBvHE@UG6{rdB6dSplWT`Npu`5tKgzd-# zxSAC(g|ZB?!aR$jV1DZBoRTA(H75V)^=Y=Lrr z;IaER)$7Q8!(-8qi;*H=16OISRq(I>jN0Ipt{V^1;-Y!4yY9PW!8qJhGnk2*hMP)d z0UWTJ8Z9yaNu@|iC!g#ABupo>KgiHUz&tZlkWyHfz@Nt^1~crNEQ6L-IvJ)v)}GWJ z-rL3r>yny+nxN&Qo5ia8t*z8W>F~l5mZGYO=3Kk{ZC&iTtpT~ zn0@Vynr_|*tJ;J@T!%KZaV> zb$SQkNhO*Dpb;LUSZ{V3ZguR%a@~^bpiFxO<)1A|^ zz}oDE6XJpQI;WT*!ioXQy@%2RQFfMhj{OwvPY6g)C^Unwuh>*#D#30;eYM|>C>A;1 zamm>MNi-g@P#v!M7?xW(q0VIZebftIo-{*sab#s*dh01h#SUh(uSi~`PiAIhMDU`0 ziYvSYl|o&bMndOLwI~~TXY2J9H3Emp)L;D#ZN{h!zm7#*=sf^ClLB_Hosf_^imJK{ zZ53_BW{qA~zQ@EV2unL5IU4y^)bTyLEtxt+Rf<}nRp<(4FSZSLeM)09dyaYW;M>70 z3W0mJKwjwB%_-FvYb*8mjZ0Gvc*O;p{Rs0JeI4Ogu$!yWu@H_WSw^tTqbL~MUVyDm z&)`2!eKL=aPU5F0Ryv=W10H+D0)85><>%S>)RK(Z3vz`M{4f;qJA%~N9e{>AQ2vQL zaaweee~QdAz?xQ`TP+(OaI{*7EJGD%i)R7#v(KYYK$D65OGullPCm^|V^2}uAk+~H z_5r48RuA#851602(1{ogjDNrktsR;^-VzV>caS~?v2ete?NMTmh_k!T9i#i7&rk*U12~sHEBJtBT#MA)z2wl%Pze%h1Ksindl& z3-6Y-dQRXb1DD6tX+{%jz~KkWoN6p%^{CSw@$Qi&2;b@?a?d?{jq z`(MU~;AL8yi;3Fv`090%7rk5RJfRdIp!tS8rwoa5q;s4<9DY1J2} zXmd*>V|5(St<L8SXt#E2PZc$W{=N%S(SOEa&trgXXZp>+{|w2>CBY4FuEvB0mC85 zMa?;Xz{wy!c#{ftVIEMKG_*mnf^Dd`iA=lzyzc(r7G~ceAuflv9Z%{MV?d6^& zZ%tNnGJeRKm0zO4);_@CL9fe5VN-T=aj_S`UpwieCCLc+W<~JjjNF2gnUOX0Z^~pAXJEAA-);FV4R@e`8=xHMEzQtA@+!wdKV%dulm_ z;W=T+$7A1)Iqbc=G2M_`mEJv7+tv)9VGAo{{ZUXfDHvcGa&*9V!2Teq4g;A)4F4u7 zXjL|z<>EZ-Nws(V-p`E_1BuRhU?F}HHNz?DAZ{pFoj`u^0$zoBG>!TeGW<_#gyG!f z-S;*^>Y5N5Ssx=so3ax`7w4$fE7e`~w@R(rGQDv(q&UZ9177^V64Z(+ z;m~wlTibbB5vYm@<+=qdI8V&sy`W0CK~w|yGiMZ|WS`C49J?>_g9F~|e;&1@8B?ny z7dkp&ZTsYM{~Z&4sBB8pq6H%F5VUq;iqopI`RSIP{7-q|vzja-1{(4BY z$k`t)$%;s$ab6$gfP%v=I1dv`HUOGnoYjxofW)@LJW>FR4}iKCQ5b0ABxK@mtRz-8 z?s5#HIGA)i#NY3@$LTi{Eyq`eAG<)!j7^V17`dHeD;W&xJ>P{RQBTy;jnFkuXbfiZOO-DB@4pqK@m*@Aqb zZh{GC$ z^$&EH6swE$dcOfq;^`e8+fNC{vK!3<^*k4cQRkss=HM45i-EBO zIa(kTLC^<}QO8Db@4ZItNsBFrQ&jJRD^a3x6yw)B$E)yzZHigWc8NTHJxJTXrQDOZ ztB9!OCi@tBlYF0>>}q(j{KE3fOe9Q%BK}7(5vuAtxbBy?FGb+3RM@lfVDIOLeavE0 zC|wm@5*@`2&CCo=lxg%5epwO}9%5Q)t0*$^dhObhYC)r+x^WpB&~R>s3?U;>dX{D#l9M?rl=8Ut)IuVB|QK2TX(V# z9yNo$t}=DHqqnuYx7DvPe%${Rk2j*(hm))c!0dp7wfXb*e_o{>DVEIM)`DFCVX)3b^lmSS9n#LJ&s+I1xhKwnQy+BTfBI?uCchJyy8$NM;3VUz&o$Uw4@tD z+k5-E23z`#R;{+Qg2wc67ZY8xUe{N zvkE>?X*tclcu&QgP)50~l%h%5ImUIaryAPqZ3dgcsxPfD9&6`h3sd6aLwt96d+$C~ zo21XJlniv(>YBP~l~++w9^^nvRWTr=tQf~=?6>isLI1dZ9+xlTVqj~3af*O+c$p2Q z4olTAn*jY74@CM_SSRC^(R^J~GbpI>L6qr}5tk4h)*REG(&!n(DLqr3qbuwTugd5U zhDC=YdP+|uh3D+ZHi@-)Wn%nX<4@;4{}l7z#v8(Ll7cR4EjCrw(kh|6D4WL~Vqa~) z#y%`)J!|f-zChz-G~ohsidL0lkc+puZrC=U_=zfo4fq*PAR^%TKT45JzYBN(B;Hqw zEV8dMp%6Y1z-LQ-L-_g=xa1kO3>`SZC{BQLB!XrOF+$F(Pk;cumeQZoST#em+pz^_ zzzjYPt5)y@=dnu$;lr0_TBg zYM@gIWIwDm(kLZxZ~s7k;Tix>P*K(OXa;#~m=iH+k&}dqp;weSy&|hh_U(o1 zSLZ%212c0;3H|XqjIN2Ok3gx@1Hi3`{5cRDLVvau1%ePpEMQ~q#W6n0P+<09`D;-2 zfZ**Vs-e|nv$R#&wED`b!|j|Lak@wvcXac?Lm&85r&Xj?N`|`{A@Pw``l*D$T(=)5 zP16gL&IiU*rdI#30Ks1PfjPWxc1>5d`?+lA_n;B3sVlCqb{wqXoRR0HXC|N8a@6xR z?^-e#<`Afp=st4{=T59eh0O0%GN;g=@EHUROo zs?elEZ!EzPcw-tJ!PzC8Bz<;m$wf9XFsaB|V-_MTt% z|LqiAX)muaSzhZ}H?{HV*2RF4kjpe{gEpVm;!rp9@Ojh)%`GdyMMY8~(bz4bNC0pt zg1qIs%#1VH6H0_eWfPDO2~;;|@#+ES5oOMD3@HMD9E9^o^cM*(ydB5Cj{nLyli3uo zyttj7#CwRy?Z@%&p+bzDBYg*_Gjiz#<_%Ux!MYB_0uh|p2y-oal^sU`z%00!_ohYy z=^jOa?8aTsu}{24gg(^?H!qzX9J+D#V%=2pKWG3d_q76~XcG}^clk%Ga1lVRstq&& zz|<(d$MwIz4r&vTh#=zEQFE)Uv3ca6l_Tw&q9AY}CBiV*gRQTNck>AxxQh)Wjl94Qe}6oP-bsru*qBSZ9}Qkw zgKJ^nClXA51ciZOhxE-XP$5Afx6u(Y>UA5P9!PGE17Bmj(~}`0HmDwAL{MWd zpF{ydwKhiJe#8Pg;zX$9{s0fIPp$akX9L#;f1ue!EN1ecBT)63)yv_q5N_3J;YS z>>YO~KV>wO8=sNlOr*^Qg1E4~QvppEOU<~z8BDc9MOV)+jF-Taybk-LPK^~@8qk-8Ruwoz z9$$W&fj@)TS%l#uG3@L=@hn615?!Vq*4T3m$~sn-zOILHRqo>LS z%IK247EaRf*i#;R>7wjh$e>eY<^VAx^3npX?qgqMPJ$}fWu|Cs1+fq04XJ$3DQDyvyqq|A2T1{ms%?@KDlOj(}6Q^wSdOL=FJh3{ZIHyd4A8EQ;|M^e{OcpmM=(z(- zda@`fIDvg=ANx=^`(|Q|Tz>|-nuj{^(=&MWx6PpCDAfbt0Y&cE=VLd=uTHc~*8|nG zYF<5uSI=e5uSt7q&5CjN{~7;RhYEqT5&lNK{Zzz&7Jks_h9}}NA`F+BtGR#yo zKnkphhN+j&Sb%;rgH{mwm`UpN0B#by8k8XrMq(z*zC@iC%1x3}p+M?OfWX&TNfX)3 z(h(>U3^HQUHf^+NfQgzwJtjg5LU}4l1MrZ7=}JO}7Ft~utE-K6>NtZ}vovUqjw~Nx z-2dk(ob>`q%`cRQq?+Q>{4$9;PX|>{Jxo`;>$S#l0saO)ik&pZ5`;?N()Od6cyhmL zz%~I5t4pBH2nP-y#E5oP+c+eWulgKky+^TGn9JP6S?^PB-;Q4!S{z&$To}d=K|lZ0 z40g_cIpb<+w?hC#ZG262OKzYi&{@z>+-L7xtK{p*01AZa)#cZC--!>_Oy@D&ZsBs(Z4sFfAdEz%vN`zSApB$Bzl)ojtHn}XTQhL2+%F$B$HFz8+$UwN*{{4+V<|g$=;grMqoK`QB&3(|tuR#~j(Wjg$gL+2SYdi>*Ha zibmNRGCgH`M9o4+P$#{_WuIiy;>DuFr&4;e+cIbHhbE4`+oCqZ?oE2gq0c`bdnQxq zU$B-vAkS}C)Sek%i(fEy>uhQ(fgoUB-lC5bzQb!Q83aZ=7I?FyutjyO*%wW4cljbeu3H=7IgbCUjnj9_d7Ax2jLBbc| z>}5t}J(7Wl?tadRj#%>vJG8~drtq6ne*Q8Q{?}R7W3T-$kb~ z)EbamOV!!1cK?Y=0NEShsRkR-&b)`C8RZ^@Utu`S?!|8+=fNkSap+I!1~g|im+58s zaujnC)I|~GChkzR0}a|wwOp%gsk>h4(3X|dLdz-d)R|c6kr0+T_R^jYOetlVhQ$6k zOKaUItvFPacarOtI*k?6IBjaBGkgIL6BWMmEwH&%>kXPVE#6msR*yGYYhv^{=8)+& z&SCs$+~_;_VQ&#>T7?ZxfG&nZ$WoJx{{OqZoNsjMWa&1&|=Pm1} zH4smH4(!Vq(TXI}8*+FtY3$qbEunA6)}>S)?`*l{xLbRd#^;v5V(_ph;PN_EJxu00 zstUewHD4hYsr+~#)QJSUMVbZI&80R~L_1R5Kh8sq9Q- zHjRVZsV2a_4FstqBtjt^^;guTX@Pbo*~~%{8_vZ&T86ki>tRlS?JY=GYdiH}YbN%= zulMUs4g98BLtFXnWPNg35`2W!5QW2ni*Qq_t{VU~-eSY6>hao9-zmSxTi&GgqpF2%q1s&t72E;95yKtR4!ul5(!xK26(6bw_y_Z5 z2Hyg0%`F5>E68hZ!RA}HkekOW*3IA()4$HFCIb0O9+&XP3v0yg_dp>Z$*{Gc{URnt zkf|icLE>JbQVRFVCH(Y~H~aJ@((234Y#%E@vYfow@WUmgVf+e_E<-D!3kG_WJ-nOsmU$qf!B~41 z`Vx&Uawmoqk|WLNhtcV-8;c#ms``22FI`YK>RRC|#*>a|KC11k?yyYkG;o02ixm6P>}C(f>0s9_JCNrpc=Fc2 zpKO9BZuqNl{3U`FbY&8+c9&6KrK^R>o!9tT?IKLp ze}EooG<*=KRO*!N=eSFLRD-Ta*+aBOQkNX*DvD1eYb5|QyH)MrU3&t1L0iv@2v5D( zSK)~ddGaLMo)n(DHJx_4J1;Pipq7!q-EP*FshibxtbZr#c7uK5;F||MUp-cnT9HyI z`SZfU-1)EPHjJPAb!TN`rMaqxetyw&;@B6T<3Ekzm+g3)wpLfKDW?^Q5>*0E?a7GQ zEm7=)unlSabmFZ1O3KAE=d%7vyZO#z%`9FIUduRWYXv*woXrgQvHSs=2+2Tb>L3)J zo?Xw*yAFz6=GZ211mk&D>>3@x2a78X@hgP7Os$yCAD>Zl!;M+9Ai!z3o9c(Y%zam` z%WK>Xn)?ED&eiP$K2R7>P+0+p4e-M?;B|ke-+PvGO0q%9KAKD?fx~@mHv1y4DnXwE ziAL_a%X+-FhIWetjDLOP%i+&QQYMwbf=z0V};0iOjC z^hx+*5>Qv_91TQv(he5 zT2-|$?LR{eL%0)ks$u$s3FEm-_ypCo0<@v8O~GIKheE z$wHC#IxkCJq?QN_$@;7k*)8>i_M)Cl^aH-35lz$Q50 zhIdYU1XuOr;g8{(9+=0ng@D;L_h6dqfy5^qgU-36nR8S@JdydbF(1RRepj^v$3QO+ z2m_8)qh1$%3g1mkl<#aYGTBV^_JIRcoXqfaQEU*+#=)VYqM?uW)Nt}-nUXZgiOolk zzIV)&TAp2*G}2|S>*%EwajH1L9`93PIP2+f)+>rSdG7y(#XHzBm3`dLC`e6IbnyT70!D}Nt`imZGNZ}Hu4`eRn0x&;jrC{%`lIcn$(SHi zK^E73bT6DL(C(4-UaU?BCH`JYq{>o= z_*#ccLKe4;%|Ky5E4WlHF0&KP*aR_Jp{`>9SQ;CN$mK&9o!LYh{P8Zj@#8Py8=ZA2 z0f2&pfe9;z{u7+(YNdi3!mg?ULFQhnUR?#Ojv`S;i1w_@_!{bi)8G=lz}x|Y@Y)yX zlad?d=SuHZH$jeC&@?A9BO&i#4xI=>7r!+2O3V08VNxGa838WJP{pb%1deN#a zZ0aqStyi;!)u1D%n9XeJ?fVBd!vVK5ko&)|8n3)4xrh~)aP`Hwi)(&z|I``m1Yv^$ ze4EW+QL%tNN(;I(2^Zu(sj769oUgXn)FvL*E*=FXrfwLc4w{B8)Q|)f+eFN8hXYnYnzhC1PUh$T^PR`GAoF^R(CUAx38>>Y9tN zl>7J`@()OA-Os71swk@{n>cGR_4PFcvWOGsI7qFr=;?Tg%iZCIJoK6ZI;x^jFR-uwvy7WL0SQEIIz~dN5!eqAv0EMw?jX} z`9~tY2f72MERmQ@W1GIg52L;YBF>zF9!CNJ-hcRv90OXUjvRxgxj%1t)e|?d&-)bX zx7zXZ@eh@S^12iiDRuuYfH;PFl26$a}A~3Qh$Af@>jtWk= zuSq7ReYoW(Uq|6eQ9&f3oLiMGJ>2E>OFHIaRGVbVyL*Ild??o0;8P)@?l;*XzkKS3?SS#ih})p@l0@ram$8>*x=oKaBr#dgag4 zH{icdXYs%svCA*5hs@^On5?MODEc@N>JbruSWP5opHh)3kwWaM`#N|au1#lyep+T3M3>b2mi}jg8-hil*N%zB63;kX-3taHP zYwQ3zx$1u(pM#&5Lze!)fGHj}z+jaW`(WO4*<1KId(#5qkK58U$_61lg()j!&O_py z1_a&~xUVn7GoZ9c_2e!qfC!T);-MIV`Kx}2>r_&6MP@KeTxcZw0w(U`E-zENRZ`%} zTraU*<2skAYc9J9zHm>(T-kXp_Itkyi@|KHdb=yI*>jF&kEs~ngF!LxMb>0gWEy36 z2Kw6PuhMS*3(jvRTR`6uJm<0C{%7a65XY%tx8=MeelCoC`QQues&%lDYnD+CL9p~C zjC%1V$8Y7|>F{P6A3>}>lU2)E#6Omko9o9r?NwZQQc#|t&DO@!`SW(wAn!)K+zHt_Vv{D(TbEPf*?R(5=Ewb;(O@OjPRaj{h5gUDG4WzovzO=�ci(J|R{ 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

    1Dvm>^3fCy4Q$aJo|lBt|rbomhcma08#`% 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 bk2yFx0Y2al*9kC;i;ErY-n~ciVrc&d3i$UZ diff --git a/doc/cheatsheet/Pandas_Cheat_Sheet_JA.pptx b/doc/cheatsheet/Pandas_Cheat_Sheet_JA.pptx index 6270a71e20ee88f5020a76f139f404f18f4bfc30..cb0f058db544809b9de0bcef31776f0f66883053 100644 GIT binary patch literal 82359 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 R25lhZ04DI6Ccx^30RZuu|3d%( literal 76495 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

    Ql*HwboAFVY{v2e%FIi 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', + option_parser.get_default_values()) + with open(fname) as f: + data = f.read() + + parser = docutils.parsers.rst.Parser() + # do not generate any warning when parsing the rst + with open(os.devnull, 'a') as f: + doc.reporter.stream = f + parser.parse(data, doc) + + section = next(node for node in doc.children + if isinstance(node, docutils.nodes.section)) + title = next(node for node in section.children + if isinstance(node, docutils.nodes.title)) + + return title.astext() + + def _add_redirects(self): + """ + Create in the build directory an html file with a redirect, + for every row in REDIRECTS_FILE. + """ + html = ''' + + + + + +

    + + + ''' + with open(REDIRECTS_FILE) as mapping_fd: + reader = csv.reader(mapping_fd) + for row in reader: + if not row or row[0].strip().startswith('#'): + continue + + path = os.path.join(BUILD_PATH, + 'html', + *row[0].split('/')) + '.html' + + try: + title = self._get_page_title(row[1]) + except Exception: + # the file can be an ipynb and not an rst, or docutils + # may not be able to read the rst because it has some + # sphinx specific stuff + title = 'this page' + + if os.path.exists(path): + raise RuntimeError(( + 'Redirection would overwrite an existing file: ' + '{}').format(path)) + + with open(path, 'w') as moved_page_fd: + moved_page_fd.write( + html.format(url='{}.html'.format(row[1]), + title=title)) + def html(self): """ Build HTML documentation. @@ -150,6 +222,8 @@ def html(self): if self.single_doc_html is not None: self._open_browser(self.single_doc_html) + else: + self._add_redirects() return ret_code def latex(self, force=False): @@ -184,7 +258,7 @@ def clean(): Clean documentation generated files. """ shutil.rmtree(BUILD_PATH, ignore_errors=True) - shutil.rmtree(os.path.join(SOURCE_PATH, 'api', 'generated'), + shutil.rmtree(os.path.join(SOURCE_PATH, 'reference', 'api'), ignore_errors=True) def zip_html(self): diff --git a/doc/redirects.csv b/doc/redirects.csv new file mode 100644 index 0000000000000..a7886779c97d5 --- /dev/null +++ b/doc/redirects.csv @@ -0,0 +1,1581 @@ +# This file should contain all the redirects in the documentation +# in the format `,` + +# whatsnew +whatsnew,whatsnew/index +release,whatsnew/index + +# getting started +10min,getting_started/10min +basics,getting_started/basics +comparison_with_r,getting_started/comparison/comparison_with_r +comparison_with_sql,getting_started/comparison/comparison_with_sql +comparison_with_sas,getting_started/comparison/comparison_with_sas +comparison_with_stata,getting_started/comparison/comparison_with_stata +dsintro,getting_started/dsintro +overview,getting_started/overview +tutorials,getting_started/tutorials + +# user guide +advanced,user_guide/advanced +categorical,user_guide/categorical +computation,user_guide/computation +cookbook,user_guide/cookbook +enhancingperf,user_guide/enhancingperf +gotchas,user_guide/gotchas +groupby,user_guide/groupby +indexing,user_guide/indexing +integer_na,user_guide/integer_na +io,user_guide/io +merging,user_guide/merging +missing_data,user_guide/missing_data +options,user_guide/options +reshaping,user_guide/reshaping +sparse,user_guide/sparse +style,user_guide/style +text,user_guide/text +timedeltas,user_guide/timedeltas +timeseries,user_guide/timeseries +visualization,user_guide/visualization + +# development +contributing,development/contributing +contributing_docstring,development/contributing_docstring +developer,development/developer +extending,development/extending +internals,development/internals + +# api +api,reference/index +generated/pandas.api.extensions.ExtensionArray.argsort,../reference/api/pandas.api.extensions.ExtensionArray.argsort +generated/pandas.api.extensions.ExtensionArray.astype,../reference/api/pandas.api.extensions.ExtensionArray.astype +generated/pandas.api.extensions.ExtensionArray.copy,../reference/api/pandas.api.extensions.ExtensionArray.copy +generated/pandas.api.extensions.ExtensionArray.dropna,../reference/api/pandas.api.extensions.ExtensionArray.dropna +generated/pandas.api.extensions.ExtensionArray.dtype,../reference/api/pandas.api.extensions.ExtensionArray.dtype +generated/pandas.api.extensions.ExtensionArray.factorize,../reference/api/pandas.api.extensions.ExtensionArray.factorize +generated/pandas.api.extensions.ExtensionArray.fillna,../reference/api/pandas.api.extensions.ExtensionArray.fillna +generated/pandas.api.extensions.ExtensionArray,../reference/api/pandas.api.extensions.ExtensionArray +generated/pandas.api.extensions.ExtensionArray.isna,../reference/api/pandas.api.extensions.ExtensionArray.isna +generated/pandas.api.extensions.ExtensionArray.nbytes,../reference/api/pandas.api.extensions.ExtensionArray.nbytes +generated/pandas.api.extensions.ExtensionArray.ndim,../reference/api/pandas.api.extensions.ExtensionArray.ndim +generated/pandas.api.extensions.ExtensionArray.shape,../reference/api/pandas.api.extensions.ExtensionArray.shape +generated/pandas.api.extensions.ExtensionArray.take,../reference/api/pandas.api.extensions.ExtensionArray.take +generated/pandas.api.extensions.ExtensionArray.unique,../reference/api/pandas.api.extensions.ExtensionArray.unique +generated/pandas.api.extensions.ExtensionDtype.construct_array_type,../reference/api/pandas.api.extensions.ExtensionDtype.construct_array_type +generated/pandas.api.extensions.ExtensionDtype.construct_from_string,../reference/api/pandas.api.extensions.ExtensionDtype.construct_from_string +generated/pandas.api.extensions.ExtensionDtype,../reference/api/pandas.api.extensions.ExtensionDtype +generated/pandas.api.extensions.ExtensionDtype.is_dtype,../reference/api/pandas.api.extensions.ExtensionDtype.is_dtype +generated/pandas.api.extensions.ExtensionDtype.kind,../reference/api/pandas.api.extensions.ExtensionDtype.kind +generated/pandas.api.extensions.ExtensionDtype.name,../reference/api/pandas.api.extensions.ExtensionDtype.name +generated/pandas.api.extensions.ExtensionDtype.names,../reference/api/pandas.api.extensions.ExtensionDtype.names +generated/pandas.api.extensions.ExtensionDtype.na_value,../reference/api/pandas.api.extensions.ExtensionDtype.na_value +generated/pandas.api.extensions.ExtensionDtype.type,../reference/api/pandas.api.extensions.ExtensionDtype.type +generated/pandas.api.extensions.register_dataframe_accessor,../reference/api/pandas.api.extensions.register_dataframe_accessor +generated/pandas.api.extensions.register_extension_dtype,../reference/api/pandas.api.extensions.register_extension_dtype +generated/pandas.api.extensions.register_index_accessor,../reference/api/pandas.api.extensions.register_index_accessor +generated/pandas.api.extensions.register_series_accessor,../reference/api/pandas.api.extensions.register_series_accessor +generated/pandas.api.types.infer_dtype,../reference/api/pandas.api.types.infer_dtype +generated/pandas.api.types.is_bool_dtype,../reference/api/pandas.api.types.is_bool_dtype +generated/pandas.api.types.is_bool,../reference/api/pandas.api.types.is_bool +generated/pandas.api.types.is_categorical_dtype,../reference/api/pandas.api.types.is_categorical_dtype +generated/pandas.api.types.is_categorical,../reference/api/pandas.api.types.is_categorical +generated/pandas.api.types.is_complex_dtype,../reference/api/pandas.api.types.is_complex_dtype +generated/pandas.api.types.is_complex,../reference/api/pandas.api.types.is_complex +generated/pandas.api.types.is_datetime64_any_dtype,../reference/api/pandas.api.types.is_datetime64_any_dtype +generated/pandas.api.types.is_datetime64_dtype,../reference/api/pandas.api.types.is_datetime64_dtype +generated/pandas.api.types.is_datetime64_ns_dtype,../reference/api/pandas.api.types.is_datetime64_ns_dtype +generated/pandas.api.types.is_datetime64tz_dtype,../reference/api/pandas.api.types.is_datetime64tz_dtype +generated/pandas.api.types.is_datetimetz,../reference/api/pandas.api.types.is_datetimetz +generated/pandas.api.types.is_dict_like,../reference/api/pandas.api.types.is_dict_like +generated/pandas.api.types.is_extension_array_dtype,../reference/api/pandas.api.types.is_extension_array_dtype +generated/pandas.api.types.is_extension_type,../reference/api/pandas.api.types.is_extension_type +generated/pandas.api.types.is_file_like,../reference/api/pandas.api.types.is_file_like +generated/pandas.api.types.is_float_dtype,../reference/api/pandas.api.types.is_float_dtype +generated/pandas.api.types.is_float,../reference/api/pandas.api.types.is_float +generated/pandas.api.types.is_hashable,../reference/api/pandas.api.types.is_hashable +generated/pandas.api.types.is_int64_dtype,../reference/api/pandas.api.types.is_int64_dtype +generated/pandas.api.types.is_integer_dtype,../reference/api/pandas.api.types.is_integer_dtype +generated/pandas.api.types.is_integer,../reference/api/pandas.api.types.is_integer +generated/pandas.api.types.is_interval_dtype,../reference/api/pandas.api.types.is_interval_dtype +generated/pandas.api.types.is_interval,../reference/api/pandas.api.types.is_interval +generated/pandas.api.types.is_iterator,../reference/api/pandas.api.types.is_iterator +generated/pandas.api.types.is_list_like,../reference/api/pandas.api.types.is_list_like +generated/pandas.api.types.is_named_tuple,../reference/api/pandas.api.types.is_named_tuple +generated/pandas.api.types.is_number,../reference/api/pandas.api.types.is_number +generated/pandas.api.types.is_numeric_dtype,../reference/api/pandas.api.types.is_numeric_dtype +generated/pandas.api.types.is_object_dtype,../reference/api/pandas.api.types.is_object_dtype +generated/pandas.api.types.is_period_dtype,../reference/api/pandas.api.types.is_period_dtype +generated/pandas.api.types.is_period,../reference/api/pandas.api.types.is_period +generated/pandas.api.types.is_re_compilable,../reference/api/pandas.api.types.is_re_compilable +generated/pandas.api.types.is_re,../reference/api/pandas.api.types.is_re +generated/pandas.api.types.is_scalar,../reference/api/pandas.api.types.is_scalar +generated/pandas.api.types.is_signed_integer_dtype,../reference/api/pandas.api.types.is_signed_integer_dtype +generated/pandas.api.types.is_sparse,../reference/api/pandas.api.types.is_sparse +generated/pandas.api.types.is_string_dtype,../reference/api/pandas.api.types.is_string_dtype +generated/pandas.api.types.is_timedelta64_dtype,../reference/api/pandas.api.types.is_timedelta64_dtype +generated/pandas.api.types.is_timedelta64_ns_dtype,../reference/api/pandas.api.types.is_timedelta64_ns_dtype +generated/pandas.api.types.is_unsigned_integer_dtype,../reference/api/pandas.api.types.is_unsigned_integer_dtype +generated/pandas.api.types.pandas_dtype,../reference/api/pandas.api.types.pandas_dtype +generated/pandas.api.types.union_categoricals,../reference/api/pandas.api.types.union_categoricals +generated/pandas.bdate_range,../reference/api/pandas.bdate_range +generated/pandas.Categorical.__array__,../reference/api/pandas.Categorical.__array__ +generated/pandas.Categorical.categories,../reference/api/pandas.Categorical.categories +generated/pandas.Categorical.codes,../reference/api/pandas.Categorical.codes +generated/pandas.CategoricalDtype.categories,../reference/api/pandas.CategoricalDtype.categories +generated/pandas.Categorical.dtype,../reference/api/pandas.Categorical.dtype +generated/pandas.CategoricalDtype,../reference/api/pandas.CategoricalDtype +generated/pandas.CategoricalDtype.ordered,../reference/api/pandas.CategoricalDtype.ordered +generated/pandas.Categorical.from_codes,../reference/api/pandas.Categorical.from_codes +generated/pandas.Categorical,../reference/api/pandas.Categorical +generated/pandas.CategoricalIndex.add_categories,../reference/api/pandas.CategoricalIndex.add_categories +generated/pandas.CategoricalIndex.as_ordered,../reference/api/pandas.CategoricalIndex.as_ordered +generated/pandas.CategoricalIndex.as_unordered,../reference/api/pandas.CategoricalIndex.as_unordered +generated/pandas.CategoricalIndex.categories,../reference/api/pandas.CategoricalIndex.categories +generated/pandas.CategoricalIndex.codes,../reference/api/pandas.CategoricalIndex.codes +generated/pandas.CategoricalIndex.equals,../reference/api/pandas.CategoricalIndex.equals +generated/pandas.CategoricalIndex,../reference/api/pandas.CategoricalIndex +generated/pandas.CategoricalIndex.map,../reference/api/pandas.CategoricalIndex.map +generated/pandas.CategoricalIndex.ordered,../reference/api/pandas.CategoricalIndex.ordered +generated/pandas.CategoricalIndex.remove_categories,../reference/api/pandas.CategoricalIndex.remove_categories +generated/pandas.CategoricalIndex.remove_unused_categories,../reference/api/pandas.CategoricalIndex.remove_unused_categories +generated/pandas.CategoricalIndex.rename_categories,../reference/api/pandas.CategoricalIndex.rename_categories +generated/pandas.CategoricalIndex.reorder_categories,../reference/api/pandas.CategoricalIndex.reorder_categories +generated/pandas.CategoricalIndex.set_categories,../reference/api/pandas.CategoricalIndex.set_categories +generated/pandas.Categorical.ordered,../reference/api/pandas.Categorical.ordered +generated/pandas.concat,../reference/api/pandas.concat +generated/pandas.core.groupby.DataFrameGroupBy.all,../reference/api/pandas.core.groupby.DataFrameGroupBy.all +generated/pandas.core.groupby.DataFrameGroupBy.any,../reference/api/pandas.core.groupby.DataFrameGroupBy.any +generated/pandas.core.groupby.DataFrameGroupBy.bfill,../reference/api/pandas.core.groupby.DataFrameGroupBy.bfill +generated/pandas.core.groupby.DataFrameGroupBy.boxplot,../reference/api/pandas.core.groupby.DataFrameGroupBy.boxplot +generated/pandas.core.groupby.DataFrameGroupBy.corr,../reference/api/pandas.core.groupby.DataFrameGroupBy.corr +generated/pandas.core.groupby.DataFrameGroupBy.corrwith,../reference/api/pandas.core.groupby.DataFrameGroupBy.corrwith +generated/pandas.core.groupby.DataFrameGroupBy.count,../reference/api/pandas.core.groupby.DataFrameGroupBy.count +generated/pandas.core.groupby.DataFrameGroupBy.cov,../reference/api/pandas.core.groupby.DataFrameGroupBy.cov +generated/pandas.core.groupby.DataFrameGroupBy.cummax,../reference/api/pandas.core.groupby.DataFrameGroupBy.cummax +generated/pandas.core.groupby.DataFrameGroupBy.cummin,../reference/api/pandas.core.groupby.DataFrameGroupBy.cummin +generated/pandas.core.groupby.DataFrameGroupBy.cumprod,../reference/api/pandas.core.groupby.DataFrameGroupBy.cumprod +generated/pandas.core.groupby.DataFrameGroupBy.cumsum,../reference/api/pandas.core.groupby.DataFrameGroupBy.cumsum +generated/pandas.core.groupby.DataFrameGroupBy.describe,../reference/api/pandas.core.groupby.DataFrameGroupBy.describe +generated/pandas.core.groupby.DataFrameGroupBy.diff,../reference/api/pandas.core.groupby.DataFrameGroupBy.diff +generated/pandas.core.groupby.DataFrameGroupBy.ffill,../reference/api/pandas.core.groupby.DataFrameGroupBy.ffill +generated/pandas.core.groupby.DataFrameGroupBy.fillna,../reference/api/pandas.core.groupby.DataFrameGroupBy.fillna +generated/pandas.core.groupby.DataFrameGroupBy.filter,../reference/api/pandas.core.groupby.DataFrameGroupBy.filter +generated/pandas.core.groupby.DataFrameGroupBy.hist,../reference/api/pandas.core.groupby.DataFrameGroupBy.hist +generated/pandas.core.groupby.DataFrameGroupBy.idxmax,../reference/api/pandas.core.groupby.DataFrameGroupBy.idxmax +generated/pandas.core.groupby.DataFrameGroupBy.idxmin,../reference/api/pandas.core.groupby.DataFrameGroupBy.idxmin +generated/pandas.core.groupby.DataFrameGroupBy.mad,../reference/api/pandas.core.groupby.DataFrameGroupBy.mad +generated/pandas.core.groupby.DataFrameGroupBy.pct_change,../reference/api/pandas.core.groupby.DataFrameGroupBy.pct_change +generated/pandas.core.groupby.DataFrameGroupBy.plot,../reference/api/pandas.core.groupby.DataFrameGroupBy.plot +generated/pandas.core.groupby.DataFrameGroupBy.quantile,../reference/api/pandas.core.groupby.DataFrameGroupBy.quantile +generated/pandas.core.groupby.DataFrameGroupBy.rank,../reference/api/pandas.core.groupby.DataFrameGroupBy.rank +generated/pandas.core.groupby.DataFrameGroupBy.resample,../reference/api/pandas.core.groupby.DataFrameGroupBy.resample +generated/pandas.core.groupby.DataFrameGroupBy.shift,../reference/api/pandas.core.groupby.DataFrameGroupBy.shift +generated/pandas.core.groupby.DataFrameGroupBy.size,../reference/api/pandas.core.groupby.DataFrameGroupBy.size +generated/pandas.core.groupby.DataFrameGroupBy.skew,../reference/api/pandas.core.groupby.DataFrameGroupBy.skew +generated/pandas.core.groupby.DataFrameGroupBy.take,../reference/api/pandas.core.groupby.DataFrameGroupBy.take +generated/pandas.core.groupby.DataFrameGroupBy.tshift,../reference/api/pandas.core.groupby.DataFrameGroupBy.tshift +generated/pandas.core.groupby.GroupBy.agg,../reference/api/pandas.core.groupby.GroupBy.agg +generated/pandas.core.groupby.GroupBy.aggregate,../reference/api/pandas.core.groupby.GroupBy.aggregate +generated/pandas.core.groupby.GroupBy.all,../reference/api/pandas.core.groupby.GroupBy.all +generated/pandas.core.groupby.GroupBy.any,../reference/api/pandas.core.groupby.GroupBy.any +generated/pandas.core.groupby.GroupBy.apply,../reference/api/pandas.core.groupby.GroupBy.apply +generated/pandas.core.groupby.GroupBy.bfill,../reference/api/pandas.core.groupby.GroupBy.bfill +generated/pandas.core.groupby.GroupBy.count,../reference/api/pandas.core.groupby.GroupBy.count +generated/pandas.core.groupby.GroupBy.cumcount,../reference/api/pandas.core.groupby.GroupBy.cumcount +generated/pandas.core.groupby.GroupBy.ffill,../reference/api/pandas.core.groupby.GroupBy.ffill +generated/pandas.core.groupby.GroupBy.first,../reference/api/pandas.core.groupby.GroupBy.first +generated/pandas.core.groupby.GroupBy.get_group,../reference/api/pandas.core.groupby.GroupBy.get_group +generated/pandas.core.groupby.GroupBy.groups,../reference/api/pandas.core.groupby.GroupBy.groups +generated/pandas.core.groupby.GroupBy.head,../reference/api/pandas.core.groupby.GroupBy.head +generated/pandas.core.groupby.GroupBy.indices,../reference/api/pandas.core.groupby.GroupBy.indices +generated/pandas.core.groupby.GroupBy.__iter__,../reference/api/pandas.core.groupby.GroupBy.__iter__ +generated/pandas.core.groupby.GroupBy.last,../reference/api/pandas.core.groupby.GroupBy.last +generated/pandas.core.groupby.GroupBy.max,../reference/api/pandas.core.groupby.GroupBy.max +generated/pandas.core.groupby.GroupBy.mean,../reference/api/pandas.core.groupby.GroupBy.mean +generated/pandas.core.groupby.GroupBy.median,../reference/api/pandas.core.groupby.GroupBy.median +generated/pandas.core.groupby.GroupBy.min,../reference/api/pandas.core.groupby.GroupBy.min +generated/pandas.core.groupby.GroupBy.ngroup,../reference/api/pandas.core.groupby.GroupBy.ngroup +generated/pandas.core.groupby.GroupBy.nth,../reference/api/pandas.core.groupby.GroupBy.nth +generated/pandas.core.groupby.GroupBy.ohlc,../reference/api/pandas.core.groupby.GroupBy.ohlc +generated/pandas.core.groupby.GroupBy.pct_change,../reference/api/pandas.core.groupby.GroupBy.pct_change +generated/pandas.core.groupby.GroupBy.pipe,../reference/api/pandas.core.groupby.GroupBy.pipe +generated/pandas.core.groupby.GroupBy.prod,../reference/api/pandas.core.groupby.GroupBy.prod +generated/pandas.core.groupby.GroupBy.rank,../reference/api/pandas.core.groupby.GroupBy.rank +generated/pandas.core.groupby.GroupBy.sem,../reference/api/pandas.core.groupby.GroupBy.sem +generated/pandas.core.groupby.GroupBy.size,../reference/api/pandas.core.groupby.GroupBy.size +generated/pandas.core.groupby.GroupBy.std,../reference/api/pandas.core.groupby.GroupBy.std +generated/pandas.core.groupby.GroupBy.sum,../reference/api/pandas.core.groupby.GroupBy.sum +generated/pandas.core.groupby.GroupBy.tail,../reference/api/pandas.core.groupby.GroupBy.tail +generated/pandas.core.groupby.GroupBy.transform,../reference/api/pandas.core.groupby.GroupBy.transform +generated/pandas.core.groupby.GroupBy.var,../reference/api/pandas.core.groupby.GroupBy.var +generated/pandas.core.groupby.SeriesGroupBy.is_monotonic_decreasing,../reference/api/pandas.core.groupby.SeriesGroupBy.is_monotonic_decreasing +generated/pandas.core.groupby.SeriesGroupBy.is_monotonic_increasing,../reference/api/pandas.core.groupby.SeriesGroupBy.is_monotonic_increasing +generated/pandas.core.groupby.SeriesGroupBy.nlargest,../reference/api/pandas.core.groupby.SeriesGroupBy.nlargest +generated/pandas.core.groupby.SeriesGroupBy.nsmallest,../reference/api/pandas.core.groupby.SeriesGroupBy.nsmallest +generated/pandas.core.groupby.SeriesGroupBy.nunique,../reference/api/pandas.core.groupby.SeriesGroupBy.nunique +generated/pandas.core.groupby.SeriesGroupBy.unique,../reference/api/pandas.core.groupby.SeriesGroupBy.unique +generated/pandas.core.groupby.SeriesGroupBy.value_counts,../reference/api/pandas.core.groupby.SeriesGroupBy.value_counts +generated/pandas.core.resample.Resampler.aggregate,../reference/api/pandas.core.resample.Resampler.aggregate +generated/pandas.core.resample.Resampler.apply,../reference/api/pandas.core.resample.Resampler.apply +generated/pandas.core.resample.Resampler.asfreq,../reference/api/pandas.core.resample.Resampler.asfreq +generated/pandas.core.resample.Resampler.backfill,../reference/api/pandas.core.resample.Resampler.backfill +generated/pandas.core.resample.Resampler.bfill,../reference/api/pandas.core.resample.Resampler.bfill +generated/pandas.core.resample.Resampler.count,../reference/api/pandas.core.resample.Resampler.count +generated/pandas.core.resample.Resampler.ffill,../reference/api/pandas.core.resample.Resampler.ffill +generated/pandas.core.resample.Resampler.fillna,../reference/api/pandas.core.resample.Resampler.fillna +generated/pandas.core.resample.Resampler.first,../reference/api/pandas.core.resample.Resampler.first +generated/pandas.core.resample.Resampler.get_group,../reference/api/pandas.core.resample.Resampler.get_group +generated/pandas.core.resample.Resampler.groups,../reference/api/pandas.core.resample.Resampler.groups +generated/pandas.core.resample.Resampler.indices,../reference/api/pandas.core.resample.Resampler.indices +generated/pandas.core.resample.Resampler.interpolate,../reference/api/pandas.core.resample.Resampler.interpolate +generated/pandas.core.resample.Resampler.__iter__,../reference/api/pandas.core.resample.Resampler.__iter__ +generated/pandas.core.resample.Resampler.last,../reference/api/pandas.core.resample.Resampler.last +generated/pandas.core.resample.Resampler.max,../reference/api/pandas.core.resample.Resampler.max +generated/pandas.core.resample.Resampler.mean,../reference/api/pandas.core.resample.Resampler.mean +generated/pandas.core.resample.Resampler.median,../reference/api/pandas.core.resample.Resampler.median +generated/pandas.core.resample.Resampler.min,../reference/api/pandas.core.resample.Resampler.min +generated/pandas.core.resample.Resampler.nearest,../reference/api/pandas.core.resample.Resampler.nearest +generated/pandas.core.resample.Resampler.nunique,../reference/api/pandas.core.resample.Resampler.nunique +generated/pandas.core.resample.Resampler.ohlc,../reference/api/pandas.core.resample.Resampler.ohlc +generated/pandas.core.resample.Resampler.pad,../reference/api/pandas.core.resample.Resampler.pad +generated/pandas.core.resample.Resampler.pipe,../reference/api/pandas.core.resample.Resampler.pipe +generated/pandas.core.resample.Resampler.prod,../reference/api/pandas.core.resample.Resampler.prod +generated/pandas.core.resample.Resampler.quantile,../reference/api/pandas.core.resample.Resampler.quantile +generated/pandas.core.resample.Resampler.sem,../reference/api/pandas.core.resample.Resampler.sem +generated/pandas.core.resample.Resampler.size,../reference/api/pandas.core.resample.Resampler.size +generated/pandas.core.resample.Resampler.std,../reference/api/pandas.core.resample.Resampler.std +generated/pandas.core.resample.Resampler.sum,../reference/api/pandas.core.resample.Resampler.sum +generated/pandas.core.resample.Resampler.transform,../reference/api/pandas.core.resample.Resampler.transform +generated/pandas.core.resample.Resampler.var,../reference/api/pandas.core.resample.Resampler.var +generated/pandas.core.window.EWM.corr,../reference/api/pandas.core.window.EWM.corr +generated/pandas.core.window.EWM.cov,../reference/api/pandas.core.window.EWM.cov +generated/pandas.core.window.EWM.mean,../reference/api/pandas.core.window.EWM.mean +generated/pandas.core.window.EWM.std,../reference/api/pandas.core.window.EWM.std +generated/pandas.core.window.EWM.var,../reference/api/pandas.core.window.EWM.var +generated/pandas.core.window.Expanding.aggregate,../reference/api/pandas.core.window.Expanding.aggregate +generated/pandas.core.window.Expanding.apply,../reference/api/pandas.core.window.Expanding.apply +generated/pandas.core.window.Expanding.corr,../reference/api/pandas.core.window.Expanding.corr +generated/pandas.core.window.Expanding.count,../reference/api/pandas.core.window.Expanding.count +generated/pandas.core.window.Expanding.cov,../reference/api/pandas.core.window.Expanding.cov +generated/pandas.core.window.Expanding.kurt,../reference/api/pandas.core.window.Expanding.kurt +generated/pandas.core.window.Expanding.max,../reference/api/pandas.core.window.Expanding.max +generated/pandas.core.window.Expanding.mean,../reference/api/pandas.core.window.Expanding.mean +generated/pandas.core.window.Expanding.median,../reference/api/pandas.core.window.Expanding.median +generated/pandas.core.window.Expanding.min,../reference/api/pandas.core.window.Expanding.min +generated/pandas.core.window.Expanding.quantile,../reference/api/pandas.core.window.Expanding.quantile +generated/pandas.core.window.Expanding.skew,../reference/api/pandas.core.window.Expanding.skew +generated/pandas.core.window.Expanding.std,../reference/api/pandas.core.window.Expanding.std +generated/pandas.core.window.Expanding.sum,../reference/api/pandas.core.window.Expanding.sum +generated/pandas.core.window.Expanding.var,../reference/api/pandas.core.window.Expanding.var +generated/pandas.core.window.Rolling.aggregate,../reference/api/pandas.core.window.Rolling.aggregate +generated/pandas.core.window.Rolling.apply,../reference/api/pandas.core.window.Rolling.apply +generated/pandas.core.window.Rolling.corr,../reference/api/pandas.core.window.Rolling.corr +generated/pandas.core.window.Rolling.count,../reference/api/pandas.core.window.Rolling.count +generated/pandas.core.window.Rolling.cov,../reference/api/pandas.core.window.Rolling.cov +generated/pandas.core.window.Rolling.kurt,../reference/api/pandas.core.window.Rolling.kurt +generated/pandas.core.window.Rolling.max,../reference/api/pandas.core.window.Rolling.max +generated/pandas.core.window.Rolling.mean,../reference/api/pandas.core.window.Rolling.mean +generated/pandas.core.window.Rolling.median,../reference/api/pandas.core.window.Rolling.median +generated/pandas.core.window.Rolling.min,../reference/api/pandas.core.window.Rolling.min +generated/pandas.core.window.Rolling.quantile,../reference/api/pandas.core.window.Rolling.quantile +generated/pandas.core.window.Rolling.skew,../reference/api/pandas.core.window.Rolling.skew +generated/pandas.core.window.Rolling.std,../reference/api/pandas.core.window.Rolling.std +generated/pandas.core.window.Rolling.sum,../reference/api/pandas.core.window.Rolling.sum +generated/pandas.core.window.Rolling.var,../reference/api/pandas.core.window.Rolling.var +generated/pandas.core.window.Window.mean,../reference/api/pandas.core.window.Window.mean +generated/pandas.core.window.Window.sum,../reference/api/pandas.core.window.Window.sum +generated/pandas.crosstab,../reference/api/pandas.crosstab +generated/pandas.cut,../reference/api/pandas.cut +generated/pandas.DataFrame.abs,../reference/api/pandas.DataFrame.abs +generated/pandas.DataFrame.add,../reference/api/pandas.DataFrame.add +generated/pandas.DataFrame.add_prefix,../reference/api/pandas.DataFrame.add_prefix +generated/pandas.DataFrame.add_suffix,../reference/api/pandas.DataFrame.add_suffix +generated/pandas.DataFrame.agg,../reference/api/pandas.DataFrame.agg +generated/pandas.DataFrame.aggregate,../reference/api/pandas.DataFrame.aggregate +generated/pandas.DataFrame.align,../reference/api/pandas.DataFrame.align +generated/pandas.DataFrame.all,../reference/api/pandas.DataFrame.all +generated/pandas.DataFrame.any,../reference/api/pandas.DataFrame.any +generated/pandas.DataFrame.append,../reference/api/pandas.DataFrame.append +generated/pandas.DataFrame.apply,../reference/api/pandas.DataFrame.apply +generated/pandas.DataFrame.applymap,../reference/api/pandas.DataFrame.applymap +generated/pandas.DataFrame.as_blocks,../reference/api/pandas.DataFrame.as_blocks +generated/pandas.DataFrame.asfreq,../reference/api/pandas.DataFrame.asfreq +generated/pandas.DataFrame.as_matrix,../reference/api/pandas.DataFrame.as_matrix +generated/pandas.DataFrame.asof,../reference/api/pandas.DataFrame.asof +generated/pandas.DataFrame.assign,../reference/api/pandas.DataFrame.assign +generated/pandas.DataFrame.astype,../reference/api/pandas.DataFrame.astype +generated/pandas.DataFrame.at,../reference/api/pandas.DataFrame.at +generated/pandas.DataFrame.at_time,../reference/api/pandas.DataFrame.at_time +generated/pandas.DataFrame.axes,../reference/api/pandas.DataFrame.axes +generated/pandas.DataFrame.between_time,../reference/api/pandas.DataFrame.between_time +generated/pandas.DataFrame.bfill,../reference/api/pandas.DataFrame.bfill +generated/pandas.DataFrame.blocks,../reference/api/pandas.DataFrame.blocks +generated/pandas.DataFrame.bool,../reference/api/pandas.DataFrame.bool +generated/pandas.DataFrame.boxplot,../reference/api/pandas.DataFrame.boxplot +generated/pandas.DataFrame.clip,../reference/api/pandas.DataFrame.clip +generated/pandas.DataFrame.clip_lower,../reference/api/pandas.DataFrame.clip_lower +generated/pandas.DataFrame.clip_upper,../reference/api/pandas.DataFrame.clip_upper +generated/pandas.DataFrame.columns,../reference/api/pandas.DataFrame.columns +generated/pandas.DataFrame.combine_first,../reference/api/pandas.DataFrame.combine_first +generated/pandas.DataFrame.combine,../reference/api/pandas.DataFrame.combine +generated/pandas.DataFrame.compound,../reference/api/pandas.DataFrame.compound +generated/pandas.DataFrame.convert_objects,../reference/api/pandas.DataFrame.convert_objects +generated/pandas.DataFrame.copy,../reference/api/pandas.DataFrame.copy +generated/pandas.DataFrame.corr,../reference/api/pandas.DataFrame.corr +generated/pandas.DataFrame.corrwith,../reference/api/pandas.DataFrame.corrwith +generated/pandas.DataFrame.count,../reference/api/pandas.DataFrame.count +generated/pandas.DataFrame.cov,../reference/api/pandas.DataFrame.cov +generated/pandas.DataFrame.cummax,../reference/api/pandas.DataFrame.cummax +generated/pandas.DataFrame.cummin,../reference/api/pandas.DataFrame.cummin +generated/pandas.DataFrame.cumprod,../reference/api/pandas.DataFrame.cumprod +generated/pandas.DataFrame.cumsum,../reference/api/pandas.DataFrame.cumsum +generated/pandas.DataFrame.describe,../reference/api/pandas.DataFrame.describe +generated/pandas.DataFrame.diff,../reference/api/pandas.DataFrame.diff +generated/pandas.DataFrame.div,../reference/api/pandas.DataFrame.div +generated/pandas.DataFrame.divide,../reference/api/pandas.DataFrame.divide +generated/pandas.DataFrame.dot,../reference/api/pandas.DataFrame.dot +generated/pandas.DataFrame.drop_duplicates,../reference/api/pandas.DataFrame.drop_duplicates +generated/pandas.DataFrame.drop,../reference/api/pandas.DataFrame.drop +generated/pandas.DataFrame.droplevel,../reference/api/pandas.DataFrame.droplevel +generated/pandas.DataFrame.dropna,../reference/api/pandas.DataFrame.dropna +generated/pandas.DataFrame.dtypes,../reference/api/pandas.DataFrame.dtypes +generated/pandas.DataFrame.duplicated,../reference/api/pandas.DataFrame.duplicated +generated/pandas.DataFrame.empty,../reference/api/pandas.DataFrame.empty +generated/pandas.DataFrame.eq,../reference/api/pandas.DataFrame.eq +generated/pandas.DataFrame.equals,../reference/api/pandas.DataFrame.equals +generated/pandas.DataFrame.eval,../reference/api/pandas.DataFrame.eval +generated/pandas.DataFrame.ewm,../reference/api/pandas.DataFrame.ewm +generated/pandas.DataFrame.expanding,../reference/api/pandas.DataFrame.expanding +generated/pandas.DataFrame.ffill,../reference/api/pandas.DataFrame.ffill +generated/pandas.DataFrame.fillna,../reference/api/pandas.DataFrame.fillna +generated/pandas.DataFrame.filter,../reference/api/pandas.DataFrame.filter +generated/pandas.DataFrame.first,../reference/api/pandas.DataFrame.first +generated/pandas.DataFrame.first_valid_index,../reference/api/pandas.DataFrame.first_valid_index +generated/pandas.DataFrame.floordiv,../reference/api/pandas.DataFrame.floordiv +generated/pandas.DataFrame.from_csv,../reference/api/pandas.DataFrame.from_csv +generated/pandas.DataFrame.from_dict,../reference/api/pandas.DataFrame.from_dict +generated/pandas.DataFrame.from_items,../reference/api/pandas.DataFrame.from_items +generated/pandas.DataFrame.from_records,../reference/api/pandas.DataFrame.from_records +generated/pandas.DataFrame.ftypes,../reference/api/pandas.DataFrame.ftypes +generated/pandas.DataFrame.ge,../reference/api/pandas.DataFrame.ge +generated/pandas.DataFrame.get_dtype_counts,../reference/api/pandas.DataFrame.get_dtype_counts +generated/pandas.DataFrame.get_ftype_counts,../reference/api/pandas.DataFrame.get_ftype_counts +generated/pandas.DataFrame.get,../reference/api/pandas.DataFrame.get +generated/pandas.DataFrame.get_value,../reference/api/pandas.DataFrame.get_value +generated/pandas.DataFrame.get_values,../reference/api/pandas.DataFrame.get_values +generated/pandas.DataFrame.groupby,../reference/api/pandas.DataFrame.groupby +generated/pandas.DataFrame.gt,../reference/api/pandas.DataFrame.gt +generated/pandas.DataFrame.head,../reference/api/pandas.DataFrame.head +generated/pandas.DataFrame.hist,../reference/api/pandas.DataFrame.hist +generated/pandas.DataFrame,../reference/api/pandas.DataFrame +generated/pandas.DataFrame.iat,../reference/api/pandas.DataFrame.iat +generated/pandas.DataFrame.idxmax,../reference/api/pandas.DataFrame.idxmax +generated/pandas.DataFrame.idxmin,../reference/api/pandas.DataFrame.idxmin +generated/pandas.DataFrame.iloc,../reference/api/pandas.DataFrame.iloc +generated/pandas.DataFrame.index,../reference/api/pandas.DataFrame.index +generated/pandas.DataFrame.infer_objects,../reference/api/pandas.DataFrame.infer_objects +generated/pandas.DataFrame.info,../reference/api/pandas.DataFrame.info +generated/pandas.DataFrame.insert,../reference/api/pandas.DataFrame.insert +generated/pandas.DataFrame.interpolate,../reference/api/pandas.DataFrame.interpolate +generated/pandas.DataFrame.is_copy,../reference/api/pandas.DataFrame.is_copy +generated/pandas.DataFrame.isin,../reference/api/pandas.DataFrame.isin +generated/pandas.DataFrame.isna,../reference/api/pandas.DataFrame.isna +generated/pandas.DataFrame.isnull,../reference/api/pandas.DataFrame.isnull +generated/pandas.DataFrame.items,../reference/api/pandas.DataFrame.items +generated/pandas.DataFrame.__iter__,../reference/api/pandas.DataFrame.__iter__ +generated/pandas.DataFrame.iteritems,../reference/api/pandas.DataFrame.iteritems +generated/pandas.DataFrame.iterrows,../reference/api/pandas.DataFrame.iterrows +generated/pandas.DataFrame.itertuples,../reference/api/pandas.DataFrame.itertuples +generated/pandas.DataFrame.ix,../reference/api/pandas.DataFrame.ix +generated/pandas.DataFrame.join,../reference/api/pandas.DataFrame.join +generated/pandas.DataFrame.keys,../reference/api/pandas.DataFrame.keys +generated/pandas.DataFrame.kurt,../reference/api/pandas.DataFrame.kurt +generated/pandas.DataFrame.kurtosis,../reference/api/pandas.DataFrame.kurtosis +generated/pandas.DataFrame.last,../reference/api/pandas.DataFrame.last +generated/pandas.DataFrame.last_valid_index,../reference/api/pandas.DataFrame.last_valid_index +generated/pandas.DataFrame.le,../reference/api/pandas.DataFrame.le +generated/pandas.DataFrame.loc,../reference/api/pandas.DataFrame.loc +generated/pandas.DataFrame.lookup,../reference/api/pandas.DataFrame.lookup +generated/pandas.DataFrame.lt,../reference/api/pandas.DataFrame.lt +generated/pandas.DataFrame.mad,../reference/api/pandas.DataFrame.mad +generated/pandas.DataFrame.mask,../reference/api/pandas.DataFrame.mask +generated/pandas.DataFrame.max,../reference/api/pandas.DataFrame.max +generated/pandas.DataFrame.mean,../reference/api/pandas.DataFrame.mean +generated/pandas.DataFrame.median,../reference/api/pandas.DataFrame.median +generated/pandas.DataFrame.melt,../reference/api/pandas.DataFrame.melt +generated/pandas.DataFrame.memory_usage,../reference/api/pandas.DataFrame.memory_usage +generated/pandas.DataFrame.merge,../reference/api/pandas.DataFrame.merge +generated/pandas.DataFrame.min,../reference/api/pandas.DataFrame.min +generated/pandas.DataFrame.mode,../reference/api/pandas.DataFrame.mode +generated/pandas.DataFrame.mod,../reference/api/pandas.DataFrame.mod +generated/pandas.DataFrame.mul,../reference/api/pandas.DataFrame.mul +generated/pandas.DataFrame.multiply,../reference/api/pandas.DataFrame.multiply +generated/pandas.DataFrame.ndim,../reference/api/pandas.DataFrame.ndim +generated/pandas.DataFrame.ne,../reference/api/pandas.DataFrame.ne +generated/pandas.DataFrame.nlargest,../reference/api/pandas.DataFrame.nlargest +generated/pandas.DataFrame.notna,../reference/api/pandas.DataFrame.notna +generated/pandas.DataFrame.notnull,../reference/api/pandas.DataFrame.notnull +generated/pandas.DataFrame.nsmallest,../reference/api/pandas.DataFrame.nsmallest +generated/pandas.DataFrame.nunique,../reference/api/pandas.DataFrame.nunique +generated/pandas.DataFrame.pct_change,../reference/api/pandas.DataFrame.pct_change +generated/pandas.DataFrame.pipe,../reference/api/pandas.DataFrame.pipe +generated/pandas.DataFrame.pivot,../reference/api/pandas.DataFrame.pivot +generated/pandas.DataFrame.pivot_table,../reference/api/pandas.DataFrame.pivot_table +generated/pandas.DataFrame.plot.barh,../reference/api/pandas.DataFrame.plot.barh +generated/pandas.DataFrame.plot.bar,../reference/api/pandas.DataFrame.plot.bar +generated/pandas.DataFrame.plot.box,../reference/api/pandas.DataFrame.plot.box +generated/pandas.DataFrame.plot.density,../reference/api/pandas.DataFrame.plot.density +generated/pandas.DataFrame.plot.hexbin,../reference/api/pandas.DataFrame.plot.hexbin +generated/pandas.DataFrame.plot.hist,../reference/api/pandas.DataFrame.plot.hist +generated/pandas.DataFrame.plot,../reference/api/pandas.DataFrame.plot +generated/pandas.DataFrame.plot.kde,../reference/api/pandas.DataFrame.plot.kde +generated/pandas.DataFrame.plot.line,../reference/api/pandas.DataFrame.plot.line +generated/pandas.DataFrame.plot.pie,../reference/api/pandas.DataFrame.plot.pie +generated/pandas.DataFrame.plot.scatter,../reference/api/pandas.DataFrame.plot.scatter +generated/pandas.DataFrame.pop,../reference/api/pandas.DataFrame.pop +generated/pandas.DataFrame.pow,../reference/api/pandas.DataFrame.pow +generated/pandas.DataFrame.prod,../reference/api/pandas.DataFrame.prod +generated/pandas.DataFrame.product,../reference/api/pandas.DataFrame.product +generated/pandas.DataFrame.quantile,../reference/api/pandas.DataFrame.quantile +generated/pandas.DataFrame.query,../reference/api/pandas.DataFrame.query +generated/pandas.DataFrame.radd,../reference/api/pandas.DataFrame.radd +generated/pandas.DataFrame.rank,../reference/api/pandas.DataFrame.rank +generated/pandas.DataFrame.rdiv,../reference/api/pandas.DataFrame.rdiv +generated/pandas.DataFrame.reindex_axis,../reference/api/pandas.DataFrame.reindex_axis +generated/pandas.DataFrame.reindex,../reference/api/pandas.DataFrame.reindex +generated/pandas.DataFrame.reindex_like,../reference/api/pandas.DataFrame.reindex_like +generated/pandas.DataFrame.rename_axis,../reference/api/pandas.DataFrame.rename_axis +generated/pandas.DataFrame.rename,../reference/api/pandas.DataFrame.rename +generated/pandas.DataFrame.reorder_levels,../reference/api/pandas.DataFrame.reorder_levels +generated/pandas.DataFrame.replace,../reference/api/pandas.DataFrame.replace +generated/pandas.DataFrame.resample,../reference/api/pandas.DataFrame.resample +generated/pandas.DataFrame.reset_index,../reference/api/pandas.DataFrame.reset_index +generated/pandas.DataFrame.rfloordiv,../reference/api/pandas.DataFrame.rfloordiv +generated/pandas.DataFrame.rmod,../reference/api/pandas.DataFrame.rmod +generated/pandas.DataFrame.rmul,../reference/api/pandas.DataFrame.rmul +generated/pandas.DataFrame.rolling,../reference/api/pandas.DataFrame.rolling +generated/pandas.DataFrame.round,../reference/api/pandas.DataFrame.round +generated/pandas.DataFrame.rpow,../reference/api/pandas.DataFrame.rpow +generated/pandas.DataFrame.rsub,../reference/api/pandas.DataFrame.rsub +generated/pandas.DataFrame.rtruediv,../reference/api/pandas.DataFrame.rtruediv +generated/pandas.DataFrame.sample,../reference/api/pandas.DataFrame.sample +generated/pandas.DataFrame.select_dtypes,../reference/api/pandas.DataFrame.select_dtypes +generated/pandas.DataFrame.select,../reference/api/pandas.DataFrame.select +generated/pandas.DataFrame.sem,../reference/api/pandas.DataFrame.sem +generated/pandas.DataFrame.set_axis,../reference/api/pandas.DataFrame.set_axis +generated/pandas.DataFrame.set_index,../reference/api/pandas.DataFrame.set_index +generated/pandas.DataFrame.set_value,../reference/api/pandas.DataFrame.set_value +generated/pandas.DataFrame.shape,../reference/api/pandas.DataFrame.shape +generated/pandas.DataFrame.shift,../reference/api/pandas.DataFrame.shift +generated/pandas.DataFrame.size,../reference/api/pandas.DataFrame.size +generated/pandas.DataFrame.skew,../reference/api/pandas.DataFrame.skew +generated/pandas.DataFrame.slice_shift,../reference/api/pandas.DataFrame.slice_shift +generated/pandas.DataFrame.sort_index,../reference/api/pandas.DataFrame.sort_index +generated/pandas.DataFrame.sort_values,../reference/api/pandas.DataFrame.sort_values +generated/pandas.DataFrame.squeeze,../reference/api/pandas.DataFrame.squeeze +generated/pandas.DataFrame.stack,../reference/api/pandas.DataFrame.stack +generated/pandas.DataFrame.std,../reference/api/pandas.DataFrame.std +generated/pandas.DataFrame.style,../reference/api/pandas.DataFrame.style +generated/pandas.DataFrame.sub,../reference/api/pandas.DataFrame.sub +generated/pandas.DataFrame.subtract,../reference/api/pandas.DataFrame.subtract +generated/pandas.DataFrame.sum,../reference/api/pandas.DataFrame.sum +generated/pandas.DataFrame.swapaxes,../reference/api/pandas.DataFrame.swapaxes +generated/pandas.DataFrame.swaplevel,../reference/api/pandas.DataFrame.swaplevel +generated/pandas.DataFrame.tail,../reference/api/pandas.DataFrame.tail +generated/pandas.DataFrame.take,../reference/api/pandas.DataFrame.take +generated/pandas.DataFrame.T,../reference/api/pandas.DataFrame.T +generated/pandas.DataFrame.timetuple,../reference/api/pandas.DataFrame.timetuple +generated/pandas.DataFrame.to_clipboard,../reference/api/pandas.DataFrame.to_clipboard +generated/pandas.DataFrame.to_csv,../reference/api/pandas.DataFrame.to_csv +generated/pandas.DataFrame.to_dense,../reference/api/pandas.DataFrame.to_dense +generated/pandas.DataFrame.to_dict,../reference/api/pandas.DataFrame.to_dict +generated/pandas.DataFrame.to_excel,../reference/api/pandas.DataFrame.to_excel +generated/pandas.DataFrame.to_feather,../reference/api/pandas.DataFrame.to_feather +generated/pandas.DataFrame.to_gbq,../reference/api/pandas.DataFrame.to_gbq +generated/pandas.DataFrame.to_hdf,../reference/api/pandas.DataFrame.to_hdf +generated/pandas.DataFrame.to,../reference/api/pandas.DataFrame.to +generated/pandas.DataFrame.to_json,../reference/api/pandas.DataFrame.to_json +generated/pandas.DataFrame.to_latex,../reference/api/pandas.DataFrame.to_latex +generated/pandas.DataFrame.to_msgpack,../reference/api/pandas.DataFrame.to_msgpack +generated/pandas.DataFrame.to_numpy,../reference/api/pandas.DataFrame.to_numpy +generated/pandas.DataFrame.to_panel,../reference/api/pandas.DataFrame.to_panel +generated/pandas.DataFrame.to_parquet,../reference/api/pandas.DataFrame.to_parquet +generated/pandas.DataFrame.to_period,../reference/api/pandas.DataFrame.to_period +generated/pandas.DataFrame.to_pickle,../reference/api/pandas.DataFrame.to_pickle +generated/pandas.DataFrame.to_records,../reference/api/pandas.DataFrame.to_records +generated/pandas.DataFrame.to_sparse,../reference/api/pandas.DataFrame.to_sparse +generated/pandas.DataFrame.to_sql,../reference/api/pandas.DataFrame.to_sql +generated/pandas.DataFrame.to_stata,../reference/api/pandas.DataFrame.to_stata +generated/pandas.DataFrame.to_string,../reference/api/pandas.DataFrame.to_string +generated/pandas.DataFrame.to_timestamp,../reference/api/pandas.DataFrame.to_timestamp +generated/pandas.DataFrame.to_xarray,../reference/api/pandas.DataFrame.to_xarray +generated/pandas.DataFrame.transform,../reference/api/pandas.DataFrame.transform +generated/pandas.DataFrame.transpose,../reference/api/pandas.DataFrame.transpose +generated/pandas.DataFrame.truediv,../reference/api/pandas.DataFrame.truediv +generated/pandas.DataFrame.truncate,../reference/api/pandas.DataFrame.truncate +generated/pandas.DataFrame.tshift,../reference/api/pandas.DataFrame.tshift +generated/pandas.DataFrame.tz_convert,../reference/api/pandas.DataFrame.tz_convert +generated/pandas.DataFrame.tz_localize,../reference/api/pandas.DataFrame.tz_localize +generated/pandas.DataFrame.unstack,../reference/api/pandas.DataFrame.unstack +generated/pandas.DataFrame.update,../reference/api/pandas.DataFrame.update +generated/pandas.DataFrame.values,../reference/api/pandas.DataFrame.values +generated/pandas.DataFrame.var,../reference/api/pandas.DataFrame.var +generated/pandas.DataFrame.where,../reference/api/pandas.DataFrame.where +generated/pandas.DataFrame.xs,../reference/api/pandas.DataFrame.xs +generated/pandas.date_range,../reference/api/pandas.date_range +generated/pandas.DatetimeIndex.ceil,../reference/api/pandas.DatetimeIndex.ceil +generated/pandas.DatetimeIndex.date,../reference/api/pandas.DatetimeIndex.date +generated/pandas.DatetimeIndex.day,../reference/api/pandas.DatetimeIndex.day +generated/pandas.DatetimeIndex.day_name,../reference/api/pandas.DatetimeIndex.day_name +generated/pandas.DatetimeIndex.dayofweek,../reference/api/pandas.DatetimeIndex.dayofweek +generated/pandas.DatetimeIndex.dayofyear,../reference/api/pandas.DatetimeIndex.dayofyear +generated/pandas.DatetimeIndex.floor,../reference/api/pandas.DatetimeIndex.floor +generated/pandas.DatetimeIndex.freq,../reference/api/pandas.DatetimeIndex.freq +generated/pandas.DatetimeIndex.freqstr,../reference/api/pandas.DatetimeIndex.freqstr +generated/pandas.DatetimeIndex.hour,../reference/api/pandas.DatetimeIndex.hour +generated/pandas.DatetimeIndex,../reference/api/pandas.DatetimeIndex +generated/pandas.DatetimeIndex.indexer_at_time,../reference/api/pandas.DatetimeIndex.indexer_at_time +generated/pandas.DatetimeIndex.indexer_between_time,../reference/api/pandas.DatetimeIndex.indexer_between_time +generated/pandas.DatetimeIndex.inferred_freq,../reference/api/pandas.DatetimeIndex.inferred_freq +generated/pandas.DatetimeIndex.is_leap_year,../reference/api/pandas.DatetimeIndex.is_leap_year +generated/pandas.DatetimeIndex.is_month_end,../reference/api/pandas.DatetimeIndex.is_month_end +generated/pandas.DatetimeIndex.is_month_start,../reference/api/pandas.DatetimeIndex.is_month_start +generated/pandas.DatetimeIndex.is_quarter_end,../reference/api/pandas.DatetimeIndex.is_quarter_end +generated/pandas.DatetimeIndex.is_quarter_start,../reference/api/pandas.DatetimeIndex.is_quarter_start +generated/pandas.DatetimeIndex.is_year_end,../reference/api/pandas.DatetimeIndex.is_year_end +generated/pandas.DatetimeIndex.is_year_start,../reference/api/pandas.DatetimeIndex.is_year_start +generated/pandas.DatetimeIndex.microsecond,../reference/api/pandas.DatetimeIndex.microsecond +generated/pandas.DatetimeIndex.minute,../reference/api/pandas.DatetimeIndex.minute +generated/pandas.DatetimeIndex.month,../reference/api/pandas.DatetimeIndex.month +generated/pandas.DatetimeIndex.month_name,../reference/api/pandas.DatetimeIndex.month_name +generated/pandas.DatetimeIndex.nanosecond,../reference/api/pandas.DatetimeIndex.nanosecond +generated/pandas.DatetimeIndex.normalize,../reference/api/pandas.DatetimeIndex.normalize +generated/pandas.DatetimeIndex.quarter,../reference/api/pandas.DatetimeIndex.quarter +generated/pandas.DatetimeIndex.round,../reference/api/pandas.DatetimeIndex.round +generated/pandas.DatetimeIndex.second,../reference/api/pandas.DatetimeIndex.second +generated/pandas.DatetimeIndex.snap,../reference/api/pandas.DatetimeIndex.snap +generated/pandas.DatetimeIndex.strftime,../reference/api/pandas.DatetimeIndex.strftime +generated/pandas.DatetimeIndex.time,../reference/api/pandas.DatetimeIndex.time +generated/pandas.DatetimeIndex.timetz,../reference/api/pandas.DatetimeIndex.timetz +generated/pandas.DatetimeIndex.to_frame,../reference/api/pandas.DatetimeIndex.to_frame +generated/pandas.DatetimeIndex.to_perioddelta,../reference/api/pandas.DatetimeIndex.to_perioddelta +generated/pandas.DatetimeIndex.to_period,../reference/api/pandas.DatetimeIndex.to_period +generated/pandas.DatetimeIndex.to_pydatetime,../reference/api/pandas.DatetimeIndex.to_pydatetime +generated/pandas.DatetimeIndex.to_series,../reference/api/pandas.DatetimeIndex.to_series +generated/pandas.DatetimeIndex.tz_convert,../reference/api/pandas.DatetimeIndex.tz_convert +generated/pandas.DatetimeIndex.tz,../reference/api/pandas.DatetimeIndex.tz +generated/pandas.DatetimeIndex.tz_localize,../reference/api/pandas.DatetimeIndex.tz_localize +generated/pandas.DatetimeIndex.weekday,../reference/api/pandas.DatetimeIndex.weekday +generated/pandas.DatetimeIndex.week,../reference/api/pandas.DatetimeIndex.week +generated/pandas.DatetimeIndex.weekofyear,../reference/api/pandas.DatetimeIndex.weekofyear +generated/pandas.DatetimeIndex.year,../reference/api/pandas.DatetimeIndex.year +generated/pandas.DatetimeTZDtype.base,../reference/api/pandas.DatetimeTZDtype.base +generated/pandas.DatetimeTZDtype.construct_array_type,../reference/api/pandas.DatetimeTZDtype.construct_array_type +generated/pandas.DatetimeTZDtype.construct_from_string,../reference/api/pandas.DatetimeTZDtype.construct_from_string +generated/pandas.DatetimeTZDtype,../reference/api/pandas.DatetimeTZDtype +generated/pandas.DatetimeTZDtype.isbuiltin,../reference/api/pandas.DatetimeTZDtype.isbuiltin +generated/pandas.DatetimeTZDtype.is_dtype,../reference/api/pandas.DatetimeTZDtype.is_dtype +generated/pandas.DatetimeTZDtype.isnative,../reference/api/pandas.DatetimeTZDtype.isnative +generated/pandas.DatetimeTZDtype.itemsize,../reference/api/pandas.DatetimeTZDtype.itemsize +generated/pandas.DatetimeTZDtype.kind,../reference/api/pandas.DatetimeTZDtype.kind +generated/pandas.DatetimeTZDtype.name,../reference/api/pandas.DatetimeTZDtype.name +generated/pandas.DatetimeTZDtype.names,../reference/api/pandas.DatetimeTZDtype.names +generated/pandas.DatetimeTZDtype.na_value,../reference/api/pandas.DatetimeTZDtype.na_value +generated/pandas.DatetimeTZDtype.num,../reference/api/pandas.DatetimeTZDtype.num +generated/pandas.DatetimeTZDtype.reset_cache,../reference/api/pandas.DatetimeTZDtype.reset_cache +generated/pandas.DatetimeTZDtype.shape,../reference/api/pandas.DatetimeTZDtype.shape +generated/pandas.DatetimeTZDtype.str,../reference/api/pandas.DatetimeTZDtype.str +generated/pandas.DatetimeTZDtype.subdtype,../reference/api/pandas.DatetimeTZDtype.subdtype +generated/pandas.DatetimeTZDtype.tz,../reference/api/pandas.DatetimeTZDtype.tz +generated/pandas.DatetimeTZDtype.unit,../reference/api/pandas.DatetimeTZDtype.unit +generated/pandas.describe_option,../reference/api/pandas.describe_option +generated/pandas.errors.DtypeWarning,../reference/api/pandas.errors.DtypeWarning +generated/pandas.errors.EmptyDataError,../reference/api/pandas.errors.EmptyDataError +generated/pandas.errors.OutOfBoundsDatetime,../reference/api/pandas.errors.OutOfBoundsDatetime +generated/pandas.errors.ParserError,../reference/api/pandas.errors.ParserError +generated/pandas.errors.ParserWarning,../reference/api/pandas.errors.ParserWarning +generated/pandas.errors.PerformanceWarning,../reference/api/pandas.errors.PerformanceWarning +generated/pandas.errors.UnsortedIndexError,../reference/api/pandas.errors.UnsortedIndexError +generated/pandas.errors.UnsupportedFunctionCall,../reference/api/pandas.errors.UnsupportedFunctionCall +generated/pandas.eval,../reference/api/pandas.eval +generated/pandas.ExcelFile.parse,../reference/api/pandas.ExcelFile.parse +generated/pandas.ExcelWriter,../reference/api/pandas.ExcelWriter +generated/pandas.factorize,../reference/api/pandas.factorize +generated/pandas.Float64Index,../reference/api/pandas.Float64Index +generated/pandas.get_dummies,../reference/api/pandas.get_dummies +generated/pandas.get_option,../reference/api/pandas.get_option +generated/pandas.Grouper,../reference/api/pandas.Grouper +generated/pandas.HDFStore.append,../reference/api/pandas.HDFStore.append +generated/pandas.HDFStore.get,../reference/api/pandas.HDFStore.get +generated/pandas.HDFStore.groups,../reference/api/pandas.HDFStore.groups +generated/pandas.HDFStore.info,../reference/api/pandas.HDFStore.info +generated/pandas.HDFStore.keys,../reference/api/pandas.HDFStore.keys +generated/pandas.HDFStore.put,../reference/api/pandas.HDFStore.put +generated/pandas.HDFStore.select,../reference/api/pandas.HDFStore.select +generated/pandas.HDFStore.walk,../reference/api/pandas.HDFStore.walk +generated/pandas.Index.all,../reference/api/pandas.Index.all +generated/pandas.Index.any,../reference/api/pandas.Index.any +generated/pandas.Index.append,../reference/api/pandas.Index.append +generated/pandas.Index.argmax,../reference/api/pandas.Index.argmax +generated/pandas.Index.argmin,../reference/api/pandas.Index.argmin +generated/pandas.Index.argsort,../reference/api/pandas.Index.argsort +generated/pandas.Index.array,../reference/api/pandas.Index.array +generated/pandas.Index.asi8,../reference/api/pandas.Index.asi8 +generated/pandas.Index.asof,../reference/api/pandas.Index.asof +generated/pandas.Index.asof_locs,../reference/api/pandas.Index.asof_locs +generated/pandas.Index.astype,../reference/api/pandas.Index.astype +generated/pandas.Index.base,../reference/api/pandas.Index.base +generated/pandas.Index.contains,../reference/api/pandas.Index.contains +generated/pandas.Index.copy,../reference/api/pandas.Index.copy +generated/pandas.Index.data,../reference/api/pandas.Index.data +generated/pandas.Index.delete,../reference/api/pandas.Index.delete +generated/pandas.Index.difference,../reference/api/pandas.Index.difference +generated/pandas.Index.drop_duplicates,../reference/api/pandas.Index.drop_duplicates +generated/pandas.Index.drop,../reference/api/pandas.Index.drop +generated/pandas.Index.droplevel,../reference/api/pandas.Index.droplevel +generated/pandas.Index.dropna,../reference/api/pandas.Index.dropna +generated/pandas.Index.dtype,../reference/api/pandas.Index.dtype +generated/pandas.Index.dtype_str,../reference/api/pandas.Index.dtype_str +generated/pandas.Index.duplicated,../reference/api/pandas.Index.duplicated +generated/pandas.Index.empty,../reference/api/pandas.Index.empty +generated/pandas.Index.equals,../reference/api/pandas.Index.equals +generated/pandas.Index.factorize,../reference/api/pandas.Index.factorize +generated/pandas.Index.fillna,../reference/api/pandas.Index.fillna +generated/pandas.Index.flags,../reference/api/pandas.Index.flags +generated/pandas.Index.format,../reference/api/pandas.Index.format +generated/pandas.Index.get_duplicates,../reference/api/pandas.Index.get_duplicates +generated/pandas.Index.get_indexer_for,../reference/api/pandas.Index.get_indexer_for +generated/pandas.Index.get_indexer,../reference/api/pandas.Index.get_indexer +generated/pandas.Index.get_indexer_non_unique,../reference/api/pandas.Index.get_indexer_non_unique +generated/pandas.Index.get_level_values,../reference/api/pandas.Index.get_level_values +generated/pandas.Index.get_loc,../reference/api/pandas.Index.get_loc +generated/pandas.Index.get_slice_bound,../reference/api/pandas.Index.get_slice_bound +generated/pandas.Index.get_value,../reference/api/pandas.Index.get_value +generated/pandas.Index.get_values,../reference/api/pandas.Index.get_values +generated/pandas.Index.groupby,../reference/api/pandas.Index.groupby +generated/pandas.Index.has_duplicates,../reference/api/pandas.Index.has_duplicates +generated/pandas.Index.hasnans,../reference/api/pandas.Index.hasnans +generated/pandas.Index.holds_integer,../reference/api/pandas.Index.holds_integer +generated/pandas.Index,../reference/api/pandas.Index +generated/pandas.Index.identical,../reference/api/pandas.Index.identical +generated/pandas.Index.inferred_type,../reference/api/pandas.Index.inferred_type +generated/pandas.Index.insert,../reference/api/pandas.Index.insert +generated/pandas.Index.intersection,../reference/api/pandas.Index.intersection +generated/pandas.Index.is_all_dates,../reference/api/pandas.Index.is_all_dates +generated/pandas.Index.is_boolean,../reference/api/pandas.Index.is_boolean +generated/pandas.Index.is_categorical,../reference/api/pandas.Index.is_categorical +generated/pandas.Index.is_floating,../reference/api/pandas.Index.is_floating +generated/pandas.Index.is_,../reference/api/pandas.Index.is_ +generated/pandas.Index.isin,../reference/api/pandas.Index.isin +generated/pandas.Index.is_integer,../reference/api/pandas.Index.is_integer +generated/pandas.Index.is_interval,../reference/api/pandas.Index.is_interval +generated/pandas.Index.is_lexsorted_for_tuple,../reference/api/pandas.Index.is_lexsorted_for_tuple +generated/pandas.Index.is_mixed,../reference/api/pandas.Index.is_mixed +generated/pandas.Index.is_monotonic_decreasing,../reference/api/pandas.Index.is_monotonic_decreasing +generated/pandas.Index.is_monotonic,../reference/api/pandas.Index.is_monotonic +generated/pandas.Index.is_monotonic_increasing,../reference/api/pandas.Index.is_monotonic_increasing +generated/pandas.Index.isna,../reference/api/pandas.Index.isna +generated/pandas.Index.isnull,../reference/api/pandas.Index.isnull +generated/pandas.Index.is_numeric,../reference/api/pandas.Index.is_numeric +generated/pandas.Index.is_object,../reference/api/pandas.Index.is_object +generated/pandas.Index.is_type_compatible,../reference/api/pandas.Index.is_type_compatible +generated/pandas.Index.is_unique,../reference/api/pandas.Index.is_unique +generated/pandas.Index.item,../reference/api/pandas.Index.item +generated/pandas.Index.itemsize,../reference/api/pandas.Index.itemsize +generated/pandas.Index.join,../reference/api/pandas.Index.join +generated/pandas.Index.map,../reference/api/pandas.Index.map +generated/pandas.Index.max,../reference/api/pandas.Index.max +generated/pandas.Index.memory_usage,../reference/api/pandas.Index.memory_usage +generated/pandas.Index.min,../reference/api/pandas.Index.min +generated/pandas.Index.name,../reference/api/pandas.Index.name +generated/pandas.Index.names,../reference/api/pandas.Index.names +generated/pandas.Index.nbytes,../reference/api/pandas.Index.nbytes +generated/pandas.Index.ndim,../reference/api/pandas.Index.ndim +generated/pandas.Index.nlevels,../reference/api/pandas.Index.nlevels +generated/pandas.Index.notna,../reference/api/pandas.Index.notna +generated/pandas.Index.notnull,../reference/api/pandas.Index.notnull +generated/pandas.Index.nunique,../reference/api/pandas.Index.nunique +generated/pandas.Index.putmask,../reference/api/pandas.Index.putmask +generated/pandas.Index.ravel,../reference/api/pandas.Index.ravel +generated/pandas.Index.reindex,../reference/api/pandas.Index.reindex +generated/pandas.Index.rename,../reference/api/pandas.Index.rename +generated/pandas.Index.repeat,../reference/api/pandas.Index.repeat +generated/pandas.Index.searchsorted,../reference/api/pandas.Index.searchsorted +generated/pandas.Index.set_names,../reference/api/pandas.Index.set_names +generated/pandas.Index.set_value,../reference/api/pandas.Index.set_value +generated/pandas.Index.shape,../reference/api/pandas.Index.shape +generated/pandas.Index.shift,../reference/api/pandas.Index.shift +generated/pandas.Index.size,../reference/api/pandas.Index.size +generated/pandas.IndexSlice,../reference/api/pandas.IndexSlice +generated/pandas.Index.slice_indexer,../reference/api/pandas.Index.slice_indexer +generated/pandas.Index.slice_locs,../reference/api/pandas.Index.slice_locs +generated/pandas.Index.sort,../reference/api/pandas.Index.sort +generated/pandas.Index.sortlevel,../reference/api/pandas.Index.sortlevel +generated/pandas.Index.sort_values,../reference/api/pandas.Index.sort_values +generated/pandas.Index.str,../reference/api/pandas.Index.str +generated/pandas.Index.strides,../reference/api/pandas.Index.strides +generated/pandas.Index.summary,../reference/api/pandas.Index.summary +generated/pandas.Index.symmetric_difference,../reference/api/pandas.Index.symmetric_difference +generated/pandas.Index.take,../reference/api/pandas.Index.take +generated/pandas.Index.T,../reference/api/pandas.Index.T +generated/pandas.Index.to_flat_index,../reference/api/pandas.Index.to_flat_index +generated/pandas.Index.to_frame,../reference/api/pandas.Index.to_frame +generated/pandas.Index.to_list,../reference/api/pandas.Index.to_list +generated/pandas.Index.tolist,../reference/api/pandas.Index.tolist +generated/pandas.Index.to_native_types,../reference/api/pandas.Index.to_native_types +generated/pandas.Index.to_numpy,../reference/api/pandas.Index.to_numpy +generated/pandas.Index.to_series,../reference/api/pandas.Index.to_series +generated/pandas.Index.transpose,../reference/api/pandas.Index.transpose +generated/pandas.Index.union,../reference/api/pandas.Index.union +generated/pandas.Index.unique,../reference/api/pandas.Index.unique +generated/pandas.Index.value_counts,../reference/api/pandas.Index.value_counts +generated/pandas.Index.values,../reference/api/pandas.Index.values +generated/pandas.Index.view,../reference/api/pandas.Index.view +generated/pandas.Index.where,../reference/api/pandas.Index.where +generated/pandas.infer_freq,../reference/api/pandas.infer_freq +generated/pandas.Interval.closed,../reference/api/pandas.Interval.closed +generated/pandas.Interval.closed_left,../reference/api/pandas.Interval.closed_left +generated/pandas.Interval.closed_right,../reference/api/pandas.Interval.closed_right +generated/pandas.Interval,../reference/api/pandas.Interval +generated/pandas.IntervalIndex.closed,../reference/api/pandas.IntervalIndex.closed +generated/pandas.IntervalIndex.contains,../reference/api/pandas.IntervalIndex.contains +generated/pandas.IntervalIndex.from_arrays,../reference/api/pandas.IntervalIndex.from_arrays +generated/pandas.IntervalIndex.from_breaks,../reference/api/pandas.IntervalIndex.from_breaks +generated/pandas.IntervalIndex.from_tuples,../reference/api/pandas.IntervalIndex.from_tuples +generated/pandas.IntervalIndex.get_indexer,../reference/api/pandas.IntervalIndex.get_indexer +generated/pandas.IntervalIndex.get_loc,../reference/api/pandas.IntervalIndex.get_loc +generated/pandas.IntervalIndex,../reference/api/pandas.IntervalIndex +generated/pandas.IntervalIndex.is_non_overlapping_monotonic,../reference/api/pandas.IntervalIndex.is_non_overlapping_monotonic +generated/pandas.IntervalIndex.is_overlapping,../reference/api/pandas.IntervalIndex.is_overlapping +generated/pandas.IntervalIndex.left,../reference/api/pandas.IntervalIndex.left +generated/pandas.IntervalIndex.length,../reference/api/pandas.IntervalIndex.length +generated/pandas.IntervalIndex.mid,../reference/api/pandas.IntervalIndex.mid +generated/pandas.IntervalIndex.overlaps,../reference/api/pandas.IntervalIndex.overlaps +generated/pandas.IntervalIndex.right,../reference/api/pandas.IntervalIndex.right +generated/pandas.IntervalIndex.set_closed,../reference/api/pandas.IntervalIndex.set_closed +generated/pandas.IntervalIndex.to_tuples,../reference/api/pandas.IntervalIndex.to_tuples +generated/pandas.IntervalIndex.values,../reference/api/pandas.IntervalIndex.values +generated/pandas.Interval.left,../reference/api/pandas.Interval.left +generated/pandas.Interval.length,../reference/api/pandas.Interval.length +generated/pandas.Interval.mid,../reference/api/pandas.Interval.mid +generated/pandas.Interval.open_left,../reference/api/pandas.Interval.open_left +generated/pandas.Interval.open_right,../reference/api/pandas.Interval.open_right +generated/pandas.Interval.overlaps,../reference/api/pandas.Interval.overlaps +generated/pandas.interval_range,../reference/api/pandas.interval_range +generated/pandas.Interval.right,../reference/api/pandas.Interval.right +generated/pandas.io.formats.style.Styler.apply,../reference/api/pandas.io.formats.style.Styler.apply +generated/pandas.io.formats.style.Styler.applymap,../reference/api/pandas.io.formats.style.Styler.applymap +generated/pandas.io.formats.style.Styler.background_gradient,../reference/api/pandas.io.formats.style.Styler.background_gradient +generated/pandas.io.formats.style.Styler.bar,../reference/api/pandas.io.formats.style.Styler.bar +generated/pandas.io.formats.style.Styler.clear,../reference/api/pandas.io.formats.style.Styler.clear +generated/pandas.io.formats.style.Styler.env,../reference/api/pandas.io.formats.style.Styler.env +generated/pandas.io.formats.style.Styler.export,../reference/api/pandas.io.formats.style.Styler.export +generated/pandas.io.formats.style.Styler.format,../reference/api/pandas.io.formats.style.Styler.format +generated/pandas.io.formats.style.Styler.from_custom_template,../reference/api/pandas.io.formats.style.Styler.from_custom_template +generated/pandas.io.formats.style.Styler.hide_columns,../reference/api/pandas.io.formats.style.Styler.hide_columns +generated/pandas.io.formats.style.Styler.hide_index,../reference/api/pandas.io.formats.style.Styler.hide_index +generated/pandas.io.formats.style.Styler.highlight_max,../reference/api/pandas.io.formats.style.Styler.highlight_max +generated/pandas.io.formats.style.Styler.highlight_min,../reference/api/pandas.io.formats.style.Styler.highlight_min +generated/pandas.io.formats.style.Styler.highlight_null,../reference/api/pandas.io.formats.style.Styler.highlight_null +generated/pandas.io.formats.style.Styler,../reference/api/pandas.io.formats.style.Styler +generated/pandas.io.formats.style.Styler.loader,../reference/api/pandas.io.formats.style.Styler.loader +generated/pandas.io.formats.style.Styler.pipe,../reference/api/pandas.io.formats.style.Styler.pipe +generated/pandas.io.formats.style.Styler.render,../reference/api/pandas.io.formats.style.Styler.render +generated/pandas.io.formats.style.Styler.set_caption,../reference/api/pandas.io.formats.style.Styler.set_caption +generated/pandas.io.formats.style.Styler.set_precision,../reference/api/pandas.io.formats.style.Styler.set_precision +generated/pandas.io.formats.style.Styler.set_properties,../reference/api/pandas.io.formats.style.Styler.set_properties +generated/pandas.io.formats.style.Styler.set_table_attributes,../reference/api/pandas.io.formats.style.Styler.set_table_attributes +generated/pandas.io.formats.style.Styler.set_table_styles,../reference/api/pandas.io.formats.style.Styler.set_table_styles +generated/pandas.io.formats.style.Styler.set_uuid,../reference/api/pandas.io.formats.style.Styler.set_uuid +generated/pandas.io.formats.style.Styler.template,../reference/api/pandas.io.formats.style.Styler.template +generated/pandas.io.formats.style.Styler.to_excel,../reference/api/pandas.io.formats.style.Styler.to_excel +generated/pandas.io.formats.style.Styler.use,../reference/api/pandas.io.formats.style.Styler.use +generated/pandas.io.formats.style.Styler.where,../reference/api/pandas.io.formats.style.Styler.where +generated/pandas.io.json.build_table_schema,../reference/api/pandas.io.json.build_table_schema +generated/pandas.io.json.json_normalize,../reference/api/pandas.io.json.json_normalize +generated/pandas.io.stata.StataReader.data,../reference/api/pandas.io.stata.StataReader.data +generated/pandas.io.stata.StataReader.data_label,../reference/api/pandas.io.stata.StataReader.data_label +generated/pandas.io.stata.StataReader.value_labels,../reference/api/pandas.io.stata.StataReader.value_labels +generated/pandas.io.stata.StataReader.variable_labels,../reference/api/pandas.io.stata.StataReader.variable_labels +generated/pandas.io.stata.StataWriter.write_file,../reference/api/pandas.io.stata.StataWriter.write_file +generated/pandas.isna,../reference/api/pandas.isna +generated/pandas.isnull,../reference/api/pandas.isnull +generated/pandas.melt,../reference/api/pandas.melt +generated/pandas.merge_asof,../reference/api/pandas.merge_asof +generated/pandas.merge,../reference/api/pandas.merge +generated/pandas.merge_ordered,../reference/api/pandas.merge_ordered +generated/pandas.MultiIndex.codes,../reference/api/pandas.MultiIndex.codes +generated/pandas.MultiIndex.droplevel,../reference/api/pandas.MultiIndex.droplevel +generated/pandas.MultiIndex.from_arrays,../reference/api/pandas.MultiIndex.from_arrays +generated/pandas.MultiIndex.from_frame,../reference/api/pandas.MultiIndex.from_frame +generated/pandas.MultiIndex.from_product,../reference/api/pandas.MultiIndex.from_product +generated/pandas.MultiIndex.from_tuples,../reference/api/pandas.MultiIndex.from_tuples +generated/pandas.MultiIndex.get_indexer,../reference/api/pandas.MultiIndex.get_indexer +generated/pandas.MultiIndex.get_level_values,../reference/api/pandas.MultiIndex.get_level_values +generated/pandas.MultiIndex.get_loc,../reference/api/pandas.MultiIndex.get_loc +generated/pandas.MultiIndex.get_loc_level,../reference/api/pandas.MultiIndex.get_loc_level +generated/pandas.MultiIndex,../reference/api/pandas.MultiIndex +generated/pandas.MultiIndex.is_lexsorted,../reference/api/pandas.MultiIndex.is_lexsorted +generated/pandas.MultiIndex.levels,../reference/api/pandas.MultiIndex.levels +generated/pandas.MultiIndex.levshape,../reference/api/pandas.MultiIndex.levshape +generated/pandas.MultiIndex.names,../reference/api/pandas.MultiIndex.names +generated/pandas.MultiIndex.nlevels,../reference/api/pandas.MultiIndex.nlevels +generated/pandas.MultiIndex.remove_unused_levels,../reference/api/pandas.MultiIndex.remove_unused_levels +generated/pandas.MultiIndex.reorder_levels,../reference/api/pandas.MultiIndex.reorder_levels +generated/pandas.MultiIndex.set_codes,../reference/api/pandas.MultiIndex.set_codes +generated/pandas.MultiIndex.set_levels,../reference/api/pandas.MultiIndex.set_levels +generated/pandas.MultiIndex.sortlevel,../reference/api/pandas.MultiIndex.sortlevel +generated/pandas.MultiIndex.swaplevel,../reference/api/pandas.MultiIndex.swaplevel +generated/pandas.MultiIndex.to_flat_index,../reference/api/pandas.MultiIndex.to_flat_index +generated/pandas.MultiIndex.to_frame,../reference/api/pandas.MultiIndex.to_frame +generated/pandas.MultiIndex.to_hierarchical,../reference/api/pandas.MultiIndex.to_hierarchical +generated/pandas.notna,../reference/api/pandas.notna +generated/pandas.notnull,../reference/api/pandas.notnull +generated/pandas.option_context,../reference/api/pandas.option_context +generated/pandas.Panel.abs,../reference/api/pandas.Panel.abs +generated/pandas.Panel.add,../reference/api/pandas.Panel.add +generated/pandas.Panel.add_prefix,../reference/api/pandas.Panel.add_prefix +generated/pandas.Panel.add_suffix,../reference/api/pandas.Panel.add_suffix +generated/pandas.Panel.agg,../reference/api/pandas.Panel.agg +generated/pandas.Panel.aggregate,../reference/api/pandas.Panel.aggregate +generated/pandas.Panel.align,../reference/api/pandas.Panel.align +generated/pandas.Panel.all,../reference/api/pandas.Panel.all +generated/pandas.Panel.any,../reference/api/pandas.Panel.any +generated/pandas.Panel.apply,../reference/api/pandas.Panel.apply +generated/pandas.Panel.as_blocks,../reference/api/pandas.Panel.as_blocks +generated/pandas.Panel.asfreq,../reference/api/pandas.Panel.asfreq +generated/pandas.Panel.as_matrix,../reference/api/pandas.Panel.as_matrix +generated/pandas.Panel.asof,../reference/api/pandas.Panel.asof +generated/pandas.Panel.astype,../reference/api/pandas.Panel.astype +generated/pandas.Panel.at,../reference/api/pandas.Panel.at +generated/pandas.Panel.at_time,../reference/api/pandas.Panel.at_time +generated/pandas.Panel.axes,../reference/api/pandas.Panel.axes +generated/pandas.Panel.between_time,../reference/api/pandas.Panel.between_time +generated/pandas.Panel.bfill,../reference/api/pandas.Panel.bfill +generated/pandas.Panel.blocks,../reference/api/pandas.Panel.blocks +generated/pandas.Panel.bool,../reference/api/pandas.Panel.bool +generated/pandas.Panel.clip,../reference/api/pandas.Panel.clip +generated/pandas.Panel.clip_lower,../reference/api/pandas.Panel.clip_lower +generated/pandas.Panel.clip_upper,../reference/api/pandas.Panel.clip_upper +generated/pandas.Panel.compound,../reference/api/pandas.Panel.compound +generated/pandas.Panel.conform,../reference/api/pandas.Panel.conform +generated/pandas.Panel.convert_objects,../reference/api/pandas.Panel.convert_objects +generated/pandas.Panel.copy,../reference/api/pandas.Panel.copy +generated/pandas.Panel.count,../reference/api/pandas.Panel.count +generated/pandas.Panel.cummax,../reference/api/pandas.Panel.cummax +generated/pandas.Panel.cummin,../reference/api/pandas.Panel.cummin +generated/pandas.Panel.cumprod,../reference/api/pandas.Panel.cumprod +generated/pandas.Panel.cumsum,../reference/api/pandas.Panel.cumsum +generated/pandas.Panel.describe,../reference/api/pandas.Panel.describe +generated/pandas.Panel.div,../reference/api/pandas.Panel.div +generated/pandas.Panel.divide,../reference/api/pandas.Panel.divide +generated/pandas.Panel.drop,../reference/api/pandas.Panel.drop +generated/pandas.Panel.droplevel,../reference/api/pandas.Panel.droplevel +generated/pandas.Panel.dropna,../reference/api/pandas.Panel.dropna +generated/pandas.Panel.dtypes,../reference/api/pandas.Panel.dtypes +generated/pandas.Panel.empty,../reference/api/pandas.Panel.empty +generated/pandas.Panel.eq,../reference/api/pandas.Panel.eq +generated/pandas.Panel.equals,../reference/api/pandas.Panel.equals +generated/pandas.Panel.ffill,../reference/api/pandas.Panel.ffill +generated/pandas.Panel.fillna,../reference/api/pandas.Panel.fillna +generated/pandas.Panel.filter,../reference/api/pandas.Panel.filter +generated/pandas.Panel.first,../reference/api/pandas.Panel.first +generated/pandas.Panel.first_valid_index,../reference/api/pandas.Panel.first_valid_index +generated/pandas.Panel.floordiv,../reference/api/pandas.Panel.floordiv +generated/pandas.Panel.from_dict,../reference/api/pandas.Panel.from_dict +generated/pandas.Panel.fromDict,../reference/api/pandas.Panel.fromDict +generated/pandas.Panel.ftypes,../reference/api/pandas.Panel.ftypes +generated/pandas.Panel.ge,../reference/api/pandas.Panel.ge +generated/pandas.Panel.get_dtype_counts,../reference/api/pandas.Panel.get_dtype_counts +generated/pandas.Panel.get_ftype_counts,../reference/api/pandas.Panel.get_ftype_counts +generated/pandas.Panel.get,../reference/api/pandas.Panel.get +generated/pandas.Panel.get_value,../reference/api/pandas.Panel.get_value +generated/pandas.Panel.get_values,../reference/api/pandas.Panel.get_values +generated/pandas.Panel.groupby,../reference/api/pandas.Panel.groupby +generated/pandas.Panel.gt,../reference/api/pandas.Panel.gt +generated/pandas.Panel.head,../reference/api/pandas.Panel.head +generated/pandas.Panel,../reference/api/pandas.Panel +generated/pandas.Panel.iat,../reference/api/pandas.Panel.iat +generated/pandas.Panel.iloc,../reference/api/pandas.Panel.iloc +generated/pandas.Panel.infer_objects,../reference/api/pandas.Panel.infer_objects +generated/pandas.Panel.interpolate,../reference/api/pandas.Panel.interpolate +generated/pandas.Panel.is_copy,../reference/api/pandas.Panel.is_copy +generated/pandas.Panel.isna,../reference/api/pandas.Panel.isna +generated/pandas.Panel.isnull,../reference/api/pandas.Panel.isnull +generated/pandas.Panel.items,../reference/api/pandas.Panel.items +generated/pandas.Panel.__iter__,../reference/api/pandas.Panel.__iter__ +generated/pandas.Panel.iteritems,../reference/api/pandas.Panel.iteritems +generated/pandas.Panel.ix,../reference/api/pandas.Panel.ix +generated/pandas.Panel.join,../reference/api/pandas.Panel.join +generated/pandas.Panel.keys,../reference/api/pandas.Panel.keys +generated/pandas.Panel.kurt,../reference/api/pandas.Panel.kurt +generated/pandas.Panel.kurtosis,../reference/api/pandas.Panel.kurtosis +generated/pandas.Panel.last,../reference/api/pandas.Panel.last +generated/pandas.Panel.last_valid_index,../reference/api/pandas.Panel.last_valid_index +generated/pandas.Panel.le,../reference/api/pandas.Panel.le +generated/pandas.Panel.loc,../reference/api/pandas.Panel.loc +generated/pandas.Panel.lt,../reference/api/pandas.Panel.lt +generated/pandas.Panel.mad,../reference/api/pandas.Panel.mad +generated/pandas.Panel.major_axis,../reference/api/pandas.Panel.major_axis +generated/pandas.Panel.major_xs,../reference/api/pandas.Panel.major_xs +generated/pandas.Panel.mask,../reference/api/pandas.Panel.mask +generated/pandas.Panel.max,../reference/api/pandas.Panel.max +generated/pandas.Panel.mean,../reference/api/pandas.Panel.mean +generated/pandas.Panel.median,../reference/api/pandas.Panel.median +generated/pandas.Panel.min,../reference/api/pandas.Panel.min +generated/pandas.Panel.minor_axis,../reference/api/pandas.Panel.minor_axis +generated/pandas.Panel.minor_xs,../reference/api/pandas.Panel.minor_xs +generated/pandas.Panel.mod,../reference/api/pandas.Panel.mod +generated/pandas.Panel.mul,../reference/api/pandas.Panel.mul +generated/pandas.Panel.multiply,../reference/api/pandas.Panel.multiply +generated/pandas.Panel.ndim,../reference/api/pandas.Panel.ndim +generated/pandas.Panel.ne,../reference/api/pandas.Panel.ne +generated/pandas.Panel.notna,../reference/api/pandas.Panel.notna +generated/pandas.Panel.notnull,../reference/api/pandas.Panel.notnull +generated/pandas.Panel.pct_change,../reference/api/pandas.Panel.pct_change +generated/pandas.Panel.pipe,../reference/api/pandas.Panel.pipe +generated/pandas.Panel.pop,../reference/api/pandas.Panel.pop +generated/pandas.Panel.pow,../reference/api/pandas.Panel.pow +generated/pandas.Panel.prod,../reference/api/pandas.Panel.prod +generated/pandas.Panel.product,../reference/api/pandas.Panel.product +generated/pandas.Panel.radd,../reference/api/pandas.Panel.radd +generated/pandas.Panel.rank,../reference/api/pandas.Panel.rank +generated/pandas.Panel.rdiv,../reference/api/pandas.Panel.rdiv +generated/pandas.Panel.reindex_axis,../reference/api/pandas.Panel.reindex_axis +generated/pandas.Panel.reindex,../reference/api/pandas.Panel.reindex +generated/pandas.Panel.reindex_like,../reference/api/pandas.Panel.reindex_like +generated/pandas.Panel.rename_axis,../reference/api/pandas.Panel.rename_axis +generated/pandas.Panel.rename,../reference/api/pandas.Panel.rename +generated/pandas.Panel.replace,../reference/api/pandas.Panel.replace +generated/pandas.Panel.resample,../reference/api/pandas.Panel.resample +generated/pandas.Panel.rfloordiv,../reference/api/pandas.Panel.rfloordiv +generated/pandas.Panel.rmod,../reference/api/pandas.Panel.rmod +generated/pandas.Panel.rmul,../reference/api/pandas.Panel.rmul +generated/pandas.Panel.round,../reference/api/pandas.Panel.round +generated/pandas.Panel.rpow,../reference/api/pandas.Panel.rpow +generated/pandas.Panel.rsub,../reference/api/pandas.Panel.rsub +generated/pandas.Panel.rtruediv,../reference/api/pandas.Panel.rtruediv +generated/pandas.Panel.sample,../reference/api/pandas.Panel.sample +generated/pandas.Panel.select,../reference/api/pandas.Panel.select +generated/pandas.Panel.sem,../reference/api/pandas.Panel.sem +generated/pandas.Panel.set_axis,../reference/api/pandas.Panel.set_axis +generated/pandas.Panel.set_value,../reference/api/pandas.Panel.set_value +generated/pandas.Panel.shape,../reference/api/pandas.Panel.shape +generated/pandas.Panel.shift,../reference/api/pandas.Panel.shift +generated/pandas.Panel.size,../reference/api/pandas.Panel.size +generated/pandas.Panel.skew,../reference/api/pandas.Panel.skew +generated/pandas.Panel.slice_shift,../reference/api/pandas.Panel.slice_shift +generated/pandas.Panel.sort_index,../reference/api/pandas.Panel.sort_index +generated/pandas.Panel.sort_values,../reference/api/pandas.Panel.sort_values +generated/pandas.Panel.squeeze,../reference/api/pandas.Panel.squeeze +generated/pandas.Panel.std,../reference/api/pandas.Panel.std +generated/pandas.Panel.sub,../reference/api/pandas.Panel.sub +generated/pandas.Panel.subtract,../reference/api/pandas.Panel.subtract +generated/pandas.Panel.sum,../reference/api/pandas.Panel.sum +generated/pandas.Panel.swapaxes,../reference/api/pandas.Panel.swapaxes +generated/pandas.Panel.swaplevel,../reference/api/pandas.Panel.swaplevel +generated/pandas.Panel.tail,../reference/api/pandas.Panel.tail +generated/pandas.Panel.take,../reference/api/pandas.Panel.take +generated/pandas.Panel.timetuple,../reference/api/pandas.Panel.timetuple +generated/pandas.Panel.to_clipboard,../reference/api/pandas.Panel.to_clipboard +generated/pandas.Panel.to_csv,../reference/api/pandas.Panel.to_csv +generated/pandas.Panel.to_dense,../reference/api/pandas.Panel.to_dense +generated/pandas.Panel.to_excel,../reference/api/pandas.Panel.to_excel +generated/pandas.Panel.to_frame,../reference/api/pandas.Panel.to_frame +generated/pandas.Panel.to_hdf,../reference/api/pandas.Panel.to_hdf +generated/pandas.Panel.to_json,../reference/api/pandas.Panel.to_json +generated/pandas.Panel.to_latex,../reference/api/pandas.Panel.to_latex +generated/pandas.Panel.to_msgpack,../reference/api/pandas.Panel.to_msgpack +generated/pandas.Panel.to_pickle,../reference/api/pandas.Panel.to_pickle +generated/pandas.Panel.to_sparse,../reference/api/pandas.Panel.to_sparse +generated/pandas.Panel.to_sql,../reference/api/pandas.Panel.to_sql +generated/pandas.Panel.to_xarray,../reference/api/pandas.Panel.to_xarray +generated/pandas.Panel.transform,../reference/api/pandas.Panel.transform +generated/pandas.Panel.transpose,../reference/api/pandas.Panel.transpose +generated/pandas.Panel.truediv,../reference/api/pandas.Panel.truediv +generated/pandas.Panel.truncate,../reference/api/pandas.Panel.truncate +generated/pandas.Panel.tshift,../reference/api/pandas.Panel.tshift +generated/pandas.Panel.tz_convert,../reference/api/pandas.Panel.tz_convert +generated/pandas.Panel.tz_localize,../reference/api/pandas.Panel.tz_localize +generated/pandas.Panel.update,../reference/api/pandas.Panel.update +generated/pandas.Panel.values,../reference/api/pandas.Panel.values +generated/pandas.Panel.var,../reference/api/pandas.Panel.var +generated/pandas.Panel.where,../reference/api/pandas.Panel.where +generated/pandas.Panel.xs,../reference/api/pandas.Panel.xs +generated/pandas.Period.asfreq,../reference/api/pandas.Period.asfreq +generated/pandas.Period.day,../reference/api/pandas.Period.day +generated/pandas.Period.dayofweek,../reference/api/pandas.Period.dayofweek +generated/pandas.Period.dayofyear,../reference/api/pandas.Period.dayofyear +generated/pandas.Period.days_in_month,../reference/api/pandas.Period.days_in_month +generated/pandas.Period.daysinmonth,../reference/api/pandas.Period.daysinmonth +generated/pandas.Period.end_time,../reference/api/pandas.Period.end_time +generated/pandas.Period.freq,../reference/api/pandas.Period.freq +generated/pandas.Period.freqstr,../reference/api/pandas.Period.freqstr +generated/pandas.Period.hour,../reference/api/pandas.Period.hour +generated/pandas.Period,../reference/api/pandas.Period +generated/pandas.PeriodIndex.asfreq,../reference/api/pandas.PeriodIndex.asfreq +generated/pandas.PeriodIndex.day,../reference/api/pandas.PeriodIndex.day +generated/pandas.PeriodIndex.dayofweek,../reference/api/pandas.PeriodIndex.dayofweek +generated/pandas.PeriodIndex.dayofyear,../reference/api/pandas.PeriodIndex.dayofyear +generated/pandas.PeriodIndex.days_in_month,../reference/api/pandas.PeriodIndex.days_in_month +generated/pandas.PeriodIndex.daysinmonth,../reference/api/pandas.PeriodIndex.daysinmonth +generated/pandas.PeriodIndex.end_time,../reference/api/pandas.PeriodIndex.end_time +generated/pandas.PeriodIndex.freq,../reference/api/pandas.PeriodIndex.freq +generated/pandas.PeriodIndex.freqstr,../reference/api/pandas.PeriodIndex.freqstr +generated/pandas.PeriodIndex.hour,../reference/api/pandas.PeriodIndex.hour +generated/pandas.PeriodIndex,../reference/api/pandas.PeriodIndex +generated/pandas.PeriodIndex.is_leap_year,../reference/api/pandas.PeriodIndex.is_leap_year +generated/pandas.PeriodIndex.minute,../reference/api/pandas.PeriodIndex.minute +generated/pandas.PeriodIndex.month,../reference/api/pandas.PeriodIndex.month +generated/pandas.PeriodIndex.quarter,../reference/api/pandas.PeriodIndex.quarter +generated/pandas.PeriodIndex.qyear,../reference/api/pandas.PeriodIndex.qyear +generated/pandas.PeriodIndex.second,../reference/api/pandas.PeriodIndex.second +generated/pandas.PeriodIndex.start_time,../reference/api/pandas.PeriodIndex.start_time +generated/pandas.PeriodIndex.strftime,../reference/api/pandas.PeriodIndex.strftime +generated/pandas.PeriodIndex.to_timestamp,../reference/api/pandas.PeriodIndex.to_timestamp +generated/pandas.PeriodIndex.weekday,../reference/api/pandas.PeriodIndex.weekday +generated/pandas.PeriodIndex.week,../reference/api/pandas.PeriodIndex.week +generated/pandas.PeriodIndex.weekofyear,../reference/api/pandas.PeriodIndex.weekofyear +generated/pandas.PeriodIndex.year,../reference/api/pandas.PeriodIndex.year +generated/pandas.Period.is_leap_year,../reference/api/pandas.Period.is_leap_year +generated/pandas.Period.minute,../reference/api/pandas.Period.minute +generated/pandas.Period.month,../reference/api/pandas.Period.month +generated/pandas.Period.now,../reference/api/pandas.Period.now +generated/pandas.Period.ordinal,../reference/api/pandas.Period.ordinal +generated/pandas.Period.quarter,../reference/api/pandas.Period.quarter +generated/pandas.Period.qyear,../reference/api/pandas.Period.qyear +generated/pandas.period_range,../reference/api/pandas.period_range +generated/pandas.Period.second,../reference/api/pandas.Period.second +generated/pandas.Period.start_time,../reference/api/pandas.Period.start_time +generated/pandas.Period.strftime,../reference/api/pandas.Period.strftime +generated/pandas.Period.to_timestamp,../reference/api/pandas.Period.to_timestamp +generated/pandas.Period.weekday,../reference/api/pandas.Period.weekday +generated/pandas.Period.week,../reference/api/pandas.Period.week +generated/pandas.Period.weekofyear,../reference/api/pandas.Period.weekofyear +generated/pandas.Period.year,../reference/api/pandas.Period.year +generated/pandas.pivot,../reference/api/pandas.pivot +generated/pandas.pivot_table,../reference/api/pandas.pivot_table +generated/pandas.plotting.andrews_curves,../reference/api/pandas.plotting.andrews_curves +generated/pandas.plotting.bootstrap_plot,../reference/api/pandas.plotting.bootstrap_plot +generated/pandas.plotting.deregister_matplotlib_converters,../reference/api/pandas.plotting.deregister_matplotlib_converters +generated/pandas.plotting.lag_plot,../reference/api/pandas.plotting.lag_plot +generated/pandas.plotting.parallel_coordinates,../reference/api/pandas.plotting.parallel_coordinates +generated/pandas.plotting.radviz,../reference/api/pandas.plotting.radviz +generated/pandas.plotting.register_matplotlib_converters,../reference/api/pandas.plotting.register_matplotlib_converters +generated/pandas.plotting.scatter_matrix,../reference/api/pandas.plotting.scatter_matrix +generated/pandas.qcut,../reference/api/pandas.qcut +generated/pandas.RangeIndex.from_range,../reference/api/pandas.RangeIndex.from_range +generated/pandas.RangeIndex,../reference/api/pandas.RangeIndex +generated/pandas.read_clipboard,../reference/api/pandas.read_clipboard +generated/pandas.read_csv,../reference/api/pandas.read_csv +generated/pandas.read_excel,../reference/api/pandas.read_excel +generated/pandas.read_feather,../reference/api/pandas.read_feather +generated/pandas.read_fwf,../reference/api/pandas.read_fwf +generated/pandas.read_gbq,../reference/api/pandas.read_gbq +generated/pandas.read_hdf,../reference/api/pandas.read_hdf +generated/pandas.read,../reference/api/pandas.read +generated/pandas.read_json,../reference/api/pandas.read_json +generated/pandas.read_msgpack,../reference/api/pandas.read_msgpack +generated/pandas.read_parquet,../reference/api/pandas.read_parquet +generated/pandas.read_pickle,../reference/api/pandas.read_pickle +generated/pandas.read_sas,../reference/api/pandas.read_sas +generated/pandas.read_sql,../reference/api/pandas.read_sql +generated/pandas.read_sql_query,../reference/api/pandas.read_sql_query +generated/pandas.read_sql_table,../reference/api/pandas.read_sql_table +generated/pandas.read_stata,../reference/api/pandas.read_stata +generated/pandas.read_table,../reference/api/pandas.read_table +generated/pandas.reset_option,../reference/api/pandas.reset_option +generated/pandas.Series.abs,../reference/api/pandas.Series.abs +generated/pandas.Series.add,../reference/api/pandas.Series.add +generated/pandas.Series.add_prefix,../reference/api/pandas.Series.add_prefix +generated/pandas.Series.add_suffix,../reference/api/pandas.Series.add_suffix +generated/pandas.Series.agg,../reference/api/pandas.Series.agg +generated/pandas.Series.aggregate,../reference/api/pandas.Series.aggregate +generated/pandas.Series.align,../reference/api/pandas.Series.align +generated/pandas.Series.all,../reference/api/pandas.Series.all +generated/pandas.Series.any,../reference/api/pandas.Series.any +generated/pandas.Series.append,../reference/api/pandas.Series.append +generated/pandas.Series.apply,../reference/api/pandas.Series.apply +generated/pandas.Series.argmax,../reference/api/pandas.Series.argmax +generated/pandas.Series.argmin,../reference/api/pandas.Series.argmin +generated/pandas.Series.argsort,../reference/api/pandas.Series.argsort +generated/pandas.Series.__array__,../reference/api/pandas.Series.__array__ +generated/pandas.Series.array,../reference/api/pandas.Series.array +generated/pandas.Series.as_blocks,../reference/api/pandas.Series.as_blocks +generated/pandas.Series.asfreq,../reference/api/pandas.Series.asfreq +generated/pandas.Series.as_matrix,../reference/api/pandas.Series.as_matrix +generated/pandas.Series.asobject,../reference/api/pandas.Series.asobject +generated/pandas.Series.asof,../reference/api/pandas.Series.asof +generated/pandas.Series.astype,../reference/api/pandas.Series.astype +generated/pandas.Series.at,../reference/api/pandas.Series.at +generated/pandas.Series.at_time,../reference/api/pandas.Series.at_time +generated/pandas.Series.autocorr,../reference/api/pandas.Series.autocorr +generated/pandas.Series.axes,../reference/api/pandas.Series.axes +generated/pandas.Series.base,../reference/api/pandas.Series.base +generated/pandas.Series.between,../reference/api/pandas.Series.between +generated/pandas.Series.between_time,../reference/api/pandas.Series.between_time +generated/pandas.Series.bfill,../reference/api/pandas.Series.bfill +generated/pandas.Series.blocks,../reference/api/pandas.Series.blocks +generated/pandas.Series.bool,../reference/api/pandas.Series.bool +generated/pandas.Series.cat.add_categories,../reference/api/pandas.Series.cat.add_categories +generated/pandas.Series.cat.as_ordered,../reference/api/pandas.Series.cat.as_ordered +generated/pandas.Series.cat.as_unordered,../reference/api/pandas.Series.cat.as_unordered +generated/pandas.Series.cat.categories,../reference/api/pandas.Series.cat.categories +generated/pandas.Series.cat.codes,../reference/api/pandas.Series.cat.codes +generated/pandas.Series.cat,../reference/api/pandas.Series.cat +generated/pandas.Series.cat.ordered,../reference/api/pandas.Series.cat.ordered +generated/pandas.Series.cat.remove_categories,../reference/api/pandas.Series.cat.remove_categories +generated/pandas.Series.cat.remove_unused_categories,../reference/api/pandas.Series.cat.remove_unused_categories +generated/pandas.Series.cat.rename_categories,../reference/api/pandas.Series.cat.rename_categories +generated/pandas.Series.cat.reorder_categories,../reference/api/pandas.Series.cat.reorder_categories +generated/pandas.Series.cat.set_categories,../reference/api/pandas.Series.cat.set_categories +generated/pandas.Series.clip,../reference/api/pandas.Series.clip +generated/pandas.Series.clip_lower,../reference/api/pandas.Series.clip_lower +generated/pandas.Series.clip_upper,../reference/api/pandas.Series.clip_upper +generated/pandas.Series.combine_first,../reference/api/pandas.Series.combine_first +generated/pandas.Series.combine,../reference/api/pandas.Series.combine +generated/pandas.Series.compound,../reference/api/pandas.Series.compound +generated/pandas.Series.compress,../reference/api/pandas.Series.compress +generated/pandas.Series.convert_objects,../reference/api/pandas.Series.convert_objects +generated/pandas.Series.copy,../reference/api/pandas.Series.copy +generated/pandas.Series.corr,../reference/api/pandas.Series.corr +generated/pandas.Series.count,../reference/api/pandas.Series.count +generated/pandas.Series.cov,../reference/api/pandas.Series.cov +generated/pandas.Series.cummax,../reference/api/pandas.Series.cummax +generated/pandas.Series.cummin,../reference/api/pandas.Series.cummin +generated/pandas.Series.cumprod,../reference/api/pandas.Series.cumprod +generated/pandas.Series.cumsum,../reference/api/pandas.Series.cumsum +generated/pandas.Series.data,../reference/api/pandas.Series.data +generated/pandas.Series.describe,../reference/api/pandas.Series.describe +generated/pandas.Series.diff,../reference/api/pandas.Series.diff +generated/pandas.Series.div,../reference/api/pandas.Series.div +generated/pandas.Series.divide,../reference/api/pandas.Series.divide +generated/pandas.Series.divmod,../reference/api/pandas.Series.divmod +generated/pandas.Series.dot,../reference/api/pandas.Series.dot +generated/pandas.Series.drop_duplicates,../reference/api/pandas.Series.drop_duplicates +generated/pandas.Series.drop,../reference/api/pandas.Series.drop +generated/pandas.Series.droplevel,../reference/api/pandas.Series.droplevel +generated/pandas.Series.dropna,../reference/api/pandas.Series.dropna +generated/pandas.Series.dt.ceil,../reference/api/pandas.Series.dt.ceil +generated/pandas.Series.dt.components,../reference/api/pandas.Series.dt.components +generated/pandas.Series.dt.date,../reference/api/pandas.Series.dt.date +generated/pandas.Series.dt.day,../reference/api/pandas.Series.dt.day +generated/pandas.Series.dt.day_name,../reference/api/pandas.Series.dt.day_name +generated/pandas.Series.dt.dayofweek,../reference/api/pandas.Series.dt.dayofweek +generated/pandas.Series.dt.dayofyear,../reference/api/pandas.Series.dt.dayofyear +generated/pandas.Series.dt.days,../reference/api/pandas.Series.dt.days +generated/pandas.Series.dt.days_in_month,../reference/api/pandas.Series.dt.days_in_month +generated/pandas.Series.dt.daysinmonth,../reference/api/pandas.Series.dt.daysinmonth +generated/pandas.Series.dt.end_time,../reference/api/pandas.Series.dt.end_time +generated/pandas.Series.dt.floor,../reference/api/pandas.Series.dt.floor +generated/pandas.Series.dt.freq,../reference/api/pandas.Series.dt.freq +generated/pandas.Series.dt.hour,../reference/api/pandas.Series.dt.hour +generated/pandas.Series.dt,../reference/api/pandas.Series.dt +generated/pandas.Series.dt.is_leap_year,../reference/api/pandas.Series.dt.is_leap_year +generated/pandas.Series.dt.is_month_end,../reference/api/pandas.Series.dt.is_month_end +generated/pandas.Series.dt.is_month_start,../reference/api/pandas.Series.dt.is_month_start +generated/pandas.Series.dt.is_quarter_end,../reference/api/pandas.Series.dt.is_quarter_end +generated/pandas.Series.dt.is_quarter_start,../reference/api/pandas.Series.dt.is_quarter_start +generated/pandas.Series.dt.is_year_end,../reference/api/pandas.Series.dt.is_year_end +generated/pandas.Series.dt.is_year_start,../reference/api/pandas.Series.dt.is_year_start +generated/pandas.Series.dt.microsecond,../reference/api/pandas.Series.dt.microsecond +generated/pandas.Series.dt.microseconds,../reference/api/pandas.Series.dt.microseconds +generated/pandas.Series.dt.minute,../reference/api/pandas.Series.dt.minute +generated/pandas.Series.dt.month,../reference/api/pandas.Series.dt.month +generated/pandas.Series.dt.month_name,../reference/api/pandas.Series.dt.month_name +generated/pandas.Series.dt.nanosecond,../reference/api/pandas.Series.dt.nanosecond +generated/pandas.Series.dt.nanoseconds,../reference/api/pandas.Series.dt.nanoseconds +generated/pandas.Series.dt.normalize,../reference/api/pandas.Series.dt.normalize +generated/pandas.Series.dt.quarter,../reference/api/pandas.Series.dt.quarter +generated/pandas.Series.dt.qyear,../reference/api/pandas.Series.dt.qyear +generated/pandas.Series.dt.round,../reference/api/pandas.Series.dt.round +generated/pandas.Series.dt.second,../reference/api/pandas.Series.dt.second +generated/pandas.Series.dt.seconds,../reference/api/pandas.Series.dt.seconds +generated/pandas.Series.dt.start_time,../reference/api/pandas.Series.dt.start_time +generated/pandas.Series.dt.strftime,../reference/api/pandas.Series.dt.strftime +generated/pandas.Series.dt.time,../reference/api/pandas.Series.dt.time +generated/pandas.Series.dt.timetz,../reference/api/pandas.Series.dt.timetz +generated/pandas.Series.dt.to_period,../reference/api/pandas.Series.dt.to_period +generated/pandas.Series.dt.to_pydatetime,../reference/api/pandas.Series.dt.to_pydatetime +generated/pandas.Series.dt.to_pytimedelta,../reference/api/pandas.Series.dt.to_pytimedelta +generated/pandas.Series.dt.total_seconds,../reference/api/pandas.Series.dt.total_seconds +generated/pandas.Series.dt.tz_convert,../reference/api/pandas.Series.dt.tz_convert +generated/pandas.Series.dt.tz,../reference/api/pandas.Series.dt.tz +generated/pandas.Series.dt.tz_localize,../reference/api/pandas.Series.dt.tz_localize +generated/pandas.Series.dt.weekday,../reference/api/pandas.Series.dt.weekday +generated/pandas.Series.dt.week,../reference/api/pandas.Series.dt.week +generated/pandas.Series.dt.weekofyear,../reference/api/pandas.Series.dt.weekofyear +generated/pandas.Series.dt.year,../reference/api/pandas.Series.dt.year +generated/pandas.Series.dtype,../reference/api/pandas.Series.dtype +generated/pandas.Series.dtypes,../reference/api/pandas.Series.dtypes +generated/pandas.Series.duplicated,../reference/api/pandas.Series.duplicated +generated/pandas.Series.empty,../reference/api/pandas.Series.empty +generated/pandas.Series.eq,../reference/api/pandas.Series.eq +generated/pandas.Series.equals,../reference/api/pandas.Series.equals +generated/pandas.Series.ewm,../reference/api/pandas.Series.ewm +generated/pandas.Series.expanding,../reference/api/pandas.Series.expanding +generated/pandas.Series.factorize,../reference/api/pandas.Series.factorize +generated/pandas.Series.ffill,../reference/api/pandas.Series.ffill +generated/pandas.Series.fillna,../reference/api/pandas.Series.fillna +generated/pandas.Series.filter,../reference/api/pandas.Series.filter +generated/pandas.Series.first,../reference/api/pandas.Series.first +generated/pandas.Series.first_valid_index,../reference/api/pandas.Series.first_valid_index +generated/pandas.Series.flags,../reference/api/pandas.Series.flags +generated/pandas.Series.floordiv,../reference/api/pandas.Series.floordiv +generated/pandas.Series.from_array,../reference/api/pandas.Series.from_array +generated/pandas.Series.from_csv,../reference/api/pandas.Series.from_csv +generated/pandas.Series.ftype,../reference/api/pandas.Series.ftype +generated/pandas.Series.ftypes,../reference/api/pandas.Series.ftypes +generated/pandas.Series.ge,../reference/api/pandas.Series.ge +generated/pandas.Series.get_dtype_counts,../reference/api/pandas.Series.get_dtype_counts +generated/pandas.Series.get_ftype_counts,../reference/api/pandas.Series.get_ftype_counts +generated/pandas.Series.get,../reference/api/pandas.Series.get +generated/pandas.Series.get_value,../reference/api/pandas.Series.get_value +generated/pandas.Series.get_values,../reference/api/pandas.Series.get_values +generated/pandas.Series.groupby,../reference/api/pandas.Series.groupby +generated/pandas.Series.gt,../reference/api/pandas.Series.gt +generated/pandas.Series.hasnans,../reference/api/pandas.Series.hasnans +generated/pandas.Series.head,../reference/api/pandas.Series.head +generated/pandas.Series.hist,../reference/api/pandas.Series.hist +generated/pandas.Series,../reference/api/pandas.Series +generated/pandas.Series.iat,../reference/api/pandas.Series.iat +generated/pandas.Series.idxmax,../reference/api/pandas.Series.idxmax +generated/pandas.Series.idxmin,../reference/api/pandas.Series.idxmin +generated/pandas.Series.iloc,../reference/api/pandas.Series.iloc +generated/pandas.Series.imag,../reference/api/pandas.Series.imag +generated/pandas.Series.index,../reference/api/pandas.Series.index +generated/pandas.Series.infer_objects,../reference/api/pandas.Series.infer_objects +generated/pandas.Series.interpolate,../reference/api/pandas.Series.interpolate +generated/pandas.Series.is_copy,../reference/api/pandas.Series.is_copy +generated/pandas.Series.isin,../reference/api/pandas.Series.isin +generated/pandas.Series.is_monotonic_decreasing,../reference/api/pandas.Series.is_monotonic_decreasing +generated/pandas.Series.is_monotonic,../reference/api/pandas.Series.is_monotonic +generated/pandas.Series.is_monotonic_increasing,../reference/api/pandas.Series.is_monotonic_increasing +generated/pandas.Series.isna,../reference/api/pandas.Series.isna +generated/pandas.Series.isnull,../reference/api/pandas.Series.isnull +generated/pandas.Series.is_unique,../reference/api/pandas.Series.is_unique +generated/pandas.Series.item,../reference/api/pandas.Series.item +generated/pandas.Series.items,../reference/api/pandas.Series.items +generated/pandas.Series.itemsize,../reference/api/pandas.Series.itemsize +generated/pandas.Series.__iter__,../reference/api/pandas.Series.__iter__ +generated/pandas.Series.iteritems,../reference/api/pandas.Series.iteritems +generated/pandas.Series.ix,../reference/api/pandas.Series.ix +generated/pandas.Series.keys,../reference/api/pandas.Series.keys +generated/pandas.Series.kurt,../reference/api/pandas.Series.kurt +generated/pandas.Series.kurtosis,../reference/api/pandas.Series.kurtosis +generated/pandas.Series.last,../reference/api/pandas.Series.last +generated/pandas.Series.last_valid_index,../reference/api/pandas.Series.last_valid_index +generated/pandas.Series.le,../reference/api/pandas.Series.le +generated/pandas.Series.loc,../reference/api/pandas.Series.loc +generated/pandas.Series.lt,../reference/api/pandas.Series.lt +generated/pandas.Series.mad,../reference/api/pandas.Series.mad +generated/pandas.Series.map,../reference/api/pandas.Series.map +generated/pandas.Series.mask,../reference/api/pandas.Series.mask +generated/pandas.Series.max,../reference/api/pandas.Series.max +generated/pandas.Series.mean,../reference/api/pandas.Series.mean +generated/pandas.Series.median,../reference/api/pandas.Series.median +generated/pandas.Series.memory_usage,../reference/api/pandas.Series.memory_usage +generated/pandas.Series.min,../reference/api/pandas.Series.min +generated/pandas.Series.mode,../reference/api/pandas.Series.mode +generated/pandas.Series.mod,../reference/api/pandas.Series.mod +generated/pandas.Series.mul,../reference/api/pandas.Series.mul +generated/pandas.Series.multiply,../reference/api/pandas.Series.multiply +generated/pandas.Series.name,../reference/api/pandas.Series.name +generated/pandas.Series.nbytes,../reference/api/pandas.Series.nbytes +generated/pandas.Series.ndim,../reference/api/pandas.Series.ndim +generated/pandas.Series.ne,../reference/api/pandas.Series.ne +generated/pandas.Series.nlargest,../reference/api/pandas.Series.nlargest +generated/pandas.Series.nonzero,../reference/api/pandas.Series.nonzero +generated/pandas.Series.notna,../reference/api/pandas.Series.notna +generated/pandas.Series.notnull,../reference/api/pandas.Series.notnull +generated/pandas.Series.nsmallest,../reference/api/pandas.Series.nsmallest +generated/pandas.Series.nunique,../reference/api/pandas.Series.nunique +generated/pandas.Series.pct_change,../reference/api/pandas.Series.pct_change +generated/pandas.Series.pipe,../reference/api/pandas.Series.pipe +generated/pandas.Series.plot.area,../reference/api/pandas.Series.plot.area +generated/pandas.Series.plot.barh,../reference/api/pandas.Series.plot.barh +generated/pandas.Series.plot.bar,../reference/api/pandas.Series.plot.bar +generated/pandas.Series.plot.box,../reference/api/pandas.Series.plot.box +generated/pandas.Series.plot.density,../reference/api/pandas.Series.plot.density +generated/pandas.Series.plot.hist,../reference/api/pandas.Series.plot.hist +generated/pandas.Series.plot,../reference/api/pandas.Series.plot +generated/pandas.Series.plot.kde,../reference/api/pandas.Series.plot.kde +generated/pandas.Series.plot.line,../reference/api/pandas.Series.plot.line +generated/pandas.Series.plot.pie,../reference/api/pandas.Series.plot.pie +generated/pandas.Series.pop,../reference/api/pandas.Series.pop +generated/pandas.Series.pow,../reference/api/pandas.Series.pow +generated/pandas.Series.prod,../reference/api/pandas.Series.prod +generated/pandas.Series.product,../reference/api/pandas.Series.product +generated/pandas.Series.ptp,../reference/api/pandas.Series.ptp +generated/pandas.Series.put,../reference/api/pandas.Series.put +generated/pandas.Series.quantile,../reference/api/pandas.Series.quantile +generated/pandas.Series.radd,../reference/api/pandas.Series.radd +generated/pandas.Series.rank,../reference/api/pandas.Series.rank +generated/pandas.Series.ravel,../reference/api/pandas.Series.ravel +generated/pandas.Series.rdiv,../reference/api/pandas.Series.rdiv +generated/pandas.Series.rdivmod,../reference/api/pandas.Series.rdivmod +generated/pandas.Series.real,../reference/api/pandas.Series.real +generated/pandas.Series.reindex_axis,../reference/api/pandas.Series.reindex_axis +generated/pandas.Series.reindex,../reference/api/pandas.Series.reindex +generated/pandas.Series.reindex_like,../reference/api/pandas.Series.reindex_like +generated/pandas.Series.rename_axis,../reference/api/pandas.Series.rename_axis +generated/pandas.Series.rename,../reference/api/pandas.Series.rename +generated/pandas.Series.reorder_levels,../reference/api/pandas.Series.reorder_levels +generated/pandas.Series.repeat,../reference/api/pandas.Series.repeat +generated/pandas.Series.replace,../reference/api/pandas.Series.replace +generated/pandas.Series.resample,../reference/api/pandas.Series.resample +generated/pandas.Series.reset_index,../reference/api/pandas.Series.reset_index +generated/pandas.Series.rfloordiv,../reference/api/pandas.Series.rfloordiv +generated/pandas.Series.rmod,../reference/api/pandas.Series.rmod +generated/pandas.Series.rmul,../reference/api/pandas.Series.rmul +generated/pandas.Series.rolling,../reference/api/pandas.Series.rolling +generated/pandas.Series.round,../reference/api/pandas.Series.round +generated/pandas.Series.rpow,../reference/api/pandas.Series.rpow +generated/pandas.Series.rsub,../reference/api/pandas.Series.rsub +generated/pandas.Series.rtruediv,../reference/api/pandas.Series.rtruediv +generated/pandas.Series.sample,../reference/api/pandas.Series.sample +generated/pandas.Series.searchsorted,../reference/api/pandas.Series.searchsorted +generated/pandas.Series.select,../reference/api/pandas.Series.select +generated/pandas.Series.sem,../reference/api/pandas.Series.sem +generated/pandas.Series.set_axis,../reference/api/pandas.Series.set_axis +generated/pandas.Series.set_value,../reference/api/pandas.Series.set_value +generated/pandas.Series.shape,../reference/api/pandas.Series.shape +generated/pandas.Series.shift,../reference/api/pandas.Series.shift +generated/pandas.Series.size,../reference/api/pandas.Series.size +generated/pandas.Series.skew,../reference/api/pandas.Series.skew +generated/pandas.Series.slice_shift,../reference/api/pandas.Series.slice_shift +generated/pandas.Series.sort_index,../reference/api/pandas.Series.sort_index +generated/pandas.Series.sort_values,../reference/api/pandas.Series.sort_values +generated/pandas.Series.sparse.density,../reference/api/pandas.Series.sparse.density +generated/pandas.Series.sparse.fill_value,../reference/api/pandas.Series.sparse.fill_value +generated/pandas.Series.sparse.from_coo,../reference/api/pandas.Series.sparse.from_coo +generated/pandas.Series.sparse.npoints,../reference/api/pandas.Series.sparse.npoints +generated/pandas.Series.sparse.sp_values,../reference/api/pandas.Series.sparse.sp_values +generated/pandas.Series.sparse.to_coo,../reference/api/pandas.Series.sparse.to_coo +generated/pandas.Series.squeeze,../reference/api/pandas.Series.squeeze +generated/pandas.Series.std,../reference/api/pandas.Series.std +generated/pandas.Series.str.capitalize,../reference/api/pandas.Series.str.capitalize +generated/pandas.Series.str.cat,../reference/api/pandas.Series.str.cat +generated/pandas.Series.str.center,../reference/api/pandas.Series.str.center +generated/pandas.Series.str.contains,../reference/api/pandas.Series.str.contains +generated/pandas.Series.str.count,../reference/api/pandas.Series.str.count +generated/pandas.Series.str.decode,../reference/api/pandas.Series.str.decode +generated/pandas.Series.str.encode,../reference/api/pandas.Series.str.encode +generated/pandas.Series.str.endswith,../reference/api/pandas.Series.str.endswith +generated/pandas.Series.str.extractall,../reference/api/pandas.Series.str.extractall +generated/pandas.Series.str.extract,../reference/api/pandas.Series.str.extract +generated/pandas.Series.str.findall,../reference/api/pandas.Series.str.findall +generated/pandas.Series.str.find,../reference/api/pandas.Series.str.find +generated/pandas.Series.str.get_dummies,../reference/api/pandas.Series.str.get_dummies +generated/pandas.Series.str.get,../reference/api/pandas.Series.str.get +generated/pandas.Series.str,../reference/api/pandas.Series.str +generated/pandas.Series.strides,../reference/api/pandas.Series.strides +generated/pandas.Series.str.index,../reference/api/pandas.Series.str.index +generated/pandas.Series.str.isalnum,../reference/api/pandas.Series.str.isalnum +generated/pandas.Series.str.isalpha,../reference/api/pandas.Series.str.isalpha +generated/pandas.Series.str.isdecimal,../reference/api/pandas.Series.str.isdecimal +generated/pandas.Series.str.isdigit,../reference/api/pandas.Series.str.isdigit +generated/pandas.Series.str.islower,../reference/api/pandas.Series.str.islower +generated/pandas.Series.str.isnumeric,../reference/api/pandas.Series.str.isnumeric +generated/pandas.Series.str.isspace,../reference/api/pandas.Series.str.isspace +generated/pandas.Series.str.istitle,../reference/api/pandas.Series.str.istitle +generated/pandas.Series.str.isupper,../reference/api/pandas.Series.str.isupper +generated/pandas.Series.str.join,../reference/api/pandas.Series.str.join +generated/pandas.Series.str.len,../reference/api/pandas.Series.str.len +generated/pandas.Series.str.ljust,../reference/api/pandas.Series.str.ljust +generated/pandas.Series.str.lower,../reference/api/pandas.Series.str.lower +generated/pandas.Series.str.lstrip,../reference/api/pandas.Series.str.lstrip +generated/pandas.Series.str.match,../reference/api/pandas.Series.str.match +generated/pandas.Series.str.normalize,../reference/api/pandas.Series.str.normalize +generated/pandas.Series.str.pad,../reference/api/pandas.Series.str.pad +generated/pandas.Series.str.partition,../reference/api/pandas.Series.str.partition +generated/pandas.Series.str.repeat,../reference/api/pandas.Series.str.repeat +generated/pandas.Series.str.replace,../reference/api/pandas.Series.str.replace +generated/pandas.Series.str.rfind,../reference/api/pandas.Series.str.rfind +generated/pandas.Series.str.rindex,../reference/api/pandas.Series.str.rindex +generated/pandas.Series.str.rjust,../reference/api/pandas.Series.str.rjust +generated/pandas.Series.str.rpartition,../reference/api/pandas.Series.str.rpartition +generated/pandas.Series.str.rsplit,../reference/api/pandas.Series.str.rsplit +generated/pandas.Series.str.rstrip,../reference/api/pandas.Series.str.rstrip +generated/pandas.Series.str.slice,../reference/api/pandas.Series.str.slice +generated/pandas.Series.str.slice_replace,../reference/api/pandas.Series.str.slice_replace +generated/pandas.Series.str.split,../reference/api/pandas.Series.str.split +generated/pandas.Series.str.startswith,../reference/api/pandas.Series.str.startswith +generated/pandas.Series.str.strip,../reference/api/pandas.Series.str.strip +generated/pandas.Series.str.swapcase,../reference/api/pandas.Series.str.swapcase +generated/pandas.Series.str.title,../reference/api/pandas.Series.str.title +generated/pandas.Series.str.translate,../reference/api/pandas.Series.str.translate +generated/pandas.Series.str.upper,../reference/api/pandas.Series.str.upper +generated/pandas.Series.str.wrap,../reference/api/pandas.Series.str.wrap +generated/pandas.Series.str.zfill,../reference/api/pandas.Series.str.zfill +generated/pandas.Series.sub,../reference/api/pandas.Series.sub +generated/pandas.Series.subtract,../reference/api/pandas.Series.subtract +generated/pandas.Series.sum,../reference/api/pandas.Series.sum +generated/pandas.Series.swapaxes,../reference/api/pandas.Series.swapaxes +generated/pandas.Series.swaplevel,../reference/api/pandas.Series.swaplevel +generated/pandas.Series.tail,../reference/api/pandas.Series.tail +generated/pandas.Series.take,../reference/api/pandas.Series.take +generated/pandas.Series.T,../reference/api/pandas.Series.T +generated/pandas.Series.timetuple,../reference/api/pandas.Series.timetuple +generated/pandas.Series.to_clipboard,../reference/api/pandas.Series.to_clipboard +generated/pandas.Series.to_csv,../reference/api/pandas.Series.to_csv +generated/pandas.Series.to_dense,../reference/api/pandas.Series.to_dense +generated/pandas.Series.to_dict,../reference/api/pandas.Series.to_dict +generated/pandas.Series.to_excel,../reference/api/pandas.Series.to_excel +generated/pandas.Series.to_frame,../reference/api/pandas.Series.to_frame +generated/pandas.Series.to_hdf,../reference/api/pandas.Series.to_hdf +generated/pandas.Series.to_json,../reference/api/pandas.Series.to_json +generated/pandas.Series.to_latex,../reference/api/pandas.Series.to_latex +generated/pandas.Series.to_list,../reference/api/pandas.Series.to_list +generated/pandas.Series.tolist,../reference/api/pandas.Series.tolist +generated/pandas.Series.to_msgpack,../reference/api/pandas.Series.to_msgpack +generated/pandas.Series.to_numpy,../reference/api/pandas.Series.to_numpy +generated/pandas.Series.to_period,../reference/api/pandas.Series.to_period +generated/pandas.Series.to_pickle,../reference/api/pandas.Series.to_pickle +generated/pandas.Series.to_sparse,../reference/api/pandas.Series.to_sparse +generated/pandas.Series.to_sql,../reference/api/pandas.Series.to_sql +generated/pandas.Series.to_string,../reference/api/pandas.Series.to_string +generated/pandas.Series.to_timestamp,../reference/api/pandas.Series.to_timestamp +generated/pandas.Series.to_xarray,../reference/api/pandas.Series.to_xarray +generated/pandas.Series.transform,../reference/api/pandas.Series.transform +generated/pandas.Series.transpose,../reference/api/pandas.Series.transpose +generated/pandas.Series.truediv,../reference/api/pandas.Series.truediv +generated/pandas.Series.truncate,../reference/api/pandas.Series.truncate +generated/pandas.Series.tshift,../reference/api/pandas.Series.tshift +generated/pandas.Series.tz_convert,../reference/api/pandas.Series.tz_convert +generated/pandas.Series.tz_localize,../reference/api/pandas.Series.tz_localize +generated/pandas.Series.unique,../reference/api/pandas.Series.unique +generated/pandas.Series.unstack,../reference/api/pandas.Series.unstack +generated/pandas.Series.update,../reference/api/pandas.Series.update +generated/pandas.Series.valid,../reference/api/pandas.Series.valid +generated/pandas.Series.value_counts,../reference/api/pandas.Series.value_counts +generated/pandas.Series.values,../reference/api/pandas.Series.values +generated/pandas.Series.var,../reference/api/pandas.Series.var +generated/pandas.Series.view,../reference/api/pandas.Series.view +generated/pandas.Series.where,../reference/api/pandas.Series.where +generated/pandas.Series.xs,../reference/api/pandas.Series.xs +generated/pandas.set_option,../reference/api/pandas.set_option +generated/pandas.SparseDataFrame.to_coo,../reference/api/pandas.SparseDataFrame.to_coo +generated/pandas.SparseSeries.from_coo,../reference/api/pandas.SparseSeries.from_coo +generated/pandas.SparseSeries.to_coo,../reference/api/pandas.SparseSeries.to_coo +generated/pandas.test,../reference/api/pandas.test +generated/pandas.testing.assert_frame_equal,../reference/api/pandas.testing.assert_frame_equal +generated/pandas.testing.assert_index_equal,../reference/api/pandas.testing.assert_index_equal +generated/pandas.testing.assert_series_equal,../reference/api/pandas.testing.assert_series_equal +generated/pandas.Timedelta.asm8,../reference/api/pandas.Timedelta.asm8 +generated/pandas.Timedelta.ceil,../reference/api/pandas.Timedelta.ceil +generated/pandas.Timedelta.components,../reference/api/pandas.Timedelta.components +generated/pandas.Timedelta.days,../reference/api/pandas.Timedelta.days +generated/pandas.Timedelta.delta,../reference/api/pandas.Timedelta.delta +generated/pandas.Timedelta.floor,../reference/api/pandas.Timedelta.floor +generated/pandas.Timedelta.freq,../reference/api/pandas.Timedelta.freq +generated/pandas.Timedelta,../reference/api/pandas.Timedelta +generated/pandas.TimedeltaIndex.ceil,../reference/api/pandas.TimedeltaIndex.ceil +generated/pandas.TimedeltaIndex.components,../reference/api/pandas.TimedeltaIndex.components +generated/pandas.TimedeltaIndex.days,../reference/api/pandas.TimedeltaIndex.days +generated/pandas.TimedeltaIndex.floor,../reference/api/pandas.TimedeltaIndex.floor +generated/pandas.TimedeltaIndex,../reference/api/pandas.TimedeltaIndex +generated/pandas.TimedeltaIndex.inferred_freq,../reference/api/pandas.TimedeltaIndex.inferred_freq +generated/pandas.TimedeltaIndex.microseconds,../reference/api/pandas.TimedeltaIndex.microseconds +generated/pandas.TimedeltaIndex.nanoseconds,../reference/api/pandas.TimedeltaIndex.nanoseconds +generated/pandas.TimedeltaIndex.round,../reference/api/pandas.TimedeltaIndex.round +generated/pandas.TimedeltaIndex.seconds,../reference/api/pandas.TimedeltaIndex.seconds +generated/pandas.TimedeltaIndex.to_frame,../reference/api/pandas.TimedeltaIndex.to_frame +generated/pandas.TimedeltaIndex.to_pytimedelta,../reference/api/pandas.TimedeltaIndex.to_pytimedelta +generated/pandas.TimedeltaIndex.to_series,../reference/api/pandas.TimedeltaIndex.to_series +generated/pandas.Timedelta.isoformat,../reference/api/pandas.Timedelta.isoformat +generated/pandas.Timedelta.is_populated,../reference/api/pandas.Timedelta.is_populated +generated/pandas.Timedelta.max,../reference/api/pandas.Timedelta.max +generated/pandas.Timedelta.microseconds,../reference/api/pandas.Timedelta.microseconds +generated/pandas.Timedelta.min,../reference/api/pandas.Timedelta.min +generated/pandas.Timedelta.nanoseconds,../reference/api/pandas.Timedelta.nanoseconds +generated/pandas.timedelta_range,../reference/api/pandas.timedelta_range +generated/pandas.Timedelta.resolution,../reference/api/pandas.Timedelta.resolution +generated/pandas.Timedelta.round,../reference/api/pandas.Timedelta.round +generated/pandas.Timedelta.seconds,../reference/api/pandas.Timedelta.seconds +generated/pandas.Timedelta.to_pytimedelta,../reference/api/pandas.Timedelta.to_pytimedelta +generated/pandas.Timedelta.total_seconds,../reference/api/pandas.Timedelta.total_seconds +generated/pandas.Timedelta.to_timedelta64,../reference/api/pandas.Timedelta.to_timedelta64 +generated/pandas.Timedelta.value,../reference/api/pandas.Timedelta.value +generated/pandas.Timedelta.view,../reference/api/pandas.Timedelta.view +generated/pandas.Timestamp.asm8,../reference/api/pandas.Timestamp.asm8 +generated/pandas.Timestamp.astimezone,../reference/api/pandas.Timestamp.astimezone +generated/pandas.Timestamp.ceil,../reference/api/pandas.Timestamp.ceil +generated/pandas.Timestamp.combine,../reference/api/pandas.Timestamp.combine +generated/pandas.Timestamp.ctime,../reference/api/pandas.Timestamp.ctime +generated/pandas.Timestamp.date,../reference/api/pandas.Timestamp.date +generated/pandas.Timestamp.day,../reference/api/pandas.Timestamp.day +generated/pandas.Timestamp.day_name,../reference/api/pandas.Timestamp.day_name +generated/pandas.Timestamp.dayofweek,../reference/api/pandas.Timestamp.dayofweek +generated/pandas.Timestamp.dayofyear,../reference/api/pandas.Timestamp.dayofyear +generated/pandas.Timestamp.days_in_month,../reference/api/pandas.Timestamp.days_in_month +generated/pandas.Timestamp.daysinmonth,../reference/api/pandas.Timestamp.daysinmonth +generated/pandas.Timestamp.dst,../reference/api/pandas.Timestamp.dst +generated/pandas.Timestamp.floor,../reference/api/pandas.Timestamp.floor +generated/pandas.Timestamp.fold,../reference/api/pandas.Timestamp.fold +generated/pandas.Timestamp.freq,../reference/api/pandas.Timestamp.freq +generated/pandas.Timestamp.freqstr,../reference/api/pandas.Timestamp.freqstr +generated/pandas.Timestamp.fromisoformat,../reference/api/pandas.Timestamp.fromisoformat +generated/pandas.Timestamp.fromordinal,../reference/api/pandas.Timestamp.fromordinal +generated/pandas.Timestamp.fromtimestamp,../reference/api/pandas.Timestamp.fromtimestamp +generated/pandas.Timestamp.hour,../reference/api/pandas.Timestamp.hour +generated/pandas.Timestamp,../reference/api/pandas.Timestamp +generated/pandas.Timestamp.is_leap_year,../reference/api/pandas.Timestamp.is_leap_year +generated/pandas.Timestamp.is_month_end,../reference/api/pandas.Timestamp.is_month_end +generated/pandas.Timestamp.is_month_start,../reference/api/pandas.Timestamp.is_month_start +generated/pandas.Timestamp.isocalendar,../reference/api/pandas.Timestamp.isocalendar +generated/pandas.Timestamp.isoformat,../reference/api/pandas.Timestamp.isoformat +generated/pandas.Timestamp.isoweekday,../reference/api/pandas.Timestamp.isoweekday +generated/pandas.Timestamp.is_quarter_end,../reference/api/pandas.Timestamp.is_quarter_end +generated/pandas.Timestamp.is_quarter_start,../reference/api/pandas.Timestamp.is_quarter_start +generated/pandas.Timestamp.is_year_end,../reference/api/pandas.Timestamp.is_year_end +generated/pandas.Timestamp.is_year_start,../reference/api/pandas.Timestamp.is_year_start +generated/pandas.Timestamp.max,../reference/api/pandas.Timestamp.max +generated/pandas.Timestamp.microsecond,../reference/api/pandas.Timestamp.microsecond +generated/pandas.Timestamp.min,../reference/api/pandas.Timestamp.min +generated/pandas.Timestamp.minute,../reference/api/pandas.Timestamp.minute +generated/pandas.Timestamp.month,../reference/api/pandas.Timestamp.month +generated/pandas.Timestamp.month_name,../reference/api/pandas.Timestamp.month_name +generated/pandas.Timestamp.nanosecond,../reference/api/pandas.Timestamp.nanosecond +generated/pandas.Timestamp.normalize,../reference/api/pandas.Timestamp.normalize +generated/pandas.Timestamp.now,../reference/api/pandas.Timestamp.now +generated/pandas.Timestamp.quarter,../reference/api/pandas.Timestamp.quarter +generated/pandas.Timestamp.replace,../reference/api/pandas.Timestamp.replace +generated/pandas.Timestamp.resolution,../reference/api/pandas.Timestamp.resolution +generated/pandas.Timestamp.round,../reference/api/pandas.Timestamp.round +generated/pandas.Timestamp.second,../reference/api/pandas.Timestamp.second +generated/pandas.Timestamp.strftime,../reference/api/pandas.Timestamp.strftime +generated/pandas.Timestamp.strptime,../reference/api/pandas.Timestamp.strptime +generated/pandas.Timestamp.time,../reference/api/pandas.Timestamp.time +generated/pandas.Timestamp.timestamp,../reference/api/pandas.Timestamp.timestamp +generated/pandas.Timestamp.timetuple,../reference/api/pandas.Timestamp.timetuple +generated/pandas.Timestamp.timetz,../reference/api/pandas.Timestamp.timetz +generated/pandas.Timestamp.to_datetime64,../reference/api/pandas.Timestamp.to_datetime64 +generated/pandas.Timestamp.today,../reference/api/pandas.Timestamp.today +generated/pandas.Timestamp.to_julian_date,../reference/api/pandas.Timestamp.to_julian_date +generated/pandas.Timestamp.toordinal,../reference/api/pandas.Timestamp.toordinal +generated/pandas.Timestamp.to_period,../reference/api/pandas.Timestamp.to_period +generated/pandas.Timestamp.to_pydatetime,../reference/api/pandas.Timestamp.to_pydatetime +generated/pandas.Timestamp.tz_convert,../reference/api/pandas.Timestamp.tz_convert +generated/pandas.Timestamp.tz,../reference/api/pandas.Timestamp.tz +generated/pandas.Timestamp.tzinfo,../reference/api/pandas.Timestamp.tzinfo +generated/pandas.Timestamp.tz_localize,../reference/api/pandas.Timestamp.tz_localize +generated/pandas.Timestamp.tzname,../reference/api/pandas.Timestamp.tzname +generated/pandas.Timestamp.utcfromtimestamp,../reference/api/pandas.Timestamp.utcfromtimestamp +generated/pandas.Timestamp.utcnow,../reference/api/pandas.Timestamp.utcnow +generated/pandas.Timestamp.utcoffset,../reference/api/pandas.Timestamp.utcoffset +generated/pandas.Timestamp.utctimetuple,../reference/api/pandas.Timestamp.utctimetuple +generated/pandas.Timestamp.value,../reference/api/pandas.Timestamp.value +generated/pandas.Timestamp.weekday,../reference/api/pandas.Timestamp.weekday +generated/pandas.Timestamp.weekday_name,../reference/api/pandas.Timestamp.weekday_name +generated/pandas.Timestamp.week,../reference/api/pandas.Timestamp.week +generated/pandas.Timestamp.weekofyear,../reference/api/pandas.Timestamp.weekofyear +generated/pandas.Timestamp.year,../reference/api/pandas.Timestamp.year +generated/pandas.to_datetime,../reference/api/pandas.to_datetime +generated/pandas.to_numeric,../reference/api/pandas.to_numeric +generated/pandas.to_timedelta,../reference/api/pandas.to_timedelta +generated/pandas.tseries.frequencies.to_offset,../reference/api/pandas.tseries.frequencies.to_offset +generated/pandas.unique,../reference/api/pandas.unique +generated/pandas.util.hash_array,../reference/api/pandas.util.hash_array +generated/pandas.util.hash_pandas_object,../reference/api/pandas.util.hash_pandas_object +generated/pandas.wide_to_long,../reference/api/pandas.wide_to_long diff --git a/doc/source/contributing.rst b/doc/source/development/contributing.rst similarity index 99% rename from doc/source/contributing.rst rename to doc/source/development/contributing.rst index a68e5c70087e9..c9d6845107dfc 100644 --- a/doc/source/contributing.rst +++ b/doc/source/development/contributing.rst @@ -698,7 +698,7 @@ A pull-request will be considered for merging when you have an all 'green' build then you will get a red 'X', where you can click through to see the individual failed tests. This is an example of a green build. -.. image:: _static/ci.png +.. image:: ../_static/ci.png .. note:: diff --git a/doc/source/contributing_docstring.rst b/doc/source/development/contributing_docstring.rst similarity index 100% rename from doc/source/contributing_docstring.rst rename to doc/source/development/contributing_docstring.rst diff --git a/doc/source/developer.rst b/doc/source/development/developer.rst similarity index 100% rename from doc/source/developer.rst rename to doc/source/development/developer.rst diff --git a/doc/source/extending.rst b/doc/source/development/extending.rst similarity index 100% rename from doc/source/extending.rst rename to doc/source/development/extending.rst diff --git a/doc/source/development/index.rst b/doc/source/development/index.rst new file mode 100644 index 0000000000000..d67a6c3a2ca04 --- /dev/null +++ b/doc/source/development/index.rst @@ -0,0 +1,15 @@ +{{ header }} + +.. _development: + +=========== +Development +=========== + +.. toctree:: + :maxdepth: 2 + + contributing + internals + extending + developer diff --git a/doc/source/internals.rst b/doc/source/development/internals.rst similarity index 100% rename from doc/source/internals.rst rename to doc/source/development/internals.rst diff --git a/doc/source/10min.rst b/doc/source/getting_started/10min.rst similarity index 100% rename from doc/source/10min.rst rename to doc/source/getting_started/10min.rst diff --git a/doc/source/basics.rst b/doc/source/getting_started/basics.rst similarity index 100% rename from doc/source/basics.rst rename to doc/source/getting_started/basics.rst diff --git a/doc/source/comparison_with_r.rst b/doc/source/getting_started/comparison/comparison_with_r.rst similarity index 100% rename from doc/source/comparison_with_r.rst rename to doc/source/getting_started/comparison/comparison_with_r.rst diff --git a/doc/source/comparison_with_sas.rst b/doc/source/getting_started/comparison/comparison_with_sas.rst similarity index 100% rename from doc/source/comparison_with_sas.rst rename to doc/source/getting_started/comparison/comparison_with_sas.rst diff --git a/doc/source/comparison_with_sql.rst b/doc/source/getting_started/comparison/comparison_with_sql.rst similarity index 100% rename from doc/source/comparison_with_sql.rst rename to doc/source/getting_started/comparison/comparison_with_sql.rst diff --git a/doc/source/comparison_with_stata.rst b/doc/source/getting_started/comparison/comparison_with_stata.rst similarity index 100% rename from doc/source/comparison_with_stata.rst rename to doc/source/getting_started/comparison/comparison_with_stata.rst diff --git a/doc/source/getting_started/comparison/index.rst b/doc/source/getting_started/comparison/index.rst new file mode 100644 index 0000000000000..998706ce0c639 --- /dev/null +++ b/doc/source/getting_started/comparison/index.rst @@ -0,0 +1,15 @@ +{{ header }} + +.. _comparison: + +=========================== +Comparison with other tools +=========================== + +.. toctree:: + :maxdepth: 2 + + comparison_with_r + comparison_with_sql + comparison_with_sas + comparison_with_stata diff --git a/doc/source/dsintro.rst b/doc/source/getting_started/dsintro.rst similarity index 100% rename from doc/source/dsintro.rst rename to doc/source/getting_started/dsintro.rst diff --git a/doc/source/getting_started/index.rst b/doc/source/getting_started/index.rst new file mode 100644 index 0000000000000..4c5d26461a667 --- /dev/null +++ b/doc/source/getting_started/index.rst @@ -0,0 +1,17 @@ +{{ header }} + +.. _getting_started: + +=============== +Getting started +=============== + +.. toctree:: + :maxdepth: 2 + + overview + 10min + basics + dsintro + comparison/index + tutorials diff --git a/doc/source/overview.rst b/doc/source/getting_started/overview.rst similarity index 50% rename from doc/source/overview.rst rename to doc/source/getting_started/overview.rst index b98e2d4b9963c..b531f686951fc 100644 --- a/doc/source/overview.rst +++ b/doc/source/getting_started/overview.rst @@ -6,25 +6,80 @@ Package overview **************** -:mod:`pandas` is an open source, BSD-licensed library providing high-performance, -easy-to-use data structures and data analysis tools for the `Python `__ -programming language. - -:mod:`pandas` consists of the following elements: - -* A set of labeled array data structures, the primary of which are - Series and DataFrame. -* Index objects enabling both simple axis indexing and multi-level / - hierarchical axis indexing. -* An integrated group by engine for aggregating and transforming data sets. -* Date range generation (date_range) and custom date offsets enabling the - implementation of customized frequencies. -* Input/Output tools: loading tabular data from flat files (CSV, delimited, - Excel 2003), and saving and loading pandas objects from the fast and - efficient PyTables/HDF5 format. -* Memory-efficient "sparse" versions of the standard data structures for storing - data that is mostly missing or mostly constant (some fixed value). -* Moving window statistics (rolling mean, rolling standard deviation, etc.). +**pandas** is a `Python `__ package providing fast, +flexible, and expressive data structures designed to make working with +"relational" or "labeled" data both easy and intuitive. It aims to be the +fundamental high-level building block for doing practical, **real world** data +analysis in Python. Additionally, it has the broader goal of becoming **the +most powerful and flexible open source data analysis / manipulation tool +available in any language**. It is already well on its way toward this goal. + +pandas is well suited for many different kinds of data: + + - Tabular data with heterogeneously-typed columns, as in an SQL table or + Excel spreadsheet + - Ordered and unordered (not necessarily fixed-frequency) time series data. + - Arbitrary matrix data (homogeneously typed or heterogeneous) with row and + column labels + - Any other form of observational / statistical data sets. The data actually + need not be labeled at all to be placed into a pandas data structure + +The two primary data structures of pandas, :class:`Series` (1-dimensional) +and :class:`DataFrame` (2-dimensional), handle the vast majority of typical use +cases in finance, statistics, social science, and many areas of +engineering. For R users, :class:`DataFrame` provides everything that R's +``data.frame`` provides and much more. pandas is built on top of `NumPy +`__ and is intended to integrate well within a scientific +computing environment with many other 3rd party libraries. + +Here are just a few of the things that pandas does well: + + - Easy handling of **missing data** (represented as NaN) in floating point as + well as non-floating point data + - Size mutability: columns can be **inserted and deleted** from DataFrame and + higher dimensional objects + - Automatic and explicit **data alignment**: objects can be explicitly + aligned to a set of labels, or the user can simply ignore the labels and + let `Series`, `DataFrame`, etc. automatically align the data for you in + computations + - Powerful, flexible **group by** functionality to perform + split-apply-combine operations on data sets, for both aggregating and + transforming data + - Make it **easy to convert** ragged, differently-indexed data in other + Python and NumPy data structures into DataFrame objects + - Intelligent label-based **slicing**, **fancy indexing**, and **subsetting** + of large data sets + - Intuitive **merging** and **joining** data sets + - Flexible **reshaping** and pivoting of data sets + - **Hierarchical** labeling of axes (possible to have multiple labels per + tick) + - Robust IO tools for loading data from **flat files** (CSV and delimited), + Excel files, databases, and saving / loading data from the ultrafast **HDF5 + format** + - **Time series**-specific functionality: date range generation and frequency + conversion, moving window statistics, moving window linear regressions, + date shifting and lagging, etc. + +Many of these principles are here to address the shortcomings frequently +experienced using other languages / scientific research environments. For data +scientists, working with data is typically divided into multiple stages: +munging and cleaning data, analyzing / modeling it, then organizing the results +of the analysis into a form suitable for plotting or tabular display. pandas +is the ideal tool for all of these tasks. + +Some other notes + + - pandas is **fast**. Many of the low-level algorithmic bits have been + extensively tweaked in `Cython `__ code. However, as with + anything else generalization usually sacrifices performance. So if you focus + on one feature for your application you may be able to create a faster + specialized tool. + + - pandas is a dependency of `statsmodels + `__, making it an important part of the + statistical computing ecosystem in Python. + + - pandas has been used extensively in production in financial applications. Data Structures --------------- @@ -119,5 +174,5 @@ The information about current institutional partners can be found on `pandas web License ------- -.. literalinclude:: ../../LICENSE +.. literalinclude:: ../../../LICENSE diff --git a/doc/source/tutorials.rst b/doc/source/getting_started/tutorials.rst similarity index 100% rename from doc/source/tutorials.rst rename to doc/source/getting_started/tutorials.rst diff --git a/doc/source/index.rst.template b/doc/source/index.rst.template index b85150c3444b7..d04e9194e71dc 100644 --- a/doc/source/index.rst.template +++ b/doc/source/index.rst.template @@ -1,168 +1,54 @@ .. pandas documentation master file, created by +.. module:: pandas + ********************************************* pandas: powerful Python data analysis toolkit ********************************************* -`PDF Version `__ - -`Zipped HTML `__ - -.. module:: pandas - **Date**: |today| **Version**: |version| -**Binary Installers:** https://pypi.org/project/pandas - -**Source Repository:** https://github.com/pandas-dev/pandas - -**Issues & Ideas:** https://github.com/pandas-dev/pandas/issues - -**Q&A Support:** https://stackoverflow.com/questions/tagged/pandas - -**Developer Mailing List:** https://groups.google.com/forum/#!forum/pydata - -**pandas** is a `Python `__ package providing fast, -flexible, and expressive data structures designed to make working with -"relational" or "labeled" data both easy and intuitive. It aims to be the -fundamental high-level building block for doing practical, **real world** data -analysis in Python. Additionally, it has the broader goal of becoming **the -most powerful and flexible open source data analysis / manipulation tool -available in any language**. It is already well on its way toward this goal. - -pandas is well suited for many different kinds of data: - - - Tabular data with heterogeneously-typed columns, as in an SQL table or - Excel spreadsheet - - Ordered and unordered (not necessarily fixed-frequency) time series data. - - Arbitrary matrix data (homogeneously typed or heterogeneous) with row and - column labels - - Any other form of observational / statistical data sets. The data actually - need not be labeled at all to be placed into a pandas data structure - -The two primary data structures of pandas, :class:`Series` (1-dimensional) -and :class:`DataFrame` (2-dimensional), handle the vast majority of typical use -cases in finance, statistics, social science, and many areas of -engineering. For R users, :class:`DataFrame` provides everything that R's -``data.frame`` provides and much more. pandas is built on top of `NumPy -`__ and is intended to integrate well within a scientific -computing environment with many other 3rd party libraries. - -Here are just a few of the things that pandas does well: - - - Easy handling of **missing data** (represented as NaN) in floating point as - well as non-floating point data - - Size mutability: columns can be **inserted and deleted** from DataFrame and - higher dimensional objects - - Automatic and explicit **data alignment**: objects can be explicitly - aligned to a set of labels, or the user can simply ignore the labels and - let `Series`, `DataFrame`, etc. automatically align the data for you in - computations - - Powerful, flexible **group by** functionality to perform - split-apply-combine operations on data sets, for both aggregating and - transforming data - - Make it **easy to convert** ragged, differently-indexed data in other - Python and NumPy data structures into DataFrame objects - - Intelligent label-based **slicing**, **fancy indexing**, and **subsetting** - of large data sets - - Intuitive **merging** and **joining** data sets - - Flexible **reshaping** and pivoting of data sets - - **Hierarchical** labeling of axes (possible to have multiple labels per - tick) - - Robust IO tools for loading data from **flat files** (CSV and delimited), - Excel files, databases, and saving / loading data from the ultrafast **HDF5 - format** - - **Time series**-specific functionality: date range generation and frequency - conversion, moving window statistics, moving window linear regressions, - date shifting and lagging, etc. - -Many of these principles are here to address the shortcomings frequently -experienced using other languages / scientific research environments. For data -scientists, working with data is typically divided into multiple stages: -munging and cleaning data, analyzing / modeling it, then organizing the results -of the analysis into a form suitable for plotting or tabular display. pandas -is the ideal tool for all of these tasks. - -Some other notes - - - pandas is **fast**. Many of the low-level algorithmic bits have been - extensively tweaked in `Cython `__ code. However, as with - anything else generalization usually sacrifices performance. So if you focus - on one feature for your application you may be able to create a faster - specialized tool. - - - pandas is a dependency of `statsmodels - `__, making it an important part of the - statistical computing ecosystem in Python. - - - pandas has been used extensively in production in financial applications. - -.. note:: +**Download documentation**: `PDF Version `__ | `Zipped HTML `__ - This documentation assumes general familiarity with NumPy. If you haven't - used NumPy much or at all, do invest some time in `learning about NumPy - `__ first. +**Useful links**: +`Binary Installers `__ | +`Source Repository `__ | +`Issues & Ideas `__ | +`Q&A Support `__ | +`Mailing List `__ -See the package overview for more detail about what's in the library. +:mod:`pandas` is an open source, BSD-licensed library providing high-performance, +easy-to-use data structures and data analysis tools for the `Python `__ +programming language. +See the :ref:`overview` for more detail about what's in the library. {% if single_doc and single_doc.endswith('.rst') -%} .. toctree:: - :maxdepth: 4 + :maxdepth: 2 {{ single_doc[:-4] }} {% elif single_doc %} .. autosummary:: - :toctree: api/generated/ + :toctree: reference/api/ {{ single_doc }} {% else -%} .. toctree:: - :maxdepth: 4 + :maxdepth: 2 {% endif %} {% if not single_doc -%} - What's New + What's New in 0.25.0 install - contributing - overview - 10min - tutorials - cookbook - dsintro - basics - text - options - indexing - advanced - computation - missing_data - groupby - merging - reshaping - timeseries - timedeltas - categorical - integer_na - visualization - style - io - enhancingperf - sparse - gotchas - r_interface + getting_started/index + user_guide/index ecosystem - comparison_with_r - comparison_with_sql - comparison_with_sas - comparison_with_stata {% endif -%} {% if include_api -%} - api/index + reference/index {% endif -%} {% if not single_doc -%} - developer - internals - extending + development/index whatsnew/index {% endif -%} diff --git a/doc/source/r_interface.rst b/doc/source/r_interface.rst deleted file mode 100644 index 9839bba4884d4..0000000000000 --- a/doc/source/r_interface.rst +++ /dev/null @@ -1,94 +0,0 @@ -.. _rpy: - -{{ header }} - -****************** -rpy2 / R interface -****************** - -.. warning:: - - Up to pandas 0.19, a ``pandas.rpy`` module existed with functionality to - convert between pandas and ``rpy2`` objects. This functionality now lives in - the `rpy2 `__ project itself. - See the `updating section `__ - of the previous documentation for a guide to port your code from the - removed ``pandas.rpy`` to ``rpy2`` functions. - - -`rpy2 `__ is an interface to R running embedded in a Python process, and also includes functionality to deal with pandas DataFrames. -Converting data frames back and forth between rpy2 and pandas should be largely -automated (no need to convert explicitly, it will be done on the fly in most -rpy2 functions). -To convert explicitly, the functions are ``pandas2ri.py2ri()`` and -``pandas2ri.ri2py()``. - - -See also the documentation of the `rpy2 `__ project: https://rpy2.readthedocs.io. - -In the remainder of this page, a few examples of explicit conversion is given. The pandas conversion of rpy2 needs first to be activated: - -.. ipython:: - :verbatim: - - In [1]: from rpy2.robjects import pandas2ri - ...: pandas2ri.activate() - -Transferring R data sets into Python ------------------------------------- - -Once the pandas conversion is activated (``pandas2ri.activate()``), many conversions -of R to pandas objects will be done automatically. For example, to obtain the 'iris' dataset as a pandas DataFrame: - -.. ipython:: - :verbatim: - - In [2]: from rpy2.robjects import r - - In [3]: r.data('iris') - - In [4]: r['iris'].head() - Out[4]: - Sepal.Length Sepal.Width Petal.Length Petal.Width Species - 0 5.1 3.5 1.4 0.2 setosa - 1 4.9 3.0 1.4 0.2 setosa - 2 4.7 3.2 1.3 0.2 setosa - 3 4.6 3.1 1.5 0.2 setosa - 4 5.0 3.6 1.4 0.2 setosa - -If the pandas conversion was not activated, the above could also be accomplished -by explicitly converting it with the ``pandas2ri.ri2py`` function -(``pandas2ri.ri2py(r['iris'])``). - -Converting DataFrames into R objects ------------------------------------- - -The ``pandas2ri.py2ri`` function support the reverse operation to convert -DataFrames into the equivalent R object (that is, **data.frame**): - -.. ipython:: - :verbatim: - - In [5]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}, - ...: index=["one", "two", "three"]) - - In [6]: r_dataframe = pandas2ri.py2ri(df) - - In [7]: print(type(r_dataframe)) - Out[7]: - - In [8]: print(r_dataframe) - Out[8]: - A B C - one 1 4 7 - two 2 5 8 - three 3 6 9 - - -The DataFrame's index is stored as the ``rownames`` attribute of the -data.frame instance. - - -.. - Calling R functions with pandas objects - High-level interface to R estimators diff --git a/doc/source/api/arrays.rst b/doc/source/reference/arrays.rst similarity index 92% rename from doc/source/api/arrays.rst rename to doc/source/reference/arrays.rst index 5ecc5181af22c..1dc74ad83b7e6 100644 --- a/doc/source/api/arrays.rst +++ b/doc/source/reference/arrays.rst @@ -31,7 +31,7 @@ The top-level :meth:`array` method can be used to create a new array, which may stored in a :class:`Series`, :class:`Index`, or as a column in a :class:`DataFrame`. .. autosummary:: - :toctree: generated/ + :toctree: api/ array @@ -48,14 +48,14 @@ or timezone-aware values. scalar type for timezone-naive or timezone-aware datetime data. .. autosummary:: - :toctree: generated/ + :toctree: api/ Timestamp Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Timestamp.asm8 Timestamp.day @@ -91,7 +91,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Timestamp.astimezone Timestamp.ceil @@ -142,7 +142,7 @@ is used. If the data are tz-aware, then every value in the array must have the same timezone. .. autosummary:: - :toctree: generated/ + :toctree: api/ arrays.DatetimeArray DatetimeTZDtype @@ -156,14 +156,14 @@ NumPy can natively represent timedeltas. Pandas provides :class:`Timedelta` for symmetry with :class:`Timestamp`. .. autosummary:: - :toctree: generated/ + :toctree: api/ Timedelta Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Timedelta.asm8 Timedelta.components @@ -183,7 +183,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Timedelta.ceil Timedelta.floor @@ -196,7 +196,7 @@ Methods A collection of timedeltas may be stored in a :class:`TimedeltaArray`. .. autosummary:: - :toctree: generated/ + :toctree: api/ arrays.TimedeltaArray @@ -210,14 +210,14 @@ Pandas represents spans of times as :class:`Period` objects. Period ------ .. autosummary:: - :toctree: generated/ + :toctree: api/ Period Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Period.day Period.dayofweek @@ -244,7 +244,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Period.asfreq Period.now @@ -255,7 +255,7 @@ A collection of timedeltas may be stored in a :class:`arrays.PeriodArray`. Every period in a ``PeriodArray`` must have the same ``freq``. .. autosummary:: - :toctree: generated/ + :toctree: api/ arrays.DatetimeArray PeriodDtype @@ -268,14 +268,14 @@ Interval Data Arbitrary intervals can be represented as :class:`Interval` objects. .. autosummary:: - :toctree: generated/ + :toctree: api/ Interval Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Interval.closed Interval.closed_left @@ -288,12 +288,12 @@ Properties Interval.overlaps Interval.right -A collection of intervals may be stored in an :class:`IntervalArray`. +A collection of intervals may be stored in an :class:`arrays.IntervalArray`. .. autosummary:: - :toctree: generated/ + :toctree: api/ - IntervalArray + arrays.IntervalArray IntervalDtype .. _api.arrays.integer_na: @@ -305,7 +305,7 @@ Nullable Integer Pandas provides this through :class:`arrays.IntegerArray`. .. autosummary:: - :toctree: generated/ + :toctree: api/ arrays.IntegerArray Int8Dtype @@ -327,13 +327,13 @@ limited, fixed set of values. The dtype of a ``Categorical`` can be described by a :class:`pandas.api.types.CategoricalDtype`. .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst CategoricalDtype .. autosummary:: - :toctree: generated/ + :toctree: api/ CategoricalDtype.categories CategoricalDtype.ordered @@ -341,7 +341,7 @@ a :class:`pandas.api.types.CategoricalDtype`. Categorical data can be stored in a :class:`pandas.Categorical` .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst Categorical @@ -350,14 +350,14 @@ The alternative :meth:`Categorical.from_codes` constructor can be used when you have the categories and integer codes already: .. autosummary:: - :toctree: generated/ + :toctree: api/ Categorical.from_codes The dtype information is available on the ``Categorical`` .. autosummary:: - :toctree: generated/ + :toctree: api/ Categorical.dtype Categorical.categories @@ -368,7 +368,7 @@ The dtype information is available on the ``Categorical`` the Categorical back to a NumPy array, so categories and order information is not preserved! .. autosummary:: - :toctree: generated/ + :toctree: api/ Categorical.__array__ @@ -391,7 +391,7 @@ Data where a single value is repeated many times (e.g. ``0`` or ``NaN``) may be stored efficiently as a :class:`SparseArray`. .. autosummary:: - :toctree: generated/ + :toctree: api/ SparseArray SparseDtype diff --git a/doc/source/api/extensions.rst b/doc/source/reference/extensions.rst similarity index 95% rename from doc/source/api/extensions.rst rename to doc/source/reference/extensions.rst index 3972354ff9651..6146e34fab274 100644 --- a/doc/source/api/extensions.rst +++ b/doc/source/reference/extensions.rst @@ -11,7 +11,7 @@ These are primarily intended for library authors looking to extend pandas objects. .. autosummary:: - :toctree: generated/ + :toctree: api/ api.extensions.register_extension_dtype api.extensions.register_dataframe_accessor diff --git a/doc/source/api/frame.rst b/doc/source/reference/frame.rst similarity index 93% rename from doc/source/api/frame.rst rename to doc/source/reference/frame.rst index de16d59fe7c40..568acd5207bd1 100644 --- a/doc/source/api/frame.rst +++ b/doc/source/reference/frame.rst @@ -10,7 +10,7 @@ DataFrame Constructor ~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame @@ -19,13 +19,13 @@ Attributes and underlying data **Axes** .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.index DataFrame.columns .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.dtypes DataFrame.ftypes @@ -45,7 +45,7 @@ Attributes and underlying data Conversion ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.astype DataFrame.convert_objects @@ -58,7 +58,7 @@ Conversion Indexing, iteration ~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.head DataFrame.at @@ -88,7 +88,7 @@ For more information on ``.at``, ``.iat``, ``.loc``, and Binary operator functions ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.add DataFrame.sub @@ -119,7 +119,7 @@ Binary operator functions Function application, GroupBy & Window ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.apply DataFrame.applymap @@ -137,7 +137,7 @@ Function application, GroupBy & Window Computations / Descriptive Stats ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.abs DataFrame.all @@ -181,7 +181,7 @@ Computations / Descriptive Stats Reindexing / Selection / Label manipulation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.add_prefix DataFrame.add_suffix @@ -217,7 +217,7 @@ Reindexing / Selection / Label manipulation Missing data handling ~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.dropna DataFrame.fillna @@ -227,7 +227,7 @@ Missing data handling Reshaping, sorting, transposing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.droplevel DataFrame.pivot @@ -251,7 +251,7 @@ Reshaping, sorting, transposing Combining / joining / merging ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.append DataFrame.assign @@ -262,7 +262,7 @@ Combining / joining / merging Time series-related ~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.asfreq DataFrame.asof @@ -285,13 +285,13 @@ Plotting specific plotting methods of the form ``DataFrame.plot.``. .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_callable.rst DataFrame.plot .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_method.rst DataFrame.plot.area @@ -307,7 +307,7 @@ specific plotting methods of the form ``DataFrame.plot.``. DataFrame.plot.scatter .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.boxplot DataFrame.hist @@ -315,7 +315,7 @@ specific plotting methods of the form ``DataFrame.plot.``. Serialization / IO / Conversion ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrame.from_csv DataFrame.from_dict @@ -346,6 +346,6 @@ Serialization / IO / Conversion Sparse ~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ SparseDataFrame.to_coo diff --git a/doc/source/api/general_functions.rst b/doc/source/reference/general_functions.rst similarity index 84% rename from doc/source/api/general_functions.rst rename to doc/source/reference/general_functions.rst index cef5d8cac6abc..b5832cb8aa591 100644 --- a/doc/source/api/general_functions.rst +++ b/doc/source/reference/general_functions.rst @@ -10,7 +10,7 @@ General functions Data manipulations ~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ melt pivot @@ -30,7 +30,7 @@ Data manipulations Top-level missing data ~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ isna isnull @@ -40,14 +40,14 @@ Top-level missing data Top-level conversions ~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ to_numeric Top-level dealing with datetimelike ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ to_datetime to_timedelta @@ -60,21 +60,21 @@ Top-level dealing with datetimelike Top-level dealing with intervals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ interval_range Top-level evaluation ~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ eval Hashing ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ util.hash_array util.hash_pandas_object @@ -82,6 +82,6 @@ Hashing Testing ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ test diff --git a/doc/source/api/general_utility_functions.rst b/doc/source/reference/general_utility_functions.rst similarity index 93% rename from doc/source/api/general_utility_functions.rst rename to doc/source/reference/general_utility_functions.rst index e151f8f57ed5e..9c69770c0f1b7 100644 --- a/doc/source/api/general_utility_functions.rst +++ b/doc/source/reference/general_utility_functions.rst @@ -10,7 +10,7 @@ General utility functions Working with options -------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ describe_option reset_option @@ -21,7 +21,7 @@ Working with options Testing functions ----------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ testing.assert_frame_equal testing.assert_series_equal @@ -30,7 +30,7 @@ Testing functions Exceptions and warnings ----------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ errors.DtypeWarning errors.EmptyDataError @@ -44,7 +44,7 @@ Exceptions and warnings Data types related functionality -------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ api.types.union_categoricals api.types.infer_dtype @@ -53,7 +53,7 @@ Data types related functionality Dtype introspection ~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ api.types.is_bool_dtype api.types.is_categorical_dtype @@ -81,7 +81,7 @@ Dtype introspection Iterable introspection ~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ api.types.is_dict_like api.types.is_file_like @@ -92,7 +92,7 @@ Iterable introspection Scalar introspection ~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ api.types.is_bool api.types.is_categorical diff --git a/doc/source/api/groupby.rst b/doc/source/reference/groupby.rst similarity index 94% rename from doc/source/api/groupby.rst rename to doc/source/reference/groupby.rst index d67c7e0889522..6ed85ff2fac43 100644 --- a/doc/source/api/groupby.rst +++ b/doc/source/reference/groupby.rst @@ -12,7 +12,7 @@ GroupBy objects are returned by groupby calls: :func:`pandas.DataFrame.groupby`, Indexing, iteration ------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ GroupBy.__iter__ GroupBy.groups @@ -22,7 +22,7 @@ Indexing, iteration .. currentmodule:: pandas .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst Grouper @@ -32,7 +32,7 @@ Indexing, iteration Function application -------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ GroupBy.apply GroupBy.agg @@ -43,7 +43,7 @@ Function application Computations / Descriptive Stats -------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ GroupBy.all GroupBy.any @@ -78,7 +78,7 @@ axis argument, and often an argument indicating whether to restrict application to columns of a specific data type. .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrameGroupBy.all DataFrameGroupBy.any @@ -113,7 +113,7 @@ application to columns of a specific data type. The following methods are available only for ``SeriesGroupBy`` objects. .. autosummary:: - :toctree: generated/ + :toctree: api/ SeriesGroupBy.nlargest SeriesGroupBy.nsmallest @@ -126,7 +126,7 @@ The following methods are available only for ``SeriesGroupBy`` objects. The following methods are available only for ``DataFrameGroupBy`` objects. .. autosummary:: - :toctree: generated/ + :toctree: api/ DataFrameGroupBy.corrwith DataFrameGroupBy.boxplot diff --git a/doc/source/api/index.rst b/doc/source/reference/index.rst similarity index 56% rename from doc/source/api/index.rst rename to doc/source/reference/index.rst index e4d118e278128..ef4676054473a 100644 --- a/doc/source/api/index.rst +++ b/doc/source/reference/index.rst @@ -44,31 +44,31 @@ public functions related to data types in pandas. .. toctree:: :hidden: - generated/pandas.DataFrame.blocks - generated/pandas.DataFrame.as_matrix - generated/pandas.DataFrame.ix - generated/pandas.Index.asi8 - generated/pandas.Index.data - generated/pandas.Index.flags - generated/pandas.Index.holds_integer - generated/pandas.Index.is_type_compatible - generated/pandas.Index.nlevels - generated/pandas.Index.sort - generated/pandas.Panel.agg - generated/pandas.Panel.aggregate - generated/pandas.Panel.blocks - generated/pandas.Panel.empty - generated/pandas.Panel.is_copy - generated/pandas.Panel.items - generated/pandas.Panel.ix - generated/pandas.Panel.major_axis - generated/pandas.Panel.minor_axis - generated/pandas.Series.asobject - generated/pandas.Series.blocks - generated/pandas.Series.from_array - generated/pandas.Series.ix - generated/pandas.Series.imag - generated/pandas.Series.real + api/pandas.DataFrame.blocks + api/pandas.DataFrame.as_matrix + api/pandas.DataFrame.ix + api/pandas.Index.asi8 + api/pandas.Index.data + api/pandas.Index.flags + api/pandas.Index.holds_integer + api/pandas.Index.is_type_compatible + api/pandas.Index.nlevels + api/pandas.Index.sort + api/pandas.Panel.agg + api/pandas.Panel.aggregate + api/pandas.Panel.blocks + api/pandas.Panel.empty + api/pandas.Panel.is_copy + api/pandas.Panel.items + api/pandas.Panel.ix + api/pandas.Panel.major_axis + api/pandas.Panel.minor_axis + api/pandas.Series.asobject + api/pandas.Series.blocks + api/pandas.Series.from_array + api/pandas.Series.ix + api/pandas.Series.imag + api/pandas.Series.real .. Can't convince sphinx to generate toctree for this class attribute. @@ -77,4 +77,4 @@ public functions related to data types in pandas. .. toctree:: :hidden: - generated/pandas.api.extensions.ExtensionDtype.na_value + api/pandas.api.extensions.ExtensionDtype.na_value diff --git a/doc/source/api/indexing.rst b/doc/source/reference/indexing.rst similarity index 91% rename from doc/source/api/indexing.rst rename to doc/source/reference/indexing.rst index d27b05322c1f2..680cb7e3dac91 100644 --- a/doc/source/api/indexing.rst +++ b/doc/source/reference/indexing.rst @@ -15,14 +15,14 @@ that contain an index (Series/DataFrame) and those should most likely be used before calling these methods directly.** .. autosummary:: - :toctree: generated/ + :toctree: api/ Index Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.values Index.is_monotonic @@ -51,7 +51,7 @@ Properties Modifying and Computations ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.all Index.any @@ -90,7 +90,7 @@ Modifying and Computations Compatibility with MultiIndex ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.set_names Index.is_lexsorted_for_tuple @@ -99,7 +99,7 @@ Compatibility with MultiIndex Missing Values ~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.fillna Index.dropna @@ -109,7 +109,7 @@ Missing Values Conversion ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.astype Index.item @@ -124,7 +124,7 @@ Conversion Sorting ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.argsort Index.searchsorted @@ -133,14 +133,14 @@ Sorting Time-specific operations ~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.shift Combining / joining / set operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.append Index.join @@ -152,7 +152,7 @@ Combining / joining / set operations Selecting ~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Index.asof Index.asof_locs @@ -176,7 +176,7 @@ Selecting Numeric Index ------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst RangeIndex @@ -188,7 +188,7 @@ Numeric Index .. Separate block, since they aren't classes. .. autosummary:: - :toctree: generated/ + :toctree: api/ RangeIndex.from_range @@ -197,7 +197,7 @@ Numeric Index CategoricalIndex ---------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst CategoricalIndex @@ -205,7 +205,7 @@ CategoricalIndex Categorical Components ~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CategoricalIndex.codes CategoricalIndex.categories @@ -222,7 +222,7 @@ Categorical Components Modifying and Computations ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CategoricalIndex.map CategoricalIndex.equals @@ -232,7 +232,7 @@ Modifying and Computations IntervalIndex ------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst IntervalIndex @@ -240,7 +240,7 @@ IntervalIndex IntervalIndex Components ~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ IntervalIndex.from_arrays IntervalIndex.from_tuples @@ -265,20 +265,20 @@ IntervalIndex Components MultiIndex ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst MultiIndex .. autosummary:: - :toctree: generated/ + :toctree: api/ IndexSlice MultiIndex Constructors ~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MultiIndex.from_arrays MultiIndex.from_tuples @@ -288,7 +288,7 @@ MultiIndex Constructors MultiIndex Properties ~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MultiIndex.names MultiIndex.levels @@ -299,7 +299,7 @@ MultiIndex Properties MultiIndex Components ~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MultiIndex.set_levels MultiIndex.set_codes @@ -316,7 +316,7 @@ MultiIndex Components MultiIndex Selecting ~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MultiIndex.get_loc MultiIndex.get_loc_level @@ -328,7 +328,7 @@ MultiIndex Selecting DatetimeIndex ------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst DatetimeIndex @@ -336,7 +336,7 @@ DatetimeIndex Time/Date Components ~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DatetimeIndex.year DatetimeIndex.month @@ -370,7 +370,7 @@ Time/Date Components Selecting ~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DatetimeIndex.indexer_at_time DatetimeIndex.indexer_between_time @@ -379,7 +379,7 @@ Selecting Time-specific operations ~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DatetimeIndex.normalize DatetimeIndex.strftime @@ -395,7 +395,7 @@ Time-specific operations Conversion ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DatetimeIndex.to_period DatetimeIndex.to_perioddelta @@ -406,7 +406,7 @@ Conversion TimedeltaIndex -------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst TimedeltaIndex @@ -414,7 +414,7 @@ TimedeltaIndex Components ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ TimedeltaIndex.days TimedeltaIndex.seconds @@ -426,7 +426,7 @@ Components Conversion ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ TimedeltaIndex.to_pytimedelta TimedeltaIndex.to_series @@ -440,7 +440,7 @@ Conversion PeriodIndex ----------- .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst PeriodIndex @@ -448,7 +448,7 @@ PeriodIndex Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ PeriodIndex.day PeriodIndex.dayofweek @@ -474,7 +474,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ PeriodIndex.asfreq PeriodIndex.strftime diff --git a/doc/source/api/io.rst b/doc/source/reference/io.rst similarity index 78% rename from doc/source/api/io.rst rename to doc/source/reference/io.rst index f2060b7c05413..9c776e3ff8a82 100644 --- a/doc/source/api/io.rst +++ b/doc/source/reference/io.rst @@ -10,14 +10,14 @@ Input/Output Pickling ~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_pickle Flat File ~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_table read_csv @@ -27,20 +27,20 @@ Flat File Clipboard ~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_clipboard Excel ~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_excel ExcelFile.parse .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/class_without_autosummary.rst ExcelWriter @@ -48,14 +48,14 @@ Excel JSON ~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_json .. currentmodule:: pandas.io.json .. autosummary:: - :toctree: generated/ + :toctree: api/ json_normalize build_table_schema @@ -65,14 +65,14 @@ JSON HTML ~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_html HDFStore: PyTables (HDF5) ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_hdf HDFStore.put @@ -87,28 +87,28 @@ HDFStore: PyTables (HDF5) Feather ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_feather Parquet ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_parquet SAS ~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_sas SQL ~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_sql_table read_sql_query @@ -117,21 +117,21 @@ SQL Google BigQuery ~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_gbq STATA ~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ read_stata .. currentmodule:: pandas.io.stata .. autosummary:: - :toctree: generated/ + :toctree: api/ StataReader.data StataReader.data_label diff --git a/doc/source/api/offset_frequency.rst b/doc/source/reference/offset_frequency.rst similarity index 84% rename from doc/source/api/offset_frequency.rst rename to doc/source/reference/offset_frequency.rst index 42894fe8d7f2f..ccc1c7e171d22 100644 --- a/doc/source/api/offset_frequency.rst +++ b/doc/source/reference/offset_frequency.rst @@ -10,14 +10,14 @@ Date Offsets DateOffset ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ DateOffset Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DateOffset.freqstr DateOffset.kwds @@ -29,7 +29,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ DateOffset.apply DateOffset.copy @@ -39,14 +39,14 @@ Methods BusinessDay ----------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessDay Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessDay.freqstr BusinessDay.kwds @@ -58,7 +58,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessDay.apply BusinessDay.apply_index @@ -69,14 +69,14 @@ Methods BusinessHour ------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessHour Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessHour.freqstr BusinessHour.kwds @@ -88,7 +88,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessHour.apply BusinessHour.copy @@ -98,14 +98,14 @@ Methods CustomBusinessDay ----------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessDay Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessDay.freqstr CustomBusinessDay.kwds @@ -117,7 +117,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessDay.apply CustomBusinessDay.copy @@ -127,14 +127,14 @@ Methods CustomBusinessHour ------------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessHour Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessHour.freqstr CustomBusinessHour.kwds @@ -146,7 +146,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessHour.apply CustomBusinessHour.copy @@ -156,14 +156,14 @@ Methods MonthOffset ----------- .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthOffset Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthOffset.freqstr MonthOffset.kwds @@ -175,7 +175,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthOffset.apply MonthOffset.apply_index @@ -186,14 +186,14 @@ Methods MonthEnd -------- .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthEnd.freqstr MonthEnd.kwds @@ -205,7 +205,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthEnd.apply MonthEnd.apply_index @@ -216,14 +216,14 @@ Methods MonthBegin ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthBegin.freqstr MonthBegin.kwds @@ -235,7 +235,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ MonthBegin.apply MonthBegin.apply_index @@ -246,14 +246,14 @@ Methods BusinessMonthEnd ---------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessMonthEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessMonthEnd.freqstr BusinessMonthEnd.kwds @@ -265,7 +265,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessMonthEnd.apply BusinessMonthEnd.apply_index @@ -276,14 +276,14 @@ Methods BusinessMonthBegin ------------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessMonthBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessMonthBegin.freqstr BusinessMonthBegin.kwds @@ -295,7 +295,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BusinessMonthBegin.apply BusinessMonthBegin.apply_index @@ -306,14 +306,14 @@ Methods CustomBusinessMonthEnd ---------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessMonthEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessMonthEnd.freqstr CustomBusinessMonthEnd.kwds @@ -326,7 +326,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessMonthEnd.apply CustomBusinessMonthEnd.copy @@ -336,14 +336,14 @@ Methods CustomBusinessMonthBegin ------------------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessMonthBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessMonthBegin.freqstr CustomBusinessMonthBegin.kwds @@ -356,7 +356,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CustomBusinessMonthBegin.apply CustomBusinessMonthBegin.copy @@ -366,14 +366,14 @@ Methods SemiMonthOffset --------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthOffset Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthOffset.freqstr SemiMonthOffset.kwds @@ -385,7 +385,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthOffset.apply SemiMonthOffset.apply_index @@ -396,14 +396,14 @@ Methods SemiMonthEnd ------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthEnd.freqstr SemiMonthEnd.kwds @@ -415,7 +415,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthEnd.apply SemiMonthEnd.apply_index @@ -426,14 +426,14 @@ Methods SemiMonthBegin -------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthBegin.freqstr SemiMonthBegin.kwds @@ -445,7 +445,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ SemiMonthBegin.apply SemiMonthBegin.apply_index @@ -456,14 +456,14 @@ Methods Week ---- .. autosummary:: - :toctree: generated/ + :toctree: api/ Week Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Week.freqstr Week.kwds @@ -475,7 +475,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Week.apply Week.apply_index @@ -486,14 +486,14 @@ Methods WeekOfMonth ----------- .. autosummary:: - :toctree: generated/ + :toctree: api/ WeekOfMonth Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ WeekOfMonth.freqstr WeekOfMonth.kwds @@ -505,7 +505,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ WeekOfMonth.apply WeekOfMonth.copy @@ -515,14 +515,14 @@ Methods LastWeekOfMonth --------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ LastWeekOfMonth Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ LastWeekOfMonth.freqstr LastWeekOfMonth.kwds @@ -534,7 +534,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ LastWeekOfMonth.apply LastWeekOfMonth.copy @@ -544,14 +544,14 @@ Methods QuarterOffset ------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterOffset Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterOffset.freqstr QuarterOffset.kwds @@ -563,7 +563,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterOffset.apply QuarterOffset.apply_index @@ -574,14 +574,14 @@ Methods BQuarterEnd ----------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BQuarterEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BQuarterEnd.freqstr BQuarterEnd.kwds @@ -593,7 +593,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BQuarterEnd.apply BQuarterEnd.apply_index @@ -604,14 +604,14 @@ Methods BQuarterBegin ------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BQuarterBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BQuarterBegin.freqstr BQuarterBegin.kwds @@ -623,7 +623,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BQuarterBegin.apply BQuarterBegin.apply_index @@ -634,14 +634,14 @@ Methods QuarterEnd ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterEnd.freqstr QuarterEnd.kwds @@ -653,7 +653,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterEnd.apply QuarterEnd.apply_index @@ -664,14 +664,14 @@ Methods QuarterBegin ------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterBegin.freqstr QuarterBegin.kwds @@ -683,7 +683,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ QuarterBegin.apply QuarterBegin.apply_index @@ -694,14 +694,14 @@ Methods YearOffset ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ YearOffset Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ YearOffset.freqstr YearOffset.kwds @@ -713,7 +713,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ YearOffset.apply YearOffset.apply_index @@ -724,14 +724,14 @@ Methods BYearEnd -------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BYearEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BYearEnd.freqstr BYearEnd.kwds @@ -743,7 +743,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BYearEnd.apply BYearEnd.apply_index @@ -754,14 +754,14 @@ Methods BYearBegin ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BYearBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BYearBegin.freqstr BYearBegin.kwds @@ -773,7 +773,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BYearBegin.apply BYearBegin.apply_index @@ -784,14 +784,14 @@ Methods YearEnd ------- .. autosummary:: - :toctree: generated/ + :toctree: api/ YearEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ YearEnd.freqstr YearEnd.kwds @@ -803,7 +803,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ YearEnd.apply YearEnd.apply_index @@ -814,14 +814,14 @@ Methods YearBegin --------- .. autosummary:: - :toctree: generated/ + :toctree: api/ YearBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ YearBegin.freqstr YearBegin.kwds @@ -833,7 +833,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ YearBegin.apply YearBegin.apply_index @@ -844,14 +844,14 @@ Methods FY5253 ------ .. autosummary:: - :toctree: generated/ + :toctree: api/ FY5253 Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ FY5253.freqstr FY5253.kwds @@ -863,7 +863,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ FY5253.apply FY5253.copy @@ -875,14 +875,14 @@ Methods FY5253Quarter ------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ FY5253Quarter Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ FY5253Quarter.freqstr FY5253Quarter.kwds @@ -894,7 +894,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ FY5253Quarter.apply FY5253Quarter.copy @@ -906,14 +906,14 @@ Methods Easter ------ .. autosummary:: - :toctree: generated/ + :toctree: api/ Easter Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Easter.freqstr Easter.kwds @@ -925,7 +925,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Easter.apply Easter.copy @@ -935,14 +935,14 @@ Methods Tick ---- .. autosummary:: - :toctree: generated/ + :toctree: api/ Tick Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Tick.delta Tick.freqstr @@ -955,7 +955,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Tick.copy Tick.isAnchored @@ -964,14 +964,14 @@ Methods Day --- .. autosummary:: - :toctree: generated/ + :toctree: api/ Day Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Day.delta Day.freqstr @@ -984,7 +984,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Day.copy Day.isAnchored @@ -993,14 +993,14 @@ Methods Hour ---- .. autosummary:: - :toctree: generated/ + :toctree: api/ Hour Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Hour.delta Hour.freqstr @@ -1013,7 +1013,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Hour.copy Hour.isAnchored @@ -1022,14 +1022,14 @@ Methods Minute ------ .. autosummary:: - :toctree: generated/ + :toctree: api/ Minute Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Minute.delta Minute.freqstr @@ -1042,7 +1042,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Minute.copy Minute.isAnchored @@ -1051,14 +1051,14 @@ Methods Second ------ .. autosummary:: - :toctree: generated/ + :toctree: api/ Second Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Second.delta Second.freqstr @@ -1071,7 +1071,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Second.copy Second.isAnchored @@ -1080,14 +1080,14 @@ Methods Milli ----- .. autosummary:: - :toctree: generated/ + :toctree: api/ Milli Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Milli.delta Milli.freqstr @@ -1100,7 +1100,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Milli.copy Milli.isAnchored @@ -1109,14 +1109,14 @@ Methods Micro ----- .. autosummary:: - :toctree: generated/ + :toctree: api/ Micro Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Micro.delta Micro.freqstr @@ -1129,7 +1129,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Micro.copy Micro.isAnchored @@ -1138,14 +1138,14 @@ Methods Nano ---- .. autosummary:: - :toctree: generated/ + :toctree: api/ Nano Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Nano.delta Nano.freqstr @@ -1158,7 +1158,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Nano.copy Nano.isAnchored @@ -1167,14 +1167,14 @@ Methods BDay ---- .. autosummary:: - :toctree: generated/ + :toctree: api/ BDay Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BDay.base BDay.freqstr @@ -1188,7 +1188,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BDay.apply BDay.apply_index @@ -1201,14 +1201,14 @@ Methods BMonthEnd --------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BMonthEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BMonthEnd.base BMonthEnd.freqstr @@ -1221,7 +1221,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BMonthEnd.apply BMonthEnd.apply_index @@ -1234,14 +1234,14 @@ Methods BMonthBegin ----------- .. autosummary:: - :toctree: generated/ + :toctree: api/ BMonthBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BMonthBegin.base BMonthBegin.freqstr @@ -1254,7 +1254,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ BMonthBegin.apply BMonthBegin.apply_index @@ -1267,14 +1267,14 @@ Methods CBMonthEnd ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ CBMonthEnd Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CBMonthEnd.base CBMonthEnd.cbday_roll @@ -1291,7 +1291,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CBMonthEnd.apply CBMonthEnd.apply_index @@ -1304,14 +1304,14 @@ Methods CBMonthBegin ------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ CBMonthBegin Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CBMonthBegin.base CBMonthBegin.cbday_roll @@ -1328,7 +1328,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CBMonthBegin.apply CBMonthBegin.apply_index @@ -1341,14 +1341,14 @@ Methods CDay ---- .. autosummary:: - :toctree: generated/ + :toctree: api/ CDay Properties ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CDay.base CDay.freqstr @@ -1362,7 +1362,7 @@ Properties Methods ~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ CDay.apply CDay.apply_index @@ -1382,6 +1382,6 @@ Frequencies .. _api.offsets: .. autosummary:: - :toctree: generated/ + :toctree: api/ to_offset diff --git a/doc/source/api/panel.rst b/doc/source/reference/panel.rst similarity index 90% rename from doc/source/api/panel.rst rename to doc/source/reference/panel.rst index 4edcd22d2685d..39c8ba0828859 100644 --- a/doc/source/api/panel.rst +++ b/doc/source/reference/panel.rst @@ -10,7 +10,7 @@ Panel Constructor ~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel @@ -23,7 +23,7 @@ Properties and underlying data * **minor_axis**: axis 2; the columns of each of the DataFrames .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.values Panel.axes @@ -38,7 +38,7 @@ Properties and underlying data Conversion ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.astype Panel.copy @@ -48,7 +48,7 @@ Conversion Getting and setting ~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.get_value Panel.set_value @@ -56,7 +56,7 @@ Getting and setting Indexing, iteration, slicing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.at Panel.iat @@ -75,7 +75,7 @@ For more information on ``.at``, ``.iat``, ``.loc``, and Binary operator functions ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.add Panel.sub @@ -103,7 +103,7 @@ Binary operator functions Function application, GroupBy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.apply Panel.groupby @@ -113,7 +113,7 @@ Function application, GroupBy Computations / Descriptive Stats ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.abs Panel.clip @@ -139,7 +139,7 @@ Computations / Descriptive Stats Reindexing / Selection / Label manipulation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.add_prefix Panel.add_suffix @@ -160,14 +160,14 @@ Reindexing / Selection / Label manipulation Missing data handling ~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.dropna Reshaping, sorting, transposing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.sort_index Panel.swaplevel @@ -178,7 +178,7 @@ Reshaping, sorting, transposing Combining / joining / merging ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.join Panel.update @@ -186,7 +186,7 @@ Combining / joining / merging Time series-related ~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.asfreq Panel.shift @@ -197,7 +197,7 @@ Time series-related Serialization / IO / Conversion ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Panel.from_dict Panel.to_pickle diff --git a/doc/source/api/plotting.rst b/doc/source/reference/plotting.rst similarity index 93% rename from doc/source/api/plotting.rst rename to doc/source/reference/plotting.rst index c4e6333ebda37..7615e1d20f5e2 100644 --- a/doc/source/api/plotting.rst +++ b/doc/source/reference/plotting.rst @@ -10,7 +10,7 @@ Plotting The following functions are contained in the `pandas.plotting` module. .. autosummary:: - :toctree: generated/ + :toctree: api/ andrews_curves bootstrap_plot diff --git a/doc/source/api/resampling.rst b/doc/source/reference/resampling.rst similarity index 91% rename from doc/source/api/resampling.rst rename to doc/source/reference/resampling.rst index f5c6ccce3cdd7..2a52defa3c68f 100644 --- a/doc/source/api/resampling.rst +++ b/doc/source/reference/resampling.rst @@ -12,7 +12,7 @@ Resampler objects are returned by resample calls: :func:`pandas.DataFrame.resamp Indexing, iteration ~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Resampler.__iter__ Resampler.groups @@ -22,7 +22,7 @@ Indexing, iteration Function application ~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Resampler.apply Resampler.aggregate @@ -32,7 +32,7 @@ Function application Upsampling ~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Resampler.ffill Resampler.backfill @@ -46,7 +46,7 @@ Upsampling Computations / Descriptive Stats ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autosummary:: - :toctree: generated/ + :toctree: api/ Resampler.count Resampler.nunique diff --git a/doc/source/api/series.rst b/doc/source/reference/series.rst similarity index 93% rename from doc/source/api/series.rst rename to doc/source/reference/series.rst index aa43c8b643d44..a6ac40b5203bf 100644 --- a/doc/source/api/series.rst +++ b/doc/source/reference/series.rst @@ -10,7 +10,7 @@ Series Constructor ----------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series @@ -19,12 +19,12 @@ Attributes **Axes** .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.index .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.array Series.values @@ -52,7 +52,7 @@ Attributes Conversion ---------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.astype Series.infer_objects @@ -69,7 +69,7 @@ Conversion Indexing, iteration ------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.get Series.at @@ -90,7 +90,7 @@ For more information on ``.at``, ``.iat``, ``.loc``, and Binary operator functions ------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.add Series.sub @@ -123,7 +123,7 @@ Binary operator functions Function application, GroupBy & Window -------------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.apply Series.agg @@ -141,7 +141,7 @@ Function application, GroupBy & Window Computations / Descriptive Stats -------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.abs Series.all @@ -192,7 +192,7 @@ Computations / Descriptive Stats Reindexing / Selection / Label manipulation ------------------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.align Series.drop @@ -226,7 +226,7 @@ Reindexing / Selection / Label manipulation Missing data handling --------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.isna Series.notna @@ -237,7 +237,7 @@ Missing data handling Reshaping, sorting ------------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.argsort Series.argmin @@ -256,7 +256,7 @@ Reshaping, sorting Combining / joining / merging ----------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.append Series.replace @@ -265,7 +265,7 @@ Combining / joining / merging Time series-related ------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.asfreq Series.asof @@ -309,7 +309,7 @@ Datetime Properties ^^^^^^^^^^^^^^^^^^^ .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_attribute.rst Series.dt.date @@ -345,7 +345,7 @@ Datetime Methods ^^^^^^^^^^^^^^^^ .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_method.rst Series.dt.to_period @@ -364,7 +364,7 @@ Period Properties ^^^^^^^^^^^^^^^^^ .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_attribute.rst Series.dt.qyear @@ -375,7 +375,7 @@ Timedelta Properties ^^^^^^^^^^^^^^^^^^^^ .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_attribute.rst Series.dt.days @@ -388,7 +388,7 @@ Timedelta Methods ^^^^^^^^^^^^^^^^^ .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_method.rst Series.dt.to_pytimedelta @@ -405,7 +405,7 @@ strings and apply several methods to it. These can be accessed like ``Series.str.``. .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_method.rst Series.str.capitalize @@ -467,7 +467,7 @@ strings and apply several methods to it. These can be accessed like .. .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor.rst Series.str @@ -484,7 +484,7 @@ Categorical-dtype specific methods and attributes are available under the ``Series.cat`` accessor. .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_attribute.rst Series.cat.categories @@ -492,7 +492,7 @@ the ``Series.cat`` accessor. Series.cat.codes .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_method.rst Series.cat.rename_categories @@ -514,7 +514,7 @@ Sparse-dtype specific methods and attributes are provided under the ``Series.sparse`` accessor. .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_attribute.rst Series.sparse.npoints @@ -523,7 +523,7 @@ Sparse-dtype specific methods and attributes are provided under the Series.sparse.sp_values .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.sparse.from_coo Series.sparse.to_coo @@ -535,13 +535,13 @@ Plotting specific plotting methods of the form ``Series.plot.``. .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_callable.rst Series.plot .. autosummary:: - :toctree: generated/ + :toctree: api/ :template: autosummary/accessor_method.rst Series.plot.area @@ -555,14 +555,14 @@ specific plotting methods of the form ``Series.plot.``. Series.plot.pie .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.hist Serialization / IO / Conversion ------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Series.to_pickle Series.to_csv @@ -585,7 +585,7 @@ Sparse ------ .. autosummary:: - :toctree: generated/ + :toctree: api/ SparseSeries.to_coo SparseSeries.from_coo diff --git a/doc/source/api/style.rst b/doc/source/reference/style.rst similarity index 88% rename from doc/source/api/style.rst rename to doc/source/reference/style.rst index 70913bbec410d..bd9635b41e343 100644 --- a/doc/source/api/style.rst +++ b/doc/source/reference/style.rst @@ -12,7 +12,7 @@ Style Styler Constructor ------------------ .. autosummary:: - :toctree: generated/ + :toctree: api/ Styler Styler.from_custom_template @@ -20,7 +20,7 @@ Styler Constructor Styler Properties ----------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Styler.env Styler.template @@ -29,7 +29,7 @@ Styler Properties Style Application ----------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Styler.apply Styler.applymap @@ -47,7 +47,7 @@ Style Application Builtin Styles -------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Styler.highlight_max Styler.highlight_min @@ -58,7 +58,7 @@ Builtin Styles Style Export and Import ----------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Styler.render Styler.export diff --git a/doc/source/api/window.rst b/doc/source/reference/window.rst similarity index 95% rename from doc/source/api/window.rst rename to doc/source/reference/window.rst index 3245f5f831688..9e1374a3bd8e4 100644 --- a/doc/source/api/window.rst +++ b/doc/source/reference/window.rst @@ -14,7 +14,7 @@ EWM objects are returned by ``.ewm`` calls: :func:`pandas.DataFrame.ewm`, :func: Standard moving window functions -------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Rolling.count Rolling.sum @@ -39,7 +39,7 @@ Standard moving window functions Standard expanding window functions ----------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ Expanding.count Expanding.sum @@ -60,7 +60,7 @@ Standard expanding window functions Exponentially-weighted moving window functions ---------------------------------------------- .. autosummary:: - :toctree: generated/ + :toctree: api/ EWM.mean EWM.std diff --git a/doc/source/advanced.rst b/doc/source/user_guide/advanced.rst similarity index 100% rename from doc/source/advanced.rst rename to doc/source/user_guide/advanced.rst diff --git a/doc/source/categorical.rst b/doc/source/user_guide/categorical.rst similarity index 100% rename from doc/source/categorical.rst rename to doc/source/user_guide/categorical.rst diff --git a/doc/source/computation.rst b/doc/source/user_guide/computation.rst similarity index 100% rename from doc/source/computation.rst rename to doc/source/user_guide/computation.rst diff --git a/doc/source/cookbook.rst b/doc/source/user_guide/cookbook.rst similarity index 100% rename from doc/source/cookbook.rst rename to doc/source/user_guide/cookbook.rst diff --git a/doc/source/enhancingperf.rst b/doc/source/user_guide/enhancingperf.rst similarity index 99% rename from doc/source/enhancingperf.rst rename to doc/source/user_guide/enhancingperf.rst index 0e3d389aa4f6e..9941ffcc9de4d 100644 --- a/doc/source/enhancingperf.rst +++ b/doc/source/user_guide/enhancingperf.rst @@ -783,7 +783,7 @@ significant performance benefit. Here is a plot showing the running time of computation. The two lines are two different engines. -.. image:: _static/eval-perf.png +.. image:: ../_static/eval-perf.png .. note:: @@ -791,7 +791,7 @@ computation. The two lines are two different engines. Operations with smallish objects (around 15k-20k rows) are faster using plain Python: - .. image:: _static/eval-perf-small.png + .. image:: ../_static/eval-perf-small.png This plot was created using a ``DataFrame`` with 3 columns each containing diff --git a/doc/source/gotchas.rst b/doc/source/user_guide/gotchas.rst similarity index 100% rename from doc/source/gotchas.rst rename to doc/source/user_guide/gotchas.rst diff --git a/doc/source/groupby.rst b/doc/source/user_guide/groupby.rst similarity index 99% rename from doc/source/groupby.rst rename to doc/source/user_guide/groupby.rst index 953f40d1afebe..2c2e5c5425216 100644 --- a/doc/source/groupby.rst +++ b/doc/source/user_guide/groupby.rst @@ -15,7 +15,7 @@ steps: Out of these, the split step is the most straightforward. In fact, in many situations we may wish to split the data set into groups and do something with -those groups. In the apply step, we might wish to one of the +those groups. In the apply step, we might wish to do one of the following: * **Aggregation**: compute a summary statistic (or statistics) for each diff --git a/doc/source/user_guide/index.rst b/doc/source/user_guide/index.rst new file mode 100644 index 0000000000000..d39cf7103ab63 --- /dev/null +++ b/doc/source/user_guide/index.rst @@ -0,0 +1,40 @@ +{{ header }} + +.. _user_guide: + +========== +User Guide +========== + +The User Guide covers all of pandas by topic area. Each of the subsections +introduces a topic (such as "working with missing data"), and discusses how +pandas approaches the problem, with many examples throughout. + +Users brand-new to pandas should start with :ref:`10min`. + +Further information on any specific method can be obtained in the +:ref:`api`. + +.. toctree:: + :maxdepth: 2 + + io + indexing + advanced + merging + reshaping + text + missing_data + categorical + integer_na + visualization + computation + groupby + timeseries + timedeltas + style + options + enhancingperf + sparse + gotchas + cookbook diff --git a/doc/source/indexing.rst b/doc/source/user_guide/indexing.rst similarity index 99% rename from doc/source/indexing.rst rename to doc/source/user_guide/indexing.rst index 3fe416c48f670..be1745e2664a1 100644 --- a/doc/source/indexing.rst +++ b/doc/source/user_guide/indexing.rst @@ -1392,7 +1392,7 @@ Performance of :meth:`~pandas.DataFrame.query` ``DataFrame.query()`` using ``numexpr`` is slightly faster than Python for large frames. -.. image:: _static/query-perf.png +.. image:: ../_static/query-perf.png .. note:: @@ -1400,7 +1400,7 @@ large frames. with ``DataFrame.query()`` if your frame has more than approximately 200,000 rows. - .. image:: _static/query-perf-small.png + .. image:: ../_static/query-perf-small.png This plot was created using a ``DataFrame`` with 3 columns each containing floating point values generated using ``numpy.random.randn()``. diff --git a/doc/source/integer_na.rst b/doc/source/user_guide/integer_na.rst similarity index 95% rename from doc/source/integer_na.rst rename to doc/source/user_guide/integer_na.rst index eb0c5e3d05863..c5667e9319ca6 100644 --- a/doc/source/integer_na.rst +++ b/doc/source/user_guide/integer_na.rst @@ -10,6 +10,12 @@ Nullable Integer Data Type .. versionadded:: 0.24.0 +.. note:: + + IntegerArray is currently experimental. Its API or implementation may + change without warning. + + In :ref:`missing_data`, we saw that pandas primarily uses ``NaN`` to represent missing data. Because ``NaN`` is a float, this forces an array of integers with any missing values to become floating point. In some cases, this may not matter diff --git a/doc/source/io.rst b/doc/source/user_guide/io.rst similarity index 99% rename from doc/source/io.rst rename to doc/source/user_guide/io.rst index dd1cde0bdff73..b23a0f10e9e2b 100644 --- a/doc/source/io.rst +++ b/doc/source/user_guide/io.rst @@ -989,6 +989,36 @@ a single date rather than the entire array. os.remove('tmp.csv') + +.. _io.csv.mixed_timezones: + +Parsing a CSV with mixed Timezones +++++++++++++++++++++++++++++++++++ + +Pandas cannot natively represent a column or index with mixed timezones. If your CSV +file contains columns with a mixture of timezones, the default result will be +an object-dtype column with strings, even with ``parse_dates``. + + +.. ipython:: python + + content = """\ + a + 2000-01-01T00:00:00+05:00 + 2000-01-01T00:00:00+06:00""" + df = pd.read_csv(StringIO(content), parse_dates=['a']) + df['a'] + +To parse the mixed-timezone values as a datetime column, pass a partially-applied +:func:`to_datetime` with ``utc=True`` as the ``date_parser``. + +.. ipython:: python + + df = pd.read_csv(StringIO(content), parse_dates=['a'], + date_parser=lambda col: pd.to_datetime(col, utc=True)) + df['a'] + + .. _io.dayfirst: @@ -2549,7 +2579,7 @@ in the method ``to_string`` described above. HTML: .. raw:: html - :file: _static/basic.html + :file: ../_static/basic.html The ``columns`` argument will limit the columns shown: @@ -2565,7 +2595,7 @@ The ``columns`` argument will limit the columns shown: HTML: .. raw:: html - :file: _static/columns.html + :file: ../_static/columns.html ``float_format`` takes a Python callable to control the precision of floating point values: @@ -2582,7 +2612,7 @@ point values: HTML: .. raw:: html - :file: _static/float_format.html + :file: ../_static/float_format.html ``bold_rows`` will make the row labels bold by default, but you can turn that off: @@ -2597,7 +2627,7 @@ off: write_html(df, 'nobold', bold_rows=False) .. raw:: html - :file: _static/nobold.html + :file: ../_static/nobold.html The ``classes`` argument provides the ability to give the resulting HTML table CSS classes. Note that these classes are *appended* to the existing @@ -2627,7 +2657,7 @@ that contain URLs. HTML: .. raw:: html - :file: _static/render_links.html + :file: ../_static/render_links.html Finally, the ``escape`` argument allows you to control whether the "<", ">" and "&" characters escaped in the resulting HTML (by default it is @@ -2651,7 +2681,7 @@ Escaped: print(df.to_html()) .. raw:: html - :file: _static/escape.html + :file: ../_static/escape.html Not escaped: @@ -2660,7 +2690,7 @@ Not escaped: print(df.to_html(escape=False)) .. raw:: html - :file: _static/noescape.html + :file: ../_static/noescape.html .. note:: @@ -4850,7 +4880,7 @@ See also some :ref:`cookbook examples ` for some advanced strategi The key functions are: .. autosummary:: - :toctree: generated/ + :toctree: ../reference/api/ read_sql_table read_sql_query diff --git a/doc/source/merging.rst b/doc/source/user_guide/merging.rst similarity index 100% rename from doc/source/merging.rst rename to doc/source/user_guide/merging.rst diff --git a/doc/source/missing_data.rst b/doc/source/user_guide/missing_data.rst similarity index 100% rename from doc/source/missing_data.rst rename to doc/source/user_guide/missing_data.rst diff --git a/doc/source/options.rst b/doc/source/user_guide/options.rst similarity index 99% rename from doc/source/options.rst rename to doc/source/user_guide/options.rst index e91be3e6ae730..d640d8b1153c5 100644 --- a/doc/source/options.rst +++ b/doc/source/user_guide/options.rst @@ -487,7 +487,7 @@ If a DataFrame or Series contains these characters, the default output mode may df = pd.DataFrame({u'国籍': ['UK', u'日本'], u'名前': ['Alice', u'しのぶ']}) df -.. image:: _static/option_unicode01.png +.. image:: ../_static/option_unicode01.png Enabling ``display.unicode.east_asian_width`` allows pandas to check each character's "East Asian Width" property. These characters can be aligned properly by setting this option to ``True``. However, this will result in longer render @@ -498,7 +498,7 @@ times than the standard ``len`` function. pd.set_option('display.unicode.east_asian_width', True) df -.. image:: _static/option_unicode02.png +.. image:: ../_static/option_unicode02.png In addition, Unicode characters whose width is "Ambiguous" can either be 1 or 2 characters wide depending on the terminal setting or encoding. The option ``display.unicode.ambiguous_as_wide`` can be used to handle the ambiguity. @@ -510,7 +510,7 @@ By default, an "Ambiguous" character's width, such as "¡" (inverted exclamation df = pd.DataFrame({'a': ['xxx', u'¡¡'], 'b': ['yyy', u'¡¡']}) df -.. image:: _static/option_unicode03.png +.. image:: ../_static/option_unicode03.png Enabling ``display.unicode.ambiguous_as_wide`` makes pandas interpret these characters' widths to be 2. (Note that this option will only be effective when ``display.unicode.east_asian_width`` is enabled.) @@ -522,7 +522,7 @@ However, setting this option incorrectly for your terminal will cause these char pd.set_option('display.unicode.ambiguous_as_wide', True) df -.. image:: _static/option_unicode04.png +.. image:: ../_static/option_unicode04.png .. ipython:: python :suppress: diff --git a/doc/source/reshaping.rst b/doc/source/user_guide/reshaping.rst similarity index 98% rename from doc/source/reshaping.rst rename to doc/source/user_guide/reshaping.rst index 9891e22e9d552..5c11be34e6ed4 100644 --- a/doc/source/reshaping.rst +++ b/doc/source/user_guide/reshaping.rst @@ -9,7 +9,7 @@ Reshaping and Pivot Tables Reshaping by pivoting DataFrame objects --------------------------------------- -.. image:: _static/reshaping_pivot.png +.. image:: ../_static/reshaping_pivot.png .. ipython:: python :suppress: @@ -101,7 +101,7 @@ are homogeneously-typed. Reshaping by stacking and unstacking ------------------------------------ -.. image:: _static/reshaping_stack.png +.. image:: ../_static/reshaping_stack.png Closely related to the :meth:`~DataFrame.pivot` method are the related :meth:`~DataFrame.stack` and :meth:`~DataFrame.unstack` methods available on @@ -116,7 +116,7 @@ Closely related to the :meth:`~DataFrame.pivot` method are the related (possibly hierarchical) row index to the column axis, producing a reshaped ``DataFrame`` with a new inner-most level of column labels. -.. image:: _static/reshaping_unstack.png +.. image:: ../_static/reshaping_unstack.png The clearest way to explain is by example. Let's take a prior example data set from the hierarchical indexing section: @@ -158,7 +158,7 @@ unstacks the **last level**: .. _reshaping.unstack_by_name: -.. image:: _static/reshaping_unstack_1.png +.. image:: ../_static/reshaping_unstack_1.png If the indexes have names, you can use the level names instead of specifying the level numbers: @@ -168,7 +168,7 @@ the level numbers: stacked.unstack('second') -.. image:: _static/reshaping_unstack_0.png +.. image:: ../_static/reshaping_unstack_0.png Notice that the ``stack`` and ``unstack`` methods implicitly sort the index levels involved. Hence a call to ``stack`` and then ``unstack``, or vice versa, @@ -279,7 +279,7 @@ the right thing: Reshaping by Melt ----------------- -.. image:: _static/reshaping_melt.png +.. image:: ../_static/reshaping_melt.png The top-level :func:`~pandas.melt` function and the corresponding :meth:`DataFrame.melt` are useful to massage a ``DataFrame`` into a format where one or more columns diff --git a/doc/source/sparse.rst b/doc/source/user_guide/sparse.rst similarity index 100% rename from doc/source/sparse.rst rename to doc/source/user_guide/sparse.rst diff --git a/doc/source/style.ipynb b/doc/source/user_guide/style.ipynb similarity index 99% rename from doc/source/style.ipynb rename to doc/source/user_guide/style.ipynb index 792fe5120f6e8..79a9848704eec 100644 --- a/doc/source/style.ipynb +++ b/doc/source/user_guide/style.ipynb @@ -992,7 +992,7 @@ "source": [ "A screenshot of the output:\n", "\n", - "![Excel spreadsheet with styled DataFrame](_static/style-excel.png)\n" + "![Excel spreadsheet with styled DataFrame](../_static/style-excel.png)\n" ] }, { @@ -1133,7 +1133,7 @@ "metadata": {}, "outputs": [], "source": [ - "with open(\"template_structure.html\") as f:\n", + "with open(\"templates/template_structure.html\") as f:\n", " structure = f.read()\n", " \n", "HTML(structure)" diff --git a/doc/source/templates/myhtml.tpl b/doc/source/user_guide/templates/myhtml.tpl similarity index 100% rename from doc/source/templates/myhtml.tpl rename to doc/source/user_guide/templates/myhtml.tpl diff --git a/doc/source/template_structure.html b/doc/source/user_guide/templates/template_structure.html similarity index 100% rename from doc/source/template_structure.html rename to doc/source/user_guide/templates/template_structure.html diff --git a/doc/source/text.rst b/doc/source/user_guide/text.rst similarity index 100% rename from doc/source/text.rst rename to doc/source/user_guide/text.rst diff --git a/doc/source/timedeltas.rst b/doc/source/user_guide/timedeltas.rst similarity index 100% rename from doc/source/timedeltas.rst rename to doc/source/user_guide/timedeltas.rst diff --git a/doc/source/timeseries.rst b/doc/source/user_guide/timeseries.rst similarity index 92% rename from doc/source/timeseries.rst rename to doc/source/user_guide/timeseries.rst index f56ad710973dd..5841125817d03 100644 --- a/doc/source/timeseries.rst +++ b/doc/source/user_guide/timeseries.rst @@ -2129,11 +2129,13 @@ These can easily be converted to a ``PeriodIndex``: Time Zone Handling ------------------ -Pandas provides rich support for working with timestamps in different time -zones using ``pytz`` and ``dateutil`` libraries. ``dateutil`` currently is only -supported for fixed offset and tzfile zones. The default library is ``pytz``. -Support for ``dateutil`` is provided for compatibility with other -applications e.g. if you use ``dateutil`` in other Python packages. +pandas provides rich support for working with timestamps in different time +zones using the ``pytz`` and ``dateutil`` libraries. + +.. note:: + + pandas does not yet support ``datetime.timezone`` objects from the standard + library. Working with Time Zones ~~~~~~~~~~~~~~~~~~~~~~~ @@ -2145,13 +2147,16 @@ By default, pandas objects are time zone unaware: rng = pd.date_range('3/6/2012 00:00', periods=15, freq='D') rng.tz is None -To supply the time zone, you can use the ``tz`` keyword to ``date_range`` and -other functions. Dateutil time zone strings are distinguished from ``pytz`` -time zones by starting with ``dateutil/``. +To localize these dates to a time zone (assign a particular time zone to a naive date), +you can use the ``tz_localize`` method or the ``tz`` keyword argument in +:func:`date_range`, :class:`Timestamp`, or :class:`DatetimeIndex`. +You can either pass ``pytz`` or ``dateutil`` time zone objects or Olson time zone database strings. +Olson time zone strings will return ``pytz`` time zone objects by default. +To return ``dateutil`` time zone objects, append ``dateutil/`` before the string. * In ``pytz`` you can find a list of common (and less common) time zones using ``from pytz import common_timezones, all_timezones``. -* ``dateutil`` uses the OS timezones so there isn't a fixed list available. For +* ``dateutil`` uses the OS time zones so there isn't a fixed list available. For common zones, the names are the same as ``pytz``. .. ipython:: python @@ -2159,23 +2164,23 @@ time zones by starting with ``dateutil/``. import dateutil # pytz - rng_pytz = pd.date_range('3/6/2012 00:00', periods=10, freq='D', + rng_pytz = pd.date_range('3/6/2012 00:00', periods=3, freq='D', tz='Europe/London') rng_pytz.tz # dateutil - rng_dateutil = pd.date_range('3/6/2012 00:00', periods=10, freq='D', - tz='dateutil/Europe/London') + rng_dateutil = pd.date_range('3/6/2012 00:00', periods=3, freq='D') + rng_dateutil = rng_dateutil.tz_localize('dateutil/Europe/London') rng_dateutil.tz # dateutil - utc special case - rng_utc = pd.date_range('3/6/2012 00:00', periods=10, freq='D', + rng_utc = pd.date_range('3/6/2012 00:00', periods=3, freq='D', tz=dateutil.tz.tzutc()) rng_utc.tz -Note that the ``UTC`` timezone is a special case in ``dateutil`` and should be constructed explicitly -as an instance of ``dateutil.tz.tzutc``. You can also construct other timezones explicitly first, -which gives you more control over which time zone is used: +Note that the ``UTC`` time zone is a special case in ``dateutil`` and should be constructed explicitly +as an instance of ``dateutil.tz.tzutc``. You can also construct other time +zones objects explicitly first. .. ipython:: python @@ -2183,56 +2188,46 @@ which gives you more control over which time zone is used: # pytz tz_pytz = pytz.timezone('Europe/London') - rng_pytz = pd.date_range('3/6/2012 00:00', periods=10, freq='D', - tz=tz_pytz) + rng_pytz = pd.date_range('3/6/2012 00:00', periods=3, freq='D') + rng_pytz = rng_pytz.tz_localize(tz_pytz) rng_pytz.tz == tz_pytz # dateutil tz_dateutil = dateutil.tz.gettz('Europe/London') - rng_dateutil = pd.date_range('3/6/2012 00:00', periods=10, freq='D', + rng_dateutil = pd.date_range('3/6/2012 00:00', periods=3, freq='D', tz=tz_dateutil) rng_dateutil.tz == tz_dateutil -Timestamps, like Python's ``datetime.datetime`` object can be either time zone -naive or time zone aware. Naive time series and ``DatetimeIndex`` objects can be -*localized* using ``tz_localize``: - -.. ipython:: python - - ts = pd.Series(np.random.randn(len(rng)), rng) - - ts_utc = ts.tz_localize('UTC') - ts_utc - -Again, you can explicitly construct the timezone object first. -You can use the ``tz_convert`` method to convert pandas objects to convert -tz-aware data to another time zone: +To convert a time zone aware pandas object from one time zone to another, +you can use the ``tz_convert`` method. .. ipython:: python - ts_utc.tz_convert('US/Eastern') + rng_pytz.tz_convert('US/Eastern') .. warning:: - Be wary of conversions between libraries. For some zones ``pytz`` and ``dateutil`` have different - definitions of the zone. This is more of a problem for unusual timezones than for + Be wary of conversions between libraries. For some time zones, ``pytz`` and ``dateutil`` have different + definitions of the zone. This is more of a problem for unusual time zones than for 'standard' zones like ``US/Eastern``. .. warning:: - Be aware that a timezone definition across versions of timezone libraries may not - be considered equal. This may cause problems when working with stored data that - is localized using one version and operated on with a different version. - See :ref:`here` for how to handle such a situation. + Be aware that a time zone definition across versions of time zone libraries may not + be considered equal. This may cause problems when working with stored data that + is localized using one version and operated on with a different version. + See :ref:`here` for how to handle such a situation. .. warning:: - It is incorrect to pass a timezone directly into the ``datetime.datetime`` constructor (e.g., - ``datetime.datetime(2011, 1, 1, tz=timezone('US/Eastern'))``. Instead, the datetime - needs to be localized using the localize method on the timezone. + For ``pytz`` time zones, it is incorrect to pass a time zone object directly into + the ``datetime.datetime`` constructor + (e.g., ``datetime.datetime(2011, 1, 1, tz=pytz.timezone('US/Eastern'))``. + Instead, the datetime needs to be localized using the ``localize`` method + on the ``pytz`` time zone object. -Under the hood, all timestamps are stored in UTC. Scalar values from a -``DatetimeIndex`` with a time zone will have their fields (day, hour, minute) +Under the hood, all timestamps are stored in UTC. Values from a time zone aware +:class:`DatetimeIndex` or :class:`Timestamp` will have their fields (day, hour, minute, etc.) localized to the time zone. However, timestamps with the same UTC value are still considered to be equal even if they are in different time zones: @@ -2241,51 +2236,35 @@ still considered to be equal even if they are in different time zones: rng_eastern = rng_utc.tz_convert('US/Eastern') rng_berlin = rng_utc.tz_convert('Europe/Berlin') - rng_eastern[5] - rng_berlin[5] - rng_eastern[5] == rng_berlin[5] - -Like ``Series``, ``DataFrame``, and ``DatetimeIndex``; ``Timestamp`` objects -can be converted to other time zones using ``tz_convert``: - -.. ipython:: python - - rng_eastern[5] - rng_berlin[5] - rng_eastern[5].tz_convert('Europe/Berlin') - -Localization of ``Timestamp`` functions just like ``DatetimeIndex`` and ``Series``: - -.. ipython:: python - - rng[5] - rng[5].tz_localize('Asia/Shanghai') - + rng_eastern[2] + rng_berlin[2] + rng_eastern[2] == rng_berlin[2] -Operations between ``Series`` in different time zones will yield UTC -``Series``, aligning the data on the UTC timestamps: +Operations between :class:`Series` in different time zones will yield UTC +:class:`Series`, aligning the data on the UTC timestamps: .. ipython:: python + ts_utc = pd.Series(range(3), pd.date_range('20130101', periods=3, tz='UTC')) eastern = ts_utc.tz_convert('US/Eastern') berlin = ts_utc.tz_convert('Europe/Berlin') result = eastern + berlin result result.index -To remove timezone from tz-aware ``DatetimeIndex``, use ``tz_localize(None)`` or ``tz_convert(None)``. -``tz_localize(None)`` will remove timezone holding local time representations. -``tz_convert(None)`` will remove timezone after converting to UTC time. +To remove time zone information, use ``tz_localize(None)`` or ``tz_convert(None)``. +``tz_localize(None)`` will remove the time zone yielding the local time representation. +``tz_convert(None)`` will remove the time zone after converting to UTC time. .. ipython:: python didx = pd.date_range(start='2014-08-01 09:00', freq='H', - periods=10, tz='US/Eastern') + periods=3, tz='US/Eastern') didx didx.tz_localize(None) didx.tz_convert(None) - # tz_convert(None) is identical with tz_convert('UTC').tz_localize(None) + # tz_convert(None) is identical to tz_convert('UTC').tz_localize(None) didx.tz_convert('UTC').tz_localize(None) .. _timeseries.timezone_ambiguous: @@ -2293,54 +2272,34 @@ To remove timezone from tz-aware ``DatetimeIndex``, use ``tz_localize(None)`` or Ambiguous Times when Localizing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In some cases, localize cannot determine the DST and non-DST hours when there are -duplicates. This often happens when reading files or database records that simply -duplicate the hours. Passing ``ambiguous='infer'`` into ``tz_localize`` will -attempt to determine the right offset. Below the top example will fail as it -contains ambiguous times and the bottom will infer the right offset. +``tz_localize`` may not be able to determine the UTC offset of a timestamp +because daylight savings time (DST) in a local time zone causes some times to occur +twice within one day ("clocks fall back"). The following options are available: + +* ``'raise'``: Raises a ``pytz.AmbiguousTimeError`` (the default behavior) +* ``'infer'``: Attempt to determine the correct offset base on the monotonicity of the timestamps +* ``'NaT'``: Replaces ambiguous times with ``NaT`` +* ``bool``: ``True`` represents a DST time, ``False`` represents non-DST time. An array-like of ``bool`` values is supported for a sequence of times. .. ipython:: python rng_hourly = pd.DatetimeIndex(['11/06/2011 00:00', '11/06/2011 01:00', - '11/06/2011 01:00', '11/06/2011 02:00', - '11/06/2011 03:00']) + '11/06/2011 01:00', '11/06/2011 02:00']) -This will fail as there are ambiguous times +This will fail as there are ambiguous times (``'11/06/2011 01:00'``) .. code-block:: ipython In [2]: rng_hourly.tz_localize('US/Eastern') AmbiguousTimeError: Cannot infer dst time from Timestamp('2011-11-06 01:00:00'), try using the 'ambiguous' argument -Infer the ambiguous times - -.. ipython:: python - - rng_hourly_eastern = rng_hourly.tz_localize('US/Eastern', ambiguous='infer') - rng_hourly_eastern.to_list() - -In addition to 'infer', there are several other arguments supported. Passing -an array-like of bools or 0s/1s where True represents a DST hour and False a -non-DST hour, allows for distinguishing more than one DST -transition (e.g., if you have multiple records in a database each with their -own DST transition). Or passing 'NaT' will fill in transition times -with not-a-time values. These methods are available in the ``DatetimeIndex`` -constructor as well as ``tz_localize``. +Handle these ambiguous times by specifying the following. .. ipython:: python - rng_hourly_dst = np.array([1, 1, 0, 0, 0]) - rng_hourly.tz_localize('US/Eastern', ambiguous=rng_hourly_dst).to_list() - rng_hourly.tz_localize('US/Eastern', ambiguous='NaT').to_list() - - didx = pd.date_range(start='2014-08-01 09:00', freq='H', - periods=10, tz='US/Eastern') - didx - didx.tz_localize(None) - didx.tz_convert(None) - - # tz_convert(None) is identical with tz_convert('UTC').tz_localize(None) - didx.tz_convert('UCT').tz_localize(None) + rng_hourly.tz_localize('US/Eastern', ambiguous='infer') + rng_hourly.tz_localize('US/Eastern', ambiguous='NaT') + rng_hourly.tz_localize('US/Eastern', ambiguous=[True, True, False, False]) .. _timeseries.timezone_nonexistent: @@ -2348,7 +2307,7 @@ Nonexistent Times when Localizing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A DST transition may also shift the local time ahead by 1 hour creating nonexistent -local times. The behavior of localizing a timeseries with nonexistent times +local times ("clocks spring forward"). The behavior of localizing a timeseries with nonexistent times can be controlled by the ``nonexistent`` argument. The following options are available: * ``'raise'``: Raises a ``pytz.NonExistentTimeError`` (the default behavior) @@ -2382,58 +2341,61 @@ Transform nonexistent times to ``NaT`` or shift the times. .. _timeseries.timezone_series: -TZ Aware Dtypes -~~~~~~~~~~~~~~~ +Time Zone Series Operations +~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``Series/DatetimeIndex`` with a timezone **naive** value are represented with a dtype of ``datetime64[ns]``. +A :class:`Series` with time zone **naive** values is +represented with a dtype of ``datetime64[ns]``. .. ipython:: python s_naive = pd.Series(pd.date_range('20130101', periods=3)) s_naive -``Series/DatetimeIndex`` with a timezone **aware** value are represented with a dtype of ``datetime64[ns, tz]``. +A :class:`Series` with a time zone **aware** values is +represented with a dtype of ``datetime64[ns, tz]`` where ``tz`` is the time zone .. ipython:: python s_aware = pd.Series(pd.date_range('20130101', periods=3, tz='US/Eastern')) s_aware -Both of these ``Series`` can be manipulated via the ``.dt`` accessor, see :ref:`here `. +Both of these :class:`Series` time zone information +can be manipulated via the ``.dt`` accessor, see :ref:`the dt accessor section `. -For example, to localize and convert a naive stamp to timezone aware. +For example, to localize and convert a naive stamp to time zone aware. .. ipython:: python s_naive.dt.tz_localize('UTC').dt.tz_convert('US/Eastern') - -Further more you can ``.astype(...)`` timezone aware (and naive). This operation is effectively a localize AND convert on a naive stamp, and -a convert on an aware stamp. +Time zone information can also be manipulated using the ``astype`` method. +This method can localize and convert time zone naive timestamps or +convert time zone aware timestamps. .. ipython:: python - # localize and convert a naive timezone + # localize and convert a naive time zone s_naive.astype('datetime64[ns, US/Eastern]') # make an aware tz naive s_aware.astype('datetime64[ns]') - # convert to a new timezone + # convert to a new time zone s_aware.astype('datetime64[ns, CET]') .. note:: Using :meth:`Series.to_numpy` on a ``Series``, returns a NumPy array of the data. - NumPy does not currently support timezones (even though it is *printing* in the local timezone!), - therefore an object array of Timestamps is returned for timezone aware data: + NumPy does not currently support time zones (even though it is *printing* in the local time zone!), + therefore an object array of Timestamps is returned for time zone aware data: .. ipython:: python s_naive.to_numpy() s_aware.to_numpy() - By converting to an object array of Timestamps, it preserves the timezone + By converting to an object array of Timestamps, it preserves the time zone information. For example, when converting back to a Series: .. ipython:: python diff --git a/doc/source/visualization.rst b/doc/source/user_guide/visualization.rst similarity index 100% rename from doc/source/visualization.rst rename to doc/source/user_guide/visualization.rst diff --git a/doc/source/whatsnew/v0.24.0.rst b/doc/source/whatsnew/v0.24.0.rst index 69b59793f7c0d..a49ea2cf493a6 100644 --- a/doc/source/whatsnew/v0.24.0.rst +++ b/doc/source/whatsnew/v0.24.0.rst @@ -1,33 +1,49 @@ .. _whatsnew_0240: -What's New in 0.24.0 (January XX, 2019) +What's New in 0.24.0 (January 25, 2019) --------------------------------------- .. warning:: The 0.24.x series of releases will be the last to support Python 2. Future feature - releases will support Python 3 only. See :ref:`install.dropping-27` for more. + releases will support Python 3 only. See :ref:`install.dropping-27` for more + details. {{ header }} -These are the changes in pandas 0.24.0. See :ref:`release` for a full changelog -including other versions of pandas. +This is a major release from 0.23.4 and includes a number of API changes, new +features, enhancements, and performance improvements along with a large number +of bug fixes. -Highlights include +Highlights include: -* :ref:`Optional Nullable Integer Support ` +* :ref:`Optional Integer NA Support ` * :ref:`New APIs for accessing the array backing a Series or Index ` * :ref:`A new top-level method for creating arrays ` * :ref:`Store Interval and Period data in a Series or DataFrame ` * :ref:`Support for joining on two MultiIndexes ` + +Check the :ref:`API Changes ` and :ref:`deprecations ` before updating. + +These are the changes in pandas 0.24.0. See :ref:`release` for a full changelog +including other versions of pandas. + + +Enhancements +~~~~~~~~~~~~ + .. _whatsnew_0240.enhancements.intna: Optional Integer NA Support ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pandas has gained the ability to hold integer dtypes with missing values. This long requested feature is enabled through the use of :ref:`extension types `. -Here is an example of the usage. + +.. note:: + + IntegerArray is currently experimental. Its API or implementation may + change without warning. We can construct a ``Series`` with the specified dtype. The dtype string ``Int64`` is a pandas ``ExtensionDtype``. Specifying a list or array using the traditional missing value marker of ``np.nan`` will infer to integer dtype. The display of the ``Series`` will also use the ``NaN`` to indicate missing values in string outputs. (:issue:`20700`, :issue:`20747`, :issue:`22441`, :issue:`21789`, :issue:`22346`) @@ -57,7 +73,7 @@ Operations on these dtypes will propagate ``NaN`` as other pandas operations. # coerce when needed s + 0.01 -These dtypes can operate as part of of ``DataFrame``. +These dtypes can operate as part of a ``DataFrame``. .. ipython:: python @@ -66,7 +82,7 @@ These dtypes can operate as part of of ``DataFrame``. df.dtypes -These dtypes can be merged & reshaped & casted. +These dtypes can be merged, reshaped, and casted. .. ipython:: python @@ -109,6 +125,7 @@ a new ndarray of period objects each time. .. ipython:: python + idx.values id(idx.values) id(idx.values) @@ -121,7 +138,7 @@ If you need an actual NumPy array, use :meth:`Series.to_numpy` or :meth:`Index.t For Series and Indexes backed by normal NumPy arrays, :attr:`Series.array` will return a new :class:`arrays.PandasArray`, which is a thin (no-copy) wrapper around a -:class:`numpy.ndarray`. :class:`arrays.PandasArray` isn't especially useful on its own, +:class:`numpy.ndarray`. :class:`~arrays.PandasArray` isn't especially useful on its own, but it does provide the same interface as any extension array defined in pandas or by a third-party library. @@ -139,14 +156,13 @@ See :ref:`Dtypes ` and :ref:`Attributes and Underlying Data `, including -extension arrays registered by :ref:`3rd party libraries `. See - -See :ref:`Dtypes ` for more on extension arrays. +extension arrays registered by :ref:`3rd party libraries `. +See the :ref:`dtypes docs ` for more on extension arrays. .. ipython:: python @@ -155,15 +171,15 @@ See :ref:`Dtypes ` for more on extension arrays. Passing data for which there isn't dedicated extension type (e.g. float, integer, etc.) will return a new :class:`arrays.PandasArray`, which is just a thin (no-copy) -wrapper around a :class:`numpy.ndarray` that satisfies the extension array interface. +wrapper around a :class:`numpy.ndarray` that satisfies the pandas extension array interface. .. ipython:: python pd.array([1, 2, 3]) -On their own, a :class:`arrays.PandasArray` isn't a very useful object. +On their own, a :class:`~arrays.PandasArray` isn't a very useful object. But if you need write low-level code that works generically for any -:class:`~pandas.api.extensions.ExtensionArray`, :class:`arrays.PandasArray` +:class:`~pandas.api.extensions.ExtensionArray`, :class:`~arrays.PandasArray` satisfies that need. Notice that by default, if no ``dtype`` is specified, the dtype of the returned @@ -194,7 +210,7 @@ For periods: .. ipython:: python - pser = pd.Series(pd.date_range("2000", freq="D", periods=5)) + pser = pd.Series(pd.period_range("2000", freq="D", periods=5)) pser pser.dtype @@ -210,6 +226,9 @@ from the ``Series``: ser.array pser.array +These return an instance of :class:`arrays.IntervalArray` or :class:`arrays.PeriodArray`, +the new extension arrays that back interval and period data. + .. warning:: For backwards compatibility, :attr:`Series.values` continues to return @@ -226,7 +245,7 @@ from the ``Series``: Joining with two multi-indexes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:func:`DataFrame.merge` and :func:`DataFrame.join` can now be used to join multi-indexed ``Dataframe`` instances on the overlaping index levels (:issue:`6360`) +:func:`DataFrame.merge` and :func:`DataFrame.join` can now be used to join multi-indexed ``Dataframe`` instances on the overlapping index levels (:issue:`6360`) See the :ref:`Merge, join, and concatenate ` documentation section. @@ -256,23 +275,6 @@ For earlier versions this can be done using the following. pd.merge(left.reset_index(), right.reset_index(), on=['key'], how='inner').set_index(['key', 'X', 'Y']) - -.. _whatsnew_0240.enhancements.extension_array_operators: - -``ExtensionArray`` operator support -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -A ``Series`` based on an ``ExtensionArray`` now supports arithmetic and comparison -operators (:issue:`19577`). There are two approaches for providing operator support for an ``ExtensionArray``: - -1. Define each of the operators on your ``ExtensionArray`` subclass. -2. Use an operator implementation from pandas that depends on operators that are already defined - on the underlying elements (scalars) of the ``ExtensionArray``. - -See the :ref:`ExtensionArray Operator Support -` documentation section for details on both -ways of adding operator support. - .. _whatsnew_0240.enhancements.read_html: ``read_html`` Enhancements @@ -332,7 +334,7 @@ convenient way to apply users' predefined styling functions, and can help reduce df.style.pipe(format_and_align).set_caption('Summary of results.') Similar methods already exist for other classes in pandas, including :meth:`DataFrame.pipe`, -:meth:`pandas.core.groupby.GroupBy.pipe`, and :meth:`pandas.core.resample.Resampler.pipe`. +:meth:`GroupBy.pipe() `, and :meth:`Resampler.pipe() `. .. _whatsnew_0240.enhancements.rename_axis: @@ -340,7 +342,7 @@ Renaming names in a MultiIndex ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :func:`DataFrame.rename_axis` now supports ``index`` and ``columns`` arguments -and :func:`Series.rename_axis` supports ``index`` argument (:issue:`19978`) +and :func:`Series.rename_axis` supports ``index`` argument (:issue:`19978`). This change allows a dictionary to be passed so that some of the names of a ``MultiIndex`` can be changed. @@ -368,13 +370,13 @@ Other Enhancements - :func:`DataFrame.to_parquet` now accepts ``index`` as an argument, allowing the user to override the engine's default behavior to include or omit the dataframe's indexes from the resulting Parquet file. (:issue:`20768`) +- :func:`read_feather` now accepts ``columns`` as an argument, allowing the user to specify which columns should be read. (:issue:`24025`) - :meth:`DataFrame.corr` and :meth:`Series.corr` now accept a callable for generic calculation methods of correlation, e.g. histogram intersection (:issue:`22684`) - :func:`DataFrame.to_string` now accepts ``decimal`` as an argument, allowing the user to specify which decimal separator should be used in the output. (:issue:`23614`) -- :func:`read_feather` now accepts ``columns`` as an argument, allowing the user to specify which columns should be read. (:issue:`24025`) - :func:`DataFrame.to_html` now accepts ``render_links`` as an argument, allowing the user to generate HTML with links to any URLs that appear in the DataFrame. See the :ref:`section on writing HTML ` in the IO docs for example usage. (:issue:`2679`) - :func:`pandas.read_csv` now supports pandas extension types as an argument to ``dtype``, allowing the user to use pandas extension types when reading CSVs. (:issue:`23228`) -- :meth:`DataFrame.shift` :meth:`Series.shift`, :meth:`ExtensionArray.shift`, :meth:`SparseArray.shift`, :meth:`Period.shift`, :meth:`GroupBy.shift`, :meth:`Categorical.shift`, :meth:`NDFrame.shift` and :meth:`Block.shift` now accept `fill_value` as an argument, allowing the user to specify a value which will be used instead of NA/NaT in the empty periods. (:issue:`15486`) +- The :meth:`~DataFrame.shift` method now accepts `fill_value` as an argument, allowing the user to specify a value which will be used instead of NA/NaT in the empty periods. (:issue:`15486`) - :func:`to_datetime` now supports the ``%Z`` and ``%z`` directive when passed into ``format`` (:issue:`13486`) - :func:`Series.mode` and :func:`DataFrame.mode` now support the ``dropna`` parameter which can be used to specify whether ``NaN``/``NaT`` values should be considered (:issue:`17534`) - :func:`DataFrame.to_csv` and :func:`Series.to_csv` now support the ``compression`` keyword when a file handle is passed. (:issue:`21227`) @@ -396,20 +398,21 @@ Other Enhancements The default compression for ``to_csv``, ``to_json``, and ``to_pickle`` methods has been updated to ``'infer'`` (:issue:`22004`). - :meth:`DataFrame.to_sql` now supports writing ``TIMESTAMP WITH TIME ZONE`` types for supported databases. For databases that don't support timezones, datetime data will be stored as timezone unaware local timestamps. See the :ref:`io.sql_datetime_data` for implications (:issue:`9086`). - :func:`to_timedelta` now supports iso-formated timedelta strings (:issue:`21877`) -- :class:`Series` and :class:`DataFrame` now support :class:`Iterable` in constructor (:issue:`2193`) +- :class:`Series` and :class:`DataFrame` now support :class:`Iterable` objects in the constructor (:issue:`2193`) - :class:`DatetimeIndex` has gained the :attr:`DatetimeIndex.timetz` attribute. This returns the local time with timezone information. (:issue:`21358`) -- :meth:`Timestamp.round`, :meth:`Timestamp.ceil`, and :meth:`Timestamp.floor` for :class:`DatetimeIndex` and :class:`Timestamp` now support an ``ambiguous`` argument for handling datetimes that are rounded to ambiguous times (:issue:`18946`) -- :meth:`Timestamp.round`, :meth:`Timestamp.ceil`, and :meth:`Timestamp.floor` for :class:`DatetimeIndex` and :class:`Timestamp` now support a ``nonexistent`` argument for handling datetimes that are rounded to nonexistent times. See :ref:`timeseries.timezone_nonexistent` (:issue:`22647`) -- :class:`pandas.core.resample.Resampler` now is iterable like :class:`pandas.core.groupby.GroupBy` (:issue:`15314`). +- :meth:`~Timestamp.round`, :meth:`~Timestamp.ceil`, and :meth:`~Timestamp.floor` for :class:`DatetimeIndex` and :class:`Timestamp` + now support an ``ambiguous`` argument for handling datetimes that are rounded to ambiguous times (:issue:`18946`) + and a ``nonexistent`` argument for handling datetimes that are rounded to nonexistent times. See :ref:`timeseries.timezone_nonexistent` (:issue:`22647`) +- The result of :meth:`~DataFrame.resample` is now iterable similar to ``groupby()`` (:issue:`15314`). - :meth:`Series.resample` and :meth:`DataFrame.resample` have gained the :meth:`pandas.core.resample.Resampler.quantile` (:issue:`15023`). - :meth:`DataFrame.resample` and :meth:`Series.resample` with a :class:`PeriodIndex` will now respect the ``base`` argument in the same fashion as with a :class:`DatetimeIndex`. (:issue:`23882`) - :meth:`pandas.api.types.is_list_like` has gained a keyword ``allow_sets`` which is ``True`` by default; if ``False``, all instances of ``set`` will not be considered "list-like" anymore (:issue:`23061`) - :meth:`Index.to_frame` now supports overriding column name(s) (:issue:`22580`). - :meth:`Categorical.from_codes` now can take a ``dtype`` parameter as an alternative to passing ``categories`` and ``ordered`` (:issue:`24398`). -- New attribute :attr:`__git_version__` will return git commit sha of current build (:issue:`21295`). +- New attribute ``__git_version__`` will return git commit sha of current build (:issue:`21295`). - Compatibility with Matplotlib 3.0 (:issue:`22790`). -- Added :meth:`Interval.overlaps`, :meth:`IntervalArray.overlaps`, and :meth:`IntervalIndex.overlaps` for determining overlaps between interval-like objects (:issue:`21998`) +- Added :meth:`Interval.overlaps`, :meth:`arrays.IntervalArray.overlaps`, and :meth:`IntervalIndex.overlaps` for determining overlaps between interval-like objects (:issue:`21998`) - :func:`read_fwf` now accepts keyword ``infer_nrows`` (:issue:`15138`). - :func:`~DataFrame.to_parquet` now supports writing a ``DataFrame`` as a directory of parquet files partitioned by a subset of the columns when ``engine = 'pyarrow'`` (:issue:`23283`) - :meth:`Timestamp.tz_localize`, :meth:`DatetimeIndex.tz_localize`, and :meth:`Series.tz_localize` have gained the ``nonexistent`` argument for alternative handling of nonexistent times. See :ref:`timeseries.timezone_nonexistent` (:issue:`8917`, :issue:`24466`) @@ -418,12 +421,11 @@ Other Enhancements - :meth:`MultiIndex.to_flat_index` has been added to flatten multiple levels into a single-level :class:`Index` object. - :meth:`DataFrame.to_stata` and :class:`pandas.io.stata.StataWriter117` can write mixed sting columns to Stata strl format (:issue:`23633`) - :meth:`DataFrame.between_time` and :meth:`DataFrame.at_time` have gained the ``axis`` parameter (:issue:`8839`) -- The ``scatter_matrix``, ``andrews_curves``, ``parallel_coordinates``, ``lag_plot``, ``autocorrelation_plot``, ``bootstrap_plot``, and ``radviz`` plots from the ``pandas.plotting`` module are now accessible from calling :meth:`DataFrame.plot` (:issue:`11978`) - :meth:`DataFrame.to_records` now accepts ``index_dtypes`` and ``column_dtypes`` parameters to allow different data types in stored column and index records (:issue:`18146`) - :class:`IntervalIndex` has gained the :attr:`~IntervalIndex.is_overlapping` attribute to indicate if the ``IntervalIndex`` contains any overlapping intervals (:issue:`23309`) - :func:`pandas.DataFrame.to_sql` has gained the ``method`` argument to control SQL insertion clause. See the :ref:`insertion method ` section in the documentation. (:issue:`8953`) - :meth:`DataFrame.corrwith` now supports Spearman's rank correlation, Kendall's tau as well as callable correlation methods. (:issue:`21925`) -- :meth:`DataFrame.to_json`, :meth:`DataFrame.to_csv`, :meth:`DataFrame.to_pickle`, and :meth:`DataFrame.to_XXX` etc. now support tilde(~) in path argument. (:issue:`23473`) +- :meth:`DataFrame.to_json`, :meth:`DataFrame.to_csv`, :meth:`DataFrame.to_pickle`, and other export methods now support tilde(~) in path argument. (:issue:`23473`) .. _whatsnew_0240.api_breaking: @@ -435,8 +437,8 @@ Pandas 0.24.0 includes a number of API breaking changes. .. _whatsnew_0240.api_breaking.deps: -Dependencies have increased minimum versions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Increased minimum versions for dependencies +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ We have updated our minimum supported versions of dependencies (:issue:`21242`, :issue:`18742`, :issue:`23774`, :issue:`24767`). If installed, we now require: @@ -646,6 +648,52 @@ that the dates have been converted to UTC pd.to_datetime(["2015-11-18 15:30:00+05:30", "2015-11-18 16:30:00+06:30"], utc=True) + +.. _whatsnew_0240.api_breaking.read_csv_mixed_tz: + +Parsing mixed-timezones with :func:`read_csv` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:func:`read_csv` no longer silently converts mixed-timezone columns to UTC (:issue:`24987`). + +*Previous Behavior* + +.. code-block:: python + + >>> import io + >>> content = """\ + ... a + ... 2000-01-01T00:00:00+05:00 + ... 2000-01-01T00:00:00+06:00""" + >>> df = pd.read_csv(io.StringIO(content), parse_dates=['a']) + >>> df.a + 0 1999-12-31 19:00:00 + 1 1999-12-31 18:00:00 + Name: a, dtype: datetime64[ns] + +*New Behavior* + +.. ipython:: python + + import io + content = """\ + a + 2000-01-01T00:00:00+05:00 + 2000-01-01T00:00:00+06:00""" + df = pd.read_csv(io.StringIO(content), parse_dates=['a']) + df.a + +As can be seen, the ``dtype`` is object; each value in the column is a string. +To convert the strings to an array of datetimes, the ``date_parser`` argument + +.. ipython:: python + + df = pd.read_csv(io.StringIO(content), parse_dates=['a'], + date_parser=lambda col: pd.to_datetime(col, utc=True)) + df.a + +See :ref:`whatsnew_0240.api.timezone_offset_parsing` for more. + .. _whatsnew_0240.api_breaking.period_end_time: Time values in ``dt.end_time`` and ``to_timestamp(how='end')`` @@ -1164,17 +1212,19 @@ Other API Changes .. _whatsnew_0240.api.extension: -ExtensionType Changes -^^^^^^^^^^^^^^^^^^^^^ +Extension Type Changes +~~~~~~~~~~~~~~~~~~~~~~ **Equality and Hashability** -Pandas now requires that extension dtypes be hashable. The base class implements +Pandas now requires that extension dtypes be hashable (i.e. the respective +``ExtensionDtype`` objects; hashability is not a requirement for the values +of the corresponding ``ExtensionArray``). The base class implements a default ``__eq__`` and ``__hash__``. If you have a parametrized dtype, you should update the ``ExtensionDtype._metadata`` tuple to match the signature of your ``__init__`` method. See :class:`pandas.api.extensions.ExtensionDtype` for more (:issue:`22476`). -**Reshaping changes** +**New and changed methods** - :meth:`~pandas.api.types.ExtensionArray.dropna` has been added (:issue:`21185`) - :meth:`~pandas.api.types.ExtensionArray.repeat` has been added (:issue:`24349`) @@ -1192,9 +1242,25 @@ update the ``ExtensionDtype._metadata`` tuple to match the signature of your - Added :meth:`pandas.api.types.register_extension_dtype` to register an extension type with pandas (:issue:`22664`) - Updated the ``.type`` attribute for ``PeriodDtype``, ``DatetimeTZDtype``, and ``IntervalDtype`` to be instances of the dtype (``Period``, ``Timestamp``, and ``Interval`` respectively) (:issue:`22938`) +.. _whatsnew_0240.enhancements.extension_array_operators: + +**Operator support** + +A ``Series`` based on an ``ExtensionArray`` now supports arithmetic and comparison +operators (:issue:`19577`). There are two approaches for providing operator support for an ``ExtensionArray``: + +1. Define each of the operators on your ``ExtensionArray`` subclass. +2. Use an operator implementation from pandas that depends on operators that are already defined + on the underlying elements (scalars) of the ``ExtensionArray``. + +See the :ref:`ExtensionArray Operator Support +` documentation section for details on both +ways of adding operator support. + **Other changes** - A default repr for :class:`pandas.api.extensions.ExtensionArray` is now provided (:issue:`23601`). +- :meth:`ExtensionArray._formatting_values` is deprecated. Use :attr:`ExtensionArray._formatter` instead. (:issue:`23601`) - An ``ExtensionArray`` with a boolean dtype now works correctly as a boolean indexer. :meth:`pandas.api.types.is_bool_dtype` now properly considers them boolean (:issue:`22326`) **Bug Fixes** @@ -1243,7 +1309,6 @@ Deprecations - The methods :meth:`DataFrame.update` and :meth:`Panel.update` have deprecated the ``raise_conflict=False|True`` keyword in favor of ``errors='ignore'|'raise'`` (:issue:`23585`) - The methods :meth:`Series.str.partition` and :meth:`Series.str.rpartition` have deprecated the ``pat`` keyword in favor of ``sep`` (:issue:`22676`) - Deprecated the ``nthreads`` keyword of :func:`pandas.read_feather` in favor of ``use_threads`` to reflect the changes in ``pyarrow>=0.11.0``. (:issue:`23053`) -- :meth:`ExtensionArray._formatting_values` is deprecated. Use :attr:`ExtensionArray._formatter` instead. (:issue:`23601`) - :func:`pandas.read_excel` has deprecated accepting ``usecols`` as an integer. Please pass in a list of ints from 0 to ``usecols`` inclusive instead (:issue:`23527`) - Constructing a :class:`TimedeltaIndex` from data with ``datetime64``-dtyped data is deprecated, will raise ``TypeError`` in a future version (:issue:`23539`) - Constructing a :class:`DatetimeIndex` from data with ``timedelta64``-dtyped data is deprecated, will raise ``TypeError`` in a future version (:issue:`23675`) @@ -1692,8 +1757,8 @@ Missing - Bug in :func:`Series.hasnans` that could be incorrectly cached and return incorrect answers if null elements are introduced after an initial call (:issue:`19700`) - :func:`Series.isin` now treats all NaN-floats as equal also for ``np.object``-dtype. This behavior is consistent with the behavior for float64 (:issue:`22119`) - :func:`unique` no longer mangles NaN-floats and the ``NaT``-object for ``np.object``-dtype, i.e. ``NaT`` is no longer coerced to a NaN-value and is treated as a different entity. (:issue:`22295`) -- :func:`DataFrame` and :func:`Series` now properly handle numpy masked arrays with hardened masks. Previously, constructing a DataFrame or Series from a masked array with a hard mask would create a pandas object containing the underlying value, rather than the expected NaN. (:issue:`24574`) - +- :class:`DataFrame` and :class:`Series` now properly handle numpy masked arrays with hardened masks. Previously, constructing a DataFrame or Series from a masked array with a hard mask would create a pandas object containing the underlying value, rather than the expected NaN. (:issue:`24574`) +- Bug in :class:`DataFrame` constructor where ``dtype`` argument was not honored when handling numpy masked record arrays. (:issue:`24874`) MultiIndex ^^^^^^^^^^ @@ -1751,6 +1816,8 @@ I/O - Bug in :meth:`DataFrame.to_stata`, :class:`pandas.io.stata.StataWriter` and :class:`pandas.io.stata.StataWriter117` where a exception would leave a partially written and invalid dta file (:issue:`23573`) - Bug in :meth:`DataFrame.to_stata` and :class:`pandas.io.stata.StataWriter117` that produced invalid files when using strLs with non-ASCII characters (:issue:`23573`) - Bug in :class:`HDFStore` that caused it to raise ``ValueError`` when reading a Dataframe in Python 3 from fixed format written in Python 2 (:issue:`24510`) +- Bug in :func:`DataFrame.to_string()` and more generally in the floating ``repr`` formatter. Zeros were not trimmed if ``inf`` was present in a columns while it was the case with NA values. Zeros are now trimmed as in the presence of NA (:issue:`24861`). +- Bug in the ``repr`` when truncating the number of columns and having a wide last column (:issue:`24849`). Plotting ^^^^^^^^ @@ -1786,6 +1853,7 @@ Groupby/Resample/Rolling - Bug in :meth:`DataFrame.groupby` did not respect the ``observed`` argument when selecting a column and instead always used ``observed=False`` (:issue:`23970`) - Bug in :func:`pandas.core.groupby.SeriesGroupBy.pct_change` or :func:`pandas.core.groupby.DataFrameGroupBy.pct_change` would previously work across groups when calculating the percent change, where it now correctly works per group (:issue:`21200`, :issue:`21235`). - Bug preventing hash table creation with very large number (2^32) of rows (:issue:`22805`) +- Bug in groupby when grouping on categorical causes ``ValueError`` and incorrect grouping if ``observed=True`` and ``nan`` is present in categorical column (:issue:`24740`, :issue:`21151`). Reshaping ^^^^^^^^^ @@ -1821,7 +1889,6 @@ Reshaping - Bug in :func:`DataFrame.unstack` where a ``ValueError`` was raised when unstacking timezone aware values (:issue:`18338`) - Bug in :func:`DataFrame.stack` where timezone aware values were converted to timezone naive values (:issue:`19420`) - Bug in :func:`merge_asof` where a ``TypeError`` was raised when ``by_col`` were timezone aware values (:issue:`21184`) -- Bug in :func:`merge` when merging by index name would sometimes result in an incorrectly numbered index (:issue:`24212`) - Bug showing an incorrect shape when throwing error during ``DataFrame`` construction. (:issue:`20742`) .. _whatsnew_0240.bug_fixes.sparse: diff --git a/doc/source/whatsnew/v0.24.1.rst b/doc/source/whatsnew/v0.24.1.rst index ee4b7ab62b31a..be0a2eb682e87 100644 --- a/doc/source/whatsnew/v0.24.1.rst +++ b/doc/source/whatsnew/v0.24.1.rst @@ -2,8 +2,8 @@ .. _whatsnew_0241: -Whats New in 0.24.1 (February XX, 2019) ---------------------------------------- +Whats New in 0.24.1 (February 3, 2019) +-------------------------------------- .. warning:: @@ -13,61 +13,69 @@ Whats New in 0.24.1 (February XX, 2019) {{ header }} These are the changes in pandas 0.24.1. See :ref:`release` for a full changelog -including other versions of pandas. +including other versions of pandas. See :ref:`whatsnew_0240` for the 0.24.0 changelog. +.. _whatsnew_0241.api: -.. _whatsnew_0241.enhancements: +API Changes +~~~~~~~~~~~ -Enhancements -^^^^^^^^^^^^ +Changing the ``sort`` parameter for :class:`Index` set operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The default ``sort`` value for :meth:`Index.union` has changed from ``True`` to ``None`` (:issue:`24959`). +The default *behavior*, however, remains the same: the result is sorted, unless -.. _whatsnew_0241.bug_fixes: - -Bug Fixes -~~~~~~~~~ +1. ``self`` and ``other`` are identical +2. ``self`` or ``other`` is empty +3. ``self`` or ``other`` contain values that can not be compared (a ``RuntimeWarning`` is raised). -**Conversion** +This change will allow ``sort=True`` to mean "always sort" in a future release. -- -- -- +The same change applies to :meth:`Index.difference` and :meth:`Index.symmetric_difference`, which +would not sort the result when the values could not be compared. -**Indexing** +The `sort` option for :meth:`Index.intersection` has changed in three ways. -- -- -- +1. The default has changed from ``True`` to ``False``, to restore the + pandas 0.23.4 and earlier behavior of not sorting by default. +2. The behavior of ``sort=True`` can now be obtained with ``sort=None``. + This will sort the result only if the values in ``self`` and ``other`` + are not identical. +3. The value ``sort=True`` is no longer allowed. A future version of pandas + will properly support ``sort=True`` meaning "always sort". -**I/O** +.. _whatsnew_0241.regressions: -- -- -- +Fixed Regressions +~~~~~~~~~~~~~~~~~ -**Categorical** +- Fixed regression in :meth:`DataFrame.to_dict` with ``records`` orient raising an + ``AttributeError`` when the ``DataFrame`` contained more than 255 columns, or + wrongly converting column names that were not valid python identifiers (:issue:`24939`, :issue:`24940`). +- Fixed regression in :func:`read_sql` when passing certain queries with MySQL/pymysql (:issue:`24988`). +- Fixed regression in :class:`Index.intersection` incorrectly sorting the values by default (:issue:`24959`). +- Fixed regression in :func:`merge` when merging an empty ``DataFrame`` with multiple timezone-aware columns on one of the timezone-aware columns (:issue:`25014`). +- Fixed regression in :meth:`Series.rename_axis` and :meth:`DataFrame.rename_axis` where passing ``None`` failed to remove the axis name (:issue:`25034`) +- Fixed regression in :func:`to_timedelta` with `box=False` incorrectly returning a ``datetime64`` object instead of a ``timedelta64`` object (:issue:`24961`) +- Fixed regression where custom hashable types could not be used as column keys in :meth:`DataFrame.set_index` (:issue:`24969`) -- -- -- +.. _whatsnew_0241.bug_fixes: -**Timezones** +Bug Fixes +~~~~~~~~~ -- -- -- +**Reshaping** -**Timedelta** +- Bug in :meth:`DataFrame.groupby` with :class:`Grouper` when there is a time change (DST) and grouping frequency is ``'1d'`` (:issue:`24972`) -- -- -- +**Visualization** +- Fixed the warning for implicitly registered matplotlib converters not showing. See :ref:`whatsnew_0211.converters` for more (:issue:`24963`). **Other** -- -- +- Fixed AttributeError when printing a DataFrame's HTML repr after accessing the IPython config object (:issue:`25036`) .. _whatsnew_0.241.contributors: diff --git a/doc/source/whatsnew/v0.24.2.rst b/doc/source/whatsnew/v0.24.2.rst new file mode 100644 index 0000000000000..b0f287cf0b9f6 --- /dev/null +++ b/doc/source/whatsnew/v0.24.2.rst @@ -0,0 +1,100 @@ +:orphan: + +.. _whatsnew_0242: + +Whats New in 0.24.2 (February XX, 2019) +--------------------------------------- + +.. warning:: + + The 0.24.x series of releases will be the last to support Python 2. Future feature + releases will support Python 3 only. See :ref:`install.dropping-27` for more. + +{{ header }} + +These are the changes in pandas 0.24.2. See :ref:`release` for a full changelog +including other versions of pandas. + +.. _whatsnew_0242.regressions: + +Fixed Regressions +^^^^^^^^^^^^^^^^^ + +- Fixed regression in :meth:`DataFrame.all` and :meth:`DataFrame.any` where ``bool_only=True`` was ignored (:issue:`25101`) +- Fixed issue in ``DataFrame`` construction with passing a mixed list of mixed types could segfault. (:issue:`25075`) +- Fixed regression in :meth:`DataFrame.apply` causing ``RecursionError`` when ``dict``-like classes were passed as argument. (:issue:`25196`) + +.. _whatsnew_0242.enhancements: + +Enhancements +^^^^^^^^^^^^ + +- +- + +.. _whatsnew_0242.bug_fixes: + +Bug Fixes +~~~~~~~~~ + +**Conversion** + +- +- +- + +**Indexing** + +- +- +- + +**I/O** + +- Bug in reading a HDF5 table-format ``DataFrame`` created in Python 2, in Python 3 (:issue:`24925`) +- Bug in reading a JSON with ``orient='table'`` generated by :meth:`DataFrame.to_json` with ``index=False`` (:issue:`25170`) +- Bug where float indexes could have misaligned values when printing (:issue:`25061`) +- + +**Categorical** + +- +- +- + +**Timezones** + +- +- +- + +**Timedelta** + +- +- +- + +**Reshaping** + +- +- +- + +**Visualization** + +- +- +- + +**Other** + +- Bug in :meth:`Series.is_unique` where single occurrences of ``NaN`` were not considered unique (:issue:`25180`) +- +- + +.. _whatsnew_0.242.contributors: + +Contributors +~~~~~~~~~~~~ + +.. contributors:: v0.24.1..v0.24.2 diff --git a/doc/source/whatsnew/v0.25.0.rst b/doc/source/whatsnew/v0.25.0.rst index 24298b3025169..601c230296f7d 100644 --- a/doc/source/whatsnew/v0.25.0.rst +++ b/doc/source/whatsnew/v0.25.0.rst @@ -1,10 +1,13 @@ -:orphan: - .. _whatsnew_0250: What's New in 0.25.0 (April XX, 2019) ------------------------------------- +.. warning:: + + Starting with the 0.25.x series of releases, pandas only supports Python 3.5 and higher. + See :ref:`install.dropping-27` for more details. + {{ header }} These are the changes in pandas 0.25.0. See :ref:`release` for a full changelog @@ -16,10 +19,9 @@ including other versions of pandas. Other Enhancements ^^^^^^^^^^^^^^^^^^ +- :meth:`Timestamp.replace` now supports the ``fold`` argument to disambiguate DST transition times (:issue:`25017`) - - -- - .. _whatsnew_0250.api_breaking: @@ -40,16 +42,13 @@ Other API Changes Deprecations ~~~~~~~~~~~~ -- -- -- - +- Deprecated the `M (months)` and `Y (year)` `units` parameter of :func: `pandas.to_timedelta`, :func: `pandas.Timedelta` and :func: `pandas.TimedeltaIndex` (:issue:`16344`) .. _whatsnew_0250.prior_deprecations: Removal of prior version deprecations/changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - +- Removed (parts of) :class:`Panel` (:issue:`25047`,:issue:`25191`,:issue:`25231`) - - - @@ -59,8 +58,8 @@ Removal of prior version deprecations/changes Performance Improvements ~~~~~~~~~~~~~~~~~~~~~~~~ -- -- +- Significant speedup in `SparseArray` initialization that benefits most operations, fixing performance regression introduced in v0.20.0 (:issue:`24985`) +- `DataFrame.to_stata()` is now faster when outputting data with any string or non-native endian columns (:issue:`25045`) - @@ -93,13 +92,15 @@ Timedelta Timezones ^^^^^^^^^ -- +- Bug in :func:`to_datetime` with ``utc=True`` and datetime strings that would apply previously parsed UTC offsets to subsequent arguments (:issue:`24992`) - - Numeric ^^^^^^^ +- Bug in :meth:`to_numeric` in which large negative numbers were being improperly handled (:issue:`24910`) +- Bug in :meth:`to_numeric` in which numbers were being coerced to float, even though ``errors`` was not ``coerce`` (:issue:`24910`) - - - @@ -153,9 +154,11 @@ MultiIndex I/O ^^^ +- Fixed bug in missing text when using :meth:`to_clipboard` if copying utf-16 characters in Python 3 on Windows (:issue:`25040`) - Bug in :func:`DataFrame.to_html()` where values were truncated using display options instead of outputting the full content (:issue:`17004`) - - +- Plotting @@ -176,15 +179,16 @@ Groupby/Resample/Rolling Reshaping ^^^^^^^^^ -- -- +- Bug in :func:`pandas.merge` adds a string of ``None`` if ``None`` is assigned in suffixes instead of remain the column name as-is (:issue:`24782`). +- Bug in :func:`merge` when merging by index name would sometimes result in an incorrectly numbered index (:issue:`24212`) +- :func:`to_records` now accepts dtypes to its `column_dtypes` parameter (:issue:`24895`) - Sparse ^^^^^^ -- +- Significant speedup in `SparseArray` initialization that benefits most operations, fixing performance regression introduced in v0.20.0 (:issue:`24985`) - - @@ -203,4 +207,3 @@ Contributors ~~~~~~~~~~~~ .. contributors:: v0.24.x..HEAD - diff --git a/pandas/_libs/algos.pyx b/pandas/_libs/algos.pyx index b3c519ab99b6e..663411ad984c2 100644 --- a/pandas/_libs/algos.pyx +++ b/pandas/_libs/algos.pyx @@ -76,7 +76,7 @@ class NegInfinity(object): @cython.wraparound(False) @cython.boundscheck(False) -cpdef ndarray[int64_t, ndim=1] unique_deltas(ndarray[int64_t] arr): +cpdef ndarray[int64_t, ndim=1] unique_deltas(const int64_t[:] arr): """ Efficiently find the unique first-differences of the given array. @@ -150,7 +150,7 @@ def is_lexsorted(list_of_arrays: list) -> bint: @cython.boundscheck(False) @cython.wraparound(False) -def groupsort_indexer(ndarray[int64_t] index, Py_ssize_t ngroups): +def groupsort_indexer(const int64_t[:] index, Py_ssize_t ngroups): """ compute a 1-d indexer that is an ordering of the passed index, ordered by the groups. This is a reverse of the label @@ -230,7 +230,7 @@ def kth_smallest(numeric[:] a, Py_ssize_t k) -> numeric: @cython.boundscheck(False) @cython.wraparound(False) -def nancorr(ndarray[float64_t, ndim=2] mat, bint cov=0, minp=None): +def nancorr(const float64_t[:, :] mat, bint cov=0, minp=None): cdef: Py_ssize_t i, j, xi, yi, N, K bint minpv @@ -294,7 +294,7 @@ def nancorr(ndarray[float64_t, ndim=2] mat, bint cov=0, minp=None): @cython.boundscheck(False) @cython.wraparound(False) -def nancorr_spearman(ndarray[float64_t, ndim=2] mat, Py_ssize_t minp=1): +def nancorr_spearman(const float64_t[:, :] mat, Py_ssize_t minp=1): cdef: Py_ssize_t i, j, xi, yi, N, K ndarray[float64_t, ndim=2] result @@ -435,8 +435,8 @@ def pad(ndarray[algos_t] old, ndarray[algos_t] new, limit=None): @cython.boundscheck(False) @cython.wraparound(False) -def pad_inplace(ndarray[algos_t] values, - ndarray[uint8_t, cast=True] mask, +def pad_inplace(algos_t[:] values, + const uint8_t[:] mask, limit=None): cdef: Py_ssize_t i, N @@ -472,8 +472,8 @@ def pad_inplace(ndarray[algos_t] values, @cython.boundscheck(False) @cython.wraparound(False) -def pad_2d_inplace(ndarray[algos_t, ndim=2] values, - ndarray[uint8_t, ndim=2] mask, +def pad_2d_inplace(algos_t[:, :] values, + const uint8_t[:, :] mask, limit=None): cdef: Py_ssize_t i, j, N, K @@ -602,8 +602,8 @@ def backfill(ndarray[algos_t] old, ndarray[algos_t] new, limit=None): @cython.boundscheck(False) @cython.wraparound(False) -def backfill_inplace(ndarray[algos_t] values, - ndarray[uint8_t, cast=True] mask, +def backfill_inplace(algos_t[:] values, + const uint8_t[:] mask, limit=None): cdef: Py_ssize_t i, N @@ -639,8 +639,8 @@ def backfill_inplace(ndarray[algos_t] values, @cython.boundscheck(False) @cython.wraparound(False) -def backfill_2d_inplace(ndarray[algos_t, ndim=2] values, - ndarray[uint8_t, ndim=2] mask, +def backfill_2d_inplace(algos_t[:, :] values, + const uint8_t[:, :] mask, limit=None): cdef: Py_ssize_t i, j, N, K @@ -678,7 +678,7 @@ def backfill_2d_inplace(ndarray[algos_t, ndim=2] values, @cython.wraparound(False) @cython.boundscheck(False) -def arrmap(ndarray[algos_t] index, object func): +def arrmap(algos_t[:] index, object func): cdef: Py_ssize_t length = index.shape[0] Py_ssize_t i = 0 diff --git a/pandas/_libs/groupby.pyx b/pandas/_libs/groupby.pyx index e6036654c71c3..950ba3f89ffb7 100644 --- a/pandas/_libs/groupby.pyx +++ b/pandas/_libs/groupby.pyx @@ -2,6 +2,7 @@ import cython from cython import Py_ssize_t +from cython cimport floating from libc.stdlib cimport malloc, free @@ -382,5 +383,55 @@ def group_any_all(uint8_t[:] out, out[lab] = flag_val +@cython.wraparound(False) +@cython.boundscheck(False) +def _group_add(floating[:, :] out, + int64_t[:] counts, + floating[:, :] values, + const int64_t[:] labels, + Py_ssize_t min_count=0): + """ + Only aggregates on axis=0 + """ + cdef: + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) + floating val, count + ndarray[floating, ndim=2] sumx, nobs + + if not len(values) == len(labels): + raise AssertionError("len(index) != len(labels)") + + nobs = np.zeros_like(out) + sumx = np.zeros_like(out) + + N, K = (values).shape + + with nogil: + + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + sumx[lab, j] += val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] < min_count: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] + + +group_add_float32 = _group_add['float'] +group_add_float64 = _group_add['double'] + # generated from template include "groupby_helper.pxi" diff --git a/pandas/_libs/groupby_helper.pxi.in b/pandas/_libs/groupby_helper.pxi.in index abac9f147848e..db7018e1a7254 100644 --- a/pandas/_libs/groupby_helper.pxi.in +++ b/pandas/_libs/groupby_helper.pxi.in @@ -9,7 +9,7 @@ cdef extern from "numpy/npy_math.h": _int64_max = np.iinfo(np.int64).max # ---------------------------------------------------------------------- -# group_add, group_prod, group_var, group_mean, group_ohlc +# group_prod, group_var, group_mean, group_ohlc # ---------------------------------------------------------------------- {{py: @@ -29,57 +29,10 @@ def get_dispatch(dtypes): @cython.wraparound(False) @cython.boundscheck(False) -def group_add_{{name}}(ndarray[{{c_type}}, ndim=2] out, - ndarray[int64_t] counts, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, - Py_ssize_t min_count=0): - """ - Only aggregates on axis=0 - """ - cdef: - Py_ssize_t i, j, N, K, lab, ncounts = len(counts) - {{c_type}} val, count - ndarray[{{c_type}}, ndim=2] sumx, nobs - - if not len(values) == len(labels): - raise AssertionError("len(index) != len(labels)") - - nobs = np.zeros_like(out) - sumx = np.zeros_like(out) - - N, K = (values).shape - - with nogil: - - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - for j in range(K): - val = values[i, j] - - # not nan - if val == val: - nobs[lab, j] += 1 - sumx[lab, j] += val - - for i in range(ncounts): - for j in range(K): - if nobs[i, j] < min_count: - out[i, j] = NAN - else: - out[i, j] = sumx[i, j] - - -@cython.wraparound(False) -@cython.boundscheck(False) -def group_prod_{{name}}(ndarray[{{c_type}}, ndim=2] out, - ndarray[int64_t] counts, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, +def group_prod_{{name}}({{c_type}}[:, :] out, + int64_t[:] counts, + {{c_type}}[:, :] values, + const int64_t[:] labels, Py_ssize_t min_count=0): """ Only aggregates on axis=0 @@ -123,10 +76,10 @@ def group_prod_{{name}}(ndarray[{{c_type}}, ndim=2] out, @cython.wraparound(False) @cython.boundscheck(False) @cython.cdivision(True) -def group_var_{{name}}(ndarray[{{c_type}}, ndim=2] out, - ndarray[int64_t] counts, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, +def group_var_{{name}}({{c_type}}[:, :] out, + int64_t[:] counts, + {{c_type}}[:, :] values, + const int64_t[:] labels, Py_ssize_t min_count=-1): cdef: Py_ssize_t i, j, N, K, lab, ncounts = len(counts) @@ -175,10 +128,10 @@ def group_var_{{name}}(ndarray[{{c_type}}, ndim=2] out, @cython.wraparound(False) @cython.boundscheck(False) -def group_mean_{{name}}(ndarray[{{c_type}}, ndim=2] out, - ndarray[int64_t] counts, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, +def group_mean_{{name}}({{c_type}}[:, :] out, + int64_t[:] counts, + {{c_type}}[:, :] values, + const int64_t[:] labels, Py_ssize_t min_count=-1): cdef: Py_ssize_t i, j, N, K, lab, ncounts = len(counts) @@ -220,11 +173,11 @@ def group_mean_{{name}}(ndarray[{{c_type}}, ndim=2] out, @cython.wraparound(False) @cython.boundscheck(False) -def group_ohlc_{{name}}(ndarray[{{c_type}}, ndim=2] out, - ndarray[int64_t] counts, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, - Py_ssize_t min_count=-1): +def group_ohlc_{{name}}({{c_type}}[:, :] out, + int64_t[:] counts, + {{c_type}}[:, :] values, + const int64_t[:] labels, + Py_ssize_t min_count=-1): """ Only aggregates on axis=0 """ @@ -293,10 +246,10 @@ def get_dispatch(dtypes): @cython.wraparound(False) @cython.boundscheck(False) -def group_last_{{name}}(ndarray[{{c_type}}, ndim=2] out, - ndarray[int64_t] counts, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, +def group_last_{{name}}({{c_type}}[:, :] out, + int64_t[:] counts, + {{c_type}}[:, :] values, + const int64_t[:] labels, Py_ssize_t min_count=-1): """ Only aggregates on axis=0 @@ -350,10 +303,10 @@ def group_last_{{name}}(ndarray[{{c_type}}, ndim=2] out, @cython.wraparound(False) @cython.boundscheck(False) -def group_nth_{{name}}(ndarray[{{c_type}}, ndim=2] out, - ndarray[int64_t] counts, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, int64_t rank, +def group_nth_{{name}}({{c_type}}[:, :] out, + int64_t[:] counts, + {{c_type}}[:, :] values, + const int64_t[:] labels, int64_t rank, Py_ssize_t min_count=-1): """ Only aggregates on axis=0 @@ -411,9 +364,9 @@ def group_nth_{{name}}(ndarray[{{c_type}}, ndim=2] out, @cython.boundscheck(False) @cython.wraparound(False) -def group_rank_{{name}}(ndarray[float64_t, ndim=2] out, - ndarray[{{c_type}}, ndim=2] values, - ndarray[int64_t] labels, +def group_rank_{{name}}(float64_t[:, :] out, + {{c_type}}[:, :] values, + const int64_t[:] labels, bint is_datetimelike, object ties_method, bint ascending, bint pct, object na_option): """ @@ -606,10 +559,10 @@ ctypedef fused groupby_t: @cython.wraparound(False) @cython.boundscheck(False) -def group_max(ndarray[groupby_t, ndim=2] out, - ndarray[int64_t] counts, - ndarray[groupby_t, ndim=2] values, - ndarray[int64_t] labels, +def group_max(groupby_t[:, :] out, + int64_t[:] counts, + groupby_t[:, :] values, + const int64_t[:] labels, Py_ssize_t min_count=-1): """ Only aggregates on axis=0 @@ -669,10 +622,10 @@ def group_max(ndarray[groupby_t, ndim=2] out, @cython.wraparound(False) @cython.boundscheck(False) -def group_min(ndarray[groupby_t, ndim=2] out, - ndarray[int64_t] counts, - ndarray[groupby_t, ndim=2] values, - ndarray[int64_t] labels, +def group_min(groupby_t[:, :] out, + int64_t[:] counts, + groupby_t[:, :] values, + const int64_t[:] labels, Py_ssize_t min_count=-1): """ Only aggregates on axis=0 @@ -731,9 +684,9 @@ def group_min(ndarray[groupby_t, ndim=2] out, @cython.boundscheck(False) @cython.wraparound(False) -def group_cummin(ndarray[groupby_t, ndim=2] out, - ndarray[groupby_t, ndim=2] values, - ndarray[int64_t] labels, +def group_cummin(groupby_t[:, :] out, + groupby_t[:, :] values, + const int64_t[:] labels, bint is_datetimelike): """ Only transforms on axis=0 @@ -779,9 +732,9 @@ def group_cummin(ndarray[groupby_t, ndim=2] out, @cython.boundscheck(False) @cython.wraparound(False) -def group_cummax(ndarray[groupby_t, ndim=2] out, - ndarray[groupby_t, ndim=2] values, - ndarray[int64_t] labels, +def group_cummax(groupby_t[:, :] out, + groupby_t[:, :] values, + const int64_t[:] labels, bint is_datetimelike): """ Only transforms on axis=0 diff --git a/pandas/_libs/hashtable.pyx b/pandas/_libs/hashtable.pyx index 47fa5932290af..8d0c451ad0ab8 100644 --- a/pandas/_libs/hashtable.pyx +++ b/pandas/_libs/hashtable.pyx @@ -52,9 +52,10 @@ include "hashtable_class_helper.pxi" include "hashtable_func_helper.pxi" cdef class Factorizer: - cdef public PyObjectHashTable table - cdef public ObjectVector uniques - cdef public Py_ssize_t count + cdef public: + PyObjectHashTable table + ObjectVector uniques + Py_ssize_t count def __init__(self, size_hint): self.table = PyObjectHashTable(size_hint) @@ -96,9 +97,10 @@ cdef class Factorizer: cdef class Int64Factorizer: - cdef public Int64HashTable table - cdef public Int64Vector uniques - cdef public Py_ssize_t count + cdef public: + Int64HashTable table + Int64Vector uniques + Py_ssize_t count def __init__(self, size_hint): self.table = Int64HashTable(size_hint) @@ -140,7 +142,7 @@ cdef class Int64Factorizer: @cython.wraparound(False) @cython.boundscheck(False) -def unique_label_indices(ndarray[int64_t, ndim=1] labels): +def unique_label_indices(const int64_t[:] labels): """ indices of the first occurrences of the unique labels *excluding* -1. equivalent to: @@ -168,6 +170,6 @@ def unique_label_indices(ndarray[int64_t, ndim=1] labels): kh_destroy_int64(table) arr = idx.to_array() - arr = arr[labels[arr].argsort()] + arr = arr[np.asarray(labels)[arr].argsort()] return arr[1:] if arr.size != 0 and labels[arr[0]] == -1 else arr diff --git a/pandas/_libs/hashtable_class_helper.pxi.in b/pandas/_libs/hashtable_class_helper.pxi.in index eac35588b6fc3..3644928d8dedc 100644 --- a/pandas/_libs/hashtable_class_helper.pxi.in +++ b/pandas/_libs/hashtable_class_helper.pxi.in @@ -322,7 +322,7 @@ cdef class {{name}}HashTable(HashTable): self.table.vals[k] = values[i] @cython.boundscheck(False) - def map_locations(self, ndarray[{{dtype}}_t, ndim=1] values): + def map_locations(self, const {{dtype}}_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 diff --git a/pandas/_libs/internals.pyx b/pandas/_libs/internals.pyx index 72a1cf16f96b6..f23d2666b4bf4 100644 --- a/pandas/_libs/internals.pyx +++ b/pandas/_libs/internals.pyx @@ -23,10 +23,11 @@ from pandas._libs.algos import ensure_int64 cdef class BlockPlacement: # __slots__ = '_as_slice', '_as_array', '_len' - cdef slice _as_slice - cdef object _as_array + cdef: + slice _as_slice + object _as_array - cdef bint _has_slice, _has_array, _is_known_slice_like + bint _has_slice, _has_array, _is_known_slice_like def __init__(self, val): cdef: diff --git a/pandas/_libs/interval.pyx b/pandas/_libs/interval.pyx index 3147f36dcc835..eb511b1adb28a 100644 --- a/pandas/_libs/interval.pyx +++ b/pandas/_libs/interval.pyx @@ -18,7 +18,6 @@ cnp.import_array() cimport pandas._libs.util as util -util.import_array() from pandas._libs.hashtable cimport Int64Vector, Int64VectorData diff --git a/pandas/_libs/join.pyx b/pandas/_libs/join.pyx index e4440ac3d9fd8..503867058b3c8 100644 --- a/pandas/_libs/join.pyx +++ b/pandas/_libs/join.pyx @@ -14,7 +14,7 @@ from pandas._libs.algos import groupsort_indexer, ensure_platform_int from pandas.core.algorithms import take_nd -def inner_join(ndarray[int64_t] left, ndarray[int64_t] right, +def inner_join(const int64_t[:] left, const int64_t[:] right, Py_ssize_t max_groups): cdef: Py_ssize_t i, j, k, count = 0 @@ -65,7 +65,7 @@ def inner_join(ndarray[int64_t] left, ndarray[int64_t] right, _get_result_indexer(right_sorter, right_indexer)) -def left_outer_join(ndarray[int64_t] left, ndarray[int64_t] right, +def left_outer_join(const int64_t[:] left, const int64_t[:] right, Py_ssize_t max_groups, sort=True): cdef: Py_ssize_t i, j, k, count = 0 @@ -139,7 +139,7 @@ def left_outer_join(ndarray[int64_t] left, ndarray[int64_t] right, return left_indexer, right_indexer -def full_outer_join(ndarray[int64_t] left, ndarray[int64_t] right, +def full_outer_join(const int64_t[:] left, const int64_t[:] right, Py_ssize_t max_groups): cdef: Py_ssize_t i, j, k, count = 0 @@ -213,7 +213,7 @@ def _get_result_indexer(sorter, indexer): return res -def ffill_indexer(ndarray[int64_t] indexer): +def ffill_indexer(const int64_t[:] indexer): cdef: Py_ssize_t i, n = len(indexer) ndarray[int64_t] result @@ -252,7 +252,7 @@ ctypedef fused join_t: @cython.wraparound(False) @cython.boundscheck(False) -def left_join_indexer_unique(ndarray[join_t] left, ndarray[join_t] right): +def left_join_indexer_unique(join_t[:] left, join_t[:] right): cdef: Py_ssize_t i, j, nleft, nright ndarray[int64_t] indexer @@ -677,10 +677,10 @@ ctypedef fused by_t: uint64_t -def asof_join_backward_on_X_by_Y(ndarray[asof_t] left_values, - ndarray[asof_t] right_values, - ndarray[by_t] left_by_values, - ndarray[by_t] right_by_values, +def asof_join_backward_on_X_by_Y(asof_t[:] left_values, + asof_t[:] right_values, + by_t[:] left_by_values, + by_t[:] right_by_values, bint allow_exact_matches=1, tolerance=None): @@ -746,10 +746,10 @@ def asof_join_backward_on_X_by_Y(ndarray[asof_t] left_values, return left_indexer, right_indexer -def asof_join_forward_on_X_by_Y(ndarray[asof_t] left_values, - ndarray[asof_t] right_values, - ndarray[by_t] left_by_values, - ndarray[by_t] right_by_values, +def asof_join_forward_on_X_by_Y(asof_t[:] left_values, + asof_t[:] right_values, + by_t[:] left_by_values, + by_t[:] right_by_values, bint allow_exact_matches=1, tolerance=None): @@ -815,10 +815,10 @@ def asof_join_forward_on_X_by_Y(ndarray[asof_t] left_values, return left_indexer, right_indexer -def asof_join_nearest_on_X_by_Y(ndarray[asof_t] left_values, - ndarray[asof_t] right_values, - ndarray[by_t] left_by_values, - ndarray[by_t] right_by_values, +def asof_join_nearest_on_X_by_Y(asof_t[:] left_values, + asof_t[:] right_values, + by_t[:] left_by_values, + by_t[:] right_by_values, bint allow_exact_matches=1, tolerance=None): @@ -864,8 +864,8 @@ def asof_join_nearest_on_X_by_Y(ndarray[asof_t] left_values, # asof_join # ---------------------------------------------------------------------- -def asof_join_backward(ndarray[asof_t] left_values, - ndarray[asof_t] right_values, +def asof_join_backward(asof_t[:] left_values, + asof_t[:] right_values, bint allow_exact_matches=1, tolerance=None): @@ -917,8 +917,8 @@ def asof_join_backward(ndarray[asof_t] left_values, return left_indexer, right_indexer -def asof_join_forward(ndarray[asof_t] left_values, - ndarray[asof_t] right_values, +def asof_join_forward(asof_t[:] left_values, + asof_t[:] right_values, bint allow_exact_matches=1, tolerance=None): @@ -971,8 +971,8 @@ def asof_join_forward(ndarray[asof_t] left_values, return left_indexer, right_indexer -def asof_join_nearest(ndarray[asof_t] left_values, - ndarray[asof_t] right_values, +def asof_join_nearest(asof_t[:] left_values, + asof_t[:] right_values, bint allow_exact_matches=1, tolerance=None): diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index f845a5437ded4..1f0f0a408aee8 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -40,11 +40,12 @@ cdef extern from "numpy/arrayobject.h": # Use PyDataType_* macros when possible, however there are no macros # for accessing some of the fields, so some are defined. Please # ask on cython-dev if you need more. - cdef int type_num - cdef int itemsize "elsize" - cdef char byteorder - cdef object fields - cdef tuple names + cdef: + int type_num + int itemsize "elsize" + char byteorder + object fields + tuple names cdef extern from "src/parse_helper.h": @@ -67,12 +68,13 @@ from pandas._libs.missing cimport ( # constants that will be compared to potentially arbitrarily large # python int -cdef object oINT64_MAX = INT64_MAX -cdef object oINT64_MIN = INT64_MIN -cdef object oUINT64_MAX = UINT64_MAX +cdef: + object oINT64_MAX = INT64_MAX + object oINT64_MIN = INT64_MIN + object oUINT64_MAX = UINT64_MAX -cdef bint PY2 = sys.version_info[0] == 2 -cdef float64_t NaN = np.NaN + bint PY2 = sys.version_info[0] == 2 + float64_t NaN = np.NaN def values_from_object(obj: object): @@ -231,10 +233,11 @@ def fast_unique_multiple(list arrays, sort: bool=True): if val not in table: table[val] = stub uniques.append(val) - if sort: + if sort is None: try: uniques.sort() except Exception: + # TODO: RuntimeWarning? pass return uniques @@ -376,7 +379,7 @@ def fast_zip(list ndarrays): return result -def get_reverse_indexer(ndarray[int64_t] indexer, Py_ssize_t length): +def get_reverse_indexer(const int64_t[:] indexer, Py_ssize_t length): """ Reverse indexing operation. @@ -405,7 +408,7 @@ def get_reverse_indexer(ndarray[int64_t] indexer, Py_ssize_t length): @cython.wraparound(False) @cython.boundscheck(False) -def has_infs_f4(ndarray[float32_t] arr) -> bool: +def has_infs_f4(const float32_t[:] arr) -> bool: cdef: Py_ssize_t i, n = len(arr) float32_t inf, neginf, val @@ -422,7 +425,7 @@ def has_infs_f4(ndarray[float32_t] arr) -> bool: @cython.wraparound(False) @cython.boundscheck(False) -def has_infs_f8(ndarray[float64_t] arr) -> bool: +def has_infs_f8(const float64_t[:] arr) -> bool: cdef: Py_ssize_t i, n = len(arr) float64_t inf, neginf, val @@ -660,7 +663,7 @@ def clean_index_list(obj: list): # is a general, O(max(len(values), len(binner))) method. @cython.boundscheck(False) @cython.wraparound(False) -def generate_bins_dt64(ndarray[int64_t] values, ndarray[int64_t] binner, +def generate_bins_dt64(ndarray[int64_t] values, const int64_t[:] binner, object closed='left', bint hasnans=0): """ Int64 (datetime64) version of generic python version in groupby.py @@ -723,7 +726,7 @@ def generate_bins_dt64(ndarray[int64_t] values, ndarray[int64_t] binner, @cython.boundscheck(False) @cython.wraparound(False) -def row_bool_subset(ndarray[float64_t, ndim=2] values, +def row_bool_subset(const float64_t[:, :] values, ndarray[uint8_t, cast=True] mask): cdef: Py_ssize_t i, j, n, k, pos = 0 @@ -767,8 +770,8 @@ def row_bool_subset_object(ndarray[object, ndim=2] values, @cython.boundscheck(False) @cython.wraparound(False) -def get_level_sorter(ndarray[int64_t, ndim=1] label, - ndarray[int64_t, ndim=1] starts): +def get_level_sorter(const int64_t[:] label, + const int64_t[:] starts): """ argsort for a single level of a multi-index, keeping the order of higher levels unchanged. `starts` points to starts of same-key indices w.r.t @@ -780,10 +783,11 @@ def get_level_sorter(ndarray[int64_t, ndim=1] label, int64_t l, r Py_ssize_t i ndarray[int64_t, ndim=1] out = np.empty(len(label), dtype=np.int64) + ndarray[int64_t, ndim=1] label_arr = np.asarray(label) for i in range(len(starts) - 1): l, r = starts[i], starts[i + 1] - out[l:r] = l + label[l:r].argsort(kind='mergesort') + out[l:r] = l + label_arr[l:r].argsort(kind='mergesort') return out @@ -791,7 +795,7 @@ def get_level_sorter(ndarray[int64_t, ndim=1] label, @cython.boundscheck(False) @cython.wraparound(False) def count_level_2d(ndarray[uint8_t, ndim=2, cast=True] mask, - ndarray[int64_t, ndim=1] labels, + const int64_t[:] labels, Py_ssize_t max_bin, int axis): cdef: @@ -818,7 +822,7 @@ def count_level_2d(ndarray[uint8_t, ndim=2, cast=True] mask, return counts -def generate_slices(ndarray[int64_t] labels, Py_ssize_t ngroups): +def generate_slices(const int64_t[:] labels, Py_ssize_t ngroups): cdef: Py_ssize_t i, group_size, n, start int64_t lab @@ -847,7 +851,7 @@ def generate_slices(ndarray[int64_t] labels, Py_ssize_t ngroups): return starts, ends -def indices_fast(object index, ndarray[int64_t] labels, list keys, +def indices_fast(object index, const int64_t[:] labels, list keys, list sorted_labels): cdef: Py_ssize_t i, j, k, lab, cur, start, n = len(labels) @@ -1825,7 +1829,7 @@ def maybe_convert_numeric(ndarray[object] values, set na_values, except (ValueError, OverflowError, TypeError): pass - # otherwise, iterate and do full infererence + # Otherwise, iterate and do full inference. cdef: int status, maybe_int Py_ssize_t i, n = values.size @@ -1862,10 +1866,10 @@ def maybe_convert_numeric(ndarray[object] values, set na_values, else: seen.float_ = True - if val <= oINT64_MAX: + if oINT64_MIN <= val <= oINT64_MAX: ints[i] = val - if seen.sint_ and seen.uint_: + if val < oINT64_MIN or (seen.sint_ and seen.uint_): seen.float_ = True elif util.is_bool_object(val): @@ -1907,23 +1911,28 @@ def maybe_convert_numeric(ndarray[object] values, set na_values, else: seen.saw_int(as_int) - if not (seen.float_ or as_int in na_values): + if as_int not in na_values: if as_int < oINT64_MIN or as_int > oUINT64_MAX: - raise ValueError('Integer out of range.') + if seen.coerce_numeric: + seen.float_ = True + else: + raise ValueError("Integer out of range.") + else: + if as_int >= 0: + uints[i] = as_int - if as_int >= 0: - uints[i] = as_int - if as_int <= oINT64_MAX: - ints[i] = as_int + if as_int <= oINT64_MAX: + ints[i] = as_int seen.float_ = seen.float_ or (seen.uint_ and seen.sint_) else: seen.float_ = True except (TypeError, ValueError) as e: if not seen.coerce_numeric: - raise type(e)(str(e) + ' at position {pos}'.format(pos=i)) + raise type(e)(str(e) + " at position {pos}".format(pos=i)) elif "uint64" in str(e): # Exception from check functions. raise + seen.saw_null() floats[i] = NaN @@ -2146,7 +2155,7 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0, @cython.boundscheck(False) @cython.wraparound(False) -def map_infer_mask(ndarray arr, object f, ndarray[uint8_t] mask, +def map_infer_mask(ndarray arr, object f, const uint8_t[:] mask, bint convert=1): """ Substitute for np.vectorize with pandas-friendly dtype inference @@ -2268,7 +2277,7 @@ def to_object_array(rows: object, int min_width=0): result = np.empty((n, k), dtype=object) for i in range(n): - row = input_rows[i] + row = list(input_rows[i]) for j in range(len(row)): result[i, j] = row[j] diff --git a/pandas/_libs/missing.pyx b/pandas/_libs/missing.pyx index 229edbac4992d..ab0e4cd6cc765 100644 --- a/pandas/_libs/missing.pyx +++ b/pandas/_libs/missing.pyx @@ -16,10 +16,11 @@ from pandas._libs.tslibs.nattype cimport ( checknull_with_nat, c_NaT as NaT, is_null_datetimelike) -cdef float64_t INF = np.inf -cdef float64_t NEGINF = -INF +cdef: + float64_t INF = np.inf + float64_t NEGINF = -INF -cdef int64_t NPY_NAT = util.get_nat() + int64_t NPY_NAT = util.get_nat() cpdef bint checknull(object val): diff --git a/pandas/_libs/parsers.pyx b/pandas/_libs/parsers.pyx index 6cb6ed749f87b..f679746643643 100644 --- a/pandas/_libs/parsers.pyx +++ b/pandas/_libs/parsers.pyx @@ -64,10 +64,11 @@ from pandas.errors import (ParserError, DtypeWarning, CParserError = ParserError -cdef bint PY3 = (sys.version_info[0] >= 3) +cdef: + bint PY3 = (sys.version_info[0] >= 3) -cdef float64_t INF = np.inf -cdef float64_t NEGINF = -INF + float64_t INF = np.inf + float64_t NEGINF = -INF cdef extern from "errno.h": @@ -735,7 +736,7 @@ cdef class TextReader: int status int64_t hr, data_line char *errors = "strict" - cdef StringPath path = _string_path(self.c_encoding) + StringPath path = _string_path(self.c_encoding) header = [] unnamed_cols = set() @@ -1389,8 +1390,9 @@ cdef class TextReader: return None -cdef object _true_values = [b'True', b'TRUE', b'true'] -cdef object _false_values = [b'False', b'FALSE', b'false'] +cdef: + object _true_values = [b'True', b'TRUE', b'true'] + object _false_values = [b'False', b'FALSE', b'false'] def _ensure_encoded(list lst): @@ -1637,7 +1639,7 @@ cdef _categorical_convert(parser_t *parser, int64_t col, int64_t current_category = 0 char *errors = "strict" - cdef StringPath path = _string_path(encoding) + StringPath path = _string_path(encoding) int ret = 0 kh_str_t *table @@ -1727,9 +1729,10 @@ cdef inline void _to_fw_string_nogil(parser_t *parser, int64_t col, data += width -cdef char* cinf = b'inf' -cdef char* cposinf = b'+inf' -cdef char* cneginf = b'-inf' +cdef: + char* cinf = b'inf' + char* cposinf = b'+inf' + char* cneginf = b'-inf' cdef _try_double(parser_t *parser, int64_t col, diff --git a/pandas/_libs/reduction.pyx b/pandas/_libs/reduction.pyx index ca39c4de4d309..507567cf480d7 100644 --- a/pandas/_libs/reduction.pyx +++ b/pandas/_libs/reduction.pyx @@ -494,7 +494,7 @@ class InvalidApply(Exception): def apply_frame_axis0(object frame, object f, object names, - ndarray[int64_t] starts, ndarray[int64_t] ends): + const int64_t[:] starts, const int64_t[:] ends): cdef: BlockSlider slider Py_ssize_t i, n = len(starts) diff --git a/pandas/_libs/skiplist.pyx b/pandas/_libs/skiplist.pyx index 6698fcb767d7c..2fdee72f9d588 100644 --- a/pandas/_libs/skiplist.pyx +++ b/pandas/_libs/skiplist.pyx @@ -57,8 +57,9 @@ cdef class IndexableSkiplist: return self.get(i) cpdef get(self, Py_ssize_t i): - cdef Py_ssize_t level - cdef Node node + cdef: + Py_ssize_t level + Node node node = self.head i += 1 @@ -71,9 +72,10 @@ cdef class IndexableSkiplist: return node.value cpdef insert(self, double value): - cdef Py_ssize_t level, steps, d - cdef Node node, prevnode, newnode, next_at_level, tmp - cdef list chain, steps_at_level + cdef: + Py_ssize_t level, steps, d + Node node, prevnode, newnode, next_at_level, tmp + list chain, steps_at_level # find first node on each level where node.next[levels].value > value chain = [None] * self.maxlevels @@ -110,9 +112,10 @@ cdef class IndexableSkiplist: self.size += 1 cpdef remove(self, double value): - cdef Py_ssize_t level, d - cdef Node node, prevnode, tmpnode, next_at_level - cdef list chain + cdef: + Py_ssize_t level, d + Node node, prevnode, tmpnode, next_at_level + list chain # find first node on each level where node.next[levels].value >= value chain = [None] * self.maxlevels diff --git a/pandas/_libs/sparse.pyx b/pandas/_libs/sparse.pyx index f5980998f6db4..5471c8184e458 100644 --- a/pandas/_libs/sparse.pyx +++ b/pandas/_libs/sparse.pyx @@ -72,9 +72,6 @@ cdef class IntIndex(SparseIndex): A ValueError is raised if any of these conditions is violated. """ - cdef: - int32_t index, prev = -1 - if self.npoints > self.length: msg = ("Too many indices. Expected " "{exp} but found {act}").format( @@ -86,17 +83,15 @@ cdef class IntIndex(SparseIndex): if self.npoints == 0: return - if min(self.indices) < 0: + if self.indices.min() < 0: raise ValueError("No index can be less than zero") - if max(self.indices) >= self.length: + if self.indices.max() >= self.length: raise ValueError("All indices must be less than the length") - for index in self.indices: - if prev != -1 and index <= prev: - raise ValueError("Indices must be strictly increasing") - - prev = index + monotonic = np.all(self.indices[:-1] < self.indices[1:]) + if not monotonic: + raise ValueError("Indices must be strictly increasing") def equals(self, other): if not isinstance(other, IntIndex): diff --git a/pandas/_libs/sparse_op_helper.pxi.in b/pandas/_libs/sparse_op_helper.pxi.in index c6621ab5977ca..5949a3fd0ed81 100644 --- a/pandas/_libs/sparse_op_helper.pxi.in +++ b/pandas/_libs/sparse_op_helper.pxi.in @@ -125,10 +125,10 @@ def get_dispatch(dtypes): @cython.wraparound(False) @cython.boundscheck(False) -cdef inline tuple block_op_{{opname}}_{{dtype}}(ndarray x_, +cdef inline tuple block_op_{{opname}}_{{dtype}}({{dtype}}_t[:] x_, BlockIndex xindex, {{dtype}}_t xfill, - ndarray y_, + {{dtype}}_t[:] y_, BlockIndex yindex, {{dtype}}_t yfill): ''' @@ -142,7 +142,7 @@ cdef inline tuple block_op_{{opname}}_{{dtype}}(ndarray x_, int32_t xloc, yloc Py_ssize_t xblock = 0, yblock = 0 # block numbers - ndarray[{{dtype}}_t, ndim=1] x, y + {{dtype}}_t[:] x, y ndarray[{{rdtype}}_t, ndim=1] out # to suppress Cython warning @@ -226,16 +226,18 @@ cdef inline tuple block_op_{{opname}}_{{dtype}}(ndarray x_, @cython.wraparound(False) @cython.boundscheck(False) -cdef inline tuple int_op_{{opname}}_{{dtype}}(ndarray x_, IntIndex xindex, +cdef inline tuple int_op_{{opname}}_{{dtype}}({{dtype}}_t[:] x_, + IntIndex xindex, {{dtype}}_t xfill, - ndarray y_, IntIndex yindex, + {{dtype}}_t[:] y_, + IntIndex yindex, {{dtype}}_t yfill): cdef: IntIndex out_index Py_ssize_t xi = 0, yi = 0, out_i = 0 # fp buf indices int32_t xloc, yloc - ndarray[int32_t, ndim=1] xindices, yindices, out_indices - ndarray[{{dtype}}_t, ndim=1] x, y + int32_t[:] xindices, yindices, out_indices + {{dtype}}_t[:] x, y ndarray[{{rdtype}}_t, ndim=1] out # suppress Cython compiler warnings due to inlining @@ -284,9 +286,9 @@ cdef inline tuple int_op_{{opname}}_{{dtype}}(ndarray x_, IntIndex xindex, return out, out_index, {{(opname, 'xfill', 'yfill', dtype) | get_op}} -cpdef sparse_{{opname}}_{{dtype}}(ndarray[{{dtype}}_t, ndim=1] x, +cpdef sparse_{{opname}}_{{dtype}}({{dtype}}_t[:] x, SparseIndex xindex, {{dtype}}_t xfill, - ndarray[{{dtype}}_t, ndim=1] y, + {{dtype}}_t[:] y, SparseIndex yindex, {{dtype}}_t yfill): if isinstance(xindex, BlockIndex): diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index 798e338d5581b..f932e236b5218 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -645,6 +645,8 @@ cpdef array_to_datetime(ndarray[object] values, str errors='raise', out_tzoffset_vals.add(out_tzoffset * 60.) tz = pytz.FixedOffset(out_tzoffset) value = tz_convert_single(value, tz, UTC) + out_local = 0 + out_tzoffset = 0 else: # Add a marker for naive string, to track if we are # parsing mixed naive and aware strings diff --git a/pandas/_libs/tslibs/conversion.pyx b/pandas/_libs/tslibs/conversion.pyx index 6c8b732928bc3..1c0adaaa288a9 100644 --- a/pandas/_libs/tslibs/conversion.pyx +++ b/pandas/_libs/tslibs/conversion.pyx @@ -147,7 +147,7 @@ def ensure_timedelta64ns(arr: ndarray, copy: bool=True): @cython.boundscheck(False) @cython.wraparound(False) -def datetime_to_datetime64(values: object[:]): +def datetime_to_datetime64(object[:] values): """ Convert ndarray of datetime-like objects to int64 array representing nanosecond timestamps. diff --git a/pandas/_libs/tslibs/fields.pyx b/pandas/_libs/tslibs/fields.pyx index 5cda7992369fc..240f008394099 100644 --- a/pandas/_libs/tslibs/fields.pyx +++ b/pandas/_libs/tslibs/fields.pyx @@ -381,7 +381,7 @@ def get_start_end_field(int64_t[:] dtindex, object field, @cython.wraparound(False) @cython.boundscheck(False) -def get_date_field(ndarray[int64_t] dtindex, object field): +def get_date_field(int64_t[:] dtindex, object field): """ Given a int64-based datetime index, extract the year, month, etc., field and return an array of these values. diff --git a/pandas/_libs/tslibs/nattype.pyx b/pandas/_libs/tslibs/nattype.pyx index a55d15a7c4e85..b64c3479f23fe 100644 --- a/pandas/_libs/tslibs/nattype.pyx +++ b/pandas/_libs/tslibs/nattype.pyx @@ -183,7 +183,9 @@ cdef class _NaT(datetime): return np.datetime64(NPY_NAT, 'ns') def to_datetime64(self): - """ Returns a numpy.datetime64 object with 'ns' precision """ + """ + Return a numpy.datetime64 object with 'ns' precision. + """ return np.datetime64('NaT', 'ns') def __repr__(self): @@ -382,7 +384,7 @@ class NaTType(_NaT): ) combine = _make_error_func('combine', # noqa:E128 """ - Timsetamp.combine(date, time) + Timestamp.combine(date, time) date, time -> datetime with same date and time fields """ @@ -448,7 +450,7 @@ class NaTType(_NaT): """ Timestamp.now(tz=None) - Returns new Timestamp object representing current time local to + Return new Timestamp object representing current time local to tz. Parameters @@ -669,7 +671,6 @@ class NaTType(_NaT): nanosecond : int, optional tzinfo : tz-convertible, optional fold : int, optional, default is 0 - added in 3.6, NotImplemented Returns ------- diff --git a/pandas/_libs/tslibs/offsets.pyx b/pandas/_libs/tslibs/offsets.pyx index 856aa52f82cf5..e28462f7103b9 100644 --- a/pandas/_libs/tslibs/offsets.pyx +++ b/pandas/_libs/tslibs/offsets.pyx @@ -18,6 +18,7 @@ from numpy cimport int64_t cnp.import_array() +from pandas._libs.tslibs cimport util from pandas._libs.tslibs.util cimport is_string_object, is_integer_object from pandas._libs.tslibs.ccalendar import MONTHS, DAYS @@ -408,6 +409,10 @@ class _BaseOffset(object): return self.apply(other) def __mul__(self, other): + if hasattr(other, "_typ"): + return NotImplemented + if util.is_array(other): + return np.array([self * x for x in other]) return type(self)(n=other * self.n, normalize=self.normalize, **self.kwds) @@ -458,6 +463,9 @@ class _BaseOffset(object): TypeError if `int(n)` raises ValueError if n != int(n) """ + if util.is_timedelta64_object(n): + raise TypeError('`n` argument must be an integer, ' + 'got {ntype}'.format(ntype=type(n))) try: nint = int(n) except (ValueError, TypeError): @@ -533,12 +541,20 @@ class _Tick(object): can do isinstance checks on _Tick and avoid importing tseries.offsets """ + # ensure that reversed-ops with numpy scalars return NotImplemented + __array_priority__ = 1000 + def __truediv__(self, other): result = self.delta.__truediv__(other) return _wrap_timedelta_result(result) + def __rtruediv__(self, other): + result = self.delta.__rtruediv__(other) + return _wrap_timedelta_result(result) + if PY2: __div__ = __truediv__ + __rdiv__ = __rtruediv__ # ---------------------------------------------------------------------- diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index 82719de2dbdbd..7759e165b7193 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -44,9 +44,10 @@ class DateParseError(ValueError): _DEFAULT_DATETIME = datetime(1, 1, 1).replace(hour=0, minute=0, second=0, microsecond=0) -cdef object _TIMEPAT = re.compile(r'^([01]?[0-9]|2[0-3]):([0-5][0-9])') +cdef: + object _TIMEPAT = re.compile(r'^([01]?[0-9]|2[0-3]):([0-5][0-9])') -cdef set _not_datelike_strings = {'a', 'A', 'm', 'M', 'p', 'P', 't', 'T'} + set _not_datelike_strings = {'a', 'A', 'm', 'M', 'p', 'P', 't', 'T'} # ---------------------------------------------------------------------- diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index 2f4edb7de8f95..e38e9a1ca5df6 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -52,9 +52,10 @@ from pandas._libs.tslibs.nattype cimport ( from pandas._libs.tslibs.offsets cimport to_offset from pandas._libs.tslibs.offsets import _Tick -cdef bint PY2 = str == bytes -cdef enum: - INT32_MIN = -2147483648 +cdef: + bint PY2 = str == bytes + enum: + INT32_MIN = -2147483648 ctypedef struct asfreq_info: diff --git a/pandas/_libs/tslibs/resolution.pyx b/pandas/_libs/tslibs/resolution.pyx index f80c1e9841abe..13a4f5ba48557 100644 --- a/pandas/_libs/tslibs/resolution.pyx +++ b/pandas/_libs/tslibs/resolution.pyx @@ -16,15 +16,16 @@ from pandas._libs.tslibs.ccalendar cimport get_days_in_month # ---------------------------------------------------------------------- # Constants -cdef int64_t NPY_NAT = get_nat() - -cdef int RESO_NS = 0 -cdef int RESO_US = 1 -cdef int RESO_MS = 2 -cdef int RESO_SEC = 3 -cdef int RESO_MIN = 4 -cdef int RESO_HR = 5 -cdef int RESO_DAY = 6 +cdef: + int64_t NPY_NAT = get_nat() + + int RESO_NS = 0 + int RESO_US = 1 + int RESO_MS = 2 + int RESO_SEC = 3 + int RESO_MIN = 4 + int RESO_HR = 5 + int RESO_DAY = 6 # ---------------------------------------------------------------------- diff --git a/pandas/_libs/tslibs/timedeltas.pyx b/pandas/_libs/tslibs/timedeltas.pyx index 0a19d8749fc7c..f08a57375a301 100644 --- a/pandas/_libs/tslibs/timedeltas.pyx +++ b/pandas/_libs/tslibs/timedeltas.pyx @@ -1158,6 +1158,11 @@ class Timedelta(_Timedelta): "[weeks, days, hours, minutes, seconds, " "milliseconds, microseconds, nanoseconds]") + if unit in {'Y', 'y', 'M'}: + warnings.warn("M and Y units are deprecated and " + "will be removed in a future version.", + FutureWarning, stacklevel=1) + if isinstance(value, Timedelta): value = value.value elif is_string_object(value): diff --git a/pandas/_libs/tslibs/timestamps.pyx b/pandas/_libs/tslibs/timestamps.pyx index fe0564cb62c30..25b0b4069cf7c 100644 --- a/pandas/_libs/tslibs/timestamps.pyx +++ b/pandas/_libs/tslibs/timestamps.pyx @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import sys import warnings from cpython cimport (PyObject_RichCompareBool, PyObject_RichCompare, @@ -43,10 +44,11 @@ from pandas._libs.tslibs.timezones import UTC # Constants _zero_time = datetime_time(0, 0) _no_input = object() - +PY36 = sys.version_info >= (3, 6) # ---------------------------------------------------------------------- + def maybe_integer_op_deprecated(obj): # GH#22535 add/sub of integers and int-arrays is deprecated if obj.freq is not None: @@ -197,7 +199,7 @@ def round_nsint64(values, mode, freq): # This is PITA. Because we inherit from datetime, which has very specific # construction requirements, we need to do object instantiation in python -# (see Timestamp class above). This will serve as a C extension type that +# (see Timestamp class below). This will serve as a C extension type that # shadows the python class, where we do any heavy lifting. cdef class _Timestamp(datetime): @@ -338,7 +340,9 @@ cdef class _Timestamp(datetime): self.microsecond, self.tzinfo) cpdef to_datetime64(self): - """ Returns a numpy.datetime64 object with 'ns' precision """ + """ + Return a numpy.datetime64 object with 'ns' precision. + """ return np.datetime64(self.value, 'ns') def __add__(self, other): @@ -500,6 +504,9 @@ cdef class _Timestamp(datetime): @property def asm8(self): + """ + Return numpy datetime64 format in nanoseconds. + """ return np.datetime64(self.value, 'ns') @property @@ -566,15 +573,18 @@ class Timestamp(_Timestamp): Using the primary calling convention: This converts a datetime-like string + >>> pd.Timestamp('2017-01-01T12') Timestamp('2017-01-01 12:00:00') This converts a float representing a Unix epoch in units of seconds + >>> pd.Timestamp(1513393355.5, unit='s') Timestamp('2017-12-16 03:02:35.500000') This converts an int representing a Unix-epoch in units of seconds and for a particular timezone + >>> pd.Timestamp(1513393355, unit='s', tz='US/Pacific') Timestamp('2017-12-15 19:02:35-0800', tz='US/Pacific') @@ -612,7 +622,7 @@ class Timestamp(_Timestamp): """ Timestamp.now(tz=None) - Returns new Timestamp object representing current time local to + Return new Timestamp object representing current time local to tz. Parameters @@ -670,7 +680,7 @@ class Timestamp(_Timestamp): @classmethod def combine(cls, date, time): """ - Timsetamp.combine(date, time) + Timestamp.combine(date, time) date, time -> datetime with same date and time fields """ @@ -930,6 +940,9 @@ class Timestamp(_Timestamp): @property def dayofweek(self): + """ + Return day of whe week. + """ return self.weekday() def day_name(self, locale=None): @@ -979,30 +992,48 @@ class Timestamp(_Timestamp): @property def dayofyear(self): + """ + Return the day of the year. + """ return ccalendar.get_day_of_year(self.year, self.month, self.day) @property def week(self): + """ + Return the week number of the year. + """ return ccalendar.get_week_of_year(self.year, self.month, self.day) weekofyear = week @property def quarter(self): + """ + Return the quarter of the year. + """ return ((self.month - 1) // 3) + 1 @property def days_in_month(self): + """ + Return the number of days in the month. + """ return ccalendar.get_days_in_month(self.year, self.month) daysinmonth = days_in_month @property def freqstr(self): + """ + Return the total number of days in the month. + """ return getattr(self.freq, 'freqstr', self.freq) @property def is_month_start(self): + """ + Return True if date is first day of month. + """ if self.freq is None: # fast-path for non-business frequencies return self.day == 1 @@ -1010,6 +1041,9 @@ class Timestamp(_Timestamp): @property def is_month_end(self): + """ + Return True if date is last day of month. + """ if self.freq is None: # fast-path for non-business frequencies return self.day == self.days_in_month @@ -1017,6 +1051,9 @@ class Timestamp(_Timestamp): @property def is_quarter_start(self): + """ + Return True if date is first day of the quarter. + """ if self.freq is None: # fast-path for non-business frequencies return self.day == 1 and self.month % 3 == 1 @@ -1024,6 +1061,9 @@ class Timestamp(_Timestamp): @property def is_quarter_end(self): + """ + Return True if date is last day of the quarter. + """ if self.freq is None: # fast-path for non-business frequencies return (self.month % 3) == 0 and self.day == self.days_in_month @@ -1031,6 +1071,9 @@ class Timestamp(_Timestamp): @property def is_year_start(self): + """ + Return True if date is first day of the year. + """ if self.freq is None: # fast-path for non-business frequencies return self.day == self.month == 1 @@ -1038,6 +1081,9 @@ class Timestamp(_Timestamp): @property def is_year_end(self): + """ + Return True if date is last day of the year. + """ if self.freq is None: # fast-path for non-business frequencies return self.month == 12 and self.day == 31 @@ -1045,6 +1091,9 @@ class Timestamp(_Timestamp): @property def is_leap_year(self): + """ + Return True if year is a leap year. + """ return bool(ccalendar.is_leapyear(self.year)) def tz_localize(self, tz, ambiguous='raise', nonexistent='raise', @@ -1195,7 +1244,6 @@ class Timestamp(_Timestamp): nanosecond : int, optional tzinfo : tz-convertible, optional fold : int, optional, default is 0 - added in 3.6, NotImplemented Returns ------- @@ -1252,12 +1300,16 @@ class Timestamp(_Timestamp): # see GH#18319 ts_input = _tzinfo.localize(datetime(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, - dts.us)) + dts.us), + is_dst=not bool(fold)) _tzinfo = ts_input.tzinfo else: - ts_input = datetime(dts.year, dts.month, dts.day, - dts.hour, dts.min, dts.sec, dts.us, - tzinfo=_tzinfo) + kwargs = {'year': dts.year, 'month': dts.month, 'day': dts.day, + 'hour': dts.hour, 'minute': dts.min, 'second': dts.sec, + 'microsecond': dts.us, 'tzinfo': _tzinfo} + if PY36: + kwargs['fold'] = fold + ts_input = datetime(**kwargs) ts = convert_datetime_to_tsobject(ts_input, _tzinfo) value = ts.value + (dts.ps // 1000) diff --git a/pandas/_libs/window.pyx b/pandas/_libs/window.pyx index e8f3de64c3823..cc5b3b63f5b04 100644 --- a/pandas/_libs/window.pyx +++ b/pandas/_libs/window.pyx @@ -26,13 +26,14 @@ from pandas._libs.skiplist cimport ( skiplist_t, skiplist_init, skiplist_destroy, skiplist_get, skiplist_insert, skiplist_remove) -cdef float32_t MINfloat32 = np.NINF -cdef float64_t MINfloat64 = np.NINF +cdef: + float32_t MINfloat32 = np.NINF + float64_t MINfloat64 = np.NINF -cdef float32_t MAXfloat32 = np.inf -cdef float64_t MAXfloat64 = np.inf + float32_t MAXfloat32 = np.inf + float64_t MAXfloat64 = np.inf -cdef float64_t NaN = np.NaN + float64_t NaN = np.NaN cdef inline int int_max(int a, int b): return a if a >= b else b cdef inline int int_min(int a, int b): return a if a <= b else b @@ -242,7 +243,7 @@ cdef class VariableWindowIndexer(WindowIndexer): # max window size self.win = (self.end - self.start).max() - def build(self, ndarray[int64_t] index, int64_t win, bint left_closed, + def build(self, const int64_t[:] index, int64_t win, bint left_closed, bint right_closed): cdef: diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index f9c659106a516..d7ca7f8963f70 100644 --- a/pandas/compat/__init__.py +++ b/pandas/compat/__init__.py @@ -9,7 +9,6 @@ * lists: lrange(), lmap(), lzip(), lfilter() * unicode: u() [no unicode builtin in Python 3] * longs: long (int in Python 3) -* callable * iterable method compatibility: iteritems, iterkeys, itervalues * Uses the original method if available, otherwise uses items, keys, values. * types: @@ -378,14 +377,6 @@ class ResourceWarning(Warning): string_and_binary_types = string_types + (binary_type,) -try: - # callable reintroduced in later versions of Python - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - if PY2: # In PY2 functools.wraps doesn't provide metadata pytest needs to generate # decorated tests using parametrization. See pytest GH issue #2782 @@ -411,8 +402,6 @@ def wrapper(cls): return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper -from collections import OrderedDict, Counter - if PY3: def raise_with_traceback(exc, traceback=Ellipsis): if traceback == Ellipsis: diff --git a/pandas/compat/numpy/__init__.py b/pandas/compat/numpy/__init__.py index 5e67cf2ee2837..bc9af01a97467 100644 --- a/pandas/compat/numpy/__init__.py +++ b/pandas/compat/numpy/__init__.py @@ -12,6 +12,7 @@ _np_version_under1p13 = _nlv < LooseVersion('1.13') _np_version_under1p14 = _nlv < LooseVersion('1.14') _np_version_under1p15 = _nlv < LooseVersion('1.15') +_np_version_under1p16 = _nlv < LooseVersion('1.16') if _nlv < '1.12': @@ -64,5 +65,6 @@ def np_array_datetime64_compat(arr, *args, **kwargs): __all__ = ['np', '_np_version_under1p13', '_np_version_under1p14', - '_np_version_under1p15' + '_np_version_under1p15', + '_np_version_under1p16' ] diff --git a/pandas/compat/numpy/function.py b/pandas/compat/numpy/function.py index 417ddd0d8af17..f15783ad642b4 100644 --- a/pandas/compat/numpy/function.py +++ b/pandas/compat/numpy/function.py @@ -17,10 +17,10 @@ and methods that are spread throughout the codebase. This module will make it easier to adjust to future upstream changes in the analogous numpy signatures. """ +from collections import OrderedDict from numpy import ndarray -from pandas.compat import OrderedDict from pandas.errors import UnsupportedFunctionCall from pandas.util._validators import ( validate_args, validate_args_and_kwargs, validate_kwargs) diff --git a/pandas/compat/pickle_compat.py b/pandas/compat/pickle_compat.py index 61295b8249f58..8f16f8154b952 100644 --- a/pandas/compat/pickle_compat.py +++ b/pandas/compat/pickle_compat.py @@ -201,7 +201,7 @@ def load_newobj_ex(self): pass -def load(fh, encoding=None, compat=False, is_verbose=False): +def load(fh, encoding=None, is_verbose=False): """load a pickle, with a provided encoding if compat is True: @@ -212,7 +212,6 @@ def load(fh, encoding=None, compat=False, is_verbose=False): ---------- fh : a filelike object encoding : an optional encoding - compat : provide Series compatibility mode, boolean, default False is_verbose : show exception output """ diff --git a/pandas/core/accessor.py b/pandas/core/accessor.py index 961488ff12e58..050749741e7bd 100644 --- a/pandas/core/accessor.py +++ b/pandas/core/accessor.py @@ -16,11 +16,15 @@ class DirNamesMixin(object): ['asobject', 'base', 'data', 'flags', 'itemsize', 'strides']) def _dir_deletions(self): - """ delete unwanted __dir__ for this object """ + """ + Delete unwanted __dir__ for this object. + """ return self._accessors | self._deprecations def _dir_additions(self): - """ add additional __dir__ for this object """ + """ + Add additional __dir__ for this object. + """ rv = set() for accessor in self._accessors: try: @@ -33,7 +37,7 @@ def _dir_additions(self): def __dir__(self): """ Provide method name lookup and completion - Only provide 'public' methods + Only provide 'public' methods. """ rv = set(dir(type(self))) rv = (rv - self._dir_deletions()) | self._dir_additions() @@ -42,7 +46,7 @@ def __dir__(self): class PandasDelegate(object): """ - an abstract base class for delegating methods/properties + An abstract base class for delegating methods/properties. """ def _delegate_property_get(self, name, *args, **kwargs): @@ -65,10 +69,10 @@ def _add_delegate_accessors(cls, delegate, accessors, typ, ---------- cls : the class to add the methods/properties to delegate : the class to get methods/properties & doc-strings - acccessors : string list of accessors to add + accessors : string list of accessors to add typ : 'property' or 'method' overwrite : boolean, default False - overwrite the method/property in the target class if it exists + overwrite the method/property in the target class if it exists. """ def _create_delegator_property(name): @@ -117,7 +121,7 @@ def delegate_names(delegate, accessors, typ, overwrite=False): ---------- delegate : object the class to get methods/properties & doc-strings - acccessors : Sequence[str] + accessors : Sequence[str] List of accessor to add typ : {'property', 'method'} overwrite : boolean, default False diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index b473a7aef929e..a70a3ff06f202 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -289,14 +289,14 @@ def unique(values): Returns ------- unique values. - - If the input is an Index, the return is an Index - - If the input is a Categorical dtype, the return is a Categorical - - If the input is a Series/ndarray, the return will be an ndarray + If the input is an Index, the return is an Index + If the input is a Categorical dtype, the return is a Categorical + If the input is a Series/ndarray, the return will be an ndarray See Also -------- - pandas.Index.unique - pandas.Series.unique + Index.unique + Series.unique Examples -------- diff --git a/pandas/core/api.py b/pandas/core/api.py index afc929c39086c..8c92287e212a6 100644 --- a/pandas/core/api.py +++ b/pandas/core/api.py @@ -4,7 +4,6 @@ import numpy as np -from pandas.core.arrays import IntervalArray from pandas.core.arrays.integer import ( Int8Dtype, Int16Dtype, diff --git a/pandas/core/arrays/array_.py b/pandas/core/arrays/array_.py index c7be8e3f745c4..41d623c7efd9c 100644 --- a/pandas/core/arrays/array_.py +++ b/pandas/core/arrays/array_.py @@ -50,7 +50,7 @@ def array(data, # type: Sequence[object] ============================== ===================================== Scalar Type Array Type ============================== ===================================== - :class:`pandas.Interval` :class:`pandas.IntervalArray` + :class:`pandas.Interval` :class:`pandas.arrays.IntervalArray` :class:`pandas.Period` :class:`pandas.arrays.PeriodArray` :class:`datetime.datetime` :class:`pandas.arrays.DatetimeArray` :class:`datetime.timedelta` :class:`pandas.arrays.TimedeltaArray` diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 35b662eaae9a5..ab58f86e0a6bc 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -214,7 +214,7 @@ def contains(cat, key, container): class Categorical(ExtensionArray, PandasObject): """ - Represents a categorical variable in classic R / S-plus fashion + Represent a categorical variable in classic R / S-plus fashion `Categoricals` can only take on only a limited, and usually fixed, number of possible values (`categories`). In contrast to statistical categorical @@ -276,7 +276,7 @@ class Categorical(ExtensionArray, PandasObject): See Also -------- - pandas.api.types.CategoricalDtype : Type for categorical data. + api.types.CategoricalDtype : Type for categorical data. CategoricalIndex : An Index with an underlying ``Categorical``. Notes @@ -747,7 +747,7 @@ def _set_dtype(self, dtype): def set_ordered(self, value, inplace=False): """ - Sets the ordered attribute to the boolean value + Set the ordered attribute to the boolean value Parameters ---------- @@ -793,7 +793,7 @@ def as_unordered(self, inplace=False): def set_categories(self, new_categories, ordered=None, rename=False, inplace=False): """ - Sets the categories to the specified new_categories. + Set the categories to the specified new_categories. `new_categories` can include new categories (which will result in unused categories) or remove old categories (which results in values @@ -864,7 +864,7 @@ def set_categories(self, new_categories, ordered=None, rename=False, def rename_categories(self, new_categories, inplace=False): """ - Renames categories. + Rename categories. Parameters ---------- @@ -958,7 +958,7 @@ def rename_categories(self, new_categories, inplace=False): def reorder_categories(self, new_categories, ordered=None, inplace=False): """ - Reorders categories as specified in new_categories. + Reorder categories as specified in new_categories. `new_categories` need to include all old categories and no new category items. @@ -1051,7 +1051,7 @@ def add_categories(self, new_categories, inplace=False): def remove_categories(self, removals, inplace=False): """ - Removes the specified categories. + Remove the specified categories. `removals` must be included in the old categories. Values which were in the removed categories will be set to NaN @@ -1104,7 +1104,7 @@ def remove_categories(self, removals, inplace=False): def remove_unused_categories(self, inplace=False): """ - Removes categories which are not used. + Remove categories which are not used. Parameters ---------- @@ -1454,7 +1454,7 @@ def dropna(self): def value_counts(self, dropna=True): """ - Returns a Series containing counts of each category. + Return a Series containing counts of each category. Every category will have an entry, even those with a count of 0. @@ -1570,7 +1570,7 @@ def argsort(self, *args, **kwargs): def sort_values(self, inplace=False, ascending=True, na_position='last'): """ - Sorts the Categorical by category value returning a new + Sort the Categorical by category value returning a new Categorical by default. While an ordering is applied to the category values, sorting in this @@ -2167,8 +2167,7 @@ def _reverse_indexer(self): r, counts = libalgos.groupsort_indexer(self.codes.astype('int64'), categories.size) counts = counts.cumsum() - result = [r[counts[indexer]:counts[indexer + 1]] - for indexer in range(len(counts) - 1)] + result = (r[start:end] for start, end in zip(counts, counts[1:])) result = dict(zip(categories, result)) return result @@ -2321,8 +2320,7 @@ def _values_for_factorize(self): @classmethod def _from_factorized(cls, uniques, original): return original._constructor(original.categories.take(uniques), - categories=original.categories, - ordered=original.ordered) + dtype=original.dtype) def equals(self, other): """ @@ -2674,9 +2672,7 @@ def _factorize_from_iterable(values): if is_categorical(values): if isinstance(values, (ABCCategoricalIndex, ABCSeries)): values = values._values - categories = CategoricalIndex(values.categories, - categories=values.categories, - ordered=values.ordered) + categories = CategoricalIndex(values.categories, dtype=values.dtype) codes = values.codes else: # The value of ordered is irrelevant since we don't use cat as such, diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index f2aeb1c1309de..1b2a4da389dc4 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -128,7 +128,7 @@ def _dt_array_cmp(cls, op): Wrap comparison operations to convert datetime-like to datetime64 """ opname = '__{name}__'.format(name=op.__name__) - nat_result = True if opname == '__ne__' else False + nat_result = opname == '__ne__' def wrapper(self, other): if isinstance(other, (ABCDataFrame, ABCSeries, ABCIndexClass)): @@ -218,6 +218,13 @@ class DatetimeArray(dtl.DatetimeLikeArrayMixin, .. versionadded:: 0.24.0 + .. warning:: + + DatetimeArray is currently experimental, and its API may change + without warning. In particular, :attr:`DatetimeArray.dtype` is + expected to change to always be an instance of an ``ExtensionDtype`` + subclass. + Parameters ---------- values : Series, Index, DatetimeArray, ndarray @@ -511,6 +518,12 @@ def dtype(self): """ The dtype for the DatetimeArray. + .. warning:: + + A future version of pandas will change dtype to never be a + ``numpy.dtype``. Instead, :attr:`DatetimeArray.dtype` will + always be an instance of an ``ExtensionDtype`` subclass. + Returns ------- numpy.dtype or DatetimeTZDtype @@ -2045,7 +2058,7 @@ def validate_tz_from_dtype(dtype, tz): # tz-naive dtype (i.e. datetime64[ns]) if tz is not None and not timezones.tz_compare(tz, dtz): raise ValueError("cannot supply both a tz and a " - "timezone-naive dtype (i.e. datetime64[ns]") + "timezone-naive dtype (i.e. datetime64[ns])") return tz diff --git a/pandas/core/arrays/integer.py b/pandas/core/arrays/integer.py index b3dde6bf2bd93..fd90aec3b5e8c 100644 --- a/pandas/core/arrays/integer.py +++ b/pandas/core/arrays/integer.py @@ -225,24 +225,57 @@ class IntegerArray(ExtensionArray, ExtensionOpsMixin): """ Array of integer (optional missing) values. + .. versionadded:: 0.24.0 + + .. warning:: + + IntegerArray is currently experimental, and its API or internal + implementation may change without warning. + We represent an IntegerArray with 2 numpy arrays: - data: contains a numpy integer array of the appropriate dtype - mask: a boolean array holding a mask on the data, True is missing To construct an IntegerArray from generic array-like input, use - ``integer_array`` function instead. + :func:`pandas.array` with one of the integer dtypes (see examples). + + See :ref:`integer_na` for more. Parameters ---------- - values : integer 1D numpy array - mask : boolean 1D numpy array + values : numpy.ndarray + A 1-d integer-dtype array. + mask : numpy.ndarray + A 1-d boolean-dtype array indicating missing values. copy : bool, default False + Whether to copy the `values` and `mask`. Returns ------- IntegerArray + Examples + -------- + Create an IntegerArray with :func:`pandas.array`. + + >>> int_array = pd.array([1, None, 3], dtype=pd.Int32Dtype()) + >>> int_array + + [1, NaN, 3] + Length: 3, dtype: Int32 + + String aliases for the dtypes are also available. They are capitalized. + + >>> pd.array([1, None, 3], dtype='Int32') + + [1, NaN, 3] + Length: 3, dtype: Int32 + + >>> pd.array([1, None, 3], dtype='UInt16') + + [1, NaN, 3] + Length: 3, dtype: UInt16 """ @cache_readonly @@ -528,7 +561,7 @@ def cmp_method(self, other): else: mask = self._mask | mask - result[mask] = True if op_name == 'ne' else False + result[mask] = op_name == 'ne' return result name = '__{name}__'.format(name=op.__name__) diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index 45470e03c041a..1e671c7bd956a 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -32,6 +32,7 @@ _shared_docs_kwargs = dict( klass='IntervalArray', + qualname='arrays.IntervalArray', name='' ) @@ -115,7 +116,7 @@ A new ``IntervalArray`` can be constructed directly from an array-like of ``Interval`` objects: - >>> pd.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)]) + >>> pd.arrays.IntervalArray([pd.Interval(0, 1), pd.Interval(1, 5)]) IntervalArray([(0, 1], (1, 5]], closed='right', dtype='interval[int64]') @@ -248,8 +249,8 @@ def _from_factorized(cls, values, original): Examples -------- - >>> pd.%(klass)s.from_breaks([0, 1, 2, 3]) - %(klass)s([(0, 1], (1, 2], (2, 3]] + >>> pd.%(qualname)s.from_breaks([0, 1, 2, 3]) + %(klass)s([(0, 1], (1, 2], (2, 3]], closed='right', dtype='interval[int64]') """ @@ -311,7 +312,7 @@ def from_breaks(cls, breaks, closed='right', copy=False, dtype=None): Examples -------- >>> %(klass)s.from_arrays([0, 1, 2], [1, 2, 3]) - %(klass)s([(0, 1], (1, 2], (2, 3]] + %(klass)s([(0, 1], (1, 2], (2, 3]], closed='right', dtype='interval[int64]') """ @@ -354,16 +355,16 @@ def from_arrays(cls, left, right, closed='right', copy=False, dtype=None): Examples -------- - >>> pd.%(klass)s.from_intervals([pd.Interval(0, 1), + >>> pd.%(qualname)s.from_intervals([pd.Interval(0, 1), ... pd.Interval(1, 2)]) - %(klass)s([(0, 1], (1, 2]] + %(klass)s([(0, 1], (1, 2]], closed='right', dtype='interval[int64]') The generic Index constructor work identically when it infers an array of all intervals: >>> pd.Index([pd.Interval(0, 1), pd.Interval(1, 2)]) - %(klass)s([(0, 1], (1, 2]] + %(klass)s([(0, 1], (1, 2]], closed='right', dtype='interval[int64]') """ @@ -394,7 +395,7 @@ def from_arrays(cls, left, right, closed='right', copy=False, dtype=None): Examples -------- - >>> pd.%(klass)s.from_tuples([(0, 1), (1, 2)]) + >>> pd.%(qualname)s.from_tuples([(0, 1), (1, 2)]) %(klass)s([(0, 1], (1, 2]], closed='right', dtype='interval[int64]') """ @@ -891,13 +892,13 @@ def closed(self): Examples -------- - >>> index = pd.interval_range(0, 3) - >>> index - %(klass)s([(0, 1], (1, 2], (2, 3]] + >>> index = pd.interval_range(0, 3) + >>> index + IntervalIndex([(0, 1], (1, 2], (2, 3]], closed='right', dtype='interval[int64]') - >>> index.set_closed('both') - %(klass)s([[0, 1], [1, 2], [2, 3]] + >>> index.set_closed('both') + IntervalIndex([[0, 1], [1, 2], [2, 3]], closed='both', dtype='interval[int64]') """ @@ -1039,7 +1040,7 @@ def repeat(self, repeats, axis=None): Examples -------- - >>> intervals = pd.%(klass)s.from_tuples([(0, 1), (1, 3), (2, 4)]) + >>> intervals = pd.%(qualname)s.from_tuples([(0, 1), (1, 3), (2, 4)]) >>> intervals %(klass)s([(0, 1], (1, 3], (2, 4]], closed='right', diff --git a/pandas/core/arrays/numpy_.py b/pandas/core/arrays/numpy_.py index 47517782e2bbf..791ff44303e96 100644 --- a/pandas/core/arrays/numpy_.py +++ b/pandas/core/arrays/numpy_.py @@ -222,7 +222,7 @@ def __getitem__(self, item): item = item._ndarray result = self._ndarray[item] - if not lib.is_scalar(result): + if not lib.is_scalar(item): result = type(self)(result) return result diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index e0c71b5609096..3ddceb8c2839d 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -46,7 +46,7 @@ def _period_array_cmp(cls, op): Wrap comparison operations to convert Period-like to PeriodDtype """ opname = '__{name}__'.format(name=op.__name__) - nat_result = True if opname == '__ne__' else False + nat_result = opname == '__ne__' def wrapper(self, other): op = getattr(self.asi8, opname) diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 910cb96a86216..06e2bf76fcf96 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -62,7 +62,7 @@ def _td_array_cmp(cls, op): Wrap comparison operations to convert timedelta-like to timedelta64 """ opname = '__{name}__'.format(name=op.__name__) - nat_result = True if opname == '__ne__' else False + nat_result = opname == '__ne__' def wrapper(self, other): if isinstance(other, (ABCDataFrame, ABCSeries, ABCIndexClass)): @@ -107,6 +107,29 @@ def wrapper(self, other): class TimedeltaArray(dtl.DatetimeLikeArrayMixin, dtl.TimelikeOps): + """ + Pandas ExtensionArray for timedelta data. + + .. versionadded:: 0.24.0 + + .. warning:: + + TimedeltaArray is currently experimental, and its API may change + without warning. In particular, :attr:`TimedeltaArray.dtype` is + expected to change to be an instance of an ``ExtensionDtype`` + subclass. + + Parameters + ---------- + values : array-like + The timedelta data. + + dtype : numpy.dtype + Currently, only ``numpy.dtype("timedelta64[ns]")`` is accepted. + freq : Offset, optional + copy : bool, default False + Whether to copy the underlying array of data. + """ _typ = "timedeltaarray" _scalar_type = Timedelta __array_priority__ = 1000 @@ -128,6 +151,19 @@ def _box_func(self): @property def dtype(self): + """ + The dtype for the TimedeltaArray. + + .. warning:: + + A future version of pandas will change dtype to be an instance + of a :class:`pandas.api.extensions.ExtensionDtype` subclass, + not a ``numpy.dtype``. + + Returns + ------- + numpy.dtype + """ return _TD_DTYPE # ---------------------------------------------------------------- diff --git a/pandas/core/base.py b/pandas/core/base.py index c02ba88ea7fda..5a98e83c65884 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -1,6 +1,7 @@ """ Base and utility classes for pandas objects. """ +from collections import OrderedDict import textwrap import warnings @@ -8,7 +9,7 @@ import pandas._libs.lib as lib import pandas.compat as compat -from pandas.compat import PYPY, OrderedDict, builtins, map, range +from pandas.compat import PYPY, builtins, map, range from pandas.compat.numpy import function as nv from pandas.errors import AbstractMethodError from pandas.util._decorators import Appender, Substitution, cache_readonly @@ -376,7 +377,7 @@ def nested_renaming_depr(level=4): # eg. {'A' : ['mean']}, normalize all to # be list-likes if any(is_aggregator(x) for x in compat.itervalues(arg)): - new_arg = compat.OrderedDict() + new_arg = OrderedDict() for k, v in compat.iteritems(arg): if not isinstance(v, (tuple, list, dict)): new_arg[k] = [v] @@ -444,14 +445,14 @@ def _agg(arg, func): run the aggregations over the arg with func return an OrderedDict """ - result = compat.OrderedDict() + result = OrderedDict() for fname, agg_how in compat.iteritems(arg): result[fname] = func(fname, agg_how) return result # set the final keys keys = list(compat.iterkeys(arg)) - result = compat.OrderedDict() + result = OrderedDict() # nested renamer if is_nested_renamer: @@ -459,7 +460,7 @@ def _agg(arg, func): if all(isinstance(r, dict) for r in result): - result, results = compat.OrderedDict(), result + result, results = OrderedDict(), result for r in results: result.update(r) keys = list(compat.iterkeys(result)) @@ -1234,7 +1235,7 @@ def value_counts(self, normalize=False, sort=True, ascending=False, If True then the object returned will contain the relative frequencies of the unique values. sort : boolean, default True - Sort by values. + Sort by frequencies. ascending : boolean, default False Sort in ascending order. bins : integer, optional @@ -1323,12 +1324,31 @@ def nunique(self, dropna=True): Parameters ---------- - dropna : boolean, default True + dropna : bool, default True Don't include NaN in the count. Returns ------- - nunique : int + int + + See Also + -------- + DataFrame.nunique: Method nunique for DataFrame. + Series.count: Count non-NA/null observations in the Series. + + Examples + -------- + >>> s = pd.Series([1, 3, 5, 7, 7]) + >>> s + 0 1 + 1 3 + 2 5 + 3 7 + 4 7 + dtype: int64 + + >>> s.nunique() + 4 """ uniqs = self.unique() n = len(uniqs) @@ -1345,7 +1365,7 @@ def is_unique(self): ------- is_unique : boolean """ - return self.nunique() == len(self) + return self.nunique(dropna=False) == len(self) @property def is_monotonic(self): diff --git a/pandas/core/common.py b/pandas/core/common.py index b4de0daa13b16..5b83cb344b1e7 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -5,6 +5,7 @@ """ import collections +from collections import OrderedDict from datetime import datetime, timedelta from functools import partial import inspect @@ -13,7 +14,7 @@ from pandas._libs import lib, tslibs import pandas.compat as compat -from pandas.compat import PY36, OrderedDict, iteritems +from pandas.compat import PY36, iteritems from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike from pandas.core.dtypes.common import ( @@ -32,7 +33,8 @@ class SettingWithCopyWarning(Warning): def flatten(l): - """Flatten an arbitrarily nested sequence. + """ + Flatten an arbitrarily nested sequence. Parameters ---------- @@ -160,12 +162,16 @@ def cast_scalar_indexer(val): def _not_none(*args): - """Returns a generator consisting of the arguments that are not None""" + """ + Returns a generator consisting of the arguments that are not None. + """ return (arg for arg in args if arg is not None) def _any_none(*args): - """Returns a boolean indicating if any argument is None""" + """ + Returns a boolean indicating if any argument is None. + """ for arg in args: if arg is None: return True @@ -173,7 +179,9 @@ def _any_none(*args): def _all_none(*args): - """Returns a boolean indicating if all arguments are None""" + """ + Returns a boolean indicating if all arguments are None. + """ for arg in args: if arg is not None: return False @@ -181,7 +189,9 @@ def _all_none(*args): def _any_not_none(*args): - """Returns a boolean indicating if any argument is not None""" + """ + Returns a boolean indicating if any argument is not None. + """ for arg in args: if arg is not None: return True @@ -189,7 +199,9 @@ def _any_not_none(*args): def _all_not_none(*args): - """Returns a boolean indicating if all arguments are not None""" + """ + Returns a boolean indicating if all arguments are not None. + """ for arg in args: if arg is None: return False @@ -197,7 +209,9 @@ def _all_not_none(*args): def count_not_none(*args): - """Returns the count of arguments that are not None""" + """ + Returns the count of arguments that are not None. + """ return sum(x is not None for x in args) @@ -277,7 +291,9 @@ def maybe_make_list(obj): def is_null_slice(obj): - """ we have a null slice """ + """ + We have a null slice. + """ return (isinstance(obj, slice) and obj.start is None and obj.stop is None and obj.step is None) @@ -291,7 +307,9 @@ def is_true_slices(l): # TODO: used only once in indexing; belongs elsewhere? def is_full_slice(obj, l): - """ we have a full length slice """ + """ + We have a full length slice. + """ return (isinstance(obj, slice) and obj.start == 0 and obj.stop == l and obj.step is None) @@ -316,7 +334,7 @@ def get_callable_name(obj): def apply_if_callable(maybe_callable, obj, **kwargs): """ Evaluate possibly callable input using obj and kwargs if it is callable, - otherwise return as it is + otherwise return as it is. Parameters ---------- @@ -333,7 +351,8 @@ def apply_if_callable(maybe_callable, obj, **kwargs): def dict_compat(d): """ - Helper function to convert datetimelike-keyed dicts to Timestamp-keyed dict + Helper function to convert datetimelike-keyed dicts + to Timestamp-keyed dict. Parameters ---------- @@ -383,13 +402,6 @@ def standardize_mapping(into): return into -def sentinel_factory(): - class Sentinel(object): - pass - - return Sentinel() - - def random_state(state=None): """ Helper function for processing random_state arguments. diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index b768ed6df303e..23c3e0eaace81 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -205,7 +205,7 @@ def eval(expr, parser='pandas', engine=None, truediv=True, A list of objects implementing the ``__getitem__`` special method that you can use to inject an additional collection of namespaces to use for variable lookup. For example, this is used in the - :meth:`~pandas.DataFrame.query` method to inject the + :meth:`~DataFrame.query` method to inject the ``DataFrame.index`` and ``DataFrame.columns`` variables that refer to their respective :class:`~pandas.DataFrame` instance attributes. @@ -248,8 +248,8 @@ def eval(expr, parser='pandas', engine=None, truediv=True, See Also -------- - pandas.DataFrame.query - pandas.DataFrame.eval + DataFrame.query + DataFrame.eval Notes ----- diff --git a/pandas/core/computation/expr.py b/pandas/core/computation/expr.py index 9a44198ba3b86..d840bf6ae71a2 100644 --- a/pandas/core/computation/expr.py +++ b/pandas/core/computation/expr.py @@ -18,7 +18,6 @@ UndefinedVariableError, _arith_ops_syms, _bool_ops_syms, _cmp_ops_syms, _mathops, _reductions, _unary_ops_syms, is_term) from pandas.core.computation.scope import Scope -from pandas.core.reshape.util import compose import pandas.io.formats.printing as printing @@ -103,8 +102,19 @@ def _replace_locals(tok): return toknum, tokval -def _preparse(source, f=compose(_replace_locals, _replace_booleans, - _rewrite_assign)): +def _compose2(f, g): + """Compose 2 callables""" + return lambda *args, **kwargs: f(g(*args, **kwargs)) + + +def _compose(*funcs): + """Compose 2 or more callables""" + assert len(funcs) > 1, 'At least 2 callables must be passed to compose' + return reduce(_compose2, funcs) + + +def _preparse(source, f=_compose(_replace_locals, _replace_booleans, + _rewrite_assign)): """Compose a collection of tokenization functions Parameters @@ -701,8 +711,8 @@ def visitor(x, y): class PandasExprVisitor(BaseExprVisitor): def __init__(self, env, engine, parser, - preparser=partial(_preparse, f=compose(_replace_locals, - _replace_booleans))): + preparser=partial(_preparse, f=_compose(_replace_locals, + _replace_booleans))): super(PandasExprVisitor, self).__init__(env, engine, parser, preparser) diff --git a/pandas/core/computation/ops.py b/pandas/core/computation/ops.py index 8c3218a976b6b..5c70255982e54 100644 --- a/pandas/core/computation/ops.py +++ b/pandas/core/computation/ops.py @@ -8,11 +8,11 @@ import numpy as np +from pandas._libs.tslibs import Timestamp from pandas.compat import PY3, string_types, text_type from pandas.core.dtypes.common import is_list_like, is_scalar -import pandas as pd from pandas.core.base import StringMixin import pandas.core.common as com from pandas.core.computation.common import _ensure_decoded, _result_type_many @@ -399,8 +399,9 @@ def evaluate(self, env, engine, parser, term_type, eval_in_python): if self.op in eval_in_python: res = self.func(left.value, right.value) else: - res = pd.eval(self, local_dict=env, engine=engine, - parser=parser) + from pandas.core.computation.eval import eval + res = eval(self, local_dict=env, engine=engine, + parser=parser) name = env.add_tmp(res) return term_type(name, env=env) @@ -422,7 +423,7 @@ def stringify(value): v = rhs.value if isinstance(v, (int, float)): v = stringify(v) - v = pd.Timestamp(_ensure_decoded(v)) + v = Timestamp(_ensure_decoded(v)) if v.tz is not None: v = v.tz_convert('UTC') self.rhs.update(v) @@ -431,7 +432,7 @@ def stringify(value): v = lhs.value if isinstance(v, (int, float)): v = stringify(v) - v = pd.Timestamp(_ensure_decoded(v)) + v = Timestamp(_ensure_decoded(v)) if v.tz is not None: v = v.tz_convert('UTC') self.lhs.update(v) diff --git a/pandas/core/computation/pytables.py b/pandas/core/computation/pytables.py index 00de29b07c75d..18f13e17c046e 100644 --- a/pandas/core/computation/pytables.py +++ b/pandas/core/computation/pytables.py @@ -5,6 +5,7 @@ import numpy as np +from pandas._libs.tslibs import Timedelta, Timestamp from pandas.compat import DeepChainMap, string_types, u from pandas.core.dtypes.common import is_list_like @@ -185,12 +186,12 @@ def stringify(value): if isinstance(v, (int, float)): v = stringify(v) v = _ensure_decoded(v) - v = pd.Timestamp(v) + v = Timestamp(v) if v.tz is not None: v = v.tz_convert('UTC') return TermValue(v, v.value, kind) elif kind == u('timedelta64') or kind == u('timedelta'): - v = pd.Timedelta(v, unit='s').value + v = Timedelta(v, unit='s').value return TermValue(int(v), v, kind) elif meta == u('category'): metadata = com.values_from_object(self.metadata) @@ -251,7 +252,7 @@ def evaluate(self): .format(slf=self)) rhs = self.conform(self.rhs) - values = [TermValue(v, v, self.kind) for v in rhs] + values = [TermValue(v, v, self.kind).value for v in rhs] if self.is_in_table: @@ -262,7 +263,7 @@ def evaluate(self): self.filter = ( self.lhs, filter_op, - pd.Index([v.value for v in values])) + pd.Index(values)) return self return None @@ -274,7 +275,7 @@ def evaluate(self): self.filter = ( self.lhs, filter_op, - pd.Index([v.value for v in values])) + pd.Index(values)) else: raise TypeError("passing a filterable condition to a non-table " diff --git a/pandas/core/computation/scope.py b/pandas/core/computation/scope.py index 33c5a1c2e0f0a..e158bc8c568eb 100644 --- a/pandas/core/computation/scope.py +++ b/pandas/core/computation/scope.py @@ -11,9 +11,9 @@ import numpy as np +from pandas._libs.tslibs import Timestamp from pandas.compat import DeepChainMap, StringIO, map -import pandas as pd # noqa from pandas.core.base import StringMixin import pandas.core.computation as compu @@ -48,7 +48,7 @@ def _raw_hex_id(obj): _DEFAULT_GLOBALS = { - 'Timestamp': pd._libs.tslib.Timestamp, + 'Timestamp': Timestamp, 'datetime': datetime.datetime, 'True': True, 'False': False, diff --git a/pandas/core/config.py b/pandas/core/config.py index 0f43ca65d187a..01664fffb1e27 100644 --- a/pandas/core/config.py +++ b/pandas/core/config.py @@ -282,8 +282,8 @@ def __doc__(self): Note: partial matches are supported for convenience, but unless you use the full option name (e.g. x.y.z.option_name), your code may break in future versions if new options with similar names are introduced. -value : - new value of option. +value : object + New value of option. Returns ------- diff --git a/pandas/core/dtypes/base.py b/pandas/core/dtypes/base.py index ab1cb9cf2499a..88bbdcf342d66 100644 --- a/pandas/core/dtypes/base.py +++ b/pandas/core/dtypes/base.py @@ -153,8 +153,8 @@ class ExtensionDtype(_DtypeOpsMixin): See Also -------- - pandas.api.extensions.register_extension_dtype - pandas.api.extensions.ExtensionArray + extensions.register_extension_dtype + extensions.ExtensionArray Notes ----- @@ -173,7 +173,7 @@ class ExtensionDtype(_DtypeOpsMixin): Optionally one can override construct_array_type for construction with the name of this dtype via the Registry. See - :meth:`pandas.api.extensions.register_extension_dtype`. + :meth:`extensions.register_extension_dtype`. * construct_array_type diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index ad62146dda268..f6561948df99a 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -1111,11 +1111,9 @@ def find_common_type(types): # this is different from numpy, which casts bool with float/int as int has_bools = any(is_bool_dtype(t) for t in types) if has_bools: - has_ints = any(is_integer_dtype(t) for t in types) - has_floats = any(is_float_dtype(t) for t in types) - has_complex = any(is_complex_dtype(t) for t in types) - if has_ints or has_floats or has_complex: - return np.object + for t in types: + if is_integer_dtype(t) or is_float_dtype(t) or is_complex_dtype(t): + return np.object return np.find_common_type(types, []) diff --git a/pandas/core/dtypes/common.py b/pandas/core/dtypes/common.py index e9bf0f87088db..4be7eb8ddb890 100644 --- a/pandas/core/dtypes/common.py +++ b/pandas/core/dtypes/common.py @@ -139,7 +139,8 @@ def is_object_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array-like or dtype is of the object dtype. + boolean + Whether or not the array-like or dtype is of the object dtype. Examples -------- @@ -230,8 +231,8 @@ def is_scipy_sparse(arr): Returns ------- - boolean : Whether or not the array-like is a - scipy.sparse.spmatrix instance. + boolean + Whether or not the array-like is a scipy.sparse.spmatrix instance. Notes ----- @@ -270,7 +271,8 @@ def is_categorical(arr): Returns ------- - boolean : Whether or not the array-like is of a Categorical instance. + boolean + Whether or not the array-like is of a Categorical instance. Examples -------- @@ -305,8 +307,9 @@ def is_datetimetz(arr): Returns ------- - boolean : Whether or not the array-like is a datetime array-like with - a timezone component in its dtype. + boolean + Whether or not the array-like is a datetime array-like with a + timezone component in its dtype. Examples -------- @@ -347,7 +350,8 @@ def is_offsetlike(arr_or_obj): Returns ------- - boolean : Whether the object is a DateOffset or listlike of DatetOffsets + boolean + Whether the object is a DateOffset or listlike of DatetOffsets Examples -------- @@ -381,7 +385,8 @@ def is_period(arr): Returns ------- - boolean : Whether or not the array-like is a periodical index. + boolean + Whether or not the array-like is a periodical index. Examples -------- @@ -411,8 +416,8 @@ def is_datetime64_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array-like or dtype is of - the datetime64 dtype. + boolean + Whether or not the array-like or dtype is of the datetime64 dtype. Examples -------- @@ -442,8 +447,8 @@ def is_datetime64tz_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array-like or dtype is of - a DatetimeTZDtype dtype. + boolean + Whether or not the array-like or dtype is of a DatetimeTZDtype dtype. Examples -------- @@ -480,8 +485,8 @@ def is_timedelta64_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array-like or dtype is - of the timedelta64 dtype. + boolean + Whether or not the array-like or dtype is of the timedelta64 dtype. Examples -------- @@ -511,7 +516,8 @@ def is_period_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array-like or dtype is of the Period dtype. + boolean + Whether or not the array-like or dtype is of the Period dtype. Examples -------- @@ -544,8 +550,8 @@ def is_interval_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array-like or dtype is - of the Interval dtype. + boolean + Whether or not the array-like or dtype is of the Interval dtype. Examples -------- @@ -580,8 +586,8 @@ def is_categorical_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array-like or dtype is - of the Categorical dtype. + boolean + Whether or not the array-like or dtype is of the Categorical dtype. Examples -------- @@ -613,7 +619,8 @@ def is_string_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of the string dtype. + boolean + Whether or not the array or dtype is of the string dtype. Examples -------- @@ -647,8 +654,9 @@ def is_period_arraylike(arr): Returns ------- - boolean : Whether or not the array-like is a periodical - array-like or PeriodIndex instance. + boolean + Whether or not the array-like is a periodical array-like or + PeriodIndex instance. Examples -------- @@ -678,8 +686,9 @@ def is_datetime_arraylike(arr): Returns ------- - boolean : Whether or not the array-like is a datetime - array-like or DatetimeIndex. + boolean + Whether or not the array-like is a datetime array-like or + DatetimeIndex. Examples -------- @@ -713,7 +722,8 @@ def is_datetimelike(arr): Returns ------- - boolean : Whether or not the array-like is a datetime-like array-like. + boolean + Whether or not the array-like is a datetime-like array-like. Examples -------- @@ -754,7 +764,8 @@ def is_dtype_equal(source, target): Returns ---------- - boolean : Whether or not the two dtypes are equal. + boolean + Whether or not the two dtypes are equal. Examples -------- @@ -794,7 +805,8 @@ def is_dtype_union_equal(source, target): Returns ---------- - boolean : Whether or not the two dtypes are equal. + boolean + Whether or not the two dtypes are equal. >>> is_dtype_equal("int", int) True @@ -835,7 +847,8 @@ def is_any_int_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of an integer dtype. + boolean + Whether or not the array or dtype is of an integer dtype. Examples -------- @@ -883,8 +896,9 @@ def is_integer_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of an integer dtype - and not an instance of timedelta64. + boolean + Whether or not the array or dtype is of an integer dtype and + not an instance of timedelta64. Examples -------- @@ -938,8 +952,9 @@ def is_signed_integer_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of a signed integer dtype - and not an instance of timedelta64. + boolean + Whether or not the array or dtype is of a signed integer dtype + and not an instance of timedelta64. Examples -------- @@ -993,8 +1008,8 @@ def is_unsigned_integer_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of an - unsigned integer dtype. + boolean + Whether or not the array or dtype is of an unsigned integer dtype. Examples -------- @@ -1036,7 +1051,8 @@ def is_int64_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of the int64 dtype. + boolean + Whether or not the array or dtype is of the int64 dtype. Notes ----- @@ -1086,7 +1102,8 @@ def is_datetime64_any_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of the datetime64 dtype. + boolean + Whether or not the array or dtype is of the datetime64 dtype. Examples -------- @@ -1126,7 +1143,8 @@ def is_datetime64_ns_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of the datetime64[ns] dtype. + boolean + Whether or not the array or dtype is of the datetime64[ns] dtype. Examples -------- @@ -1178,8 +1196,8 @@ def is_timedelta64_ns_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of the - timedelta64[ns] dtype. + boolean + Whether or not the array or dtype is of the timedelta64[ns] dtype. Examples -------- @@ -1207,8 +1225,9 @@ def is_datetime_or_timedelta_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of a - timedelta64, or datetime64 dtype. + boolean + Whether or not the array or dtype is of a timedelta64, + or datetime64 dtype. Examples -------- @@ -1248,7 +1267,8 @@ def _is_unorderable_exception(e): Returns ------- - boolean : Whether or not the exception raised is an unorderable exception. + boolean + Whether or not the exception raised is an unorderable exception. """ if PY36: @@ -1275,8 +1295,8 @@ def is_numeric_v_string_like(a, b): Returns ------- - boolean : Whether we return a comparing a string-like - object to a numeric array. + boolean + Whether we return a comparing a string-like object to a numeric array. Examples -------- @@ -1332,8 +1352,8 @@ def is_datetimelike_v_numeric(a, b): Returns ------- - boolean : Whether we return a comparing a datetime-like - to a numeric object. + boolean + Whether we return a comparing a datetime-like to a numeric object. Examples -------- @@ -1388,8 +1408,8 @@ def is_datetimelike_v_object(a, b): Returns ------- - boolean : Whether we return a comparing a datetime-like - to an object instance. + boolean + Whether we return a comparing a datetime-like to an object instance. Examples -------- @@ -1442,7 +1462,8 @@ def needs_i8_conversion(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype should be converted to int64. + boolean + Whether or not the array or dtype should be converted to int64. Examples -------- @@ -1480,7 +1501,8 @@ def is_numeric_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of a numeric dtype. + boolean + Whether or not the array or dtype is of a numeric dtype. Examples -------- @@ -1524,7 +1546,8 @@ def is_string_like_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of the string dtype. + boolean + Whether or not the array or dtype is of the string dtype. Examples -------- @@ -1555,7 +1578,8 @@ def is_float_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of a float dtype. + boolean + Whether or not the array or dtype is of a float dtype. Examples -------- @@ -1586,7 +1610,8 @@ def is_bool_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of a boolean dtype. + boolean + Whether or not the array or dtype is of a boolean dtype. Notes ----- @@ -1655,8 +1680,8 @@ def is_extension_type(arr): Returns ------- - boolean : Whether or not the array-like is of a pandas - extension class instance. + boolean + Whether or not the array-like is of a pandas extension class instance. Examples -------- @@ -1760,7 +1785,8 @@ def is_complex_dtype(arr_or_dtype): Returns ------- - boolean : Whether or not the array or dtype is of a compex dtype. + boolean + Whether or not the array or dtype is of a compex dtype. Examples -------- @@ -1980,7 +2006,7 @@ def _validate_date_like_dtype(dtype): def pandas_dtype(dtype): """ - Converts input into a pandas only dtype object or a numpy dtype object. + Convert input into a pandas only dtype object or a numpy dtype object. Parameters ---------- diff --git a/pandas/core/dtypes/concat.py b/pandas/core/dtypes/concat.py index aada777decaa7..10e903acbe538 100644 --- a/pandas/core/dtypes/concat.py +++ b/pandas/core/dtypes/concat.py @@ -123,8 +123,6 @@ def is_nonempty(x): except Exception: return True - nonempty = [x for x in to_concat if is_nonempty(x)] - # If all arrays are empty, there's nothing to convert, just short-cut to # the concatenation, #3121. # @@ -148,11 +146,11 @@ def is_nonempty(x): elif 'sparse' in typs: return _concat_sparse(to_concat, axis=axis, typs=typs) - extensions = [is_extension_array_dtype(x) for x in to_concat] - if any(extensions) and axis == 1: + all_empty = all(not is_nonempty(x) for x in to_concat) + if any(is_extension_array_dtype(x) for x in to_concat) and axis == 1: to_concat = [np.atleast_2d(x.astype('object')) for x in to_concat] - if not nonempty: + if all_empty: # we have all empties, but may need to coerce the result dtype to # object if we have non-numeric type operands (numpy would otherwise # cast this to float) diff --git a/pandas/core/dtypes/dtypes.py b/pandas/core/dtypes/dtypes.py index f84471c3b04e8..8b9ac680493a1 100644 --- a/pandas/core/dtypes/dtypes.py +++ b/pandas/core/dtypes/dtypes.py @@ -17,7 +17,8 @@ def register_extension_dtype(cls): - """Class decorator to register an ExtensionType with pandas. + """ + Register an ExtensionType with pandas as class decorator. .. versionadded:: 0.24.0 @@ -194,7 +195,7 @@ class CategoricalDtype(PandasExtensionDtype, ExtensionDtype): See Also -------- - pandas.Categorical + Categorical Notes ----- @@ -413,8 +414,7 @@ def _hash_categories(categories, ordered=True): cat_array = hash_tuples(categories) else: if categories.dtype == 'O': - types = [type(x) for x in categories] - if not len(set(types)) == 1: + if len({type(x) for x in categories}) != 1: # TODO: hash_array doesn't handle mixed types. It casts # everything to a str first, which means we treat # {'1', '2'} the same as {'1', 2} diff --git a/pandas/core/dtypes/inference.py b/pandas/core/dtypes/inference.py index b11542622451c..1a02623fa6072 100644 --- a/pandas/core/dtypes/inference.py +++ b/pandas/core/dtypes/inference.py @@ -44,7 +44,7 @@ def is_number(obj): See Also -------- - pandas.api.types.is_integer: Checks a subgroup of numbers. + api.types.is_integer: Checks a subgroup of numbers. Examples -------- @@ -397,12 +397,15 @@ def is_dict_like(obj): True >>> is_dict_like([1, 2, 3]) False + >>> is_dict_like(dict) + False + >>> is_dict_like(dict()) + True """ - for attr in ("__getitem__", "keys", "__contains__"): - if not hasattr(obj, attr): - return False - - return True + dict_like_attrs = ("__getitem__", "keys", "__contains__") + return (all(hasattr(obj, attr) for attr in dict_like_attrs) + # [GH 25196] exclude classes + and not isinstance(obj, type)) def is_named_tuple(obj): diff --git a/pandas/core/frame.py b/pandas/core/frame.py index b4f79bda25517..e89aeb29f1625 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -13,6 +13,7 @@ from __future__ import division import collections +from collections import OrderedDict import functools import itertools import sys @@ -32,7 +33,7 @@ from pandas import compat from pandas.compat import (range, map, zip, lmap, lzip, StringIO, u, - OrderedDict, PY36, raise_with_traceback, + PY36, raise_with_traceback, string_and_binary_types) from pandas.compat.numpy import function as nv from pandas.core.dtypes.cast import ( @@ -318,7 +319,7 @@ class DataFrame(NDFrame): DataFrame.from_records : Constructor from tuples, also record arrays. DataFrame.from_dict : From dicts of Series, arrays, or dicts. DataFrame.from_items : From sequence of (key, value) pairs - pandas.read_csv, pandas.read_table, pandas.read_clipboard. + read_csv, pandas.read_table, pandas.read_clipboard. Examples -------- @@ -482,7 +483,7 @@ def axes(self): -------- >>> df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]}) >>> df.axes - [RangeIndex(start=0, stop=2, step=1), Index(['coll', 'col2'], + [RangeIndex(start=0, stop=2, step=1), Index(['col1', 'col2'], dtype='object')] """ return [self.index, self.columns] @@ -640,16 +641,6 @@ def _repr_html_(self): Mainly for IPython notebook. """ - # qtconsole doesn't report its line width, and also - # behaves badly when outputting an HTML table - # that doesn't fit the window, so disable it. - # XXX: In IPython 3.x and above, the Qt console will not attempt to - # display HTML, so this check can be removed when support for - # IPython 2.x is no longer needed. - if console.in_qtconsole(): - # 'HTML output is disabled in QtConsole' - return None - if self._info_repr(): buf = StringIO(u("")) self.info(buf=buf) @@ -727,7 +718,7 @@ def style(self): See Also -------- - pandas.io.formats.style.Styler + io.formats.style.Styler """ from pandas.io.formats.style import Styler return Styler(self) @@ -847,7 +838,7 @@ def itertuples(self, index=True, name="Pandas"): ---------- index : bool, default True If True, return the index as the first element of the tuple. - name : str, default "Pandas" + name : str or None, default "Pandas" The name of the returned namedtuples or None to return regular tuples. @@ -1290,23 +1281,26 @@ def to_dict(self, orient='dict', into=dict): ('columns', self.columns.tolist()), ('data', [ list(map(com.maybe_box_datetimelike, t)) - for t in self.itertuples(index=False)] - ))) + for t in self.itertuples(index=False, name=None) + ]))) elif orient.lower().startswith('s'): return into_c((k, com.maybe_box_datetimelike(v)) for k, v in compat.iteritems(self)) elif orient.lower().startswith('r'): + columns = self.columns.tolist() + rows = (dict(zip(columns, row)) + for row in self.itertuples(index=False, name=None)) return [ into_c((k, com.maybe_box_datetimelike(v)) - for k, v in compat.iteritems(row._asdict())) - for row in self.itertuples(index=False)] + for k, v in compat.iteritems(row)) + for row in rows] elif orient.lower().startswith('i'): if not self.index.is_unique: raise ValueError( "DataFrame index must be unique for orient='index'." ) return into_c((t[0], dict(zip(self.columns, t[1:]))) - for t in self.itertuples()) + for t in self.itertuples(name=None)) else: raise ValueError("orient '{o}' not understood".format(o=orient)) @@ -1406,7 +1400,7 @@ def to_gbq(self, destination_table, project_id=None, chunksize=None, See Also -------- pandas_gbq.to_gbq : This function in the pandas-gbq library. - pandas.read_gbq : Read a DataFrame from Google BigQuery. + read_gbq : Read a DataFrame from Google BigQuery. """ from pandas.io import gbq return gbq.to_gbq( @@ -1524,8 +1518,8 @@ def from_records(cls, data, index=None, exclude=None, columns=None, result_index = Index([], name=index) else: try: - to_remove = [arr_columns.get_loc(field) for field in index] - index_data = [arrays[i] for i in to_remove] + index_data = [arrays[arr_columns.get_loc(field)] + for field in index] result_index = ensure_index_from_sequences(index_data, names=index) @@ -1716,7 +1710,8 @@ def to_records(self, index=True, convert_datetime64=None, # string naming a type. if dtype_mapping is None: formats.append(v.dtype) - elif isinstance(dtype_mapping, (type, compat.string_types)): + elif isinstance(dtype_mapping, (type, np.dtype, + compat.string_types)): formats.append(dtype_mapping) else: element = "row" if i < index_len else "column" @@ -1831,14 +1826,14 @@ def from_csv(cls, path, header=0, sep=',', index_col=0, parse_dates=True, Read CSV file. .. deprecated:: 0.21.0 - Use :func:`pandas.read_csv` instead. + Use :func:`read_csv` instead. - It is preferable to use the more powerful :func:`pandas.read_csv` + It is preferable to use the more powerful :func:`read_csv` for most general purposes, but ``from_csv`` makes for an easy roundtrip to and from a file (the exact counterpart of ``to_csv``), especially with a DataFrame of time series data. - This method only differs from the preferred :func:`pandas.read_csv` + This method only differs from the preferred :func:`read_csv` in some defaults: - `index_col` is ``0`` instead of ``None`` (take first column as index @@ -1875,7 +1870,7 @@ def from_csv(cls, path, header=0, sep=',', index_col=0, parse_dates=True, See Also -------- - pandas.read_csv + read_csv """ warnings.warn("from_csv is deprecated. Please use read_csv(...) " @@ -1963,45 +1958,7 @@ def to_panel(self): ------- panel : Panel """ - # only support this kind for now - if (not isinstance(self.index, MultiIndex) or # pragma: no cover - len(self.index.levels) != 2): - raise NotImplementedError('Only 2-level MultiIndex are supported.') - - if not self.index.is_unique: - raise ValueError("Can't convert non-uniquely indexed " - "DataFrame to Panel") - - self._consolidate_inplace() - - # minor axis must be sorted - if self.index.lexsort_depth < 2: - selfsorted = self.sort_index(level=0) - else: - selfsorted = self - - major_axis, minor_axis = selfsorted.index.levels - major_codes, minor_codes = selfsorted.index.codes - shape = len(major_axis), len(minor_axis) - - # preserve names, if any - major_axis = major_axis.copy() - major_axis.name = self.index.names[0] - - minor_axis = minor_axis.copy() - minor_axis.name = self.index.names[1] - - # create new axes - new_axes = [selfsorted.columns, major_axis, minor_axis] - - # create new manager - new_mgr = selfsorted._data.reshape_nd(axes=new_axes, - labels=[major_codes, - minor_codes], - shape=shape, - ref_items=selfsorted.columns) - - return self._constructor_expanddim(new_mgr) + raise NotImplementedError("Panel is being removed in pandas 0.25.0.") @deprecate_kwarg(old_arg_name='encoding', new_arg_name=None) def to_stata(self, fname, convert_dates=None, write_index=True, @@ -2530,7 +2487,7 @@ def memory_usage(self, index=True, deep=False): numpy.ndarray.nbytes : Total bytes consumed by the elements of an ndarray. Series.memory_usage : Bytes consumed by a Series. - pandas.Categorical : Memory-efficient array for string values with + Categorical : Memory-efficient array for string values with many repeated values. DataFrame.info : Concise summary of a DataFrame. @@ -3005,28 +2962,30 @@ def query(self, expr, inplace=False, **kwargs): Parameters ---------- - expr : string + expr : str The query string to evaluate. You can refer to variables in the environment by prefixing them with an '@' character like ``@a + b``. inplace : bool Whether the query should modify the data in place or return - a modified copy + a modified copy. + **kwargs + See the documentation for :func:`eval` for complete details + on the keyword arguments accepted by :meth:`DataFrame.query`. .. versionadded:: 0.18.0 - kwargs : dict - See the documentation for :func:`pandas.eval` for complete details - on the keyword arguments accepted by :meth:`DataFrame.query`. - Returns ------- - q : DataFrame + DataFrame + DataFrame resulting from the provided query expression. See Also -------- - pandas.eval - DataFrame.eval + eval : Evaluate a string describing operations on + DataFrame columns. + DataFrame.eval : Evaluate a string describing operations on + DataFrame columns. Notes ----- @@ -3035,7 +2994,7 @@ def query(self, expr, inplace=False, **kwargs): multidimensional key (e.g., a DataFrame) then the result will be passed to :meth:`DataFrame.__getitem__`. - This method uses the top-level :func:`pandas.eval` function to + This method uses the top-level :func:`eval` function to evaluate the passed query. The :meth:`~pandas.DataFrame.query` method uses a slightly @@ -3065,9 +3024,23 @@ def query(self, expr, inplace=False, **kwargs): Examples -------- - >>> df = pd.DataFrame(np.random.randn(10, 2), columns=list('ab')) - >>> df.query('a > b') - >>> df[df.a > df.b] # same result as the previous expression + >>> df = pd.DataFrame({'A': range(1, 6), 'B': range(10, 0, -2)}) + >>> df + A B + 0 1 10 + 1 2 8 + 2 3 6 + 3 4 4 + 4 5 2 + >>> df.query('A > B') + A B + 4 5 2 + + The previous expression is equivalent to + + >>> df[df.A > df.B] + A B + 4 5 2 """ inplace = validate_bool_kwarg(inplace, 'inplace') if not isinstance(expr, compat.string_types): @@ -3108,7 +3081,7 @@ def eval(self, expr, inplace=False, **kwargs): .. versionadded:: 0.18.0. kwargs : dict - See the documentation for :func:`~pandas.eval` for complete details + See the documentation for :func:`eval` for complete details on the keyword arguments accepted by :meth:`~pandas.DataFrame.query`. @@ -3123,12 +3096,12 @@ def eval(self, expr, inplace=False, **kwargs): of a frame. DataFrame.assign : Can evaluate an expression or function to create new values for a column. - pandas.eval : Evaluate a Python expression as a string using various + eval : Evaluate a Python expression as a string using various backends. Notes ----- - For more details see the API documentation for :func:`~pandas.eval`. + For more details see the API documentation for :func:`~eval`. For detailed examples see :ref:`enhancing performance with eval `. @@ -3967,7 +3940,7 @@ def rename(self, *args, **kwargs): See Also -------- - pandas.DataFrame.rename_axis + DataFrame.rename_axis Examples -------- @@ -4127,33 +4100,8 @@ def set_index(self, keys, drop=True, append=False, inplace=False, 4 16 10 2014 31 """ inplace = validate_bool_kwarg(inplace, 'inplace') - - err_msg = ('The parameter "keys" may be a column key, one-dimensional ' - 'array, or a list containing only valid column keys and ' - 'one-dimensional arrays.') - - if (is_scalar(keys) or isinstance(keys, tuple) - or isinstance(keys, (ABCIndexClass, ABCSeries, np.ndarray))): - # make sure we have a container of keys/arrays we can iterate over - # tuples can appear as valid column keys! + if not isinstance(keys, list): keys = [keys] - elif not isinstance(keys, list): - raise ValueError(err_msg) - - missing = [] - for col in keys: - if (is_scalar(col) or isinstance(col, tuple)): - # if col is a valid column key, everything is fine - # tuples are always considered keys, never as list-likes - if col not in self: - missing.append(col) - elif (not isinstance(col, (ABCIndexClass, ABCSeries, - np.ndarray, list)) - or getattr(col, 'ndim', 1) > 1): - raise ValueError(err_msg) - - if missing: - raise KeyError('{}'.format(missing)) if inplace: frame = self @@ -4614,7 +4562,8 @@ def dropna(self, axis=0, how='any', thresh=None, subset=None, def drop_duplicates(self, subset=None, keep='first', inplace=False): """ Return DataFrame with duplicate rows removed, optionally only - considering certain columns. + considering certain columns. Indexes, including time indexes + are ignored. Parameters ---------- @@ -5130,8 +5079,7 @@ def _combine_const(self, other, func): def combine(self, other, func, fill_value=None, overwrite=True): """ - Perform column-wise combine with another DataFrame based on a - passed function. + Perform column-wise combine with another DataFrame. Combines a DataFrame with `other` DataFrame using `func` to element-wise combine columns. The row and column indexes of the @@ -5147,13 +5095,14 @@ def combine(self, other, func, fill_value=None, overwrite=True): fill_value : scalar value, default None The value to fill NaNs with prior to passing any column to the merge func. - overwrite : boolean, default True + overwrite : bool, default True If True, columns in `self` that do not exist in `other` will be overwritten with NaNs. Returns ------- - result : DataFrame + DataFrame + Combination of the provided DataFrames. See Also -------- @@ -5197,15 +5146,15 @@ def combine(self, other, func, fill_value=None, overwrite=True): >>> df1 = pd.DataFrame({'A': [0, 0], 'B': [None, 4]}) >>> df2 = pd.DataFrame({'A': [1, 1], 'B': [None, 3]}) >>> df1.combine(df2, take_smaller, fill_value=-5) - A B - 0 0 NaN + A B + 0 0 -5.0 1 0 3.0 Example that demonstrates the use of `overwrite` and behavior when the axis differ between the dataframes. >>> df1 = pd.DataFrame({'A': [0, 0], 'B': [4, 4]}) - >>> df2 = pd.DataFrame({'B': [3, 3], 'C': [-10, 1],}, index=[1, 2]) + >>> df2 = pd.DataFrame({'B': [3, 3], 'C': [-10, 1], }, index=[1, 2]) >>> df1.combine(df2, take_smaller) A B C 0 NaN NaN NaN @@ -5220,7 +5169,7 @@ def combine(self, other, func, fill_value=None, overwrite=True): Demonstrating the preference of the passed in dataframe. - >>> df2 = pd.DataFrame({'B': [3, 3], 'C': [1, 1],}, index=[1, 2]) + >>> df2 = pd.DataFrame({'B': [3, 3], 'C': [1, 1], }, index=[1, 2]) >>> df2.combine(df1, take_smaller) A B C 0 0.0 NaN NaN @@ -5704,19 +5653,19 @@ def pivot(self, index=None, columns=None, values=None): This first example aggregates values by taking the sum. - >>> table = pivot_table(df, values='D', index=['A', 'B'], + >>> table = pd.pivot_table(df, values='D', index=['A', 'B'], ... columns=['C'], aggfunc=np.sum) >>> table C large small A B - bar one 4 5 - two 7 6 - foo one 4 1 - two NaN 6 + bar one 4.0 5.0 + two 7.0 6.0 + foo one 4.0 1.0 + two NaN 6.0 We can also fill missing values using the `fill_value` parameter. - >>> table = pivot_table(df, values='D', index=['A', 'B'], + >>> table = pd.pivot_table(df, values='D', index=['A', 'B'], ... columns=['C'], aggfunc=np.sum, fill_value=0) >>> table C large small @@ -5728,12 +5677,11 @@ def pivot(self, index=None, columns=None, values=None): The next example aggregates by taking the mean across multiple columns. - >>> table = pivot_table(df, values=['D', 'E'], index=['A', 'C'], + >>> table = pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'], ... aggfunc={'D': np.mean, ... 'E': np.mean}) >>> table - D E - mean mean + D E A C bar large 5.500000 7.500000 small 5.500000 8.500000 @@ -5743,17 +5691,17 @@ def pivot(self, index=None, columns=None, values=None): We can also calculate multiple types of aggregations for any given value column. - >>> table = pivot_table(df, values=['D', 'E'], index=['A', 'C'], + >>> table = pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'], ... aggfunc={'D': np.mean, ... 'E': [min, max, np.mean]}) >>> table - D E - mean max mean min + D E + mean max mean min A C - bar large 5.500000 9 7.500000 6 - small 5.500000 9 8.500000 8 - foo large 2.000000 5 4.500000 4 - small 2.333333 6 4.333333 2 + bar large 5.500000 9.0 7.500000 6.0 + small 5.500000 9.0 8.500000 8.0 + foo large 2.000000 5.0 4.500000 4.0 + small 2.333333 6.0 4.333333 2.0 """ @Substitution('') @@ -6001,7 +5949,7 @@ def unstack(self, level=-1, fill_value=None): return unstack(self, level, fill_value) _shared_docs['melt'] = (""" - Unpivots a DataFrame from wide format to long format, optionally + Unpivot a DataFrame from wide format to long format, optionally leaving identifier variables set. This function is useful to massage a DataFrame into a format where one @@ -6238,11 +6186,11 @@ def _gotitem(self, -------- DataFrame.apply : Perform any type of operations. DataFrame.transform : Perform transformation type operations. - pandas.core.groupby.GroupBy : Perform operations over groups. - pandas.core.resample.Resampler : Perform operations over resampled bins. - pandas.core.window.Rolling : Perform operations over rolling window. - pandas.core.window.Expanding : Perform operations over expanding window. - pandas.core.window.EWM : Perform operation over exponential weighted + core.groupby.GroupBy : Perform operations over groups. + core.resample.Resampler : Perform operations over resampled bins. + core.window.Rolling : Perform operations over rolling window. + core.window.Expanding : Perform operations over expanding window. + core.window.EWM : Perform operation over exponential weighted window. """) @@ -6594,7 +6542,7 @@ def append(self, other, ignore_index=False, See Also -------- - pandas.concat : General function to concatenate DataFrame, Series + concat : General function to concatenate DataFrame, Series or Panel objects. Notes @@ -6891,41 +6839,67 @@ def round(self, decimals=0, *args, **kwargs): columns not included in `decimals` will be left as is. Elements of `decimals` which are not columns of the input will be ignored. + *args + Additional keywords have no effect but might be accepted for + compatibility with numpy. + **kwargs + Additional keywords have no effect but might be accepted for + compatibility with numpy. Returns ------- - DataFrame + DataFrame : + A DataFrame with the affected columns rounded to the specified + number of decimal places. See Also -------- - numpy.around - Series.round + numpy.around : Round a numpy array to the given number of decimals. + Series.round : Round a Series to the given number of decimals. Examples -------- - >>> df = pd.DataFrame(np.random.random([3, 3]), - ... columns=['A', 'B', 'C'], index=['first', 'second', 'third']) + >>> df = pd.DataFrame([(.21, .32), (.01, .67), (.66, .03), (.21, .18)], + ... columns=['dogs', 'cats']) >>> df - A B C - first 0.028208 0.992815 0.173891 - second 0.038683 0.645646 0.577595 - third 0.877076 0.149370 0.491027 - >>> df.round(2) - A B C - first 0.03 0.99 0.17 - second 0.04 0.65 0.58 - third 0.88 0.15 0.49 - >>> df.round({'A': 1, 'C': 2}) - A B C - first 0.0 0.992815 0.17 - second 0.0 0.645646 0.58 - third 0.9 0.149370 0.49 - >>> decimals = pd.Series([1, 0, 2], index=['A', 'B', 'C']) + dogs cats + 0 0.21 0.32 + 1 0.01 0.67 + 2 0.66 0.03 + 3 0.21 0.18 + + By providing an integer each column is rounded to the same number + of decimal places + + >>> df.round(1) + dogs cats + 0 0.2 0.3 + 1 0.0 0.7 + 2 0.7 0.0 + 3 0.2 0.2 + + With a dict, the number of places for specific columns can be + specfified with the column names as key and the number of decimal + places as value + + >>> df.round({'dogs': 1, 'cats': 0}) + dogs cats + 0 0.2 0.0 + 1 0.0 1.0 + 2 0.7 0.0 + 3 0.2 0.0 + + Using a Series, the number of places for specific columns can be + specfified with the column names as index and the number of + decimal places as value + + >>> decimals = pd.Series([0, 1], index=['cats', 'dogs']) >>> df.round(decimals) - A B C - first 0.0 1 0.17 - second 0.0 1 0.58 - third 0.9 0 0.49 + dogs cats + 0 0.2 0.0 + 1 0.0 1.0 + 2 0.7 0.0 + 3 0.2 0.0 """ from pandas.core.reshape.concat import concat @@ -7078,10 +7052,10 @@ def cov(self, min_periods=None): See Also -------- - pandas.Series.cov : Compute covariance with another Series. - pandas.core.window.EWM.cov: Exponential weighted sample covariance. - pandas.core.window.Expanding.cov : Expanding sample covariance. - pandas.core.window.Rolling.cov : Rolling sample covariance. + Series.cov : Compute covariance with another Series. + core.window.EWM.cov: Exponential weighted sample covariance. + core.window.Expanding.cov : Expanding sample covariance. + core.window.Rolling.cov : Rolling sample covariance. Notes ----- @@ -7464,7 +7438,8 @@ def f(x): if filter_type is None or filter_type == 'numeric': data = self._get_numeric_data() elif filter_type == 'bool': - data = self + # GH 25101, # GH 24434 + data = self._get_bool_data() if axis == 0 else self else: # pragma: no cover msg = ("Generating numeric_only data with filter_type {f}" "not supported.".format(f=filter_type)) @@ -7733,10 +7708,10 @@ def quantile(self, q=0.5, axis=0, numeric_only=True, ------- quantiles : Series or DataFrame - - If ``q`` is an array, a DataFrame will be returned where the + If ``q`` is an array, a DataFrame will be returned where the index is ``q``, the columns are the columns of self, and the values are the quantiles. - - If ``q`` is a float, a Series will be returned where the + If ``q`` is a float, a Series will be returned where the index is the columns of self and the values are the quantiles. See Also diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 2b97661fe9ec3..ef629361c291a 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -61,6 +61,10 @@ by : str or list of str Name or list of names to sort by""") +# sentinel value to use as kwarg in place of None when None has special meaning +# and needs to be distinguished from a user explicitly passing None. +sentinel = object() + def _single_replace(self, to_replace, method, inplace, limit): """ @@ -290,11 +294,16 @@ def _construct_axes_dict_for_slice(self, axes=None, **kwargs): d.update(kwargs) return d - def _construct_axes_from_arguments(self, args, kwargs, require_all=False): + def _construct_axes_from_arguments( + self, args, kwargs, require_all=False, sentinel=None): """Construct and returns axes if supplied in args/kwargs. If require_all, raise if all axis arguments are not supplied return a tuple of (axes, kwargs). + + sentinel specifies the default parameter when an axis is not + supplied; useful to distinguish when a user explicitly passes None + in scenarios where None has special meaning. """ # construct the args @@ -322,7 +331,7 @@ def _construct_axes_from_arguments(self, args, kwargs, require_all=False): raise TypeError("not enough/duplicate arguments " "specified!") - axes = {a: kwargs.pop(a, None) for a in self._AXIS_ORDERS} + axes = {a: kwargs.pop(a, sentinel) for a in self._AXIS_ORDERS} return axes, kwargs @classmethod @@ -530,7 +539,7 @@ def set_axis(self, labels, axis=0, inplace=None): The axis to update. The value 0 identifies the rows, and 1 identifies the columns. - inplace : boolean, default None + inplace : bool, default None Whether to return a new %(klass)s instance. .. warning:: @@ -977,7 +986,7 @@ def rename(self, *args, **kwargs): See Also -------- - pandas.NDFrame.rename_axis + NDFrame.rename_axis Examples -------- @@ -1089,7 +1098,7 @@ def rename(self, *args, **kwargs): @rewrite_axis_style_signature('mapper', [('copy', True), ('inplace', False)]) - def rename_axis(self, mapper=None, **kwargs): + def rename_axis(self, mapper=sentinel, **kwargs): """ Set the name of the axis for the index or columns. @@ -1218,7 +1227,8 @@ class name cat 4 0 monkey 2 2 """ - axes, kwargs = self._construct_axes_from_arguments((), kwargs) + axes, kwargs = self._construct_axes_from_arguments( + (), kwargs, sentinel=sentinel) copy = kwargs.pop('copy', True) inplace = kwargs.pop('inplace', False) axis = kwargs.pop('axis', 0) @@ -1231,7 +1241,7 @@ class name inplace = validate_bool_kwarg(inplace, 'inplace') - if (mapper is not None): + if (mapper is not sentinel): # Use v0.23 behavior if a scalar or list non_mapper = is_scalar(mapper) or (is_list_like(mapper) and not is_dict_like(mapper)) @@ -1254,7 +1264,7 @@ class name for axis in lrange(self._AXIS_LEN): v = axes.get(self._AXIS_NAMES[axis]) - if v is None: + if v is sentinel: continue non_mapper = is_scalar(v) or (is_list_like(v) and not is_dict_like(v)) @@ -1554,14 +1564,14 @@ def _is_label_reference(self, key, axis=0): ------- is_label: bool """ - axis = self._get_axis_number(axis) - other_axes = [ax for ax in range(self._AXIS_LEN) if ax != axis] - if self.ndim > 2: raise NotImplementedError( "_is_label_reference is not implemented for {type}" .format(type=type(self))) + axis = self._get_axis_number(axis) + other_axes = (ax for ax in range(self._AXIS_LEN) if ax != axis) + return (key is not None and is_hashable(key) and any(key in self.axes[ax] for ax in other_axes)) @@ -1613,15 +1623,14 @@ def _check_label_or_level_ambiguity(self, key, axis=0): ------ ValueError: `key` is ambiguous """ - - axis = self._get_axis_number(axis) - other_axes = [ax for ax in range(self._AXIS_LEN) if ax != axis] - if self.ndim > 2: raise NotImplementedError( "_check_label_or_level_ambiguity is not implemented for {type}" .format(type=type(self))) + axis = self._get_axis_number(axis) + other_axes = (ax for ax in range(self._AXIS_LEN) if ax != axis) + if (key is not None and is_hashable(key) and key in self.axes[axis].names and @@ -1679,15 +1688,14 @@ def _get_label_or_level_values(self, key, axis=0): if `key` is ambiguous. This will become an ambiguity error in a future version """ - - axis = self._get_axis_number(axis) - other_axes = [ax for ax in range(self._AXIS_LEN) if ax != axis] - if self.ndim > 2: raise NotImplementedError( "_get_label_or_level_values is not implemented for {type}" .format(type=type(self))) + axis = self._get_axis_number(axis) + other_axes = [ax for ax in range(self._AXIS_LEN) if ax != axis] + if self._is_label_reference(key, axis=axis): self._check_label_or_level_ambiguity(key, axis=axis) values = self.xs(key, axis=other_axes[0])._values @@ -1743,14 +1751,13 @@ def _drop_labels_or_levels(self, keys, axis=0): ValueError if any `keys` match neither a label nor a level """ - - axis = self._get_axis_number(axis) - if self.ndim > 2: raise NotImplementedError( "_drop_labels_or_levels is not implemented for {type}" .format(type=type(self))) + axis = self._get_axis_number(axis) + # Validate keys keys = com.maybe_make_list(keys) invalid_keys = [k for k in keys if not @@ -1851,8 +1858,8 @@ def empty(self): See Also -------- - pandas.Series.dropna - pandas.DataFrame.dropna + Series.dropna + DataFrame.dropna Notes ----- @@ -3966,35 +3973,37 @@ def add_suffix(self, suffix): def sort_values(self, by=None, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last'): """ - Sort by the values along either axis + Sort by the values along either axis. Parameters ----------%(optional_by)s axis : %(axes_single_arg)s, default 0 - Axis to be sorted + Axis to be sorted. ascending : bool or list of bool, default True Sort ascending vs. descending. Specify list for multiple sort orders. If this is a list of bools, must match the length of the by. inplace : bool, default False - if True, perform operation in-place + If True, perform operation in-place. kind : {'quicksort', 'mergesort', 'heapsort'}, default 'quicksort' Choice of sorting algorithm. See also ndarray.np.sort for more information. `mergesort` is the only stable algorithm. For DataFrames, this option is only applied when sorting on a single column or label. na_position : {'first', 'last'}, default 'last' - `first` puts NaNs at the beginning, `last` puts NaNs at the end + Puts NaNs at the beginning if `first`; `last` puts NaNs at the + end. Returns ------- - sorted_obj : %(klass)s + sorted_obj : DataFrame or None + DataFrame with sorted values if inplace=False, None otherwise. Examples -------- >>> df = pd.DataFrame({ - ... 'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'], - ... 'col2' : [2, 1, 9, 8, 7, 4], + ... 'col1': ['A', 'A', 'B', np.nan, 'D', 'C'], + ... 'col2': [2, 1, 9, 8, 7, 4], ... 'col3': [0, 1, 9, 4, 2, 3], ... }) >>> df @@ -4056,32 +4065,35 @@ def sort_values(self, by=None, axis=0, ascending=True, inplace=False, def sort_index(self, axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True): """ - Sort object by labels (along an axis) + Sort object by labels (along an axis). Parameters ---------- - axis : %(axes)s to direct sorting + axis : {0 or 'index', 1 or 'columns'}, default 0 + The axis along which to sort. The value 0 identifies the rows, + and 1 identifies the columns. level : int or level name or list of ints or list of level names - if not None, sort on values in specified index level(s) - ascending : boolean, default True - Sort ascending vs. descending + If not None, sort on values in specified index level(s). + ascending : bool, default True + Sort ascending vs. descending. inplace : bool, default False - if True, perform operation in-place + If True, perform operation in-place. kind : {'quicksort', 'mergesort', 'heapsort'}, default 'quicksort' - Choice of sorting algorithm. See also ndarray.np.sort for more - information. `mergesort` is the only stable algorithm. For - DataFrames, this option is only applied when sorting on a single - column or label. + Choice of sorting algorithm. See also ndarray.np.sort for more + information. `mergesort` is the only stable algorithm. For + DataFrames, this option is only applied when sorting on a single + column or label. na_position : {'first', 'last'}, default 'last' - `first` puts NaNs at the beginning, `last` puts NaNs at the end. - Not implemented for MultiIndex. + Puts NaNs at the beginning if `first`; `last` puts NaNs at the end. + Not implemented for MultiIndex. sort_remaining : bool, default True - if true and sorting by level and index is multilevel, sort by other - levels too (in order) after sorting by specified level + If True and sorting by level and index is multilevel, sort by other + levels too (in order) after sorting by specified level. Returns ------- - sorted_obj : %(klass)s + sorted_obj : DataFrame or None + DataFrame with sorted index if inplace=False, None otherwise. """ inplace = validate_bool_kwarg(inplace, 'inplace') axis = self._get_axis_number(axis) @@ -4936,10 +4948,10 @@ def pipe(self, func, *args, **kwargs): Returns ------- DataFrame, Series or scalar - if DataFrame.agg is called with a single function, returns a Series - if DataFrame.agg is called with several functions, returns a DataFrame - if Series.agg is called with single function, returns a scalar - if Series.agg is called with several functions, returns a Series + If DataFrame.agg is called with a single function, returns a Series + If DataFrame.agg is called with several functions, returns a DataFrame + If Series.agg is called with single function, returns a scalar + If Series.agg is called with several functions, returns a Series %(see_also)s @@ -5257,8 +5269,8 @@ def values(self): See Also -------- DataFrame.to_numpy : Recommended alternative to this method. - pandas.DataFrame.index : Retrieve the index labels. - pandas.DataFrame.columns : Retrieving the column names. + DataFrame.index : Retrieve the index labels. + DataFrame.columns : Retrieving the column names. Notes ----- @@ -5329,7 +5341,7 @@ def get_values(self): Return an ndarray after converting sparse values to dense. This is the same as ``.values`` for non-sparse data. For sparse - data contained in a `pandas.SparseArray`, the data are first + data contained in a `SparseArray`, the data are first converted to a dense representation. Returns @@ -5340,7 +5352,7 @@ def get_values(self): See Also -------- values : Numpy representation of DataFrame. - pandas.SparseArray : Container for sparse data. + SparseArray : Container for sparse data. Examples -------- @@ -5461,7 +5473,7 @@ def dtypes(self): See Also -------- - pandas.DataFrame.ftypes : Dtype and sparsity information. + DataFrame.ftypes : Dtype and sparsity information. Examples -------- @@ -5497,8 +5509,8 @@ def ftypes(self): See Also -------- - pandas.DataFrame.dtypes: Series with just dtype information. - pandas.SparseDataFrame : Container for sparse tabular data. + DataFrame.dtypes: Series with just dtype information. + SparseDataFrame : Container for sparse tabular data. Notes ----- @@ -6596,7 +6608,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, 'barycentric', 'polynomial': Passed to `scipy.interpolate.interp1d`. Both 'polynomial' and 'spline' require that you also specify an `order` (int), - e.g. ``df.interpolate(method='polynomial', order=4)``. + e.g. ``df.interpolate(method='polynomial', order=5)``. These use the numerical values of the index. * 'krogh', 'piecewise_polynomial', 'spline', 'pchip', 'akima': Wrappers around the SciPy interpolation methods of similar @@ -6863,10 +6875,10 @@ def asof(self, where, subset=None): ------- scalar, Series, or DataFrame - * scalar : when `self` is a Series and `where` is a scalar - * Series: when `self` is a Series and `where` is an array-like, + Scalar : when `self` is a Series and `where` is a scalar + Series: when `self` is a Series and `where` is an array-like, or when `self` is a DataFrame and `where` is a scalar - * DataFrame : when `self` is a DataFrame and `where` is an + DataFrame : when `self` is a DataFrame and `where` is an array-like See Also @@ -8564,7 +8576,7 @@ def _where(self, cond, other=np.nan, inplace=False, axis=None, level=None, cond = self._constructor(cond, **self._construct_axes_dict()) # make sure we are boolean - fill_value = True if inplace else False + fill_value = bool(inplace) cond = cond.fillna(fill_value) msg = "Boolean array expected for the condition, not {dtype}" @@ -9979,8 +9991,7 @@ def _add_numeric_operations(cls): cls, 'all', name, name2, axis_descr, _all_desc, nanops.nanall, _all_see_also, _all_examples, empty_value=True) - @Substitution(outname='mad', - desc="Return the mean absolute deviation of the values " + @Substitution(desc="Return the mean absolute deviation of the values " "for the requested axis.", name1=name, name2=name2, axis_descr=axis_descr, min_count='', see_also='', examples='') @@ -10021,8 +10032,7 @@ def mad(self, axis=None, skipna=None, level=None): "ddof argument", nanops.nanstd) - @Substitution(outname='compounded', - desc="Return the compound percentage of the values for " + @Substitution(desc="Return the compound percentage of the values for " "the requested axis.", name1=name, name2=name2, axis_descr=axis_descr, min_count='', see_also='', examples='') @@ -10112,7 +10122,7 @@ def nanptp(values, axis=0, skipna=True): cls.ptp = _make_stat_function( cls, 'ptp', name, name2, axis_descr, - """Returns the difference between the maximum value and the + """Return the difference between the maximum value and the minimum value in the object. This is the equivalent of the ``numpy.ndarray`` method ``ptp``.\n\n.. deprecated:: 0.24.0 Use numpy.ptp instead""", @@ -10230,8 +10240,8 @@ def last_valid_index(self): def _doc_parms(cls): """Return a tuple of the doc parms.""" - axis_descr = "{%s}" % ', '.join(["{0} ({1})".format(a, i) - for i, a in enumerate(cls._AXIS_ORDERS)]) + axis_descr = "{%s}" % ', '.join("{0} ({1})".format(a, i) + for i, a in enumerate(cls._AXIS_ORDERS)) name = (cls._constructor_sliced.__name__ if cls._AXIS_LEN > 1 else 'scalar') name2 = cls.__name__ @@ -10259,7 +10269,7 @@ def _doc_parms(cls): Returns ------- -%(outname)s : %(name1)s or %(name2)s (if level specified) +%(name1)s or %(name2)s (if level specified) %(see_also)s %(examples)s\ """ @@ -10285,7 +10295,7 @@ def _doc_parms(cls): Returns ------- -%(outname)s : %(name1)s or %(name2)s (if level specified)\n""" +%(name1)s or %(name2)s (if level specified)\n""" _bool_doc = """ %(desc)s @@ -10404,7 +10414,7 @@ def _doc_parms(cls): Returns ------- -%(outname)s : %(name1)s or %(name2)s\n +%(name1)s or %(name2)s\n See Also -------- core.window.Expanding.%(accum_func_name)s : Similar functionality @@ -10897,7 +10907,7 @@ def _doc_parms(cls): def _make_min_count_stat_function(cls, name, name1, name2, axis_descr, desc, f, see_also='', examples=''): - @Substitution(outname=name, desc=desc, name1=name1, name2=name2, + @Substitution(desc=desc, name1=name1, name2=name2, axis_descr=axis_descr, min_count=_min_count_stub, see_also=see_also, examples=examples) @Appender(_num_doc) @@ -10925,7 +10935,7 @@ def stat_func(self, axis=None, skipna=None, level=None, numeric_only=None, def _make_stat_function(cls, name, name1, name2, axis_descr, desc, f, see_also='', examples=''): - @Substitution(outname=name, desc=desc, name1=name1, name2=name2, + @Substitution(desc=desc, name1=name1, name2=name2, axis_descr=axis_descr, min_count='', see_also=see_also, examples=examples) @Appender(_num_doc) @@ -10949,7 +10959,7 @@ def stat_func(self, axis=None, skipna=None, level=None, numeric_only=None, def _make_stat_function_ddof(cls, name, name1, name2, axis_descr, desc, f): - @Substitution(outname=name, desc=desc, name1=name1, name2=name2, + @Substitution(desc=desc, name1=name1, name2=name2, axis_descr=axis_descr) @Appender(_num_ddof_doc) def stat_func(self, axis=None, skipna=None, level=None, ddof=1, @@ -10970,7 +10980,7 @@ def stat_func(self, axis=None, skipna=None, level=None, ddof=1, def _make_cum_function(cls, name, name1, name2, axis_descr, desc, accum_func, accum_func_name, mask_a, mask_b, examples): - @Substitution(outname=name, desc=desc, name1=name1, name2=name2, + @Substitution(desc=desc, name1=name1, name2=name2, axis_descr=axis_descr, accum_func_name=accum_func_name, examples=examples) @Appender(_cnum_doc) @@ -11005,7 +11015,7 @@ def cum_func(self, axis=None, skipna=True, *args, **kwargs): def _make_logical_function(cls, name, name1, name2, axis_descr, desc, f, see_also, examples, empty_value): - @Substitution(outname=name, desc=desc, name1=name1, name2=name2, + @Substitution(desc=desc, name1=name1, name2=name2, axis_descr=axis_descr, see_also=see_also, examples=examples, empty_value=empty_value) @Appender(_bool_doc) diff --git a/pandas/core/groupby/__init__.py b/pandas/core/groupby/__init__.py index 9c15a5ebfe0f2..ac35f3825e5e8 100644 --- a/pandas/core/groupby/__init__.py +++ b/pandas/core/groupby/__init__.py @@ -1,4 +1,4 @@ from pandas.core.groupby.groupby import GroupBy # noqa: F401 from pandas.core.groupby.generic import ( # noqa: F401 - SeriesGroupBy, DataFrameGroupBy, PanelGroupBy) + SeriesGroupBy, DataFrameGroupBy) from pandas.core.groupby.grouper import Grouper # noqa: F401 diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index c5142a4ee98cc..27e13e86a6e9e 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -1,5 +1,5 @@ """ -Define the SeriesGroupBy, DataFrameGroupBy, and PanelGroupBy +Define the SeriesGroupBy and DataFrameGroupBy classes that hold the groupby interfaces (and some implementations). These are user facing as the result of the ``df.groupby(...)`` operations, @@ -39,7 +39,6 @@ from pandas.core.index import CategoricalIndex, Index, MultiIndex import pandas.core.indexes.base as ibase from pandas.core.internals import BlockManager, make_block -from pandas.core.panel import Panel from pandas.core.series import Series from pandas.plotting._core import boxplot_frame_groupby @@ -1021,7 +1020,9 @@ def true_and_notna(x, *args, **kwargs): return filtered def nunique(self, dropna=True): - """ Returns number of unique elements in the group """ + """ + Return number of unique elements in the group. + """ ids, _, _ = self.grouper.group_info val = self.obj.get_values() @@ -1461,8 +1462,8 @@ def _reindex_output(self, result): # reindex `result`, and then reset the in-axis grouper columns. # Select in-axis groupers - in_axis_grps = [(i, ping.name) for (i, ping) - in enumerate(groupings) if ping.in_axis] + in_axis_grps = ((i, ping.name) for (i, ping) + in enumerate(groupings) if ping.in_axis) g_nums, g_names = zip(*in_axis_grps) result = result.drop(labels=list(g_names), axis=1) @@ -1584,90 +1585,3 @@ def groupby_series(obj, col=None): return results boxplot = boxplot_frame_groupby - - -class PanelGroupBy(NDFrameGroupBy): - - def aggregate(self, arg, *args, **kwargs): - return super(PanelGroupBy, self).aggregate(arg, *args, **kwargs) - - agg = aggregate - - def _iterate_slices(self): - if self.axis == 0: - # kludge - if self._selection is None: - slice_axis = self._selected_obj.items - else: - slice_axis = self._selection_list - slicer = lambda x: self._selected_obj[x] - else: - raise NotImplementedError("axis other than 0 is not supported") - - for val in slice_axis: - if val in self.exclusions: - continue - - yield val, slicer(val) - - def aggregate(self, arg, *args, **kwargs): - """ - Aggregate using input function or dict of {column -> function} - - Parameters - ---------- - arg : function or dict - Function to use for aggregating groups. If a function, must either - work when passed a Panel or when passed to Panel.apply. If - pass a dict, the keys must be DataFrame column names - - Returns - ------- - aggregated : Panel - """ - if isinstance(arg, compat.string_types): - return getattr(self, arg)(*args, **kwargs) - - return self._aggregate_generic(arg, *args, **kwargs) - - def _wrap_generic_output(self, result, obj): - if self.axis == 0: - new_axes = list(obj.axes) - new_axes[0] = self.grouper.result_index - elif self.axis == 1: - x, y, z = obj.axes - new_axes = [self.grouper.result_index, z, x] - else: - x, y, z = obj.axes - new_axes = [self.grouper.result_index, y, x] - - result = Panel._from_axes(result, new_axes) - - if self.axis == 1: - result = result.swapaxes(0, 1).swapaxes(0, 2) - elif self.axis == 2: - result = result.swapaxes(0, 2) - - return result - - def _aggregate_item_by_item(self, func, *args, **kwargs): - obj = self._obj_with_exclusions - result = {} - - if self.axis > 0: - for item in obj: - try: - itemg = DataFrameGroupBy(obj[item], - axis=self.axis - 1, - grouper=self.grouper) - result[item] = itemg.aggregate(func, *args, **kwargs) - except (ValueError, TypeError): - raise - new_axes = list(obj.axes) - new_axes[self.axis] = self.grouper.result_index - return Panel._from_axes(result, new_axes) - else: - raise ValueError("axis value must be greater than 0") - - def _wrap_aggregated_output(self, output, names=None): - raise AbstractMethodError(self) diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index 8766fdbc29755..c7f1aa697c2e8 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -18,7 +18,7 @@ class providing the base-class of operations. from pandas._libs import Timestamp, groupby as libgroupby import pandas.compat as compat -from pandas.compat import callable, range, set_function_name, zip +from pandas.compat import range, set_function_name, zip from pandas.compat.numpy import function as nv from pandas.errors import AbstractMethodError from pandas.util._decorators import Appender, Substitution, cache_readonly @@ -44,9 +44,9 @@ class providing the base-class of operations. _common_see_also = """ See Also -------- - pandas.Series.%(name)s - pandas.DataFrame.%(name)s - pandas.Panel.%(name)s + Series.%(name)s + DataFrame.%(name)s + Panel.%(name)s """ _apply_docs = dict( @@ -206,8 +206,8 @@ class providing the base-class of operations. See Also -------- -pandas.Series.pipe : Apply a function with arguments to a series. -pandas.DataFrame.pipe: Apply a function with arguments to a dataframe. +Series.pipe : Apply a function with arguments to a series. +DataFrame.pipe: Apply a function with arguments to a dataframe. apply : Apply function to each group instead of to the full %(klass)s object. @@ -443,12 +443,12 @@ def get_converter(s): raise ValueError(msg) converters = [get_converter(s) for s in index_sample] - names = [tuple(f(n) for f, n in zip(converters, name)) - for name in names] + names = (tuple(f(n) for f, n in zip(converters, name)) + for name in names) else: converter = get_converter(index_sample) - names = [converter(name) for name in names] + names = (converter(name) for name in names) return [self.indices.get(name, []) for name in names] @@ -625,7 +625,7 @@ def curried(x): def get_group(self, name, obj=None): """ - Constructs NDFrame from group with provided name. + Construct NDFrame from group with provided name. Parameters ---------- @@ -1047,7 +1047,7 @@ def result_to_bool(result): @Appender(_common_see_also) def any(self, skipna=True): """ - Returns True if any value in the group is truthful, else False. + Return True if any value in the group is truthful, else False. Parameters ---------- @@ -1060,7 +1060,7 @@ def any(self, skipna=True): @Appender(_common_see_also) def all(self, skipna=True): """ - Returns True if all values in the group are truthful, else False. + Return True if all values in the group are truthful, else False. Parameters ---------- @@ -1351,7 +1351,7 @@ def resample(self, rule, *args, **kwargs): See Also -------- - pandas.Grouper : Specify a frequency to resample with when + Grouper : Specify a frequency to resample with when grouping by a key. DatetimeIndex.resample : Frequency conversion and resampling of time series. @@ -1813,7 +1813,7 @@ def cumcount(self, ascending=True): def rank(self, method='average', ascending=True, na_option='keep', pct=False, axis=0): """ - Provides the rank of values within each group. + Provide the rank of values within each group. Parameters ---------- @@ -2039,7 +2039,7 @@ def pct_change(self, periods=1, fill_method='pad', limit=None, freq=None, @Substitution(name='groupby', see_also=_common_see_also) def head(self, n=5): """ - Returns first n rows of each group. + Return first n rows of each group. Essentially equivalent to ``.apply(lambda x: x.head(n))``, except ignores as_index flag. @@ -2067,7 +2067,7 @@ def head(self, n=5): @Substitution(name='groupby', see_also=_common_see_also) def tail(self, n=5): """ - Returns last n rows of each group. + Return last n rows of each group. Essentially equivalent to ``.apply(lambda x: x.tail(n))``, except ignores as_index flag. diff --git a/pandas/core/groupby/grouper.py b/pandas/core/groupby/grouper.py index 633a1643f6cdd..edba9439a675e 100644 --- a/pandas/core/groupby/grouper.py +++ b/pandas/core/groupby/grouper.py @@ -8,7 +8,7 @@ import numpy as np import pandas.compat as compat -from pandas.compat import callable, zip +from pandas.compat import zip from pandas.util._decorators import cache_readonly from pandas.core.dtypes.common import ( @@ -195,9 +195,9 @@ def groups(self): return self.grouper.groups def __repr__(self): - attrs_list = ["{}={!r}".format(attr_name, getattr(self, attr_name)) + attrs_list = ("{}={!r}".format(attr_name, getattr(self, attr_name)) for attr_name in self._attributes - if getattr(self, attr_name) is not None] + if getattr(self, attr_name) is not None) attrs = ", ".join(attrs_list) cls_name = self.__class__.__name__ return "{}({})".format(cls_name, attrs) @@ -299,6 +299,7 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None, self._labels = self.grouper.codes if observed: codes = algorithms.unique1d(self.grouper.codes) + codes = codes[codes != -1] else: codes = np.arange(len(categories)) diff --git a/pandas/core/groupby/ops.py b/pandas/core/groupby/ops.py index 87f48d5a40554..78c9aa9187135 100644 --- a/pandas/core/groupby/ops.py +++ b/pandas/core/groupby/ops.py @@ -380,7 +380,7 @@ def get_func(fname): # otherwise find dtype-specific version, falling back to object for dt in [dtype_str, 'object']: f = getattr(libgroupby, "{fname}_{dtype_str}".format( - fname=fname, dtype_str=dtype_str), None) + fname=fname, dtype_str=dt), None) if f is not None: return f diff --git a/pandas/core/indexes/accessors.py b/pandas/core/indexes/accessors.py index c43469d3c3a81..602e11a08b4ed 100644 --- a/pandas/core/indexes/accessors.py +++ b/pandas/core/indexes/accessors.py @@ -140,7 +140,7 @@ def to_pydatetime(self): Returns ------- numpy.ndarray - object dtype array containing native Python datetime objects. + Object dtype array containing native Python datetime objects. See Also -------- @@ -208,7 +208,7 @@ def to_pytimedelta(self): Returns ------- a : numpy.ndarray - 1D array containing data with `datetime.timedelta` type. + Array of 1D containing data with `datetime.timedelta` type. See Also -------- diff --git a/pandas/core/indexes/api.py b/pandas/core/indexes/api.py index 684a19c56c92f..6299fc482d0df 100644 --- a/pandas/core/indexes/api.py +++ b/pandas/core/indexes/api.py @@ -112,7 +112,7 @@ def _get_combined_index(indexes, intersect=False, sort=False): elif intersect: index = indexes[0] for other in indexes[1:]: - index = index.intersection(other, sort=sort) + index = index.intersection(other) else: index = _union_indexes(indexes, sort=sort) index = ensure_index(index) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 767da81c5c43a..cf813f4c3030b 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -1832,9 +1832,9 @@ def isna(self): See Also -------- - pandas.Index.notna : Boolean inverse of isna. - pandas.Index.dropna : Omit entries with missing values. - pandas.isna : Top-level isna. + Index.notna : Boolean inverse of isna. + Index.dropna : Omit entries with missing values. + isna : Top-level isna. Series.isna : Detect missing values in Series object. Examples @@ -1892,7 +1892,7 @@ def notna(self): -------- Index.notnull : Alias of notna. Index.isna: Inverse of notna. - pandas.notna : Top-level notna. + notna : Top-level notna. Examples -------- @@ -2074,9 +2074,9 @@ def duplicated(self, keep='first'): See Also -------- - pandas.Series.duplicated : Equivalent method on pandas.Series. - pandas.DataFrame.duplicated : Equivalent method on pandas.DataFrame. - pandas.Index.drop_duplicates : Remove duplicate values from Index. + Series.duplicated : Equivalent method on pandas.Series. + DataFrame.duplicated : Equivalent method on pandas.DataFrame. + Index.drop_duplicates : Remove duplicate values from Index. Examples -------- @@ -2245,18 +2245,37 @@ def _get_reconciled_name_object(self, other): return self._shallow_copy(name=name) return self - def union(self, other, sort=True): + def _validate_sort_keyword(self, sort): + if sort not in [None, False]: + raise ValueError("The 'sort' keyword only takes the values of " + "None or False; {0} was passed.".format(sort)) + + def union(self, other, sort=None): """ Form the union of two Index objects. Parameters ---------- other : Index or array-like - sort : bool, default True - Sort the resulting index if possible + sort : bool or None, default None + Whether to sort the resulting Index. + + * None : Sort the result, except when + + 1. `self` and `other` are equal. + 2. `self` or `other` has length 0. + 3. Some values in `self` or `other` cannot be compared. + A RuntimeWarning is issued in this case. + + * False : do not sort the result. .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default value from ``True`` to ``None`` + (without change in behaviour). + Returns ------- union : Index @@ -2269,6 +2288,7 @@ def union(self, other, sort=True): >>> idx1.union(idx2) Int64Index([1, 2, 3, 4, 5, 6], dtype='int64') """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) other = ensure_index(other) @@ -2319,7 +2339,7 @@ def union(self, other, sort=True): else: result = lvals - if sort: + if sort is None: try: result = sorting.safe_sort(result) except TypeError as e: @@ -2333,7 +2353,7 @@ def union(self, other, sort=True): def _wrap_setop_result(self, other, result): return self._constructor(result, name=get_op_result_name(self, other)) - def intersection(self, other, sort=True): + def intersection(self, other, sort=False): """ Form the intersection of two Index objects. @@ -2342,11 +2362,20 @@ def intersection(self, other, sort=True): Parameters ---------- other : Index or array-like - sort : bool, default True - Sort the resulting index if possible + sort : False or None, default False + Whether to sort the resulting index. + + * False : do not sort the result. + * None : sort the result, except when `self` and `other` are equal + or when the values cannot be compared. .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default from ``True`` to ``False``, to match + the behaviour of 0.23.4 and earlier. + Returns ------- intersection : Index @@ -2359,6 +2388,7 @@ def intersection(self, other, sort=True): >>> idx1.intersection(idx2) Int64Index([3, 4], dtype='int64') """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) other = ensure_index(other) @@ -2398,7 +2428,7 @@ def intersection(self, other, sort=True): taken = other.take(indexer) - if sort: + if sort is None: taken = sorting.safe_sort(taken.values) if self.name != other.name: name = None @@ -2411,7 +2441,7 @@ def intersection(self, other, sort=True): return taken - def difference(self, other, sort=True): + def difference(self, other, sort=None): """ Return a new Index with elements from the index that are not in `other`. @@ -2421,11 +2451,22 @@ def difference(self, other, sort=True): Parameters ---------- other : Index or array-like - sort : bool, default True - Sort the resulting index if possible + sort : False or None, default None + Whether to sort the resulting index. By default, the + values are attempted to be sorted, but any TypeError from + incomparable elements is caught by pandas. + + * None : Attempt to sort the result, but catch any TypeErrors + from comparing incomparable elements. + * False : Do not sort the result. .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default value from ``True`` to ``None`` + (without change in behaviour). + Returns ------- difference : Index @@ -2440,6 +2481,7 @@ def difference(self, other, sort=True): >>> idx1.difference(idx2, sort=False) Int64Index([2, 1], dtype='int64') """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) if self.equals(other): @@ -2456,7 +2498,7 @@ def difference(self, other, sort=True): label_diff = np.setdiff1d(np.arange(this.size), indexer, assume_unique=True) the_diff = this.values.take(label_diff) - if sort: + if sort is None: try: the_diff = sorting.safe_sort(the_diff) except TypeError: @@ -2464,7 +2506,7 @@ def difference(self, other, sort=True): return this._shallow_copy(the_diff, name=result_name, freq=None) - def symmetric_difference(self, other, result_name=None, sort=True): + def symmetric_difference(self, other, result_name=None, sort=None): """ Compute the symmetric difference of two Index objects. @@ -2472,11 +2514,22 @@ def symmetric_difference(self, other, result_name=None, sort=True): ---------- other : Index or array-like result_name : str - sort : bool, default True - Sort the resulting index if possible + sort : False or None, default None + Whether to sort the resulting index. By default, the + values are attempted to be sorted, but any TypeError from + incomparable elements is caught by pandas. + + * None : Attempt to sort the result, but catch any TypeErrors + from comparing incomparable elements. + * False : Do not sort the result. .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default value from ``True`` to ``None`` + (without change in behaviour). + Returns ------- symmetric_difference : Index @@ -2500,6 +2553,7 @@ def symmetric_difference(self, other, result_name=None, sort=True): >>> idx1 ^ idx2 Int64Index([1, 5], dtype='int64') """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) other, result_name_update = self._convert_can_do_setop(other) if result_name is None: @@ -2520,7 +2574,7 @@ def symmetric_difference(self, other, result_name=None, sort=True): right_diff = other.values.take(right_indexer) the_diff = _concat._concat_compat([left_diff, right_diff]) - if sort: + if sort is None: try: the_diff = sorting.safe_sort(the_diff) except TypeError: @@ -3995,7 +4049,7 @@ def putmask(self, mask, value): def equals(self, other): """ - Determines if two Index objects contain the same elements. + Determine if two Index objects contain the same elements. """ if self.is_(other): return True @@ -4090,7 +4144,7 @@ def asof(self, label): def asof_locs(self, where, mask): """ - Finds the locations (indices) of the labels from the index for + Find the locations (indices) of the labels from the index for every entry in the `where` argument. As in the `asof` function, if the label (a particular entry in @@ -4150,8 +4204,8 @@ def sort_values(self, return_indexer=False, ascending=True): See Also -------- - pandas.Series.sort_values : Sort values of a Series. - pandas.DataFrame.sort_values : Sort values in a DataFrame. + Series.sort_values : Sort values of a Series. + DataFrame.sort_values : Sort values in a DataFrame. Examples -------- @@ -4205,7 +4259,7 @@ def shift(self, periods=1, freq=None): Returns ------- pandas.Index - shifted index + Shifted index See Also -------- @@ -5123,9 +5177,9 @@ def _add_logical_methods(cls): See Also -------- - pandas.Index.any : Return whether any element in an Index is True. - pandas.Series.any : Return whether any element in a Series is True. - pandas.Series.all : Return whether all elements in a Series are True. + Index.any : Return whether any element in an Index is True. + Series.any : Return whether any element in a Series is True. + Series.all : Return whether all elements in a Series are True. Notes ----- @@ -5163,8 +5217,8 @@ def _add_logical_methods(cls): See Also -------- - pandas.Index.all : Return whether all elements are True. - pandas.Series.all : Return whether all elements are True. + Index.all : Return whether all elements are True. + Series.all : Return whether all elements are True. Notes ----- diff --git a/pandas/core/indexes/category.py b/pandas/core/indexes/category.py index e43b64827d02a..c6d31339f950d 100644 --- a/pandas/core/indexes/category.py +++ b/pandas/core/indexes/category.py @@ -232,7 +232,7 @@ def _is_dtype_compat(self, other): def equals(self, other): """ - Determines if two CategorialIndex objects contain the same elements. + Determine if two CategorialIndex objects contain the same elements. """ if self.is_(other): return True @@ -780,8 +780,8 @@ def _concat_same_dtype(self, to_concat, name): Concatenate to_concat which has the same class ValueError if other is not in the categories """ - to_concat = [self._is_dtype_compat(c) for c in to_concat] - codes = np.concatenate([c.codes for c in to_concat]) + codes = np.concatenate([self._is_dtype_compat(c).codes + for c in to_concat]) result = self._create_from_codes(codes, name=name) # if name is None, _create_from_codes sets self.name result.name = name diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index cc373c06efcc9..df91c71cfe238 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -594,7 +594,7 @@ def _wrap_setop_result(self, other, result): name = get_op_result_name(self, other) return self._shallow_copy(result, name=name, freq=None, tz=self.tz) - def intersection(self, other, sort=True): + def intersection(self, other, sort=False): """ Specialized intersection for DatetimeIndex objects. May be much faster than Index.intersection @@ -602,11 +602,21 @@ def intersection(self, other, sort=True): Parameters ---------- other : DatetimeIndex or array-like + sort : False or None, default False + Sort the resulting index if possible. + + .. versionadded:: 0.24.0 + + .. versionchanged:: 0.24.1 + + Changed the default to ``False`` to match the behaviour + from before 0.24.0. Returns ------- y : Index or DatetimeIndex """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) if self.equals(other): @@ -1274,7 +1284,7 @@ def delete(self, loc): def indexer_at_time(self, time, asof=False): """ - Returns index locations of index values at particular time of day + Return index locations of index values at particular time of day (e.g. 9:30AM). Parameters @@ -1403,10 +1413,10 @@ def date_range(start=None, end=None, periods=None, freq=None, tz=None, See Also -------- - pandas.DatetimeIndex : An immutable container for datetimes. - pandas.timedelta_range : Return a fixed frequency TimedeltaIndex. - pandas.period_range : Return a fixed frequency PeriodIndex. - pandas.interval_range : Return a fixed frequency IntervalIndex. + DatetimeIndex : An immutable container for datetimes. + timedelta_range : Return a fixed frequency TimedeltaIndex. + period_range : Return a fixed frequency PeriodIndex. + interval_range : Return a fixed frequency IntervalIndex. Notes ----- diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index 2a6044fb0a08b..2c63fe33c57fe 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -38,6 +38,7 @@ _index_doc_kwargs.update( dict(klass='IntervalIndex', + qualname="IntervalIndex", target_klass='IntervalIndex or list of Intervals', name=textwrap.dedent("""\ name : object, optional @@ -282,10 +283,10 @@ def contains(self, key): examples=""" Examples -------- - >>> idx = pd.IntervalIndex.from_arrays([0, np.nan, 2], [1, np.nan, 3]) - >>> idx.to_tuples() + >>> idx = pd.IntervalIndex.from_arrays([0, np.nan, 2], [1, np.nan, 3]) + >>> idx.to_tuples() Index([(0.0, 1.0), (nan, nan), (2.0, 3.0)], dtype='object') - >>> idx.to_tuples(na_tuple=False) + >>> idx.to_tuples(na_tuple=False) Index([(0.0, 1.0), nan, (2.0, 3.0)], dtype='object')""", )) def to_tuples(self, na_tuple=True): @@ -1092,8 +1093,8 @@ def equals(self, other): def overlaps(self, other): return self._data.overlaps(other) - def _setop(op_name): - def func(self, other, sort=True): + def _setop(op_name, sort=None): + def func(self, other, sort=sort): other = self._as_like_interval_index(other) # GH 19016: ensure set op will not return a prohibited dtype @@ -1127,7 +1128,7 @@ def is_all_dates(self): return False union = _setop('union') - intersection = _setop('intersection') + intersection = _setop('intersection', sort=False) difference = _setop('difference') symmetric_difference = _setop('symmetric_difference') @@ -1201,15 +1202,15 @@ def interval_range(start=None, end=None, periods=None, freq=None, Numeric ``start`` and ``end`` is supported. >>> pd.interval_range(start=0, end=5) - IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5]] + IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5]], closed='right', dtype='interval[int64]') Additionally, datetime-like input is also supported. >>> pd.interval_range(start=pd.Timestamp('2017-01-01'), - end=pd.Timestamp('2017-01-04')) + ... end=pd.Timestamp('2017-01-04')) IntervalIndex([(2017-01-01, 2017-01-02], (2017-01-02, 2017-01-03], - (2017-01-03, 2017-01-04]] + (2017-01-03, 2017-01-04]], closed='right', dtype='interval[datetime64[ns]]') The ``freq`` parameter specifies the frequency between the left and right. @@ -1217,23 +1218,23 @@ def interval_range(start=None, end=None, periods=None, freq=None, numeric ``start`` and ``end``, the frequency must also be numeric. >>> pd.interval_range(start=0, periods=4, freq=1.5) - IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]] + IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]], closed='right', dtype='interval[float64]') Similarly, for datetime-like ``start`` and ``end``, the frequency must be convertible to a DateOffset. >>> pd.interval_range(start=pd.Timestamp('2017-01-01'), - periods=3, freq='MS') + ... periods=3, freq='MS') IntervalIndex([(2017-01-01, 2017-02-01], (2017-02-01, 2017-03-01], - (2017-03-01, 2017-04-01]] + (2017-03-01, 2017-04-01]], closed='right', dtype='interval[datetime64[ns]]') Specify ``start``, ``end``, and ``periods``; the frequency is generated automatically (linearly spaced). >>> pd.interval_range(start=0, end=6, periods=4) - IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]] + IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]], closed='right', dtype='interval[float64]') @@ -1241,7 +1242,7 @@ def interval_range(start=None, end=None, periods=None, freq=None, intervals within the ``IntervalIndex`` are closed. >>> pd.interval_range(end=5, periods=4, closed='both') - IntervalIndex([[1, 2], [2, 3], [3, 4], [4, 5]] + IntervalIndex([[1, 2], [2, 3], [3, 4], [4, 5]], closed='both', dtype='interval[int64]') """ start = com.maybe_box_datetimelike(start) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index e4d01a40bd181..e2237afbcac0f 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1391,7 +1391,7 @@ def get_level_values(self, level): Returns ------- values : Index - ``values`` is a level of this MultiIndex converted to + Values is a level of this MultiIndex converted to a single :class:`Index` (or subclass thereof). Examples @@ -2879,30 +2879,47 @@ def equal_levels(self, other): return False return True - def union(self, other, sort=True): + def union(self, other, sort=None): """ Form the union of two MultiIndex objects Parameters ---------- other : MultiIndex or array / Index of tuples - sort : bool, default True - Sort the resulting MultiIndex if possible + sort : False or None, default None + Whether to sort the resulting Index. + + * None : Sort the result, except when + + 1. `self` and `other` are equal. + 2. `self` has length 0. + 3. Some values in `self` or `other` cannot be compared. + A RuntimeWarning is issued in this case. + + * False : do not sort the result. .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default value from ``True`` to ``None`` + (without change in behaviour). + Returns ------- Index >>> index.union(index2) """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) other, result_names = self._convert_can_do_setop(other) if len(other) == 0 or self.equals(other): return self + # TODO: Index.union returns other when `len(self)` is 0. + uniq_tuples = lib.fast_unique_multiple([self._ndarray_values, other._ndarray_values], sort=sort) @@ -2910,22 +2927,28 @@ def union(self, other, sort=True): return MultiIndex.from_arrays(lzip(*uniq_tuples), sortorder=0, names=result_names) - def intersection(self, other, sort=True): + def intersection(self, other, sort=False): """ Form the intersection of two MultiIndex objects. Parameters ---------- other : MultiIndex or array / Index of tuples - sort : bool, default True + sort : False or None, default False Sort the resulting MultiIndex if possible .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default from ``True`` to ``False``, to match + behaviour from before 0.24.0 + Returns ------- Index """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) other, result_names = self._convert_can_do_setop(other) @@ -2936,7 +2959,7 @@ def intersection(self, other, sort=True): other_tuples = other._ndarray_values uniq_tuples = set(self_tuples) & set(other_tuples) - if sort: + if sort is None: uniq_tuples = sorted(uniq_tuples) if len(uniq_tuples) == 0: @@ -2947,22 +2970,28 @@ def intersection(self, other, sort=True): return MultiIndex.from_arrays(lzip(*uniq_tuples), sortorder=0, names=result_names) - def difference(self, other, sort=True): + def difference(self, other, sort=None): """ Compute set difference of two MultiIndex objects Parameters ---------- other : MultiIndex - sort : bool, default True + sort : False or None, default None Sort the resulting MultiIndex if possible .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default value from ``True`` to ``None`` + (without change in behaviour). + Returns ------- diff : MultiIndex """ + self._validate_sort_keyword(sort) self._assert_can_do_setop(other) other, result_names = self._convert_can_do_setop(other) @@ -2982,7 +3011,7 @@ def difference(self, other, sort=True): label_diff = np.setdiff1d(np.arange(this.size), indexer, assume_unique=True) difference = this.values.take(label_diff) - if sort: + if sort is None: difference = sorted(difference) if len(difference) == 0: diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index ebf5b279563cf..5aafe9734b6a0 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -343,22 +343,28 @@ def equals(self, other): return super(RangeIndex, self).equals(other) - def intersection(self, other, sort=True): + def intersection(self, other, sort=False): """ Form the intersection of two Index objects. Parameters ---------- other : Index or array-like - sort : bool, default True + sort : False or None, default False Sort the resulting index if possible .. versionadded:: 0.24.0 + .. versionchanged:: 0.24.1 + + Changed the default to ``False`` to match the behaviour + from before 0.24.0. + Returns ------- intersection : Index """ + self._validate_sort_keyword(sort) if self.equals(other): return self._get_reconciled_name_object(other) @@ -401,7 +407,7 @@ def intersection(self, other, sort=True): if (self._step < 0 and other._step < 0) is not (new_index._step < 0): new_index = new_index[::-1] - if sort: + if sort is None: new_index = new_index.sort_values() return new_index diff --git a/pandas/core/indexes/timedeltas.py b/pandas/core/indexes/timedeltas.py index cbe5ae198838f..830925535dab1 100644 --- a/pandas/core/indexes/timedeltas.py +++ b/pandas/core/indexes/timedeltas.py @@ -207,6 +207,11 @@ def __new__(cls, data=None, unit=None, freq=None, start=None, end=None, 'collection of some kind, {data} was passed' .format(cls=cls.__name__, data=repr(data))) + if unit in {'Y', 'y', 'M'}: + warnings.warn("M and Y units are deprecated and " + "will be removed in a future version.", + FutureWarning, stacklevel=2) + if isinstance(data, TimedeltaArray): if copy: data = data.copy() diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index bbcde8f3b3305..539da0beaefb4 100755 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -347,10 +347,10 @@ def _setitem_with_indexer(self, indexer, value): # must have all defined axes if we have a scalar # or a list-like on the non-info axes if we have a # list-like - len_non_info_axes = [ + len_non_info_axes = ( len(_ax) for _i, _ax in enumerate(self.obj.axes) if _i != i - ] + ) if any(not l for l in len_non_info_axes): if not is_list_like_indexer(value): raise ValueError("cannot set a frame with no " diff --git a/pandas/core/internals/__init__.py b/pandas/core/internals/__init__.py index 7878613a8b1b1..a662e1d3ae197 100644 --- a/pandas/core/internals/__init__.py +++ b/pandas/core/internals/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from .blocks import ( # noqa:F401 - _block2d_to_blocknd, _factor_indexer, _block_shape, # io.pytables + _block_shape, # io.pytables _safe_reshape, # io.packers make_block, # io.pytables, io.packers FloatBlock, IntBlock, ComplexBlock, BoolBlock, ObjectBlock, diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index df764aa4ba666..ac7d21de442db 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -87,7 +87,8 @@ def __init__(self, values, placement, ndim=None): '{mgr}'.format(val=len(self.values), mgr=len(self.mgr_locs))) def _check_ndim(self, values, ndim): - """ndim inference and validation. + """ + ndim inference and validation. Infers ndim from 'values' if not provided to __init__. Validates that values.ndim and ndim are consistent if and only if @@ -267,20 +268,6 @@ def _slice(self, slicer): """ return a slice of my values """ return self.values[slicer] - def reshape_nd(self, labels, shape, ref_items): - """ - Parameters - ---------- - labels : list of new axis labels - shape : new shape - ref_items : new ref_items - - return a new block that is transformed to a nd block - """ - return _block2d_to_blocknd(values=self.get_values().T, - placement=self.mgr_locs, shape=shape, - labels=labels, ref_items=ref_items) - def getitem_block(self, slicer, new_mgr_locs=None): """ Perform __getitem__-like, return result as block. @@ -2072,17 +2059,9 @@ def get_values(self, dtype=None): return object dtype as boxed values, such as Timestamps/Timedelta """ if is_object_dtype(dtype): - values = self.values - - if self.ndim > 1: - values = values.ravel() - - values = lib.map_infer(values, self._box_func) - - if self.ndim > 1: - values = values.reshape(self.values.shape) - - return values + values = self.values.ravel() + result = self._holder(values).astype(object) + return result.reshape(self.values.shape) return self.values @@ -3155,31 +3134,6 @@ def _merge_blocks(blocks, dtype=None, _can_consolidate=True): return blocks -def _block2d_to_blocknd(values, placement, shape, labels, ref_items): - """ pivot to the labels shape """ - panel_shape = (len(placement),) + shape - - # TODO: lexsort depth needs to be 2!! - - # Create observation selection vector using major and minor - # labels, for converting to panel format. - selector = _factor_indexer(shape[1:], labels) - mask = np.zeros(np.prod(shape), dtype=bool) - mask.put(selector, True) - - if mask.all(): - pvalues = np.empty(panel_shape, dtype=values.dtype) - else: - dtype, fill_value = maybe_promote(values.dtype) - pvalues = np.empty(panel_shape, dtype=dtype) - pvalues.fill(fill_value) - - for i in range(len(placement)): - pvalues[i].flat[mask] = values[:, i] - - return make_block(pvalues, placement=placement) - - def _safe_reshape(arr, new_shape): """ If possible, reshape `arr` to have shape `new_shape`, @@ -3202,16 +3156,6 @@ def _safe_reshape(arr, new_shape): return arr -def _factor_indexer(shape, labels): - """ - given a tuple of shape and a list of Categorical labels, return the - expanded label indexer - """ - mult = np.array(shape)[::-1].cumprod()[::-1] - return ensure_platform_int( - np.sum(np.array(labels).T * np.append(mult, [1]), axis=1).T) - - def _putmask_smart(v, m, n): """ Return a new ndarray, try to preserve dtype if possible. diff --git a/pandas/core/internals/concat.py b/pandas/core/internals/concat.py index 4a16707a376e9..640587b7f9f31 100644 --- a/pandas/core/internals/concat.py +++ b/pandas/core/internals/concat.py @@ -183,7 +183,7 @@ def get_reindexed_values(self, empty_dtype, upcasted_na): is_datetime64tz_dtype(empty_dtype)): if self.block is None: array = empty_dtype.construct_array_type() - return array(np.full(self.shape[1], fill_value), + return array(np.full(self.shape[1], fill_value.value), dtype=empty_dtype) pass elif getattr(self.block, 'is_categorical', False): @@ -335,8 +335,10 @@ def get_empty_dtype_and_na(join_units): elif 'category' in upcast_classes: return np.dtype(np.object_), np.nan elif 'datetimetz' in upcast_classes: + # GH-25014. We use NaT instead of iNaT, since this eventually + # ends up in DatetimeArray.take, which does not allow iNaT. dtype = upcast_classes['datetimetz'] - return dtype[0], tslibs.iNaT + return dtype[0], tslibs.NaT elif 'datetime' in upcast_classes: return np.dtype('M8[ns]'), tslibs.iNaT elif 'timedelta' in upcast_classes: diff --git a/pandas/core/internals/construction.py b/pandas/core/internals/construction.py index 7af347a141781..7e97512682720 100644 --- a/pandas/core/internals/construction.py +++ b/pandas/core/internals/construction.py @@ -93,7 +93,7 @@ def masked_rec_array_to_mgr(data, index, columns, dtype, copy): if columns is None: columns = arr_columns - mgr = arrays_to_mgr(arrays, arr_columns, index, columns) + mgr = arrays_to_mgr(arrays, arr_columns, index, columns, dtype) if copy: mgr = mgr.copy() @@ -197,18 +197,12 @@ def init_dict(data, index, columns, dtype=None): arrays.loc[missing] = [val] * missing.sum() else: - - for key in data: - if (isinstance(data[key], ABCDatetimeIndex) and - data[key].tz is not None): - # GH#24096 need copy to be deep for datetime64tz case - # TODO: See if we can avoid these copies - data[key] = data[key].copy(deep=True) - keys = com.dict_keys_to_ordered_list(data) columns = data_names = Index(keys) - arrays = [data[k] for k in keys] - + # GH#24096 need copy to be deep for datetime64tz case + # TODO: See if we can avoid these copies + arrays = [data[k] if not is_datetime64tz_dtype(data[k]) else + data[k].copy(deep=True) for k in keys] return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype) diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 050c3d3e87fc6..38b719db1709f 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -584,10 +584,6 @@ def comp(s, regex=False): bm._consolidate_inplace() return bm - def reshape_nd(self, axes, **kwargs): - """ a 2d-nd reshape operation on a BlockManager """ - return self.apply('reshape_nd', axes=axes, **kwargs) - def is_consolidated(self): """ Return True if more than one block with the same dtype @@ -1971,16 +1967,28 @@ def items_overlap_with_suffix(left, lsuffix, right, rsuffix): raise ValueError('columns overlap but no suffix specified: ' '{rename}'.format(rename=to_rename)) - def lrenamer(x): - if x in to_rename: - return '{x}{lsuffix}'.format(x=x, lsuffix=lsuffix) - return x + def renamer(x, suffix): + """Rename the left and right indices. + + If there is overlap, and suffix is not None, add + suffix, otherwise, leave it as-is. - def rrenamer(x): - if x in to_rename: - return '{x}{rsuffix}'.format(x=x, rsuffix=rsuffix) + Parameters + ---------- + x : original column name + suffix : str or None + + Returns + ------- + x : renamed column name + """ + if x in to_rename and suffix is not None: + return '{x}{suffix}'.format(x=x, suffix=suffix) return x + lrenamer = partial(renamer, suffix=lsuffix) + rrenamer = partial(renamer, suffix=rsuffix) + return (_transform_index(left, lrenamer), _transform_index(right, rrenamer)) diff --git a/pandas/core/missing.py b/pandas/core/missing.py index 15538b8196684..cc7bdf95200d1 100644 --- a/pandas/core/missing.py +++ b/pandas/core/missing.py @@ -1,5 +1,5 @@ """ -Routines for filling missing data +Routines for filling missing data. """ from distutils.version import LooseVersion import operator @@ -116,7 +116,7 @@ def interpolate_1d(xvalues, yvalues, method='linear', limit=None, xvalues and yvalues will each be 1-d arrays of the same length. Bounds_error is currently hardcoded to False since non-scipy ones don't - take it as an argumnet. + take it as an argument. """ # Treat the original, non-scipy methods first. @@ -244,9 +244,9 @@ def interpolate_1d(xvalues, yvalues, method='linear', limit=None, def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, bounds_error=False, order=None, **kwargs): """ - passed off to scipy.interpolate.interp1d. method is scipy's kind. + Passed off to scipy.interpolate.interp1d. method is scipy's kind. Returns an array interpolated at new_x. Add any new methods to - the list in _clean_interp_method + the list in _clean_interp_method. """ try: from scipy import interpolate @@ -314,7 +314,7 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, def _from_derivatives(xi, yi, x, order=None, der=0, extrapolate=False): """ - Convenience function for interpolate.BPoly.from_derivatives + Convenience function for interpolate.BPoly.from_derivatives. Construct a piecewise polynomial in the Bernstein basis, compatible with the specified values and derivatives at breakpoints. @@ -325,7 +325,7 @@ def _from_derivatives(xi, yi, x, order=None, der=0, extrapolate=False): sorted 1D array of x-coordinates yi : array_like or list of array-likes yi[i][j] is the j-th derivative known at xi[i] - orders : None or int or array_like of ints. Default: None. + order: None or int or array_like of ints. Default: None. Specifies the degree of local polynomials. If not None, some derivatives are ignored. der : int or list @@ -344,8 +344,7 @@ def _from_derivatives(xi, yi, x, order=None, der=0, extrapolate=False): Returns ------- y : scalar or array_like - The result, of length R or length M or M by R, - + The result, of length R or length M or M by R. """ import scipy from scipy import interpolate @@ -418,8 +417,9 @@ def _akima_interpolate(xi, yi, x, der=0, axis=0): def interpolate_2d(values, method='pad', axis=0, limit=None, fill_value=None, dtype=None): - """ perform an actual interpolation of values, values will be make 2-d if - needed fills inplace, returns the result + """ + Perform an actual interpolation of values, values will be make 2-d if + needed fills inplace, returns the result. """ transf = (lambda x: x) if axis == 0 else (lambda x: x.T) @@ -533,13 +533,13 @@ def clean_reindex_fill_method(method): def fill_zeros(result, x, y, name, fill): """ - if this is a reversed op, then flip x,y + If this is a reversed op, then flip x,y - if we have an integer value (or array in y) + If we have an integer value (or array in y) and we have 0's, fill them with the fill, - return the result + return the result. - mask the nan's from x + Mask the nan's from x. """ if fill is None or is_float_dtype(result): return result diff --git a/pandas/core/nanops.py b/pandas/core/nanops.py index cafd3a9915fa0..86c3c380636c9 100644 --- a/pandas/core/nanops.py +++ b/pandas/core/nanops.py @@ -14,7 +14,8 @@ _get_dtype, is_any_int_dtype, is_bool_dtype, is_complex, is_complex_dtype, is_datetime64_dtype, is_datetime64tz_dtype, is_datetime_or_timedelta_dtype, is_float, is_float_dtype, is_integer, is_integer_dtype, is_numeric_dtype, - is_object_dtype, is_scalar, is_timedelta64_dtype) + is_object_dtype, is_scalar, is_timedelta64_dtype, pandas_dtype) +from pandas.core.dtypes.dtypes import DatetimeTZDtype from pandas.core.dtypes.missing import isna, na_value_for_dtype, notna import pandas.core.common as com @@ -57,7 +58,7 @@ class disallow(object): def __init__(self, *dtypes): super(disallow, self).__init__() - self.dtypes = tuple(np.dtype(dtype).type for dtype in dtypes) + self.dtypes = tuple(pandas_dtype(dtype).type for dtype in dtypes) def check(self, obj): return hasattr(obj, 'dtype') and issubclass(obj.dtype.type, @@ -437,6 +438,7 @@ def nansum(values, axis=None, skipna=True, min_count=0, mask=None): return _wrap_results(the_sum, dtype) +@disallow('M8', DatetimeTZDtype) @bottleneck_switch() def nanmean(values, axis=None, skipna=True, mask=None): """ diff --git a/pandas/core/ops.py b/pandas/core/ops.py index 10cebc6f94b92..dbdabecafae3a 100644 --- a/pandas/core/ops.py +++ b/pandas/core/ops.py @@ -447,7 +447,7 @@ def _get_op_name(op, special): _op_descriptions[reverse_op]['reverse'] = key _flex_doc_SERIES = """ -{desc} of series and other, element-wise (binary operator `{op_name}`). +Return {desc} of series and other, element-wise (binary operator `{op_name}`). Equivalent to ``{equiv}``, but with support to substitute a fill_value for missing data in one of the inputs. @@ -459,14 +459,15 @@ def _get_op_name(op, special): Fill existing missing (NaN) values, and any new element needed for successful Series alignment, with this value before computation. If data in both corresponding Series locations is missing - the result will be missing + the result will be missing. level : int or name Broadcast across a level, matching Index values on the - passed MultiIndex level + passed MultiIndex level. Returns ------- -result : Series +Series + The result of the operation. See Also -------- @@ -495,6 +496,27 @@ def _get_op_name(op, special): d 1.0 e NaN dtype: float64 +>>> a.subtract(b, fill_value=0) +a 0.0 +b 1.0 +c 1.0 +d -1.0 +e NaN +dtype: float64 +>>> a.multiply(b) +a 1.0 +b NaN +c NaN +d NaN +e NaN +dtype: float64 +>>> a.divide(b, fill_value=0) +a 1.0 +b inf +c inf +d 0.0 +e NaN +dtype: float64 """ _arith_doc_FRAME = """ @@ -525,7 +547,7 @@ def _get_op_name(op, special): """ _flex_doc_FRAME = """ -{desc} of dataframe and other, element-wise (binary operator `{op_name}`). +Get {desc} of dataframe and other, element-wise (binary operator `{op_name}`). Equivalent to ``{equiv}``, but with support to substitute a fill_value for missing data in one of the inputs. With reverse version, `{reverse}`. @@ -679,7 +701,7 @@ def _get_op_name(op, special): """ _flex_comp_doc_FRAME = """ -{desc} of dataframe and other, element-wise (binary operator `{op_name}`). +Get {desc} of dataframe and other, element-wise (binary operator `{op_name}`). Among flexible wrappers (`eq`, `ne`, `le`, `lt`, `ge`, `gt`) to comparison operators. @@ -825,7 +847,7 @@ def _get_op_name(op, special): """ _flex_doc_PANEL = """ -{desc} of series and other, element-wise (binary operator `{op_name}`). +Return {desc} of series and other, element-wise (binary operator `{op_name}`). Equivalent to ``{equiv}``. Parameters diff --git a/pandas/core/panel.py b/pandas/core/panel.py index 540192d1a592c..16bcc17a6b4ea 100644 --- a/pandas/core/panel.py +++ b/pandas/core/panel.py @@ -4,12 +4,13 @@ # pylint: disable=E1103,W0231,W0212,W0621 from __future__ import division +from collections import OrderedDict import warnings import numpy as np import pandas.compat as compat -from pandas.compat import OrderedDict, map, range, u, zip +from pandas.compat import map, range, u, zip from pandas.compat.numpy import function as nv from pandas.util._decorators import Appender, Substitution, deprecate_kwarg from pandas.util._validators import validate_axis_style_args @@ -802,7 +803,7 @@ def major_xs(self, key): Returns ------- y : DataFrame - index -> minor axis, columns -> items + Index -> minor axis, columns -> items Notes ----- @@ -826,7 +827,7 @@ def minor_xs(self, key): Returns ------- y : DataFrame - index -> major axis, columns -> items + Index -> major axis, columns -> items Notes ----- @@ -917,9 +918,7 @@ def groupby(self, function, axis='major'): ------- grouped : PanelGroupBy """ - from pandas.core.groupby import PanelGroupBy - axis = self._get_axis_number(axis) - return PanelGroupBy(self, function, axis=axis) + raise NotImplementedError("Panel is removed in pandas 0.25.0") def to_frame(self, filter_observations=True): """ @@ -999,7 +998,7 @@ def construct_index_parts(idx, major=True): def apply(self, func, axis='major', **kwargs): """ - Applies function along axis (or axes) of the Panel. + Apply function along axis (or axes) of the Panel. Parameters ---------- diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 6822225273906..ff4dd7da15bd1 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -20,7 +20,7 @@ import pandas.core.algorithms as algos from pandas.core.generic import _shared_docs from pandas.core.groupby.base import GroupByMixin -from pandas.core.groupby.generic import PanelGroupBy, SeriesGroupBy +from pandas.core.groupby.generic import SeriesGroupBy from pandas.core.groupby.groupby import ( GroupBy, _GroupBy, _pipe_template, groupby) from pandas.core.groupby.grouper import Grouper @@ -30,14 +30,12 @@ from pandas.core.indexes.timedeltas import TimedeltaIndex, timedelta_range from pandas.tseries.frequencies import to_offset -from pandas.tseries.offsets import ( - DateOffset, Day, Nano, Tick, delta_to_nanoseconds) +from pandas.tseries.offsets import DateOffset, Day, Nano, Tick _shared_docs_kwargs = dict() class Resampler(_GroupBy): - """ Class for resampling datetimelike data, a groupby-like operation. See aggregate, transform, and apply functions on this object. @@ -85,9 +83,9 @@ def __unicode__(self): """ Provide a nice str repr of our rolling object. """ - attrs = ["{k}={v}".format(k=k, v=getattr(self.groupby, k)) + attrs = ("{k}={v}".format(k=k, v=getattr(self.groupby, k)) for k in self._attributes if - getattr(self.groupby, k, None) is not None] + getattr(self.groupby, k, None) is not None) return "{klass} [{attrs}]".format(klass=self.__class__.__name__, attrs=', '.join(attrs)) @@ -108,7 +106,7 @@ def __iter__(self): Returns ------- Generator yielding sequence of (name, subsetted object) - for each group + for each group. See Also -------- @@ -215,9 +213,9 @@ def pipe(self, func, *args, **kwargs): _agg_see_also_doc = dedent(""" See Also -------- - pandas.DataFrame.groupby.aggregate - pandas.DataFrame.resample.transform - pandas.DataFrame.aggregate + DataFrame.groupby.aggregate + DataFrame.resample.transform + DataFrame.aggregate """) _agg_examples_doc = dedent(""" @@ -287,8 +285,8 @@ def transform(self, arg, *args, **kwargs): Parameters ---------- - func : function - To apply to each group. Should return a Series with the same index + arg : function + To apply to each group. Should return a Series with the same index. Returns ------- @@ -342,15 +340,10 @@ def _groupby_and_aggregate(self, how, grouper=None, *args, **kwargs): obj = self._selected_obj - try: - grouped = groupby(obj, by=None, grouper=grouper, axis=self.axis) - except TypeError: - - # panel grouper - grouped = PanelGroupBy(obj, grouper=grouper, axis=self.axis) + grouped = groupby(obj, by=None, grouper=grouper, axis=self.axis) try: - if isinstance(obj, ABCDataFrame) and compat.callable(how): + if isinstance(obj, ABCDataFrame) and callable(how): # Check if the function is reducing or not. result = grouped._aggregate_item_by_item(how, *args, **kwargs) else: @@ -424,7 +417,7 @@ def pad(self, limit=None): Returns ------- - an upsampled Series + An upsampled Series. See Also -------- @@ -524,9 +517,9 @@ def backfill(self, limit=None): 'backfill'. nearest : Fill NaN values with nearest neighbor starting from center. pad : Forward fill NaN values. - pandas.Series.fillna : Fill NaN values in the Series using the + Series.fillna : Fill NaN values in the Series using the specified method, which can be 'backfill'. - pandas.DataFrame.fillna : Fill NaN values in the DataFrame using the + DataFrame.fillna : Fill NaN values in the DataFrame using the specified method, which can be 'backfill'. References @@ -637,9 +630,9 @@ def fillna(self, method, limit=None): nearest : Fill NaN values in the resampled data with nearest neighbor starting from center. interpolate : Fill NaN values using interpolation. - pandas.Series.fillna : Fill NaN values in the Series using the + Series.fillna : Fill NaN values in the Series using the specified method, which can be 'bfill' and 'ffill'. - pandas.DataFrame.fillna : Fill NaN values in the DataFrame using the + DataFrame.fillna : Fill NaN values in the DataFrame using the specified method, which can be 'bfill' and 'ffill'. References @@ -1613,20 +1606,20 @@ def _get_timestamp_range_edges(first, last, offset, closed='left', base=0): A tuple of length 2, containing the adjusted pd.Timestamp objects. """ if isinstance(offset, Tick): - is_day = isinstance(offset, Day) - day_nanos = delta_to_nanoseconds(timedelta(1)) - - # #1165 and #24127 - if (is_day and not offset.nanos % day_nanos) or not is_day: - first, last = _adjust_dates_anchored(first, last, offset, - closed=closed, base=base) - if is_day and first.tz is not None: - # _adjust_dates_anchored assumes 'D' means 24H, but first/last - # might contain a DST transition (23H, 24H, or 25H). - # Ensure first/last snap to midnight. - first = first.normalize() - last = last.normalize() - return first, last + if isinstance(offset, Day): + # _adjust_dates_anchored assumes 'D' means 24H, but first/last + # might contain a DST transition (23H, 24H, or 25H). + # So "pretend" the dates are naive when adjusting the endpoints + tz = first.tz + first = first.tz_localize(None) + last = last.tz_localize(None) + + first, last = _adjust_dates_anchored(first, last, offset, + closed=closed, base=base) + if isinstance(offset, Day): + first = first.tz_localize(tz) + last = last.tz_localize(tz) + return first, last else: first = first.normalize() diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index 0a51f2ee0dce7..ad3327e694b67 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -159,9 +159,15 @@ def merge_ordered(left, right, on=None, left DataFrame fill_method : {'ffill', None}, default None Interpolation method for data - suffixes : 2-length sequence (tuple, list, ...) - Suffix to apply to overlapping column names in the left and right - side, respectively + suffixes : Sequence, default is ("_x", "_y") + A length-2 sequence where each element is optionally a string + indicating the suffix to add to overlapping column names in + `left` and `right` respectively. Pass a value of `None` instead + of a string to indicate that the column name from `left` or + `right` should be left as-is, with no suffix. At least one of the + values must not be None. + + .. versionchanged:: 0.25.0 how : {'left', 'right', 'outer', 'inner'}, default 'outer' * left: use only keys from left frame (SQL: left outer join) * right: use only keys from right frame (SQL: right outer join) @@ -760,6 +766,7 @@ def _get_join_info(self): join_index = self._create_join_index(self.left.index, self.right.index, left_indexer, + right_indexer, how='right') else: join_index = self.right.index.take(right_indexer) @@ -769,6 +776,7 @@ def _get_join_info(self): join_index = self._create_join_index(self.right.index, self.left.index, right_indexer, + left_indexer, how='left') else: join_index = self.left.index.take(left_indexer) @@ -780,7 +788,8 @@ def _get_join_info(self): join_index = join_index.astype(object) return join_index, left_indexer, right_indexer - def _create_join_index(self, index, other_index, indexer, how='left'): + def _create_join_index(self, index, other_index, indexer, + other_indexer, how='left'): """ Create a join index by rearranging one index to match another @@ -806,7 +815,8 @@ def _create_join_index(self, index, other_index, indexer, how='left'): # if values missing (-1) from target index, # take from other_index instead join_list = join_index.to_numpy() - join_list[mask] = other_index.to_numpy()[mask] + other_list = other_index.take(other_indexer).to_numpy() + join_list[mask] = other_list[mask] join_index = Index(join_list, dtype=join_index.dtype, name=join_index.name) return join_index diff --git a/pandas/core/reshape/pivot.py b/pandas/core/reshape/pivot.py index c7c447d18b6b1..54f11646fc753 100644 --- a/pandas/core/reshape/pivot.py +++ b/pandas/core/reshape/pivot.py @@ -88,9 +88,9 @@ def pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', # the original values are ints # as we grouped with a NaN value # and then dropped, coercing to floats - for v in [v for v in values if v in data and v in agged]: - if (is_integer_dtype(data[v]) and - not is_integer_dtype(agged[v])): + for v in values: + if (v in data and is_integer_dtype(data[v]) and + v in agged and not is_integer_dtype(agged[v])): agged[v] = maybe_downcast_to_dtype(agged[v], data[v].dtype) table = agged diff --git a/pandas/core/reshape/tile.py b/pandas/core/reshape/tile.py index c107ed51226b0..2a654fec36a9f 100644 --- a/pandas/core/reshape/tile.py +++ b/pandas/core/reshape/tile.py @@ -35,7 +35,7 @@ def cut(x, bins, right=True, labels=None, retbins=False, precision=3, ---------- x : array-like The input array to be binned. Must be 1-dimensional. - bins : int, sequence of scalars, or pandas.IntervalIndex + bins : int, sequence of scalars, or IntervalIndex The criteria to bin by. * int : Defines the number of equal-width bins in the range of `x`. The @@ -70,16 +70,16 @@ def cut(x, bins, right=True, labels=None, retbins=False, precision=3, Returns ------- - out : pandas.Categorical, Series, or ndarray + out : Categorical, Series, or ndarray An array-like object representing the respective bin for each value of `x`. The type depends on the value of `labels`. * True (default) : returns a Series for Series `x` or a - pandas.Categorical for all other inputs. The values stored within + Categorical for all other inputs. The values stored within are Interval dtype. * sequence of scalars : returns a Series for Series `x` or a - pandas.Categorical for all other inputs. The values stored within + Categorical for all other inputs. The values stored within are whatever the type in the sequence is. * False : returns an ndarray of integers. @@ -94,16 +94,15 @@ def cut(x, bins, right=True, labels=None, retbins=False, precision=3, -------- qcut : Discretize variable into equal-sized buckets based on rank or based on sample quantiles. - pandas.Categorical : Array type for storing data that come from a + Categorical : Array type for storing data that come from a fixed set of values. Series : One-dimensional array with axis labels (including time series). - pandas.IntervalIndex : Immutable Index implementing an ordered, - sliceable set. + IntervalIndex : Immutable Index implementing an ordered, sliceable set. Notes ----- Any NA values will be NA in the result. Out of bounds values will be NA in - the resulting Series or pandas.Categorical object. + the resulting Series or Categorical object. Examples -------- @@ -373,14 +372,6 @@ def _bins_to_cuts(x, bins, right=True, labels=None, return result, bins -def _trim_zeros(x): - while len(x) > 1 and x[-1] == '0': - x = x[:-1] - if len(x) > 1 and x[-1] == '.': - x = x[:-1] - return x - - def _coerce_to_type(x): """ if the passed data is of datetime/timedelta type, diff --git a/pandas/core/reshape/util.py b/pandas/core/reshape/util.py index 7f43a0e9719b8..9d4135a7f310e 100644 --- a/pandas/core/reshape/util.py +++ b/pandas/core/reshape/util.py @@ -1,7 +1,5 @@ import numpy as np -from pandas.compat import reduce - from pandas.core.dtypes.common import is_list_like from pandas.core import common as com @@ -57,14 +55,3 @@ def cartesian_product(X): return [np.tile(np.repeat(np.asarray(com.values_from_object(x)), b[i]), np.product(a[i])) for i, x in enumerate(X)] - - -def _compose2(f, g): - """Compose 2 callables""" - return lambda *args, **kwargs: f(g(*args, **kwargs)) - - -def compose(*funcs): - """Compose 2 or more callables""" - assert len(funcs) > 1, 'At least 2 callables must be passed to compose' - return reduce(_compose2, funcs) diff --git a/pandas/core/series.py b/pandas/core/series.py index 0c8e697c572e8..b2011fdcdee98 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -3,6 +3,7 @@ """ from __future__ import division +from collections import OrderedDict from textwrap import dedent import warnings @@ -10,7 +11,7 @@ from pandas._libs import iNaT, index as libindex, lib, tslibs import pandas.compat as compat -from pandas.compat import PY36, OrderedDict, StringIO, u, zip +from pandas.compat import PY36, StringIO, u, zip from pandas.compat.numpy import function as nv from pandas.util._decorators import Appender, Substitution, deprecate from pandas.util._validators import validate_bool_kwarg @@ -129,7 +130,7 @@ class Series(base.IndexOpsMixin, generic.NDFrame): sequence are used, the index will override the keys found in the dict. dtype : str, numpy.dtype, or ExtensionDtype, optional - dtype for the output Series. If not specified, this will be + Data type for the output Series. If not specified, this will be inferred from `data`. See the :ref:`user guide ` for more usages. copy : bool, default False @@ -444,7 +445,7 @@ def values(self): Returns ------- - arr : numpy.ndarray or ndarray-like + numpy.ndarray or ndarray-like See Also -------- @@ -513,6 +514,11 @@ def ravel(self, order='C'): """ Return the flattened underlying data as an ndarray. + Returns + ------- + numpy.ndarray or ndarray-like + Flattened data of the Series. + See Also -------- numpy.ndarray.ravel @@ -580,7 +586,7 @@ def nonzero(self): def put(self, *args, **kwargs): """ - Applies the `put` method to its `values` attribute if it has one. + Apply the `put` method to its `values` attribute if it has one. See Also -------- @@ -687,7 +693,7 @@ def __array__(self, dtype=None): See Also -------- - pandas.array : Create a new array from data. + array : Create a new array from data. Series.array : Zero-copy view to the array backing the Series. Series.to_numpy : Series method for similar behavior. @@ -830,7 +836,7 @@ def _ixs(self, i, axis=0): Returns ------- - value : scalar (int) or Series (slice, sequence) + scalar (int) or Series (slice, sequence) """ try: @@ -1120,7 +1126,7 @@ def repeat(self, repeats, axis=None): Returns ------- - repeated_series : Series + Series Newly created Series with repeated elements. See Also @@ -1173,7 +1179,7 @@ def get_value(self, label, takeable=False): Returns ------- - value : scalar value + scalar value """ warnings.warn("get_value is deprecated and will be removed " "in a future release. Please use " @@ -1207,7 +1213,7 @@ def set_value(self, label, value, takeable=False): Returns ------- - series : Series + Series If label is contained, will be reference to calling Series, otherwise a new object """ @@ -1394,29 +1400,30 @@ def to_string(self, buf=None, na_rep='NaN', float_format=None, header=True, Parameters ---------- buf : StringIO-like, optional - buffer to write to - na_rep : string, optional - string representation of NAN to use, default 'NaN' + Buffer to write to. + na_rep : str, optional + String representation of NaN to use, default 'NaN'. float_format : one-parameter function, optional - formatter function to apply to columns' elements if they are floats - default None - header : boolean, default True - Add the Series header (index name) + Formatter function to apply to columns' elements if they are + floats, default None. + header : bool, default True + Add the Series header (index name). index : bool, optional - Add index (row) labels, default True - length : boolean, default False - Add the Series length - dtype : boolean, default False - Add the Series dtype - name : boolean, default False - Add the Series name if not None + Add index (row) labels, default True. + length : bool, default False + Add the Series length. + dtype : bool, default False + Add the Series dtype. + name : bool, default False + Add the Series name if not None. max_rows : int, optional Maximum number of rows to show before truncating. If None, show all. Returns ------- - formatted : string (if not buffer passed) + str or None + String representation of Series if ``buf=None``, otherwise None. """ formatter = fmt.SeriesFormatter(self, name=name, length=length, @@ -1456,7 +1463,7 @@ def iteritems(self): def keys(self): """ - Alias for index. + Return alias for index. """ return self.index @@ -1476,7 +1483,8 @@ def to_dict(self, into=dict): Returns ------- - value_dict : collections.Mapping + collections.Mapping + Key-value representation of Series. Examples -------- @@ -1488,7 +1496,7 @@ def to_dict(self, into=dict): OrderedDict([(0, 1), (1, 2), (2, 3), (3, 4)]) >>> dd = defaultdict(list) >>> s.to_dict(dd) - defaultdict(, {0: 1, 1: 2, 2: 3, 3: 4}) + defaultdict(, {0: 1, 1: 2, 2: 3, 3: 4}) """ # GH16122 into_c = com.standardize_mapping(into) @@ -1506,7 +1514,18 @@ def to_frame(self, name=None): Returns ------- - data_frame : DataFrame + DataFrame + DataFrame representation of Series. + + Examples + -------- + >>> s = pd.Series(["a", "b", "c"], + ... name="vals") + >>> s.to_frame() + vals + 0 a + 1 b + 2 c """ if name is None: df = self._constructor_expanddim(self) @@ -1521,12 +1540,14 @@ def to_sparse(self, kind='block', fill_value=None): Parameters ---------- - kind : {'block', 'integer'} + kind : {'block', 'integer'}, default 'block' fill_value : float, defaults to NaN (missing) + Value to use for filling NaN values. Returns ------- - sp : SparseSeries + SparseSeries + Sparse representation of the Series. """ # TODO: deprecate from pandas.core.sparse.series import SparseSeries @@ -1564,11 +1585,18 @@ def count(self, level=None): ---------- level : int or level name, default None If the axis is a MultiIndex (hierarchical), count along a - particular level, collapsing into a smaller Series + particular level, collapsing into a smaller Series. Returns ------- - nobs : int or Series (if level specified) + int or Series (if level specified) + Number of non-null values in the Series. + + Examples + -------- + >>> s = pd.Series([0.0, 1.0, np.nan]) + >>> s.count() + 2 """ if level is None: return notna(com.values_from_object(self)).sum() @@ -1597,14 +1625,15 @@ def mode(self, dropna=True): Parameters ---------- - dropna : boolean, default True + dropna : bool, default True Don't consider counts of NaN/NaT. .. versionadded:: 0.24.0 Returns ------- - modes : Series (sorted) + Series + Modes of the Series in sorted order. """ # TODO: Add option for bins like value_counts() return algorithms.mode(self, dropna=dropna) @@ -1677,12 +1706,13 @@ def drop_duplicates(self, keep='first', inplace=False): - 'first' : Drop duplicates except for the first occurrence. - 'last' : Drop duplicates except for the last occurrence. - ``False`` : Drop all duplicates. - inplace : boolean, default ``False`` + inplace : bool, default ``False`` If ``True``, performs operation inplace and returns None. Returns ------- - deduplicated : Series + Series + Series with duplicates dropped. See Also -------- @@ -1759,7 +1789,9 @@ def duplicated(self, keep='first'): Returns ------- - pandas.core.series.Series + Series + Series indicating whether each value has occurred in the + preceding values. See Also -------- @@ -1823,7 +1855,7 @@ def idxmin(self, axis=0, skipna=True, *args, **kwargs): Parameters ---------- - skipna : boolean, default True + skipna : bool, default True Exclude NA/null values. If the entire Series is NA, the result will be NA. axis : int, default 0 @@ -1835,7 +1867,8 @@ def idxmin(self, axis=0, skipna=True, *args, **kwargs): Returns ------- - idxmin : Index of minimum of values. + Index + Label of the minimum value. Raises ------ @@ -1860,7 +1893,7 @@ def idxmin(self, axis=0, skipna=True, *args, **kwargs): Examples -------- >>> s = pd.Series(data=[1, None, 4, 1], - ... index=['A' ,'B' ,'C' ,'D']) + ... index=['A', 'B', 'C', 'D']) >>> s A 1.0 B NaN @@ -1892,7 +1925,7 @@ def idxmax(self, axis=0, skipna=True, *args, **kwargs): Parameters ---------- - skipna : boolean, default True + skipna : bool, default True Exclude NA/null values. If the entire Series is NA, the result will be NA. axis : int, default 0 @@ -1904,7 +1937,8 @@ def idxmax(self, axis=0, skipna=True, *args, **kwargs): Returns ------- - idxmax : Index of maximum of values. + Index + Label of the maximum value. Raises ------ @@ -1988,12 +2022,22 @@ def round(self, decimals=0, *args, **kwargs): Returns ------- - Series object + Series + Rounded values of the Series. See Also -------- - numpy.around - DataFrame.round + numpy.around : Round values of an np.array. + DataFrame.round : Round values of a DataFrame. + + Examples + -------- + >>> s = pd.Series([0.1, 1.3, 2.7]) + >>> s.round() + 0 0.0 + 1 1.0 + 2 3.0 + dtype: float64 """ nv.validate_round(args, kwargs) result = com.values_from_object(self).round(decimals) @@ -2008,7 +2052,7 @@ def quantile(self, q=0.5, interpolation='linear'): Parameters ---------- q : float or array-like, default 0.5 (50% quantile) - 0 <= q <= 1, the quantile(s) to compute + 0 <= q <= 1, the quantile(s) to compute. interpolation : {'linear', 'lower', 'higher', 'midpoint', 'nearest'} .. versionadded:: 0.18.0 @@ -2024,9 +2068,10 @@ def quantile(self, q=0.5, interpolation='linear'): Returns ------- - quantile : float or Series - if ``q`` is an array, a Series will be returned where the - index is ``q`` and the values are the quantiles. + float or Series + If ``q`` is an array, a Series will be returned where the + index is ``q`` and the values are the quantiles, otherwise + a float will be returned. See Also -------- @@ -2072,6 +2117,7 @@ def corr(self, other, method='pearson', min_periods=None): Parameters ---------- other : Series + Series with which to compute the correlation. method : {'pearson', 'kendall', 'spearman'} or callable * pearson : standard correlation coefficient * kendall : Kendall Tau correlation coefficient @@ -2081,16 +2127,18 @@ def corr(self, other, method='pearson', min_periods=None): .. versionadded:: 0.24.0 min_periods : int, optional - Minimum number of observations needed to have a valid result + Minimum number of observations needed to have a valid result. Returns ------- - correlation : float + float + Correlation with other. Examples -------- - >>> histogram_intersection = lambda a, b: np.minimum(a, b - ... ).sum().round(decimals=1) + >>> def histogram_intersection(a, b): + ... v = np.minimum(a, b).sum().round(decimals=1) + ... return v >>> s1 = pd.Series([.2, .0, .6, .2]) >>> s2 = pd.Series([.3, .6, .0, .1]) >>> s1.corr(s2, method=histogram_intersection) @@ -2115,14 +2163,22 @@ def cov(self, other, min_periods=None): Parameters ---------- other : Series + Series with which to compute the covariance. min_periods : int, optional - Minimum number of observations needed to have a valid result + Minimum number of observations needed to have a valid result. Returns ------- - covariance : float + float + Covariance between Series and other normalized by N-1 + (unbiased estimator). - Normalized by N-1 (unbiased estimator). + Examples + -------- + >>> s1 = pd.Series([0.90010907, 0.13484424, 0.62036035]) + >>> s2 = pd.Series([0.12528585, 0.26962463, 0.51111198]) + >>> s1.cov(s2) + -0.01685762652715874 """ this, other = self.align(other, join='inner', copy=False) if len(this) == 0: @@ -2145,7 +2201,8 @@ def diff(self, periods=1): Returns ------- - diffed : Series + Series + First differences of the Series. See Also -------- @@ -2279,7 +2336,7 @@ def dot(self, other): 8 >>> s @ other 8 - >>> df = pd.DataFrame([[0 ,1], [-2, 3], [4, -5], [6, 7]]) + >>> df = pd.DataFrame([[0, 1], [-2, 3], [4, -5], [6, 7]]) >>> s.dot(df) 0 24 1 14 @@ -2348,17 +2405,19 @@ def append(self, to_append, ignore_index=False, verify_integrity=False): Parameters ---------- to_append : Series or list/tuple of Series - ignore_index : boolean, default False + Series to append with self. + ignore_index : bool, default False If True, do not use the index labels. .. versionadded:: 0.19.0 - verify_integrity : boolean, default False - If True, raise Exception on creating index with duplicates + verify_integrity : bool, default False + If True, raise Exception on creating index with duplicates. Returns ------- - appended : Series + Series + Concatenated Series. See Also -------- @@ -2376,7 +2435,7 @@ def append(self, to_append, ignore_index=False, verify_integrity=False): -------- >>> s1 = pd.Series([1, 2, 3]) >>> s2 = pd.Series([4, 5, 6]) - >>> s3 = pd.Series([4, 5, 6], index=[3,4,5]) + >>> s3 = pd.Series([4, 5, 6], index=[3, 4, 5]) >>> s1.append(s2) 0 1 1 2 @@ -2439,7 +2498,7 @@ def _binop(self, other, func, level=None, fill_value=None): Returns ------- - combined : Series + Series """ if not isinstance(other, Series): raise AssertionError('Other operand must be Series') @@ -2857,13 +2916,13 @@ def sort_index(self, axis=0, level=None, ascending=True, inplace=False, If 'first' puts NaNs at the beginning, 'last' puts NaNs at the end. Not implemented for MultiIndex. sort_remaining : bool, default True - If true and sorting by level and index is multilevel, sort by other + If True and sorting by level and index is multilevel, sort by other levels too (in order) after sorting by specified level. Returns ------- - pandas.Series - The original Series sorted by the labels + Series + The original Series sorted by the labels. See Also -------- @@ -2987,7 +3046,7 @@ def sort_index(self, axis=0, level=None, ascending=True, inplace=False, def argsort(self, axis=0, kind='quicksort', order=None): """ - Overrides ndarray.argsort. Argsorts the value, omitting NA/null values, + Override ndarray.argsort. Argsorts the value, omitting NA/null values, and places the result in the same locations as the non-NA values. Parameters @@ -3002,7 +3061,9 @@ def argsort(self, axis=0, kind='quicksort', order=None): Returns ------- - argsorted : Series, with -1 indicated where nan values are present + Series + Positions of values within the sort order with -1 indicating + nan values. See Also -------- @@ -3220,12 +3281,13 @@ def swaplevel(self, i=-2, j=-1, copy=True): Parameters ---------- - i, j : int, string (can be mixed) + i, j : int, str (can be mixed) Level of index to be swapped. Can pass level name as string. Returns ------- - swapped : Series + Series + Series with levels swapped in MultiIndex. .. versionchanged:: 0.18.1 @@ -3265,21 +3327,23 @@ def unstack(self, level=-1, fill_value=None): Parameters ---------- - level : int, string, or list of these, default last level - Level(s) to unstack, can pass level name - fill_value : replace NaN with this value if the unstack produces - missing values + level : int, str, or list of these, default last level + Level(s) to unstack, can pass level name. + fill_value : scalar value, default None + Value to use when replacing NaN values. .. versionadded:: 0.18.0 Returns ------- - unstacked : DataFrame + DataFrame + Unstacked Series. Examples -------- >>> s = pd.Series([1, 2, 3, 4], - ... index=pd.MultiIndex.from_product([['one', 'two'], ['a', 'b']])) + ... index=pd.MultiIndex.from_product([['one', 'two'], + ... ['a', 'b']])) >>> s one a 1 b 2 @@ -3679,7 +3743,7 @@ def rename(self, index=None, **kwargs): Scalar or hashable sequence-like will alter the ``Series.name`` attribute. copy : bool, default True - Also copy underlying data + Whether to copy underlying data. inplace : bool, default False Whether to return a new Series. If True then value of copy is ignored. @@ -3689,11 +3753,12 @@ def rename(self, index=None, **kwargs): Returns ------- - renamed : Series (new object) + Series + Series with index labels or name altered. See Also -------- - Series.rename_axis + Series.rename_axis : Set the name of the axis. Examples -------- @@ -3703,7 +3768,7 @@ def rename(self, index=None, **kwargs): 1 2 2 3 dtype: int64 - >>> s.rename("my_name") # scalar, changes Series.name + >>> s.rename("my_name") # scalar, changes Series.name 0 1 1 2 2 3 @@ -3762,7 +3827,8 @@ def drop(self, labels=None, axis=0, index=None, columns=None, Returns ------- - dropped : pandas.Series + Series + Series with specified index labels removed. Raises ------ @@ -3778,7 +3844,7 @@ def drop(self, labels=None, axis=0, index=None, columns=None, Examples -------- - >>> s = pd.Series(data=np.arange(3), index=['A','B','C']) + >>> s = pd.Series(data=np.arange(3), index=['A', 'B', 'C']) >>> s A 0 B 1 @@ -3787,7 +3853,7 @@ def drop(self, labels=None, axis=0, index=None, columns=None, Drop labels B en C - >>> s.drop(labels=['B','C']) + >>> s.drop(labels=['B', 'C']) A 0 dtype: int64 @@ -3960,7 +4026,8 @@ def isin(self, values): Returns ------- - isin : Series (bool dtype) + Series + Series of booleans indicating if each element is in values. Raises ------ @@ -4019,7 +4086,8 @@ def between(self, left, right, inclusive=True): Returns ------- Series - Each element will be a boolean. + Series representing whether each element is between left and + right (inclusive). See Also -------- @@ -4101,27 +4169,27 @@ def from_csv(cls, path, sep=',', parse_dates=True, header=None, Parameters ---------- - path : string file path or file handle / StringIO - sep : string, default ',' - Field delimiter - parse_dates : boolean, default True - Parse dates. Different default from read_table + path : str, file path, or file handle / StringIO + sep : str, default ',' + Field delimiter. + parse_dates : bool, default True + Parse dates. Different default from read_table. header : int, default None - Row to use as header (skip prior rows) + Row to use as header (skip prior rows). index_col : int or sequence, default 0 Column to use for index. If a sequence is given, a MultiIndex - is used. Different default from read_table - encoding : string, optional - a string representing the encoding to use if the contents are - non-ascii, for python versions prior to 3 - infer_datetime_format : boolean, default False + is used. Different default from read_table. + encoding : str, optional + A string representing the encoding to use if the contents are + non-ascii, for python versions prior to 3. + infer_datetime_format : bool, default False If True and `parse_dates` is True for a column, try to infer the datetime format based on the first datetime string. If the format can be inferred, there often will be a large parsing speed-up. Returns ------- - y : Series + Series See Also -------- @@ -4322,19 +4390,21 @@ def valid(self, inplace=False, **kwargs): def to_timestamp(self, freq=None, how='start', copy=True): """ - Cast to datetimeindex of timestamps, at *beginning* of period. + Cast to DatetimeIndex of Timestamps, at *beginning* of period. Parameters ---------- - freq : string, default frequency of PeriodIndex - Desired frequency + freq : str, default frequency of PeriodIndex + Desired frequency. how : {'s', 'e', 'start', 'end'} Convention for converting period to timestamp; start of period - vs. end + vs. end. + copy : bool, default True + Whether or not to return a copy. Returns ------- - ts : Series with DatetimeIndex + Series with DatetimeIndex """ new_values = self._values if copy: @@ -4351,11 +4421,15 @@ def to_period(self, freq=None, copy=True): Parameters ---------- - freq : string, default + freq : str, default None + Frequency associated with the PeriodIndex. + copy : bool, default True + Whether or not to return a copy. Returns ------- - ts : Series with PeriodIndex + Series + Series with index converted to PeriodIndex. """ new_values = self._values if copy: diff --git a/pandas/core/sparse/frame.py b/pandas/core/sparse/frame.py index 586193fe11850..e0af11d13774c 100644 --- a/pandas/core/sparse/frame.py +++ b/pandas/core/sparse/frame.py @@ -194,7 +194,9 @@ def sp_maker(x): return to_manager(sdict, columns, index) def _init_matrix(self, data, index, columns, dtype=None): - """ Init self from ndarray or list of lists """ + """ + Init self from ndarray or list of lists. + """ data = prep_ndarray(data, copy=False) index, columns = self._prep_index(data, index, columns) data = {idx: data[:, i] for i, idx in enumerate(columns)} @@ -202,7 +204,9 @@ def _init_matrix(self, data, index, columns, dtype=None): def _init_spmatrix(self, data, index, columns, dtype=None, fill_value=None): - """ Init self from scipy.sparse matrix """ + """ + Init self from scipy.sparse matrix. + """ index, columns = self._prep_index(data, index, columns) data = data.tocoo() N = len(index) @@ -302,7 +306,9 @@ def __getstate__(self): _default_kind=self._default_kind) def _unpickle_sparse_frame_compat(self, state): - """ original pickle format """ + """ + Original pickle format + """ series, cols, idx, fv, kind = state if not isinstance(cols, Index): # pragma: no cover @@ -338,7 +344,9 @@ def to_dense(self): return DataFrame(data, index=self.index, columns=self.columns) def _apply_columns(self, func): - """ get new SparseDataFrame applying func to each columns """ + """ + Get new SparseDataFrame applying func to each columns + """ new_data = {col: func(series) for col, series in compat.iteritems(self)} diff --git a/pandas/core/sparse/scipy_sparse.py b/pandas/core/sparse/scipy_sparse.py index 2d0ce2d5e5951..5a39a1529a33a 100644 --- a/pandas/core/sparse/scipy_sparse.py +++ b/pandas/core/sparse/scipy_sparse.py @@ -3,7 +3,9 @@ Currently only includes SparseSeries.to_coo helpers. """ -from pandas.compat import OrderedDict, lmap +from collections import OrderedDict + +from pandas.compat import lmap from pandas.core.index import Index, MultiIndex from pandas.core.series import Series @@ -90,7 +92,8 @@ def _get_index_subset_to_coord_dict(index, subset, sort_labels=False): def _sparse_series_to_coo(ss, row_levels=(0, ), column_levels=(1, ), sort_labels=False): - """ Convert a SparseSeries to a scipy.sparse.coo_matrix using index + """ + Convert a SparseSeries to a scipy.sparse.coo_matrix using index levels row_levels, column_levels as the row and column labels respectively. Returns the sparse_matrix, row and column labels. """ @@ -116,7 +119,8 @@ def _sparse_series_to_coo(ss, row_levels=(0, ), column_levels=(1, ), def _coo_to_sparse_series(A, dense_index=False): - """ Convert a scipy.sparse.coo_matrix to a SparseSeries. + """ + Convert a scipy.sparse.coo_matrix to a SparseSeries. Use the defaults given in the SparseSeries constructor. """ s = Series(A.data, MultiIndex.from_arrays((A.row, A.col))) diff --git a/pandas/core/strings.py b/pandas/core/strings.py index ca79dcd9408d8..183a91c952140 100644 --- a/pandas/core/strings.py +++ b/pandas/core/strings.py @@ -1872,7 +1872,7 @@ def _wrap_result(self, result, use_codes=True, if expand is None: # infer from ndim if expand is not specified - expand = False if result.ndim == 1 else True + expand = result.ndim != 1 elif expand is True and not isinstance(self._orig, Index): # required when expand=True is explicitly specified @@ -2869,7 +2869,7 @@ def rindex(self, sub, start=0, end=None): return self._wrap_result(result) _shared_docs['len'] = (""" - Computes the length of each element in the Series/Index. The element may be + Compute the length of each element in the Series/Index. The element may be a sequence (such as a string, tuple or list) or a collection (such as a dictionary). diff --git a/pandas/core/tools/datetimes.py b/pandas/core/tools/datetimes.py index e6478da400d76..3da349c570274 100644 --- a/pandas/core/tools/datetimes.py +++ b/pandas/core/tools/datetimes.py @@ -497,8 +497,8 @@ def to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, See Also -------- - pandas.DataFrame.astype : Cast argument to a specified dtype. - pandas.to_timedelta : Convert argument to timedelta. + DataFrame.astype : Cast argument to a specified dtype. + to_timedelta : Convert argument to timedelta. Examples -------- diff --git a/pandas/core/tools/numeric.py b/pandas/core/tools/numeric.py index 803723dab46ff..b8a7eb5b0c570 100644 --- a/pandas/core/tools/numeric.py +++ b/pandas/core/tools/numeric.py @@ -19,9 +19,17 @@ def to_numeric(arg, errors='raise', downcast=None): depending on the data supplied. Use the `downcast` parameter to obtain other dtypes. + Please note that precision loss may occur if really large numbers + are passed in. Due to the internal limitations of `ndarray`, if + numbers smaller than `-9223372036854775808` (np.iinfo(np.int64).min) + or larger than `18446744073709551615` (np.iinfo(np.uint64).max) are + passed in, it is very likely they will be converted to float so that + they can stored in an `ndarray`. These warnings apply similarly to + `Series` since it internally leverages `ndarray`. + Parameters ---------- - arg : list, tuple, 1-d array, or Series + arg : scalar, list, tuple, 1-d array, or Series errors : {'ignore', 'raise', 'coerce'}, default 'raise' - If 'raise', then invalid parsing will raise an exception - If 'coerce', then invalid parsing will be set as NaN @@ -55,9 +63,9 @@ def to_numeric(arg, errors='raise', downcast=None): See Also -------- - pandas.DataFrame.astype : Cast argument to a specified dtype. - pandas.to_datetime : Convert argument to datetime. - pandas.to_timedelta : Convert argument to timedelta. + DataFrame.astype : Cast argument to a specified dtype. + to_datetime : Convert argument to datetime. + to_timedelta : Convert argument to timedelta. numpy.ndarray.astype : Cast a numpy array to a specified type. Examples @@ -130,7 +138,7 @@ def to_numeric(arg, errors='raise', downcast=None): values = values.astype(np.int64) else: values = ensure_object(values) - coerce_numeric = False if errors in ('ignore', 'raise') else True + coerce_numeric = errors not in ('ignore', 'raise') values = lib.maybe_convert_numeric(values, set(), coerce_numeric=coerce_numeric) diff --git a/pandas/core/tools/timedeltas.py b/pandas/core/tools/timedeltas.py index e3428146b91d8..30cb15f311b9f 100644 --- a/pandas/core/tools/timedeltas.py +++ b/pandas/core/tools/timedeltas.py @@ -2,6 +2,8 @@ timedelta support tools """ +import warnings + import numpy as np from pandas._libs.tslibs.timedeltas import Timedelta, parse_timedelta_unit @@ -90,6 +92,11 @@ def to_timedelta(arg, unit='ns', box=True, errors='raise'): raise ValueError("errors must be one of 'ignore', " "'raise', or 'coerce'}") + if unit in {'Y', 'y', 'M'}: + warnings.warn("M and Y units are deprecated and " + "will be removed in a future version.", + FutureWarning, stacklevel=2) + if arg is None: return arg elif isinstance(arg, ABCSeries): @@ -120,7 +127,8 @@ def _coerce_scalar_to_timedelta_type(r, unit='ns', box=True, errors='raise'): try: result = Timedelta(r, unit) if not box: - result = result.asm8 + # explicitly view as timedelta64 for case when result is pd.NaT + result = result.asm8.view('timedelta64[ns]') except ValueError: if errors == 'raise': raise diff --git a/pandas/core/window.py b/pandas/core/window.py index 5a9157b43ecd6..fb37d790f950c 100644 --- a/pandas/core/window.py +++ b/pandas/core/window.py @@ -164,9 +164,9 @@ def __unicode__(self): Provide a nice str repr of our rolling object. """ - attrs = ["{k}={v}".format(k=k, v=getattr(self, k)) + attrs = ("{k}={v}".format(k=k, v=getattr(self, k)) for k in self._attributes - if getattr(self, k, None) is not None] + if getattr(self, k, None) is not None) return "{klass} [{attrs}]".format(klass=self._window_type, attrs=','.join(attrs)) @@ -438,7 +438,7 @@ def aggregate(self, arg, *args, **kwargs): class Window(_Window): """ - Provides rolling window calculations. + Provide rolling window calculations. .. versionadded:: 0.18.0 @@ -900,9 +900,9 @@ class _Rolling_and_Expanding(_Rolling): See Also -------- - pandas.Series.%(name)s : Calling object with Series data. - pandas.DataFrame.%(name)s : Calling object with DataFrames. - pandas.DataFrame.count : Count of the full DataFrame. + Series.%(name)s : Calling object with Series data. + DataFrame.%(name)s : Calling object with DataFrames. + DataFrame.count : Count of the full DataFrame. Examples -------- @@ -1322,9 +1322,9 @@ def kurt(self, **kwargs): See Also -------- - pandas.Series.quantile : Computes value at the given quantile over all data + Series.quantile : Computes value at the given quantile over all data in Series. - pandas.DataFrame.quantile : Computes values at the given quantile over + DataFrame.quantile : Computes values at the given quantile over requested axis in DataFrame. Examples @@ -1626,8 +1626,8 @@ def _validate_freq(self): _agg_see_also_doc = dedent(""" See Also -------- - pandas.Series.rolling - pandas.DataFrame.rolling + Series.rolling + DataFrame.rolling """) _agg_examples_doc = dedent(""" @@ -1803,7 +1803,7 @@ def corr(self, other=None, pairwise=None, **kwargs): class RollingGroupby(_GroupByMixin, Rolling): """ - Provides a rolling groupby implementation. + Provide a rolling groupby implementation. .. versionadded:: 0.18.1 @@ -1834,7 +1834,7 @@ def _validate_monotonic(self): class Expanding(_Rolling_and_Expanding): """ - Provides expanding transformations. + Provide expanding transformations. .. versionadded:: 0.18.0 @@ -1916,9 +1916,9 @@ def _get_window(self, other=None): _agg_see_also_doc = dedent(""" See Also -------- - pandas.DataFrame.expanding.aggregate - pandas.DataFrame.rolling.aggregate - pandas.DataFrame.aggregate + DataFrame.expanding.aggregate + DataFrame.rolling.aggregate + DataFrame.aggregate """) _agg_examples_doc = dedent(""" @@ -2076,7 +2076,7 @@ def corr(self, other=None, pairwise=None, **kwargs): class ExpandingGroupby(_GroupByMixin, Expanding): """ - Provides a expanding groupby implementation. + Provide a expanding groupby implementation. .. versionadded:: 0.18.1 @@ -2117,7 +2117,7 @@ def _constructor(self): class EWM(_Rolling): r""" - Provides exponential weighted functions. + Provide exponential weighted functions. .. versionadded:: 0.18.0 @@ -2125,16 +2125,17 @@ class EWM(_Rolling): ---------- com : float, optional Specify decay in terms of center of mass, - :math:`\alpha = 1 / (1 + com),\text{ for } com \geq 0` + :math:`\alpha = 1 / (1 + com),\text{ for } com \geq 0`. span : float, optional Specify decay in terms of span, - :math:`\alpha = 2 / (span + 1),\text{ for } span \geq 1` + :math:`\alpha = 2 / (span + 1),\text{ for } span \geq 1`. halflife : float, optional Specify decay in terms of half-life, - :math:`\alpha = 1 - exp(log(0.5) / halflife),\text{ for } halflife > 0` + :math:`\alpha = 1 - exp(log(0.5) / halflife),\text{ for } + halflife > 0`. alpha : float, optional Specify smoothing factor :math:`\alpha` directly, - :math:`0 < \alpha \leq 1` + :math:`0 < \alpha \leq 1`. .. versionadded:: 0.18.0 @@ -2143,14 +2144,19 @@ class EWM(_Rolling): (otherwise result is NA). adjust : bool, default True Divide by decaying adjustment factor in beginning periods to account - for imbalance in relative weightings (viewing EWMA as a moving average) + for imbalance in relative weightings + (viewing EWMA as a moving average). ignore_na : bool, default False Ignore missing values when calculating weights; - specify True to reproduce pre-0.15.0 behavior + specify True to reproduce pre-0.15.0 behavior. + axis : {0 or 'index', 1 or 'columns'}, default 0 + The axis to use. The value 0 identifies the rows, and 1 + identifies the columns. Returns ------- - a Window sub-classed for the particular operation + DataFrame + A Window sub-classed for the particular operation. See Also -------- @@ -2188,6 +2194,7 @@ class EWM(_Rolling): -------- >>> df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]}) + >>> df B 0 0.0 1 1.0 diff --git a/pandas/errors/__init__.py b/pandas/errors/__init__.py index eb6a4674a7497..c57d27ff03ac6 100644 --- a/pandas/errors/__init__.py +++ b/pandas/errors/__init__.py @@ -45,8 +45,8 @@ class DtypeWarning(Warning): See Also -------- - pandas.read_csv : Read CSV (comma-separated) file into a DataFrame. - pandas.read_table : Read general delimited file into a DataFrame. + read_csv : Read CSV (comma-separated) file into a DataFrame. + read_table : Read general delimited file into a DataFrame. Notes ----- diff --git a/pandas/io/clipboard/windows.py b/pandas/io/clipboard/windows.py index 3d979a61b5f2d..4f5275af693b7 100644 --- a/pandas/io/clipboard/windows.py +++ b/pandas/io/clipboard/windows.py @@ -29,6 +29,7 @@ def init_windows_clipboard(): HINSTANCE, HMENU, BOOL, UINT, HANDLE) windll = ctypes.windll + msvcrt = ctypes.CDLL('msvcrt') safeCreateWindowExA = CheckedCall(windll.user32.CreateWindowExA) safeCreateWindowExA.argtypes = [DWORD, LPCSTR, LPCSTR, DWORD, INT, INT, @@ -71,6 +72,10 @@ def init_windows_clipboard(): safeGlobalUnlock.argtypes = [HGLOBAL] safeGlobalUnlock.restype = BOOL + wcslen = CheckedCall(msvcrt.wcslen) + wcslen.argtypes = [c_wchar_p] + wcslen.restype = UINT + GMEM_MOVEABLE = 0x0002 CF_UNICODETEXT = 13 @@ -129,13 +134,13 @@ def copy_windows(text): # If the hMem parameter identifies a memory object, # the object must have been allocated using the # function with the GMEM_MOVEABLE flag. - count = len(text) + 1 + count = wcslen(text) + 1 handle = safeGlobalAlloc(GMEM_MOVEABLE, count * sizeof(c_wchar)) locked_handle = safeGlobalLock(handle) - ctypes.memmove(c_wchar_p(locked_handle), - c_wchar_p(text), count * sizeof(c_wchar)) + ctypes.memmove(c_wchar_p(locked_handle), c_wchar_p(text), + count * sizeof(c_wchar)) safeGlobalUnlock(handle) safeSetClipboardData(CF_UNICODETEXT, handle) diff --git a/pandas/io/excel.py b/pandas/io/excel.py index 3a7c39ec65309..9e5e9f4f0d4f6 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -5,6 +5,7 @@ # --------------------------------------------------------------------- # ExcelFile class import abc +from collections import OrderedDict from datetime import date, datetime, time, timedelta from distutils.version import LooseVersion from io import UnsupportedOperation @@ -17,7 +18,7 @@ import pandas._libs.json as json import pandas.compat as compat from pandas.compat import ( - OrderedDict, add_metaclass, lrange, map, range, string_types, u, zip) + add_metaclass, lrange, map, range, string_types, u, zip) from pandas.errors import EmptyDataError from pandas.util._decorators import Appender, deprecate_kwarg @@ -274,7 +275,7 @@ def register_writer(klass): """Adds engine to the excel writer registry. You must use this method to integrate with ``to_excel``. Also adds config options for any new ``supported_extensions`` defined on the writer.""" - if not compat.callable(klass): + if not callable(klass): raise ValueError("Can only register callables as engines") engine_name = klass.engine _writers[engine_name] = klass @@ -375,60 +376,25 @@ def read_excel(io, **kwds) -class _XlrdReader(object): - - def __init__(self, filepath_or_buffer): - """Reader using xlrd engine. - - Parameters - ---------- - filepath_or_buffer : string, path object or Workbook - Object to be parsed. - """ - err_msg = "Install xlrd >= 1.0.0 for Excel support" - - try: - import xlrd - except ImportError: - raise ImportError(err_msg) - else: - if xlrd.__VERSION__ < LooseVersion("1.0.0"): - raise ImportError(err_msg + - ". Current version " + xlrd.__VERSION__) +@add_metaclass(abc.ABCMeta) +class _BaseExcelReader(object): - # If filepath_or_buffer is a url, want to keep the data as bytes so - # can't pass to get_filepath_or_buffer() - if _is_url(filepath_or_buffer): - filepath_or_buffer = _urlopen(filepath_or_buffer) - elif not isinstance(filepath_or_buffer, (ExcelFile, xlrd.Book)): - filepath_or_buffer, _, _, _ = get_filepath_or_buffer( - filepath_or_buffer) + @property + @abc.abstractmethod + def sheet_names(self): + pass - if isinstance(filepath_or_buffer, xlrd.Book): - self.book = filepath_or_buffer - elif not isinstance(filepath_or_buffer, xlrd.Book) and hasattr( - filepath_or_buffer, "read"): - # N.B. xlrd.Book has a read attribute too - if hasattr(filepath_or_buffer, 'seek'): - try: - # GH 19779 - filepath_or_buffer.seek(0) - except UnsupportedOperation: - # HTTPResponse does not support seek() - # GH 20434 - pass + @abc.abstractmethod + def get_sheet_by_name(self, name): + pass - data = filepath_or_buffer.read() - self.book = xlrd.open_workbook(file_contents=data) - elif isinstance(filepath_or_buffer, compat.string_types): - self.book = xlrd.open_workbook(filepath_or_buffer) - else: - raise ValueError('Must explicitly set engine if not passing in' - ' buffer or path for io.') + @abc.abstractmethod + def get_sheet_by_index(self, index): + pass - @property - def sheet_names(self): - return self.book.sheet_names() + @abc.abstractmethod + def get_sheet_data(self, sheet, convert_float): + pass def parse(self, sheet_name=0, @@ -455,48 +421,6 @@ def parse(self, _validate_header_arg(header) - from xlrd import (xldate, XL_CELL_DATE, - XL_CELL_ERROR, XL_CELL_BOOLEAN, - XL_CELL_NUMBER) - - epoch1904 = self.book.datemode - - def _parse_cell(cell_contents, cell_typ): - """converts the contents of the cell into a pandas - appropriate object""" - - if cell_typ == XL_CELL_DATE: - - # Use the newer xlrd datetime handling. - try: - cell_contents = xldate.xldate_as_datetime( - cell_contents, epoch1904) - except OverflowError: - return cell_contents - - # Excel doesn't distinguish between dates and time, - # so we treat dates on the epoch as times only. - # Also, Excel supports 1900 and 1904 epochs. - year = (cell_contents.timetuple())[0:3] - if ((not epoch1904 and year == (1899, 12, 31)) or - (epoch1904 and year == (1904, 1, 1))): - cell_contents = time(cell_contents.hour, - cell_contents.minute, - cell_contents.second, - cell_contents.microsecond) - - elif cell_typ == XL_CELL_ERROR: - cell_contents = np.nan - elif cell_typ == XL_CELL_BOOLEAN: - cell_contents = bool(cell_contents) - elif convert_float and cell_typ == XL_CELL_NUMBER: - # GH5394 - Excel 'numbers' are always floats - # it's a minimal perf hit and less surprising - val = int(cell_contents) - if val == cell_contents: - cell_contents = val - return cell_contents - ret_dict = False # Keep sheetname to maintain backwards compatibility. @@ -504,7 +428,7 @@ def _parse_cell(cell_contents, cell_typ): sheets = sheet_name ret_dict = True elif sheet_name is None: - sheets = self.book.sheet_names() + sheets = self.sheet_names ret_dict = True else: sheets = [sheet_name] @@ -519,19 +443,13 @@ def _parse_cell(cell_contents, cell_typ): print("Reading sheet {sheet}".format(sheet=asheetname)) if isinstance(asheetname, compat.string_types): - sheet = self.book.sheet_by_name(asheetname) + sheet = self.get_sheet_by_name(asheetname) else: # assume an integer if not a string - sheet = self.book.sheet_by_index(asheetname) + sheet = self.get_sheet_by_index(asheetname) - data = [] + data = self.get_sheet_data(sheet, convert_float) usecols = _maybe_convert_usecols(usecols) - for i in range(sheet.nrows): - row = [_parse_cell(value, typ) - for value, typ in zip(sheet.row_values(i), - sheet.row_types(i))] - data.append(row) - if sheet.nrows == 0: output[asheetname] = DataFrame() continue @@ -620,6 +538,120 @@ def _parse_cell(cell_contents, cell_typ): return output[asheetname] +class _XlrdReader(_BaseExcelReader): + + def __init__(self, filepath_or_buffer): + """Reader using xlrd engine. + + Parameters + ---------- + filepath_or_buffer : string, path object or Workbook + Object to be parsed. + """ + err_msg = "Install xlrd >= 1.0.0 for Excel support" + + try: + import xlrd + except ImportError: + raise ImportError(err_msg) + else: + if xlrd.__VERSION__ < LooseVersion("1.0.0"): + raise ImportError(err_msg + + ". Current version " + xlrd.__VERSION__) + + # If filepath_or_buffer is a url, want to keep the data as bytes so + # can't pass to get_filepath_or_buffer() + if _is_url(filepath_or_buffer): + filepath_or_buffer = _urlopen(filepath_or_buffer) + elif not isinstance(filepath_or_buffer, (ExcelFile, xlrd.Book)): + filepath_or_buffer, _, _, _ = get_filepath_or_buffer( + filepath_or_buffer) + + if isinstance(filepath_or_buffer, xlrd.Book): + self.book = filepath_or_buffer + elif hasattr(filepath_or_buffer, "read"): + # N.B. xlrd.Book has a read attribute too + if hasattr(filepath_or_buffer, 'seek'): + try: + # GH 19779 + filepath_or_buffer.seek(0) + except UnsupportedOperation: + # HTTPResponse does not support seek() + # GH 20434 + pass + + data = filepath_or_buffer.read() + self.book = xlrd.open_workbook(file_contents=data) + elif isinstance(filepath_or_buffer, compat.string_types): + self.book = xlrd.open_workbook(filepath_or_buffer) + else: + raise ValueError('Must explicitly set engine if not passing in' + ' buffer or path for io.') + + @property + def sheet_names(self): + return self.book.sheet_names() + + def get_sheet_by_name(self, name): + return self.book.sheet_by_name(name) + + def get_sheet_by_index(self, index): + return self.book.sheet_by_index(index) + + def get_sheet_data(self, sheet, convert_float): + from xlrd import (xldate, XL_CELL_DATE, + XL_CELL_ERROR, XL_CELL_BOOLEAN, + XL_CELL_NUMBER) + + epoch1904 = self.book.datemode + + def _parse_cell(cell_contents, cell_typ): + """converts the contents of the cell into a pandas + appropriate object""" + + if cell_typ == XL_CELL_DATE: + + # Use the newer xlrd datetime handling. + try: + cell_contents = xldate.xldate_as_datetime( + cell_contents, epoch1904) + except OverflowError: + return cell_contents + + # Excel doesn't distinguish between dates and time, + # so we treat dates on the epoch as times only. + # Also, Excel supports 1900 and 1904 epochs. + year = (cell_contents.timetuple())[0:3] + if ((not epoch1904 and year == (1899, 12, 31)) or + (epoch1904 and year == (1904, 1, 1))): + cell_contents = time(cell_contents.hour, + cell_contents.minute, + cell_contents.second, + cell_contents.microsecond) + + elif cell_typ == XL_CELL_ERROR: + cell_contents = np.nan + elif cell_typ == XL_CELL_BOOLEAN: + cell_contents = bool(cell_contents) + elif convert_float and cell_typ == XL_CELL_NUMBER: + # GH5394 - Excel 'numbers' are always floats + # it's a minimal perf hit and less surprising + val = int(cell_contents) + if val == cell_contents: + cell_contents = val + return cell_contents + + data = [] + + for i in range(sheet.nrows): + row = [_parse_cell(value, typ) + for value, typ in zip(sheet.row_values(i), + sheet.row_types(i))] + data.append(row) + + return data + + class ExcelFile(object): """ Class for parsing tabular excel sheets into DataFrame objects. @@ -971,7 +1003,7 @@ class ExcelWriter(object): mode : {'w' or 'a'}, default 'w' File mode to use (write or append). - .. versionadded:: 0.24.0 + .. versionadded:: 0.24.0 Attributes ---------- diff --git a/pandas/io/formats/console.py b/pandas/io/formats/console.py index d5ef9f61bc132..ad63b3efdd832 100644 --- a/pandas/io/formats/console.py +++ b/pandas/io/formats/console.py @@ -108,44 +108,6 @@ def check_main(): return check_main() -def in_qtconsole(): - """ - check if we're inside an IPython qtconsole - - .. deprecated:: 0.14.1 - This is no longer needed, or working, in IPython 3 and above. - """ - try: - ip = get_ipython() # noqa - front_end = ( - ip.config.get('KernelApp', {}).get('parent_appname', "") or - ip.config.get('IPKernelApp', {}).get('parent_appname', "")) - if 'qtconsole' in front_end.lower(): - return True - except NameError: - return False - return False - - -def in_ipnb(): - """ - check if we're inside an IPython Notebook - - .. deprecated:: 0.14.1 - This is no longer needed, or working, in IPython 3 and above. - """ - try: - ip = get_ipython() # noqa - front_end = ( - ip.config.get('KernelApp', {}).get('parent_appname', "") or - ip.config.get('IPKernelApp', {}).get('parent_appname', "")) - if 'notebook' in front_end.lower(): - return True - except NameError: - return False - return False - - def in_ipython_frontend(): """ check if we're inside an an IPython zmq frontend diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index bdeed58d856cc..f68ef2cc39006 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -435,9 +435,6 @@ def _chk_truncate(self): """ from pandas.core.reshape.concat import concat - # Column of which first element is used to determine width of a dot col - self.tr_size_col = -1 - # Cut the data to the information actually printed max_cols = self.max_cols max_rows = self.max_rows @@ -556,10 +553,7 @@ def _to_str_columns(self): if truncate_h: col_num = self.tr_col_num - # infer from column header - col_width = self.adj.len(strcols[self.tr_size_col][0]) - strcols.insert(self.tr_col_num + 1, ['...'.center(col_width)] * - (len(str_index))) + strcols.insert(self.tr_col_num + 1, [' ...'] * (len(str_index))) if truncate_v: n_header_rows = len(str_index) - len(frame) row_num = self.tr_row_num @@ -577,8 +571,8 @@ def _to_str_columns(self): if ix == 0: dot_mode = 'left' elif is_dot_col: - cwidth = self.adj.len(strcols[self.tr_size_col][0]) - dot_mode = 'center' + cwidth = 4 + dot_mode = 'right' else: dot_mode = 'right' dot_str = self.adj.justify([my_str], cwidth, mode=dot_mode)[0] @@ -1066,19 +1060,26 @@ def get_result_as_array(self): def format_values_with(float_format): formatter = self._value_formatter(float_format, threshold) + # default formatter leaves a space to the left when formatting + # floats, must be consistent for left-justifying NaNs (GH #25061) + if self.justify == 'left': + na_rep = ' ' + self.na_rep + else: + na_rep = self.na_rep + # separate the wheat from the chaff values = self.values mask = isna(values) if hasattr(values, 'to_dense'): # sparse numpy ndarray values = values.to_dense() values = np.array(values, dtype='object') - values[mask] = self.na_rep + values[mask] = na_rep imask = (~mask).ravel() values.flat[imask] = np.array([formatter(val) for val in values.ravel()[imask]]) if self.fixed_width: - return _trim_zeros(values, self.na_rep) + return _trim_zeros(values, na_rep) return values @@ -1414,16 +1415,20 @@ def _trim_zeros(str_floats, na_rep='NaN'): """ trimmed = str_floats + def _is_number(x): + return (x != na_rep and not x.endswith('inf')) + def _cond(values): - non_na = [x for x in values if x != na_rep] - return (len(non_na) > 0 and all(x.endswith('0') for x in non_na) and - not (any(('e' in x) or ('E' in x) for x in non_na))) + finite = [x for x in values if _is_number(x)] + return (len(finite) > 0 and all(x.endswith('0') for x in finite) and + not (any(('e' in x) or ('E' in x) for x in finite))) while _cond(trimmed): - trimmed = [x[:-1] if x != na_rep else x for x in trimmed] + trimmed = [x[:-1] if _is_number(x) else x for x in trimmed] # leave one 0 after the decimal points if need be. - return [x + "0" if x.endswith('.') and x != na_rep else x for x in trimmed] + return [x + "0" if x.endswith('.') and _is_number(x) else x + for x in trimmed] def _has_names(index): diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 722fcd6bb39af..66d13bf2668f9 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -5,14 +5,14 @@ from __future__ import print_function +from collections import OrderedDict from textwrap import dedent -from pandas.compat import OrderedDict, lzip, map, range, u, unichr, zip +from pandas.compat import lzip, map, range, u, unichr, zip from pandas.core.dtypes.generic import ABCMultiIndex from pandas import compat, option_context -import pandas.core.common as com from pandas.core.config import get_option from pandas.io.common import _is_url @@ -190,7 +190,7 @@ def _write_col_header(self, indent): if self.fmt.sparsify: # GH3547 - sentinel = com.sentinel_factory() + sentinel = object() else: sentinel = False levels = self.columns.format(sparsify=sentinel, adjoin=False, @@ -392,7 +392,7 @@ def _write_hierarchical_rows(self, fmt_values, indent): if self.fmt.sparsify: # GH3547 - sentinel = com.sentinel_factory() + sentinel = object() levels = frame.index.format(sparsify=sentinel, adjoin=False, names=False) diff --git a/pandas/io/formats/style.py b/pandas/io/formats/style.py index 598453eb92d25..d241528d9779b 100644 --- a/pandas/io/formats/style.py +++ b/pandas/io/formats/style.py @@ -81,7 +81,7 @@ class Styler(object): See Also -------- - pandas.DataFrame.style + DataFrame.style Notes ----- @@ -433,7 +433,7 @@ def render(self, **kwargs): Returns ------- rendered : str - the rendered HTML + The rendered HTML Notes ----- @@ -1223,7 +1223,7 @@ def from_custom_template(cls, searchpath, name): Returns ------- MyStyler : subclass of Styler - has the correct ``env`` and ``template`` class attributes set. + Has the correct ``env`` and ``template`` class attributes set. """ loader = ChoiceLoader([ FileSystemLoader(searchpath), @@ -1322,7 +1322,7 @@ def _get_level_lengths(index, hidden_elements=None): Result is a dictionary of (level, inital_position): span """ - sentinel = com.sentinel_factory() + sentinel = object() levels = index.format(sparsify=sentinel, adjoin=False, names=False) if hidden_elements is None: diff --git a/pandas/io/gbq.py b/pandas/io/gbq.py index 639b68d433ac6..a6cec7ea8fb16 100644 --- a/pandas/io/gbq.py +++ b/pandas/io/gbq.py @@ -127,7 +127,7 @@ def read_gbq(query, project_id=None, index_col=None, col_order=None, See Also -------- pandas_gbq.read_gbq : This function in the pandas-gbq library. - pandas.DataFrame.to_gbq : Write a DataFrame to Google BigQuery. + DataFrame.to_gbq : Write a DataFrame to Google BigQuery. """ pandas_gbq = _try_import() diff --git a/pandas/io/html.py b/pandas/io/html.py index 74934740a6957..347bb3eec54af 100644 --- a/pandas/io/html.py +++ b/pandas/io/html.py @@ -988,7 +988,7 @@ def read_html(io, match='.+', flavor=None, header=None, index_col=None, latest information on table attributes for the modern web. parse_dates : bool, optional - See :func:`~pandas.read_csv` for more details. + See :func:`~read_csv` for more details. tupleize_cols : bool, optional If ``False`` try to parse multiple header rows into a @@ -1043,7 +1043,7 @@ def read_html(io, match='.+', flavor=None, header=None, index_col=None, See Also -------- - pandas.read_csv + read_csv Notes ----- @@ -1066,7 +1066,7 @@ def read_html(io, match='.+', flavor=None, header=None, index_col=None, .. versionadded:: 0.21.0 - Similar to :func:`~pandas.read_csv` the `header` argument is applied + Similar to :func:`~read_csv` the `header` argument is applied **after** `skiprows` is applied. This function will *always* return a list of :class:`DataFrame` *or* diff --git a/pandas/io/json/table_schema.py b/pandas/io/json/table_schema.py index 2bd93b19d4225..971386c91944e 100644 --- a/pandas/io/json/table_schema.py +++ b/pandas/io/json/table_schema.py @@ -314,12 +314,13 @@ def parse_table_schema(json, precise_float): df = df.astype(dtypes) - df = df.set_index(table['schema']['primaryKey']) - if len(df.index.names) == 1: - if df.index.name == 'index': - df.index.name = None - else: - df.index.names = [None if x.startswith('level_') else x for x in - df.index.names] + if 'primaryKey' in table['schema']: + df = df.set_index(table['schema']['primaryKey']) + if len(df.index.names) == 1: + if df.index.name == 'index': + df.index.name = None + else: + df.index.names = [None if x.startswith('level_') else x for x in + df.index.names] return df diff --git a/pandas/io/msgpack/_packer.pyx b/pandas/io/msgpack/_packer.pyx index d67c632188e62..8e2d943d8ddb1 100644 --- a/pandas/io/msgpack/_packer.pyx +++ b/pandas/io/msgpack/_packer.pyx @@ -74,14 +74,15 @@ cdef class Packer(object): Use bin type introduced in msgpack spec 2.0 for bytes. It also enable str8 type for unicode. """ - cdef msgpack_packer pk - cdef object _default - cdef object _bencoding - cdef object _berrors - cdef char *encoding - cdef char *unicode_errors - cdef bint use_float - cdef bint autoreset + cdef: + msgpack_packer pk + object _default + object _bencoding + object _berrors + char *encoding + char *unicode_errors + bint use_float + bint autoreset def __cinit__(self): cdef int buf_size = 1024 * 1024 @@ -123,16 +124,17 @@ cdef class Packer(object): cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: - cdef long long llval - cdef unsigned long long ullval - cdef long longval - cdef float fval - cdef double dval - cdef char* rawval - cdef int ret - cdef dict d - cdef size_t L - cdef int default_used = 0 + cdef: + long long llval + unsigned long long ullval + long longval + float fval + double dval + char* rawval + int ret + dict d + size_t L + int default_used = 0 if nest_limit < 0: raise PackValueError("recursion limit exceeded.") diff --git a/pandas/io/msgpack/_unpacker.pyx b/pandas/io/msgpack/_unpacker.pyx index 0c50aa5e68103..9bbfe749ef9ba 100644 --- a/pandas/io/msgpack/_unpacker.pyx +++ b/pandas/io/msgpack/_unpacker.pyx @@ -120,14 +120,15 @@ def unpackb(object packed, object object_hook=None, object list_hook=None, See :class:`Unpacker` for options. """ - cdef unpack_context ctx - cdef size_t off = 0 - cdef int ret + cdef: + unpack_context ctx + size_t off = 0 + int ret - cdef char* buf - cdef Py_ssize_t buf_len - cdef char* cenc = NULL - cdef char* cerr = NULL + char* buf + Py_ssize_t buf_len + char* cenc = NULL + char* cerr = NULL PyObject_AsReadBuffer(packed, &buf, &buf_len) @@ -243,16 +244,17 @@ cdef class Unpacker(object): for o in unpacker: process(o) """ - cdef unpack_context ctx - cdef char* buf - cdef size_t buf_size, buf_head, buf_tail - cdef object file_like - cdef object file_like_read - cdef Py_ssize_t read_size - # To maintain refcnt. - cdef object object_hook, object_pairs_hook, list_hook, ext_hook - cdef object encoding, unicode_errors - cdef size_t max_buffer_size + cdef: + unpack_context ctx + char* buf + size_t buf_size, buf_head, buf_tail + object file_like + object file_like_read + Py_ssize_t read_size + # To maintain refcnt. + object object_hook, object_pairs_hook, list_hook, ext_hook + object encoding, unicode_errors + size_t max_buffer_size def __cinit__(self): self.buf = NULL @@ -270,8 +272,9 @@ cdef class Unpacker(object): Py_ssize_t max_array_len=2147483647, Py_ssize_t max_map_len=2147483647, Py_ssize_t max_ext_len=2147483647): - cdef char *cenc=NULL, - cdef char *cerr=NULL + cdef: + char *cenc=NULL, + char *cerr=NULL self.object_hook = object_hook self.object_pairs_hook = object_pairs_hook @@ -388,9 +391,10 @@ cdef class Unpacker(object): cdef object _unpack(self, execute_fn execute, object write_bytes, bint iter=0): - cdef int ret - cdef object obj - cdef size_t prev_head + cdef: + int ret + object obj + size_t prev_head if self.buf_head >= self.buf_tail and self.file_like is not None: self.read_from_file() diff --git a/pandas/io/packers.py b/pandas/io/packers.py index efe4e3a91c69c..588d63d73515f 100644 --- a/pandas/io/packers.py +++ b/pandas/io/packers.py @@ -219,7 +219,7 @@ def read(fh): finally: if fh is not None: fh.close() - elif hasattr(path_or_buf, 'read') and compat.callable(path_or_buf.read): + elif hasattr(path_or_buf, 'read') and callable(path_or_buf.read): # treat as a buffer like return read(path_or_buf) diff --git a/pandas/io/parsers.py b/pandas/io/parsers.py index b31d3f665f47f..4163a571df800 100755 --- a/pandas/io/parsers.py +++ b/pandas/io/parsers.py @@ -203,9 +203,14 @@ * dict, e.g. {{'foo' : [1, 3]}} -> parse columns 1, 3 as date and call result 'foo' - If a column or index contains an unparseable date, the entire column or - index will be returned unaltered as an object data type. For non-standard - datetime parsing, use ``pd.to_datetime`` after ``pd.read_csv`` + If a column or index cannot be represented as an array of datetimes, + say because of an unparseable value or a mixture of timezones, the column + or index will be returned unaltered as an object data type. For + non-standard datetime parsing, use ``pd.to_datetime`` after + ``pd.read_csv``. To parse an index or column with a mixture of timezones, + specify ``date_parser`` to be a partially-applied + :func:`pandas.to_datetime` with ``utc=True``. See + :ref:`io.csv.mixed_timezones` for more. Note: A fast-path exists for iso8601-formatted dates. infer_datetime_format : bool, default False diff --git a/pandas/io/pickle.py b/pandas/io/pickle.py index 789f55a62dc58..ab4a266853a78 100644 --- a/pandas/io/pickle.py +++ b/pandas/io/pickle.py @@ -1,8 +1,7 @@ """ pickle compat """ import warnings -import numpy as np -from numpy.lib.format import read_array, write_array +from numpy.lib.format import read_array from pandas.compat import PY3, BytesIO, cPickle as pkl, pickle_compat as pc @@ -76,6 +75,7 @@ def to_pickle(obj, path, compression='infer', protocol=pkl.HIGHEST_PROTOCOL): try: f.write(pkl.dumps(obj, protocol=protocol)) finally: + f.close() for _f in fh: _f.close() @@ -138,63 +138,32 @@ def read_pickle(path, compression='infer'): >>> os.remove("./dummy.pkl") """ path = _stringify_path(path) + f, fh = _get_handle(path, 'rb', compression=compression, is_text=False) + + # 1) try with cPickle + # 2) try with the compat pickle to handle subclass changes + # 3) pass encoding only if its not None as py2 doesn't handle the param - def read_wrapper(func): - # wrapper file handle open/close operation - f, fh = _get_handle(path, 'rb', - compression=compression, - is_text=False) - try: - return func(f) - finally: - for _f in fh: - _f.close() - - def try_read(path, encoding=None): - # try with cPickle - # try with current pickle, if we have a Type Error then - # try with the compat pickle to handle subclass changes - # pass encoding only if its not None as py2 doesn't handle - # the param - - # cpickle - # GH 6899 - try: - with warnings.catch_warnings(record=True): - # We want to silence any warnings about, e.g. moved modules. - warnings.simplefilter("ignore", Warning) - return read_wrapper(lambda f: pkl.load(f)) - except Exception: # noqa: E722 - # reg/patched pickle - # compat not used in pandas/compat/pickle_compat.py::load - # TODO: remove except block OR modify pc.load to use compat - try: - return read_wrapper( - lambda f: pc.load(f, encoding=encoding, compat=False)) - # compat pickle - except Exception: # noqa: E722 - return read_wrapper( - lambda f: pc.load(f, encoding=encoding, compat=True)) try: - return try_read(path) + with warnings.catch_warnings(record=True): + # We want to silence any warnings about, e.g. moved modules. + warnings.simplefilter("ignore", Warning) + return pkl.load(f) except Exception: # noqa: E722 - if PY3: - return try_read(path, encoding='latin1') - raise - + try: + return pc.load(f, encoding=None) + except Exception: # noqa: E722 + if PY3: + return pc.load(f, encoding='latin1') + raise + finally: + f.close() + for _f in fh: + _f.close() # compat with sparse pickle / unpickle -def _pickle_array(arr): - arr = arr.view(np.ndarray) - - buf = BytesIO() - write_array(buf, arr) - - return buf.getvalue() - - def _unpickle_array(bytes): arr = read_array(BytesIO(bytes)) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 4e103482f48a2..2ee8759b9bdd8 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -15,34 +15,29 @@ import numpy as np -from pandas._libs import algos, lib, writers as libwriters +from pandas._libs import lib, writers as libwriters from pandas._libs.tslibs import timezones from pandas.compat import PY3, filter, lrange, range, string_types from pandas.errors import PerformanceWarning from pandas.core.dtypes.common import ( - ensure_int64, ensure_object, ensure_platform_int, is_categorical_dtype, - is_datetime64_dtype, is_datetime64tz_dtype, is_list_like, - is_timedelta64_dtype) + ensure_object, is_categorical_dtype, is_datetime64_dtype, + is_datetime64tz_dtype, is_list_like, is_timedelta64_dtype) from pandas.core.dtypes.missing import array_equivalent from pandas import ( - DataFrame, DatetimeIndex, Index, Int64Index, MultiIndex, Panel, - PeriodIndex, Series, SparseDataFrame, SparseSeries, TimedeltaIndex, compat, - concat, isna, to_datetime) + DataFrame, DatetimeIndex, Index, Int64Index, MultiIndex, PeriodIndex, + Series, SparseDataFrame, SparseSeries, TimedeltaIndex, compat, concat, + isna, to_datetime) from pandas.core import config -from pandas.core.algorithms import match, unique -from pandas.core.arrays.categorical import ( - Categorical, _factorize_from_iterables) +from pandas.core.arrays.categorical import Categorical from pandas.core.arrays.sparse import BlockIndex, IntIndex from pandas.core.base import StringMixin import pandas.core.common as com from pandas.core.computation.pytables import Expr, maybe_expression from pandas.core.config import get_option from pandas.core.index import ensure_index -from pandas.core.internals import ( - BlockManager, _block2d_to_blocknd, _block_shape, _factor_indexer, - make_block) +from pandas.core.internals import BlockManager, _block_shape, make_block from pandas.io.common import _stringify_path from pandas.io.formats.printing import adjoin, pprint_thing @@ -175,7 +170,6 @@ class DuplicateWarning(Warning): SparseSeries: u'sparse_series', DataFrame: u'frame', SparseDataFrame: u'sparse_frame', - Panel: u'wide', } # storer class map @@ -187,7 +181,6 @@ class DuplicateWarning(Warning): u'sparse_series': 'SparseSeriesFixed', u'frame': 'FrameFixed', u'sparse_frame': 'SparseFrameFixed', - u'wide': 'PanelFixed', } # table class map @@ -197,16 +190,12 @@ class DuplicateWarning(Warning): u'appendable_multiseries': 'AppendableMultiSeriesTable', u'appendable_frame': 'AppendableFrameTable', u'appendable_multiframe': 'AppendableMultiFrameTable', - u'appendable_panel': 'AppendablePanelTable', u'worm': 'WORMTable', - u'legacy_frame': 'LegacyFrameTable', - u'legacy_panel': 'LegacyPanelTable', } # axes map _AXES_MAP = { DataFrame: [0], - Panel: [1, 2] } # register our configuration options @@ -326,8 +315,8 @@ def read_hdf(path_or_buf, key=None, mode='r', **kwargs): See Also -------- - pandas.DataFrame.to_hdf : Write a HDF file from a DataFrame. - pandas.HDFStore : Low-level access to HDF files. + DataFrame.to_hdf : Write a HDF file from a DataFrame. + HDFStore : Low-level access to HDF files. Examples -------- @@ -865,7 +854,7 @@ def put(self, key, value, format=None, append=False, **kwargs): Parameters ---------- key : object - value : {Series, DataFrame, Panel} + value : {Series, DataFrame} format : 'fixed(f)|table(t)', default is 'fixed' fixed(f) : Fixed format Fast writing/reading. Not-appendable, nor searchable @@ -947,7 +936,7 @@ def append(self, key, value, format=None, append=True, columns=None, Parameters ---------- key : object - value : {Series, DataFrame, Panel} + value : {Series, DataFrame} format : 'table' is the default table(t) : table format Write as a PyTables Table structure which may perform @@ -3028,16 +3017,6 @@ class FrameFixed(BlockManagerFixed): obj_type = DataFrame -class PanelFixed(BlockManagerFixed): - pandas_kind = u'wide' - obj_type = Panel - is_shape_reversed = True - - def write(self, obj, **kwargs): - obj._consolidate_inplace() - return super(PanelFixed, self).write(obj, **kwargs) - - class Table(Fixed): """ represent a table: @@ -3288,7 +3267,7 @@ def get_attrs(self): self.nan_rep = getattr(self.attrs, 'nan_rep', None) self.encoding = _ensure_encoding( getattr(self.attrs, 'encoding', None)) - self.errors = getattr(self.attrs, 'errors', 'strict') + self.errors = _ensure_decoded(getattr(self.attrs, 'errors', 'strict')) self.levels = getattr( self.attrs, 'levels', None) or [] self.index_axes = [ @@ -3900,107 +3879,11 @@ def read(self, where=None, columns=None, **kwargs): if not self.read_axes(where=where, **kwargs): return None - lst_vals = [a.values for a in self.index_axes] - labels, levels = _factorize_from_iterables(lst_vals) - # labels and levels are tuples but lists are expected - labels = list(labels) - levels = list(levels) - N = [len(lvl) for lvl in levels] - - # compute the key - key = _factor_indexer(N[1:], labels) - - objs = [] - if len(unique(key)) == len(key): - - sorter, _ = algos.groupsort_indexer( - ensure_int64(key), np.prod(N)) - sorter = ensure_platform_int(sorter) - - # create the objs - for c in self.values_axes: - - # the data need to be sorted - sorted_values = c.take_data().take(sorter, axis=0) - if sorted_values.ndim == 1: - sorted_values = sorted_values.reshape( - (sorted_values.shape[0], 1)) - - take_labels = [l.take(sorter) for l in labels] - items = Index(c.values) - block = _block2d_to_blocknd( - values=sorted_values, placement=np.arange(len(items)), - shape=tuple(N), labels=take_labels, ref_items=items) - - # create the object - mgr = BlockManager([block], [items] + levels) - obj = self.obj_type(mgr) - - # permute if needed - if self.is_transposed: - obj = obj.transpose( - *tuple(Series(self.data_orientation).argsort())) - - objs.append(obj) - - else: - warnings.warn(duplicate_doc, DuplicateWarning, stacklevel=5) - - # reconstruct - long_index = MultiIndex.from_arrays( - [i.values for i in self.index_axes]) - - for c in self.values_axes: - lp = DataFrame(c.data, index=long_index, columns=c.values) - - # need a better algorithm - tuple_index = long_index.values - - unique_tuples = unique(tuple_index) - unique_tuples = com.asarray_tuplesafe(unique_tuples) - - indexer = match(unique_tuples, tuple_index) - indexer = ensure_platform_int(indexer) - - new_index = long_index.take(indexer) - new_values = lp.values.take(indexer, axis=0) - - lp = DataFrame(new_values, index=new_index, columns=lp.columns) - objs.append(lp.to_panel()) - - # create the composite object - if len(objs) == 1: - wp = objs[0] - else: - wp = concat(objs, axis=0, verify_integrity=False)._consolidate() - - # apply the selection filters & axis orderings - wp = self.process_axes(wp, columns=columns) - - return wp - - -class LegacyFrameTable(LegacyTable): - - """ support the legacy frame table """ - pandas_kind = u'frame_table' - table_type = u'legacy_frame' - obj_type = Panel - - def read(self, *args, **kwargs): - return super(LegacyFrameTable, self).read(*args, **kwargs)['value'] - - -class LegacyPanelTable(LegacyTable): - - """ support the legacy panel table """ - table_type = u'legacy_panel' - obj_type = Panel + raise NotImplementedError("Panel is removed in pandas 0.25.0") class AppendableTable(LegacyTable): - - """ suppor the new appendable table formats """ + """ support the new appendable table formats """ _indexables = None table_type = u'appendable' @@ -4232,8 +4115,7 @@ def delete(self, where=None, start=None, stop=None, **kwargs): class AppendableFrameTable(AppendableTable): - - """ suppor the new appendable table formats """ + """ support the new appendable table formats """ pandas_kind = u'frame_table' table_type = u'appendable_frame' ndim = 2 @@ -4442,24 +4324,6 @@ def read(self, **kwargs): return df -class AppendablePanelTable(AppendableTable): - - """ suppor the new appendable table formats """ - table_type = u'appendable_panel' - ndim = 3 - obj_type = Panel - - def get_object(self, obj): - """ these are written transposed """ - if self.is_transposed: - obj = obj.transpose(*self.data_orientation) - return obj - - @property - def is_transposed(self): - return self.data_orientation != tuple(range(self.ndim)) - - def _reindex_axis(obj, axis, labels, other=None): ax = obj._get_axis(axis) labels = ensure_index(labels) @@ -4875,16 +4739,3 @@ def select_coords(self): return self.coordinates return np.arange(start, stop) - -# utilities ### - - -def timeit(key, df, fn=None, remove=True, **kwargs): - if fn is None: - fn = 'timeit.h5' - store = HDFStore(fn, mode='w') - store.append(key, df, **kwargs) - store.close() - - if remove: - os.remove(fn) diff --git a/pandas/io/sas/sas.pyx b/pandas/io/sas/sas.pyx index a5bfd5866a261..9b8fba16741f6 100644 --- a/pandas/io/sas/sas.pyx +++ b/pandas/io/sas/sas.pyx @@ -203,11 +203,12 @@ cdef enum ColumnTypes: # type the page_data types -cdef int page_meta_type = const.page_meta_type -cdef int page_mix_types_0 = const.page_mix_types[0] -cdef int page_mix_types_1 = const.page_mix_types[1] -cdef int page_data_type = const.page_data_type -cdef int subheader_pointers_offset = const.subheader_pointers_offset +cdef: + int page_meta_type = const.page_meta_type + int page_mix_types_0 = const.page_mix_types[0] + int page_mix_types_1 = const.page_mix_types[1] + int page_data_type = const.page_data_type + int subheader_pointers_offset = const.subheader_pointers_offset cdef class Parser(object): diff --git a/pandas/io/sql.py b/pandas/io/sql.py index 5d1163b3e0024..aaface5415384 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -381,7 +381,8 @@ def read_sql(sql, con, index_col=None, coerce_float=True, params=None, try: _is_table_name = pandas_sql.has_table(sql) - except (ImportError, AttributeError): + except Exception: + # using generic exception to catch errors from sql drivers (GH24988) _is_table_name = False if _is_table_name: diff --git a/pandas/io/stata.py b/pandas/io/stata.py index 1b0660171ecac..62a9dbdc4657e 100644 --- a/pandas/io/stata.py +++ b/pandas/io/stata.py @@ -100,8 +100,8 @@ See Also -------- -pandas.io.stata.StataReader : Low-level reader for Stata data files. -pandas.DataFrame.to_stata: Export Stata data files. +io.stata.StataReader : Low-level reader for Stata data files. +DataFrame.to_stata: Export Stata data files. Examples -------- @@ -119,7 +119,7 @@ _iterator_params) _data_method_doc = """\ -Reads observations from Stata file, converting them into a dataframe +Read observations from Stata file, converting them into a dataframe .. deprecated:: This is a legacy method. Use `read` in new code. @@ -1726,18 +1726,22 @@ def _do_convert_categoricals(self, data, value_label_dict, lbllist, return data def data_label(self): - """Returns data label of Stata file""" + """ + Return data label of Stata file. + """ return self.data_label def variable_labels(self): - """Returns variable labels as a dict, associating each variable name - with corresponding label + """ + Return variable labels as a dict, associating each variable name + with corresponding label. """ return dict(zip(self.varlist, self._variable_labels)) def value_labels(self): - """Returns a dict, associating each variable name a dict, associating - each value its corresponding label + """ + Return a dict, associating each variable name a dict, associating + each value its corresponding label. """ if not self._value_labels_read: self._read_value_labels() @@ -1747,7 +1751,7 @@ def value_labels(self): def _open_file_binary_write(fname): """ - Open a binary file or no-op if file-like + Open a binary file or no-op if file-like. Parameters ---------- @@ -1778,14 +1782,14 @@ def _set_endianness(endianness): def _pad_bytes(name, length): """ - Takes a char string and pads it with null bytes until it's length chars + Take a char string and pads it with null bytes until it's length chars. """ return name + "\x00" * (length - len(name)) def _convert_datetime_to_stata_type(fmt): """ - Converts from one of the stata date formats to a type in TYPE_MAP + Convert from one of the stata date formats to a type in TYPE_MAP. """ if fmt in ["tc", "%tc", "td", "%td", "tw", "%tw", "tm", "%tm", "tq", "%tq", "th", "%th", "ty", "%ty"]: @@ -1812,7 +1816,7 @@ def _maybe_convert_to_int_keys(convert_dates, varlist): def _dtype_to_stata_type(dtype, column): """ - Converts dtype types to stata types. Returns the byte of the given ordinal. + Convert dtype types to stata types. Returns the byte of the given ordinal. See TYPE_MAP and comments for an explanation. This is also explained in the dta spec. 1 - 244 are strings of this length @@ -1850,7 +1854,7 @@ def _dtype_to_stata_type(dtype, column): def _dtype_to_default_stata_fmt(dtype, column, dta_version=114, force_strl=False): """ - Maps numpy dtype to stata's default format for this type. Not terribly + Map numpy dtype to stata's default format for this type. Not terribly important since users can change this in Stata. Semantics are object -> "%DDs" where DD is the length of the string. If not a string, @@ -2385,32 +2389,22 @@ def _prepare_data(self): data = self._convert_strls(data) # 3. Convert bad string data to '' and pad to correct length - dtypes = [] - data_cols = [] - has_strings = False + dtypes = {} native_byteorder = self._byteorder == _set_endianness(sys.byteorder) for i, col in enumerate(data): typ = typlist[i] if typ <= self._max_string_length: - has_strings = True data[col] = data[col].fillna('').apply(_pad_bytes, args=(typ,)) stype = 'S{type}'.format(type=typ) - dtypes.append(('c' + str(i), stype)) - string = data[col].str.encode(self._encoding) - data_cols.append(string.values.astype(stype)) + dtypes[col] = stype + data[col] = data[col].str.encode(self._encoding).astype(stype) else: - values = data[col].values dtype = data[col].dtype if not native_byteorder: dtype = dtype.newbyteorder(self._byteorder) - dtypes.append(('c' + str(i), dtype)) - data_cols.append(values) - dtypes = np.dtype(dtypes) + dtypes[col] = dtype - if has_strings or not native_byteorder: - self.data = np.fromiter(zip(*data_cols), dtype=dtypes) - else: - self.data = data.to_records(index=False) + self.data = data.to_records(index=False, column_dtypes=dtypes) def _write_data(self): data = self.data diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index 3ba06c0638317..a525b9cff1182 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -26,7 +26,6 @@ from pandas.core.generic import _shared_doc_kwargs, _shared_docs from pandas.io.formats.printing import pprint_thing -from pandas.plotting import _misc as misc from pandas.plotting._compat import _mpl_ge_3_0_0 from pandas.plotting._style import _get_standard_colors, plot_params from pandas.plotting._tools import ( @@ -40,7 +39,7 @@ else: _HAS_MPL = True if get_option('plotting.matplotlib.register_converters'): - _converter.register(explicit=True) + _converter.register(explicit=False) def _raise_if_no_mpl(): @@ -2549,7 +2548,7 @@ def boxplot_frame_groupby(grouped, subplots=True, column=None, fontsize=None, Parameters ---------- grouped : Grouped DataFrame - subplots : + subplots : bool * ``False`` - no subplots will be used * ``True`` - create a subplot for each group column : column name or list of names, or vector @@ -2906,15 +2905,6 @@ def pie(self, **kwds): """ return self(kind='pie', **kwds) - def lag(self, *args, **kwds): - return misc.lag_plot(self._parent, *args, **kwds) - - def autocorrelation(self, *args, **kwds): - return misc.autocorrelation_plot(self._parent, *args, **kwds) - - def bootstrap(self, *args, **kwds): - return misc.bootstrap_plot(self._parent, *args, **kwds) - class FramePlotMethods(BasePlotMethods): """DataFrame plotting accessor and method @@ -2967,7 +2957,7 @@ def line(self, x=None, y=None, **kwds): Either the location or the label of the columns to be used. By default, it will use the remaining DataFrame numeric columns. **kwds - Keyword arguments to pass on to :meth:`pandas.DataFrame.plot`. + Keyword arguments to pass on to :meth:`DataFrame.plot`. Returns ------- @@ -3032,7 +3022,7 @@ def bar(self, x=None, y=None, **kwds): all numerical columns are used. **kwds Additional keyword arguments are documented in - :meth:`pandas.DataFrame.plot`. + :meth:`DataFrame.plot`. Returns ------- @@ -3042,8 +3032,8 @@ def bar(self, x=None, y=None, **kwds): See Also -------- - pandas.DataFrame.plot.barh : Horizontal bar plot. - pandas.DataFrame.plot : Make plots of a DataFrame. + DataFrame.plot.barh : Horizontal bar plot. + DataFrame.plot : Make plots of a DataFrame. matplotlib.pyplot.bar : Make a bar plot with matplotlib. Examples @@ -3114,7 +3104,7 @@ def barh(self, x=None, y=None, **kwds): y : label or position, default All numeric columns in dataframe Columns to be plotted from the DataFrame. **kwds - Keyword arguments to pass on to :meth:`pandas.DataFrame.plot`. + Keyword arguments to pass on to :meth:`DataFrame.plot`. Returns ------- @@ -3122,8 +3112,8 @@ def barh(self, x=None, y=None, **kwds): See Also -------- - pandas.DataFrame.plot.bar: Vertical bar plot. - pandas.DataFrame.plot : Make plots of DataFrame using matplotlib. + DataFrame.plot.bar: Vertical bar plot. + DataFrame.plot : Make plots of DataFrame using matplotlib. matplotlib.axes.Axes.bar : Plot a vertical bar plot using matplotlib. Examples @@ -3201,7 +3191,7 @@ def box(self, by=None, **kwds): Column in the DataFrame to group by. **kwds : optional Additional keywords are documented in - :meth:`pandas.DataFrame.plot`. + :meth:`DataFrame.plot`. Returns ------- @@ -3209,8 +3199,8 @@ def box(self, by=None, **kwds): See Also -------- - pandas.DataFrame.boxplot: Another method to draw a box plot. - pandas.Series.plot.box: Draw a box plot from a Series object. + DataFrame.boxplot: Another method to draw a box plot. + Series.plot.box: Draw a box plot from a Series object. matplotlib.pyplot.boxplot: Draw a box plot in matplotlib. Examples @@ -3244,7 +3234,7 @@ def hist(self, by=None, bins=10, **kwds): Number of histogram bins to be used. **kwds Additional keyword arguments are documented in - :meth:`pandas.DataFrame.plot`. + :meth:`DataFrame.plot`. Returns ------- @@ -3337,7 +3327,7 @@ def area(self, x=None, y=None, **kwds): unstacked plot. **kwds : optional Additional keyword arguments are documented in - :meth:`pandas.DataFrame.plot`. + :meth:`DataFrame.plot`. Returns ------- @@ -3408,7 +3398,7 @@ def pie(self, y=None, **kwds): Label or position of the column to plot. If not provided, ``subplots=True`` argument must be passed. **kwds - Keyword arguments to pass on to :meth:`pandas.DataFrame.plot`. + Keyword arguments to pass on to :meth:`DataFrame.plot`. Returns ------- @@ -3484,7 +3474,7 @@ def scatter(self, x, y, s=None, c=None, **kwds): marker points according to a colormap. **kwds - Keyword arguments to pass on to :meth:`pandas.DataFrame.plot`. + Keyword arguments to pass on to :meth:`DataFrame.plot`. Returns ------- @@ -3558,7 +3548,7 @@ def hexbin(self, x, y, C=None, reduce_C_function=None, gridsize=None, y-direction. **kwds Additional keyword arguments are documented in - :meth:`pandas.DataFrame.plot`. + :meth:`DataFrame.plot`. Returns ------- @@ -3610,16 +3600,3 @@ def hexbin(self, x, y, C=None, reduce_C_function=None, gridsize=None, if gridsize is not None: kwds['gridsize'] = gridsize return self(kind='hexbin', x=x, y=y, C=C, **kwds) - - def scatter_matrix(self, *args, **kwds): - return misc.scatter_matrix(self._parent, *args, **kwds) - - def andrews_curves(self, class_column, *args, **kwds): - return misc.andrews_curves(self._parent, class_column, *args, **kwds) - - def parallel_coordinates(self, class_column, *args, **kwds): - return misc.parallel_coordinates(self._parent, class_column, - *args, **kwds) - - def radviz(self, class_column, *args, **kwds): - return misc.radviz(self._parent, class_column, *args, **kwds) diff --git a/pandas/plotting/_misc.py b/pandas/plotting/_misc.py index 1c69c03025e00..62a33245f99ef 100644 --- a/pandas/plotting/_misc.py +++ b/pandas/plotting/_misc.py @@ -182,7 +182,7 @@ def radviz(frame, class_column, ax=None, color=None, colormap=None, **kwds): See Also -------- - pandas.plotting.andrews_curves : Plot clustering visualization. + plotting.andrews_curves : Plot clustering visualization. Examples -------- @@ -273,7 +273,7 @@ def normalize(series): def andrews_curves(frame, class_column, ax=None, samples=200, color=None, colormap=None, **kwds): """ - Generates a matplotlib plot of Andrews curves, for visualising clusters of + Generate a matplotlib plot of Andrews curves, for visualising clusters of multivariate data. Andrews curves have the functional form: @@ -394,8 +394,8 @@ def bootstrap_plot(series, fig=None, size=50, samples=500, **kwds): See Also -------- - pandas.DataFrame.plot : Basic plotting for DataFrame objects. - pandas.Series.plot : Basic plotting for Series objects. + DataFrame.plot : Basic plotting for DataFrame objects. + Series.plot : Basic plotting for Series objects. Examples -------- @@ -598,7 +598,8 @@ def lag_plot(series, lag=1, ax=None, **kwds): def autocorrelation_plot(series, ax=None, **kwds): - """Autocorrelation plot for time series. + """ + Autocorrelation plot for time series. Parameters: ----------- diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index 07cf358c765b3..599ab9a3c5f7c 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -46,7 +46,6 @@ class TestPDApi(Base): 'Series', 'SparseArray', 'SparseDataFrame', 'SparseDtype', 'SparseSeries', 'Timedelta', 'TimedeltaIndex', 'Timestamp', 'Interval', 'IntervalIndex', - 'IntervalArray', 'CategoricalDtype', 'PeriodDtype', 'IntervalDtype', 'DatetimeTZDtype', 'Int8Dtype', 'Int16Dtype', 'Int32Dtype', 'Int64Dtype', diff --git a/pandas/tests/arithmetic/test_datetime64.py b/pandas/tests/arithmetic/test_datetime64.py index f97a1651163e8..405dc0805a285 100644 --- a/pandas/tests/arithmetic/test_datetime64.py +++ b/pandas/tests/arithmetic/test_datetime64.py @@ -124,14 +124,14 @@ def test_comparison_invalid(self, box_with_array): result = x != y expected = tm.box_expected([True] * 5, xbox) tm.assert_equal(result, expected) - - with pytest.raises(TypeError): + msg = 'Invalid comparison between' + with pytest.raises(TypeError, match=msg): x >= y - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): x > y - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): x < y - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): x <= y @pytest.mark.parametrize('data', [ @@ -327,9 +327,10 @@ def test_comparison_tzawareness_compat(self, op): # raise naive_series = Series(dr) aware_series = Series(dz) - with pytest.raises(TypeError): + msg = 'Cannot compare tz-naive and tz-aware' + with pytest.raises(TypeError, match=msg): op(dz, naive_series) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dr, aware_series) # TODO: implement _assert_tzawareness_compat for the reverse @@ -428,14 +429,14 @@ def test_dti_cmp_null_scalar_inequality(self, tz_naive_fixture, other, dti = pd.date_range('2016-01-01', periods=2, tz=tz) # FIXME: ValueError with transpose dtarr = tm.box_expected(dti, box_with_array, transpose=False) - - with pytest.raises(TypeError): + msg = 'Invalid comparison between' + with pytest.raises(TypeError, match=msg): dtarr < other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dtarr <= other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dtarr > other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dtarr >= other @pytest.mark.parametrize('dtype', [None, object]) @@ -584,22 +585,23 @@ def test_comparison_tzawareness_compat(self, op, box_with_array): dr = tm.box_expected(dr, box_with_array, transpose=False) dz = tm.box_expected(dz, box_with_array, transpose=False) - with pytest.raises(TypeError): + msg = 'Cannot compare tz-naive and tz-aware' + with pytest.raises(TypeError, match=msg): op(dr, dz) if box_with_array is not pd.DataFrame: # DataFrame op is invalid until transpose bug is fixed - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dr, list(dz)) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dr, np.array(list(dz), dtype=object)) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dz, dr) if box_with_array is not pd.DataFrame: # DataFrame op is invalid until transpose bug is fixed - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dz, list(dr)) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dz, np.array(list(dr), dtype=object)) # Check that there isn't a problem aware-aware and naive-naive do not @@ -617,15 +619,15 @@ def test_comparison_tzawareness_compat(self, op, box_with_array): ts_tz = pd.Timestamp('2000-03-14 01:59', tz='Europe/Amsterdam') assert_all(dr > ts) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dr, ts_tz) assert_all(dz > ts_tz) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(dz, ts) # GH#12601: Check comparison against Timestamps and DatetimeIndex - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(ts, dz) @pytest.mark.parametrize('op', [operator.eq, operator.ne, @@ -641,10 +643,10 @@ def test_scalar_comparison_tzawareness(self, op, other, tz_aware_fixture, # FIXME: ValueError with transpose dtarr = tm.box_expected(dti, box_with_array, transpose=False) - - with pytest.raises(TypeError): + msg = 'Cannot compare tz-naive and tz-aware' + with pytest.raises(TypeError, match=msg): op(dtarr, other) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): op(other, dtarr) @pytest.mark.parametrize('op', [operator.eq, operator.ne, @@ -714,14 +716,14 @@ def test_dt64arr_cmp_scalar_invalid(self, other, tz_naive_fixture, expected = np.array([True] * 10) expected = tm.box_expected(expected, xbox, transpose=False) tm.assert_equal(result, expected) - - with pytest.raises(TypeError): + msg = 'Invalid comparison between' + with pytest.raises(TypeError, match=msg): rng < other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): rng <= other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): rng > other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): rng >= other def test_dti_cmp_list(self): @@ -749,14 +751,14 @@ def test_dti_cmp_tdi_tzawareness(self, other): result = dti != other expected = np.array([True] * 10) tm.assert_numpy_array_equal(result, expected) - - with pytest.raises(TypeError): + msg = 'Invalid comparison between' + with pytest.raises(TypeError, match=msg): dti < other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dti <= other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dti > other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dti >= other def test_dti_cmp_object_dtype(self): @@ -770,7 +772,8 @@ def test_dti_cmp_object_dtype(self): tm.assert_numpy_array_equal(result, expected) other = dti.tz_localize(None) - with pytest.raises(TypeError): + msg = 'Cannot compare tz-naive and tz-aware' + with pytest.raises(TypeError, match=msg): # tzawareness failure dti != other @@ -778,8 +781,8 @@ def test_dti_cmp_object_dtype(self): result = dti == other expected = np.array([True] * 5 + [False] * 5) tm.assert_numpy_array_equal(result, expected) - - with pytest.raises(TypeError): + msg = "Cannot compare type" + with pytest.raises(TypeError, match=msg): dti >= other @@ -898,7 +901,8 @@ def test_dt64arr_add_sub_td64_nat(self, box_with_array, tz_naive_fixture): tm.assert_equal(result, expected) result = obj - other tm.assert_equal(result, expected) - with pytest.raises(TypeError): + msg = 'cannot subtract' + with pytest.raises(TypeError, match=msg): other - obj def test_dt64arr_add_sub_td64ndarray(self, tz_naive_fixture, @@ -927,8 +931,8 @@ def test_dt64arr_add_sub_td64ndarray(self, tz_naive_fixture, result = dtarr - tdarr tm.assert_equal(result, expected) - - with pytest.raises(TypeError): + msg = 'cannot subtract' + with pytest.raises(TypeError, match=msg): tdarr - dtarr # ----------------------------------------------------------------- @@ -1028,10 +1032,10 @@ def test_dt64arr_aware_sub_dt64ndarray_raises(self, tz_aware_fixture, dt64vals = dti.values dtarr = tm.box_expected(dti, box_with_array) - - with pytest.raises(TypeError): + msg = 'DatetimeArray subtraction must have the same timezones or' + with pytest.raises(TypeError, match=msg): dtarr - dt64vals - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dt64vals - dtarr # ------------------------------------------------------------- @@ -1048,17 +1052,17 @@ def test_dt64arr_add_dt64ndarray_raises(self, tz_naive_fixture, dt64vals = dti.values dtarr = tm.box_expected(dti, box_with_array) - - with pytest.raises(TypeError): + msg = 'cannot add' + with pytest.raises(TypeError, match=msg): dtarr + dt64vals - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dt64vals + dtarr def test_dt64arr_add_timestamp_raises(self, box_with_array): # GH#22163 ensure DataFrame doesn't cast Timestamp to i8 idx = DatetimeIndex(['2011-01-01', '2011-01-02']) idx = tm.box_expected(idx, box_with_array) - msg = "cannot add" + msg = 'cannot add' with pytest.raises(TypeError, match=msg): idx + Timestamp('2011-01-01') with pytest.raises(TypeError, match=msg): @@ -1071,13 +1075,14 @@ def test_dt64arr_add_timestamp_raises(self, box_with_array): def test_dt64arr_add_sub_float(self, other, box_with_array): dti = DatetimeIndex(['2011-01-01', '2011-01-02'], freq='D') dtarr = tm.box_expected(dti, box_with_array) - with pytest.raises(TypeError): + msg = '|'.join(['unsupported operand type', 'cannot (add|subtract)']) + with pytest.raises(TypeError, match=msg): dtarr + other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): other + dtarr - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dtarr - other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): other - dtarr @pytest.mark.parametrize('pi_freq', ['D', 'W', 'Q', 'H']) @@ -1090,14 +1095,15 @@ def test_dt64arr_add_sub_parr(self, dti_freq, pi_freq, dtarr = tm.box_expected(dti, box_with_array) parr = tm.box_expected(pi, box_with_array2) - - with pytest.raises(TypeError): + msg = '|'.join(['cannot (add|subtract)', 'unsupported operand', + 'descriptor.*requires', 'ufunc.*cannot use operands']) + with pytest.raises(TypeError, match=msg): dtarr + parr - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): parr + dtarr - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dtarr - parr - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): parr - dtarr @pytest.mark.parametrize('dti_freq', [None, 'D']) @@ -1108,14 +1114,14 @@ def test_dt64arr_add_sub_period_scalar(self, dti_freq, box_with_array): idx = pd.DatetimeIndex(['2011-01-01', '2011-01-02'], freq=dti_freq) dtarr = tm.box_expected(idx, box_with_array) - - with pytest.raises(TypeError): + msg = '|'.join(['unsupported operand type', 'cannot (add|subtract)']) + with pytest.raises(TypeError, match=msg): dtarr + per - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): per + dtarr - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dtarr - per - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): per - dtarr @@ -1156,8 +1162,8 @@ def test_dt64arr_series_sub_tick_DateOffset(self, box_with_array): result2 = -pd.offsets.Second(5) + ser tm.assert_equal(result2, expected) - - with pytest.raises(TypeError): + msg = "bad operand type for unary" + with pytest.raises(TypeError, match=msg): pd.offsets.Second(5) - ser @pytest.mark.parametrize('cls_name', ['Day', 'Hour', 'Minute', 'Second', @@ -1239,8 +1245,8 @@ def test_dt64arr_add_sub_relativedelta_offsets(self, box_with_array): expected = DatetimeIndex([x - off for x in vec_items]) expected = tm.box_expected(expected, box_with_array) tm.assert_equal(expected, vec - off) - - with pytest.raises(TypeError): + msg = "bad operand type for unary" + with pytest.raises(TypeError, match=msg): off - vec # ------------------------------------------------------------- @@ -1320,8 +1326,8 @@ def test_dt64arr_add_sub_DateOffsets(self, box_with_array, expected = DatetimeIndex([offset + x for x in vec_items]) expected = tm.box_expected(expected, box_with_array) tm.assert_equal(expected, offset + vec) - - with pytest.raises(TypeError): + msg = "bad operand type for unary" + with pytest.raises(TypeError, match=msg): offset - vec def test_dt64arr_add_sub_DateOffset(self, box_with_array): @@ -1440,13 +1446,14 @@ def test_dt64_series_arith_overflow(self): td = pd.Timedelta('20000 Days') dti = pd.date_range('1949-09-30', freq='100Y', periods=4) ser = pd.Series(dti) - with pytest.raises(OverflowError): + msg = 'Overflow in int64 addition' + with pytest.raises(OverflowError, match=msg): ser - dt - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): dt - ser - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): ser + td - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): td + ser ser.iloc[-1] = pd.NaT @@ -1480,9 +1487,9 @@ def test_datetimeindex_sub_timestamp_overflow(self): tspos.to_pydatetime(), tspos.to_datetime64().astype('datetime64[ns]'), tspos.to_datetime64().astype('datetime64[D]')] - + msg = 'Overflow in int64 addition' for variant in ts_neg_variants: - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): dtimax - variant expected = pd.Timestamp.max.value - tspos.value @@ -1496,7 +1503,7 @@ def test_datetimeindex_sub_timestamp_overflow(self): assert res[1].value == expected for variant in ts_pos_variants: - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): dtimin - variant def test_datetimeindex_sub_datetimeindex_overflow(self): @@ -1515,22 +1522,22 @@ def test_datetimeindex_sub_datetimeindex_overflow(self): expected = pd.Timestamp.min.value - ts_neg[1].value result = dtimin - ts_neg assert result[1].value == expected - - with pytest.raises(OverflowError): + msg = 'Overflow in int64 addition' + with pytest.raises(OverflowError, match=msg): dtimax - ts_neg - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): dtimin - ts_pos # Edge cases tmin = pd.to_datetime([pd.Timestamp.min]) t1 = tmin + pd.Timedelta.max + pd.Timedelta('1us') - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): t1 - tmin tmax = pd.to_datetime([pd.Timestamp.max]) t2 = tmax + pd.Timedelta.min - pd.Timedelta('1us') - with pytest.raises(OverflowError): + with pytest.raises(OverflowError, match=msg): tmax - t2 @@ -1543,7 +1550,8 @@ def test_empty_series_add_sub(self): tm.assert_series_equal(a, a + b) tm.assert_series_equal(a, a - b) tm.assert_series_equal(a, b + a) - with pytest.raises(TypeError): + msg = 'cannot subtract' + with pytest.raises(TypeError, match=msg): b - a def test_operators_datetimelike(self): @@ -1688,12 +1696,13 @@ def test_datetime64_ops_nat(self): # subtraction tm.assert_series_equal(-NaT + datetime_series, nat_series_dtype_timestamp) - with pytest.raises(TypeError): + msg = 'Unary negative expects' + with pytest.raises(TypeError, match=msg): -single_nat_dtype_datetime + datetime_series tm.assert_series_equal(-NaT + nat_series_dtype_timestamp, nat_series_dtype_timestamp) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): -single_nat_dtype_datetime + nat_series_dtype_timestamp # addition @@ -1718,15 +1727,16 @@ def test_datetime64_ops_nat(self): @pytest.mark.parametrize('one', [1, 1.0, np.array(1)]) def test_dt64_mul_div_numeric_invalid(self, one, dt64_series): # multiplication - with pytest.raises(TypeError): + msg = 'cannot perform .* with this index type' + with pytest.raises(TypeError, match=msg): dt64_series * one - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): one * dt64_series # division - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dt64_series / one - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): one / dt64_series @pytest.mark.parametrize('op', ['__add__', '__radd__', @@ -1740,13 +1750,17 @@ def test_dt64_series_add_intlike(self, tz, op): other = Series([20, 30, 40], dtype='uint8') method = getattr(ser, op) - with pytest.raises(TypeError): + msg = '|'.join(['incompatible type for a .* operation', + 'cannot evaluate a numeric op', + 'ufunc .* cannot use operands', + 'cannot (add|subtract)']) + with pytest.raises(TypeError, match=msg): method(1) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): method(other) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): method(other.values) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): method(pd.Index(other)) # ------------------------------------------------------------- @@ -1783,13 +1797,14 @@ def test_operators_datetimelike_with_timezones(self): result = dt1 - td1[0] exp = (dt1.dt.tz_localize(None) - td1[0]).dt.tz_localize(tz) tm.assert_series_equal(result, exp) - with pytest.raises(TypeError): + msg = "bad operand type for unary" + with pytest.raises(TypeError, match=msg): td1[0] - dt1 result = dt2 - td2[0] exp = (dt2.dt.tz_localize(None) - td2[0]).dt.tz_localize(tz) tm.assert_series_equal(result, exp) - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): td2[0] - dt2 result = dt1 + td1 @@ -1807,10 +1822,10 @@ def test_operators_datetimelike_with_timezones(self): result = dt2 - td2 exp = (dt2.dt.tz_localize(None) - td2).dt.tz_localize(tz) tm.assert_series_equal(result, exp) - - with pytest.raises(TypeError): + msg = 'cannot (add|subtract)' + with pytest.raises(TypeError, match=msg): td1 - dt1 - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): td2 - dt2 @@ -1909,13 +1924,15 @@ def test_dti_add_intarray_no_freq(self, int_holder): # GH#19959 dti = pd.DatetimeIndex(['2016-01-01', 'NaT', '2017-04-05 06:07:08']) other = int_holder([9, 4, -1]) - with pytest.raises(NullFrequencyError): + nfmsg = 'Cannot shift with no freq' + tmsg = 'cannot subtract DatetimeArray from' + with pytest.raises(NullFrequencyError, match=nfmsg): dti + other - with pytest.raises(NullFrequencyError): + with pytest.raises(NullFrequencyError, match=nfmsg): other + dti - with pytest.raises(NullFrequencyError): + with pytest.raises(NullFrequencyError, match=nfmsg): dti - other - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=tmsg): other - dti # ------------------------------------------------------------- @@ -2057,14 +2074,14 @@ def test_sub_dti_dti(self): result = dti_tz - dti_tz tm.assert_index_equal(result, expected) - - with pytest.raises(TypeError): + msg = 'DatetimeArray subtraction must have the same timezones or' + with pytest.raises(TypeError, match=msg): dti_tz - dti - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dti - dti_tz - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): dti_tz - dti_tz2 # isub @@ -2074,7 +2091,8 @@ def test_sub_dti_dti(self): # different length raises ValueError dti1 = date_range('20130101', periods=3) dti2 = date_range('20130101', periods=4) - with pytest.raises(ValueError): + msg = 'cannot add indices of unequal length' + with pytest.raises(ValueError, match=msg): dti1 - dti2 # NaN propagation @@ -2148,8 +2166,8 @@ def test_ops_nat_mixed_datetime64_timedelta64(self): tm.assert_series_equal(-single_nat_dtype_timedelta + nat_series_dtype_timestamp, nat_series_dtype_timestamp) - - with pytest.raises(TypeError): + msg = 'cannot subtract a datelike' + with pytest.raises(TypeError, match=msg): timedelta_series - single_nat_dtype_datetime # addition diff --git a/pandas/tests/arrays/test_array.py b/pandas/tests/arrays/test_array.py index 4a51fd63d963b..9fea1989e46df 100644 --- a/pandas/tests/arrays/test_array.py +++ b/pandas/tests/arrays/test_array.py @@ -74,7 +74,7 @@ # Interval ([pd.Interval(1, 2), pd.Interval(3, 4)], 'interval', - pd.IntervalArray.from_tuples([(1, 2), (3, 4)])), + pd.arrays.IntervalArray.from_tuples([(1, 2), (3, 4)])), # Sparse ([0, 1], 'Sparse[int64]', pd.SparseArray([0, 1], dtype='int64')), @@ -129,7 +129,7 @@ def test_array_copy(): # interval ([pd.Interval(0, 1), pd.Interval(1, 2)], - pd.IntervalArray.from_breaks([0, 1, 2])), + pd.arrays.IntervalArray.from_breaks([0, 1, 2])), # datetime ([pd.Timestamp('2000',), pd.Timestamp('2001')], diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index 09298bb5cd08d..67e7db5460e6d 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -339,7 +339,7 @@ def _compare_other(self, data, op_name, other): expected = pd.Series(op(data._data, other)) # fill the nan locations - expected[data._mask] = True if op_name == '__ne__' else False + expected[data._mask] = op_name == '__ne__' tm.assert_series_equal(result, expected) @@ -351,7 +351,7 @@ def _compare_other(self, data, op_name, other): expected = op(expected, other) # fill the nan locations - expected[data._mask] = True if op_name == '__ne__' else False + expected[data._mask] = op_name == '__ne__' tm.assert_series_equal(result, expected) diff --git a/pandas/tests/dtypes/test_generic.py b/pandas/tests/dtypes/test_generic.py index 1622088d05f4d..2bb3559d56d61 100644 --- a/pandas/tests/dtypes/test_generic.py +++ b/pandas/tests/dtypes/test_generic.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from warnings import catch_warnings, simplefilter +from warnings import catch_warnings import numpy as np @@ -39,9 +39,6 @@ def test_abc_types(self): assert isinstance(pd.Int64Index([1, 2, 3]), gt.ABCIndexClass) assert isinstance(pd.Series([1, 2, 3]), gt.ABCSeries) assert isinstance(self.df, gt.ABCDataFrame) - with catch_warnings(record=True): - simplefilter('ignore', FutureWarning) - assert isinstance(self.df.to_panel(), gt.ABCPanel) assert isinstance(self.sparse_series, gt.ABCSparseSeries) assert isinstance(self.sparse_array, gt.ABCSparseArray) assert isinstance(self.sparse_frame, gt.ABCSparseDataFrame) diff --git a/pandas/tests/dtypes/test_inference.py b/pandas/tests/dtypes/test_inference.py index 89662b70a39ad..49a66efaffc11 100644 --- a/pandas/tests/dtypes/test_inference.py +++ b/pandas/tests/dtypes/test_inference.py @@ -159,13 +159,15 @@ def test_is_nested_list_like_fails(obj): @pytest.mark.parametrize( - "ll", [{}, {'A': 1}, Series([1])]) + "ll", [{}, {'A': 1}, Series([1]), collections.defaultdict()]) def test_is_dict_like_passes(ll): assert inference.is_dict_like(ll) -@pytest.mark.parametrize( - "ll", ['1', 1, [1, 2], (1, 2), range(2), Index([1])]) +@pytest.mark.parametrize("ll", [ + '1', 1, [1, 2], (1, 2), range(2), Index([1]), + dict, collections.defaultdict, Series +]) def test_is_dict_like_fails(ll): assert not inference.is_dict_like(ll) diff --git a/pandas/tests/dtypes/test_missing.py b/pandas/tests/dtypes/test_missing.py index d913d2ad299ce..7ca01e13a33a9 100644 --- a/pandas/tests/dtypes/test_missing.py +++ b/pandas/tests/dtypes/test_missing.py @@ -2,7 +2,7 @@ from datetime import datetime from decimal import Decimal -from warnings import catch_warnings, filterwarnings, simplefilter +from warnings import catch_warnings, filterwarnings import numpy as np import pytest @@ -94,15 +94,6 @@ def test_isna_isnull(self, isna_f): expected = df.apply(isna_f) tm.assert_frame_equal(result, expected) - # panel - with catch_warnings(record=True): - simplefilter("ignore", FutureWarning) - for p in [tm.makePanel(), tm.makePeriodPanel(), - tm.add_nans(tm.makePanel())]: - result = isna_f(p) - expected = p.apply(isna_f) - tm.assert_panel_equal(result, expected) - def test_isna_lists(self): result = isna([[False]]) exp = np.array([[False]]) diff --git a/pandas/tests/extension/base/groupby.py b/pandas/tests/extension/base/groupby.py index dd406ca0cd5ed..1929dad075695 100644 --- a/pandas/tests/extension/base/groupby.py +++ b/pandas/tests/extension/base/groupby.py @@ -55,19 +55,14 @@ def test_groupby_extension_transform(self, data_for_grouping): self.assert_series_equal(result, expected) - @pytest.mark.parametrize('op', [ - lambda x: 1, - lambda x: [1] * len(x), - lambda x: pd.Series([1] * len(x)), - lambda x: x, - ], ids=['scalar', 'list', 'series', 'object']) - def test_groupby_extension_apply(self, data_for_grouping, op): + def test_groupby_extension_apply( + self, data_for_grouping, groupby_apply_op): df = pd.DataFrame({"A": [1, 1, 2, 2, 3, 3, 1, 4], "B": data_for_grouping}) - df.groupby("B").apply(op) - df.groupby("B").A.apply(op) - df.groupby("A").apply(op) - df.groupby("A").B.apply(op) + df.groupby("B").apply(groupby_apply_op) + df.groupby("B").A.apply(groupby_apply_op) + df.groupby("A").apply(groupby_apply_op) + df.groupby("A").B.apply(groupby_apply_op) def test_in_numeric_groupby(self, data_for_grouping): df = pd.DataFrame({"A": [1, 1, 2, 2, 3, 3, 1, 4], diff --git a/pandas/tests/extension/base/methods.py b/pandas/tests/extension/base/methods.py index f64df7a84b7c0..1852edaa9e748 100644 --- a/pandas/tests/extension/base/methods.py +++ b/pandas/tests/extension/base/methods.py @@ -240,7 +240,6 @@ def test_shift_fill_value(self, data): expected = data.take([2, 3, 0, 0]) self.assert_extension_array_equal(result, expected) - @pytest.mark.parametrize("as_frame", [True, False]) def test_hash_pandas_object_works(self, data, as_frame): # https://github.com/pandas-dev/pandas/issues/23066 data = pd.Series(data) @@ -250,7 +249,6 @@ def test_hash_pandas_object_works(self, data, as_frame): b = pd.util.hash_pandas_object(data) self.assert_equal(a, b) - @pytest.mark.parametrize("as_series", [True, False]) def test_searchsorted(self, data_for_sorting, as_series): b, c, a = data_for_sorting arr = type(data_for_sorting)._from_sequence([a, b, c]) @@ -275,7 +273,6 @@ def test_searchsorted(self, data_for_sorting, as_series): sorter = np.array([1, 2, 0]) assert data_for_sorting.searchsorted(a, sorter=sorter) == 0 - @pytest.mark.parametrize("as_frame", [True, False]) def test_where_series(self, data, na_value, as_frame): assert data[0] != data[1] cls = type(data) @@ -309,8 +306,6 @@ def test_where_series(self, data, na_value, as_frame): expected = expected.to_frame(name='a') self.assert_equal(result, expected) - @pytest.mark.parametrize("use_numpy", [True, False]) - @pytest.mark.parametrize("as_series", [True, False]) @pytest.mark.parametrize("repeats", [0, 1, 2, [1, 2, 3]]) def test_repeat(self, data, repeats, as_series, use_numpy): arr = type(data)._from_sequence(data[:3], dtype=data.dtype) @@ -327,7 +322,6 @@ def test_repeat(self, data, repeats, as_series, use_numpy): self.assert_equal(result, expected) - @pytest.mark.parametrize("use_numpy", [True, False]) @pytest.mark.parametrize('repeats, kwargs, error, msg', [ (2, dict(axis=1), ValueError, "'axis"), (-1, dict(), ValueError, "negative"), diff --git a/pandas/tests/extension/base/missing.py b/pandas/tests/extension/base/missing.py index 2fe547e50a34b..834f49f0461f0 100644 --- a/pandas/tests/extension/base/missing.py +++ b/pandas/tests/extension/base/missing.py @@ -1,5 +1,4 @@ import numpy as np -import pytest import pandas as pd import pandas.util.testing as tm @@ -89,14 +88,13 @@ def test_fillna_series(self, data_missing): result = ser.fillna(ser) self.assert_series_equal(result, ser) - @pytest.mark.parametrize('method', ['ffill', 'bfill']) - def test_fillna_series_method(self, data_missing, method): + def test_fillna_series_method(self, data_missing, fillna_method): fill_value = data_missing[1] - if method == 'ffill': + if fillna_method == 'ffill': data_missing = data_missing[::-1] - result = pd.Series(data_missing).fillna(method=method) + result = pd.Series(data_missing).fillna(method=fillna_method) expected = pd.Series(data_missing._from_sequence( [fill_value, fill_value], dtype=data_missing.dtype)) diff --git a/pandas/tests/extension/base/setitem.py b/pandas/tests/extension/base/setitem.py index 42fda982f7339..db6328e39e6cc 100644 --- a/pandas/tests/extension/base/setitem.py +++ b/pandas/tests/extension/base/setitem.py @@ -24,7 +24,6 @@ def test_setitem_sequence(self, data, box_in_series): assert data[0] == original[1] assert data[1] == original[0] - @pytest.mark.parametrize('as_array', [True, False]) def test_setitem_sequence_mismatched_length_raises(self, data, as_array): ser = pd.Series(data) original = ser.copy() diff --git a/pandas/tests/extension/conftest.py b/pandas/tests/extension/conftest.py index 5349dd919f2a2..3cc2d313b09f5 100644 --- a/pandas/tests/extension/conftest.py +++ b/pandas/tests/extension/conftest.py @@ -2,6 +2,8 @@ import pytest +from pandas import Series + @pytest.fixture def dtype(): @@ -108,3 +110,58 @@ def data_for_grouping(): def box_in_series(request): """Whether to box the data in a Series""" return request.param + + +@pytest.fixture(params=[ + lambda x: 1, + lambda x: [1] * len(x), + lambda x: Series([1] * len(x)), + lambda x: x, +], ids=['scalar', 'list', 'series', 'object']) +def groupby_apply_op(request): + """ + Functions to test groupby.apply(). + """ + return request.param + + +@pytest.fixture(params=[True, False]) +def as_frame(request): + """ + Boolean fixture to support Series and Series.to_frame() comparison testing. + """ + return request.param + + +@pytest.fixture(params=[True, False]) +def as_series(request): + """ + Boolean fixture to support arr and Series(arr) comparison testing. + """ + return request.param + + +@pytest.fixture(params=[True, False]) +def use_numpy(request): + """ + Boolean fixture to support comparison testing of ExtensionDtype array + and numpy array. + """ + return request.param + + +@pytest.fixture(params=['ffill', 'bfill']) +def fillna_method(request): + """ + Parametrized fixture giving method parameters 'ffill' and 'bfill' for + Series.fillna(method=) testing. + """ + return request.param + + +@pytest.fixture(params=[True, False]) +def as_array(request): + """ + Boolean fixture to support ExtensionDtype _from_sequence method testing. + """ + return request.param diff --git a/pandas/tests/extension/test_numpy.py b/pandas/tests/extension/test_numpy.py index 7ca6882c7441b..41f5beb8c885d 100644 --- a/pandas/tests/extension/test_numpy.py +++ b/pandas/tests/extension/test_numpy.py @@ -1,6 +1,8 @@ import numpy as np import pytest +from pandas.compat.numpy import _np_version_under1p16 + import pandas as pd from pandas import compat from pandas.core.arrays.numpy_ import PandasArray, PandasDtype @@ -9,9 +11,9 @@ from . import base -@pytest.fixture -def dtype(): - return PandasDtype(np.dtype('float')) +@pytest.fixture(params=['float', 'object']) +def dtype(request): + return PandasDtype(np.dtype(request.param)) @pytest.fixture @@ -38,11 +40,19 @@ def allow_in_pandas(monkeypatch): @pytest.fixture def data(allow_in_pandas, dtype): + if dtype.numpy_dtype == 'object': + return pd.Series([(i,) for i in range(100)]).array return PandasArray(np.arange(1, 101, dtype=dtype._dtype)) @pytest.fixture -def data_missing(allow_in_pandas): +def data_missing(allow_in_pandas, dtype): + # For NumPy <1.16, np.array([np.nan, (1,)]) raises + # ValueError: setting an array element with a sequence. + if dtype.numpy_dtype == 'object': + if _np_version_under1p16: + raise pytest.skip("Skipping for NumPy <1.16") + return PandasArray(np.array([np.nan, (1,)])) return PandasArray(np.array([np.nan, 1.0])) @@ -59,49 +69,84 @@ def cmp(a, b): @pytest.fixture -def data_for_sorting(allow_in_pandas): +def data_for_sorting(allow_in_pandas, dtype): """Length-3 array with a known sort order. This should be three items [B, C, A] with A < B < C """ + if dtype.numpy_dtype == 'object': + # Use an empty tuple for first element, then remove, + # to disable np.array's shape inference. + return PandasArray( + np.array([(), (2,), (3,), (1,)])[1:] + ) return PandasArray( np.array([1, 2, 0]) ) @pytest.fixture -def data_missing_for_sorting(allow_in_pandas): +def data_missing_for_sorting(allow_in_pandas, dtype): """Length-3 array with a known sort order. This should be three items [B, NA, A] with A < B and NA missing. """ + if dtype.numpy_dtype == 'object': + return PandasArray( + np.array([(1,), np.nan, (0,)]) + ) return PandasArray( np.array([1, np.nan, 0]) ) @pytest.fixture -def data_for_grouping(allow_in_pandas): +def data_for_grouping(allow_in_pandas, dtype): """Data for factorization, grouping, and unique tests. Expected to be like [B, B, NA, NA, A, A, B, C] Where A < B < C and NA is missing """ - a, b, c = np.arange(3) + if dtype.numpy_dtype == 'object': + a, b, c = (1,), (2,), (3,) + else: + a, b, c = np.arange(3) return PandasArray(np.array( [b, b, np.nan, np.nan, a, a, b, c] )) +@pytest.fixture +def skip_numpy_object(dtype): + """ + Tests for PandasArray with nested data. Users typically won't create + these objects via `pd.array`, but they can show up through `.array` + on a Series with nested data. Many of the base tests fail, as they aren't + appropriate for nested data. + + This fixture allows these tests to be skipped when used as a usefixtures + marker to either an individual test or a test class. + """ + if dtype == 'object': + raise pytest.skip("Skipping for object dtype.") + + +skip_nested = pytest.mark.usefixtures('skip_numpy_object') + + class BaseNumPyTests(object): pass class TestCasting(BaseNumPyTests, base.BaseCastingTests): - pass + + @skip_nested + def test_astype_str(self, data): + # ValueError: setting an array element with a sequence + super(TestCasting, self).test_astype_str(data) class TestConstructors(BaseNumPyTests, base.BaseConstructorsTests): @@ -110,6 +155,11 @@ class TestConstructors(BaseNumPyTests, base.BaseConstructorsTests): def test_from_dtype(self, data): pass + @skip_nested + def test_array_from_scalars(self, data): + # ValueError: PandasArray must be 1-dimensional. + super(TestConstructors, self).test_array_from_scalars(data) + class TestDtype(BaseNumPyTests, base.BaseDtypeTests): @@ -120,15 +170,32 @@ def test_check_dtype(self, data): class TestGetitem(BaseNumPyTests, base.BaseGetitemTests): - pass + + @skip_nested + def test_getitem_scalar(self, data): + # AssertionError + super(TestGetitem, self).test_getitem_scalar(data) + + @skip_nested + def test_take_series(self, data): + # ValueError: PandasArray must be 1-dimensional. + super(TestGetitem, self).test_take_series(data) class TestGroupby(BaseNumPyTests, base.BaseGroupbyTests): - pass + @skip_nested + def test_groupby_extension_apply( + self, data_for_grouping, groupby_apply_op): + # ValueError: Names should be list-like for a MultiIndex + super(TestGroupby, self).test_groupby_extension_apply( + data_for_grouping, groupby_apply_op) class TestInterface(BaseNumPyTests, base.BaseInterfaceTests): - pass + @skip_nested + def test_array_interface(self, data): + # NumPy array shape inference + super(TestInterface, self).test_array_interface(data) class TestMethods(BaseNumPyTests, base.BaseMethodsTests): @@ -143,7 +210,57 @@ def test_value_counts(self, all_data, dropna): def test_combine_le(self, data_repeated): super(TestMethods, self).test_combine_le(data_repeated) - + @skip_nested + def test_combine_add(self, data_repeated): + # Not numeric + super(TestMethods, self).test_combine_add(data_repeated) + + @skip_nested + def test_shift_fill_value(self, data): + # np.array shape inference. Shift implementation fails. + super(TestMethods, self).test_shift_fill_value(data) + + @skip_nested + @pytest.mark.parametrize('box', [pd.Series, lambda x: x]) + @pytest.mark.parametrize('method', [lambda x: x.unique(), pd.unique]) + def test_unique(self, data, box, method): + # Fails creating expected + super(TestMethods, self).test_unique(data, box, method) + + @skip_nested + def test_fillna_copy_frame(self, data_missing): + # The "scalar" for this array isn't a scalar. + super(TestMethods, self).test_fillna_copy_frame(data_missing) + + @skip_nested + def test_fillna_copy_series(self, data_missing): + # The "scalar" for this array isn't a scalar. + super(TestMethods, self).test_fillna_copy_series(data_missing) + + @skip_nested + def test_hash_pandas_object_works(self, data, as_frame): + # ndarray of tuples not hashable + super(TestMethods, self).test_hash_pandas_object_works(data, as_frame) + + @skip_nested + def test_searchsorted(self, data_for_sorting, as_series): + # Test setup fails. + super(TestMethods, self).test_searchsorted(data_for_sorting, as_series) + + @skip_nested + def test_where_series(self, data, na_value, as_frame): + # Test setup fails. + super(TestMethods, self).test_where_series(data, na_value, as_frame) + + @skip_nested + @pytest.mark.parametrize("repeats", [0, 1, 2, [1, 2, 3]]) + def test_repeat(self, data, repeats, as_series, use_numpy): + # Fails creating expected + super(TestMethods, self).test_repeat( + data, repeats, as_series, use_numpy) + + +@skip_nested class TestArithmetics(BaseNumPyTests, base.BaseArithmeticOpsTests): divmod_exc = None series_scalar_exc = None @@ -183,6 +300,7 @@ class TestPrinting(BaseNumPyTests, base.BasePrintingTests): pass +@skip_nested class TestNumericReduce(BaseNumPyTests, base.BaseNumericReduceTests): def check_reduce(self, s, op_name, skipna): @@ -192,12 +310,33 @@ def check_reduce(self, s, op_name, skipna): tm.assert_almost_equal(result, expected) +@skip_nested class TestBooleanReduce(BaseNumPyTests, base.BaseBooleanReduceTests): pass -class TestMising(BaseNumPyTests, base.BaseMissingTests): - pass +class TestMissing(BaseNumPyTests, base.BaseMissingTests): + + @skip_nested + def test_fillna_scalar(self, data_missing): + # Non-scalar "scalar" values. + super(TestMissing, self).test_fillna_scalar(data_missing) + + @skip_nested + def test_fillna_series_method(self, data_missing, fillna_method): + # Non-scalar "scalar" values. + super(TestMissing, self).test_fillna_series_method( + data_missing, fillna_method) + + @skip_nested + def test_fillna_series(self, data_missing): + # Non-scalar "scalar" values. + super(TestMissing, self).test_fillna_series(data_missing) + + @skip_nested + def test_fillna_frame(self, data_missing): + # Non-scalar "scalar" values. + super(TestMissing, self).test_fillna_frame(data_missing) class TestReshaping(BaseNumPyTests, base.BaseReshapingTests): @@ -207,10 +346,85 @@ class TestReshaping(BaseNumPyTests, base.BaseReshapingTests): def test_concat_mixed_dtypes(self, data): super(TestReshaping, self).test_concat_mixed_dtypes(data) + @skip_nested + def test_merge(self, data, na_value): + # Fails creating expected + super(TestReshaping, self).test_merge(data, na_value) -class TestSetitem(BaseNumPyTests, base.BaseSetitemTests): - pass + @skip_nested + def test_merge_on_extension_array(self, data): + # Fails creating expected + super(TestReshaping, self).test_merge_on_extension_array(data) + @skip_nested + def test_merge_on_extension_array_duplicates(self, data): + # Fails creating expected + super(TestReshaping, self).test_merge_on_extension_array_duplicates( + data) + + +class TestSetitem(BaseNumPyTests, base.BaseSetitemTests): + @skip_nested + def test_setitem_scalar_series(self, data, box_in_series): + # AssertionError + super(TestSetitem, self).test_setitem_scalar_series( + data, box_in_series) + + @skip_nested + def test_setitem_sequence(self, data, box_in_series): + # ValueError: shape mismatch: value array of shape (2,1) could not + # be broadcast to indexing result of shape (2,) + super(TestSetitem, self).test_setitem_sequence(data, box_in_series) + + @skip_nested + def test_setitem_sequence_mismatched_length_raises(self, data, as_array): + # ValueError: PandasArray must be 1-dimensional. + (super(TestSetitem, self). + test_setitem_sequence_mismatched_length_raises(data, as_array)) + + @skip_nested + def test_setitem_sequence_broadcasts(self, data, box_in_series): + # ValueError: cannot set using a list-like indexer with a different + # length than the value + super(TestSetitem, self).test_setitem_sequence_broadcasts( + data, box_in_series) + + @skip_nested + def test_setitem_loc_scalar_mixed(self, data): + # AssertionError + super(TestSetitem, self).test_setitem_loc_scalar_mixed(data) + + @skip_nested + def test_setitem_loc_scalar_multiple_homogoneous(self, data): + # AssertionError + super(TestSetitem, self).test_setitem_loc_scalar_multiple_homogoneous( + data) + + @skip_nested + def test_setitem_iloc_scalar_mixed(self, data): + # AssertionError + super(TestSetitem, self).test_setitem_iloc_scalar_mixed(data) + + @skip_nested + def test_setitem_iloc_scalar_multiple_homogoneous(self, data): + # AssertionError + super(TestSetitem, self).test_setitem_iloc_scalar_multiple_homogoneous( + data) + + @skip_nested + @pytest.mark.parametrize('setter', ['loc', None]) + def test_setitem_mask_broadcast(self, data, setter): + # ValueError: cannot set using a list-like indexer with a different + # length than the value + super(TestSetitem, self).test_setitem_mask_broadcast(data, setter) + + @skip_nested + def test_setitem_scalar_key_sequence_raise(self, data): + # Failed: DID NOT RAISE + super(TestSetitem, self).test_setitem_scalar_key_sequence_raise(data) + + +@skip_nested class TestParsing(BaseNumPyTests, base.BaseParsingTests): pass diff --git a/pandas/tests/extension/test_sparse.py b/pandas/tests/extension/test_sparse.py index 21dbf9524961c..146dea2b65d83 100644 --- a/pandas/tests/extension/test_sparse.py +++ b/pandas/tests/extension/test_sparse.py @@ -287,11 +287,10 @@ def test_combine_first(self, data): pytest.skip("TODO(SparseArray.__setitem__ will preserve dtype.") super(TestMethods, self).test_combine_first(data) - @pytest.mark.parametrize("as_series", [True, False]) def test_searchsorted(self, data_for_sorting, as_series): with tm.assert_produces_warning(PerformanceWarning): super(TestMethods, self).test_searchsorted(data_for_sorting, - as_series=as_series) + as_series) class TestCasting(BaseSparseTests, base.BaseCastingTests): diff --git a/pandas/tests/frame/test_alter_axes.py b/pandas/tests/frame/test_alter_axes.py index c2355742199dc..cc3687f856b4e 100644 --- a/pandas/tests/frame/test_alter_axes.py +++ b/pandas/tests/frame/test_alter_axes.py @@ -253,23 +253,129 @@ def test_set_index_raise_keys(self, frame_of_index_cols, drop, append): df.set_index(['A', df['A'], tuple(df['A'])], drop=drop, append=append) + @pytest.mark.xfail(reason='broken due to revert, see GH 25085') @pytest.mark.parametrize('append', [True, False]) @pytest.mark.parametrize('drop', [True, False]) - @pytest.mark.parametrize('box', [set, iter]) + @pytest.mark.parametrize('box', [set, iter, lambda x: (y for y in x)], + ids=['set', 'iter', 'generator']) def test_set_index_raise_on_type(self, frame_of_index_cols, box, drop, append): df = frame_of_index_cols msg = 'The parameter "keys" may be a column key, .*' - # forbidden type, e.g. set/tuple/iter - with pytest.raises(ValueError, match=msg): + # forbidden type, e.g. set/iter/generator + with pytest.raises(TypeError, match=msg): df.set_index(box(df['A']), drop=drop, append=append) - # forbidden type in list, e.g. set/tuple/iter - with pytest.raises(ValueError, match=msg): + # forbidden type in list, e.g. set/iter/generator + with pytest.raises(TypeError, match=msg): df.set_index(['A', df['A'], box(df['A'])], drop=drop, append=append) + def test_set_index_custom_label_type(self): + # GH 24969 + + class Thing(object): + def __init__(self, name, color): + self.name = name + self.color = color + + def __str__(self): + return "" % (self.name,) + + # necessary for pretty KeyError + __repr__ = __str__ + + thing1 = Thing('One', 'red') + thing2 = Thing('Two', 'blue') + df = DataFrame({thing1: [0, 1], thing2: [2, 3]}) + expected = DataFrame({thing1: [0, 1]}, + index=Index([2, 3], name=thing2)) + + # use custom label directly + result = df.set_index(thing2) + tm.assert_frame_equal(result, expected) + + # custom label wrapped in list + result = df.set_index([thing2]) + tm.assert_frame_equal(result, expected) + + # missing key + thing3 = Thing('Three', 'pink') + msg = "" + with pytest.raises(KeyError, match=msg): + # missing label directly + df.set_index(thing3) + + with pytest.raises(KeyError, match=msg): + # missing label in list + df.set_index([thing3]) + + def test_set_index_custom_label_hashable_iterable(self): + # GH 24969 + + # actual example discussed in GH 24984 was e.g. for shapely.geometry + # objects (e.g. a collection of Points) that can be both hashable and + # iterable; using frozenset as a stand-in for testing here + + class Thing(frozenset): + # need to stabilize repr for KeyError (due to random order in sets) + def __repr__(self): + tmp = sorted(list(self)) + # double curly brace prints one brace in format string + return "frozenset({{{}}})".format(', '.join(map(repr, tmp))) + + thing1 = Thing(['One', 'red']) + thing2 = Thing(['Two', 'blue']) + df = DataFrame({thing1: [0, 1], thing2: [2, 3]}) + expected = DataFrame({thing1: [0, 1]}, + index=Index([2, 3], name=thing2)) + + # use custom label directly + result = df.set_index(thing2) + tm.assert_frame_equal(result, expected) + + # custom label wrapped in list + result = df.set_index([thing2]) + tm.assert_frame_equal(result, expected) + + # missing key + thing3 = Thing(['Three', 'pink']) + msg = '.*' # due to revert, see GH 25085 + with pytest.raises(KeyError, match=msg): + # missing label directly + df.set_index(thing3) + + with pytest.raises(KeyError, match=msg): + # missing label in list + df.set_index([thing3]) + + def test_set_index_custom_label_type_raises(self): + # GH 24969 + + # purposefully inherit from something unhashable + class Thing(set): + def __init__(self, name, color): + self.name = name + self.color = color + + def __str__(self): + return "" % (self.name,) + + thing1 = Thing('One', 'red') + thing2 = Thing('Two', 'blue') + df = DataFrame([[0, 2], [1, 3]], columns=[thing1, thing2]) + + msg = 'unhashable type.*' + + with pytest.raises(TypeError, match=msg): + # use custom label directly + df.set_index(thing2) + + with pytest.raises(TypeError, match=msg): + # custom label wrapped in list + df.set_index([thing2]) + def test_construction_with_categorical_index(self): ci = tm.makeCategoricalIndex(10) ci.name = 'B' @@ -600,6 +706,26 @@ def test_rename_axis_mapper(self): with pytest.raises(TypeError, match='bogus'): df.rename_axis(bogus=None) + @pytest.mark.parametrize('kwargs, rename_index, rename_columns', [ + ({'mapper': None, 'axis': 0}, True, False), + ({'mapper': None, 'axis': 1}, False, True), + ({'index': None}, True, False), + ({'columns': None}, False, True), + ({'index': None, 'columns': None}, True, True), + ({}, False, False)]) + def test_rename_axis_none(self, kwargs, rename_index, rename_columns): + # GH 25034 + index = Index(list('abc'), name='foo') + columns = Index(['col1', 'col2'], name='bar') + data = np.arange(6).reshape(3, 2) + df = DataFrame(data, index, columns) + + result = df.rename_axis(**kwargs) + expected_index = index.rename(None) if rename_index else index + expected_columns = columns.rename(None) if rename_columns else columns + expected = DataFrame(data, expected_index, expected_columns) + tm.assert_frame_equal(result, expected) + def test_rename_multiindex(self): tuples_index = [('foo1', 'bar1'), ('foo2', 'bar2')] diff --git a/pandas/tests/frame/test_analytics.py b/pandas/tests/frame/test_analytics.py index f2c3f50c291c3..2e690ebbfa121 100644 --- a/pandas/tests/frame/test_analytics.py +++ b/pandas/tests/frame/test_analytics.py @@ -231,9 +231,9 @@ def assert_bool_op_api(opname, bool_frame_with_na, float_string_frame, getattr(bool_frame_with_na, opname)(axis=1, bool_only=False) -class TestDataFrameAnalytics(): +class TestDataFrameAnalytics(object): - # ---------------------------------------------------------------------= + # --------------------------------------------------------------------- # Correlation and covariance @td.skip_if_no_scipy @@ -502,6 +502,9 @@ def test_corrwith_kendall(self): expected = Series(np.ones(len(result))) tm.assert_series_equal(result, expected) + # --------------------------------------------------------------------- + # Describe + def test_bool_describe_in_mixed_frame(self): df = DataFrame({ 'string_data': ['a', 'b', 'c', 'd', 'e'], @@ -693,82 +696,113 @@ def test_describe_tz_values(self, tz_naive_fixture): result = df.describe(include='all') tm.assert_frame_equal(result, expected) - def test_reduce_mixed_frame(self): - # GH 6806 - df = DataFrame({ - 'bool_data': [True, True, False, False, False], - 'int_data': [10, 20, 30, 40, 50], - 'string_data': ['a', 'b', 'c', 'd', 'e'], - }) - df.reindex(columns=['bool_data', 'int_data', 'string_data']) - test = df.sum(axis=0) - tm.assert_numpy_array_equal(test.values, - np.array([2, 150, 'abcde'], dtype=object)) - tm.assert_series_equal(test, df.T.sum(axis=1)) + # --------------------------------------------------------------------- + # Reductions - def test_count(self, float_frame_with_na, float_frame, float_string_frame): - f = lambda s: notna(s).sum() - assert_stat_op_calc('count', f, float_frame_with_na, has_skipna=False, - check_dtype=False, check_dates=True) + def test_stat_op_api(self, float_frame, float_string_frame): assert_stat_op_api('count', float_frame, float_string_frame, has_numeric_only=True) + assert_stat_op_api('sum', float_frame, float_string_frame, + has_numeric_only=True) - # corner case - frame = DataFrame() - ct1 = frame.count(1) - assert isinstance(ct1, Series) + assert_stat_op_api('nunique', float_frame, float_string_frame) + assert_stat_op_api('mean', float_frame, float_string_frame) + assert_stat_op_api('product', float_frame, float_string_frame) + assert_stat_op_api('median', float_frame, float_string_frame) + assert_stat_op_api('min', float_frame, float_string_frame) + assert_stat_op_api('max', float_frame, float_string_frame) + assert_stat_op_api('mad', float_frame, float_string_frame) + assert_stat_op_api('var', float_frame, float_string_frame) + assert_stat_op_api('std', float_frame, float_string_frame) + assert_stat_op_api('sem', float_frame, float_string_frame) + assert_stat_op_api('median', float_frame, float_string_frame) - ct2 = frame.count(0) - assert isinstance(ct2, Series) + try: + from scipy.stats import skew, kurtosis # noqa:F401 + assert_stat_op_api('skew', float_frame, float_string_frame) + assert_stat_op_api('kurt', float_frame, float_string_frame) + except ImportError: + pass - # GH 423 - df = DataFrame(index=lrange(10)) - result = df.count(1) - expected = Series(0, index=df.index) - tm.assert_series_equal(result, expected) + def test_stat_op_calc(self, float_frame_with_na, mixed_float_frame): - df = DataFrame(columns=lrange(10)) - result = df.count(0) - expected = Series(0, index=df.columns) - tm.assert_series_equal(result, expected) + def count(s): + return notna(s).sum() - df = DataFrame() - result = df.count() - expected = Series(0, index=[]) - tm.assert_series_equal(result, expected) + def nunique(s): + return len(algorithms.unique1d(s.dropna())) - def test_nunique(self, float_frame_with_na, float_frame, - float_string_frame): - f = lambda s: len(algorithms.unique1d(s.dropna())) - assert_stat_op_calc('nunique', f, float_frame_with_na, + def mad(x): + return np.abs(x - x.mean()).mean() + + def var(x): + return np.var(x, ddof=1) + + def std(x): + return np.std(x, ddof=1) + + def sem(x): + return np.std(x, ddof=1) / np.sqrt(len(x)) + + def skewness(x): + from scipy.stats import skew # noqa:F811 + if len(x) < 3: + return np.nan + return skew(x, bias=False) + + def kurt(x): + from scipy.stats import kurtosis # noqa:F811 + if len(x) < 4: + return np.nan + return kurtosis(x, bias=False) + + assert_stat_op_calc('nunique', nunique, float_frame_with_na, has_skipna=False, check_dtype=False, check_dates=True) - assert_stat_op_api('nunique', float_frame, float_string_frame) - df = DataFrame({'A': [1, 1, 1], - 'B': [1, 2, 3], - 'C': [1, np.nan, 3]}) - tm.assert_series_equal(df.nunique(), Series({'A': 1, 'B': 3, 'C': 2})) - tm.assert_series_equal(df.nunique(dropna=False), - Series({'A': 1, 'B': 3, 'C': 3})) - tm.assert_series_equal(df.nunique(axis=1), Series({0: 1, 1: 2, 2: 2})) - tm.assert_series_equal(df.nunique(axis=1, dropna=False), - Series({0: 1, 1: 3, 2: 2})) - - def test_sum(self, float_frame_with_na, mixed_float_frame, - float_frame, float_string_frame): - assert_stat_op_api('sum', float_frame, float_string_frame, - has_numeric_only=True) - assert_stat_op_calc('sum', np.sum, float_frame_with_na, - skipna_alternative=np.nansum) # mixed types (with upcasting happening) assert_stat_op_calc('sum', np.sum, mixed_float_frame.astype('float32'), check_dtype=False, check_less_precise=True) + assert_stat_op_calc('sum', np.sum, float_frame_with_na, + skipna_alternative=np.nansum) + assert_stat_op_calc('mean', np.mean, float_frame_with_na, + check_dates=True) + assert_stat_op_calc('product', np.prod, float_frame_with_na) + + assert_stat_op_calc('mad', mad, float_frame_with_na) + assert_stat_op_calc('var', var, float_frame_with_na) + assert_stat_op_calc('std', std, float_frame_with_na) + assert_stat_op_calc('sem', sem, float_frame_with_na) + + assert_stat_op_calc('count', count, float_frame_with_na, + has_skipna=False, check_dtype=False, + check_dates=True) + + try: + from scipy import skew, kurtosis # noqa:F401 + assert_stat_op_calc('skew', skewness, float_frame_with_na) + assert_stat_op_calc('kurt', kurt, float_frame_with_na) + except ImportError: + pass + + # TODO: Ensure warning isn't emitted in the first place + @pytest.mark.filterwarnings("ignore:All-NaN:RuntimeWarning") + def test_median(self, float_frame_with_na, int_frame): + def wrapper(x): + if isna(x).any(): + return np.nan + return np.median(x) + + assert_stat_op_calc('median', wrapper, float_frame_with_na, + check_dates=True) + assert_stat_op_calc('median', wrapper, int_frame, check_dtype=False, + check_dates=True) + @pytest.mark.parametrize('method', ['sum', 'mean', 'prod', 'var', 'std', 'skew', 'min', 'max']) def test_stat_operators_attempt_obj_array(self, method): - # GH 676 + # GH#676 data = { 'a': [-0.00049987540199591344, -0.0016467257772919831, 0.00067695870775883013], @@ -789,108 +823,65 @@ def test_stat_operators_attempt_obj_array(self, method): if method in ['sum', 'prod']: tm.assert_series_equal(result, expected) - def test_mean(self, float_frame_with_na, float_frame, float_string_frame): - assert_stat_op_calc('mean', np.mean, float_frame_with_na, - check_dates=True) - assert_stat_op_api('mean', float_frame, float_string_frame) - - def test_product(self, float_frame_with_na, float_frame, - float_string_frame): - assert_stat_op_calc('product', np.prod, float_frame_with_na) - assert_stat_op_api('product', float_frame, float_string_frame) - - # TODO: Ensure warning isn't emitted in the first place - @pytest.mark.filterwarnings("ignore:All-NaN:RuntimeWarning") - def test_median(self, float_frame_with_na, float_frame, - float_string_frame): - def wrapper(x): - if isna(x).any(): - return np.nan - return np.median(x) - - assert_stat_op_calc('median', wrapper, float_frame_with_na, - check_dates=True) - assert_stat_op_api('median', float_frame, float_string_frame) - - def test_min(self, float_frame_with_na, int_frame, - float_frame, float_string_frame): - with warnings.catch_warnings(record=True): - warnings.simplefilter("ignore", RuntimeWarning) - assert_stat_op_calc('min', np.min, float_frame_with_na, - check_dates=True) - assert_stat_op_calc('min', np.min, int_frame) - assert_stat_op_api('min', float_frame, float_string_frame) - - def test_cummin(self, datetime_frame): - datetime_frame.loc[5:10, 0] = np.nan - datetime_frame.loc[10:15, 1] = np.nan - datetime_frame.loc[15:, 2] = np.nan - - # axis = 0 - cummin = datetime_frame.cummin() - expected = datetime_frame.apply(Series.cummin) - tm.assert_frame_equal(cummin, expected) - - # axis = 1 - cummin = datetime_frame.cummin(axis=1) - expected = datetime_frame.apply(Series.cummin, axis=1) - tm.assert_frame_equal(cummin, expected) - - # it works - df = DataFrame({'A': np.arange(20)}, index=np.arange(20)) - result = df.cummin() # noqa - - # fix issue - cummin_xs = datetime_frame.cummin(axis=1) - assert np.shape(cummin_xs) == np.shape(datetime_frame) - - def test_cummax(self, datetime_frame): - datetime_frame.loc[5:10, 0] = np.nan - datetime_frame.loc[10:15, 1] = np.nan - datetime_frame.loc[15:, 2] = np.nan - - # axis = 0 - cummax = datetime_frame.cummax() - expected = datetime_frame.apply(Series.cummax) - tm.assert_frame_equal(cummax, expected) - - # axis = 1 - cummax = datetime_frame.cummax(axis=1) - expected = datetime_frame.apply(Series.cummax, axis=1) - tm.assert_frame_equal(cummax, expected) + @pytest.mark.parametrize('op', ['mean', 'std', 'var', + 'skew', 'kurt', 'sem']) + def test_mixed_ops(self, op): + # GH#16116 + df = DataFrame({'int': [1, 2, 3, 4], + 'float': [1., 2., 3., 4.], + 'str': ['a', 'b', 'c', 'd']}) - # it works - df = DataFrame({'A': np.arange(20)}, index=np.arange(20)) - result = df.cummax() # noqa + result = getattr(df, op)() + assert len(result) == 2 - # fix issue - cummax_xs = datetime_frame.cummax(axis=1) - assert np.shape(cummax_xs) == np.shape(datetime_frame) + with pd.option_context('use_bottleneck', False): + result = getattr(df, op)() + assert len(result) == 2 - def test_max(self, float_frame_with_na, int_frame, - float_frame, float_string_frame): - with warnings.catch_warnings(record=True): - warnings.simplefilter("ignore", RuntimeWarning) - assert_stat_op_calc('max', np.max, float_frame_with_na, - check_dates=True) - assert_stat_op_calc('max', np.max, int_frame) - assert_stat_op_api('max', float_frame, float_string_frame) + def test_reduce_mixed_frame(self): + # GH 6806 + df = DataFrame({ + 'bool_data': [True, True, False, False, False], + 'int_data': [10, 20, 30, 40, 50], + 'string_data': ['a', 'b', 'c', 'd', 'e'], + }) + df.reindex(columns=['bool_data', 'int_data', 'string_data']) + test = df.sum(axis=0) + tm.assert_numpy_array_equal(test.values, + np.array([2, 150, 'abcde'], dtype=object)) + tm.assert_series_equal(test, df.T.sum(axis=1)) - def test_mad(self, float_frame_with_na, float_frame, float_string_frame): - f = lambda x: np.abs(x - x.mean()).mean() - assert_stat_op_calc('mad', f, float_frame_with_na) - assert_stat_op_api('mad', float_frame, float_string_frame) + def test_nunique(self): + df = DataFrame({'A': [1, 1, 1], + 'B': [1, 2, 3], + 'C': [1, np.nan, 3]}) + tm.assert_series_equal(df.nunique(), Series({'A': 1, 'B': 3, 'C': 2})) + tm.assert_series_equal(df.nunique(dropna=False), + Series({'A': 1, 'B': 3, 'C': 3})) + tm.assert_series_equal(df.nunique(axis=1), Series({0: 1, 1: 2, 2: 2})) + tm.assert_series_equal(df.nunique(axis=1, dropna=False), + Series({0: 1, 1: 3, 2: 2})) - def test_var_std(self, float_frame_with_na, datetime_frame, float_frame, - float_string_frame): - alt = lambda x: np.var(x, ddof=1) - assert_stat_op_calc('var', alt, float_frame_with_na) - assert_stat_op_api('var', float_frame, float_string_frame) + @pytest.mark.parametrize('tz', [None, 'UTC']) + def test_mean_mixed_datetime_numeric(self, tz): + # https://github.com/pandas-dev/pandas/issues/24752 + df = pd.DataFrame({"A": [1, 1], + "B": [pd.Timestamp('2000', tz=tz)] * 2}) + result = df.mean() + expected = pd.Series([1.0], index=['A']) + tm.assert_series_equal(result, expected) - alt = lambda x: np.std(x, ddof=1) - assert_stat_op_calc('std', alt, float_frame_with_na) - assert_stat_op_api('std', float_frame, float_string_frame) + @pytest.mark.parametrize('tz', [None, 'UTC']) + def test_mean_excludeds_datetimes(self, tz): + # https://github.com/pandas-dev/pandas/issues/24752 + # Our long-term desired behavior is unclear, but the behavior in + # 0.24.0rc1 was buggy. + df = pd.DataFrame({"A": [pd.Timestamp('2000', tz=tz)] * 2}) + result = df.mean() + expected = pd.Series() + tm.assert_series_equal(result, expected) + def test_var_std(self, datetime_frame): result = datetime_frame.std(ddof=4) expected = datetime_frame.apply(lambda x: x.std(ddof=4)) tm.assert_almost_equal(result, expected) @@ -933,79 +924,7 @@ def test_numeric_only_flag(self, meth): pytest.raises(TypeError, lambda: getattr(df2, meth)( axis=1, numeric_only=False)) - @pytest.mark.parametrize('op', ['mean', 'std', 'var', - 'skew', 'kurt', 'sem']) - def test_mixed_ops(self, op): - # GH 16116 - df = DataFrame({'int': [1, 2, 3, 4], - 'float': [1., 2., 3., 4.], - 'str': ['a', 'b', 'c', 'd']}) - - result = getattr(df, op)() - assert len(result) == 2 - - with pd.option_context('use_bottleneck', False): - result = getattr(df, op)() - assert len(result) == 2 - - def test_cumsum(self, datetime_frame): - datetime_frame.loc[5:10, 0] = np.nan - datetime_frame.loc[10:15, 1] = np.nan - datetime_frame.loc[15:, 2] = np.nan - - # axis = 0 - cumsum = datetime_frame.cumsum() - expected = datetime_frame.apply(Series.cumsum) - tm.assert_frame_equal(cumsum, expected) - - # axis = 1 - cumsum = datetime_frame.cumsum(axis=1) - expected = datetime_frame.apply(Series.cumsum, axis=1) - tm.assert_frame_equal(cumsum, expected) - - # works - df = DataFrame({'A': np.arange(20)}, index=np.arange(20)) - result = df.cumsum() # noqa - - # fix issue - cumsum_xs = datetime_frame.cumsum(axis=1) - assert np.shape(cumsum_xs) == np.shape(datetime_frame) - - def test_cumprod(self, datetime_frame): - datetime_frame.loc[5:10, 0] = np.nan - datetime_frame.loc[10:15, 1] = np.nan - datetime_frame.loc[15:, 2] = np.nan - - # axis = 0 - cumprod = datetime_frame.cumprod() - expected = datetime_frame.apply(Series.cumprod) - tm.assert_frame_equal(cumprod, expected) - - # axis = 1 - cumprod = datetime_frame.cumprod(axis=1) - expected = datetime_frame.apply(Series.cumprod, axis=1) - tm.assert_frame_equal(cumprod, expected) - - # fix issue - cumprod_xs = datetime_frame.cumprod(axis=1) - assert np.shape(cumprod_xs) == np.shape(datetime_frame) - - # ints - df = datetime_frame.fillna(0).astype(int) - df.cumprod(0) - df.cumprod(1) - - # ints32 - df = datetime_frame.fillna(0).astype(np.int32) - df.cumprod(0) - df.cumprod(1) - - def test_sem(self, float_frame_with_na, datetime_frame, - float_frame, float_string_frame): - alt = lambda x: np.std(x, ddof=1) / np.sqrt(len(x)) - assert_stat_op_calc('sem', alt, float_frame_with_na) - assert_stat_op_api('sem', float_frame, float_string_frame) - + def test_sem(self, datetime_frame): result = datetime_frame.sem(ddof=4) expected = datetime_frame.apply( lambda x: x.std(ddof=4) / np.sqrt(len(x))) @@ -1020,29 +939,7 @@ def test_sem(self, float_frame_with_na, datetime_frame, assert not (result < 0).any() @td.skip_if_no_scipy - def test_skew(self, float_frame_with_na, float_frame, float_string_frame): - from scipy.stats import skew - - def alt(x): - if len(x) < 3: - return np.nan - return skew(x, bias=False) - - assert_stat_op_calc('skew', alt, float_frame_with_na) - assert_stat_op_api('skew', float_frame, float_string_frame) - - @td.skip_if_no_scipy - def test_kurt(self, float_frame_with_na, float_frame, float_string_frame): - from scipy.stats import kurtosis - - def alt(x): - if len(x) < 4: - return np.nan - return kurtosis(x, bias=False) - - assert_stat_op_calc('kurt', alt, float_frame_with_na) - assert_stat_op_api('kurt', float_frame, float_string_frame) - + def test_kurt(self): index = MultiIndex(levels=[['bar'], ['one', 'two', 'three'], [0, 1]], codes=[[0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 2], @@ -1304,20 +1201,146 @@ def test_stats_mixed_type(self, float_string_frame): float_string_frame.mean(1) float_string_frame.skew(1) - # TODO: Ensure warning isn't emitted in the first place - @pytest.mark.filterwarnings("ignore:All-NaN:RuntimeWarning") - def test_median_corner(self, int_frame, float_frame, float_string_frame): - def wrapper(x): - if isna(x).any(): - return np.nan - return np.median(x) + def test_sum_bools(self): + df = DataFrame(index=lrange(1), columns=lrange(10)) + bools = isna(df) + assert bools.sum(axis=1)[0] == 10 - assert_stat_op_calc('median', wrapper, int_frame, check_dtype=False, - check_dates=True) - assert_stat_op_api('median', float_frame, float_string_frame) + # --------------------------------------------------------------------- + # Cumulative Reductions - cumsum, cummax, ... + + def test_cumsum_corner(self): + dm = DataFrame(np.arange(20).reshape(4, 5), + index=lrange(4), columns=lrange(5)) + # ?(wesm) + result = dm.cumsum() # noqa + def test_cumsum(self, datetime_frame): + datetime_frame.loc[5:10, 0] = np.nan + datetime_frame.loc[10:15, 1] = np.nan + datetime_frame.loc[15:, 2] = np.nan + + # axis = 0 + cumsum = datetime_frame.cumsum() + expected = datetime_frame.apply(Series.cumsum) + tm.assert_frame_equal(cumsum, expected) + + # axis = 1 + cumsum = datetime_frame.cumsum(axis=1) + expected = datetime_frame.apply(Series.cumsum, axis=1) + tm.assert_frame_equal(cumsum, expected) + + # works + df = DataFrame({'A': np.arange(20)}, index=np.arange(20)) + result = df.cumsum() # noqa + + # fix issue + cumsum_xs = datetime_frame.cumsum(axis=1) + assert np.shape(cumsum_xs) == np.shape(datetime_frame) + + def test_cumprod(self, datetime_frame): + datetime_frame.loc[5:10, 0] = np.nan + datetime_frame.loc[10:15, 1] = np.nan + datetime_frame.loc[15:, 2] = np.nan + + # axis = 0 + cumprod = datetime_frame.cumprod() + expected = datetime_frame.apply(Series.cumprod) + tm.assert_frame_equal(cumprod, expected) + + # axis = 1 + cumprod = datetime_frame.cumprod(axis=1) + expected = datetime_frame.apply(Series.cumprod, axis=1) + tm.assert_frame_equal(cumprod, expected) + + # fix issue + cumprod_xs = datetime_frame.cumprod(axis=1) + assert np.shape(cumprod_xs) == np.shape(datetime_frame) + + # ints + df = datetime_frame.fillna(0).astype(int) + df.cumprod(0) + df.cumprod(1) + + # ints32 + df = datetime_frame.fillna(0).astype(np.int32) + df.cumprod(0) + df.cumprod(1) + + def test_cummin(self, datetime_frame): + datetime_frame.loc[5:10, 0] = np.nan + datetime_frame.loc[10:15, 1] = np.nan + datetime_frame.loc[15:, 2] = np.nan + + # axis = 0 + cummin = datetime_frame.cummin() + expected = datetime_frame.apply(Series.cummin) + tm.assert_frame_equal(cummin, expected) + + # axis = 1 + cummin = datetime_frame.cummin(axis=1) + expected = datetime_frame.apply(Series.cummin, axis=1) + tm.assert_frame_equal(cummin, expected) + + # it works + df = DataFrame({'A': np.arange(20)}, index=np.arange(20)) + result = df.cummin() # noqa + + # fix issue + cummin_xs = datetime_frame.cummin(axis=1) + assert np.shape(cummin_xs) == np.shape(datetime_frame) + + def test_cummax(self, datetime_frame): + datetime_frame.loc[5:10, 0] = np.nan + datetime_frame.loc[10:15, 1] = np.nan + datetime_frame.loc[15:, 2] = np.nan + + # axis = 0 + cummax = datetime_frame.cummax() + expected = datetime_frame.apply(Series.cummax) + tm.assert_frame_equal(cummax, expected) + + # axis = 1 + cummax = datetime_frame.cummax(axis=1) + expected = datetime_frame.apply(Series.cummax, axis=1) + tm.assert_frame_equal(cummax, expected) + + # it works + df = DataFrame({'A': np.arange(20)}, index=np.arange(20)) + result = df.cummax() # noqa + + # fix issue + cummax_xs = datetime_frame.cummax(axis=1) + assert np.shape(cummax_xs) == np.shape(datetime_frame) + + # --------------------------------------------------------------------- # Miscellanea + def test_count(self): + # corner case + frame = DataFrame() + ct1 = frame.count(1) + assert isinstance(ct1, Series) + + ct2 = frame.count(0) + assert isinstance(ct2, Series) + + # GH#423 + df = DataFrame(index=lrange(10)) + result = df.count(1) + expected = Series(0, index=df.index) + tm.assert_series_equal(result, expected) + + df = DataFrame(columns=lrange(10)) + result = df.count(0) + expected = Series(0, index=df.columns) + tm.assert_series_equal(result, expected) + + df = DataFrame() + result = df.count() + expected = Series(0, index=[]) + tm.assert_series_equal(result, expected) + def test_count_objects(self, float_string_frame): dm = DataFrame(float_string_frame._series) df = DataFrame(float_string_frame._series) @@ -1325,17 +1348,23 @@ def test_count_objects(self, float_string_frame): tm.assert_series_equal(dm.count(), df.count()) tm.assert_series_equal(dm.count(1), df.count(1)) - def test_cumsum_corner(self): - dm = DataFrame(np.arange(20).reshape(4, 5), - index=lrange(4), columns=lrange(5)) - # ?(wesm) - result = dm.cumsum() # noqa + def test_pct_change(self): + # GH#11150 + pnl = DataFrame([np.arange(0, 40, 10), + np.arange(0, 40, 10), + np.arange(0, 40, 10)]).astype(np.float64) + pnl.iat[1, 0] = np.nan + pnl.iat[1, 1] = np.nan + pnl.iat[2, 3] = 60 - def test_sum_bools(self): - df = DataFrame(index=lrange(1), columns=lrange(10)) - bools = isna(df) - assert bools.sum(axis=1)[0] == 10 + for axis in range(2): + expected = pnl.ffill(axis=axis) / pnl.ffill(axis=axis).shift( + axis=axis) - 1 + result = pnl.pct_change(axis=axis, fill_method='pad') + tm.assert_frame_equal(result, expected) + + # ---------------------------------------------------------------------- # Index of max / min def test_idxmin(self, float_frame, int_frame): @@ -1423,6 +1452,26 @@ def test_any_datetime(self): expected = Series([True, True, True, False]) tm.assert_series_equal(result, expected) + def test_any_all_bool_only(self): + + # GH 25101 + df = DataFrame({"col1": [1, 2, 3], + "col2": [4, 5, 6], + "col3": [None, None, None]}) + + result = df.all(bool_only=True) + expected = Series(dtype=np.bool) + tm.assert_series_equal(result, expected) + + df = DataFrame({"col1": [1, 2, 3], + "col2": [4, 5, 6], + "col3": [None, None, None], + "col4": [False, False, True]}) + + result = df.all(bool_only=True) + expected = Series({"col4": False}) + tm.assert_series_equal(result, expected) + @pytest.mark.parametrize('func, data, expected', [ (np.any, {}, False), (np.all, {}, True), @@ -1661,7 +1710,9 @@ def test_isin_empty_datetimelike(self): result = df1_td.isin(df3) tm.assert_frame_equal(result, expected) + # --------------------------------------------------------------------- # Rounding + def test_round(self): # GH 2665 @@ -1849,22 +1900,9 @@ def test_round_nonunique_categorical(self): tm.assert_frame_equal(result, expected) - def test_pct_change(self): - # GH 11150 - pnl = DataFrame([np.arange(0, 40, 10), np.arange(0, 40, 10), np.arange( - 0, 40, 10)]).astype(np.float64) - pnl.iat[1, 0] = np.nan - pnl.iat[1, 1] = np.nan - pnl.iat[2, 3] = 60 - - for axis in range(2): - expected = pnl.ffill(axis=axis) / pnl.ffill(axis=axis).shift( - axis=axis) - 1 - result = pnl.pct_change(axis=axis, fill_method='pad') - - tm.assert_frame_equal(result, expected) - + # --------------------------------------------------------------------- # Clip + def test_clip(self, float_frame): median = float_frame.median().median() original = float_frame.copy() @@ -2037,7 +2075,9 @@ def test_clip_with_na_args(self, float_frame): 'col_2': [np.nan, np.nan, np.nan]}) tm.assert_frame_equal(result, expected) + # --------------------------------------------------------------------- # Matrix-like + def test_dot(self): a = DataFrame(np.random.randn(3, 4), index=['a', 'b', 'c'], columns=['p', 'q', 'r', 's']) diff --git a/pandas/tests/frame/test_apply.py b/pandas/tests/frame/test_apply.py index ade527a16c902..a4cd1aa3bacb6 100644 --- a/pandas/tests/frame/test_apply.py +++ b/pandas/tests/frame/test_apply.py @@ -318,6 +318,13 @@ def test_apply_reduce_Series(self, float_frame): result = float_frame.apply(np.mean, axis=1) assert_series_equal(result, expected) + def test_apply_reduce_rows_to_dict(self): + # GH 25196 + data = pd.DataFrame([[1, 2], [3, 4]]) + expected = pd.Series([{0: 1, 1: 3}, {0: 2, 1: 4}]) + result = data.apply(dict) + assert_series_equal(result, expected) + def test_apply_differently_indexed(self): df = DataFrame(np.random.randn(20, 10)) diff --git a/pandas/tests/frame/test_constructors.py b/pandas/tests/frame/test_constructors.py index 4f6a2e2bfbebf..a8a78b26e317c 100644 --- a/pandas/tests/frame/test_constructors.py +++ b/pandas/tests/frame/test_constructors.py @@ -2,6 +2,7 @@ from __future__ import print_function +from collections import OrderedDict from datetime import datetime, timedelta import functools import itertools @@ -11,8 +12,7 @@ import pytest from pandas.compat import ( - PY3, PY36, OrderedDict, is_platform_little_endian, lmap, long, lrange, - lzip, range, zip) + PY3, PY36, is_platform_little_endian, lmap, long, lrange, lzip, range, zip) from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike from pandas.core.dtypes.common import is_integer_dtype @@ -787,6 +787,17 @@ def test_constructor_maskedarray_hardened(self): dtype=float) tm.assert_frame_equal(result, expected) + def test_constructor_maskedrecarray_dtype(self): + # Ensure constructor honors dtype + data = np.ma.array( + np.ma.zeros(5, dtype=[('date', ' is a non-fixed frequency'), + ('M', ' is a non-fixed frequency'), + ('foobar', 'Invalid frequency: foobar')]) + def test_round_invalid(self, freq, error_msg): + dti = date_range('20130101 09:10:11', periods=5) + dti = dti.tz_localize('UTC').tz_convert('US/Eastern') + with pytest.raises(ValueError, match=error_msg): + dti.round(freq) def test_round(self, tz_naive_fixture): tz = tz_naive_fixture diff --git a/pandas/tests/indexes/datetimes/test_setops.py b/pandas/tests/indexes/datetimes/test_setops.py index bd37cc815d0f7..19009e45ee83a 100644 --- a/pandas/tests/indexes/datetimes/test_setops.py +++ b/pandas/tests/indexes/datetimes/test_setops.py @@ -138,7 +138,7 @@ def test_intersection2(self): @pytest.mark.parametrize("tz", [None, 'Asia/Tokyo', 'US/Eastern', 'dateutil/US/Pacific']) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection(self, tz, sort): # GH 4690 (with tz) base = date_range('6/1/2000', '6/30/2000', freq='D', name='idx') @@ -187,7 +187,7 @@ def test_intersection(self, tz, sort): for (rng, expected) in [(rng2, expected2), (rng3, expected3), (rng4, expected4)]: result = base.intersection(rng, sort=sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) assert result.name == expected.name @@ -212,7 +212,7 @@ def test_intersection_bug_1708(self): assert len(result) == 0 @pytest.mark.parametrize("tz", tz) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference(self, tz, sort): rng_dates = ['1/2/2000', '1/3/2000', '1/1/2000', '1/4/2000', '1/5/2000'] @@ -233,11 +233,11 @@ def test_difference(self, tz, sort): (rng2, other2, expected2), (rng3, other3, expected3)]: result_diff = rng.difference(other, sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result_diff, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_freq(self, sort): # GH14323: difference of DatetimeIndex should not preserve frequency @@ -254,7 +254,7 @@ def test_difference_freq(self, sort): tm.assert_index_equal(idx_diff, expected) tm.assert_attr_equal('freq', idx_diff, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_datetimeindex_diff(self, sort): dti1 = date_range(freq='Q-JAN', start=datetime(1997, 12, 31), periods=100) diff --git a/pandas/tests/indexes/datetimes/test_timezones.py b/pandas/tests/indexes/datetimes/test_timezones.py index 8bcc9296cb010..12c1b15733895 100644 --- a/pandas/tests/indexes/datetimes/test_timezones.py +++ b/pandas/tests/indexes/datetimes/test_timezones.py @@ -434,24 +434,19 @@ def test_dti_tz_localize_utc_conversion(self, tz): with pytest.raises(pytz.NonExistentTimeError): rng.tz_localize(tz) - @pytest.mark.parametrize('idx', [ - date_range(start='2014-01-01', end='2014-12-31', freq='M'), - date_range(start='2014-01-01', end='2014-12-31', freq='D'), - date_range(start='2014-01-01', end='2014-03-01', freq='H'), - date_range(start='2014-08-01', end='2014-10-31', freq='T') - ]) - def test_dti_tz_localize_roundtrip(self, tz_aware_fixture, idx): + def test_dti_tz_localize_roundtrip(self, tz_aware_fixture): + # note: this tz tests that a tz-naive index can be localized + # and de-localized successfully, when there are no DST transitions + # in the range. + idx = date_range(start='2014-06-01', end='2014-08-30', freq='15T') tz = tz_aware_fixture localized = idx.tz_localize(tz) - expected = date_range(start=idx[0], end=idx[-1], freq=idx.freq, - tz=tz) - tm.assert_index_equal(localized, expected) + # cant localize a tz-aware object with pytest.raises(TypeError): localized.tz_localize(tz) - reset = localized.tz_localize(None) - tm.assert_index_equal(reset, idx) assert reset.tzinfo is None + tm.assert_index_equal(reset, idx) def test_dti_tz_localize_naive(self): rng = date_range('1/1/2011', periods=100, freq='H') diff --git a/pandas/tests/indexes/datetimes/test_tools.py b/pandas/tests/indexes/datetimes/test_tools.py index bec2fa66c43cd..b94935d2521eb 100644 --- a/pandas/tests/indexes/datetimes/test_tools.py +++ b/pandas/tests/indexes/datetimes/test_tools.py @@ -346,12 +346,16 @@ def test_to_datetime_dt64s(self, cache): for dt in in_bound_dts: assert pd.to_datetime(dt, cache=cache) == Timestamp(dt) - oob_dts = [np.datetime64('1000-01-01'), np.datetime64('5000-01-02'), ] - - for dt in oob_dts: - pytest.raises(ValueError, pd.to_datetime, dt, errors='raise') - pytest.raises(ValueError, Timestamp, dt) - assert pd.to_datetime(dt, errors='coerce', cache=cache) is NaT + @pytest.mark.parametrize('dt', [np.datetime64('1000-01-01'), + np.datetime64('5000-01-02')]) + @pytest.mark.parametrize('cache', [True, False]) + def test_to_datetime_dt64s_out_of_bounds(self, cache, dt): + msg = "Out of bounds nanosecond timestamp: {}".format(dt) + with pytest.raises(OutOfBoundsDatetime, match=msg): + pd.to_datetime(dt, errors='raise') + with pytest.raises(OutOfBoundsDatetime, match=msg): + Timestamp(dt) + assert pd.to_datetime(dt, errors='coerce', cache=cache) is NaT @pytest.mark.parametrize('cache', [True, False]) def test_to_datetime_array_of_dt64s(self, cache): @@ -367,8 +371,9 @@ def test_to_datetime_array_of_dt64s(self, cache): # A list of datetimes where the last one is out of bounds dts_with_oob = dts + [np.datetime64('9999-01-01')] - pytest.raises(ValueError, pd.to_datetime, dts_with_oob, - errors='raise') + msg = "Out of bounds nanosecond timestamp: 9999-01-01 00:00:00" + with pytest.raises(OutOfBoundsDatetime, match=msg): + pd.to_datetime(dts_with_oob, errors='raise') tm.assert_numpy_array_equal( pd.to_datetime(dts_with_oob, box=False, errors='coerce', @@ -410,7 +415,10 @@ def test_to_datetime_tz(self, cache): # mixed tzs will raise arr = [pd.Timestamp('2013-01-01 13:00:00', tz='US/Pacific'), pd.Timestamp('2013-01-02 14:00:00', tz='US/Eastern')] - pytest.raises(ValueError, lambda: pd.to_datetime(arr, cache=cache)) + msg = ("Tz-aware datetime.datetime cannot be converted to datetime64" + " unless utc=True") + with pytest.raises(ValueError, match=msg): + pd.to_datetime(arr, cache=cache) @pytest.mark.parametrize('cache', [True, False]) def test_to_datetime_tz_pytz(self, cache): @@ -706,6 +714,29 @@ def test_iso_8601_strings_with_different_offsets(self): NaT], tz='UTC') tm.assert_index_equal(result, expected) + def test_iss8601_strings_mixed_offsets_with_naive(self): + # GH 24992 + result = pd.to_datetime([ + '2018-11-28T00:00:00', + '2018-11-28T00:00:00+12:00', + '2018-11-28T00:00:00', + '2018-11-28T00:00:00+06:00', + '2018-11-28T00:00:00' + ], utc=True) + expected = pd.to_datetime([ + '2018-11-28T00:00:00', + '2018-11-27T12:00:00', + '2018-11-28T00:00:00', + '2018-11-27T18:00:00', + '2018-11-28T00:00:00' + ], utc=True) + tm.assert_index_equal(result, expected) + + items = ['2018-11-28T00:00:00+12:00', '2018-11-28T00:00:00'] + result = pd.to_datetime(items, utc=True) + expected = pd.to_datetime(list(reversed(items)), utc=True)[::-1] + tm.assert_index_equal(result, expected) + def test_non_iso_strings_with_tz_offset(self): result = to_datetime(['March 1, 2018 12:00:00+0400'] * 2) expected = DatetimeIndex([datetime(2018, 3, 1, 12, @@ -1088,9 +1119,9 @@ def test_to_datetime_on_datetime64_series(self, cache): def test_to_datetime_with_space_in_series(self, cache): # GH 6428 s = Series(['10/18/2006', '10/18/2008', ' ']) - pytest.raises(ValueError, lambda: to_datetime(s, - errors='raise', - cache=cache)) + msg = r"(\(u?')?String does not contain a date(:', ' '\))?" + with pytest.raises(ValueError, match=msg): + to_datetime(s, errors='raise', cache=cache) result_coerce = to_datetime(s, errors='coerce', cache=cache) expected_coerce = Series([datetime(2006, 10, 18), datetime(2008, 10, 18), @@ -1111,13 +1142,12 @@ def test_to_datetime_with_apply(self, cache): assert_series_equal(result, expected) td = pd.Series(['May 04', 'Jun 02', ''], index=[1, 2, 3]) - pytest.raises(ValueError, - lambda: pd.to_datetime(td, format='%b %y', - errors='raise', - cache=cache)) - pytest.raises(ValueError, - lambda: td.apply(pd.to_datetime, format='%b %y', - errors='raise', cache=cache)) + msg = r"time data '' does not match format '%b %y' \(match\)" + with pytest.raises(ValueError, match=msg): + pd.to_datetime(td, format='%b %y', errors='raise', cache=cache) + with pytest.raises(ValueError, match=msg): + td.apply(pd.to_datetime, format='%b %y', + errors='raise', cache=cache) expected = pd.to_datetime(td, format='%b %y', errors='coerce', cache=cache) @@ -1168,8 +1198,9 @@ def test_to_datetime_unprocessable_input(self, cache, box, klass): result = to_datetime([1, '1'], errors='ignore', cache=cache, box=box) expected = klass(np.array([1, '1'], dtype='O')) tm.assert_equal(result, expected) - pytest.raises(TypeError, to_datetime, [1, '1'], errors='raise', - cache=cache, box=box) + msg = "invalid string coercion to datetime" + with pytest.raises(TypeError, match=msg): + to_datetime([1, '1'], errors='raise', cache=cache, box=box) def test_to_datetime_other_datetime64_units(self): # 5/25/2012 @@ -1225,17 +1256,18 @@ def test_string_na_nat_conversion(self, cache): malformed = np.array(['1/100/2000', np.nan], dtype=object) # GH 10636, default is now 'raise' - pytest.raises(ValueError, - lambda: to_datetime(malformed, errors='raise', - cache=cache)) + msg = (r"\(u?'Unknown string format:', '1/100/2000'\)|" + "day is out of range for month") + with pytest.raises(ValueError, match=msg): + to_datetime(malformed, errors='raise', cache=cache) result = to_datetime(malformed, errors='ignore', cache=cache) # GH 21864 expected = Index(malformed) tm.assert_index_equal(result, expected) - pytest.raises(ValueError, to_datetime, malformed, errors='raise', - cache=cache) + with pytest.raises(ValueError, match=msg): + to_datetime(malformed, errors='raise', cache=cache) idx = ['a', 'b', 'c', 'd', 'e'] series = Series(['1/1/2000', np.nan, '1/3/2000', np.nan, @@ -1414,14 +1446,24 @@ def test_day_not_in_month_coerce(self, cache): @pytest.mark.parametrize('cache', [True, False]) def test_day_not_in_month_raise(self, cache): - pytest.raises(ValueError, to_datetime, '2015-02-29', - errors='raise', cache=cache) - pytest.raises(ValueError, to_datetime, '2015-02-29', - errors='raise', format="%Y-%m-%d", cache=cache) - pytest.raises(ValueError, to_datetime, '2015-02-32', - errors='raise', format="%Y-%m-%d", cache=cache) - pytest.raises(ValueError, to_datetime, '2015-04-31', - errors='raise', format="%Y-%m-%d", cache=cache) + msg = "day is out of range for month" + with pytest.raises(ValueError, match=msg): + to_datetime('2015-02-29', errors='raise', cache=cache) + + msg = "time data 2015-02-29 doesn't match format specified" + with pytest.raises(ValueError, match=msg): + to_datetime('2015-02-29', errors='raise', format="%Y-%m-%d", + cache=cache) + + msg = "time data 2015-02-32 doesn't match format specified" + with pytest.raises(ValueError, match=msg): + to_datetime('2015-02-32', errors='raise', format="%Y-%m-%d", + cache=cache) + + msg = "time data 2015-04-31 doesn't match format specified" + with pytest.raises(ValueError, match=msg): + to_datetime('2015-04-31', errors='raise', format="%Y-%m-%d", + cache=cache) @pytest.mark.parametrize('cache', [True, False]) def test_day_not_in_month_ignore(self, cache): @@ -1656,7 +1698,9 @@ def test_parsers_time(self): assert tools.to_time(time_string) == expected new_string = "14.15" - pytest.raises(ValueError, tools.to_time, new_string) + msg = r"Cannot convert arg \['14\.15'\] to a time" + with pytest.raises(ValueError, match=msg): + tools.to_time(new_string) assert tools.to_time(new_string, format="%H.%M") == expected arg = ["14:15", "20:20"] diff --git a/pandas/tests/indexes/interval/test_interval.py b/pandas/tests/indexes/interval/test_interval.py index db69258c1d3d2..e4f25ff143273 100644 --- a/pandas/tests/indexes/interval/test_interval.py +++ b/pandas/tests/indexes/interval/test_interval.py @@ -242,12 +242,10 @@ def test_take(self, closed): [0, 0, 1], [1, 1, 2], closed=closed) tm.assert_index_equal(result, expected) - def test_unique(self, closed): - # unique non-overlapping - idx = IntervalIndex.from_tuples( - [(0, 1), (2, 3), (4, 5)], closed=closed) - assert idx.is_unique is True - + def test_is_unique_interval(self, closed): + """ + Interval specific tests for is_unique in addition to base class tests + """ # unique overlapping - distinct endpoints idx = IntervalIndex.from_tuples([(0, 1), (0.5, 1.5)], closed=closed) assert idx.is_unique is True @@ -261,15 +259,6 @@ def test_unique(self, closed): idx = IntervalIndex.from_tuples([(-1, 1), (-2, 2)], closed=closed) assert idx.is_unique is True - # duplicate - idx = IntervalIndex.from_tuples( - [(0, 1), (0, 1), (2, 3)], closed=closed) - assert idx.is_unique is False - - # empty - idx = IntervalIndex([], closed=closed) - assert idx.is_unique is True - def test_monotonic(self, closed): # increasing non-overlapping idx = IntervalIndex.from_tuples( @@ -783,19 +772,19 @@ def test_non_contiguous(self, closed): assert 1.5 not in index - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union(self, closed, sort): index = self.create_index(closed=closed) other = IntervalIndex.from_breaks(range(5, 13), closed=closed) expected = IntervalIndex.from_breaks(range(13), closed=closed) result = index[::-1].union(other, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, expected) assert tm.equalContents(result, expected) result = other[::-1].union(index, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, expected) assert tm.equalContents(result, expected) @@ -812,19 +801,19 @@ def test_union(self, closed, sort): result = index.union(other, sort=sort) tm.assert_index_equal(result, index) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection(self, closed, sort): index = self.create_index(closed=closed) other = IntervalIndex.from_breaks(range(5, 13), closed=closed) expected = IntervalIndex.from_breaks(range(5, 11), closed=closed) result = index[::-1].intersection(other, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, expected) assert tm.equalContents(result, expected) result = other[::-1].intersection(index, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, expected) assert tm.equalContents(result, expected) @@ -842,14 +831,14 @@ def test_intersection(self, closed, sort): result = index.intersection(other, sort=sort) tm.assert_index_equal(result, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference(self, closed, sort): index = IntervalIndex.from_arrays([1, 0, 3, 2], [1, 2, 3, 4], closed=closed) result = index.difference(index[:1], sort=sort) expected = index[1:] - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) @@ -864,19 +853,19 @@ def test_difference(self, closed, sort): result = index.difference(other, sort=sort) tm.assert_index_equal(result, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_symmetric_difference(self, closed, sort): index = self.create_index(closed=closed) result = index[1:].symmetric_difference(index[:-1], sort=sort) expected = IntervalIndex([index[0], index[-1]]) - if sort: + if sort is None: tm.assert_index_equal(result, expected) assert tm.equalContents(result, expected) # GH 19101: empty result, same dtype result = index.symmetric_difference(index, sort=sort) expected = IntervalIndex(np.array([], dtype='int64'), closed=closed) - if sort: + if sort is None: tm.assert_index_equal(result, expected) assert tm.equalContents(result, expected) @@ -888,7 +877,7 @@ def test_symmetric_difference(self, closed, sort): @pytest.mark.parametrize('op_name', [ 'union', 'intersection', 'difference', 'symmetric_difference']) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_set_operation_errors(self, closed, op_name, sort): index = self.create_index(closed=closed) set_op = getattr(index, op_name) diff --git a/pandas/tests/indexes/multi/test_analytics.py b/pandas/tests/indexes/multi/test_analytics.py index dca6180f39664..27a5ba9e5434a 100644 --- a/pandas/tests/indexes/multi/test_analytics.py +++ b/pandas/tests/indexes/multi/test_analytics.py @@ -3,7 +3,8 @@ import numpy as np import pytest -from pandas.compat import lrange +from pandas.compat import PY2, lrange +from pandas.compat.numpy import _np_version_under1p16 import pandas as pd from pandas import Index, MultiIndex, date_range, period_range @@ -13,8 +14,11 @@ def test_shift(idx): # GH8083 test the base class for shift - pytest.raises(NotImplementedError, idx.shift, 1) - pytest.raises(NotImplementedError, idx.shift, 1, 2) + msg = "Not supported for type MultiIndex" + with pytest.raises(NotImplementedError, match=msg): + idx.shift(1) + with pytest.raises(NotImplementedError, match=msg): + idx.shift(1, 2) def test_groupby(idx): @@ -50,25 +54,26 @@ def test_truncate(): result = index.truncate(before=1, after=2) assert len(result.levels[0]) == 2 - # after < before - pytest.raises(ValueError, index.truncate, 3, 1) + msg = "after < before" + with pytest.raises(ValueError, match=msg): + index.truncate(3, 1) def test_where(): i = MultiIndex.from_tuples([('A', 1), ('A', 2)]) - with pytest.raises(NotImplementedError): + msg = r"\.where is not supported for MultiIndex operations" + with pytest.raises(NotImplementedError, match=msg): i.where(True) -def test_where_array_like(): +@pytest.mark.parametrize('klass', [list, tuple, np.array, pd.Series]) +def test_where_array_like(klass): i = MultiIndex.from_tuples([('A', 1), ('A', 2)]) - klasses = [list, tuple, np.array, pd.Series] cond = [False, True] - - for klass in klasses: - with pytest.raises(NotImplementedError): - i.where(klass(cond)) + msg = r"\.where is not supported for MultiIndex operations" + with pytest.raises(NotImplementedError, match=msg): + i.where(klass(cond)) # TODO: reshape @@ -141,7 +146,8 @@ def test_take(idx): # if not isinstance(idx, # (DatetimeIndex, PeriodIndex, TimedeltaIndex)): # GH 10791 - with pytest.raises(AttributeError): + msg = "'MultiIndex' object has no attribute 'freq'" + with pytest.raises(AttributeError, match=msg): idx.freq @@ -199,7 +205,8 @@ def test_take_fill_value(): with pytest.raises(ValueError, match=msg): idx.take(np.array([1, 0, -5]), fill_value=True) - with pytest.raises(IndexError): + msg = "index -5 is out of bounds for size 4" + with pytest.raises(IndexError, match=msg): idx.take(np.array([1, -5])) @@ -215,13 +222,15 @@ def test_sub(idx): first = idx # - now raises (previously was set op difference) - with pytest.raises(TypeError): + msg = "cannot perform __sub__ with this index type: MultiIndex" + with pytest.raises(TypeError, match=msg): first - idx[-3:] - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): idx[-3:] - first - with pytest.raises(TypeError): + with pytest.raises(TypeError, match=msg): idx[-3:] - first.tolist() - with pytest.raises(TypeError): + msg = "cannot perform __rsub__ with this index type: MultiIndex" + with pytest.raises(TypeError, match=msg): first.tolist() - idx[-3:] @@ -266,56 +275,35 @@ def test_map_dictlike(idx, mapper): tm.assert_index_equal(result, expected) +@pytest.mark.skipif(PY2, reason="pytest.raises match regex fails") @pytest.mark.parametrize('func', [ np.exp, np.exp2, np.expm1, np.log, np.log2, np.log10, np.log1p, np.sqrt, np.sin, np.cos, np.tan, np.arcsin, np.arccos, np.arctan, np.sinh, np.cosh, np.tanh, np.arcsinh, np.arccosh, np.arctanh, np.deg2rad, np.rad2deg -]) -def test_numpy_ufuncs(func): +], ids=lambda func: func.__name__) +def test_numpy_ufuncs(idx, func): # test ufuncs of numpy. see: # http://docs.scipy.org/doc/numpy/reference/ufuncs.html - # copy and paste from idx fixture as pytest doesn't support - # parameters and fixtures at the same time. - major_axis = Index(['foo', 'bar', 'baz', 'qux']) - minor_axis = Index(['one', 'two']) - major_codes = np.array([0, 0, 1, 2, 3, 3]) - minor_codes = np.array([0, 1, 0, 1, 0, 1]) - index_names = ['first', 'second'] - - idx = MultiIndex( - levels=[major_axis, minor_axis], - codes=[major_codes, minor_codes], - names=index_names, - verify_integrity=False - ) - - with pytest.raises(Exception): - with np.errstate(all='ignore'): - func(idx) + if _np_version_under1p16: + expected_exception = AttributeError + msg = "'tuple' object has no attribute '{}'".format(func.__name__) + else: + expected_exception = TypeError + msg = ("loop of ufunc does not support argument 0 of type tuple which" + " has no callable {} method").format(func.__name__) + with pytest.raises(expected_exception, match=msg): + func(idx) @pytest.mark.parametrize('func', [ np.isfinite, np.isinf, np.isnan, np.signbit -]) -def test_numpy_type_funcs(func): - # for func in [np.isfinite, np.isinf, np.isnan, np.signbit]: - # copy and paste from idx fixture as pytest doesn't support - # parameters and fixtures at the same time. - major_axis = Index(['foo', 'bar', 'baz', 'qux']) - minor_axis = Index(['one', 'two']) - major_codes = np.array([0, 0, 1, 2, 3, 3]) - minor_codes = np.array([0, 1, 0, 1, 0, 1]) - index_names = ['first', 'second'] - - idx = MultiIndex( - levels=[major_axis, minor_axis], - codes=[major_codes, minor_codes], - names=index_names, - verify_integrity=False - ) - - with pytest.raises(Exception): +], ids=lambda func: func.__name__) +def test_numpy_type_funcs(idx, func): + msg = ("ufunc '{}' not supported for the input types, and the inputs" + " could not be safely coerced to any supported types according to" + " the casting rule ''safe''").format(func.__name__) + with pytest.raises(TypeError, match=msg): func(idx) diff --git a/pandas/tests/indexes/multi/test_compat.py b/pandas/tests/indexes/multi/test_compat.py index f405fc659c709..89685b9feec27 100644 --- a/pandas/tests/indexes/multi/test_compat.py +++ b/pandas/tests/indexes/multi/test_compat.py @@ -124,8 +124,6 @@ def test_compat(indices): def test_pickle_compat_construction(holder): # this is testing for pickle compat - if holder is None: - return - # need an object to create with - pytest.raises(TypeError, holder) + with pytest.raises(TypeError, match="Must pass both levels and codes"): + holder() diff --git a/pandas/tests/indexes/multi/test_constructor.py b/pandas/tests/indexes/multi/test_constructor.py index e6678baf8a996..055d54c613260 100644 --- a/pandas/tests/indexes/multi/test_constructor.py +++ b/pandas/tests/indexes/multi/test_constructor.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from collections import OrderedDict -import re import numpy as np import pytest @@ -30,10 +29,10 @@ def test_constructor_no_levels(): with pytest.raises(ValueError, match=msg): MultiIndex(levels=[], codes=[]) - both_re = re.compile('Must pass both levels and codes') - with pytest.raises(TypeError, match=both_re): + msg = "Must pass both levels and codes" + with pytest.raises(TypeError, match=msg): MultiIndex(levels=[]) - with pytest.raises(TypeError, match=both_re): + with pytest.raises(TypeError, match=msg): MultiIndex(codes=[]) @@ -42,8 +41,8 @@ def test_constructor_nonhashable_names(): levels = [[1, 2], [u'one', u'two']] codes = [[0, 0, 1, 1], [0, 1, 0, 1]] names = (['foo'], ['bar']) - message = "MultiIndex.name must be a hashable type" - with pytest.raises(TypeError, match=message): + msg = r"MultiIndex\.name must be a hashable type" + with pytest.raises(TypeError, match=msg): MultiIndex(levels=levels, codes=codes, names=names) # With .rename() @@ -51,11 +50,11 @@ def test_constructor_nonhashable_names(): codes=[[0, 0, 1, 1], [0, 1, 0, 1]], names=('foo', 'bar')) renamed = [['foor'], ['barr']] - with pytest.raises(TypeError, match=message): + with pytest.raises(TypeError, match=msg): mi.rename(names=renamed) # With .set_names() - with pytest.raises(TypeError, match=message): + with pytest.raises(TypeError, match=msg): mi.set_names(names=renamed) @@ -67,8 +66,9 @@ def test_constructor_mismatched_codes_levels(idx): with pytest.raises(ValueError, match=msg): MultiIndex(levels=levels, codes=codes) - length_error = re.compile('>= length of level') - label_error = re.compile(r'Unequal code lengths: \[4, 2\]') + length_error = (r"On level 0, code max \(3\) >= length of level \(1\)\." + " NOTE: this index is in an inconsistent state") + label_error = r"Unequal code lengths: \[4, 2\]" # important to check that it's looking at the right thing. with pytest.raises(ValueError, match=length_error): @@ -253,21 +253,14 @@ def test_from_arrays_empty(): tm.assert_index_equal(result, expected) -@pytest.mark.parametrize('invalid_array', [ - (1), - ([1]), - ([1, 2]), - ([[1], 2]), - ('a'), - (['a']), - (['a', 'b']), - ([['a'], 'b']), -]) -def test_from_arrays_invalid_input(invalid_array): - invalid_inputs = [1, [1], [1, 2], [[1], 2], - 'a', ['a'], ['a', 'b'], [['a'], 'b']] - for i in invalid_inputs: - pytest.raises(TypeError, MultiIndex.from_arrays, arrays=i) +@pytest.mark.parametrize('invalid_sequence_of_arrays', [ + 1, [1], [1, 2], [[1], 2], 'a', ['a'], ['a', 'b'], [['a'], 'b']]) +def test_from_arrays_invalid_input(invalid_sequence_of_arrays): + msg = (r"Input must be a list / sequence of array-likes|" + r"Input must be list-like|" + r"object of type 'int' has no len\(\)") + with pytest.raises(TypeError, match=msg): + MultiIndex.from_arrays(arrays=invalid_sequence_of_arrays) @pytest.mark.parametrize('idx1, idx2', [ @@ -332,9 +325,10 @@ def test_tuples_with_name_string(): # GH 15110 and GH 14848 li = [(0, 0, 1), (0, 1, 0), (1, 0, 0)] - with pytest.raises(ValueError): + msg = "Names should be list-like for a MultiIndex" + with pytest.raises(ValueError, match=msg): pd.Index(li, name='abc') - with pytest.raises(ValueError): + with pytest.raises(ValueError, match=msg): pd.Index(li, name='a') @@ -398,7 +392,10 @@ def test_from_product_empty_three_levels(N): [['a'], 'b'], ]) def test_from_product_invalid_input(invalid_input): - pytest.raises(TypeError, MultiIndex.from_product, iterables=invalid_input) + msg = (r"Input must be a list / sequence of iterables|" + "Input must be list-like") + with pytest.raises(TypeError, match=msg): + MultiIndex.from_product(iterables=invalid_input) def test_from_product_datetimeindex(): @@ -563,15 +560,15 @@ def test_from_frame_valid_names(names_in, names_out): assert mi.names == names_out -@pytest.mark.parametrize('names_in,names_out', [ - ('bad_input', ValueError("Names should be list-like for a MultiIndex")), - (['a', 'b', 'c'], ValueError("Length of names must match number of " - "levels in MultiIndex.")) +@pytest.mark.parametrize('names,expected_error_msg', [ + ('bad_input', "Names should be list-like for a MultiIndex"), + (['a', 'b', 'c'], + "Length of names must match number of levels in MultiIndex") ]) -def test_from_frame_invalid_names(names_in, names_out): +def test_from_frame_invalid_names(names, expected_error_msg): # GH 22420 df = pd.DataFrame([['a', 'a'], ['a', 'b'], ['b', 'a'], ['b', 'b']], columns=pd.MultiIndex.from_tuples([('L1', 'x'), ('L2', 'y')])) - with pytest.raises(type(names_out), match=names_out.args[0]): - pd.MultiIndex.from_frame(df, names=names_in) + with pytest.raises(ValueError, match=expected_error_msg): + pd.MultiIndex.from_frame(df, names=names) diff --git a/pandas/tests/indexes/multi/test_contains.py b/pandas/tests/indexes/multi/test_contains.py index b73ff11a4dd4e..56836b94a6b03 100644 --- a/pandas/tests/indexes/multi/test_contains.py +++ b/pandas/tests/indexes/multi/test_contains.py @@ -83,15 +83,24 @@ def test_isin_level_kwarg(): tm.assert_numpy_array_equal(expected, idx.isin(vals_1, level=1)) tm.assert_numpy_array_equal(expected, idx.isin(vals_1, level=-1)) - pytest.raises(IndexError, idx.isin, vals_0, level=5) - pytest.raises(IndexError, idx.isin, vals_0, level=-5) - - pytest.raises(KeyError, idx.isin, vals_0, level=1.0) - pytest.raises(KeyError, idx.isin, vals_1, level=-1.0) - pytest.raises(KeyError, idx.isin, vals_1, level='A') + msg = "Too many levels: Index has only 2 levels, not 6" + with pytest.raises(IndexError, match=msg): + idx.isin(vals_0, level=5) + msg = ("Too many levels: Index has only 2 levels, -5 is not a valid level" + " number") + with pytest.raises(IndexError, match=msg): + idx.isin(vals_0, level=-5) + + with pytest.raises(KeyError, match=r"'Level 1\.0 not found'"): + idx.isin(vals_0, level=1.0) + with pytest.raises(KeyError, match=r"'Level -1\.0 not found'"): + idx.isin(vals_1, level=-1.0) + with pytest.raises(KeyError, match="'Level A not found'"): + idx.isin(vals_1, level='A') idx.names = ['A', 'B'] tm.assert_numpy_array_equal(expected, idx.isin(vals_0, level='A')) tm.assert_numpy_array_equal(expected, idx.isin(vals_1, level='B')) - pytest.raises(KeyError, idx.isin, vals_1, level='C') + with pytest.raises(KeyError, match="'Level C not found'"): + idx.isin(vals_1, level='C') diff --git a/pandas/tests/indexes/multi/test_drop.py b/pandas/tests/indexes/multi/test_drop.py index 0cf73d3d752ad..ac167c126fd13 100644 --- a/pandas/tests/indexes/multi/test_drop.py +++ b/pandas/tests/indexes/multi/test_drop.py @@ -4,7 +4,7 @@ import numpy as np import pytest -from pandas.compat import lrange +from pandas.compat import PY2, lrange from pandas.errors import PerformanceWarning import pandas as pd @@ -12,6 +12,7 @@ import pandas.util.testing as tm +@pytest.mark.skipif(PY2, reason="pytest.raises match regex fails") def test_drop(idx): dropped = idx.drop([('foo', 'two'), ('qux', 'one')]) @@ -31,13 +32,17 @@ def test_drop(idx): tm.assert_index_equal(dropped, expected) index = MultiIndex.from_tuples([('bar', 'two')]) - pytest.raises(KeyError, idx.drop, [('bar', 'two')]) - pytest.raises(KeyError, idx.drop, index) - pytest.raises(KeyError, idx.drop, ['foo', 'two']) + with pytest.raises(KeyError, match=r"^10$"): + idx.drop([('bar', 'two')]) + with pytest.raises(KeyError, match=r"^10$"): + idx.drop(index) + with pytest.raises(KeyError, match=r"^'two'$"): + idx.drop(['foo', 'two']) # partially correct argument mixed_index = MultiIndex.from_tuples([('qux', 'one'), ('bar', 'two')]) - pytest.raises(KeyError, idx.drop, mixed_index) + with pytest.raises(KeyError, match=r"^10$"): + idx.drop(mixed_index) # error='ignore' dropped = idx.drop(index, errors='ignore') @@ -59,7 +64,8 @@ def test_drop(idx): # mixed partial / full drop / error='ignore' mixed_index = ['foo', ('qux', 'one'), 'two'] - pytest.raises(KeyError, idx.drop, mixed_index) + with pytest.raises(KeyError, match=r"^'two'$"): + idx.drop(mixed_index) dropped = idx.drop(mixed_index, errors='ignore') expected = idx[[2, 3, 5]] tm.assert_index_equal(dropped, expected) @@ -98,10 +104,12 @@ def test_droplevel_list(): expected = index[:2] assert dropped.equals(expected) - with pytest.raises(ValueError): + msg = ("Cannot remove 3 levels from an index with 3 levels: at least one" + " level must be left") + with pytest.raises(ValueError, match=msg): index[:2].droplevel(['one', 'two', 'three']) - with pytest.raises(KeyError): + with pytest.raises(KeyError, match="'Level four not found'"): index[:2].droplevel(['one', 'four']) diff --git a/pandas/tests/indexes/multi/test_duplicates.py b/pandas/tests/indexes/multi/test_duplicates.py index af15026de2b34..35034dc57b4b8 100644 --- a/pandas/tests/indexes/multi/test_duplicates.py +++ b/pandas/tests/indexes/multi/test_duplicates.py @@ -143,6 +143,18 @@ def test_has_duplicates(idx, idx_dup): assert mi.is_unique is False assert mi.has_duplicates is True + # single instance of NaN + mi_nan = MultiIndex(levels=[['a', 'b'], [0, 1]], + codes=[[-1, 0, 0, 1, 1], [-1, 0, 1, 0, 1]]) + assert mi_nan.is_unique is True + assert mi_nan.has_duplicates is False + + # multiple instances of NaN + mi_nan_dup = MultiIndex(levels=[['a', 'b'], [0, 1]], + codes=[[-1, -1, 0, 0, 1, 1], [-1, -1, 0, 1, 0, 1]]) + assert mi_nan_dup.is_unique is False + assert mi_nan_dup.has_duplicates is True + def test_has_duplicates_from_tuples(): # GH 9075 diff --git a/pandas/tests/indexes/multi/test_get_set.py b/pandas/tests/indexes/multi/test_get_set.py index d201cb2eb178b..62911c7032aca 100644 --- a/pandas/tests/indexes/multi/test_get_set.py +++ b/pandas/tests/indexes/multi/test_get_set.py @@ -25,7 +25,9 @@ def test_get_level_number_integer(idx): idx.names = [1, 0] assert idx._get_level_number(1) == 0 assert idx._get_level_number(0) == 1 - pytest.raises(IndexError, idx._get_level_number, 2) + msg = "Too many levels: Index has only 2 levels, not 3" + with pytest.raises(IndexError, match=msg): + idx._get_level_number(2) with pytest.raises(KeyError, match='Level fourth not found'): idx._get_level_number('fourth') @@ -62,7 +64,7 @@ def test_get_value_duplicates(): names=['tag', 'day']) assert index.get_loc('D') == slice(0, 3) - with pytest.raises(KeyError): + with pytest.raises(KeyError, match=r"^'D'$"): index._engine.get_value(np.array([]), 'D') @@ -125,7 +127,8 @@ def test_set_name_methods(idx, index_names): ind = idx.set_names(new_names) assert idx.names == index_names assert ind.names == new_names - with pytest.raises(ValueError, match="^Length"): + msg = "Length of names must match number of levels in MultiIndex" + with pytest.raises(ValueError, match=msg): ind.set_names(new_names + new_names) new_names2 = [name + "SUFFIX2" for name in new_names] res = ind.set_names(new_names2, inplace=True) @@ -163,10 +166,10 @@ def test_set_levels_codes_directly(idx): minor_codes = [(x + 1) % 1 for x in minor_codes] new_codes = [major_codes, minor_codes] - with pytest.raises(AttributeError): + msg = "can't set attribute" + with pytest.raises(AttributeError, match=msg): idx.levels = new_levels - - with pytest.raises(AttributeError): + with pytest.raises(AttributeError, match=msg): idx.codes = new_codes diff --git a/pandas/tests/indexes/multi/test_indexing.py b/pandas/tests/indexes/multi/test_indexing.py index c40ecd9e82a07..c2af3b2050d8d 100644 --- a/pandas/tests/indexes/multi/test_indexing.py +++ b/pandas/tests/indexes/multi/test_indexing.py @@ -6,7 +6,7 @@ import numpy as np import pytest -from pandas.compat import lrange +from pandas.compat import PY2, lrange import pandas as pd from pandas import ( @@ -112,13 +112,14 @@ def test_slice_locs_not_contained(): def test_putmask_with_wrong_mask(idx): # GH18368 - with pytest.raises(ValueError): + msg = "putmask: mask and data must be the same size" + with pytest.raises(ValueError, match=msg): idx.putmask(np.ones(len(idx) + 1, np.bool), 1) - with pytest.raises(ValueError): + with pytest.raises(ValueError, match=msg): idx.putmask(np.ones(len(idx) - 1, np.bool), 1) - with pytest.raises(ValueError): + with pytest.raises(ValueError, match=msg): idx.putmask('foo', 1) @@ -176,9 +177,12 @@ def test_get_indexer(): def test_get_indexer_nearest(): midx = MultiIndex.from_tuples([('a', 1), ('b', 2)]) - with pytest.raises(NotImplementedError): + msg = ("method='nearest' not implemented yet for MultiIndex; see GitHub" + " issue 9365") + with pytest.raises(NotImplementedError, match=msg): midx.get_indexer(['a'], method='nearest') - with pytest.raises(NotImplementedError): + msg = "tolerance not implemented yet for MultiIndex" + with pytest.raises(NotImplementedError, match=msg): midx.get_indexer(['a'], method='pad', tolerance=2) @@ -251,20 +255,26 @@ def test_getitem_bool_index_single(ind1, ind2): tm.assert_index_equal(idx[ind2], expected) +@pytest.mark.skipif(PY2, reason="pytest.raises match regex fails") def test_get_loc(idx): assert idx.get_loc(('foo', 'two')) == 1 assert idx.get_loc(('baz', 'two')) == 3 - pytest.raises(KeyError, idx.get_loc, ('bar', 'two')) - pytest.raises(KeyError, idx.get_loc, 'quux') + with pytest.raises(KeyError, match=r"^10$"): + idx.get_loc(('bar', 'two')) + with pytest.raises(KeyError, match=r"^'quux'$"): + idx.get_loc('quux') - pytest.raises(NotImplementedError, idx.get_loc, 'foo', - method='nearest') + msg = ("only the default get_loc method is currently supported for" + " MultiIndex") + with pytest.raises(NotImplementedError, match=msg): + idx.get_loc('foo', method='nearest') # 3 levels index = MultiIndex(levels=[Index(lrange(4)), Index(lrange(4)), Index( lrange(4))], codes=[np.array([0, 0, 1, 2, 2, 2, 3, 3]), np.array( [0, 1, 0, 0, 0, 1, 0, 1]), np.array([1, 0, 1, 1, 0, 0, 1, 0])]) - pytest.raises(KeyError, index.get_loc, (1, 1)) + with pytest.raises(KeyError, match=r"^\(1, 1\)$"): + index.get_loc((1, 1)) assert index.get_loc((2, 0)) == slice(3, 5) @@ -297,11 +307,14 @@ def test_get_loc_level(): assert loc == expected assert new_index is None - pytest.raises(KeyError, index.get_loc_level, (2, 2)) + with pytest.raises(KeyError, match=r"^\(2, 2\)$"): + index.get_loc_level((2, 2)) # GH 22221: unused label - pytest.raises(KeyError, index.drop(2).get_loc_level, 2) + with pytest.raises(KeyError, match=r"^2$"): + index.drop(2).get_loc_level(2) # Unused label on unsorted level: - pytest.raises(KeyError, index.drop(1, level=2).get_loc_level, 2, 2) + with pytest.raises(KeyError, match=r"^2$"): + index.drop(1, level=2).get_loc_level(2, level=2) index = MultiIndex(levels=[[2000], lrange(4)], codes=[np.array( [0, 0, 0, 0]), np.array([0, 1, 2, 3])]) @@ -342,8 +355,10 @@ def test_get_loc_cast_bool(): assert idx.get_loc((0, 1)) == 1 assert idx.get_loc((1, 0)) == 2 - pytest.raises(KeyError, idx.get_loc, (False, True)) - pytest.raises(KeyError, idx.get_loc, (True, False)) + with pytest.raises(KeyError, match=r"^\(False, True\)$"): + idx.get_loc((False, True)) + with pytest.raises(KeyError, match=r"^\(True, False\)$"): + idx.get_loc((True, False)) @pytest.mark.parametrize('level', [0, 1]) @@ -361,9 +376,12 @@ def test_get_loc_missing_nan(): # GH 8569 idx = MultiIndex.from_arrays([[1.0, 2.0], [3.0, 4.0]]) assert isinstance(idx.get_loc(1), slice) - pytest.raises(KeyError, idx.get_loc, 3) - pytest.raises(KeyError, idx.get_loc, np.nan) - pytest.raises(KeyError, idx.get_loc, [np.nan]) + with pytest.raises(KeyError, match=r"^3\.0$"): + idx.get_loc(3) + with pytest.raises(KeyError, match=r"^nan$"): + idx.get_loc(np.nan) + with pytest.raises(KeyError, match=r"^\[nan\]$"): + idx.get_loc([np.nan]) def test_get_indexer_categorical_time(): diff --git a/pandas/tests/indexes/multi/test_integrity.py b/pandas/tests/indexes/multi/test_integrity.py index c1638a9cde660..a7dc093147725 100644 --- a/pandas/tests/indexes/multi/test_integrity.py +++ b/pandas/tests/indexes/multi/test_integrity.py @@ -159,7 +159,8 @@ def test_isna_behavior(idx): # should not segfault GH5123 # NOTE: if MI representation changes, may make sense to allow # isna(MI) - with pytest.raises(NotImplementedError): + msg = "isna is not defined for MultiIndex" + with pytest.raises(NotImplementedError, match=msg): pd.isna(idx) @@ -168,16 +169,16 @@ def test_large_multiindex_error(): df_below_1000000 = pd.DataFrame( 1, index=pd.MultiIndex.from_product([[1, 2], range(499999)]), columns=['dest']) - with pytest.raises(KeyError): + with pytest.raises(KeyError, match=r"^\(-1, 0\)$"): df_below_1000000.loc[(-1, 0), 'dest'] - with pytest.raises(KeyError): + with pytest.raises(KeyError, match=r"^\(3, 0\)$"): df_below_1000000.loc[(3, 0), 'dest'] df_above_1000000 = pd.DataFrame( 1, index=pd.MultiIndex.from_product([[1, 2], range(500001)]), columns=['dest']) - with pytest.raises(KeyError): + with pytest.raises(KeyError, match=r"^\(-1, 0\)$"): df_above_1000000.loc[(-1, 0), 'dest'] - with pytest.raises(KeyError): + with pytest.raises(KeyError, match=r"^\(3, 0\)$"): df_above_1000000.loc[(3, 0), 'dest'] @@ -260,7 +261,9 @@ def test_hash_error(indices): def test_mutability(indices): if not len(indices): return - pytest.raises(TypeError, indices.__setitem__, 0, indices[0]) + msg = "Index does not support mutable operations" + with pytest.raises(TypeError, match=msg): + indices[0] = indices[0] def test_wrong_number_names(indices): diff --git a/pandas/tests/indexes/multi/test_set_ops.py b/pandas/tests/indexes/multi/test_set_ops.py index 208d6cf1c639f..41a0e1e59e8a5 100644 --- a/pandas/tests/indexes/multi/test_set_ops.py +++ b/pandas/tests/indexes/multi/test_set_ops.py @@ -9,7 +9,7 @@ @pytest.mark.parametrize("case", [0.5, "xxx"]) -@pytest.mark.parametrize("sort", [True, False]) +@pytest.mark.parametrize("sort", [None, False]) @pytest.mark.parametrize("method", ["intersection", "union", "difference", "symmetric_difference"]) def test_set_ops_error_cases(idx, case, sort, method): @@ -19,13 +19,13 @@ def test_set_ops_error_cases(idx, case, sort, method): getattr(idx, method)(case, sort=sort) -@pytest.mark.parametrize("sort", [True, False]) +@pytest.mark.parametrize("sort", [None, False]) def test_intersection_base(idx, sort): first = idx[:5] second = idx[:3] intersect = first.intersection(second, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(intersect, second.sort_values()) assert tm.equalContents(intersect, second) @@ -34,7 +34,7 @@ def test_intersection_base(idx, sort): for klass in [np.array, Series, list]] for case in cases: result = first.intersection(case, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, second.sort_values()) assert tm.equalContents(result, second) @@ -43,13 +43,13 @@ def test_intersection_base(idx, sort): first.intersection([1, 2, 3], sort=sort) -@pytest.mark.parametrize("sort", [True, False]) +@pytest.mark.parametrize("sort", [None, False]) def test_union_base(idx, sort): first = idx[3:] second = idx[:5] everything = idx union = first.union(second, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(union, everything.sort_values()) assert tm.equalContents(union, everything) @@ -58,7 +58,7 @@ def test_union_base(idx, sort): for klass in [np.array, Series, list]] for case in cases: result = first.union(case, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, everything.sort_values()) assert tm.equalContents(result, everything) @@ -67,13 +67,13 @@ def test_union_base(idx, sort): first.union([1, 2, 3], sort=sort) -@pytest.mark.parametrize("sort", [True, False]) +@pytest.mark.parametrize("sort", [None, False]) def test_difference_base(idx, sort): second = idx[4:] answer = idx[:4] result = idx.difference(second, sort=sort) - if sort: + if sort is None: answer = answer.sort_values() assert result.equals(answer) @@ -91,14 +91,14 @@ def test_difference_base(idx, sort): idx.difference([1, 2, 3], sort=sort) -@pytest.mark.parametrize("sort", [True, False]) +@pytest.mark.parametrize("sort", [None, False]) def test_symmetric_difference(idx, sort): first = idx[1:] second = idx[:-1] answer = idx[[-1, 0]] result = first.symmetric_difference(second, sort=sort) - if sort: + if sort is None: answer = answer.sort_values() tm.assert_index_equal(result, answer) @@ -121,14 +121,14 @@ def test_empty(idx): assert idx[:0].empty -@pytest.mark.parametrize("sort", [True, False]) +@pytest.mark.parametrize("sort", [None, False]) def test_difference(idx, sort): first = idx result = first.difference(idx[-3:], sort=sort) vals = idx[:-3].values - if sort: + if sort is None: vals = sorted(vals) expected = MultiIndex.from_tuples(vals, @@ -189,14 +189,62 @@ def test_difference(idx, sort): first.difference([1, 2, 3, 4, 5], sort=sort) -@pytest.mark.parametrize("sort", [True, False]) +def test_difference_sort_special(): + # GH-24959 + idx = pd.MultiIndex.from_product([[1, 0], ['a', 'b']]) + # sort=None, the default + result = idx.difference([]) + tm.assert_index_equal(result, idx) + + +@pytest.mark.xfail(reason="Not implemented.") +def test_difference_sort_special_true(): + # TODO decide on True behaviour + idx = pd.MultiIndex.from_product([[1, 0], ['a', 'b']]) + result = idx.difference([], sort=True) + expected = pd.MultiIndex.from_product([[0, 1], ['a', 'b']]) + tm.assert_index_equal(result, expected) + + +def test_difference_sort_incomparable(): + # GH-24959 + idx = pd.MultiIndex.from_product([[1, pd.Timestamp('2000'), 2], + ['a', 'b']]) + + other = pd.MultiIndex.from_product([[3, pd.Timestamp('2000'), 4], + ['c', 'd']]) + # sort=None, the default + # MultiIndex.difference deviates here from other difference + # implementations in not catching the TypeError + with pytest.raises(TypeError): + result = idx.difference(other) + + # sort=False + result = idx.difference(other, sort=False) + tm.assert_index_equal(result, idx) + + +@pytest.mark.xfail(reason="Not implemented.") +def test_difference_sort_incomparable_true(): + # TODO decide on True behaviour + # # sort=True, raises + idx = pd.MultiIndex.from_product([[1, pd.Timestamp('2000'), 2], + ['a', 'b']]) + other = pd.MultiIndex.from_product([[3, pd.Timestamp('2000'), 4], + ['c', 'd']]) + + with pytest.raises(TypeError): + idx.difference(other, sort=True) + + +@pytest.mark.parametrize("sort", [None, False]) def test_union(idx, sort): piece1 = idx[:5][::-1] piece2 = idx[3:] the_union = piece1.union(piece2, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(the_union, idx.sort_values()) assert tm.equalContents(the_union, idx) @@ -225,14 +273,14 @@ def test_union(idx, sort): # assert result.equals(result2) -@pytest.mark.parametrize("sort", [True, False]) +@pytest.mark.parametrize("sort", [None, False]) def test_intersection(idx, sort): piece1 = idx[:5][::-1] piece2 = idx[3:] the_int = piece1.intersection(piece2, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(the_int, idx[3:5]) assert tm.equalContents(the_int, idx[3:5]) @@ -249,3 +297,76 @@ def test_intersection(idx, sort): # tuples = _index.values # result = _index & tuples # assert result.equals(tuples) + + +def test_intersect_equal_sort(): + # GH-24959 + idx = pd.MultiIndex.from_product([[1, 0], ['a', 'b']]) + tm.assert_index_equal(idx.intersection(idx, sort=False), idx) + tm.assert_index_equal(idx.intersection(idx, sort=None), idx) + + +@pytest.mark.xfail(reason="Not implemented.") +def test_intersect_equal_sort_true(): + # TODO decide on True behaviour + idx = pd.MultiIndex.from_product([[1, 0], ['a', 'b']]) + sorted_ = pd.MultiIndex.from_product([[0, 1], ['a', 'b']]) + tm.assert_index_equal(idx.intersection(idx, sort=True), sorted_) + + +@pytest.mark.parametrize('slice_', [slice(None), slice(0)]) +def test_union_sort_other_empty(slice_): + # https://github.com/pandas-dev/pandas/issues/24959 + idx = pd.MultiIndex.from_product([[1, 0], ['a', 'b']]) + + # default, sort=None + other = idx[slice_] + tm.assert_index_equal(idx.union(other), idx) + # MultiIndex does not special case empty.union(idx) + # tm.assert_index_equal(other.union(idx), idx) + + # sort=False + tm.assert_index_equal(idx.union(other, sort=False), idx) + + +@pytest.mark.xfail(reason="Not implemented.") +def test_union_sort_other_empty_sort(slice_): + # TODO decide on True behaviour + # # sort=True + idx = pd.MultiIndex.from_product([[1, 0], ['a', 'b']]) + other = idx[:0] + result = idx.union(other, sort=True) + expected = pd.MultiIndex.from_product([[0, 1], ['a', 'b']]) + tm.assert_index_equal(result, expected) + + +def test_union_sort_other_incomparable(): + # https://github.com/pandas-dev/pandas/issues/24959 + idx = pd.MultiIndex.from_product([[1, pd.Timestamp('2000')], ['a', 'b']]) + + # default, sort=None + result = idx.union(idx[:1]) + tm.assert_index_equal(result, idx) + + # sort=False + result = idx.union(idx[:1], sort=False) + tm.assert_index_equal(result, idx) + + +@pytest.mark.xfail(reason="Not implemented.") +def test_union_sort_other_incomparable_sort(): + # TODO decide on True behaviour + # # sort=True + idx = pd.MultiIndex.from_product([[1, pd.Timestamp('2000')], ['a', 'b']]) + with pytest.raises(TypeError, match='Cannot compare'): + idx.union(idx[:1], sort=True) + + +@pytest.mark.parametrize("method", ['union', 'intersection', 'difference', + 'symmetric_difference']) +def test_setops_disallow_true(method): + idx1 = pd.MultiIndex.from_product([['a', 'b'], [1, 2]]) + idx2 = pd.MultiIndex.from_product([['b', 'c'], [1, 2]]) + + with pytest.raises(ValueError, match="The 'sort' keyword only takes"): + getattr(idx1, method)(idx2, sort=True) diff --git a/pandas/tests/indexes/period/test_asfreq.py b/pandas/tests/indexes/period/test_asfreq.py index 2dd49e7e0845e..30b416e3fe9dd 100644 --- a/pandas/tests/indexes/period/test_asfreq.py +++ b/pandas/tests/indexes/period/test_asfreq.py @@ -67,7 +67,9 @@ def test_asfreq(self): assert pi7.asfreq('H', 'S') == pi5 assert pi7.asfreq('Min', 'S') == pi6 - pytest.raises(ValueError, pi7.asfreq, 'T', 'foo') + msg = "How must be one of S or E" + with pytest.raises(ValueError, match=msg): + pi7.asfreq('T', 'foo') result1 = pi1.asfreq('3M') result2 = pi1.asfreq('M') expected = period_range(freq='M', start='2001-12', end='2001-12') diff --git a/pandas/tests/indexes/period/test_construction.py b/pandas/tests/indexes/period/test_construction.py index 916260c4cee7e..f1adeca7245f6 100644 --- a/pandas/tests/indexes/period/test_construction.py +++ b/pandas/tests/indexes/period/test_construction.py @@ -1,6 +1,7 @@ import numpy as np import pytest +from pandas._libs.tslibs.period import IncompatibleFrequency from pandas.compat import PY3, lmap, lrange, text_type from pandas.core.dtypes.dtypes import PeriodDtype @@ -66,12 +67,17 @@ def test_constructor_field_arrays(self): years = [2007, 2007, 2007] months = [1, 2] - pytest.raises(ValueError, PeriodIndex, year=years, month=months, - freq='M') - pytest.raises(ValueError, PeriodIndex, year=years, month=months, - freq='2M') - pytest.raises(ValueError, PeriodIndex, year=years, month=months, - freq='M', start=Period('2007-01', freq='M')) + + msg = "Mismatched Period array lengths" + with pytest.raises(ValueError, match=msg): + PeriodIndex(year=years, month=months, freq='M') + with pytest.raises(ValueError, match=msg): + PeriodIndex(year=years, month=months, freq='2M') + + msg = "Can either instantiate from fields or endpoints, but not both" + with pytest.raises(ValueError, match=msg): + PeriodIndex(year=years, month=months, freq='M', + start=Period('2007-01', freq='M')) years = [2007, 2007, 2007] months = [1, 2, 3] @@ -81,8 +87,8 @@ def test_constructor_field_arrays(self): def test_constructor_U(self): # U was used as undefined period - pytest.raises(ValueError, period_range, '2007-1-1', periods=500, - freq='X') + with pytest.raises(ValueError, match="Invalid frequency: X"): + period_range('2007-1-1', periods=500, freq='X') def test_constructor_nano(self): idx = period_range(start=Period(ordinal=1, freq='N'), @@ -103,17 +109,29 @@ def test_constructor_arrays_negative_year(self): tm.assert_index_equal(pindex.quarter, pd.Index(quarters)) def test_constructor_invalid_quarters(self): - pytest.raises(ValueError, PeriodIndex, year=lrange(2000, 2004), - quarter=lrange(4), freq='Q-DEC') + msg = "Quarter must be 1 <= q <= 4" + with pytest.raises(ValueError, match=msg): + PeriodIndex(year=lrange(2000, 2004), quarter=lrange(4), + freq='Q-DEC') def test_constructor_corner(self): - pytest.raises(ValueError, PeriodIndex, periods=10, freq='A') + msg = "Not enough parameters to construct Period range" + with pytest.raises(ValueError, match=msg): + PeriodIndex(periods=10, freq='A') start = Period('2007', freq='A-JUN') end = Period('2010', freq='A-DEC') - pytest.raises(ValueError, PeriodIndex, start=start, end=end) - pytest.raises(ValueError, PeriodIndex, start=start) - pytest.raises(ValueError, PeriodIndex, end=end) + + msg = "start and end must have same freq" + with pytest.raises(ValueError, match=msg): + PeriodIndex(start=start, end=end) + + msg = ("Of the three parameters: start, end, and periods, exactly two" + " must be specified") + with pytest.raises(ValueError, match=msg): + PeriodIndex(start=start) + with pytest.raises(ValueError, match=msg): + PeriodIndex(end=end) result = period_range('2007-01', periods=10.5, freq='M') exp = period_range('2007-01', periods=10, freq='M') @@ -126,10 +144,15 @@ def test_constructor_fromarraylike(self): tm.assert_index_equal(PeriodIndex(idx.values), idx) tm.assert_index_equal(PeriodIndex(list(idx.values)), idx) - pytest.raises(ValueError, PeriodIndex, idx._ndarray_values) - pytest.raises(ValueError, PeriodIndex, list(idx._ndarray_values)) - pytest.raises(TypeError, PeriodIndex, - data=Period('2007', freq='A')) + msg = "freq not specified and cannot be inferred" + with pytest.raises(ValueError, match=msg): + PeriodIndex(idx._ndarray_values) + with pytest.raises(ValueError, match=msg): + PeriodIndex(list(idx._ndarray_values)) + + msg = "'Period' object is not iterable" + with pytest.raises(TypeError, match=msg): + PeriodIndex(data=Period('2007', freq='A')) result = PeriodIndex(iter(idx)) tm.assert_index_equal(result, idx) @@ -160,7 +183,9 @@ def test_constructor_datetime64arr(self): vals = np.arange(100000, 100000 + 10000, 100, dtype=np.int64) vals = vals.view(np.dtype('M8[us]')) - pytest.raises(ValueError, PeriodIndex, vals, freq='D') + msg = r"Wrong dtype: datetime64\[us\]" + with pytest.raises(ValueError, match=msg): + PeriodIndex(vals, freq='D') @pytest.mark.parametrize('box', [None, 'series', 'index']) def test_constructor_datetime64arr_ok(self, box): @@ -300,17 +325,20 @@ def test_constructor_simple_new_empty(self): @pytest.mark.parametrize('floats', [[1.1, 2.1], np.array([1.1, 2.1])]) def test_constructor_floats(self, floats): - with pytest.raises(TypeError): + msg = r"PeriodIndex\._simple_new does not accept floats" + with pytest.raises(TypeError, match=msg): pd.PeriodIndex._simple_new(floats, freq='M') - with pytest.raises(TypeError): + msg = "PeriodIndex does not allow floating point in construction" + with pytest.raises(TypeError, match=msg): pd.PeriodIndex(floats, freq='M') def test_constructor_nat(self): - pytest.raises(ValueError, period_range, start='NaT', - end='2011-01-01', freq='M') - pytest.raises(ValueError, period_range, start='2011-01-01', - end='NaT', freq='M') + msg = "start and end must not be NaT" + with pytest.raises(ValueError, match=msg): + period_range(start='NaT', end='2011-01-01', freq='M') + with pytest.raises(ValueError, match=msg): + period_range(start='2011-01-01', end='NaT', freq='M') def test_constructor_year_and_quarter(self): year = pd.Series([2001, 2002, 2003]) @@ -455,9 +483,12 @@ def test_constructor(self): # Mixed freq should fail vals = [end_intv, Period('2006-12-31', 'w')] - pytest.raises(ValueError, PeriodIndex, vals) + msg = r"Input has different freq=W-SUN from PeriodIndex\(freq=B\)" + with pytest.raises(IncompatibleFrequency, match=msg): + PeriodIndex(vals) vals = np.array(vals) - pytest.raises(ValueError, PeriodIndex, vals) + with pytest.raises(IncompatibleFrequency, match=msg): + PeriodIndex(vals) def test_constructor_error(self): start = Period('02-Apr-2005', 'B') @@ -508,7 +539,8 @@ def setup_method(self, method): self.series = Series(period_range('2000-01-01', periods=10, freq='D')) def test_constructor_cant_cast_period(self): - with pytest.raises(TypeError): + msg = "Cannot cast PeriodArray to dtype float64" + with pytest.raises(TypeError, match=msg): Series(period_range('2000-01-01', periods=10, freq='D'), dtype=float) diff --git a/pandas/tests/indexes/period/test_indexing.py b/pandas/tests/indexes/period/test_indexing.py index 47c2edfd13395..fa8199b4e6163 100644 --- a/pandas/tests/indexes/period/test_indexing.py +++ b/pandas/tests/indexes/period/test_indexing.py @@ -84,7 +84,8 @@ def test_getitem_partial(self): rng = period_range('2007-01', periods=50, freq='M') ts = Series(np.random.randn(len(rng)), rng) - pytest.raises(KeyError, ts.__getitem__, '2006') + with pytest.raises(KeyError, match=r"^'2006'$"): + ts['2006'] result = ts['2008'] assert (result.index.year == 2008).all() @@ -326,7 +327,8 @@ def test_take_fill_value(self): with pytest.raises(ValueError, match=msg): idx.take(np.array([1, 0, -5]), fill_value=True) - with pytest.raises(IndexError): + msg = "index -5 is out of bounds for size 3" + with pytest.raises(IndexError, match=msg): idx.take(np.array([1, -5])) @@ -335,7 +337,8 @@ class TestIndexing(object): def test_get_loc_msg(self): idx = period_range('2000-1-1', freq='A', periods=10) bad_period = Period('2012', 'A') - pytest.raises(KeyError, idx.get_loc, bad_period) + with pytest.raises(KeyError, match=r"^Period\('2012', 'A-DEC'\)$"): + idx.get_loc(bad_period) try: idx.get_loc(bad_period) @@ -373,8 +376,13 @@ def test_get_loc(self): msg = "Cannot interpret 'foo' as period" with pytest.raises(KeyError, match=msg): idx0.get_loc('foo') - pytest.raises(KeyError, idx0.get_loc, 1.1) - pytest.raises(TypeError, idx0.get_loc, idx0) + with pytest.raises(KeyError, match=r"^1\.1$"): + idx0.get_loc(1.1) + + msg = (r"'PeriodIndex\(\['2017-09-01', '2017-09-02', '2017-09-03'\]," + r" dtype='period\[D\]', freq='D'\)' is an invalid key") + with pytest.raises(TypeError, match=msg): + idx0.get_loc(idx0) # get the location of p1/p2 from # monotonic increasing PeriodIndex with duplicate @@ -391,8 +399,13 @@ def test_get_loc(self): with pytest.raises(KeyError, match=msg): idx1.get_loc('foo') - pytest.raises(KeyError, idx1.get_loc, 1.1) - pytest.raises(TypeError, idx1.get_loc, idx1) + with pytest.raises(KeyError, match=r"^1\.1$"): + idx1.get_loc(1.1) + + msg = (r"'PeriodIndex\(\['2017-09-02', '2017-09-02', '2017-09-03'\]," + r" dtype='period\[D\]', freq='D'\)' is an invalid key") + with pytest.raises(TypeError, match=msg): + idx1.get_loc(idx1) # get the location of p1/p2 from # non-monotonic increasing/decreasing PeriodIndex with duplicate @@ -441,18 +454,6 @@ def test_is_monotonic_decreasing(self): assert idx_dec1.is_monotonic_decreasing is True assert idx.is_monotonic_decreasing is False - def test_is_unique(self): - # GH 17717 - p0 = pd.Period('2017-09-01') - p1 = pd.Period('2017-09-02') - p2 = pd.Period('2017-09-03') - - idx0 = pd.PeriodIndex([p0, p1, p2]) - assert idx0.is_unique is True - - idx1 = pd.PeriodIndex([p1, p1, p2]) - assert idx1.is_unique is False - def test_contains(self): # GH 17717 p0 = pd.Period('2017-09-01') @@ -581,7 +582,7 @@ def test_get_loc2(self): msg = 'Input has different freq=None from PeriodArray\\(freq=D\\)' with pytest.raises(ValueError, match=msg): idx.get_loc('2000-01-10', method='nearest', tolerance='1 hour') - with pytest.raises(KeyError): + with pytest.raises(KeyError, match=r"^Period\('2000-01-10', 'D'\)$"): idx.get_loc('2000-01-10', method='nearest', tolerance='1 day') with pytest.raises( ValueError, diff --git a/pandas/tests/indexes/period/test_period.py b/pandas/tests/indexes/period/test_period.py index 464ff7aa5d58d..89bcf56dbda71 100644 --- a/pandas/tests/indexes/period/test_period.py +++ b/pandas/tests/indexes/period/test_period.py @@ -71,13 +71,15 @@ def test_fillna_period(self): pd.Period('2011-01-01', freq='D')), exp) def test_no_millisecond_field(self): - with pytest.raises(AttributeError): + msg = "type object 'DatetimeIndex' has no attribute 'millisecond'" + with pytest.raises(AttributeError, match=msg): DatetimeIndex.millisecond - with pytest.raises(AttributeError): + msg = "'DatetimeIndex' object has no attribute 'millisecond'" + with pytest.raises(AttributeError, match=msg): DatetimeIndex([]).millisecond - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_freq(self, sort): # GH14323: difference of Period MUST preserve frequency # but the ability to union results must be preserved @@ -98,8 +100,8 @@ def test_difference_freq(self, sort): def test_hash_error(self): index = period_range('20010101', periods=10) - with pytest.raises(TypeError, match=("unhashable type: %r" % - type(index).__name__)): + msg = "unhashable type: '{}'".format(type(index).__name__) + with pytest.raises(TypeError, match=msg): hash(index) def test_make_time_series(self): @@ -124,7 +126,8 @@ def test_shallow_copy_i8(self): def test_shallow_copy_changing_freq_raises(self): pi = period_range("2018-01-01", periods=3, freq="2D") - with pytest.raises(IncompatibleFrequency, match="are different"): + msg = "specified freq and dtype are different" + with pytest.raises(IncompatibleFrequency, match=msg): pi._shallow_copy(pi, freq="H") def test_dtype_str(self): @@ -214,21 +217,17 @@ def test_period_index_length(self): assert (i1 == i2).all() assert i1.freq == i2.freq - try: + msg = "start and end must have same freq" + with pytest.raises(ValueError, match=msg): period_range(start=start, end=end_intv) - raise AssertionError('Cannot allow mixed freq for start and end') - except ValueError: - pass end_intv = Period('2005-05-01', 'B') i1 = period_range(start=start, end=end_intv) - try: + msg = ("Of the three parameters: start, end, and periods, exactly two" + " must be specified") + with pytest.raises(ValueError, match=msg): period_range(start=start) - raise AssertionError( - 'Must specify periods if missing start or end') - except ValueError: - pass # infer freq from first element i2 = PeriodIndex([end_intv, Period('2005-05-05', 'B')]) @@ -241,9 +240,12 @@ def test_period_index_length(self): # Mixed freq should fail vals = [end_intv, Period('2006-12-31', 'w')] - pytest.raises(ValueError, PeriodIndex, vals) + msg = r"Input has different freq=W-SUN from PeriodIndex\(freq=B\)" + with pytest.raises(IncompatibleFrequency, match=msg): + PeriodIndex(vals) vals = np.array(vals) - pytest.raises(ValueError, PeriodIndex, vals) + with pytest.raises(ValueError, match=msg): + PeriodIndex(vals) def test_fields(self): # year, month, day, hour, minute @@ -381,7 +383,9 @@ def test_contains_nat(self): assert np.nan in idx def test_periods_number_check(self): - with pytest.raises(ValueError): + msg = ("Of the three parameters: start, end, and periods, exactly two" + " must be specified") + with pytest.raises(ValueError, match=msg): period_range('2011-1-1', '2012-1-1', 'B') def test_start_time(self): @@ -500,7 +504,8 @@ def test_is_full(self): assert index.is_full index = PeriodIndex([2006, 2005, 2005], freq='A') - pytest.raises(ValueError, getattr, index, 'is_full') + with pytest.raises(ValueError, match="Index is not monotonic"): + index.is_full assert index[:0].is_full @@ -574,5 +579,6 @@ def test_maybe_convert_timedelta(): assert pi._maybe_convert_timedelta(2) == 2 offset = offsets.BusinessDay() - with pytest.raises(ValueError, match='freq'): + msg = r"Input has different freq=B from PeriodIndex\(freq=D\)" + with pytest.raises(ValueError, match=msg): pi._maybe_convert_timedelta(offset) diff --git a/pandas/tests/indexes/period/test_setops.py b/pandas/tests/indexes/period/test_setops.py index a97ab47bcda16..bf29edad4841e 100644 --- a/pandas/tests/indexes/period/test_setops.py +++ b/pandas/tests/indexes/period/test_setops.py @@ -38,7 +38,7 @@ def test_join_does_not_recur(self): df.columns[0], df.columns[1]], object) tm.assert_index_equal(res, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union(self, sort): # union other1 = pd.period_range('1/1/2000', freq='D', periods=5) @@ -97,11 +97,11 @@ def test_union(self, sort): (rng8, other8, expected8)]: result_union = rng.union(other, sort=sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result_union, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union_misc(self, sort): index = period_range('1/1/2000', '1/20/2000', freq='D') @@ -110,7 +110,7 @@ def test_union_misc(self, sort): # not in order result = _permute(index[:-5]).union(_permute(index[10:]), sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, index) assert tm.equalContents(result, index) @@ -139,7 +139,7 @@ def test_union_dataframe_index(self): exp = pd.period_range('1/1/1980', '1/1/2012', freq='M') tm.assert_index_equal(df.index, exp) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection(self, sort): index = period_range('1/1/2000', '1/20/2000', freq='D') @@ -150,7 +150,7 @@ def test_intersection(self, sort): left = _permute(index[:-5]) right = _permute(index[10:]) result = left.intersection(right, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, index[10:-5]) assert tm.equalContents(result, index[10:-5]) @@ -164,7 +164,7 @@ def test_intersection(self, sort): with pytest.raises(period.IncompatibleFrequency): index.intersection(index3, sort=sort) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_cases(self, sort): base = period_range('6/1/2000', '6/30/2000', freq='D', name='idx') @@ -210,7 +210,7 @@ def test_intersection_cases(self, sort): for (rng, expected) in [(rng2, expected2), (rng3, expected3), (rng4, expected4)]: result = base.intersection(rng, sort=sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) assert result.name == expected.name @@ -224,7 +224,7 @@ def test_intersection_cases(self, sort): result = rng.intersection(rng[0:0]) assert len(result) == 0 - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference(self, sort): # diff period_rng = ['1/3/2000', '1/2/2000', '1/1/2000', '1/5/2000', @@ -276,6 +276,6 @@ def test_difference(self, sort): (rng6, other6, expected6), (rng7, other7, expected7), ]: result_difference = rng.difference(other, sort=sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result_difference, expected) diff --git a/pandas/tests/indexes/test_base.py b/pandas/tests/indexes/test_base.py index f3e9d835c7391..c99007cef90d4 100644 --- a/pandas/tests/indexes/test_base.py +++ b/pandas/tests/indexes/test_base.py @@ -3,6 +3,7 @@ from collections import defaultdict from datetime import datetime, timedelta import math +import operator import sys import numpy as np @@ -684,12 +685,12 @@ def test_empty_fancy_raises(self, attr): # np.ndarray only accepts ndarray of int & bool dtypes, so should Index pytest.raises(IndexError, index.__getitem__, empty_farr) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection(self, sort): first = self.strIndex[:20] second = self.strIndex[:10] intersect = first.intersection(second, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(intersect, second.sort_values()) assert tm.equalContents(intersect, second) @@ -701,7 +702,7 @@ def test_intersection(self, sort): (Index([3, 4, 5, 6, 7], name="index"), True), # preserve same name (Index([3, 4, 5, 6, 7], name="other"), False), # drop diff names (Index([3, 4, 5, 6, 7]), False)]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_name_preservation(self, index2, keeps_name, sort): index1 = Index([1, 2, 3, 4, 5], name='index') expected = Index([3, 4, 5]) @@ -715,7 +716,7 @@ def test_intersection_name_preservation(self, index2, keeps_name, sort): @pytest.mark.parametrize("first_name,second_name,expected_name", [ ('A', 'A', 'A'), ('A', 'B', None), (None, 'B', None)]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_name_preservation2(self, first_name, second_name, expected_name, sort): first = self.strIndex[5:20] @@ -728,7 +729,7 @@ def test_intersection_name_preservation2(self, first_name, second_name, @pytest.mark.parametrize("index2,keeps_name", [ (Index([4, 7, 6, 5, 3], name='index'), True), (Index([4, 7, 6, 5, 3], name='other'), False)]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_monotonic(self, index2, keeps_name, sort): index1 = Index([5, 3, 2, 4, 1], name='index') expected = Index([5, 3, 4]) @@ -737,25 +738,25 @@ def test_intersection_monotonic(self, index2, keeps_name, sort): expected.name = "index" result = index1.intersection(index2, sort=sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) @pytest.mark.parametrize("index2,expected_arr", [ (Index(['B', 'D']), ['B']), (Index(['B', 'D', 'A']), ['A', 'B', 'A'])]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_non_monotonic_non_unique(self, index2, expected_arr, sort): # non-monotonic non-unique index1 = Index(['A', 'B', 'A', 'C']) expected = Index(expected_arr, dtype='object') result = index1.intersection(index2, sort=sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersect_str_dates(self, sort): dt_dates = [datetime(2012, 2, 9), datetime(2012, 2, 22)] @@ -765,7 +766,24 @@ def test_intersect_str_dates(self, sort): assert len(result) == 0 - @pytest.mark.parametrize("sort", [True, False]) + def test_intersect_nosort(self): + result = pd.Index(['c', 'b', 'a']).intersection(['b', 'a']) + expected = pd.Index(['b', 'a']) + tm.assert_index_equal(result, expected) + + def test_intersection_equal_sort(self): + idx = pd.Index(['c', 'a', 'b']) + tm.assert_index_equal(idx.intersection(idx, sort=False), idx) + tm.assert_index_equal(idx.intersection(idx, sort=None), idx) + + @pytest.mark.xfail(reason="Not implemented") + def test_intersection_equal_sort_true(self): + # TODO decide on True behaviour + idx = pd.Index(['c', 'a', 'b']) + sorted_ = pd.Index(['a', 'b', 'c']) + tm.assert_index_equal(idx.intersection(idx, sort=True), sorted_) + + @pytest.mark.parametrize("sort", [None, False]) def test_chained_union(self, sort): # Chained unions handles names correctly i1 = Index([1, 2], name='i1') @@ -782,7 +800,7 @@ def test_chained_union(self, sort): expected = j1.union(j2, sort=sort).union(j3, sort=sort) tm.assert_index_equal(union, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union(self, sort): # TODO: Replace with fixturesult first = self.strIndex[5:20] @@ -790,13 +808,65 @@ def test_union(self, sort): everything = self.strIndex[:20] union = first.union(second, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(union, everything.sort_values()) assert tm.equalContents(union, everything) + @pytest.mark.parametrize('slice_', [slice(None), slice(0)]) + def test_union_sort_other_special(self, slice_): + # https://github.com/pandas-dev/pandas/issues/24959 + + idx = pd.Index([1, 0, 2]) + # default, sort=None + other = idx[slice_] + tm.assert_index_equal(idx.union(other), idx) + tm.assert_index_equal(other.union(idx), idx) + + # sort=False + tm.assert_index_equal(idx.union(other, sort=False), idx) + + @pytest.mark.xfail(reason="Not implemented") + @pytest.mark.parametrize('slice_', [slice(None), slice(0)]) + def test_union_sort_special_true(self, slice_): + # TODO decide on True behaviour + # sort=True + idx = pd.Index([1, 0, 2]) + # default, sort=None + other = idx[slice_] + + result = idx.union(other, sort=True) + expected = pd.Index([0, 1, 2]) + tm.assert_index_equal(result, expected) + + def test_union_sort_other_incomparable(self): + # https://github.com/pandas-dev/pandas/issues/24959 + idx = pd.Index([1, pd.Timestamp('2000')]) + # default (sort=None) + with tm.assert_produces_warning(RuntimeWarning): + result = idx.union(idx[:1]) + + tm.assert_index_equal(result, idx) + + # sort=None + with tm.assert_produces_warning(RuntimeWarning): + result = idx.union(idx[:1], sort=None) + tm.assert_index_equal(result, idx) + + # sort=False + result = idx.union(idx[:1], sort=False) + tm.assert_index_equal(result, idx) + + @pytest.mark.xfail(reason="Not implemented") + def test_union_sort_other_incomparable_true(self): + # TODO decide on True behaviour + # sort=True + idx = pd.Index([1, pd.Timestamp('2000')]) + with pytest.raises(TypeError, match='.*'): + idx.union(idx[:1], sort=True) + @pytest.mark.parametrize("klass", [ np.array, Series, list]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union_from_iterables(self, klass, sort): # GH 10149 # TODO: Replace with fixturesult @@ -806,29 +876,30 @@ def test_union_from_iterables(self, klass, sort): case = klass(second.values) result = first.union(case, sort=sort) - if sort: + if sort is None: tm.assert_index_equal(result, everything.sort_values()) assert tm.equalContents(result, everything) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union_identity(self, sort): # TODO: replace with fixturesult first = self.strIndex[5:20] union = first.union(first, sort=sort) - assert union is first + # i.e. identity is not preserved when sort is True + assert (union is first) is (not sort) union = first.union([], sort=sort) - assert union is first + assert (union is first) is (not sort) union = Index([]).union(first, sort=sort) - assert union is first + assert (union is first) is (not sort) @pytest.mark.parametrize("first_list", [list('ba'), list()]) @pytest.mark.parametrize("second_list", [list('ab'), list()]) @pytest.mark.parametrize("first_name, second_name, expected_name", [ ('A', 'B', None), (None, 'B', None), ('A', None, None)]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union_name_preservation(self, first_list, second_list, first_name, second_name, expected_name, sort): first = Index(first_list, name=first_name) @@ -837,14 +908,14 @@ def test_union_name_preservation(self, first_list, second_list, first_name, vals = set(first_list).union(second_list) - if sort and len(first_list) > 0 and len(second_list) > 0: + if sort is None and len(first_list) > 0 and len(second_list) > 0: expected = Index(sorted(vals), name=expected_name) tm.assert_index_equal(union, expected) else: expected = Index(vals, name=expected_name) assert tm.equalContents(union, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_union_dt_as_obj(self, sort): # TODO: Replace with fixturesult firstCat = self.strIndex.union(self.dateIndex) @@ -861,6 +932,15 @@ def test_union_dt_as_obj(self, sort): tm.assert_contains_all(self.strIndex, secondCat) tm.assert_contains_all(self.dateIndex, firstCat) + @pytest.mark.parametrize("method", ['union', 'intersection', 'difference', + 'symmetric_difference']) + def test_setops_disallow_true(self, method): + idx1 = pd.Index(['a', 'b']) + idx2 = pd.Index(['b', 'c']) + + with pytest.raises(ValueError, match="The 'sort' keyword only takes"): + getattr(idx1, method)(idx2, sort=True) + def test_map_identity_mapping(self): # GH 12766 # TODO: replace with fixture @@ -982,7 +1062,7 @@ def test_append_empty_preserve_name(self, name, expected): @pytest.mark.parametrize("second_name,expected", [ (None, None), ('name', 'name')]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_name_preservation(self, second_name, expected, sort): # TODO: replace with fixturesult first = self.strIndex[5:20] @@ -1000,7 +1080,7 @@ def test_difference_name_preservation(self, second_name, expected, sort): else: assert result.name == expected - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_empty_arg(self, sort): first = self.strIndex[5:20] first.name == 'name' @@ -1009,7 +1089,7 @@ def test_difference_empty_arg(self, sort): assert tm.equalContents(result, first) assert result.name == first.name - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_identity(self, sort): first = self.strIndex[5:20] first.name == 'name' @@ -1018,7 +1098,7 @@ def test_difference_identity(self, sort): assert len(result) == 0 assert result.name == first.name - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_sort(self, sort): first = self.strIndex[5:20] second = self.strIndex[:10] @@ -1026,12 +1106,12 @@ def test_difference_sort(self, sort): result = first.difference(second, sort) expected = self.strIndex[10:20] - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_symmetric_difference(self, sort): # smoke index1 = Index([5, 2, 3, 4], name='index1') @@ -1040,7 +1120,7 @@ def test_symmetric_difference(self, sort): expected = Index([5, 1]) assert tm.equalContents(result, expected) assert result.name is None - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) @@ -1049,13 +1129,43 @@ def test_symmetric_difference(self, sort): assert tm.equalContents(result, expected) assert result.name is None - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize('opname', ['difference', 'symmetric_difference']) + def test_difference_incomparable(self, opname): + a = pd.Index([3, pd.Timestamp('2000'), 1]) + b = pd.Index([2, pd.Timestamp('1999'), 1]) + op = operator.methodcaller(opname, b) + + # sort=None, the default + result = op(a) + expected = pd.Index([3, pd.Timestamp('2000'), 2, pd.Timestamp('1999')]) + if opname == 'difference': + expected = expected[:2] + tm.assert_index_equal(result, expected) + + # sort=False + op = operator.methodcaller(opname, b, sort=False) + result = op(a) + tm.assert_index_equal(result, expected) + + @pytest.mark.xfail(reason="Not implemented") + @pytest.mark.parametrize('opname', ['difference', 'symmetric_difference']) + def test_difference_incomparable_true(self, opname): + # TODO decide on True behaviour + # # sort=True, raises + a = pd.Index([3, pd.Timestamp('2000'), 1]) + b = pd.Index([2, pd.Timestamp('1999'), 1]) + op = operator.methodcaller(opname, b, sort=True) + + with pytest.raises(TypeError, match='Cannot compare'): + op(a) + + @pytest.mark.parametrize("sort", [None, False]) def test_symmetric_difference_mi(self, sort): index1 = MultiIndex.from_tuples(self.tuples) index2 = MultiIndex.from_tuples([('foo', 1), ('bar', 3)]) result = index1.symmetric_difference(index2, sort=sort) expected = MultiIndex.from_tuples([('bar', 2), ('baz', 3), ('bar', 3)]) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) assert tm.equalContents(result, expected) @@ -1063,18 +1173,18 @@ def test_symmetric_difference_mi(self, sort): @pytest.mark.parametrize("index2,expected", [ (Index([0, 1, np.nan]), Index([2.0, 3.0, 0.0])), (Index([0, 1]), Index([np.nan, 2.0, 3.0, 0.0]))]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_symmetric_difference_missing(self, index2, expected, sort): # GH 13514 change: {nan} - {nan} == {} # (GH 6444, sorting of nans, is no longer an issue) index1 = Index([1, np.nan, 2, 3]) result = index1.symmetric_difference(index2, sort=sort) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(result, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_symmetric_difference_non_index(self, sort): index1 = Index([1, 2, 3, 4], name='index1') index2 = np.array([2, 3, 4, 5]) @@ -1088,7 +1198,7 @@ def test_symmetric_difference_non_index(self, sort): assert tm.equalContents(result, expected) assert result.name == 'new_name' - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_type(self, sort): # GH 20040 # If taking difference of a set and itself, it @@ -1099,7 +1209,7 @@ def test_difference_type(self, sort): expected = index.drop(index) tm.assert_index_equal(result, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_difference(self, sort): # GH 20040 # Test that the intersection of an index with an @@ -1595,20 +1705,27 @@ def test_drop_tuple(self, values, to_drop): for drop_me in to_drop[1], [to_drop[1]]: pytest.raises(KeyError, removed.drop, drop_me) - @pytest.mark.parametrize("method,expected", [ + @pytest.mark.parametrize("method,expected,sort", [ + ('intersection', np.array([(1, 'A'), (2, 'A'), (1, 'B'), (2, 'B')], + dtype=[('num', int), ('let', 'a1')]), + False), + ('intersection', np.array([(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B')], - dtype=[('num', int), ('let', 'a1')])), + dtype=[('num', int), ('let', 'a1')]), + None), + ('union', np.array([(1, 'A'), (1, 'B'), (1, 'C'), (2, 'A'), (2, 'B'), - (2, 'C')], dtype=[('num', int), ('let', 'a1')])) + (2, 'C')], dtype=[('num', int), ('let', 'a1')]), + None) ]) - def test_tuple_union_bug(self, method, expected): + def test_tuple_union_bug(self, method, expected, sort): index1 = Index(np.array([(1, 'A'), (2, 'A'), (1, 'B'), (2, 'B')], dtype=[('num', int), ('let', 'a1')])) index2 = Index(np.array([(1, 'A'), (2, 'A'), (1, 'B'), (2, 'B'), (1, 'C'), (2, 'C')], dtype=[('num', int), ('let', 'a1')])) - result = getattr(index1, method)(index2) + result = getattr(index1, method)(index2, sort=sort) assert result.ndim == 1 expected = Index(expected) @@ -2247,20 +2364,20 @@ def test_unique_na(self): result = idx.unique() tm.assert_index_equal(result, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_base(self, sort): # (same results for py2 and py3 but sortedness not tested elsewhere) index = self.create_index() first = index[:5] second = index[:3] - expected = Index([0, 1, 'a']) if sort else Index([0, 'a', 1]) + expected = Index([0, 1, 'a']) if sort is None else Index([0, 'a', 1]) result = first.intersection(second, sort=sort) tm.assert_index_equal(result, expected) @pytest.mark.parametrize("klass", [ np.array, Series, list]) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection_different_type_base(self, klass, sort): # GH 10149 index = self.create_index() @@ -2270,7 +2387,7 @@ def test_intersection_different_type_base(self, klass, sort): result = first.intersection(klass(second.values), sort=sort) assert tm.equalContents(result, second) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_base(self, sort): # (same results for py2 and py3 but sortedness not tested elsewhere) index = self.create_index() @@ -2279,7 +2396,7 @@ def test_difference_base(self, sort): result = first.difference(second, sort) expected = Index([0, 'a', 1]) - if sort: + if sort is None: expected = Index(safe_sort(expected)) tm.assert_index_equal(result, expected) diff --git a/pandas/tests/indexes/test_category.py b/pandas/tests/indexes/test_category.py index 582d466c6178e..d889135160ae2 100644 --- a/pandas/tests/indexes/test_category.py +++ b/pandas/tests/indexes/test_category.py @@ -611,15 +611,6 @@ def test_is_monotonic(self, data, non_lexsorted_data): assert c.is_monotonic_increasing is True assert c.is_monotonic_decreasing is False - @pytest.mark.parametrize('values, expected', [ - ([1, 2, 3], True), - ([1, 3, 1], False), - (list('abc'), True), - (list('aba'), False)]) - def test_is_unique(self, values, expected): - ci = CategoricalIndex(values) - assert ci.is_unique is expected - def test_has_duplicates(self): idx = CategoricalIndex([0, 0, 0], name='foo') diff --git a/pandas/tests/indexes/test_range.py b/pandas/tests/indexes/test_range.py index bbd1e0ccc19b1..96cf83d477376 100644 --- a/pandas/tests/indexes/test_range.py +++ b/pandas/tests/indexes/test_range.py @@ -503,7 +503,7 @@ def test_join_self(self): joined = self.index.join(self.index, how=kind) assert self.index is joined - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_intersection(self, sort): # intersect with Int64Index other = Index(np.arange(1, 6)) diff --git a/pandas/tests/indexes/timedeltas/test_timedelta.py b/pandas/tests/indexes/timedeltas/test_timedelta.py index 547366ec79094..3cbd9942f9d84 100644 --- a/pandas/tests/indexes/timedeltas/test_timedelta.py +++ b/pandas/tests/indexes/timedeltas/test_timedelta.py @@ -1,4 +1,5 @@ from datetime import timedelta +import re import numpy as np import pytest @@ -51,7 +52,7 @@ def test_fillna_timedelta(self): [pd.Timedelta('1 day'), 'x', pd.Timedelta('3 day')], dtype=object) tm.assert_index_equal(idx.fillna('x'), exp) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_freq(self, sort): # GH14323: Difference of TimedeltaIndex should not preserve frequency @@ -69,7 +70,7 @@ def test_difference_freq(self, sort): tm.assert_index_equal(idx_diff, expected) tm.assert_attr_equal('freq', idx_diff, expected) - @pytest.mark.parametrize("sort", [True, False]) + @pytest.mark.parametrize("sort", [None, False]) def test_difference_sort(self, sort): index = pd.TimedeltaIndex(["5 days", "3 days", "2 days", "4 days", @@ -80,7 +81,7 @@ def test_difference_sort(self, sort): expected = TimedeltaIndex(["5 days", "0 days"], freq=None) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(idx_diff, expected) @@ -90,7 +91,7 @@ def test_difference_sort(self, sort): idx_diff = index.difference(other, sort) expected = TimedeltaIndex(["1 days", "0 days"], freq=None) - if sort: + if sort is None: expected = expected.sort_values() tm.assert_index_equal(idx_diff, expected) @@ -325,6 +326,13 @@ def test_freq_conversion(self): result = td.astype('timedelta64[s]') assert_index_equal(result, expected) + @pytest.mark.parametrize('unit', ['Y', 'y', 'M']) + def test_unit_m_y_deprecated(self, unit): + with tm.assert_produces_warning(FutureWarning) as w: + TimedeltaIndex([1, 3, 7], unit) + msg = r'.* units are deprecated .*' + assert re.match(msg, str(w[0].message)) + class TestTimeSeries(object): diff --git a/pandas/tests/indexing/multiindex/test_loc.py b/pandas/tests/indexing/multiindex/test_loc.py index ea451d40eb5d3..073d40001a16b 100644 --- a/pandas/tests/indexing/multiindex/test_loc.py +++ b/pandas/tests/indexing/multiindex/test_loc.py @@ -123,10 +123,12 @@ def test_loc_multiindex(self): tm.assert_frame_equal(rs, xp) # missing label - pytest.raises(KeyError, lambda: mi_int.loc[2]) + with pytest.raises(KeyError, match=r"^2L?$"): + mi_int.loc[2] with catch_warnings(record=True): # GH 21593 - pytest.raises(KeyError, lambda: mi_int.ix[2]) + with pytest.raises(KeyError, match=r"^2L?$"): + mi_int.ix[2] def test_loc_multiindex_indexer_none(self): diff --git a/pandas/tests/indexing/multiindex/test_partial.py b/pandas/tests/indexing/multiindex/test_partial.py index 2e37ebe4a0629..473463def2b87 100644 --- a/pandas/tests/indexing/multiindex/test_partial.py +++ b/pandas/tests/indexing/multiindex/test_partial.py @@ -104,8 +104,8 @@ def test_getitem_partial_column_select(self): result = df.ix[('a', 'y'), [1, 0]] tm.assert_frame_equal(result, expected) - pytest.raises(KeyError, df.loc.__getitem__, - (('a', 'foo'), slice(None, None))) + with pytest.raises(KeyError, match=r"\('a', 'foo'\)"): + df.loc[('a', 'foo'), :] def test_partial_set( self, multiindex_year_month_day_dataframe_random_data): diff --git a/pandas/tests/indexing/multiindex/test_slice.py b/pandas/tests/indexing/multiindex/test_slice.py index fcecb2b454eb6..db7d079186708 100644 --- a/pandas/tests/indexing/multiindex/test_slice.py +++ b/pandas/tests/indexing/multiindex/test_slice.py @@ -107,7 +107,8 @@ def test_per_axis_per_level_getitem(self): # ambiguous cases # these can be multiply interpreted (e.g. in this case # as df.loc[slice(None),[1]] as well - pytest.raises(KeyError, lambda: df.loc[slice(None), [1]]) + with pytest.raises(KeyError, match=r"'\[1\] not in index'"): + df.loc[slice(None), [1]] result = df.loc[(slice(None), [1]), :] expected = df.iloc[[0, 3]] diff --git a/pandas/tests/indexing/test_categorical.py b/pandas/tests/indexing/test_categorical.py index b7443e242137b..317aac1766cf8 100644 --- a/pandas/tests/indexing/test_categorical.py +++ b/pandas/tests/indexing/test_categorical.py @@ -53,23 +53,20 @@ def test_loc_scalar(self): assert_frame_equal(df, expected) # value not in the categories - pytest.raises(KeyError, lambda: df.loc['d']) + with pytest.raises(KeyError, match=r"^'d'$"): + df.loc['d'] - def f(): + msg = "cannot append a non-category item to a CategoricalIndex" + with pytest.raises(TypeError, match=msg): df.loc['d'] = 10 - pytest.raises(TypeError, f) - - def f(): + msg = ("cannot insert an item into a CategoricalIndex that is not" + " already an existing category") + with pytest.raises(TypeError, match=msg): df.loc['d', 'A'] = 10 - - pytest.raises(TypeError, f) - - def f(): + with pytest.raises(TypeError, match=msg): df.loc['d', 'C'] = 10 - pytest.raises(TypeError, f) - def test_getitem_scalar(self): cats = Categorical([Timestamp('12-31-1999'), @@ -318,7 +315,8 @@ def test_loc_listlike(self): assert_frame_equal(result, expected, check_index_type=True) # element in the categories but not in the values - pytest.raises(KeyError, lambda: self.df2.loc['e']) + with pytest.raises(KeyError, match=r"^'e'$"): + self.df2.loc['e'] # assign is ok df = self.df2.copy() @@ -616,22 +614,29 @@ def test_reindexing(self): assert_frame_equal(result, expected, check_index_type=True) # passed duplicate indexers are not allowed - pytest.raises(ValueError, lambda: self.df2.reindex(['a', 'a'])) + msg = "cannot reindex with a non-unique indexer" + with pytest.raises(ValueError, match=msg): + self.df2.reindex(['a', 'a']) # args NotImplemented ATM - pytest.raises(NotImplementedError, - lambda: self.df2.reindex(['a'], method='ffill')) - pytest.raises(NotImplementedError, - lambda: self.df2.reindex(['a'], level=1)) - pytest.raises(NotImplementedError, - lambda: self.df2.reindex(['a'], limit=2)) + msg = r"argument {} is not implemented for CategoricalIndex\.reindex" + with pytest.raises(NotImplementedError, match=msg.format('method')): + self.df2.reindex(['a'], method='ffill') + with pytest.raises(NotImplementedError, match=msg.format('level')): + self.df2.reindex(['a'], level=1) + with pytest.raises(NotImplementedError, match=msg.format('limit')): + self.df2.reindex(['a'], limit=2) def test_loc_slice(self): # slicing # not implemented ATM # GH9748 - pytest.raises(TypeError, lambda: self.df.loc[1:5]) + msg = ("cannot do slice indexing on {klass} with these " + r"indexers \[1\] of {kind}".format( + klass=str(CategoricalIndex), kind=str(int))) + with pytest.raises(TypeError, match=msg): + self.df.loc[1:5] # result = df.loc[1:5] # expected = df.iloc[[1,2,3,4]] @@ -679,8 +684,11 @@ def test_boolean_selection(self): # categories=[3, 2, 1], # ordered=False, # name=u'B') - pytest.raises(TypeError, lambda: df4[df4.index < 2]) - pytest.raises(TypeError, lambda: df4[df4.index > 1]) + msg = "Unordered Categoricals can only compare equality or not" + with pytest.raises(TypeError, match=msg): + df4[df4.index < 2] + with pytest.raises(TypeError, match=msg): + df4[df4.index > 1] def test_indexing_with_category(self): diff --git a/pandas/tests/indexing/test_chaining_and_caching.py b/pandas/tests/indexing/test_chaining_and_caching.py index e38c1b16b3b60..6070edca075c2 100644 --- a/pandas/tests/indexing/test_chaining_and_caching.py +++ b/pandas/tests/indexing/test_chaining_and_caching.py @@ -302,11 +302,11 @@ def test_setting_with_copy_bug(self): 'c': ['a', 'b', np.nan, 'd']}) mask = pd.isna(df.c) - def f(): + msg = ("A value is trying to be set on a copy of a slice from a" + " DataFrame") + with pytest.raises(com.SettingWithCopyError, match=msg): df[['c']][mask] = df[['b']][mask] - pytest.raises(com.SettingWithCopyError, f) - # invalid warning as we are returning a new object # GH 8730 df1 = DataFrame({'x': Series(['a', 'b', 'c']), @@ -357,7 +357,6 @@ def check(result, expected): check(result4, expected) @pytest.mark.filterwarnings("ignore::DeprecationWarning") - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") def test_cache_updating(self): # GH 4939, make sure to update the cache on setitem @@ -367,12 +366,6 @@ def test_cache_updating(self): assert "Hello Friend" in df['A'].index assert "Hello Friend" in df['B'].index - panel = tm.makePanel() - panel.ix[0] # get first item into cache - panel.ix[:, :, 'A+1'] = panel.ix[:, :, 'A'] + 1 - assert "A+1" in panel.ix[0].columns - assert "A+1" in panel.ix[1].columns - # 10264 df = DataFrame(np.zeros((5, 5), dtype='int64'), columns=[ 'a', 'b', 'c', 'd', 'e'], index=range(5)) diff --git a/pandas/tests/indexing/test_floats.py b/pandas/tests/indexing/test_floats.py index de91b8f4a796c..b9b47338c9de2 100644 --- a/pandas/tests/indexing/test_floats.py +++ b/pandas/tests/indexing/test_floats.py @@ -6,7 +6,7 @@ import pytest from pandas import ( - DataFrame, Float64Index, Index, Int64Index, RangeIndex, Series) + DataFrame, Float64Index, Index, Int64Index, RangeIndex, Series, compat) import pandas.util.testing as tm from pandas.util.testing import assert_almost_equal, assert_series_equal @@ -54,9 +54,11 @@ def test_scalar_error(self): with pytest.raises(TypeError, match=msg): s.iloc[3.0] - def f(): + msg = ("cannot do positional indexing on {klass} with these " + r"indexers \[3\.0\] of {kind}".format( + klass=type(i), kind=str(float))) + with pytest.raises(TypeError, match=msg): s.iloc[3.0] = 0 - pytest.raises(TypeError, f) @ignore_ix def test_scalar_non_numeric(self): @@ -82,35 +84,46 @@ def test_scalar_non_numeric(self): (lambda x: x.iloc, False), (lambda x: x, True)]: - def f(): - with catch_warnings(record=True): - idxr(s)[3.0] - # gettitem on a DataFrame is a KeyError as it is indexing # via labels on the columns if getitem and isinstance(s, DataFrame): error = KeyError + msg = r"^3(\.0)?$" else: error = TypeError - pytest.raises(error, f) + msg = (r"cannot do (label|index|positional) indexing" + r" on {klass} with these indexers \[3\.0\] of" + r" {kind}|" + "Cannot index by location index with a" + " non-integer key" + .format(klass=type(i), kind=str(float))) + with catch_warnings(record=True): + with pytest.raises(error, match=msg): + idxr(s)[3.0] # label based can be a TypeError or KeyError - def f(): - s.loc[3.0] - if s.index.inferred_type in ['string', 'unicode', 'mixed']: error = KeyError + msg = r"^3$" else: error = TypeError - pytest.raises(error, f) + msg = (r"cannot do (label|index) indexing" + r" on {klass} with these indexers \[3\.0\] of" + r" {kind}" + .format(klass=type(i), kind=str(float))) + with pytest.raises(error, match=msg): + s.loc[3.0] # contains assert 3.0 not in s # setting with a float fails with iloc - def f(): + msg = (r"cannot do (label|index|positional) indexing" + r" on {klass} with these indexers \[3\.0\] of" + r" {kind}" + .format(klass=type(i), kind=str(float))) + with pytest.raises(TypeError, match=msg): s.iloc[3.0] = 0 - pytest.raises(TypeError, f) # setting with an indexer if s.index.inferred_type in ['categorical']: @@ -145,7 +158,12 @@ def f(): # fallsback to position selection, series only s = Series(np.arange(len(i)), index=i) s[3] - pytest.raises(TypeError, lambda: s[3.0]) + msg = (r"cannot do (label|index) indexing" + r" on {klass} with these indexers \[3\.0\] of" + r" {kind}" + .format(klass=type(i), kind=str(float))) + with pytest.raises(TypeError, match=msg): + s[3.0] @ignore_ix def test_scalar_with_mixed(self): @@ -153,19 +171,23 @@ def test_scalar_with_mixed(self): s2 = Series([1, 2, 3], index=['a', 'b', 'c']) s3 = Series([1, 2, 3], index=['a', 'b', 1.5]) - # lookup in a pure string index + # lookup in a pure stringstr # with an invalid indexer for idxr in [lambda x: x.ix, lambda x: x, lambda x: x.iloc]: - def f(): - with catch_warnings(record=True): + msg = (r"cannot do label indexing" + r" on {klass} with these indexers \[1\.0\] of" + r" {kind}|" + "Cannot index by location index with a non-integer key" + .format(klass=str(Index), kind=str(float))) + with catch_warnings(record=True): + with pytest.raises(TypeError, match=msg): idxr(s2)[1.0] - pytest.raises(TypeError, f) - - pytest.raises(KeyError, lambda: s2.loc[1.0]) + with pytest.raises(KeyError, match=r"^1$"): + s2.loc[1.0] result = s2.loc['b'] expected = 2 @@ -175,11 +197,13 @@ def f(): # indexing for idxr in [lambda x: x]: - def f(): + msg = (r"cannot do label indexing" + r" on {klass} with these indexers \[1\.0\] of" + r" {kind}" + .format(klass=str(Index), kind=str(float))) + with pytest.raises(TypeError, match=msg): idxr(s3)[1.0] - pytest.raises(TypeError, f) - result = idxr(s3)[1] expected = 2 assert result == expected @@ -189,17 +213,22 @@ def f(): for idxr in [lambda x: x.ix]: with catch_warnings(record=True): - def f(): + msg = (r"cannot do label indexing" + r" on {klass} with these indexers \[1\.0\] of" + r" {kind}" + .format(klass=str(Index), kind=str(float))) + with pytest.raises(TypeError, match=msg): idxr(s3)[1.0] - pytest.raises(TypeError, f) - result = idxr(s3)[1] expected = 2 assert result == expected - pytest.raises(TypeError, lambda: s3.iloc[1.0]) - pytest.raises(KeyError, lambda: s3.loc[1.0]) + msg = "Cannot index by location index with a non-integer key" + with pytest.raises(TypeError, match=msg): + s3.iloc[1.0] + with pytest.raises(KeyError, match=r"^1$"): + s3.loc[1.0] result = s3.loc[1.5] expected = 3 @@ -280,16 +309,14 @@ def test_scalar_float(self): # setting s2 = s.copy() - def f(): - with catch_warnings(record=True): - idxr(s2)[indexer] = expected with catch_warnings(record=True): result = idxr(s2)[indexer] self.check(result, s, 3, getitem) # random integer is a KeyError with catch_warnings(record=True): - pytest.raises(KeyError, lambda: idxr(s)[3.5]) + with pytest.raises(KeyError, match=r"^3\.5$"): + idxr(s)[3.5] # contains assert 3.0 in s @@ -303,11 +330,16 @@ def f(): self.check(result, s, 3, False) # iloc raises with a float - pytest.raises(TypeError, lambda: s.iloc[3.0]) + msg = "Cannot index by location index with a non-integer key" + with pytest.raises(TypeError, match=msg): + s.iloc[3.0] - def g(): + msg = (r"cannot do positional indexing" + r" on {klass} with these indexers \[3\.0\] of" + r" {kind}" + .format(klass=str(Float64Index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s2.iloc[3.0] = 0 - pytest.raises(TypeError, g) @ignore_ix def test_slice_non_numeric(self): @@ -329,37 +361,55 @@ def test_slice_non_numeric(self): slice(3, 4.0), slice(3.0, 4.0)]: - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(3|4)\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s.iloc[l] - pytest.raises(TypeError, f) for idxr in [lambda x: x.ix, lambda x: x.loc, lambda x: x.iloc, lambda x: x]: - def f(): - with catch_warnings(record=True): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers" + r" \[(3|4)(\.0)?\]" + r" of ({kind_float}|{kind_int})" + .format(klass=type(index), + kind_float=str(float), + kind_int=str(int))) + with catch_warnings(record=True): + with pytest.raises(TypeError, match=msg): idxr(s)[l] - pytest.raises(TypeError, f) # setitem for l in [slice(3.0, 4), slice(3, 4.0), slice(3.0, 4.0)]: - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(3|4)\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s.iloc[l] = 0 - pytest.raises(TypeError, f) for idxr in [lambda x: x.ix, lambda x: x.loc, lambda x: x.iloc, lambda x: x]: - def f(): - with catch_warnings(record=True): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers" + r" \[(3|4)(\.0)?\]" + r" of ({kind_float}|{kind_int})" + .format(klass=type(index), + kind_float=str(float), + kind_int=str(int))) + with catch_warnings(record=True): + with pytest.raises(TypeError, match=msg): idxr(s)[l] = 0 - pytest.raises(TypeError, f) @ignore_ix def test_slice_integer(self): @@ -396,11 +446,13 @@ def test_slice_integer(self): self.check(result, s, indexer, False) # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(3|4)\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[l] - pytest.raises(TypeError, f) - # getitem out-of-bounds for l in [slice(-6, 6), slice(-6.0, 6.0)]: @@ -420,11 +472,13 @@ def f(): self.check(result, s, indexer, False) # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[-6\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[slice(-6.0, 6.0)] - pytest.raises(TypeError, f) - # getitem odd floats for l, res1 in [(slice(2.5, 4), slice(3, 5)), (slice(2, 3.5), slice(2, 4)), @@ -443,11 +497,13 @@ def f(): self.check(result, s, res, False) # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(2|3)\.5\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[l] - pytest.raises(TypeError, f) - # setitem for l in [slice(3.0, 4), slice(3, 4.0), @@ -462,11 +518,13 @@ def f(): assert (result == 0).all() # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(3|4)\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[l] = 0 - pytest.raises(TypeError, f) - def test_integer_positional_indexing(self): """ make sure that we are raising on positional indexing w.r.t. an integer index """ @@ -484,11 +542,17 @@ def test_integer_positional_indexing(self): slice(2.0, 4), slice(2.0, 4.0)]: - def f(): + if compat.PY2: + klass = Int64Index + else: + klass = RangeIndex + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(2|4)\.0\] of" + " {kind}" + .format(klass=str(klass), kind=str(float))) + with pytest.raises(TypeError, match=msg): idxr(s)[l] - pytest.raises(TypeError, f) - @ignore_ix def test_slice_integer_frame_getitem(self): @@ -509,11 +573,13 @@ def f(idxr): self.check(result, s, indexer, False) # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(0|1)\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[l] - pytest.raises(TypeError, f) - # getitem out-of-bounds for l in [slice(-10, 10), slice(-10.0, 10.0)]: @@ -522,11 +588,13 @@ def f(): self.check(result, s, slice(-10, 10), True) # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[-10\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[slice(-10.0, 10.0)] - pytest.raises(TypeError, f) - # getitem odd floats for l, res in [(slice(0.5, 1), slice(1, 2)), (slice(0, 0.5), slice(0, 1)), @@ -536,11 +604,13 @@ def f(): self.check(result, s, res, False) # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[0\.5\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[l] - pytest.raises(TypeError, f) - # setitem for l in [slice(3.0, 4), slice(3, 4.0), @@ -552,11 +622,13 @@ def f(): assert (result == 0).all() # positional indexing - def f(): + msg = ("cannot do slice indexing" + r" on {klass} with these indexers \[(3|4)\.0\] of" + " {kind}" + .format(klass=type(index), kind=str(float))) + with pytest.raises(TypeError, match=msg): s[l] = 0 - pytest.raises(TypeError, f) - f(lambda x: x.loc) with catch_warnings(record=True): f(lambda x: x.ix) @@ -632,9 +704,12 @@ def test_floating_misc(self): # value not found (and no fallbacking at all) # scalar integers - pytest.raises(KeyError, lambda: s.loc[4]) - pytest.raises(KeyError, lambda: s.loc[4]) - pytest.raises(KeyError, lambda: s[4]) + with pytest.raises(KeyError, match=r"^4\.0$"): + s.loc[4] + with pytest.raises(KeyError, match=r"^4\.0$"): + s.loc[4] + with pytest.raises(KeyError, match=r"^4\.0$"): + s[4] # fancy floats/integers create the correct entry (as nan) # fancy tests diff --git a/pandas/tests/indexing/test_iloc.py b/pandas/tests/indexing/test_iloc.py index a867387db4b46..5c87d553daba3 100644 --- a/pandas/tests/indexing/test_iloc.py +++ b/pandas/tests/indexing/test_iloc.py @@ -26,26 +26,33 @@ def test_iloc_exceeds_bounds(self): msg = 'positional indexers are out-of-bounds' with pytest.raises(IndexError, match=msg): df.iloc[:, [0, 1, 2, 3, 4, 5]] - pytest.raises(IndexError, lambda: df.iloc[[1, 30]]) - pytest.raises(IndexError, lambda: df.iloc[[1, -30]]) - pytest.raises(IndexError, lambda: df.iloc[[100]]) + with pytest.raises(IndexError, match=msg): + df.iloc[[1, 30]] + with pytest.raises(IndexError, match=msg): + df.iloc[[1, -30]] + with pytest.raises(IndexError, match=msg): + df.iloc[[100]] s = df['A'] - pytest.raises(IndexError, lambda: s.iloc[[100]]) - pytest.raises(IndexError, lambda: s.iloc[[-100]]) + with pytest.raises(IndexError, match=msg): + s.iloc[[100]] + with pytest.raises(IndexError, match=msg): + s.iloc[[-100]] # still raise on a single indexer msg = 'single positional indexer is out-of-bounds' with pytest.raises(IndexError, match=msg): df.iloc[30] - pytest.raises(IndexError, lambda: df.iloc[-30]) + with pytest.raises(IndexError, match=msg): + df.iloc[-30] # GH10779 # single positive/negative indexer exceeding Series bounds should raise # an IndexError with pytest.raises(IndexError, match=msg): s.iloc[30] - pytest.raises(IndexError, lambda: s.iloc[-30]) + with pytest.raises(IndexError, match=msg): + s.iloc[-30] # slices are ok result = df.iloc[:, 4:10] # 0 < start < len < stop @@ -104,8 +111,12 @@ def check(result, expected): check(dfl.iloc[:, 1:3], dfl.iloc[:, [1]]) check(dfl.iloc[4:6], dfl.iloc[[4]]) - pytest.raises(IndexError, lambda: dfl.iloc[[4, 5, 6]]) - pytest.raises(IndexError, lambda: dfl.iloc[:, 4]) + msg = "positional indexers are out-of-bounds" + with pytest.raises(IndexError, match=msg): + dfl.iloc[[4, 5, 6]] + msg = "single positional indexer is out-of-bounds" + with pytest.raises(IndexError, match=msg): + dfl.iloc[:, 4] def test_iloc_getitem_int(self): @@ -437,10 +448,16 @@ def test_iloc_getitem_labelled_frame(self): assert result == exp # out-of-bounds exception - pytest.raises(IndexError, df.iloc.__getitem__, tuple([10, 5])) + msg = "single positional indexer is out-of-bounds" + with pytest.raises(IndexError, match=msg): + df.iloc[10, 5] # trying to use a label - pytest.raises(ValueError, df.iloc.__getitem__, tuple(['j', 'D'])) + msg = (r"Location based indexing can only have \[integer, integer" + r" slice \(START point is INCLUDED, END point is EXCLUDED\)," + r" listlike of integers, boolean array\] types") + with pytest.raises(ValueError, match=msg): + df.iloc['j', 'D'] def test_iloc_getitem_doc_issue(self): @@ -555,10 +572,15 @@ def test_iloc_mask(self): # GH 3631, iloc with a mask (of a series) should raise df = DataFrame(lrange(5), list('ABCDE'), columns=['a']) mask = (df.a % 2 == 0) - pytest.raises(ValueError, df.iloc.__getitem__, tuple([mask])) + msg = ("iLocation based boolean indexing cannot use an indexable as" + " a mask") + with pytest.raises(ValueError, match=msg): + df.iloc[mask] mask.index = lrange(len(mask)) - pytest.raises(NotImplementedError, df.iloc.__getitem__, - tuple([mask])) + msg = ("iLocation based boolean indexing on an integer type is not" + " available") + with pytest.raises(NotImplementedError, match=msg): + df.iloc[mask] # ndarray ok result = df.iloc[np.array([True] * len(mask), dtype=bool)] diff --git a/pandas/tests/indexing/test_ix.py b/pandas/tests/indexing/test_ix.py index 35805bce07705..fb4dfbb39ce94 100644 --- a/pandas/tests/indexing/test_ix.py +++ b/pandas/tests/indexing/test_ix.py @@ -102,7 +102,12 @@ def compare(result, expected): with catch_warnings(record=True): df.ix[key] - pytest.raises(TypeError, lambda: df.loc[key]) + msg = (r"cannot do slice indexing" + r" on {klass} with these indexers \[(0|1)\] of" + r" {kind}" + .format(klass=type(df.index), kind=str(int))) + with pytest.raises(TypeError, match=msg): + df.loc[key] df = DataFrame(np.random.randn(5, 4), columns=list('ABCD'), index=pd.date_range('2012-01-01', periods=5)) @@ -122,7 +127,8 @@ def compare(result, expected): with catch_warnings(record=True): expected = df.ix[key] except KeyError: - pytest.raises(KeyError, lambda: df.loc[key]) + with pytest.raises(KeyError, match=r"^'2012-01-31'$"): + df.loc[key] continue result = df.loc[key] @@ -279,14 +285,18 @@ def test_ix_setitem_out_of_bounds_axis_0(self): np.random.randn(2, 5), index=["row%s" % i for i in range(2)], columns=["col%s" % i for i in range(5)]) with catch_warnings(record=True): - pytest.raises(ValueError, df.ix.__setitem__, (2, 0), 100) + msg = "cannot set by positional indexing with enlargement" + with pytest.raises(ValueError, match=msg): + df.ix[2, 0] = 100 def test_ix_setitem_out_of_bounds_axis_1(self): df = DataFrame( np.random.randn(5, 2), index=["row%s" % i for i in range(5)], columns=["col%s" % i for i in range(2)]) with catch_warnings(record=True): - pytest.raises(ValueError, df.ix.__setitem__, (0, 2), 100) + msg = "cannot set by positional indexing with enlargement" + with pytest.raises(ValueError, match=msg): + df.ix[0, 2] = 100 def test_ix_empty_list_indexer_is_ok(self): with catch_warnings(record=True): diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index 17e107c7a1130..3bf4a6bee4af9 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -233,8 +233,10 @@ def test_loc_to_fail(self): columns=['e', 'f', 'g']) # raise a KeyError? - pytest.raises(KeyError, df.loc.__getitem__, - tuple([[1, 2], [1, 2]])) + msg = (r"\"None of \[Int64Index\(\[1, 2\], dtype='int64'\)\] are" + r" in the \[index\]\"") + with pytest.raises(KeyError, match=msg): + df.loc[[1, 2], [1, 2]] # GH 7496 # loc should not fallback @@ -243,10 +245,18 @@ def test_loc_to_fail(self): s.loc[1] = 1 s.loc['a'] = 2 - pytest.raises(KeyError, lambda: s.loc[-1]) - pytest.raises(KeyError, lambda: s.loc[[-1, -2]]) + with pytest.raises(KeyError, match=r"^-1$"): + s.loc[-1] + + msg = (r"\"None of \[Int64Index\(\[-1, -2\], dtype='int64'\)\] are" + r" in the \[index\]\"") + with pytest.raises(KeyError, match=msg): + s.loc[[-1, -2]] - pytest.raises(KeyError, lambda: s.loc[['4']]) + msg = (r"\"None of \[Index\(\[u?'4'\], dtype='object'\)\] are" + r" in the \[index\]\"") + with pytest.raises(KeyError, match=msg): + s.loc[['4']] s.loc[-1] = 3 with tm.assert_produces_warning(FutureWarning, @@ -256,29 +266,28 @@ def test_loc_to_fail(self): tm.assert_series_equal(result, expected) s['a'] = 2 - pytest.raises(KeyError, lambda: s.loc[[-2]]) + msg = (r"\"None of \[Int64Index\(\[-2\], dtype='int64'\)\] are" + r" in the \[index\]\"") + with pytest.raises(KeyError, match=msg): + s.loc[[-2]] del s['a'] - def f(): + with pytest.raises(KeyError, match=msg): s.loc[[-2]] = 0 - pytest.raises(KeyError, f) - # inconsistency between .loc[values] and .loc[values,:] # GH 7999 df = DataFrame([['a'], ['b']], index=[1, 2], columns=['value']) - def f(): + msg = (r"\"None of \[Int64Index\(\[3\], dtype='int64'\)\] are" + r" in the \[index\]\"") + with pytest.raises(KeyError, match=msg): df.loc[[3], :] - pytest.raises(KeyError, f) - - def f(): + with pytest.raises(KeyError, match=msg): df.loc[[3]] - pytest.raises(KeyError, f) - def test_loc_getitem_list_with_fail(self): # 15747 # should KeyError if *any* missing labels @@ -600,11 +609,15 @@ def test_loc_non_unique(self): # these are going to raise because the we are non monotonic df = DataFrame({'A': [1, 2, 3, 4, 5, 6], 'B': [3, 4, 5, 6, 7, 8]}, index=[0, 1, 0, 1, 2, 3]) - pytest.raises(KeyError, df.loc.__getitem__, - tuple([slice(1, None)])) - pytest.raises(KeyError, df.loc.__getitem__, - tuple([slice(0, None)])) - pytest.raises(KeyError, df.loc.__getitem__, tuple([slice(1, 2)])) + msg = "'Cannot get left slice bound for non-unique label: 1'" + with pytest.raises(KeyError, match=msg): + df.loc[1:] + msg = "'Cannot get left slice bound for non-unique label: 0'" + with pytest.raises(KeyError, match=msg): + df.loc[0:] + msg = "'Cannot get left slice bound for non-unique label: 1'" + with pytest.raises(KeyError, match=msg): + df.loc[1:2] # monotonic are ok df = DataFrame({'A': [1, 2, 3, 4, 5, 6], diff --git a/pandas/tests/indexing/test_panel.py b/pandas/tests/indexing/test_panel.py index 34708e1148c90..8530adec011be 100644 --- a/pandas/tests/indexing/test_panel.py +++ b/pandas/tests/indexing/test_panel.py @@ -122,28 +122,6 @@ def test_panel_getitem(self): test1 = panel.loc[:, "2002"] tm.assert_panel_equal(test1, test2) - # GH8710 - # multi-element getting with a list - panel = tm.makePanel() - - expected = panel.iloc[[0, 1]] - - result = panel.loc[['ItemA', 'ItemB']] - tm.assert_panel_equal(result, expected) - - result = panel.loc[['ItemA', 'ItemB'], :, :] - tm.assert_panel_equal(result, expected) - - result = panel[['ItemA', 'ItemB']] - tm.assert_panel_equal(result, expected) - - result = panel.loc['ItemA':'ItemB'] - tm.assert_panel_equal(result, expected) - - with catch_warnings(record=True): - result = panel.ix[['ItemA', 'ItemB']] - tm.assert_panel_equal(result, expected) - # with an object-like # GH 9140 class TestObject(object): diff --git a/pandas/tests/indexing/test_partial.py b/pandas/tests/indexing/test_partial.py index b863afe02c2e8..5b6a5ab9ecf7b 100644 --- a/pandas/tests/indexing/test_partial.py +++ b/pandas/tests/indexing/test_partial.py @@ -246,7 +246,10 @@ def test_series_partial_set(self): tm.assert_series_equal(result, expected, check_index_type=True) # raises as nothing in in the index - pytest.raises(KeyError, lambda: ser.loc[[3, 3, 3]]) + msg = (r"\"None of \[Int64Index\(\[3, 3, 3\], dtype='int64'\)\] are" + r" in the \[index\]\"") + with pytest.raises(KeyError, match=msg): + ser.loc[[3, 3, 3]] expected = Series([0.2, 0.2, np.nan], index=[2, 2, 3]) with tm.assert_produces_warning(FutureWarning, check_stacklevel=False): @@ -342,7 +345,10 @@ def test_series_partial_set_with_name(self): tm.assert_series_equal(result, expected, check_index_type=True) # raises as nothing in in the index - pytest.raises(KeyError, lambda: ser.loc[[3, 3, 3]]) + msg = (r"\"None of \[Int64Index\(\[3, 3, 3\], dtype='int64'," + r" name=u?'idx'\)\] are in the \[index\]\"") + with pytest.raises(KeyError, match=msg): + ser.loc[[3, 3, 3]] exp_idx = Index([2, 2, 3], dtype='int64', name='idx') expected = Series([0.2, 0.2, np.nan], index=exp_idx, name='s') diff --git a/pandas/tests/indexing/test_scalar.py b/pandas/tests/indexing/test_scalar.py index e4b8181a67514..6d607ce86c08e 100644 --- a/pandas/tests/indexing/test_scalar.py +++ b/pandas/tests/indexing/test_scalar.py @@ -30,7 +30,9 @@ def _check(f, func, values=False): for f in [d['labels'], d['ts'], d['floats']]: if f is not None: - pytest.raises(ValueError, self.check_values, f, 'iat') + msg = "iAt based indexing can only have integer indexers" + with pytest.raises(ValueError, match=msg): + self.check_values(f, 'iat') # at for f in [d['ints'], d['uints'], d['labels'], @@ -57,7 +59,9 @@ def _check(f, func, values=False): for f in [d['labels'], d['ts'], d['floats']]: if f is not None: - pytest.raises(ValueError, _check, f, 'iat') + msg = "iAt based indexing can only have integer indexers" + with pytest.raises(ValueError, match=msg): + _check(f, 'iat') # at for f in [d['ints'], d['uints'], d['labels'], @@ -107,8 +111,12 @@ def test_imethods_with_dups(self): result = s.iat[2] assert result == 2 - pytest.raises(IndexError, lambda: s.iat[10]) - pytest.raises(IndexError, lambda: s.iat[-10]) + msg = "index 10 is out of bounds for axis 0 with size 5" + with pytest.raises(IndexError, match=msg): + s.iat[10] + msg = "index -10 is out of bounds for axis 0 with size 5" + with pytest.raises(IndexError, match=msg): + s.iat[-10] result = s.iloc[[2, 3]] expected = Series([2, 3], [2, 2], dtype='int64') @@ -128,22 +136,30 @@ def test_at_to_fail(self): s = Series([1, 2, 3], index=list('abc')) result = s.at['a'] assert result == 1 - pytest.raises(ValueError, lambda: s.at[0]) + msg = ("At based indexing on an non-integer index can only have" + " non-integer indexers") + with pytest.raises(ValueError, match=msg): + s.at[0] df = DataFrame({'A': [1, 2, 3]}, index=list('abc')) result = df.at['a', 'A'] assert result == 1 - pytest.raises(ValueError, lambda: df.at['a', 0]) + with pytest.raises(ValueError, match=msg): + df.at['a', 0] s = Series([1, 2, 3], index=[3, 2, 1]) result = s.at[1] assert result == 3 - pytest.raises(ValueError, lambda: s.at['a']) + msg = ("At based indexing on an integer index can only have integer" + " indexers") + with pytest.raises(ValueError, match=msg): + s.at['a'] df = DataFrame({0: [1, 2, 3]}, index=[3, 2, 1]) result = df.at[1, 0] assert result == 3 - pytest.raises(ValueError, lambda: df.at['a', 0]) + with pytest.raises(ValueError, match=msg): + df.at['a', 0] # GH 13822, incorrect error string with non-unique columns when missing # column is accessed diff --git a/pandas/tests/internals/test_internals.py b/pandas/tests/internals/test_internals.py index fe0706efdc4f8..bda486411e01e 100644 --- a/pandas/tests/internals/test_internals.py +++ b/pandas/tests/internals/test_internals.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # pylint: disable=W0102 - +from collections import OrderedDict from datetime import date, datetime from distutils.version import LooseVersion import itertools @@ -12,7 +12,7 @@ import pytest from pandas._libs.internals import BlockPlacement -from pandas.compat import OrderedDict, lrange, u, zip +from pandas.compat import lrange, u, zip import pandas as pd from pandas import ( diff --git a/pandas/tests/io/data/legacy_hdf/legacy_table.h5 b/pandas/tests/io/data/legacy_hdf/legacy_table.h5 deleted file mode 100644 index 1c90382d9125c039e40b821f41451b989d1c2b36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211111 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 diff --git a/pandas/tests/io/data/legacy_hdf/legacy_table_py2.h5 b/pandas/tests/io/data/legacy_hdf/legacy_table_py2.h5 new file mode 100644 index 0000000000000000000000000000000000000000..3863d714a315b79de100e8446db766ec7dc2e82c GIT binary patch literal 72279 zcmeI#%}yIv6u|K@5O5q*2$iaeZdlb`Axyqlh89yS8G|rwQmN8(j3>yd8C$l4(p{JB zTXdNR=^~HPw`k9~cMcu~oF-KlRq`M3jOWh%IP;r(?_B?Ou(!WlS}z5<6^p?_uA=CK^3k@feV0jg`TSouciU}A*Zg1Ir>&_bedmlF9zS$Puh*6 zmdme0$MV-Ux8zLo@3><@Mw;e7{{D3Lt7g3&?jM~T?w*FT%5QJh(sFCA&ipuCO$XfS zg3A{C(>UE(_W9Cc{)GKUBQR^64%7MDApYxd+HM`~6{H7SzbmHw)yBzIdVZXX!{XuS z1#G^{drjw~|J!_5cJtjZO1jZFocui0+27Br_vC2L|HUY}h(qgjI$!#Evk zDm)wX$1d5G|H57O=hgnOR;o6(O6`ivS}6^;OOxS)QncwZl!K@4Sdcr?dH*u%zl_Jz z3ibW6CLfE()z_{>l~UBMbY$U26AKWyq zWfxaBnnW7a%ZtR_>AS~Ol~y%={~k=DBpk)V8}C6$cloBz^{y)sCuf6hFFAJ?WvA`x zlEFM$SNCu2EctSy(O@KzYW{3L7*9sMvq`r9EIIjpd>QLA)c2+Q%l6dmtsOh&#62X04muYFEll^ZWT? z_PY0pHY52r+|jS&7jCTMWv>je2u0+zMN}hq~-{<1o99xBh>7x!SdI zdguP`gCNq%WV^lG_RMlN7N)-gmZgqjU~%p@noX@YI~MfZ+STv6-QI33wDLCgZkDs( zAK7-dugbl9yV>{RPr~Tq(sq~RW9{~mNqioUGV%I(I|_Xn&96h!@@L+AZpNSX6Dy}P zv44*Gz^&ZP_k-_OQP_2BjeK1Cen`%DZp77jdt6s<;(T14@crWIWa7HsA199=Iuq;1 zixOioXq_BAYfJj9=i@rRT-V=yy1uq?IX%k7Tej!x*AsP8)lJ_GYzQEL00Iag@L>x? zwt%n&RVV$y_+j5RcZUE12q1s}0tg_000IagfB*srAb check it is not used to + # determine size of truncation (...) column + df = pd.DataFrame({'a': [108480, 30830], 'b': [12345, 12345], + 'c': [12345, 12345], 'd': [12345, 12345], + 'e': ['a' * 50] * 2}) + assert "..." in str(df) + assert " ... " not in str(df) + def test_repr_max_columns_max_rows(self): term_width, term_height = get_terminal_size() if term_width < 10 or term_height < 10: @@ -543,7 +553,7 @@ def test_to_string_with_formatters_unicode(self): formatters={u('c/\u03c3'): lambda x: '{x}'.format(x=x)}) assert result == u(' c/\u03c3\n') + '0 1\n1 2\n2 3' - def test_east_asian_unicode_frame(self): + def test_east_asian_unicode_false(self): if PY3: _rep = repr else: @@ -643,17 +653,23 @@ def test_east_asian_unicode_frame(self): u'ああああ': [u'さ', u'し', u'す', u'せ']}, columns=['a', 'b', 'c', u'ああああ']) - expected = (u" a ... ああああ\n0 あああああ ... さ\n" - u".. ... ... ...\n3 えええ ... せ\n" + expected = (u" a ... ああああ\n0 あああああ ... さ\n" + u".. ... ... ...\n3 えええ ... せ\n" u"\n[4 rows x 4 columns]") assert _rep(df) == expected df.index = [u'あああ', u'いいいい', u'う', 'aaa'] - expected = (u" a ... ああああ\nあああ あああああ ... さ\n" - u".. ... ... ...\naaa えええ ... せ\n" + expected = (u" a ... ああああ\nあああ あああああ ... さ\n" + u".. ... ... ...\naaa えええ ... せ\n" u"\n[4 rows x 4 columns]") assert _rep(df) == expected + def test_east_asian_unicode_true(self): + if PY3: + _rep = repr + else: + _rep = unicode # noqa + # Emable Unicode option ----------------------------------------- with option_context('display.unicode.east_asian_width', True): @@ -757,18 +773,18 @@ def test_east_asian_unicode_frame(self): u'ああああ': [u'さ', u'し', u'す', u'せ']}, columns=['a', 'b', 'c', u'ああああ']) - expected = (u" a ... ああああ\n" - u"0 あああああ ... さ\n" - u".. ... ... ...\n" - u"3 えええ ... せ\n" + expected = (u" a ... ああああ\n" + u"0 あああああ ... さ\n" + u".. ... ... ...\n" + u"3 えええ ... せ\n" u"\n[4 rows x 4 columns]") assert _rep(df) == expected df.index = [u'あああ', u'いいいい', u'う', 'aaa'] - expected = (u" a ... ああああ\n" - u"あああ あああああ ... さ\n" - u"... ... ... ...\n" - u"aaa えええ ... せ\n" + expected = (u" a ... ああああ\n" + u"あああ あああああ ... さ\n" + u"... ... ... ...\n" + u"aaa えええ ... せ\n" u"\n[4 rows x 4 columns]") assert _rep(df) == expected @@ -1465,6 +1481,39 @@ def test_to_string_format_na(self): '4 4.0 bar') assert result == expected + def test_to_string_format_inf(self): + # Issue #24861 + tm.reset_display_options() + df = DataFrame({ + 'A': [-np.inf, np.inf, -1, -2.1234, 3, 4], + 'B': [-np.inf, np.inf, 'foo', 'foooo', 'fooooo', 'bar'] + }) + result = df.to_string() + + expected = (' A B\n' + '0 -inf -inf\n' + '1 inf inf\n' + '2 -1.0000 foo\n' + '3 -2.1234 foooo\n' + '4 3.0000 fooooo\n' + '5 4.0000 bar') + assert result == expected + + df = DataFrame({ + 'A': [-np.inf, np.inf, -1., -2., 3., 4.], + 'B': [-np.inf, np.inf, 'foo', 'foooo', 'fooooo', 'bar'] + }) + result = df.to_string() + + expected = (' A B\n' + '0 -inf -inf\n' + '1 inf inf\n' + '2 -1.0 foo\n' + '3 -2.0 foooo\n' + '4 3.0 fooooo\n' + '5 4.0 bar') + assert result == expected + def test_to_string_decimal(self): # Issue #23614 df = DataFrame({'A': [6.0, 3.1, 2.2]}) @@ -2729,3 +2778,17 @@ def test_format_percentiles(): fmt.format_percentiles([2, 0.1, 0.5]) with pytest.raises(ValueError, match=msg): fmt.format_percentiles([0.1, 0.5, 'a']) + + +def test_repr_html_ipython_config(ip): + code = textwrap.dedent("""\ + import pandas as pd + df = pd.DataFrame({"A": [1, 2]}) + df._repr_html_() + + cfg = get_ipython().config + cfg['IPKernelApp']['parent_appname'] + df._repr_html_() + """) + result = ip.run_cell(code) + assert not result.error_in_exec diff --git a/pandas/tests/io/json/test_pandas.py b/pandas/tests/io/json/test_pandas.py index 23c40276072d6..0ffc8c978a228 100644 --- a/pandas/tests/io/json/test_pandas.py +++ b/pandas/tests/io/json/test_pandas.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # pylint: disable-msg=W0612,E1101 +from collections import OrderedDict from datetime import timedelta import json import os @@ -7,8 +8,7 @@ import numpy as np import pytest -from pandas.compat import ( - OrderedDict, StringIO, is_platform_32bit, lrange, range) +from pandas.compat import StringIO, is_platform_32bit, lrange, range import pandas.util._test_decorators as td import pandas as pd @@ -1262,3 +1262,13 @@ def test_index_false_error_to_json(self, orient): "'orient' is 'split' or 'table'") with pytest.raises(ValueError, match=msg): df.to_json(orient=orient, index=False) + + @pytest.mark.parametrize('orient', ['split', 'table']) + @pytest.mark.parametrize('index', [True, False]) + def test_index_false_from_json_to_json(self, orient, index): + # GH25170 + # Test index=False in from_json to_json + expected = DataFrame({'a': [1, 2], 'b': [3, 4]}) + dfjson = expected.to_json(orient=orient, index=index) + result = read_json(dfjson, orient=orient) + assert_frame_equal(result, expected) diff --git a/pandas/tests/io/msgpack/test_pack.py b/pandas/tests/io/msgpack/test_pack.py index 8c82d0d2cf870..078d9f4ceb649 100644 --- a/pandas/tests/io/msgpack/test_pack.py +++ b/pandas/tests/io/msgpack/test_pack.py @@ -1,10 +1,10 @@ # coding: utf-8 - +from collections import OrderedDict import struct import pytest -from pandas.compat import OrderedDict, u +from pandas.compat import u from pandas import compat diff --git a/pandas/tests/io/test_clipboard.py b/pandas/tests/io/test_clipboard.py index 8eb26d9f3dec5..565db92210b0a 100644 --- a/pandas/tests/io/test_clipboard.py +++ b/pandas/tests/io/test_clipboard.py @@ -12,6 +12,7 @@ from pandas.util import testing as tm from pandas.util.testing import makeCustomDataframe as mkdf +from pandas.io.clipboard import clipboard_get, clipboard_set from pandas.io.clipboard.exceptions import PyperclipException try: @@ -30,8 +31,8 @@ def build_kwargs(sep, excel): return kwargs -@pytest.fixture(params=['delims', 'utf8', 'string', 'long', 'nonascii', - 'colwidth', 'mixed', 'float', 'int']) +@pytest.fixture(params=['delims', 'utf8', 'utf16', 'string', 'long', + 'nonascii', 'colwidth', 'mixed', 'float', 'int']) def df(request): data_type = request.param @@ -41,6 +42,10 @@ def df(request): elif data_type == 'utf8': return pd.DataFrame({'a': ['µasd', 'Ωœ∑´'], 'b': ['øπ∆˚¬', 'œ∑´®']}) + elif data_type == 'utf16': + return pd.DataFrame({'a': ['\U0001f44d\U0001f44d', + '\U0001f44d\U0001f44d'], + 'b': ['abc', 'def']}) elif data_type == 'string': return mkdf(5, 3, c_idx_type='s', r_idx_type='i', c_idx_names=[None], r_idx_names=[None]) @@ -225,3 +230,14 @@ def test_invalid_encoding(self, df): @pytest.mark.parametrize('enc', ['UTF-8', 'utf-8', 'utf8']) def test_round_trip_valid_encodings(self, enc, df): self.check_round_trip_frame(df, encoding=enc) + + +@pytest.mark.single +@pytest.mark.clipboard +@pytest.mark.skipif(not _DEPS_INSTALLED, + reason="clipboard primitives not installed") +@pytest.mark.parametrize('data', [u'\U0001f44d...', u'Ωœ∑´...', 'abcd...']) +def test_raw_roundtrip(data): + # PR #25040 wide unicode wasn't copied correctly on PY3 on windows + clipboard_set(data) + assert data == clipboard_get() diff --git a/pandas/tests/io/test_excel.py b/pandas/tests/io/test_excel.py index 717e9bc23c6b1..8c92db734168b 100644 --- a/pandas/tests/io/test_excel.py +++ b/pandas/tests/io/test_excel.py @@ -5,7 +5,6 @@ from functools import partial import os import warnings -from warnings import catch_warnings import numpy as np from numpy import nan @@ -2382,15 +2381,12 @@ def check_called(func): assert isinstance(writer, DummyClass) df = tm.makeCustomDataframe(1, 1) - with catch_warnings(record=True): - panel = tm.makePanel() - func = lambda: df.to_excel('something.test') - check_called(func) - check_called(lambda: panel.to_excel('something.test')) - check_called(lambda: df.to_excel('something.xlsx')) - check_called( - lambda: df.to_excel( - 'something.xls', engine='dummy')) + func = lambda: df.to_excel('something.test') + check_called(func) + check_called(lambda: df.to_excel('something.xlsx')) + check_called( + lambda: df.to_excel( + 'something.xls', engine='dummy')) @pytest.mark.parametrize('engine', [ diff --git a/pandas/tests/io/test_pytables.py b/pandas/tests/io/test_pytables.py index 517a3e059469c..b464903d8b4e0 100644 --- a/pandas/tests/io/test_pytables.py +++ b/pandas/tests/io/test_pytables.py @@ -19,11 +19,11 @@ import pandas as pd from pandas import ( Categorical, DataFrame, DatetimeIndex, Index, Int64Index, MultiIndex, - Panel, RangeIndex, Series, Timestamp, bdate_range, compat, concat, - date_range, isna, timedelta_range) + RangeIndex, Series, Timestamp, bdate_range, compat, concat, date_range, + isna, timedelta_range) import pandas.util.testing as tm from pandas.util.testing import ( - assert_frame_equal, assert_panel_equal, assert_series_equal, set_timezone) + assert_frame_equal, assert_series_equal, set_timezone) from pandas.io import pytables as pytables # noqa:E402 from pandas.io.formats.printing import pprint_thing @@ -141,7 +141,6 @@ def teardown_method(self, method): @pytest.mark.single -@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") class TestHDFStore(Base): def test_format_kwarg_in_constructor(self): @@ -185,11 +184,6 @@ def roundtrip(key, obj, **kwargs): o = tm.makeDataFrame() assert_frame_equal(o, roundtrip('frame', o)) - with catch_warnings(record=True): - - o = tm.makePanel() - assert_panel_equal(o, roundtrip('panel', o)) - # table df = DataFrame(dict(A=lrange(5), B=lrange(5))) df.to_hdf(path, 'table', append=True) @@ -348,11 +342,9 @@ def test_keys(self): store['a'] = tm.makeTimeSeries() store['b'] = tm.makeStringSeries() store['c'] = tm.makeDataFrame() - with catch_warnings(record=True): - store['d'] = tm.makePanel() - store['foo/bar'] = tm.makePanel() - assert len(store) == 5 - expected = {'/a', '/b', '/c', '/d', '/foo/bar'} + + assert len(store) == 3 + expected = {'/a', '/b', '/c'} assert set(store.keys()) == expected assert set(store) == expected @@ -388,11 +380,6 @@ def test_repr(self): store['b'] = tm.makeStringSeries() store['c'] = tm.makeDataFrame() - with catch_warnings(record=True): - store['d'] = tm.makePanel() - store['foo/bar'] = tm.makePanel() - store.append('e', tm.makePanel()) - df = tm.makeDataFrame() df['obj1'] = 'foo' df['obj2'] = 'bar' @@ -936,21 +923,6 @@ def test_append(self): store.append('/df3 foo', df[10:]) tm.assert_frame_equal(store['df3 foo'], df) - # panel - wp = tm.makePanel() - _maybe_remove(store, 'wp1') - store.append('wp1', wp.iloc[:, :10, :]) - store.append('wp1', wp.iloc[:, 10:, :]) - assert_panel_equal(store['wp1'], wp) - - # test using differt order of items on the non-index axes - _maybe_remove(store, 'wp1') - wp_append1 = wp.iloc[:, :10, :] - store.append('wp1', wp_append1) - wp_append2 = wp.iloc[:, 10:, :].reindex(items=wp.items[::-1]) - store.append('wp1', wp_append2) - assert_panel_equal(store['wp1'], wp) - # dtype issues - mizxed type in a single object column df = DataFrame(data=[[1, 2], [0, 1], [1, 2], [0, 0]]) df['mixed_column'] = 'testing' @@ -1254,22 +1226,6 @@ def test_append_all_nans(self): reloaded = read_hdf(path, 'df_with_missing') tm.assert_frame_equal(df_with_missing, reloaded) - matrix = [[[np.nan, np.nan, np.nan], [1, np.nan, np.nan]], - [[np.nan, np.nan, np.nan], [np.nan, 5, 6]], - [[np.nan, np.nan, np.nan], [np.nan, 3, np.nan]]] - - with catch_warnings(record=True): - panel_with_missing = Panel(matrix, - items=['Item1', 'Item2', 'Item3'], - major_axis=[1, 2], - minor_axis=['A', 'B', 'C']) - - with ensure_clean_path(self.path) as path: - panel_with_missing.to_hdf( - path, 'panel_with_missing', format='table') - reloaded_panel = read_hdf(path, 'panel_with_missing') - tm.assert_panel_equal(panel_with_missing, reloaded_panel) - def test_append_frame_column_oriented(self): with ensure_clean_store(self.path) as store: @@ -1342,40 +1298,11 @@ def test_append_with_strings(self): with ensure_clean_store(self.path) as store: with catch_warnings(record=True): - simplefilter("ignore", FutureWarning) - wp = tm.makePanel() - wp2 = wp.rename( - minor_axis={x: "%s_extra" % x for x in wp.minor_axis}) def check_col(key, name, size): assert getattr(store.get_storer(key) .table.description, name).itemsize == size - store.append('s1', wp, min_itemsize=20) - store.append('s1', wp2) - expected = concat([wp, wp2], axis=2) - expected = expected.reindex( - minor_axis=sorted(expected.minor_axis)) - assert_panel_equal(store['s1'], expected) - check_col('s1', 'minor_axis', 20) - - # test dict format - store.append('s2', wp, min_itemsize={'minor_axis': 20}) - store.append('s2', wp2) - expected = concat([wp, wp2], axis=2) - expected = expected.reindex( - minor_axis=sorted(expected.minor_axis)) - assert_panel_equal(store['s2'], expected) - check_col('s2', 'minor_axis', 20) - - # apply the wrong field (similar to #1) - store.append('s3', wp, min_itemsize={'major_axis': 20}) - pytest.raises(ValueError, store.append, 's3', wp2) - - # test truncation of bigger strings - store.append('s4', wp) - pytest.raises(ValueError, store.append, 's4', wp2) - # avoid truncation on elements df = DataFrame([[123, 'asdqwerty'], [345, 'dggnhebbsdfbdfb']]) store.append('df_big', df) @@ -1674,32 +1601,6 @@ def check_col(key, name, size): (df_dc.string == 'foo')] tm.assert_frame_equal(result, expected) - with ensure_clean_store(self.path) as store: - with catch_warnings(record=True): - # panel - # GH5717 not handling data_columns - np.random.seed(1234) - p = tm.makePanel() - - store.append('p1', p) - tm.assert_panel_equal(store.select('p1'), p) - - store.append('p2', p, data_columns=True) - tm.assert_panel_equal(store.select('p2'), p) - - result = store.select('p2', where='ItemA>0') - expected = p.to_frame() - expected = expected[expected['ItemA'] > 0] - tm.assert_frame_equal(result.to_frame(), expected) - - result = store.select( - 'p2', where='ItemA>0 & minor_axis=["A","B"]') - expected = p.to_frame() - expected = expected[expected['ItemA'] > 0] - expected = expected[expected.reset_index( - level=['major']).index.isin(['A', 'B'])] - tm.assert_frame_equal(result.to_frame(), expected) - def test_create_table_index(self): with ensure_clean_store(self.path) as store: @@ -1708,37 +1609,6 @@ def test_create_table_index(self): def col(t, column): return getattr(store.get_storer(t).table.cols, column) - # index=False - wp = tm.makePanel() - store.append('p5', wp, index=False) - store.create_table_index('p5', columns=['major_axis']) - assert(col('p5', 'major_axis').is_indexed is True) - assert(col('p5', 'minor_axis').is_indexed is False) - - # index=True - store.append('p5i', wp, index=True) - assert(col('p5i', 'major_axis').is_indexed is True) - assert(col('p5i', 'minor_axis').is_indexed is True) - - # default optlevels - store.get_storer('p5').create_index() - assert(col('p5', 'major_axis').index.optlevel == 6) - assert(col('p5', 'minor_axis').index.kind == 'medium') - - # let's change the indexing scheme - store.create_table_index('p5') - assert(col('p5', 'major_axis').index.optlevel == 6) - assert(col('p5', 'minor_axis').index.kind == 'medium') - store.create_table_index('p5', optlevel=9) - assert(col('p5', 'major_axis').index.optlevel == 9) - assert(col('p5', 'minor_axis').index.kind == 'medium') - store.create_table_index('p5', kind='full') - assert(col('p5', 'major_axis').index.optlevel == 9) - assert(col('p5', 'minor_axis').index.kind == 'full') - store.create_table_index('p5', optlevel=1, kind='light') - assert(col('p5', 'major_axis').index.optlevel == 1) - assert(col('p5', 'minor_axis').index.kind == 'light') - # data columns df = tm.makeTimeDataFrame() df['string'] = 'foo' @@ -1761,19 +1631,6 @@ def col(t, column): store.put('f2', df) pytest.raises(TypeError, store.create_table_index, 'f2') - def test_append_diff_item_order(self): - - with catch_warnings(record=True): - wp = tm.makePanel() - wp1 = wp.iloc[:, :10, :] - wp2 = wp.iloc[wp.items.get_indexer(['ItemC', 'ItemB', 'ItemA']), - 10:, :] - - with ensure_clean_store(self.path) as store: - store.put('panel', wp1, format='table') - pytest.raises(ValueError, store.put, 'panel', wp2, - append=True) - def test_append_hierarchical(self): index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'], ['one', 'two', 'three']], @@ -1987,10 +1844,6 @@ def check(obj, comparator): df['time2'] = Timestamp('20130102') check(df, tm.assert_frame_equal) - with catch_warnings(record=True): - p = tm.makePanel() - check(p, assert_panel_equal) - # empty frame, GH4273 with ensure_clean_store(self.path) as store: @@ -2011,24 +1864,6 @@ def check(obj, comparator): store.put('df2', df) assert_frame_equal(store.select('df2'), df) - with catch_warnings(record=True): - - # 0 len - p_empty = Panel(items=list('ABC')) - store.append('p', p_empty) - pytest.raises(KeyError, store.select, 'p') - - # repeated append of 0/non-zero frames - p = Panel(np.random.randn(3, 4, 5), items=list('ABC')) - store.append('p', p) - assert_panel_equal(store.select('p'), p) - store.append('p', p_empty) - assert_panel_equal(store.select('p'), p) - - # store - store.put('p2', p_empty) - assert_panel_equal(store.select('p2'), p_empty) - def test_append_raise(self): with ensure_clean_store(self.path) as store: @@ -2143,24 +1978,6 @@ def test_table_mixed_dtypes(self): store.append('df1_mixed', df) tm.assert_frame_equal(store.select('df1_mixed'), df) - with catch_warnings(record=True): - - # panel - wp = tm.makePanel() - wp['obj1'] = 'foo' - wp['obj2'] = 'bar' - wp['bool1'] = wp['ItemA'] > 0 - wp['bool2'] = wp['ItemB'] > 0 - wp['int1'] = 1 - wp['int2'] = 2 - wp = wp._consolidate() - - with catch_warnings(record=True): - - with ensure_clean_store(self.path) as store: - store.append('p1_mixed', wp) - assert_panel_equal(store.select('p1_mixed'), wp) - def test_unimplemented_dtypes_table_columns(self): with ensure_clean_store(self.path) as store: @@ -2308,193 +2125,6 @@ def test_remove(self): del store['b'] assert len(store) == 0 - def test_remove_where(self): - - with ensure_clean_store(self.path) as store: - - with catch_warnings(record=True): - - # non-existance - crit1 = 'index>foo' - pytest.raises(KeyError, store.remove, 'a', [crit1]) - - # try to remove non-table (with crit) - # non-table ok (where = None) - wp = tm.makePanel(30) - store.put('wp', wp, format='table') - store.remove('wp', ["minor_axis=['A', 'D']"]) - rs = store.select('wp') - expected = wp.reindex(minor_axis=['B', 'C']) - assert_panel_equal(rs, expected) - - # empty where - _maybe_remove(store, 'wp') - store.put('wp', wp, format='table') - - # deleted number (entire table) - n = store.remove('wp', []) - assert n == 120 - - # non - empty where - _maybe_remove(store, 'wp') - store.put('wp', wp, format='table') - pytest.raises(ValueError, store.remove, - 'wp', ['foo']) - - def test_remove_startstop(self): - # GH #4835 and #6177 - - with ensure_clean_store(self.path) as store: - - with catch_warnings(record=True): - wp = tm.makePanel(30) - - # start - _maybe_remove(store, 'wp1') - store.put('wp1', wp, format='t') - n = store.remove('wp1', start=32) - assert n == 120 - 32 - result = store.select('wp1') - expected = wp.reindex(major_axis=wp.major_axis[:32 // 4]) - assert_panel_equal(result, expected) - - _maybe_remove(store, 'wp2') - store.put('wp2', wp, format='t') - n = store.remove('wp2', start=-32) - assert n == 32 - result = store.select('wp2') - expected = wp.reindex(major_axis=wp.major_axis[:-32 // 4]) - assert_panel_equal(result, expected) - - # stop - _maybe_remove(store, 'wp3') - store.put('wp3', wp, format='t') - n = store.remove('wp3', stop=32) - assert n == 32 - result = store.select('wp3') - expected = wp.reindex(major_axis=wp.major_axis[32 // 4:]) - assert_panel_equal(result, expected) - - _maybe_remove(store, 'wp4') - store.put('wp4', wp, format='t') - n = store.remove('wp4', stop=-32) - assert n == 120 - 32 - result = store.select('wp4') - expected = wp.reindex(major_axis=wp.major_axis[-32 // 4:]) - assert_panel_equal(result, expected) - - # start n stop - _maybe_remove(store, 'wp5') - store.put('wp5', wp, format='t') - n = store.remove('wp5', start=16, stop=-16) - assert n == 120 - 32 - result = store.select('wp5') - expected = wp.reindex( - major_axis=(wp.major_axis[:16 // 4] - .union(wp.major_axis[-16 // 4:]))) - assert_panel_equal(result, expected) - - _maybe_remove(store, 'wp6') - store.put('wp6', wp, format='t') - n = store.remove('wp6', start=16, stop=16) - assert n == 0 - result = store.select('wp6') - expected = wp.reindex(major_axis=wp.major_axis) - assert_panel_equal(result, expected) - - # with where - _maybe_remove(store, 'wp7') - - # TODO: unused? - date = wp.major_axis.take(np.arange(0, 30, 3)) # noqa - - crit = 'major_axis=date' - store.put('wp7', wp, format='t') - n = store.remove('wp7', where=[crit], stop=80) - assert n == 28 - result = store.select('wp7') - expected = wp.reindex(major_axis=wp.major_axis.difference( - wp.major_axis[np.arange(0, 20, 3)])) - assert_panel_equal(result, expected) - - def test_remove_crit(self): - - with ensure_clean_store(self.path) as store: - - with catch_warnings(record=True): - wp = tm.makePanel(30) - - # group row removal - _maybe_remove(store, 'wp3') - date4 = wp.major_axis.take([0, 1, 2, 4, 5, 6, 8, 9, 10]) - crit4 = 'major_axis=date4' - store.put('wp3', wp, format='t') - n = store.remove('wp3', where=[crit4]) - assert n == 36 - - result = store.select('wp3') - expected = wp.reindex( - major_axis=wp.major_axis.difference(date4)) - assert_panel_equal(result, expected) - - # upper half - _maybe_remove(store, 'wp') - store.put('wp', wp, format='table') - date = wp.major_axis[len(wp.major_axis) // 2] - - crit1 = 'major_axis>date' - crit2 = "minor_axis=['A', 'D']" - n = store.remove('wp', where=[crit1]) - assert n == 56 - - n = store.remove('wp', where=[crit2]) - assert n == 32 - - result = store['wp'] - expected = wp.truncate(after=date).reindex(minor=['B', 'C']) - assert_panel_equal(result, expected) - - # individual row elements - _maybe_remove(store, 'wp2') - store.put('wp2', wp, format='table') - - date1 = wp.major_axis[1:3] - crit1 = 'major_axis=date1' - store.remove('wp2', where=[crit1]) - result = store.select('wp2') - expected = wp.reindex( - major_axis=wp.major_axis.difference(date1)) - assert_panel_equal(result, expected) - - date2 = wp.major_axis[5] - crit2 = 'major_axis=date2' - store.remove('wp2', where=[crit2]) - result = store['wp2'] - expected = wp.reindex( - major_axis=(wp.major_axis - .difference(date1) - .difference(Index([date2])) - )) - assert_panel_equal(result, expected) - - date3 = [wp.major_axis[7], wp.major_axis[9]] - crit3 = 'major_axis=date3' - store.remove('wp2', where=[crit3]) - result = store['wp2'] - expected = wp.reindex(major_axis=wp.major_axis - .difference(date1) - .difference(Index([date2])) - .difference(Index(date3))) - assert_panel_equal(result, expected) - - # corners - _maybe_remove(store, 'wp4') - store.put('wp4', wp, format='table') - n = store.remove( - 'wp4', where="major_axis>wp.major_axis[-1]") - result = store.select('wp4') - assert_panel_equal(result, wp) - def test_invalid_terms(self): with ensure_clean_store(self.path) as store: @@ -2504,27 +2134,16 @@ def test_invalid_terms(self): df = tm.makeTimeDataFrame() df['string'] = 'foo' df.loc[0:4, 'string'] = 'bar' - wp = tm.makePanel() store.put('df', df, format='table') - store.put('wp', wp, format='table') # some invalid terms - pytest.raises(ValueError, store.select, - 'wp', "minor=['A', 'B']") - pytest.raises(ValueError, store.select, - 'wp', ["index=['20121114']"]) - pytest.raises(ValueError, store.select, 'wp', [ - "index=['20121114', '20121114']"]) pytest.raises(TypeError, Term) # more invalid pytest.raises( ValueError, store.select, 'df', 'df.index[3]') pytest.raises(SyntaxError, store.select, 'df', 'index>') - pytest.raises( - ValueError, store.select, 'wp', - "major_axis<'20000108' & minor_axis['A', 'B']") # from the docs with ensure_clean_path(self.path) as path: @@ -2546,127 +2165,6 @@ def test_invalid_terms(self): pytest.raises(ValueError, read_hdf, path, 'dfq', where="A>0 or C>0") - def test_terms(self): - - with ensure_clean_store(self.path) as store: - - with catch_warnings(record=True): - simplefilter("ignore", FutureWarning) - - wp = tm.makePanel() - wpneg = Panel.fromDict({-1: tm.makeDataFrame(), - 0: tm.makeDataFrame(), - 1: tm.makeDataFrame()}) - - store.put('wp', wp, format='table') - store.put('wpneg', wpneg, format='table') - - # panel - result = store.select( - 'wp', - "major_axis<'20000108' and minor_axis=['A', 'B']") - expected = wp.truncate( - after='20000108').reindex(minor=['A', 'B']) - assert_panel_equal(result, expected) - - # with deprecation - result = store.select( - 'wp', where=("major_axis<'20000108' " - "and minor_axis=['A', 'B']")) - expected = wp.truncate( - after='20000108').reindex(minor=['A', 'B']) - tm.assert_panel_equal(result, expected) - - with catch_warnings(record=True): - - # valid terms - terms = [('major_axis=20121114'), - ('major_axis>20121114'), - (("major_axis=['20121114', '20121114']"),), - ('major_axis=datetime.datetime(2012, 11, 14)'), - 'major_axis> 20121114', - 'major_axis >20121114', - 'major_axis > 20121114', - (("minor_axis=['A', 'B']"),), - (("minor_axis=['A', 'B']"),), - ((("minor_axis==['A', 'B']"),),), - (("items=['ItemA', 'ItemB']"),), - ('items=ItemA'), - ] - - for t in terms: - store.select('wp', t) - - with pytest.raises(TypeError, - match='Only named functions are supported'): - store.select( - 'wp', - 'major_axis == (lambda x: x)("20130101")') - - with catch_warnings(record=True): - # check USub node parsing - res = store.select('wpneg', 'items == -1') - expected = Panel({-1: wpneg[-1]}) - tm.assert_panel_equal(res, expected) - - msg = 'Unary addition not supported' - with pytest.raises(NotImplementedError, match=msg): - store.select('wpneg', 'items == +1') - - def test_term_compat(self): - with ensure_clean_store(self.path) as store: - - with catch_warnings(record=True): - wp = Panel(np.random.randn(2, 5, 4), items=['Item1', 'Item2'], - major_axis=date_range('1/1/2000', periods=5), - minor_axis=['A', 'B', 'C', 'D']) - store.append('wp', wp) - - result = store.select( - 'wp', where=("major_axis>20000102 " - "and minor_axis=['A', 'B']")) - expected = wp.loc[:, wp.major_axis > - Timestamp('20000102'), ['A', 'B']] - assert_panel_equal(result, expected) - - store.remove('wp', 'major_axis>20000103') - result = store.select('wp') - expected = wp.loc[:, wp.major_axis <= Timestamp('20000103'), :] - assert_panel_equal(result, expected) - - with ensure_clean_store(self.path) as store: - - with catch_warnings(record=True): - wp = Panel(np.random.randn(2, 5, 4), - items=['Item1', 'Item2'], - major_axis=date_range('1/1/2000', periods=5), - minor_axis=['A', 'B', 'C', 'D']) - store.append('wp', wp) - - # stringified datetimes - result = store.select( - 'wp', 'major_axis>datetime.datetime(2000, 1, 2)') - expected = wp.loc[:, wp.major_axis > Timestamp('20000102')] - assert_panel_equal(result, expected) - - result = store.select( - 'wp', 'major_axis>datetime.datetime(2000, 1, 2)') - expected = wp.loc[:, wp.major_axis > Timestamp('20000102')] - assert_panel_equal(result, expected) - - result = store.select( - 'wp', - "major_axis=[datetime.datetime(2000, 1, 2, 0, 0), " - "datetime.datetime(2000, 1, 3, 0, 0)]") - expected = wp.loc[:, [Timestamp('20000102'), - Timestamp('20000103')]] - assert_panel_equal(result, expected) - - result = store.select( - 'wp', "minor_axis=['A', 'B']") - expected = wp.loc[:, :, ['A', 'B']] - assert_panel_equal(result, expected) - def test_same_name_scoping(self): with ensure_clean_store(self.path) as store: @@ -2982,12 +2480,6 @@ def _make_one(): self._check_roundtrip(df1['int1'], tm.assert_series_equal, compression=compression) - def test_wide(self): - - with catch_warnings(record=True): - wp = tm.makePanel() - self._check_roundtrip(wp, assert_panel_equal) - @pytest.mark.filterwarnings( "ignore:\\nduplicate:pandas.io.pytables.DuplicateWarning" ) @@ -3050,29 +2542,6 @@ def test_select_with_dups(self): result = store.select('df', columns=['B', 'A']) assert_frame_equal(result, expected, by_blocks=True) - @pytest.mark.filterwarnings( - "ignore:\\nduplicate:pandas.io.pytables.DuplicateWarning" - ) - def test_wide_table_dups(self): - with ensure_clean_store(self.path) as store: - with catch_warnings(record=True): - - wp = tm.makePanel() - store.put('panel', wp, format='table') - store.put('panel', wp, format='table', append=True) - - recons = store['panel'] - - assert_panel_equal(recons, wp) - - def test_long(self): - def _check(left, right): - assert_panel_equal(left.to_panel(), right.to_panel()) - - with catch_warnings(record=True): - wp = tm.makePanel() - self._check_roundtrip(wp.to_frame(), _check) - def test_overwrite_node(self): with ensure_clean_store(self.path) as store: @@ -3119,34 +2588,6 @@ def test_select(self): with ensure_clean_store(self.path) as store: with catch_warnings(record=True): - wp = tm.makePanel() - - # put/select ok - _maybe_remove(store, 'wp') - store.put('wp', wp, format='table') - store.select('wp') - - # non-table ok (where = None) - _maybe_remove(store, 'wp') - store.put('wp2', wp) - store.select('wp2') - - # selection on the non-indexable with a large number of columns - wp = Panel(np.random.randn(100, 100, 100), - items=['Item%03d' % i for i in range(100)], - major_axis=date_range('1/1/2000', periods=100), - minor_axis=['E%03d' % i for i in range(100)]) - - _maybe_remove(store, 'wp') - store.append('wp', wp) - items = ['Item%03d' % i for i in range(80)] - result = store.select('wp', 'items=items') - expected = wp.reindex(items=items) - assert_panel_equal(expected, result) - - # selectin non-table with a where - # pytest.raises(ValueError, store.select, - # 'wp2', ('column', ['A', 'D'])) # select with columns= df = tm.makeTimeDataFrame() @@ -3675,31 +3116,6 @@ def test_retain_index_attributes2(self): assert read_hdf(path, 'data').index.name is None - def test_panel_select(self): - - with ensure_clean_store(self.path) as store: - - with catch_warnings(record=True): - - wp = tm.makePanel() - - store.put('wp', wp, format='table') - date = wp.major_axis[len(wp.major_axis) // 2] - - crit1 = ('major_axis>=date') - crit2 = ("minor_axis=['A', 'D']") - - result = store.select('wp', [crit1, crit2]) - expected = wp.truncate(before=date).reindex(minor=['A', 'D']) - assert_panel_equal(result, expected) - - result = store.select( - 'wp', ['major_axis>="20000124"', - ("minor_axis=['A', 'B']")]) - expected = wp.truncate( - before='20000124').reindex(minor=['A', 'B']) - assert_panel_equal(result, expected) - def test_frame_select(self): df = tm.makeTimeDataFrame() @@ -4540,7 +3956,7 @@ def test_pytables_native2_read(self, datapath): def test_legacy_table_fixed_format_read_py2(self, datapath): # GH 24510 - # legacy table with fixed format written en Python 2 + # legacy table with fixed format written in Python 2 with ensure_clean_store( datapath('io', 'data', 'legacy_hdf', 'legacy_table_fixed_py2.h5'), @@ -4552,29 +3968,20 @@ def test_legacy_table_fixed_format_read_py2(self, datapath): name='INDEX_NAME')) assert_frame_equal(expected, result) - def test_legacy_table_read(self, datapath): - # legacy table types + def test_legacy_table_read_py2(self, datapath): + # issue: 24925 + # legacy table written in Python 2 with ensure_clean_store( - datapath('io', 'data', 'legacy_hdf', 'legacy_table.h5'), + datapath('io', 'data', 'legacy_hdf', + 'legacy_table_py2.h5'), mode='r') as store: + result = store.select('table') - with catch_warnings(): - simplefilter("ignore", pd.io.pytables.IncompatibilityWarning) - store.select('df1') - store.select('df2') - store.select('wp1') - - # force the frame - store.select('df2', typ='legacy_frame') - - # old version warning - pytest.raises( - Exception, store.select, 'wp1', 'minor_axis=B') - - df2 = store.select('df2') - result = store.select('df2', 'index>df2.index[2]') - expected = df2[df2.index > df2.index[2]] - assert_frame_equal(expected, result) + expected = pd.DataFrame({ + "a": ["a", "b"], + "b": [2, 3] + }) + assert_frame_equal(expected, result) def test_copy(self): @@ -5308,35 +4715,30 @@ def test_complex_mixed_table(self): reread = read_hdf(path, 'df') assert_frame_equal(df, reread) - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") def test_complex_across_dimensions_fixed(self): with catch_warnings(record=True): complex128 = np.array( [1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j]) s = Series(complex128, index=list('abcd')) df = DataFrame({'A': s, 'B': s}) - p = Panel({'One': df, 'Two': df}) - objs = [s, df, p] - comps = [tm.assert_series_equal, tm.assert_frame_equal, - tm.assert_panel_equal] + objs = [s, df] + comps = [tm.assert_series_equal, tm.assert_frame_equal] for obj, comp in zip(objs, comps): with ensure_clean_path(self.path) as path: obj.to_hdf(path, 'obj', format='fixed') reread = read_hdf(path, 'obj') comp(obj, reread) - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") def test_complex_across_dimensions(self): complex128 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j]) s = Series(complex128, index=list('abcd')) df = DataFrame({'A': s, 'B': s}) with catch_warnings(record=True): - p = Panel({'One': df, 'Two': df}) - objs = [df, p] - comps = [tm.assert_frame_equal, tm.assert_panel_equal] + objs = [df] + comps = [tm.assert_frame_equal] for obj, comp in zip(objs, comps): with ensure_clean_path(self.path) as path: obj.to_hdf(path, 'obj', format='table') diff --git a/pandas/tests/io/test_sql.py b/pandas/tests/io/test_sql.py index 75a6d8d009083..9d0bce3b342b4 100644 --- a/pandas/tests/io/test_sql.py +++ b/pandas/tests/io/test_sql.py @@ -605,12 +605,6 @@ def test_to_sql_series(self): s2 = sql.read_sql_query("SELECT * FROM test_series", self.conn) tm.assert_frame_equal(s.to_frame(), s2) - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") - def test_to_sql_panel(self): - panel = tm.makePanel() - pytest.raises(NotImplementedError, sql.to_sql, panel, - 'test_panel', self.conn) - def test_roundtrip(self): sql.to_sql(self.test_frame1, 'test_frame_roundtrip', con=self.conn) diff --git a/pandas/tests/plotting/test_frame.py b/pandas/tests/plotting/test_frame.py index 0e7672f4e2f9d..98b241f5c8206 100644 --- a/pandas/tests/plotting/test_frame.py +++ b/pandas/tests/plotting/test_frame.py @@ -2988,22 +2988,6 @@ def test_secondary_axis_font_size(self, method): self._check_ticks_props(axes=ax.right_ax, ylabelsize=fontsize) - def test_misc_bindings(self, monkeypatch): - df = pd.DataFrame(randn(10, 10), columns=list('abcdefghij')) - monkeypatch.setattr('pandas.plotting._misc.scatter_matrix', - lambda x: 2) - monkeypatch.setattr('pandas.plotting._misc.andrews_curves', - lambda x, y: 2) - monkeypatch.setattr('pandas.plotting._misc.parallel_coordinates', - lambda x, y: 2) - monkeypatch.setattr('pandas.plotting._misc.radviz', - lambda x, y: 2) - - assert df.plot.scatter_matrix() == 2 - assert df.plot.andrews_curves('a') == 2 - assert df.plot.parallel_coordinates('a') == 2 - assert df.plot.radviz('a') == 2 - def _generate_4_axes_via_gridspec(): import matplotlib.pyplot as plt diff --git a/pandas/tests/plotting/test_series.py b/pandas/tests/plotting/test_series.py index 1e223c20f55b7..07a4b168a66f1 100644 --- a/pandas/tests/plotting/test_series.py +++ b/pandas/tests/plotting/test_series.py @@ -878,19 +878,6 @@ def test_custom_business_day_freq(self): _check_plot_works(s.plot) - def test_misc_bindings(self, monkeypatch): - s = Series(randn(10)) - monkeypatch.setattr('pandas.plotting._misc.lag_plot', - lambda x: 2) - monkeypatch.setattr('pandas.plotting._misc.autocorrelation_plot', - lambda x: 2) - monkeypatch.setattr('pandas.plotting._misc.bootstrap_plot', - lambda x: 2) - - assert s.plot.lag() == 2 - assert s.plot.autocorrelation() == 2 - assert s.plot.bootstrap() == 2 - @pytest.mark.xfail def test_plot_accessor_updates_on_inplace(self): s = Series([1, 2, 3, 4]) diff --git a/pandas/tests/resample/test_base.py b/pandas/tests/resample/test_base.py index 911cd990ab881..48debfa2848e7 100644 --- a/pandas/tests/resample/test_base.py +++ b/pandas/tests/resample/test_base.py @@ -95,7 +95,10 @@ def test_resample_interpolate_all_ts(frame): def test_raises_on_non_datetimelike_index(): # this is a non datetimelike index xp = DataFrame() - pytest.raises(TypeError, lambda: xp.resample('A').mean()) + msg = ("Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex," + " but got an instance of 'Index'") + with pytest.raises(TypeError, match=msg): + xp.resample('A').mean() @pytest.mark.parametrize('freq', ['M', 'D', 'H']) @@ -189,8 +192,10 @@ def test_resample_loffset_arg_type_all_ts(frame, create_index): # GH 13022, 7687 - TODO: fix resample w/ TimedeltaIndex if isinstance(expected.index, TimedeltaIndex): - with pytest.raises(AssertionError): + msg = "DataFrame are different" + with pytest.raises(AssertionError, match=msg): assert_frame_equal(result_agg, expected) + with pytest.raises(AssertionError, match=msg): assert_frame_equal(result_how, expected) else: assert_frame_equal(result_agg, expected) diff --git a/pandas/tests/resample/test_datetime_index.py b/pandas/tests/resample/test_datetime_index.py index 73995cbe79ecd..ceccb48194f85 100644 --- a/pandas/tests/resample/test_datetime_index.py +++ b/pandas/tests/resample/test_datetime_index.py @@ -1,6 +1,5 @@ from datetime import datetime, timedelta from functools import partial -from warnings import catch_warnings, simplefilter import numpy as np import pytest @@ -10,7 +9,7 @@ from pandas.errors import UnsupportedFunctionCall import pandas as pd -from pandas import DataFrame, Panel, Series, Timedelta, Timestamp, isna, notna +from pandas import DataFrame, Series, Timedelta, Timestamp, isna, notna from pandas.core.indexes.datetimes import date_range from pandas.core.indexes.period import Period, period_range from pandas.core.resample import ( @@ -113,16 +112,18 @@ def test_resample_basic_grouper(series): @pytest.mark.parametrize( '_index_start,_index_end,_index_name', [('1/1/2000 00:00:00', '1/1/2000 00:13:00', 'index')]) -@pytest.mark.parametrize('kwargs', [ - dict(label='righttt'), - dict(closed='righttt'), - dict(convention='starttt') +@pytest.mark.parametrize('keyword,value', [ + ('label', 'righttt'), + ('closed', 'righttt'), + ('convention', 'starttt') ]) -def test_resample_string_kwargs(series, kwargs): +def test_resample_string_kwargs(series, keyword, value): # see gh-19303 # Check that wrong keyword argument strings raise an error - with pytest.raises(ValueError, match='Unsupported value'): - series.resample('5min', **kwargs) + msg = "Unsupported value {value} for `{keyword}`".format( + value=value, keyword=keyword) + with pytest.raises(ValueError, match=msg): + series.resample('5min', **({keyword: value})) @pytest.mark.parametrize( @@ -676,7 +677,7 @@ def test_asfreq_non_unique(): ts = Series(np.random.randn(len(rng2)), index=rng2) msg = 'cannot reindex from a duplicate axis' - with pytest.raises(Exception, match=msg): + with pytest.raises(ValueError, match=msg): ts.asfreq('B') @@ -690,56 +691,6 @@ def test_resample_axis1(): tm.assert_frame_equal(result, expected) -def test_resample_panel(): - rng = date_range('1/1/2000', '6/30/2000') - n = len(rng) - - with catch_warnings(record=True): - simplefilter("ignore", FutureWarning) - panel = Panel(np.random.randn(3, n, 5), - items=['one', 'two', 'three'], - major_axis=rng, - minor_axis=['a', 'b', 'c', 'd', 'e']) - - result = panel.resample('M', axis=1).mean() - - def p_apply(panel, f): - result = {} - for item in panel.items: - result[item] = f(panel[item]) - return Panel(result, items=panel.items) - - expected = p_apply(panel, lambda x: x.resample('M').mean()) - tm.assert_panel_equal(result, expected) - - panel2 = panel.swapaxes(1, 2) - result = panel2.resample('M', axis=2).mean() - expected = p_apply(panel2, - lambda x: x.resample('M', axis=1).mean()) - tm.assert_panel_equal(result, expected) - - -@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") -def test_resample_panel_numpy(): - rng = date_range('1/1/2000', '6/30/2000') - n = len(rng) - - with catch_warnings(record=True): - panel = Panel(np.random.randn(3, n, 5), - items=['one', 'two', 'three'], - major_axis=rng, - minor_axis=['a', 'b', 'c', 'd', 'e']) - - result = panel.resample('M', axis=1).apply(lambda x: x.mean(1)) - expected = panel.resample('M', axis=1).mean() - tm.assert_panel_equal(result, expected) - - panel = panel.swapaxes(1, 2) - result = panel.resample('M', axis=2).apply(lambda x: x.mean(2)) - expected = panel.resample('M', axis=2).mean() - tm.assert_panel_equal(result, expected) - - def test_resample_anchored_ticks(): # If a fixed delta (5 minute, 4 hour) evenly divides a day, we should # "anchor" the origin at midnight so we get regular intervals rather @@ -1276,6 +1227,21 @@ def test_resample_across_dst(): assert_frame_equal(result, expected) +def test_groupby_with_dst_time_change(): + # GH 24972 + index = pd.DatetimeIndex([1478064900001000000, 1480037118776792000], + tz='UTC').tz_convert('America/Chicago') + + df = pd.DataFrame([1, 2], index=index) + result = df.groupby(pd.Grouper(freq='1d')).last() + expected_index_values = pd.date_range('2016-11-02', '2016-11-24', + freq='d', tz='America/Chicago') + + index = pd.DatetimeIndex(expected_index_values) + expected = pd.DataFrame([1.0] + ([np.nan] * 21) + [2.0], index=index) + assert_frame_equal(result, expected) + + def test_resample_dst_anchor(): # 5172 dti = DatetimeIndex([datetime(2012, 11, 4, 23)], tz='US/Eastern') diff --git a/pandas/tests/resample/test_period_index.py b/pandas/tests/resample/test_period_index.py index c2fbb5bbb088c..8abdf9034527b 100644 --- a/pandas/tests/resample/test_period_index.py +++ b/pandas/tests/resample/test_period_index.py @@ -11,6 +11,7 @@ import pandas as pd from pandas import DataFrame, Series, Timestamp +from pandas.core.indexes.base import InvalidIndexError from pandas.core.indexes.datetimes import date_range from pandas.core.indexes.period import Period, PeriodIndex, period_range from pandas.core.resample import _get_period_range_edges @@ -72,17 +73,19 @@ def test_asfreq_fill_value(self, series): @pytest.mark.parametrize('freq', ['H', '12H', '2D', 'W']) @pytest.mark.parametrize('kind', [None, 'period', 'timestamp']) - def test_selection(self, index, freq, kind): + @pytest.mark.parametrize('kwargs', [dict(on='date'), dict(level='d')]) + def test_selection(self, index, freq, kind, kwargs): # This is a bug, these should be implemented # GH 14008 rng = np.arange(len(index), dtype=np.int64) df = DataFrame({'date': index, 'a': rng}, index=pd.MultiIndex.from_arrays([rng, index], names=['v', 'd'])) - with pytest.raises(NotImplementedError): - df.resample(freq, on='date', kind=kind) - with pytest.raises(NotImplementedError): - df.resample(freq, level='d', kind=kind) + msg = ("Resampling from level= or on= selection with a PeriodIndex is" + r" not currently supported, use \.set_index\(\.\.\.\) to" + " explicitly set index") + with pytest.raises(NotImplementedError, match=msg): + df.resample(freq, kind=kind, **kwargs) @pytest.mark.parametrize('month', MONTHS) @pytest.mark.parametrize('meth', ['ffill', 'bfill']) @@ -110,13 +113,20 @@ def test_basic_downsample(self, simple_period_range_series): assert_series_equal(ts.resample('a-dec').mean(), result) assert_series_equal(ts.resample('a').mean(), result) - def test_not_subperiod(self, simple_period_range_series): + @pytest.mark.parametrize('rule,expected_error_msg', [ + ('a-dec', ''), + ('q-mar', ''), + ('M', ''), + ('w-thu', '') + ]) + def test_not_subperiod( + self, simple_period_range_series, rule, expected_error_msg): # These are incompatible period rules for resampling ts = simple_period_range_series('1/1/1990', '6/30/1995', freq='w-wed') - pytest.raises(ValueError, lambda: ts.resample('a-dec').mean()) - pytest.raises(ValueError, lambda: ts.resample('q-mar').mean()) - pytest.raises(ValueError, lambda: ts.resample('M').mean()) - pytest.raises(ValueError, lambda: ts.resample('w-thu').mean()) + msg = ("Frequency cannot be resampled to {}, as they" + " are not sub or super periods").format(expected_error_msg) + with pytest.raises(IncompatibleFrequency, match=msg): + ts.resample(rule).mean() @pytest.mark.parametrize('freq', ['D', '2D']) def test_basic_upsample(self, freq, simple_period_range_series): @@ -212,8 +222,9 @@ def test_resample_same_freq(self, resample_method): assert_series_equal(result, expected) def test_resample_incompat_freq(self): - - with pytest.raises(IncompatibleFrequency): + msg = ("Frequency cannot be resampled to ," + " as they are not sub or super periods") + with pytest.raises(IncompatibleFrequency, match=msg): Series(range(3), index=pd.period_range( start='2000', periods=3, freq='M')).resample('W').mean() @@ -373,7 +384,9 @@ def test_resample_fill_missing(self): def test_cant_fill_missing_dups(self): rng = PeriodIndex([2000, 2005, 2005, 2007, 2007], freq='A') s = Series(np.random.randn(5), index=rng) - pytest.raises(Exception, lambda: s.resample('A').ffill()) + msg = "Reindexing only valid with uniquely valued Index objects" + with pytest.raises(InvalidIndexError, match=msg): + s.resample('A').ffill() @pytest.mark.parametrize('freq', ['5min']) @pytest.mark.parametrize('kind', ['period', None, 'timestamp']) diff --git a/pandas/tests/resample/test_resample_api.py b/pandas/tests/resample/test_resample_api.py index 69684daf05f3d..69acf4ba6bde8 100644 --- a/pandas/tests/resample/test_resample_api.py +++ b/pandas/tests/resample/test_resample_api.py @@ -1,11 +1,12 @@ # pylint: disable=E1101 +from collections import OrderedDict from datetime import datetime import numpy as np import pytest -from pandas.compat import OrderedDict, range +from pandas.compat import range import pandas as pd from pandas import DataFrame, Series @@ -113,16 +114,14 @@ def test_getitem(): test_frame.columns[[0, 1]]) -def test_select_bad_cols(): - +@pytest.mark.parametrize('key', [['D'], ['A', 'D']]) +def test_select_bad_cols(key): g = test_frame.resample('H') - pytest.raises(KeyError, g.__getitem__, ['D']) - - pytest.raises(KeyError, g.__getitem__, ['A', 'D']) - with pytest.raises(KeyError, match='^[^A]+$'): - # A should not be referenced as a bad column... - # will have to rethink regex if you change message! - g[['A', 'D']] + # 'A' should not be referenced as a bad column... + # will have to rethink regex if you change message! + msg = r"^\"Columns not found: 'D'\"$" + with pytest.raises(KeyError, match=msg): + g[key] def test_attribute_access(): @@ -216,7 +215,9 @@ def test_fillna(): result = r.fillna(method='bfill') assert_series_equal(result, expected) - with pytest.raises(ValueError): + msg = (r"Invalid fill method\. Expecting pad \(ffill\), backfill" + r" \(bfill\) or nearest\. Got 0") + with pytest.raises(ValueError, match=msg): r.fillna(0) @@ -437,12 +438,11 @@ def test_agg_misc(): # errors # invalid names in the agg specification + msg = "\"Column 'B' does not exist!\"" for t in cases: - with pytest.raises(KeyError): - with tm.assert_produces_warning(FutureWarning, - check_stacklevel=False): - t[['A']].agg({'A': ['sum', 'std'], - 'B': ['mean', 'std']}) + with pytest.raises(KeyError, match=msg): + t[['A']].agg({'A': ['sum', 'std'], + 'B': ['mean', 'std']}) def test_agg_nested_dicts(): @@ -464,11 +464,11 @@ def test_agg_nested_dicts(): df.groupby(pd.Grouper(freq='2D')) ] + msg = r"cannot perform renaming for r(1|2) with a nested dictionary" for t in cases: - def f(): + with pytest.raises(pd.core.base.SpecificationError, match=msg): t.aggregate({'r1': {'A': ['mean', 'sum']}, 'r2': {'B': ['mean', 'sum']}}) - pytest.raises(ValueError, f) for t in cases: expected = pd.concat([t['A'].mean(), t['A'].std(), t['B'].mean(), @@ -499,7 +499,8 @@ def test_try_aggregate_non_existing_column(): df = DataFrame(data).set_index('dt') # Error as we don't have 'z' column - with pytest.raises(KeyError): + msg = "\"Column 'z' does not exist!\"" + with pytest.raises(KeyError, match=msg): df.resample('30T').agg({'x': ['mean'], 'y': ['median'], 'z': ['sum']}) @@ -517,23 +518,29 @@ def test_selection_api_validation(): df_exp = DataFrame({'a': rng}, index=index) # non DatetimeIndex - with pytest.raises(TypeError): + msg = ("Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex," + " but got an instance of 'Int64Index'") + with pytest.raises(TypeError, match=msg): df.resample('2D', level='v') - with pytest.raises(ValueError): + msg = "The Grouper cannot specify both a key and a level!" + with pytest.raises(ValueError, match=msg): df.resample('2D', on='date', level='d') - with pytest.raises(TypeError): + msg = "unhashable type: 'list'" + with pytest.raises(TypeError, match=msg): df.resample('2D', on=['a', 'date']) - with pytest.raises(KeyError): + msg = r"\"Level \['a', 'date'\] not found\"" + with pytest.raises(KeyError, match=msg): df.resample('2D', level=['a', 'date']) # upsampling not allowed - with pytest.raises(ValueError): + msg = ("Upsampling from level= or on= selection is not supported, use" + r" \.set_index\(\.\.\.\) to explicitly set index to datetime-like") + with pytest.raises(ValueError, match=msg): df.resample('2D', level='d').asfreq() - - with pytest.raises(ValueError): + with pytest.raises(ValueError, match=msg): df.resample('2D', on='date').asfreq() exp = df_exp.resample('2D').sum() diff --git a/pandas/tests/resample/test_time_grouper.py b/pandas/tests/resample/test_time_grouper.py index ec29b55ac9d67..2f330d1f2484b 100644 --- a/pandas/tests/resample/test_time_grouper.py +++ b/pandas/tests/resample/test_time_grouper.py @@ -5,7 +5,7 @@ import pytest import pandas as pd -from pandas import DataFrame, Panel, Series +from pandas import DataFrame, Series from pandas.core.indexes.datetimes import date_range from pandas.core.resample import TimeGrouper import pandas.util.testing as tm @@ -79,27 +79,6 @@ def f(df): tm.assert_index_equal(result.index, df.index) -@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") -def test_panel_aggregation(): - ind = pd.date_range('1/1/2000', periods=100) - data = np.random.randn(2, len(ind), 4) - - wp = Panel(data, items=['Item1', 'Item2'], major_axis=ind, - minor_axis=['A', 'B', 'C', 'D']) - - tg = TimeGrouper('M', axis=1) - _, grouper, _ = tg._get_grouper(wp) - bingrouped = wp.groupby(grouper) - binagg = bingrouped.mean() - - def f(x): - assert (isinstance(x, Panel)) - return x.mean(1) - - result = bingrouped.agg(f) - tm.assert_panel_equal(result, binagg) - - @pytest.mark.parametrize('name, func', [ ('Int64Index', tm.makeIntIndex), ('Index', tm.makeUnicodeIndex), @@ -112,7 +91,7 @@ def test_fails_on_no_datetime_index(name, func): df = DataFrame({'a': np.random.randn(n)}, index=index) msg = ("Only valid with DatetimeIndex, TimedeltaIndex " - "or PeriodIndex, but got an instance of %r" % name) + "or PeriodIndex, but got an instance of '{}'".format(name)) with pytest.raises(TypeError, match=msg): df.groupby(TimeGrouper('D')) diff --git a/pandas/tests/reshape/merge/test_join.py b/pandas/tests/reshape/merge/test_join.py index e21f9d0291afa..5d7a9ab6f4cf0 100644 --- a/pandas/tests/reshape/merge/test_join.py +++ b/pandas/tests/reshape/merge/test_join.py @@ -1,7 +1,5 @@ # pylint: disable=E1103 -from warnings import catch_warnings - import numpy as np from numpy.random import randn import pytest @@ -657,95 +655,6 @@ def test_join_dups(self): 'y_y', 'x_x', 'y_x', 'x_y', 'y_y'] assert_frame_equal(dta, expected) - def test_panel_join(self): - with catch_warnings(record=True): - panel = tm.makePanel() - tm.add_nans(panel) - - p1 = panel.iloc[:2, :10, :3] - p2 = panel.iloc[2:, 5:, 2:] - - # left join - result = p1.join(p2) - expected = p1.copy() - expected['ItemC'] = p2['ItemC'] - tm.assert_panel_equal(result, expected) - - # right join - result = p1.join(p2, how='right') - expected = p2.copy() - expected['ItemA'] = p1['ItemA'] - expected['ItemB'] = p1['ItemB'] - expected = expected.reindex(items=['ItemA', 'ItemB', 'ItemC']) - tm.assert_panel_equal(result, expected) - - # inner join - result = p1.join(p2, how='inner') - expected = panel.iloc[:, 5:10, 2:3] - tm.assert_panel_equal(result, expected) - - # outer join - result = p1.join(p2, how='outer') - expected = p1.reindex(major=panel.major_axis, - minor=panel.minor_axis) - expected = expected.join(p2.reindex(major=panel.major_axis, - minor=panel.minor_axis)) - tm.assert_panel_equal(result, expected) - - def test_panel_join_overlap(self): - with catch_warnings(record=True): - panel = tm.makePanel() - tm.add_nans(panel) - - p1 = panel.loc[['ItemA', 'ItemB', 'ItemC']] - p2 = panel.loc[['ItemB', 'ItemC']] - - # Expected index is - # - # ItemA, ItemB_p1, ItemC_p1, ItemB_p2, ItemC_p2 - joined = p1.join(p2, lsuffix='_p1', rsuffix='_p2') - p1_suf = p1.loc[['ItemB', 'ItemC']].add_suffix('_p1') - p2_suf = p2.loc[['ItemB', 'ItemC']].add_suffix('_p2') - no_overlap = panel.loc[['ItemA']] - expected = no_overlap.join(p1_suf.join(p2_suf)) - tm.assert_panel_equal(joined, expected) - - def test_panel_join_many(self): - with catch_warnings(record=True): - tm.K = 10 - panel = tm.makePanel() - tm.K = 4 - - panels = [panel.iloc[:2], panel.iloc[2:6], panel.iloc[6:]] - - joined = panels[0].join(panels[1:]) - tm.assert_panel_equal(joined, panel) - - panels = [panel.iloc[:2, :-5], - panel.iloc[2:6, 2:], - panel.iloc[6:, 5:-7]] - - data_dict = {} - for p in panels: - data_dict.update(p.iteritems()) - - joined = panels[0].join(panels[1:], how='inner') - expected = pd.Panel.from_dict(data_dict, intersect=True) - tm.assert_panel_equal(joined, expected) - - joined = panels[0].join(panels[1:], how='outer') - expected = pd.Panel.from_dict(data_dict, intersect=False) - tm.assert_panel_equal(joined, expected) - - # edge cases - msg = "Suffixes not supported when passing multiple panels" - with pytest.raises(ValueError, match=msg): - panels[0].join(panels[1:], how='outer', lsuffix='foo', - rsuffix='bar') - msg = "Right join not supported with multiple panels" - with pytest.raises(ValueError, match=msg): - panels[0].join(panels[1:], how='right') - def test_join_multi_to_multi(self, join_type): # GH 20475 leftindex = MultiIndex.from_product([list('abc'), list('xy'), [1, 2]], diff --git a/pandas/tests/reshape/merge/test_merge.py b/pandas/tests/reshape/merge/test_merge.py index e123a5171769d..25487ccc76e62 100644 --- a/pandas/tests/reshape/merge/test_merge.py +++ b/pandas/tests/reshape/merge/test_merge.py @@ -616,6 +616,24 @@ def test_merge_on_datetime64tz(self): assert result['value_x'].dtype == 'datetime64[ns, US/Eastern]' assert result['value_y'].dtype == 'datetime64[ns, US/Eastern]' + def test_merge_on_datetime64tz_empty(self): + # https://github.com/pandas-dev/pandas/issues/25014 + dtz = pd.DatetimeTZDtype(tz='UTC') + right = pd.DataFrame({'date': [pd.Timestamp('2018', tz=dtz.tz)], + 'value': [4.0], + 'date2': [pd.Timestamp('2019', tz=dtz.tz)]}, + columns=['date', 'value', 'date2']) + left = right[:0] + result = left.merge(right, on='date') + expected = pd.DataFrame({ + 'value_x': pd.Series(dtype=float), + 'date2_x': pd.Series(dtype=dtz), + 'date': pd.Series(dtype=dtz), + 'value_y': pd.Series(dtype=float), + 'date2_y': pd.Series(dtype=dtz), + }, columns=['value_x', 'date2_x', 'date', 'value_y', 'date2_y']) + tm.assert_frame_equal(result, expected) + def test_merge_datetime64tz_with_dst_transition(self): # GH 18885 df1 = pd.DataFrame(pd.date_range( @@ -939,26 +957,40 @@ def test_merge_two_empty_df_no_division_error(self): with np.errstate(divide='raise'): merge(a, a, on=('a', 'b')) - @pytest.mark.parametrize('how', ['left', 'outer']) + @pytest.mark.parametrize('how', ['right', 'outer']) def test_merge_on_index_with_more_values(self, how): # GH 24212 - # pd.merge gets [-1, -1, 0, 1] as right_indexer, ensure that -1 is - # interpreted as a missing value instead of the last element - df1 = pd.DataFrame([[1, 2], [2, 4], [3, 6], [4, 8]], - columns=['a', 'b']) - df2 = pd.DataFrame([[3, 30], [4, 40]], - columns=['a', 'c']) - df1.set_index('a', drop=False, inplace=True) - df2.set_index('a', inplace=True) - result = pd.merge(df1, df2, left_index=True, right_on='a', how=how) - expected = pd.DataFrame([[1, 2, np.nan], - [2, 4, np.nan], - [3, 6, 30.0], - [4, 8, 40.0]], - columns=['a', 'b', 'c']) - expected.set_index('a', drop=False, inplace=True) + # pd.merge gets [0, 1, 2, -1, -1, -1] as left_indexer, ensure that + # -1 is interpreted as a missing value instead of the last element + df1 = pd.DataFrame({'a': [1, 2, 3], 'key': [0, 2, 2]}) + df2 = pd.DataFrame({'b': [1, 2, 3, 4, 5]}) + result = df1.merge(df2, left_on='key', right_index=True, how=how) + expected = pd.DataFrame([[1.0, 0, 1], + [2.0, 2, 3], + [3.0, 2, 3], + [np.nan, 1, 2], + [np.nan, 3, 4], + [np.nan, 4, 5]], + columns=['a', 'key', 'b']) + expected.set_index(Int64Index([0, 1, 2, 1, 3, 4]), inplace=True) assert_frame_equal(result, expected) + def test_merge_right_index_right(self): + # Note: the expected output here is probably incorrect. + # See https://github.com/pandas-dev/pandas/issues/17257 for more. + # We include this as a regression test for GH-24897. + left = pd.DataFrame({'a': [1, 2, 3], 'key': [0, 1, 1]}) + right = pd.DataFrame({'b': [1, 2, 3]}) + + expected = pd.DataFrame({'a': [1, 2, 3, None], + 'key': [0, 1, 1, 2], + 'b': [1, 2, 2, 3]}, + columns=['a', 'key', 'b'], + index=[0, 1, 2, 2]) + result = left.merge(right, left_on='key', right_index=True, + how='right') + tm.assert_frame_equal(result, expected) + def _check_merge(x, y): for how in ['inner', 'left', 'outer']: @@ -1494,3 +1526,65 @@ def test_merge_series(on, left_on, right_on, left_index, right_index, nm): with pytest.raises(ValueError, match=msg): result = pd.merge(a, b, on=on, left_on=left_on, right_on=right_on, left_index=left_index, right_index=right_index) + + +@pytest.mark.parametrize("col1, col2, kwargs, expected_cols", [ + (0, 0, dict(suffixes=("", "_dup")), ["0", "0_dup"]), + (0, 0, dict(suffixes=(None, "_dup")), [0, "0_dup"]), + (0, 0, dict(suffixes=("_x", "_y")), ["0_x", "0_y"]), + ("a", 0, dict(suffixes=(None, "_y")), ["a", 0]), + (0.0, 0.0, dict(suffixes=("_x", None)), ["0.0_x", 0.0]), + ("b", "b", dict(suffixes=(None, "_y")), ["b", "b_y"]), + ("a", "a", dict(suffixes=("_x", None)), ["a_x", "a"]), + ("a", "b", dict(suffixes=("_x", None)), ["a", "b"]), + ("a", "a", dict(suffixes=[None, "_x"]), ["a", "a_x"]), + (0, 0, dict(suffixes=["_a", None]), ["0_a", 0]), + ("a", "a", dict(), ["a_x", "a_y"]), + (0, 0, dict(), ["0_x", "0_y"]) +]) +def test_merge_suffix(col1, col2, kwargs, expected_cols): + # issue: 24782 + a = pd.DataFrame({col1: [1, 2, 3]}) + b = pd.DataFrame({col2: [4, 5, 6]}) + + expected = pd.DataFrame([[1, 4], [2, 5], [3, 6]], + columns=expected_cols) + + result = a.merge(b, left_index=True, right_index=True, **kwargs) + tm.assert_frame_equal(result, expected) + + result = pd.merge(a, b, left_index=True, right_index=True, **kwargs) + tm.assert_frame_equal(result, expected) + + +@pytest.mark.parametrize("col1, col2, suffixes", [ + ("a", "a", [None, None]), + ("a", "a", (None, None)), + ("a", "a", ("", None)), + (0, 0, [None, None]), + (0, 0, (None, "")) +]) +def test_merge_suffix_error(col1, col2, suffixes): + # issue: 24782 + a = pd.DataFrame({col1: [1, 2, 3]}) + b = pd.DataFrame({col2: [3, 4, 5]}) + + # TODO: might reconsider current raise behaviour, see issue 24782 + msg = "columns overlap but no suffix specified" + with pytest.raises(ValueError, match=msg): + pd.merge(a, b, left_index=True, right_index=True, suffixes=suffixes) + + +@pytest.mark.parametrize("col1, col2, suffixes", [ + ("a", "a", None), + (0, 0, None) +]) +def test_merge_suffix_none_error(col1, col2, suffixes): + # issue: 24782 + a = pd.DataFrame({col1: [1, 2, 3]}) + b = pd.DataFrame({col2: [3, 4, 5]}) + + # TODO: might reconsider current raise behaviour, see GH24782 + msg = "iterable" + with pytest.raises(TypeError, match=msg): + pd.merge(a, b, left_index=True, right_index=True, suffixes=suffixes) diff --git a/pandas/tests/reshape/test_concat.py b/pandas/tests/reshape/test_concat.py index ec6123bae327e..a186d32ed8800 100644 --- a/pandas/tests/reshape/test_concat.py +++ b/pandas/tests/reshape/test_concat.py @@ -3,7 +3,7 @@ from datetime import datetime from decimal import Decimal from itertools import combinations -from warnings import catch_warnings, simplefilter +from warnings import catch_warnings import dateutil import numpy as np @@ -1499,15 +1499,6 @@ def test_concat_mixed_objs(self): result = concat([s1, df, s2], ignore_index=True) assert_frame_equal(result, expected) - # invalid concatente of mixed dims - with catch_warnings(record=True): - simplefilter("ignore", FutureWarning) - panel = tm.makePanel() - msg = ("cannot concatenate unaligned mixed dimensional NDFrame" - " objects") - with pytest.raises(ValueError, match=msg): - concat([panel, s1], axis=1) - def test_empty_dtype_coerce(self): # xref to #12411 @@ -1543,34 +1534,6 @@ def test_dtype_coerceion(self): result = concat([df.iloc[[0]], df.iloc[[1]]]) tm.assert_series_equal(result.dtypes, df.dtypes) - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") - def test_panel_concat_other_axes(self): - panel = tm.makePanel() - - p1 = panel.iloc[:, :5, :] - p2 = panel.iloc[:, 5:, :] - - result = concat([p1, p2], axis=1) - tm.assert_panel_equal(result, panel) - - p1 = panel.iloc[:, :, :2] - p2 = panel.iloc[:, :, 2:] - - result = concat([p1, p2], axis=2) - tm.assert_panel_equal(result, panel) - - # if things are a bit misbehaved - p1 = panel.iloc[:2, :, :2] - p2 = panel.iloc[:, :, 2:] - p1['ItemC'] = 'baz' - - result = concat([p1, p2], axis=2) - - expected = panel.copy() - expected['ItemC'] = expected['ItemC'].astype('O') - expected.loc['ItemC', :, :2] = 'baz' - tm.assert_panel_equal(result, expected) - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") # Panel.rename warning we don't care about @pytest.mark.filterwarnings("ignore:Using:FutureWarning") diff --git a/pandas/tests/reshape/test_reshape.py b/pandas/tests/reshape/test_reshape.py index 7b544b7981c1f..a5b6cffd1d86c 100644 --- a/pandas/tests/reshape/test_reshape.py +++ b/pandas/tests/reshape/test_reshape.py @@ -580,23 +580,28 @@ def test_get_dummies_duplicate_columns(self, df): class TestCategoricalReshape(object): - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") - def test_reshaping_panel_categorical(self): + def test_reshaping_multi_index_categorical(self): - p = tm.makePanel() - p['str'] = 'foo' - df = p.to_frame() + # construct a MultiIndexed DataFrame formerly created + # via `tm.makePanel().to_frame()` + cols = ['ItemA', 'ItemB', 'ItemC'] + data = {c: tm.makeTimeDataFrame() for c in cols} + df = pd.concat({c: data[c].stack() for c in data}, axis='columns') + df.index.names = ['major', 'minor'] + df['str'] = 'foo' + + dti = df.index.levels[0] df['category'] = df['str'].astype('category') result = df['category'].unstack() - c = Categorical(['foo'] * len(p.major_axis)) + c = Categorical(['foo'] * len(dti)) expected = DataFrame({'A': c.copy(), 'B': c.copy(), 'C': c.copy(), 'D': c.copy()}, columns=Index(list('ABCD'), name='minor'), - index=p.major_axis.set_names('major')) + index=dti) tm.assert_frame_equal(result, expected) diff --git a/pandas/tests/scalar/timedelta/test_timedelta.py b/pandas/tests/scalar/timedelta/test_timedelta.py index 9b5fdfb06a9fa..7d5b479810205 100644 --- a/pandas/tests/scalar/timedelta/test_timedelta.py +++ b/pandas/tests/scalar/timedelta/test_timedelta.py @@ -1,5 +1,6 @@ """ test the scalar Timedelta """ from datetime import timedelta +import re import numpy as np import pytest @@ -309,9 +310,15 @@ def test_iso_conversion(self): assert to_timedelta('P0DT0H0M1S') == expected def test_nat_converters(self): - assert to_timedelta('nat', box=False).astype('int64') == iNaT - assert to_timedelta('nan', box=False).astype('int64') == iNaT + result = to_timedelta('nat', box=False) + assert result.dtype.kind == 'm' + assert result.astype('int64') == iNaT + result = to_timedelta('nan', box=False) + assert result.dtype.kind == 'm' + assert result.astype('int64') == iNaT + + @pytest.mark.filterwarnings("ignore:M and Y units are deprecated") @pytest.mark.parametrize('units, np_unit', [(['Y', 'y'], 'Y'), (['M'], 'M'), @@ -371,6 +378,24 @@ def test_unit_parser(self, units, np_unit, wrapper): result = Timedelta('2{}'.format(unit)) assert result == expected + @pytest.mark.skipif(compat.PY2, reason="requires python3.5 or higher") + @pytest.mark.parametrize('unit', ['Y', 'y', 'M']) + def test_unit_m_y_deprecated(self, unit): + with tm.assert_produces_warning(FutureWarning) as w1: + Timedelta(10, unit) + msg = r'.* units are deprecated .*' + assert re.match(msg, str(w1[0].message)) + with tm.assert_produces_warning(FutureWarning, + check_stacklevel=False) as w2: + to_timedelta(10, unit) + msg = r'.* units are deprecated .*' + assert re.match(msg, str(w2[0].message)) + with tm.assert_produces_warning(FutureWarning, + check_stacklevel=False) as w3: + to_timedelta([1, 2], unit) + msg = r'.* units are deprecated .*' + assert re.match(msg, str(w3[0].message)) + def test_numeric_conversions(self): assert Timedelta(0) == np.timedelta64(0, 'ns') assert Timedelta(10) == np.timedelta64(10, 'ns') diff --git a/pandas/tests/scalar/timestamp/test_unary_ops.py b/pandas/tests/scalar/timestamp/test_unary_ops.py index 3f9a30d254126..adcf66200a672 100644 --- a/pandas/tests/scalar/timestamp/test_unary_ops.py +++ b/pandas/tests/scalar/timestamp/test_unary_ops.py @@ -8,7 +8,7 @@ from pandas._libs.tslibs import conversion from pandas._libs.tslibs.frequencies import INVALID_FREQ_ERR_MSG -from pandas.compat import PY3 +from pandas.compat import PY3, PY36 import pandas.util._test_decorators as td from pandas import NaT, Timestamp @@ -329,6 +329,19 @@ def test_replace_dst_border(self): expected = Timestamp('2013-11-3 03:00:00', tz='America/Chicago') assert result == expected + @pytest.mark.skipif(not PY36, reason='Fold not available until PY3.6') + @pytest.mark.parametrize('fold', [0, 1]) + @pytest.mark.parametrize('tz', ['dateutil/Europe/London', 'Europe/London']) + def test_replace_dst_fold(self, fold, tz): + # GH 25017 + d = datetime(2019, 10, 27, 2, 30) + ts = Timestamp(d, tz=tz) + result = ts.replace(hour=1, fold=fold) + expected = Timestamp(datetime(2019, 10, 27, 1, 30)).tz_localize( + tz, ambiguous=not fold + ) + assert result == expected + # -------------------------------------------------------------- # Timestamp.normalize diff --git a/pandas/tests/series/test_alter_axes.py b/pandas/tests/series/test_alter_axes.py index 04c54bcf8c22c..73adc7d4bf82f 100644 --- a/pandas/tests/series/test_alter_axes.py +++ b/pandas/tests/series/test_alter_axes.py @@ -258,6 +258,17 @@ def test_rename_axis_inplace(self, datetime_series): assert no_return is None tm.assert_series_equal(result, expected) + @pytest.mark.parametrize('kwargs', [{'mapper': None}, {'index': None}, {}]) + def test_rename_axis_none(self, kwargs): + # GH 25034 + index = Index(list('abc'), name='foo') + df = Series([1, 2, 3], index=index) + + result = df.rename_axis(**kwargs) + expected_index = index.rename(None) if kwargs else index + expected = Series([1, 2, 3], index=expected_index) + tm.assert_series_equal(result, expected) + def test_set_axis_inplace_axes(self, axis_series): # GH14636 ser = Series(np.arange(4), index=[1, 3, 5, 7], dtype='int64') diff --git a/pandas/tests/series/test_apply.py b/pandas/tests/series/test_apply.py index 90cf6916df0d1..162a27db34cb1 100644 --- a/pandas/tests/series/test_apply.py +++ b/pandas/tests/series/test_apply.py @@ -163,6 +163,18 @@ def test_apply_dict_depr(self): with tm.assert_produces_warning(FutureWarning): tsdf.A.agg({'foo': ['sum', 'mean']}) + @pytest.mark.parametrize('series', [ + ['1-1', '1-1', np.NaN], + ['1-1', '1-2', np.NaN]]) + def test_apply_categorical_with_nan_values(self, series): + # GH 20714 bug fixed in: GH 24275 + s = pd.Series(series, dtype='category') + result = s.apply(lambda x: x.split('-')[0]) + result = result.astype(object) + expected = pd.Series(['1', '1', np.NaN], dtype='category') + expected = expected.astype(object) + tm.assert_series_equal(result, expected) + class TestSeriesAggregate(): diff --git a/pandas/tests/series/test_dtypes.py b/pandas/tests/series/test_dtypes.py index e29974f56967f..d8046c4944afc 100644 --- a/pandas/tests/series/test_dtypes.py +++ b/pandas/tests/series/test_dtypes.py @@ -291,8 +291,8 @@ def test_astype_categorical_to_other(self): expected = s tm.assert_series_equal(s.astype('category'), expected) tm.assert_series_equal(s.astype(CategoricalDtype()), expected) - msg = (r"could not convert string to float: '(0 - 499|9500 - 9999)'|" - r"invalid literal for float\(\): (0 - 499|9500 - 9999)") + msg = (r"could not convert string to float|" + r"invalid literal for float\(\)") with pytest.raises(ValueError, match=msg): s.astype('float64') diff --git a/pandas/tests/series/test_duplicates.py b/pandas/tests/series/test_duplicates.py index fe47975711a17..a975edacc19c7 100644 --- a/pandas/tests/series/test_duplicates.py +++ b/pandas/tests/series/test_duplicates.py @@ -59,12 +59,18 @@ def test_unique_data_ownership(): Series(Series(["a", "c", "b"]).unique()).sort_values() -def test_is_unique(): - # GH11946 - s = Series(np.random.randint(0, 10, size=1000)) - assert s.is_unique is False - s = Series(np.arange(1000)) - assert s.is_unique is True +@pytest.mark.parametrize('data, expected', [ + (np.random.randint(0, 10, size=1000), False), + (np.arange(1000), True), + ([], True), + ([np.nan], True), + (['foo', 'bar', np.nan], True), + (['foo', 'foo', np.nan], False), + (['foo', 'bar', np.nan, np.nan], False)]) +def test_is_unique(data, expected): + # GH11946 / GH25180 + s = Series(data) + assert s.is_unique is expected def test_is_unique_class_ne(capsys): diff --git a/pandas/tests/series/test_period.py b/pandas/tests/series/test_period.py index 0a86bb0b67797..7e0feb418e8df 100644 --- a/pandas/tests/series/test_period.py +++ b/pandas/tests/series/test_period.py @@ -164,3 +164,12 @@ def test_end_time_timevalues(self, input_vals): result = s.dt.end_time expected = s.apply(lambda x: x.end_time) tm.assert_series_equal(result, expected) + + @pytest.mark.parametrize('input_vals', [ + ('2001'), ('NaT') + ]) + def test_to_period(self, input_vals): + # GH 21205 + expected = Series([input_vals], dtype='Period[D]') + result = Series([input_vals], dtype='datetime64[ns]').dt.to_period('D') + tm.assert_series_equal(result, expected) diff --git a/pandas/tests/series/test_repr.py b/pandas/tests/series/test_repr.py index b4e7708e2456e..842207f2a572f 100644 --- a/pandas/tests/series/test_repr.py +++ b/pandas/tests/series/test_repr.py @@ -198,6 +198,14 @@ def test_latex_repr(self): assert s._repr_latex_() is None + def test_index_repr_in_frame_with_nan(self): + # see gh-25061 + i = Index([1, np.nan]) + s = Series([1, 2], index=i) + exp = """1.0 1\nNaN 2\ndtype: int64""" + + assert repr(s) == exp + class TestCategoricalRepr(object): diff --git a/pandas/tests/test_nanops.py b/pandas/tests/test_nanops.py index 4bcd16a86e865..cf5ef6cf15eca 100644 --- a/pandas/tests/test_nanops.py +++ b/pandas/tests/test_nanops.py @@ -971,6 +971,9 @@ def prng(self): class TestDatetime64NaNOps(object): @pytest.mark.parametrize('tz', [None, 'UTC']) + @pytest.mark.xfail(reason="disabled") + # Enabling mean changes the behavior of DataFrame.mean + # See https://github.com/pandas-dev/pandas/issues/24752 def test_nanmean(self, tz): dti = pd.date_range('2016-01-01', periods=3, tz=tz) expected = dti[1] diff --git a/pandas/tests/test_panel.py b/pandas/tests/test_panel.py index ba0ad72e624f7..bfcafda1dc783 100644 --- a/pandas/tests/test_panel.py +++ b/pandas/tests/test_panel.py @@ -1,57 +1,29 @@ # -*- coding: utf-8 -*- # pylint: disable=W0612,E1101 - +from collections import OrderedDict from datetime import datetime -import operator -from warnings import catch_warnings, simplefilter import numpy as np import pytest -from pandas.compat import OrderedDict, StringIO, lrange, range, signature -import pandas.util._test_decorators as td - -from pandas.core.dtypes.common import is_float_dtype +from pandas.compat import lrange -from pandas import ( - DataFrame, Index, MultiIndex, Series, compat, date_range, isna, notna) -from pandas.core.nanops import nanall, nanany +from pandas import DataFrame, MultiIndex, Series, date_range, notna import pandas.core.panel as panelm from pandas.core.panel import Panel import pandas.util.testing as tm from pandas.util.testing import ( assert_almost_equal, assert_frame_equal, assert_panel_equal, - assert_series_equal, ensure_clean, makeCustomDataframe as mkdf, - makeMixedDataFrame) + assert_series_equal, makeCustomDataframe as mkdf, makeMixedDataFrame) from pandas.io.formats.printing import pprint_thing -from pandas.tseries.offsets import BDay, MonthEnd - - -def make_test_panel(): - with catch_warnings(record=True): - simplefilter("ignore", FutureWarning) - _panel = tm.makePanel() - tm.add_nans(_panel) - _panel = _panel.copy() - return _panel +from pandas.tseries.offsets import MonthEnd @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") class PanelTests(object): panel = None - def test_pickle(self): - unpickled = tm.round_trip_pickle(self.panel) - assert_frame_equal(unpickled['ItemA'], self.panel['ItemA']) - - def test_rank(self): - pytest.raises(NotImplementedError, lambda: self.panel.rank()) - - def test_cumsum(self): - cumsum = self.panel.cumsum() - assert_frame_equal(cumsum['ItemA'], self.panel['ItemA'].cumsum()) - def not_hashable(self): c_empty = Panel() c = Panel(Panel([[[1]]])) @@ -59,298 +31,9 @@ def not_hashable(self): pytest.raises(TypeError, hash, c) -@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") -class SafeForLongAndSparse(object): - - def test_repr(self): - repr(self.panel) - - def test_copy_names(self): - for attr in ('major_axis', 'minor_axis'): - getattr(self.panel, attr).name = None - cp = self.panel.copy() - getattr(cp, attr).name = 'foo' - assert getattr(self.panel, attr).name is None - - def test_iter(self): - tm.equalContents(list(self.panel), self.panel.items) - - def test_count(self): - f = lambda s: notna(s).sum() - self._check_stat_op('count', f, obj=self.panel, has_skipna=False) - - def test_sum(self): - self._check_stat_op('sum', np.sum, skipna_alternative=np.nansum) - - def test_mean(self): - self._check_stat_op('mean', np.mean) - - def test_prod(self): - self._check_stat_op('prod', np.prod, skipna_alternative=np.nanprod) - - @pytest.mark.filterwarnings("ignore:Invalid value:RuntimeWarning") - @pytest.mark.filterwarnings("ignore:All-NaN:RuntimeWarning") - def test_median(self): - def wrapper(x): - if isna(x).any(): - return np.nan - return np.median(x) - - self._check_stat_op('median', wrapper) - - @pytest.mark.filterwarnings("ignore:Invalid value:RuntimeWarning") - def test_min(self): - self._check_stat_op('min', np.min) - - @pytest.mark.filterwarnings("ignore:Invalid value:RuntimeWarning") - def test_max(self): - self._check_stat_op('max', np.max) - - @td.skip_if_no_scipy - def test_skew(self): - from scipy.stats import skew - - def this_skew(x): - if len(x) < 3: - return np.nan - return skew(x, bias=False) - - self._check_stat_op('skew', this_skew) - - def test_var(self): - def alt(x): - if len(x) < 2: - return np.nan - return np.var(x, ddof=1) - - self._check_stat_op('var', alt) - - def test_std(self): - def alt(x): - if len(x) < 2: - return np.nan - return np.std(x, ddof=1) - - self._check_stat_op('std', alt) - - def test_sem(self): - def alt(x): - if len(x) < 2: - return np.nan - return np.std(x, ddof=1) / np.sqrt(len(x)) - - self._check_stat_op('sem', alt) - - def _check_stat_op(self, name, alternative, obj=None, has_skipna=True, - skipna_alternative=None): - if obj is None: - obj = self.panel - - # # set some NAs - # obj.loc[5:10] = np.nan - # obj.loc[15:20, -2:] = np.nan - - f = getattr(obj, name) - - if has_skipna: - - skipna_wrapper = tm._make_skipna_wrapper(alternative, - skipna_alternative) - - def wrapper(x): - return alternative(np.asarray(x)) - - for i in range(obj.ndim): - result = f(axis=i, skipna=False) - assert_frame_equal(result, obj.apply(wrapper, axis=i)) - else: - skipna_wrapper = alternative - wrapper = alternative - - for i in range(obj.ndim): - result = f(axis=i) - if name in ['sum', 'prod']: - assert_frame_equal(result, obj.apply(skipna_wrapper, axis=i)) - - pytest.raises(Exception, f, axis=obj.ndim) - - # Unimplemented numeric_only parameter. - if 'numeric_only' in signature(f).args: - with pytest.raises(NotImplementedError, match=name): - f(numeric_only=True) - - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") class SafeForSparse(object): - def test_get_axis(self): - assert (self.panel._get_axis(0) is self.panel.items) - assert (self.panel._get_axis(1) is self.panel.major_axis) - assert (self.panel._get_axis(2) is self.panel.minor_axis) - - def test_set_axis(self): - new_items = Index(np.arange(len(self.panel.items))) - new_major = Index(np.arange(len(self.panel.major_axis))) - new_minor = Index(np.arange(len(self.panel.minor_axis))) - - # ensure propagate to potentially prior-cached items too - item = self.panel['ItemA'] - self.panel.items = new_items - - if hasattr(self.panel, '_item_cache'): - assert 'ItemA' not in self.panel._item_cache - assert self.panel.items is new_items - - # TODO: unused? - item = self.panel[0] # noqa - - self.panel.major_axis = new_major - assert self.panel[0].index is new_major - assert self.panel.major_axis is new_major - - # TODO: unused? - item = self.panel[0] # noqa - - self.panel.minor_axis = new_minor - assert self.panel[0].columns is new_minor - assert self.panel.minor_axis is new_minor - - def test_get_axis_number(self): - assert self.panel._get_axis_number('items') == 0 - assert self.panel._get_axis_number('major') == 1 - assert self.panel._get_axis_number('minor') == 2 - - with pytest.raises(ValueError, match="No axis named foo"): - self.panel._get_axis_number('foo') - - with pytest.raises(ValueError, match="No axis named foo"): - self.panel.__ge__(self.panel, axis='foo') - - def test_get_axis_name(self): - assert self.panel._get_axis_name(0) == 'items' - assert self.panel._get_axis_name(1) == 'major_axis' - assert self.panel._get_axis_name(2) == 'minor_axis' - - def test_get_plane_axes(self): - # what to do here? - - index, columns = self.panel._get_plane_axes('items') - index, columns = self.panel._get_plane_axes('major_axis') - index, columns = self.panel._get_plane_axes('minor_axis') - index, columns = self.panel._get_plane_axes(0) - - def test_truncate(self): - dates = self.panel.major_axis - start, end = dates[1], dates[5] - - trunced = self.panel.truncate(start, end, axis='major') - expected = self.panel['ItemA'].truncate(start, end) - - assert_frame_equal(trunced['ItemA'], expected) - - trunced = self.panel.truncate(before=start, axis='major') - expected = self.panel['ItemA'].truncate(before=start) - - assert_frame_equal(trunced['ItemA'], expected) - - trunced = self.panel.truncate(after=end, axis='major') - expected = self.panel['ItemA'].truncate(after=end) - - assert_frame_equal(trunced['ItemA'], expected) - - def test_arith(self): - self._test_op(self.panel, operator.add) - self._test_op(self.panel, operator.sub) - self._test_op(self.panel, operator.mul) - self._test_op(self.panel, operator.truediv) - self._test_op(self.panel, operator.floordiv) - self._test_op(self.panel, operator.pow) - - self._test_op(self.panel, lambda x, y: y + x) - self._test_op(self.panel, lambda x, y: y - x) - self._test_op(self.panel, lambda x, y: y * x) - self._test_op(self.panel, lambda x, y: y / x) - self._test_op(self.panel, lambda x, y: y ** x) - - self._test_op(self.panel, lambda x, y: x + y) # panel + 1 - self._test_op(self.panel, lambda x, y: x - y) # panel - 1 - self._test_op(self.panel, lambda x, y: x * y) # panel * 1 - self._test_op(self.panel, lambda x, y: x / y) # panel / 1 - self._test_op(self.panel, lambda x, y: x ** y) # panel ** 1 - - pytest.raises(Exception, self.panel.__add__, - self.panel['ItemA']) - - @staticmethod - def _test_op(panel, op): - result = op(panel, 1) - assert_frame_equal(result['ItemA'], op(panel['ItemA'], 1)) - - def test_keys(self): - tm.equalContents(list(self.panel.keys()), self.panel.items) - - def test_iteritems(self): - # Test panel.iteritems(), aka panel.iteritems() - # just test that it works - for k, v in self.panel.iteritems(): - pass - - assert len(list(self.panel.iteritems())) == len(self.panel.items) - - def test_combineFrame(self): - def check_op(op, name): - # items - df = self.panel['ItemA'] - - func = getattr(self.panel, name) - - result = func(df, axis='items') - - assert_frame_equal( - result['ItemB'], op(self.panel['ItemB'], df)) - - # major - xs = self.panel.major_xs(self.panel.major_axis[0]) - result = func(xs, axis='major') - - idx = self.panel.major_axis[1] - - assert_frame_equal(result.major_xs(idx), - op(self.panel.major_xs(idx), xs)) - - # minor - xs = self.panel.minor_xs(self.panel.minor_axis[0]) - result = func(xs, axis='minor') - - idx = self.panel.minor_axis[1] - - assert_frame_equal(result.minor_xs(idx), - op(self.panel.minor_xs(idx), xs)) - - ops = ['add', 'sub', 'mul', 'truediv', 'floordiv', 'pow', 'mod'] - if not compat.PY3: - ops.append('div') - - for op in ops: - try: - check_op(getattr(operator, op), op) - except AttributeError: - pprint_thing("Failing operation: %r" % op) - raise - if compat.PY3: - try: - check_op(operator.truediv, 'div') - except AttributeError: - pprint_thing("Failing operation: %r" % 'div') - raise - - def test_combinePanel(self): - result = self.panel.add(self.panel) - assert_panel_equal(result, self.panel * 2) - - def test_neg(self): - assert_panel_equal(-self.panel, self.panel * -1) - # issue 7692 def test_raise_when_not_implemented(self): p = Panel(np.arange(3 * 4 * 5).reshape(3, 4, 5), @@ -364,84 +47,11 @@ def test_raise_when_not_implemented(self): with pytest.raises(NotImplementedError): getattr(p, op)(d, axis=0) - def test_select(self): - p = self.panel - - # select items - with tm.assert_produces_warning(FutureWarning, check_stacklevel=False): - result = p.select(lambda x: x in ('ItemA', 'ItemC'), axis='items') - expected = p.reindex(items=['ItemA', 'ItemC']) - assert_panel_equal(result, expected) - - # select major_axis - with tm.assert_produces_warning(FutureWarning, check_stacklevel=False): - result = p.select(lambda x: x >= datetime( - 2000, 1, 15), axis='major') - new_major = p.major_axis[p.major_axis >= datetime(2000, 1, 15)] - expected = p.reindex(major=new_major) - assert_panel_equal(result, expected) - - # select minor_axis - with tm.assert_produces_warning(FutureWarning, check_stacklevel=False): - result = p.select(lambda x: x in ('D', 'A'), axis=2) - expected = p.reindex(minor=['A', 'D']) - assert_panel_equal(result, expected) - - # corner case, empty thing - with tm.assert_produces_warning(FutureWarning, check_stacklevel=False): - result = p.select(lambda x: x in ('foo', ), axis='items') - assert_panel_equal(result, p.reindex(items=[])) - - def test_get_value(self): - for item in self.panel.items: - for mjr in self.panel.major_axis[::2]: - for mnr in self.panel.minor_axis: - with tm.assert_produces_warning(FutureWarning, - check_stacklevel=False): - result = self.panel.get_value(item, mjr, mnr) - expected = self.panel[item][mnr][mjr] - assert_almost_equal(result, expected) - - def test_abs(self): - - result = self.panel.abs() - result2 = abs(self.panel) - expected = np.abs(self.panel) - assert_panel_equal(result, expected) - assert_panel_equal(result2, expected) - - df = self.panel['ItemA'] - result = df.abs() - result2 = abs(df) - expected = np.abs(df) - assert_frame_equal(result, expected) - assert_frame_equal(result2, expected) - - s = df['A'] - result = s.abs() - result2 = abs(s) - expected = np.abs(s) - assert_series_equal(result, expected) - assert_series_equal(result2, expected) - assert result.name == 'A' - assert result2.name == 'A' - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") class CheckIndexing(object): - def test_getitem(self): - pytest.raises(Exception, self.panel.__getitem__, 'ItemQ') - def test_delitem_and_pop(self): - expected = self.panel['ItemA'] - result = self.panel.pop('ItemA') - assert_frame_equal(expected, result) - assert 'ItemA' not in self.panel.items - - del self.panel['ItemB'] - assert 'ItemB' not in self.panel.items - pytest.raises(Exception, self.panel.__delitem__, 'ItemB') values = np.empty((3, 3, 3)) values[0] = 0 @@ -468,38 +78,6 @@ def test_delitem_and_pop(self): tm.assert_frame_equal(panelc[0], panel[0]) def test_setitem(self): - lp = self.panel.filter(['ItemA', 'ItemB']).to_frame() - - with pytest.raises(TypeError): - self.panel['ItemE'] = lp - - # DataFrame - df = self.panel['ItemA'][2:].filter(items=['A', 'B']) - self.panel['ItemF'] = df - self.panel['ItemE'] = df - - df2 = self.panel['ItemF'] - - assert_frame_equal(df, df2.reindex( - index=df.index, columns=df.columns)) - - # scalar - self.panel['ItemG'] = 1 - self.panel['ItemE'] = True - assert self.panel['ItemG'].values.dtype == np.int64 - assert self.panel['ItemE'].values.dtype == np.bool_ - - # object dtype - self.panel['ItemQ'] = 'foo' - assert self.panel['ItemQ'].values.dtype == np.object_ - - # boolean dtype - self.panel['ItemP'] = self.panel['ItemA'] > 0 - assert self.panel['ItemP'].values.dtype == np.bool_ - - pytest.raises(TypeError, self.panel.__setitem__, 'foo', - self.panel.loc[['ItemP']]) - # bad shape p = Panel(np.random.randn(4, 3, 2)) msg = (r"shape of value must be \(3, 2\), " @@ -537,159 +115,9 @@ def test_set_minor_major(self): assert_frame_equal(panel.loc[:, 'NewMajor', :], newmajor.astype(object)) - def test_major_xs(self): - ref = self.panel['ItemA'] - - idx = self.panel.major_axis[5] - xs = self.panel.major_xs(idx) - - result = xs['ItemA'] - assert_series_equal(result, ref.xs(idx), check_names=False) - assert result.name == 'ItemA' - - # not contained - idx = self.panel.major_axis[0] - BDay() - pytest.raises(Exception, self.panel.major_xs, idx) - - def test_major_xs_mixed(self): - self.panel['ItemD'] = 'foo' - xs = self.panel.major_xs(self.panel.major_axis[0]) - assert xs['ItemA'].dtype == np.float64 - assert xs['ItemD'].dtype == np.object_ - - def test_minor_xs(self): - ref = self.panel['ItemA'] - - idx = self.panel.minor_axis[1] - xs = self.panel.minor_xs(idx) - - assert_series_equal(xs['ItemA'], ref[idx], check_names=False) - - # not contained - pytest.raises(Exception, self.panel.minor_xs, 'E') - - def test_minor_xs_mixed(self): - self.panel['ItemD'] = 'foo' - - xs = self.panel.minor_xs('D') - assert xs['ItemA'].dtype == np.float64 - assert xs['ItemD'].dtype == np.object_ - - def test_xs(self): - itemA = self.panel.xs('ItemA', axis=0) - expected = self.panel['ItemA'] - tm.assert_frame_equal(itemA, expected) - - # Get a view by default. - itemA_view = self.panel.xs('ItemA', axis=0) - itemA_view.values[:] = np.nan - - assert np.isnan(self.panel['ItemA'].values).all() - - # Mixed-type yields a copy. - self.panel['strings'] = 'foo' - result = self.panel.xs('D', axis=2) - assert result._is_copy is not None - - def test_getitem_fancy_labels(self): - p = self.panel - - items = p.items[[1, 0]] - dates = p.major_axis[::2] - cols = ['D', 'C', 'F'] - - # all 3 specified - with catch_warnings(): - simplefilter("ignore", FutureWarning) - # XXX: warning in _validate_read_indexer - assert_panel_equal(p.loc[items, dates, cols], - p.reindex(items=items, major=dates, minor=cols)) - - # 2 specified - assert_panel_equal(p.loc[:, dates, cols], - p.reindex(major=dates, minor=cols)) - - assert_panel_equal(p.loc[items, :, cols], - p.reindex(items=items, minor=cols)) - - assert_panel_equal(p.loc[items, dates, :], - p.reindex(items=items, major=dates)) - - # only 1 - assert_panel_equal(p.loc[items, :, :], p.reindex(items=items)) - - assert_panel_equal(p.loc[:, dates, :], p.reindex(major=dates)) - - assert_panel_equal(p.loc[:, :, cols], p.reindex(minor=cols)) - def test_getitem_fancy_slice(self): pass - def test_getitem_fancy_ints(self): - p = self.panel - - # #1603 - result = p.iloc[:, -1, :] - expected = p.loc[:, p.major_axis[-1], :] - assert_frame_equal(result, expected) - - def test_getitem_fancy_xs(self): - p = self.panel - item = 'ItemB' - - date = p.major_axis[5] - col = 'C' - - # get DataFrame - # item - assert_frame_equal(p.loc[item], p[item]) - assert_frame_equal(p.loc[item, :], p[item]) - assert_frame_equal(p.loc[item, :, :], p[item]) - - # major axis, axis=1 - assert_frame_equal(p.loc[:, date], p.major_xs(date)) - assert_frame_equal(p.loc[:, date, :], p.major_xs(date)) - - # minor axis, axis=2 - assert_frame_equal(p.loc[:, :, 'C'], p.minor_xs('C')) - - # get Series - assert_series_equal(p.loc[item, date], p[item].loc[date]) - assert_series_equal(p.loc[item, date, :], p[item].loc[date]) - assert_series_equal(p.loc[item, :, col], p[item][col]) - assert_series_equal(p.loc[:, date, col], p.major_xs(date).loc[col]) - - def test_getitem_fancy_xs_check_view(self): - item = 'ItemB' - date = self.panel.major_axis[5] - - # make sure it's always a view - NS = slice(None, None) - - # DataFrames - comp = assert_frame_equal - self._check_view(item, comp) - self._check_view((item, NS), comp) - self._check_view((item, NS, NS), comp) - self._check_view((NS, date), comp) - self._check_view((NS, date, NS), comp) - self._check_view((NS, NS, 'C'), comp) - - # Series - comp = assert_series_equal - self._check_view((item, date), comp) - self._check_view((item, date, NS), comp) - self._check_view((item, NS, 'C'), comp) - self._check_view((NS, date, 'C'), comp) - - def test_getitem_callable(self): - p = self.panel - # GH 12533 - - assert_frame_equal(p[lambda x: 'ItemB'], p.loc['ItemB']) - assert_panel_equal(p[lambda x: ['ItemB', 'ItemC']], - p.loc[['ItemB', 'ItemC']]) - def test_ix_setitem_slice_dataframe(self): a = Panel(items=[1, 2, 3], major_axis=[11, 22, 33], minor_axis=[111, 222, 333]) @@ -719,43 +147,6 @@ def test_ix_align(self): assert_series_equal(df.loc[0, 0, :].reindex(b.index), b) def test_ix_frame_align(self): - p_orig = tm.makePanel() - df = p_orig.iloc[0].copy() - assert_frame_equal(p_orig['ItemA'], df) - - p = p_orig.copy() - p.iloc[0, :, :] = df - assert_panel_equal(p, p_orig) - - p = p_orig.copy() - p.iloc[0] = df - assert_panel_equal(p, p_orig) - - p = p_orig.copy() - p.iloc[0, :, :] = df - assert_panel_equal(p, p_orig) - - p = p_orig.copy() - p.iloc[0] = df - assert_panel_equal(p, p_orig) - - p = p_orig.copy() - p.loc['ItemA'] = df - assert_panel_equal(p, p_orig) - - p = p_orig.copy() - p.loc['ItemA', :, :] = df - assert_panel_equal(p, p_orig) - - p = p_orig.copy() - p['ItemA'] = df - assert_panel_equal(p, p_orig) - - p = p_orig.copy() - p.iloc[0, [0, 1, 3, 5], -2:] = df - out = p.iloc[0, [0, 1, 3, 5], -2:] - assert_frame_equal(out, df.iloc[[0, 1, 3, 5], [2, 3]]) - # GH3830, panel assignent by values/frame for dtype in ['float64', 'int64']: @@ -782,13 +173,6 @@ def test_ix_frame_align(self): tm.assert_frame_equal(panel.loc['a1'], df1) tm.assert_frame_equal(panel.loc['a2'], df2) - def _check_view(self, indexer, comp): - cp = self.panel.copy() - obj = cp.loc[indexer] - obj.values[:] = 0 - assert (obj.values == 0).all() - comp(cp.loc[indexer].reindex_like(obj), obj) - def test_logical_with_nas(self): d = Panel({'ItemA': {'a': [np.nan, False]}, 'ItemB': {'a': [True, True]}}) @@ -802,157 +186,11 @@ def test_logical_with_nas(self): expected = DataFrame({'a': [True, True]}) assert_frame_equal(result, expected) - def test_neg(self): - assert_panel_equal(-self.panel, -1 * self.panel) - - def test_invert(self): - assert_panel_equal(-(self.panel < 0), ~(self.panel < 0)) - - def test_comparisons(self): - p1 = tm.makePanel() - p2 = tm.makePanel() - - tp = p1.reindex(items=p1.items + ['foo']) - df = p1[p1.items[0]] - - def test_comp(func): - - # versus same index - result = func(p1, p2) - tm.assert_numpy_array_equal(result.values, - func(p1.values, p2.values)) - - # versus non-indexed same objs - pytest.raises(Exception, func, p1, tp) - - # versus different objs - pytest.raises(Exception, func, p1, df) - - # versus scalar - result3 = func(self.panel, 0) - tm.assert_numpy_array_equal(result3.values, - func(self.panel.values, 0)) - - with np.errstate(invalid='ignore'): - test_comp(operator.eq) - test_comp(operator.ne) - test_comp(operator.lt) - test_comp(operator.gt) - test_comp(operator.ge) - test_comp(operator.le) - - def test_get_value(self): - for item in self.panel.items: - for mjr in self.panel.major_axis[::2]: - for mnr in self.panel.minor_axis: - with tm.assert_produces_warning(FutureWarning, - check_stacklevel=False): - result = self.panel.get_value(item, mjr, mnr) - expected = self.panel[item][mnr][mjr] - assert_almost_equal(result, expected) - with catch_warnings(): - simplefilter("ignore", FutureWarning) - msg = "There must be an argument for each axis" - with pytest.raises(TypeError, match=msg): - self.panel.get_value('a') - - def test_set_value(self): - for item in self.panel.items: - for mjr in self.panel.major_axis[::2]: - for mnr in self.panel.minor_axis: - with tm.assert_produces_warning(FutureWarning, - check_stacklevel=False): - self.panel.set_value(item, mjr, mnr, 1.) - tm.assert_almost_equal(self.panel[item][mnr][mjr], 1.) - - # resize - with catch_warnings(): - simplefilter("ignore", FutureWarning) - res = self.panel.set_value('ItemE', 'foo', 'bar', 1.5) - assert isinstance(res, Panel) - assert res is not self.panel - assert res.get_value('ItemE', 'foo', 'bar') == 1.5 - - res3 = self.panel.set_value('ItemE', 'foobar', 'baz', 5) - assert is_float_dtype(res3['ItemE'].values) - - msg = ("There must be an argument for each " - "axis plus the value provided") - with pytest.raises(TypeError, match=msg): - self.panel.set_value('a') - @pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") -class TestPanel(PanelTests, CheckIndexing, SafeForLongAndSparse, - SafeForSparse): - - def setup_method(self, method): - self.panel = make_test_panel() - self.panel.major_axis.name = None - self.panel.minor_axis.name = None - self.panel.items.name = None - - def test_constructor(self): - # with BlockManager - wp = Panel(self.panel._data) - assert wp._data is self.panel._data - - wp = Panel(self.panel._data, copy=True) - assert wp._data is not self.panel._data - tm.assert_panel_equal(wp, self.panel) - - # strings handled prop - wp = Panel([[['foo', 'foo', 'foo', ], ['foo', 'foo', 'foo']]]) - assert wp.values.dtype == np.object_ - - vals = self.panel.values - - # no copy - wp = Panel(vals) - assert wp.values is vals - - # copy - wp = Panel(vals, copy=True) - assert wp.values is not vals - - # GH #8285, test when scalar data is used to construct a Panel - # if dtype is not passed, it should be inferred - value_and_dtype = [(1, 'int64'), (3.14, 'float64'), - ('foo', np.object_)] - for (val, dtype) in value_and_dtype: - wp = Panel(val, items=range(2), major_axis=range(3), - minor_axis=range(4)) - vals = np.empty((2, 3, 4), dtype=dtype) - vals.fill(val) - - tm.assert_panel_equal(wp, Panel(vals, dtype=dtype)) - - # test the case when dtype is passed - wp = Panel(1, items=range(2), major_axis=range(3), - minor_axis=range(4), - dtype='float32') - vals = np.empty((2, 3, 4), dtype='float32') - vals.fill(1) - - tm.assert_panel_equal(wp, Panel(vals, dtype='float32')) +class TestPanel(PanelTests, CheckIndexing, SafeForSparse): def test_constructor_cast(self): - zero_filled = self.panel.fillna(0) - - casted = Panel(zero_filled._data, dtype=int) - casted2 = Panel(zero_filled.values, dtype=int) - - exp_values = zero_filled.values.astype(int) - assert_almost_equal(casted.values, exp_values) - assert_almost_equal(casted2.values, exp_values) - - casted = Panel(zero_filled._data, dtype=np.int32) - casted2 = Panel(zero_filled.values, dtype=np.int32) - - exp_values = zero_filled.values.astype(np.int32) - assert_almost_equal(casted.values, exp_values) - assert_almost_equal(casted2.values, exp_values) - # can't cast data = [[['foo', 'bar', 'baz']]] pytest.raises(ValueError, Panel, data, dtype=float) @@ -1017,86 +255,6 @@ def test_constructor_fails_with_not_3d_input(self): with pytest.raises(ValueError, match=msg): Panel(np.random.randn(10, 2)) - def test_consolidate(self): - assert self.panel._data.is_consolidated() - - self.panel['foo'] = 1. - assert not self.panel._data.is_consolidated() - - panel = self.panel._consolidate() - assert panel._data.is_consolidated() - - def test_ctor_dict(self): - itema = self.panel['ItemA'] - itemb = self.panel['ItemB'] - - d = {'A': itema, 'B': itemb[5:]} - d2 = {'A': itema._series, 'B': itemb[5:]._series} - d3 = {'A': None, - 'B': DataFrame(itemb[5:]._series), - 'C': DataFrame(itema._series)} - - wp = Panel.from_dict(d) - wp2 = Panel.from_dict(d2) # nested Dict - - # TODO: unused? - wp3 = Panel.from_dict(d3) # noqa - - tm.assert_index_equal(wp.major_axis, self.panel.major_axis) - assert_panel_equal(wp, wp2) - - # intersect - wp = Panel.from_dict(d, intersect=True) - tm.assert_index_equal(wp.major_axis, itemb.index[5:]) - - # use constructor - assert_panel_equal(Panel(d), Panel.from_dict(d)) - assert_panel_equal(Panel(d2), Panel.from_dict(d2)) - assert_panel_equal(Panel(d3), Panel.from_dict(d3)) - - # a pathological case - d4 = {'A': None, 'B': None} - - # TODO: unused? - wp4 = Panel.from_dict(d4) # noqa - - assert_panel_equal(Panel(d4), Panel(items=['A', 'B'])) - - # cast - dcasted = {k: v.reindex(wp.major_axis).fillna(0) - for k, v in compat.iteritems(d)} - result = Panel(dcasted, dtype=int) - expected = Panel({k: v.astype(int) - for k, v in compat.iteritems(dcasted)}) - assert_panel_equal(result, expected) - - result = Panel(dcasted, dtype=np.int32) - expected = Panel({k: v.astype(np.int32) - for k, v in compat.iteritems(dcasted)}) - assert_panel_equal(result, expected) - - def test_constructor_dict_mixed(self): - data = {k: v.values for k, v in self.panel.iteritems()} - result = Panel(data) - exp_major = Index(np.arange(len(self.panel.major_axis))) - tm.assert_index_equal(result.major_axis, exp_major) - - result = Panel(data, items=self.panel.items, - major_axis=self.panel.major_axis, - minor_axis=self.panel.minor_axis) - assert_panel_equal(result, self.panel) - - data['ItemC'] = self.panel['ItemC'] - result = Panel(data) - assert_panel_equal(result, self.panel) - - # corner, blow up - data['ItemB'] = data['ItemB'][:-1] - pytest.raises(Exception, Panel, data) - - data['ItemB'] = self.panel['ItemB'].values[:, :-1] - pytest.raises(Exception, Panel, data) - def test_ctor_orderedDict(self): keys = list(set(np.random.randint(0, 5000, 100)))[ :50] # unique random int keys @@ -1107,30 +265,6 @@ def test_ctor_orderedDict(self): p = Panel.from_dict(d) assert list(p.items) == keys - def test_constructor_resize(self): - data = self.panel._data - items = self.panel.items[:-1] - major = self.panel.major_axis[:-1] - minor = self.panel.minor_axis[:-1] - - result = Panel(data, items=items, - major_axis=major, minor_axis=minor) - expected = self.panel.reindex( - items=items, major=major, minor=minor) - assert_panel_equal(result, expected) - - result = Panel(data, items=items, major_axis=major) - expected = self.panel.reindex(items=items, major=major) - assert_panel_equal(result, expected) - - result = Panel(data, items=items) - expected = self.panel.reindex(items=items) - assert_panel_equal(result, expected) - - result = Panel(data, minor_axis=minor) - expected = self.panel.reindex(minor=minor) - assert_panel_equal(result, expected) - def test_from_dict_mixed_orient(self): df = tm.makeDataFrame() df['foo'] = 'bar' @@ -1161,13 +295,6 @@ def test_constructor_error_msgs(self): Panel(np.random.randn(3, 4, 5), lrange(5), lrange(5), lrange(4)) - def test_conform(self): - df = self.panel['ItemA'][:-5].filter(items=['A', 'B']) - conformed = self.panel.conform(df) - - tm.assert_index_equal(conformed.index, self.panel.major_axis) - tm.assert_index_equal(conformed.columns, self.panel.minor_axis) - def test_convert_objects(self): # GH 4937 p = Panel(dict(A=dict(a=['1', '1.0']))) @@ -1175,12 +302,6 @@ def test_convert_objects(self): result = p._convert(numeric=True, coerce=True) assert_panel_equal(result, expected) - def test_dtypes(self): - - result = self.panel.dtypes - expected = Series(np.dtype('float64'), index=self.panel.items) - assert_series_equal(result, expected) - def test_astype(self): # GH7271 data = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) @@ -1193,121 +314,7 @@ def test_astype(self): pytest.raises(NotImplementedError, panel.astype, {0: str}) - def test_apply(self): - # GH1148 - - # ufunc - applied = self.panel.apply(np.sqrt) - with np.errstate(invalid='ignore'): - expected = np.sqrt(self.panel.values) - assert_almost_equal(applied.values, expected) - - # ufunc same shape - result = self.panel.apply(lambda x: x * 2, axis='items') - expected = self.panel * 2 - assert_panel_equal(result, expected) - result = self.panel.apply(lambda x: x * 2, axis='major_axis') - expected = self.panel * 2 - assert_panel_equal(result, expected) - result = self.panel.apply(lambda x: x * 2, axis='minor_axis') - expected = self.panel * 2 - assert_panel_equal(result, expected) - - # reduction to DataFrame - result = self.panel.apply(lambda x: x.dtype, axis='items') - expected = DataFrame(np.dtype('float64'), - index=self.panel.major_axis, - columns=self.panel.minor_axis) - assert_frame_equal(result, expected) - result = self.panel.apply(lambda x: x.dtype, axis='major_axis') - expected = DataFrame(np.dtype('float64'), - index=self.panel.minor_axis, - columns=self.panel.items) - assert_frame_equal(result, expected) - result = self.panel.apply(lambda x: x.dtype, axis='minor_axis') - expected = DataFrame(np.dtype('float64'), - index=self.panel.major_axis, - columns=self.panel.items) - assert_frame_equal(result, expected) - - # reductions via other dims - expected = self.panel.sum(0) - result = self.panel.apply(lambda x: x.sum(), axis='items') - assert_frame_equal(result, expected) - expected = self.panel.sum(1) - result = self.panel.apply(lambda x: x.sum(), axis='major_axis') - assert_frame_equal(result, expected) - expected = self.panel.sum(2) - result = self.panel.apply(lambda x: x.sum(), axis='minor_axis') - assert_frame_equal(result, expected) - - # pass kwargs - result = self.panel.apply( - lambda x, y: x.sum() + y, axis='items', y=5) - expected = self.panel.sum(0) + 5 - assert_frame_equal(result, expected) - def test_apply_slabs(self): - - # same shape as original - result = self.panel.apply(lambda x: x * 2, - axis=['items', 'major_axis']) - expected = (self.panel * 2).transpose('minor_axis', 'major_axis', - 'items') - assert_panel_equal(result, expected) - result = self.panel.apply(lambda x: x * 2, - axis=['major_axis', 'items']) - assert_panel_equal(result, expected) - - result = self.panel.apply(lambda x: x * 2, - axis=['items', 'minor_axis']) - expected = (self.panel * 2).transpose('major_axis', 'minor_axis', - 'items') - assert_panel_equal(result, expected) - result = self.panel.apply(lambda x: x * 2, - axis=['minor_axis', 'items']) - assert_panel_equal(result, expected) - - result = self.panel.apply(lambda x: x * 2, - axis=['major_axis', 'minor_axis']) - expected = self.panel * 2 - assert_panel_equal(result, expected) - result = self.panel.apply(lambda x: x * 2, - axis=['minor_axis', 'major_axis']) - assert_panel_equal(result, expected) - - # reductions - result = self.panel.apply(lambda x: x.sum(0), axis=[ - 'items', 'major_axis' - ]) - expected = self.panel.sum(1).T - assert_frame_equal(result, expected) - - result = self.panel.apply(lambda x: x.sum(1), axis=[ - 'items', 'major_axis' - ]) - expected = self.panel.sum(0) - assert_frame_equal(result, expected) - - # transforms - f = lambda x: ((x.T - x.mean(1)) / x.std(1)).T - - # make sure that we don't trigger any warnings - result = self.panel.apply(f, axis=['items', 'major_axis']) - expected = Panel({ax: f(self.panel.loc[:, :, ax]) - for ax in self.panel.minor_axis}) - assert_panel_equal(result, expected) - - result = self.panel.apply(f, axis=['major_axis', 'minor_axis']) - expected = Panel({ax: f(self.panel.loc[ax]) - for ax in self.panel.items}) - assert_panel_equal(result, expected) - - result = self.panel.apply(f, axis=['minor_axis', 'items']) - expected = Panel({ax: f(self.panel.loc[:, ax]) - for ax in self.panel.major_axis}) - assert_panel_equal(result, expected) - # with multi-indexes # GH7469 index = MultiIndex.from_tuples([('one', 'a'), ('one', 'b'), ( @@ -1343,53 +350,6 @@ def test_apply_no_or_zero_ndim(self): assert_series_equal(result_float, expected_float) assert_series_equal(result_float64, expected_float64) - def test_reindex(self): - ref = self.panel['ItemB'] - - # items - result = self.panel.reindex(items=['ItemA', 'ItemB']) - assert_frame_equal(result['ItemB'], ref) - - # major - new_major = list(self.panel.major_axis[:10]) - result = self.panel.reindex(major=new_major) - assert_frame_equal(result['ItemB'], ref.reindex(index=new_major)) - - # raise exception put both major and major_axis - pytest.raises(Exception, self.panel.reindex, - major_axis=new_major, - major=new_major) - - # minor - new_minor = list(self.panel.minor_axis[:2]) - result = self.panel.reindex(minor=new_minor) - assert_frame_equal(result['ItemB'], ref.reindex(columns=new_minor)) - - # raise exception put both major and major_axis - pytest.raises(Exception, self.panel.reindex, - minor_axis=new_minor, - minor=new_minor) - - # this ok - result = self.panel.reindex() - assert_panel_equal(result, self.panel) - assert result is not self.panel - - # with filling - smaller_major = self.panel.major_axis[::5] - smaller = self.panel.reindex(major=smaller_major) - - larger = smaller.reindex(major=self.panel.major_axis, method='pad') - - assert_frame_equal(larger.major_xs(self.panel.major_axis[1]), - smaller.major_xs(smaller_major[0])) - - # don't necessarily copy - result = self.panel.reindex( - major=self.panel.major_axis, copy=False) - assert_panel_equal(result, self.panel) - assert result is self.panel - def test_reindex_axis_style(self): panel = Panel(np.random.rand(5, 5, 5)) expected0 = Panel(panel.values).iloc[[0, 1]] @@ -1410,22 +370,6 @@ def test_reindex_axis_style(self): def test_reindex_multi(self): - # with and without copy full reindexing - result = self.panel.reindex( - items=self.panel.items, - major=self.panel.major_axis, - minor=self.panel.minor_axis, copy=False) - - assert result.items is self.panel.items - assert result.major_axis is self.panel.major_axis - assert result.minor_axis is self.panel.minor_axis - - result = self.panel.reindex( - items=self.panel.items, - major=self.panel.major_axis, - minor=self.panel.minor_axis, copy=False) - assert_panel_equal(result, self.panel) - # multi-axis indexing consistency # GH 5900 df = DataFrame(np.random.randn(4, 3)) @@ -1454,86 +398,7 @@ def test_reindex_multi(self): for i, r in enumerate(results): assert_panel_equal(expected, r) - def test_reindex_like(self): - # reindex_like - smaller = self.panel.reindex(items=self.panel.items[:-1], - major=self.panel.major_axis[:-1], - minor=self.panel.minor_axis[:-1]) - smaller_like = self.panel.reindex_like(smaller) - assert_panel_equal(smaller, smaller_like) - - def test_take(self): - # axis == 0 - result = self.panel.take([2, 0, 1], axis=0) - expected = self.panel.reindex(items=['ItemC', 'ItemA', 'ItemB']) - assert_panel_equal(result, expected) - - # axis >= 1 - result = self.panel.take([3, 0, 1, 2], axis=2) - expected = self.panel.reindex(minor=['D', 'A', 'B', 'C']) - assert_panel_equal(result, expected) - - # neg indices ok - expected = self.panel.reindex(minor=['D', 'D', 'B', 'C']) - result = self.panel.take([3, -1, 1, 2], axis=2) - assert_panel_equal(result, expected) - - pytest.raises(Exception, self.panel.take, [4, 0, 1, 2], axis=2) - - def test_sort_index(self): - import random - - ritems = list(self.panel.items) - rmajor = list(self.panel.major_axis) - rminor = list(self.panel.minor_axis) - random.shuffle(ritems) - random.shuffle(rmajor) - random.shuffle(rminor) - - random_order = self.panel.reindex(items=ritems) - sorted_panel = random_order.sort_index(axis=0) - assert_panel_equal(sorted_panel, self.panel) - - # descending - random_order = self.panel.reindex(items=ritems) - sorted_panel = random_order.sort_index(axis=0, ascending=False) - assert_panel_equal( - sorted_panel, - self.panel.reindex(items=self.panel.items[::-1])) - - random_order = self.panel.reindex(major=rmajor) - sorted_panel = random_order.sort_index(axis=1) - assert_panel_equal(sorted_panel, self.panel) - - random_order = self.panel.reindex(minor=rminor) - sorted_panel = random_order.sort_index(axis=2) - assert_panel_equal(sorted_panel, self.panel) - def test_fillna(self): - filled = self.panel.fillna(0) - assert np.isfinite(filled.values).all() - - filled = self.panel.fillna(method='backfill') - assert_frame_equal(filled['ItemA'], - self.panel['ItemA'].fillna(method='backfill')) - - panel = self.panel.copy() - panel['str'] = 'foo' - - filled = panel.fillna(method='backfill') - assert_frame_equal(filled['ItemA'], - panel['ItemA'].fillna(method='backfill')) - - empty = self.panel.reindex(items=[]) - filled = empty.fillna(0) - assert_panel_equal(filled, empty) - - pytest.raises(ValueError, self.panel.fillna) - pytest.raises(ValueError, self.panel.fillna, 5, method='ffill') - - pytest.raises(TypeError, self.panel.fillna, [1, 2]) - pytest.raises(TypeError, self.panel.fillna, (1, 2)) - # limit not implemented when only value is specified p = Panel(np.random.randn(3, 4, 5)) p.iloc[0:2, 0:2, 0:2] = np.nan @@ -1559,155 +424,6 @@ def test_fillna(self): p2.fillna(method='bfill', inplace=True) assert_panel_equal(p2, expected) - def test_ffill_bfill(self): - assert_panel_equal(self.panel.ffill(), - self.panel.fillna(method='ffill')) - assert_panel_equal(self.panel.bfill(), - self.panel.fillna(method='bfill')) - - def test_truncate_fillna_bug(self): - # #1823 - result = self.panel.truncate(before=None, after=None, axis='items') - - # it works! - result.fillna(value=0.0) - - def test_swapaxes(self): - result = self.panel.swapaxes('items', 'minor') - assert result.items is self.panel.minor_axis - - result = self.panel.swapaxes('items', 'major') - assert result.items is self.panel.major_axis - - result = self.panel.swapaxes('major', 'minor') - assert result.major_axis is self.panel.minor_axis - - panel = self.panel.copy() - result = panel.swapaxes('major', 'minor') - panel.values[0, 0, 1] = np.nan - expected = panel.swapaxes('major', 'minor') - assert_panel_equal(result, expected) - - # this should also work - result = self.panel.swapaxes(0, 1) - assert result.items is self.panel.major_axis - - # this works, but return a copy - result = self.panel.swapaxes('items', 'items') - assert_panel_equal(self.panel, result) - assert id(self.panel) != id(result) - - def test_transpose(self): - result = self.panel.transpose('minor', 'major', 'items') - expected = self.panel.swapaxes('items', 'minor') - assert_panel_equal(result, expected) - - # test kwargs - result = self.panel.transpose(items='minor', major='major', - minor='items') - expected = self.panel.swapaxes('items', 'minor') - assert_panel_equal(result, expected) - - # text mixture of args - result = self.panel.transpose( - 'minor', major='major', minor='items') - expected = self.panel.swapaxes('items', 'minor') - assert_panel_equal(result, expected) - - result = self.panel.transpose('minor', - 'major', - minor='items') - expected = self.panel.swapaxes('items', 'minor') - assert_panel_equal(result, expected) - - # duplicate axes - with pytest.raises(TypeError, - match='not enough/duplicate arguments'): - self.panel.transpose('minor', maj='major', minor='items') - - with pytest.raises(ValueError, - match='repeated axis in transpose'): - self.panel.transpose('minor', 'major', major='minor', - minor='items') - - result = self.panel.transpose(2, 1, 0) - assert_panel_equal(result, expected) - - result = self.panel.transpose('minor', 'items', 'major') - expected = self.panel.swapaxes('items', 'minor') - expected = expected.swapaxes('major', 'minor') - assert_panel_equal(result, expected) - - result = self.panel.transpose(2, 0, 1) - assert_panel_equal(result, expected) - - pytest.raises(ValueError, self.panel.transpose, 0, 0, 1) - - def test_transpose_copy(self): - panel = self.panel.copy() - result = panel.transpose(2, 0, 1, copy=True) - expected = panel.swapaxes('items', 'minor') - expected = expected.swapaxes('major', 'minor') - assert_panel_equal(result, expected) - - panel.values[0, 1, 1] = np.nan - assert notna(result.values[1, 0, 1]) - - def test_to_frame(self): - # filtered - filtered = self.panel.to_frame() - expected = self.panel.to_frame().dropna(how='any') - assert_frame_equal(filtered, expected) - - # unfiltered - unfiltered = self.panel.to_frame(filter_observations=False) - assert_panel_equal(unfiltered.to_panel(), self.panel) - - # names - assert unfiltered.index.names == ('major', 'minor') - - # unsorted, round trip - df = self.panel.to_frame(filter_observations=False) - unsorted = df.take(np.random.permutation(len(df))) - pan = unsorted.to_panel() - assert_panel_equal(pan, self.panel) - - # preserve original index names - df = DataFrame(np.random.randn(6, 2), - index=[['a', 'a', 'b', 'b', 'c', 'c'], - [0, 1, 0, 1, 0, 1]], - columns=['one', 'two']) - df.index.names = ['foo', 'bar'] - df.columns.name = 'baz' - - rdf = df.to_panel().to_frame() - assert rdf.index.names == df.index.names - assert rdf.columns.names == df.columns.names - - def test_to_frame_mixed(self): - panel = self.panel.fillna(0) - panel['str'] = 'foo' - panel['bool'] = panel['ItemA'] > 0 - - lp = panel.to_frame() - wp = lp.to_panel() - assert wp['bool'].values.dtype == np.bool_ - # Previously, this was mutating the underlying - # index and changing its name - assert_frame_equal(wp['bool'], panel['bool'], check_names=False) - - # GH 8704 - # with categorical - df = panel.to_frame() - df['category'] = df['str'].astype('category') - - # to_panel - # TODO: this converts back to object - p = df.to_panel() - expected = panel.copy() - expected['category'] = 'foo' - assert_panel_equal(p, expected) - def test_to_frame_multi_major(self): idx = MultiIndex.from_tuples( [(1, 'one'), (1, 'two'), (2, 'one'), (2, 'two')]) @@ -1808,22 +524,6 @@ def test_to_frame_multi_drop_level(self): expected = DataFrame({'i1': [1., 2], 'i2': [1., 2]}, index=exp_idx) assert_frame_equal(result, expected) - def test_to_panel_na_handling(self): - df = DataFrame(np.random.randint(0, 10, size=20).reshape((10, 2)), - index=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1], - [0, 1, 2, 3, 4, 5, 2, 3, 4, 5]]) - - panel = df.to_panel() - assert isna(panel[0].loc[1, [0, 1]]).all() - - def test_to_panel_duplicates(self): - # #2441 - df = DataFrame({'a': [0, 0, 1], 'b': [1, 1, 1], 'c': [1, 2, 3]}) - idf = df.set_index(['a', 'b']) - - with pytest.raises(ValueError, match='non-uniquely indexed'): - idf.to_panel() - def test_panel_dups(self): # GH 4960 @@ -1886,40 +586,7 @@ def test_panel_dups(self): def test_filter(self): pass - def test_compound(self): - compounded = self.panel.compound() - - assert_series_equal(compounded['ItemA'], - (1 + self.panel['ItemA']).product(0) - 1, - check_names=False) - def test_shift(self): - # major - idx = self.panel.major_axis[0] - idx_lag = self.panel.major_axis[1] - shifted = self.panel.shift(1) - assert_frame_equal(self.panel.major_xs(idx), - shifted.major_xs(idx_lag)) - - # minor - idx = self.panel.minor_axis[0] - idx_lag = self.panel.minor_axis[1] - shifted = self.panel.shift(1, axis='minor') - assert_frame_equal(self.panel.minor_xs(idx), - shifted.minor_xs(idx_lag)) - - # items - idx = self.panel.items[0] - idx_lag = self.panel.items[1] - shifted = self.panel.shift(1, axis='items') - assert_frame_equal(self.panel[idx], shifted[idx_lag]) - - # negative numbers, #2164 - result = self.panel.shift(-1) - expected = Panel({i: f.shift(-1)[:-1] - for i, f in self.panel.iteritems()}) - assert_panel_equal(result, expected) - # mixed dtypes #6959 data = [('item ' + ch, makeMixedDataFrame()) for ch in list('abcde')] @@ -1928,44 +595,6 @@ def test_shift(self): shifted = mixed_panel.shift(1) assert_series_equal(mixed_panel.dtypes, shifted.dtypes) - def test_tshift(self): - # PeriodIndex - ps = tm.makePeriodPanel() - shifted = ps.tshift(1) - unshifted = shifted.tshift(-1) - - assert_panel_equal(unshifted, ps) - - shifted2 = ps.tshift(freq='B') - assert_panel_equal(shifted, shifted2) - - shifted3 = ps.tshift(freq=BDay()) - assert_panel_equal(shifted, shifted3) - - with pytest.raises(ValueError, match='does not match'): - ps.tshift(freq='M') - - # DatetimeIndex - panel = make_test_panel() - shifted = panel.tshift(1) - unshifted = shifted.tshift(-1) - - assert_panel_equal(panel, unshifted) - - shifted2 = panel.tshift(freq=panel.major_axis.freq) - assert_panel_equal(shifted, shifted2) - - inferred_ts = Panel(panel.values, items=panel.items, - major_axis=Index(np.asarray(panel.major_axis)), - minor_axis=panel.minor_axis) - shifted = inferred_ts.tshift(1) - unshifted = shifted.tshift(-1) - assert_panel_equal(shifted, panel.tshift(1)) - assert_panel_equal(unshifted, inferred_ts) - - no_freq = panel.iloc[:, [0, 5, 7], :] - pytest.raises(ValueError, no_freq.tshift) - def test_pct_change(self): df1 = DataFrame({'c1': [1, 2, 5], 'c2': [3, 4, 6]}) df2 = df1 + 1 @@ -2078,97 +707,10 @@ def test_multiindex_get(self): MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)], names=['first', 'second']) - @pytest.mark.filterwarnings("ignore:Using a non-tuple:FutureWarning") - def test_multiindex_blocks(self): - ind = MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1)], - names=['first', 'second']) - wp = Panel(self.panel._data) - wp.items = ind - f1 = wp['a'] - assert (f1.items == [1, 2]).all() - - f1 = wp[('b', 1)] - assert (f1.columns == ['A', 'B', 'C', 'D']).all() - def test_repr_empty(self): empty = Panel() repr(empty) - # ignore warning from us, because removing panel - @pytest.mark.filterwarnings("ignore:Using:FutureWarning") - def test_rename(self): - mapper = {'ItemA': 'foo', 'ItemB': 'bar', 'ItemC': 'baz'} - - renamed = self.panel.rename(items=mapper) - exp = Index(['foo', 'bar', 'baz']) - tm.assert_index_equal(renamed.items, exp) - - renamed = self.panel.rename(minor_axis=str.lower) - exp = Index(['a', 'b', 'c', 'd']) - tm.assert_index_equal(renamed.minor_axis, exp) - - # don't copy - renamed_nocopy = self.panel.rename(items=mapper, copy=False) - renamed_nocopy['foo'] = 3. - assert (self.panel['ItemA'].values == 3).all() - - def test_get_attr(self): - assert_frame_equal(self.panel['ItemA'], self.panel.ItemA) - - # specific cases from #3440 - self.panel['a'] = self.panel['ItemA'] - assert_frame_equal(self.panel['a'], self.panel.a) - self.panel['i'] = self.panel['ItemA'] - assert_frame_equal(self.panel['i'], self.panel.i) - - def test_from_frame_level1_unsorted(self): - tuples = [('MSFT', 3), ('MSFT', 2), ('AAPL', 2), ('AAPL', 1), - ('MSFT', 1)] - midx = MultiIndex.from_tuples(tuples) - df = DataFrame(np.random.rand(5, 4), index=midx) - p = df.to_panel() - assert_frame_equal(p.minor_xs(2), df.xs(2, level=1).sort_index()) - - def test_to_excel(self): - try: - import xlwt # noqa - import xlrd # noqa - import openpyxl # noqa - from pandas.io.excel import ExcelFile - except ImportError: - pytest.skip("need xlwt xlrd openpyxl") - - for ext in ['xls', 'xlsx']: - with ensure_clean('__tmp__.' + ext) as path: - self.panel.to_excel(path) - try: - reader = ExcelFile(path) - except ImportError: - pytest.skip("need xlwt xlrd openpyxl") - - for item, df in self.panel.iteritems(): - recdf = reader.parse(str(item), index_col=0) - assert_frame_equal(df, recdf) - - def test_to_excel_xlsxwriter(self): - try: - import xlrd # noqa - import xlsxwriter # noqa - from pandas.io.excel import ExcelFile - except ImportError: - pytest.skip("Requires xlrd and xlsxwriter. Skipping test.") - - with ensure_clean('__tmp__.xlsx') as path: - self.panel.to_excel(path, engine='xlsxwriter') - try: - reader = ExcelFile(path) - except ImportError as e: - pytest.skip("cannot write excel file: %s" % e) - - for item, df in self.panel.iteritems(): - recdf = reader.parse(str(item), index_col=0) - assert_frame_equal(df, recdf) - @pytest.mark.filterwarnings("ignore:'.reindex:FutureWarning") def test_dropna(self): p = Panel(np.random.randn(4, 5, 6), major_axis=list('abcde')) @@ -2369,242 +911,6 @@ def test_update_deprecation(self, raise_conflict): with tm.assert_produces_warning(FutureWarning): pan.update(other, raise_conflict=raise_conflict) - def test_all_any(self): - assert (self.panel.all(axis=0).values == nanall( - self.panel, axis=0)).all() - assert (self.panel.all(axis=1).values == nanall( - self.panel, axis=1).T).all() - assert (self.panel.all(axis=2).values == nanall( - self.panel, axis=2).T).all() - assert (self.panel.any(axis=0).values == nanany( - self.panel, axis=0)).all() - assert (self.panel.any(axis=1).values == nanany( - self.panel, axis=1).T).all() - assert (self.panel.any(axis=2).values == nanany( - self.panel, axis=2).T).all() - - def test_all_any_unhandled(self): - pytest.raises(NotImplementedError, self.panel.all, bool_only=True) - pytest.raises(NotImplementedError, self.panel.any, bool_only=True) - - # GH issue 15960 - def test_sort_values(self): - pytest.raises(NotImplementedError, self.panel.sort_values) - pytest.raises(NotImplementedError, self.panel.sort_values, 'ItemA') - - -@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") -class TestPanelFrame(object): - """ - Check that conversions to and from Panel to DataFrame work. - """ - - def setup_method(self, method): - panel = make_test_panel() - self.panel = panel.to_frame() - self.unfiltered_panel = panel.to_frame(filter_observations=False) - - def test_ops_differently_indexed(self): - # trying to set non-identically indexed panel - wp = self.panel.to_panel() - wp2 = wp.reindex(major=wp.major_axis[:-1]) - lp2 = wp2.to_frame() - - result = self.panel + lp2 - assert_frame_equal(result.reindex(lp2.index), lp2 * 2) - - # careful, mutation - self.panel['foo'] = lp2['ItemA'] - assert_series_equal(self.panel['foo'].reindex(lp2.index), - lp2['ItemA'], - check_names=False) - - def test_ops_scalar(self): - result = self.panel.mul(2) - expected = DataFrame.__mul__(self.panel, 2) - assert_frame_equal(result, expected) - - def test_combineFrame(self): - wp = self.panel.to_panel() - result = self.panel.add(wp['ItemA'].stack(), axis=0) - assert_frame_equal(result.to_panel()['ItemA'], wp['ItemA'] * 2) - - def test_combinePanel(self): - wp = self.panel.to_panel() - result = self.panel.add(self.panel) - wide_result = result.to_panel() - assert_frame_equal(wp['ItemA'] * 2, wide_result['ItemA']) - - # one item - result = self.panel.add(self.panel.filter(['ItemA'])) - - def test_combine_scalar(self): - result = self.panel.mul(2) - expected = DataFrame(self.panel._data) * 2 - assert_frame_equal(result, expected) - - def test_combine_series(self): - s = self.panel['ItemA'][:10] - result = self.panel.add(s, axis=0) - expected = DataFrame.add(self.panel, s, axis=0) - assert_frame_equal(result, expected) - - s = self.panel.iloc[5] - result = self.panel + s - expected = DataFrame.add(self.panel, s, axis=1) - assert_frame_equal(result, expected) - - def test_operators(self): - wp = self.panel.to_panel() - result = (self.panel + 1).to_panel() - assert_frame_equal(wp['ItemA'] + 1, result['ItemA']) - - def test_arith_flex_panel(self): - ops = ['add', 'sub', 'mul', 'div', - 'truediv', 'pow', 'floordiv', 'mod'] - if not compat.PY3: - aliases = {} - else: - aliases = {'div': 'truediv'} - self.panel = self.panel.to_panel() - - for n in [np.random.randint(-50, -1), np.random.randint(1, 50), 0]: - for op in ops: - alias = aliases.get(op, op) - f = getattr(operator, alias) - exp = f(self.panel, n) - result = getattr(self.panel, op)(n) - assert_panel_equal(result, exp, check_panel_type=True) - - # rops - r_f = lambda x, y: f(y, x) - exp = r_f(self.panel, n) - result = getattr(self.panel, 'r' + op)(n) - assert_panel_equal(result, exp) - - def test_sort(self): - def is_sorted(arr): - return (arr[1:] > arr[:-1]).any() - - sorted_minor = self.panel.sort_index(level=1) - assert is_sorted(sorted_minor.index.codes[1]) - - sorted_major = sorted_minor.sort_index(level=0) - assert is_sorted(sorted_major.index.codes[0]) - - def test_to_string(self): - buf = StringIO() - self.panel.to_string(buf) - - def test_to_sparse(self): - if isinstance(self.panel, Panel): - msg = 'sparsifying is not supported' - with pytest.raises(NotImplementedError, match=msg): - self.panel.to_sparse - - def test_truncate(self): - dates = self.panel.index.levels[0] - start, end = dates[1], dates[5] - - trunced = self.panel.truncate(start, end).to_panel() - expected = self.panel.to_panel()['ItemA'].truncate(start, end) - - # TODO truncate drops index.names - assert_frame_equal(trunced['ItemA'], expected, check_names=False) - - trunced = self.panel.truncate(before=start).to_panel() - expected = self.panel.to_panel()['ItemA'].truncate(before=start) - - # TODO truncate drops index.names - assert_frame_equal(trunced['ItemA'], expected, check_names=False) - - trunced = self.panel.truncate(after=end).to_panel() - expected = self.panel.to_panel()['ItemA'].truncate(after=end) - - # TODO truncate drops index.names - assert_frame_equal(trunced['ItemA'], expected, check_names=False) - - # truncate on dates that aren't in there - wp = self.panel.to_panel() - new_index = wp.major_axis[::5] - - wp2 = wp.reindex(major=new_index) - - lp2 = wp2.to_frame() - lp_trunc = lp2.truncate(wp.major_axis[2], wp.major_axis[-2]) - - wp_trunc = wp2.truncate(wp.major_axis[2], wp.major_axis[-2]) - - assert_panel_equal(wp_trunc, lp_trunc.to_panel()) - - # throw proper exception - pytest.raises(Exception, lp2.truncate, wp.major_axis[-2], - wp.major_axis[2]) - - def test_axis_dummies(self): - from pandas.core.reshape.reshape import make_axis_dummies - - minor_dummies = make_axis_dummies(self.panel, 'minor').astype(np.uint8) - assert len(minor_dummies.columns) == len(self.panel.index.levels[1]) - - major_dummies = make_axis_dummies(self.panel, 'major').astype(np.uint8) - assert len(major_dummies.columns) == len(self.panel.index.levels[0]) - - mapping = {'A': 'one', 'B': 'one', 'C': 'two', 'D': 'two'} - - transformed = make_axis_dummies(self.panel, 'minor', - transform=mapping.get).astype(np.uint8) - assert len(transformed.columns) == 2 - tm.assert_index_equal(transformed.columns, Index(['one', 'two'])) - - # TODO: test correctness - - def test_get_dummies(self): - from pandas.core.reshape.reshape import get_dummies, make_axis_dummies - - self.panel['Label'] = self.panel.index.codes[1] - minor_dummies = make_axis_dummies(self.panel, 'minor').astype(np.uint8) - dummies = get_dummies(self.panel['Label']) - tm.assert_numpy_array_equal(dummies.values, minor_dummies.values) - - def test_mean(self): - means = self.panel.mean(level='minor') - - # test versus Panel version - wide_means = self.panel.to_panel().mean('major') - assert_frame_equal(means, wide_means) - - def test_sum(self): - sums = self.panel.sum(level='minor') - - # test versus Panel version - wide_sums = self.panel.to_panel().sum('major') - assert_frame_equal(sums, wide_sums) - - def test_count(self): - index = self.panel.index - - major_count = self.panel.count(level=0)['ItemA'] - level_codes = index.codes[0] - for i, idx in enumerate(index.levels[0]): - assert major_count[i] == (level_codes == i).sum() - - minor_count = self.panel.count(level=1)['ItemA'] - level_codes = index.codes[1] - for i, idx in enumerate(index.levels[1]): - assert minor_count[i] == (level_codes == i).sum() - - def test_join(self): - lp1 = self.panel.filter(['ItemA', 'ItemB']) - lp2 = self.panel.filter(['ItemC']) - - joined = lp1.join(lp2) - - assert len(joined.columns) == 3 - - pytest.raises(Exception, lp1.join, - self.panel.filter(['ItemB', 'ItemC'])) - def test_panel_index(): index = panelm.panel_index([1, 2, 3, 4], [1, 2, 3]) diff --git a/pandas/tests/tools/test_numeric.py b/pandas/tests/tools/test_numeric.py index 537881f3a5e85..97e1dc2f6aefc 100644 --- a/pandas/tests/tools/test_numeric.py +++ b/pandas/tests/tools/test_numeric.py @@ -4,437 +4,580 @@ from numpy import iinfo import pytest +import pandas.compat as compat + import pandas as pd -from pandas import to_numeric +from pandas import DataFrame, Index, Series, to_numeric from pandas.util import testing as tm -class TestToNumeric(object): +@pytest.fixture(params=[None, "ignore", "raise", "coerce"]) +def errors(request): + return request.param - def test_empty(self): - # see gh-16302 - s = pd.Series([], dtype=object) - res = to_numeric(s) - expected = pd.Series([], dtype=np.int64) +@pytest.fixture(params=[True, False]) +def signed(request): + return request.param - tm.assert_series_equal(res, expected) - # Original issue example - res = to_numeric(s, errors='coerce', downcast='integer') - expected = pd.Series([], dtype=np.int8) +@pytest.fixture(params=[lambda x: x, str], ids=["identity", "str"]) +def transform(request): + return request.param - tm.assert_series_equal(res, expected) - def test_series(self): - s = pd.Series(['1', '-3.14', '7']) - res = to_numeric(s) - expected = pd.Series([1, -3.14, 7]) - tm.assert_series_equal(res, expected) +@pytest.fixture(params=[ + 47393996303418497800, + 100000000000000000000 +]) +def large_val(request): + return request.param - s = pd.Series(['1', '-3.14', 7]) - res = to_numeric(s) - tm.assert_series_equal(res, expected) - def test_series_numeric(self): - s = pd.Series([1, 3, 4, 5], index=list('ABCD'), name='XXX') - res = to_numeric(s) - tm.assert_series_equal(res, s) +@pytest.fixture(params=[True, False]) +def multiple_elts(request): + return request.param - s = pd.Series([1., 3., 4., 5.], index=list('ABCD'), name='XXX') - res = to_numeric(s) - tm.assert_series_equal(res, s) - # bool is regarded as numeric - s = pd.Series([True, False, True, True], - index=list('ABCD'), name='XXX') - res = to_numeric(s) - tm.assert_series_equal(res, s) +@pytest.fixture(params=[ + (lambda x: Index(x, name="idx"), tm.assert_index_equal), + (lambda x: Series(x, name="ser"), tm.assert_series_equal), + (lambda x: np.array(Index(x).values), tm.assert_numpy_array_equal) +]) +def transform_assert_equal(request): + return request.param - def test_error(self): - s = pd.Series([1, -3.14, 'apple']) - msg = 'Unable to parse string "apple" at position 2' - with pytest.raises(ValueError, match=msg): - to_numeric(s, errors='raise') - res = to_numeric(s, errors='ignore') - expected = pd.Series([1, -3.14, 'apple']) - tm.assert_series_equal(res, expected) +@pytest.mark.parametrize("input_kwargs,result_kwargs", [ + (dict(), dict(dtype=np.int64)), + (dict(errors="coerce", downcast="integer"), dict(dtype=np.int8)) +]) +def test_empty(input_kwargs, result_kwargs): + # see gh-16302 + ser = Series([], dtype=object) + result = to_numeric(ser, **input_kwargs) - res = to_numeric(s, errors='coerce') - expected = pd.Series([1, -3.14, np.nan]) - tm.assert_series_equal(res, expected) + expected = Series([], **result_kwargs) + tm.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("last_val", ["7", 7]) +def test_series(last_val): + ser = Series(["1", "-3.14", last_val]) + result = to_numeric(ser) + + expected = Series([1, -3.14, 7]) + tm.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("data", [ + [1, 3, 4, 5], + [1., 3., 4., 5.], + + # Bool is regarded as numeric. + [True, False, True, True] +]) +def test_series_numeric(data): + ser = Series(data, index=list("ABCD"), name="EFG") + + result = to_numeric(ser) + tm.assert_series_equal(result, ser) + + +@pytest.mark.parametrize("data,msg", [ + ([1, -3.14, "apple"], + 'Unable to parse string "apple" at position 2'), + (["orange", 1, -3.14, "apple"], + 'Unable to parse string "orange" at position 0') +]) +def test_error(data, msg): + ser = Series(data) + + with pytest.raises(ValueError, match=msg): + to_numeric(ser, errors="raise") + + +@pytest.mark.parametrize("errors,exp_data", [ + ("ignore", [1, -3.14, "apple"]), + ("coerce", [1, -3.14, np.nan]) +]) +def test_ignore_error(errors, exp_data): + ser = Series([1, -3.14, "apple"]) + result = to_numeric(ser, errors=errors) + + expected = Series(exp_data) + tm.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("errors,exp", [ + ("raise", 'Unable to parse string "apple" at position 2'), + ("ignore", [True, False, "apple"]), + + # Coerces to float. + ("coerce", [1., 0., np.nan]) +]) +def test_bool_handling(errors, exp): + ser = Series([True, False, "apple"]) + + if isinstance(exp, str): + with pytest.raises(ValueError, match=exp): + to_numeric(ser, errors=errors) + else: + result = to_numeric(ser, errors=errors) + expected = Series(exp) + + tm.assert_series_equal(result, expected) + + +def test_list(): + ser = ["1", "-3.14", "7"] + res = to_numeric(ser) + + expected = np.array([1, -3.14, 7]) + tm.assert_numpy_array_equal(res, expected) + + +@pytest.mark.parametrize("data,arr_kwargs", [ + ([1, 3, 4, 5], dict(dtype=np.int64)), + ([1., 3., 4., 5.], dict()), + + # Boolean is regarded as numeric. + ([True, False, True, True], dict()) +]) +def test_list_numeric(data, arr_kwargs): + result = to_numeric(data) + expected = np.array(data, **arr_kwargs) + tm.assert_numpy_array_equal(result, expected) - s = pd.Series(['orange', 1, -3.14, 'apple']) - msg = 'Unable to parse string "orange" at position 0' - with pytest.raises(ValueError, match=msg): - to_numeric(s, errors='raise') - def test_error_seen_bool(self): - s = pd.Series([True, False, 'apple']) - msg = 'Unable to parse string "apple" at position 2' +@pytest.mark.parametrize("kwargs", [ + dict(dtype="O"), dict() +]) +def test_numeric(kwargs): + data = [1, -3.14, 7] + + ser = Series(data, **kwargs) + result = to_numeric(ser) + + expected = Series(data) + tm.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("columns", [ + # One column. + "a", + + # Multiple columns. + ["a", "b"] +]) +def test_numeric_df_columns(columns): + # see gh-14827 + df = DataFrame(dict( + a=[1.2, decimal.Decimal(3.14), decimal.Decimal("infinity"), "0.1"], + b=[1.0, 2.0, 3.0, 4.0], + )) + + expected = DataFrame(dict( + a=[1.2, 3.14, np.inf, 0.1], + b=[1.0, 2.0, 3.0, 4.0], + )) + + df_copy = df.copy() + df_copy[columns] = df_copy[columns].apply(to_numeric) + + tm.assert_frame_equal(df_copy, expected) + + +@pytest.mark.parametrize("data,exp_data", [ + ([[decimal.Decimal(3.14), 1.0], decimal.Decimal(1.6), 0.1], + [[3.14, 1.0], 1.6, 0.1]), + ([np.array([decimal.Decimal(3.14), 1.0]), 0.1], + [[3.14, 1.0], 0.1]) +]) +def test_numeric_embedded_arr_likes(data, exp_data): + # Test to_numeric with embedded lists and arrays + df = DataFrame(dict(a=data)) + df["a"] = df["a"].apply(to_numeric) + + expected = DataFrame(dict(a=exp_data)) + tm.assert_frame_equal(df, expected) + + +def test_all_nan(): + ser = Series(["a", "b", "c"]) + result = to_numeric(ser, errors="coerce") + + expected = Series([np.nan, np.nan, np.nan]) + tm.assert_series_equal(result, expected) + + +def test_type_check(errors): + # see gh-11776 + df = DataFrame({"a": [1, -3.14, 7], "b": ["4", "5", "6"]}) + kwargs = dict(errors=errors) if errors is not None else dict() + error_ctx = pytest.raises(TypeError, match="1-d array") + + with error_ctx: + to_numeric(df, **kwargs) + + +@pytest.mark.parametrize("val", [1, 1.1, 20001]) +def test_scalar(val, signed, transform): + val = -val if signed else val + assert to_numeric(transform(val)) == float(val) + + +def test_really_large_scalar(large_val, signed, transform, errors): + # see gh-24910 + kwargs = dict(errors=errors) if errors is not None else dict() + val = -large_val if signed else large_val + + val = transform(val) + val_is_string = isinstance(val, str) + + if val_is_string and errors in (None, "raise"): + msg = "Integer out of range. at position 0" with pytest.raises(ValueError, match=msg): - to_numeric(s, errors='raise') - - res = to_numeric(s, errors='ignore') - expected = pd.Series([True, False, 'apple']) - tm.assert_series_equal(res, expected) - - # coerces to float - res = to_numeric(s, errors='coerce') - expected = pd.Series([1., 0., np.nan]) - tm.assert_series_equal(res, expected) - - def test_list(self): - s = ['1', '-3.14', '7'] - res = to_numeric(s) - expected = np.array([1, -3.14, 7]) - tm.assert_numpy_array_equal(res, expected) - - def test_list_numeric(self): - s = [1, 3, 4, 5] - res = to_numeric(s) - tm.assert_numpy_array_equal(res, np.array(s, dtype=np.int64)) - - s = [1., 3., 4., 5.] - res = to_numeric(s) - tm.assert_numpy_array_equal(res, np.array(s)) - - # bool is regarded as numeric - s = [True, False, True, True] - res = to_numeric(s) - tm.assert_numpy_array_equal(res, np.array(s)) - - def test_numeric(self): - s = pd.Series([1, -3.14, 7], dtype='O') - res = to_numeric(s) - expected = pd.Series([1, -3.14, 7]) - tm.assert_series_equal(res, expected) - - s = pd.Series([1, -3.14, 7]) - res = to_numeric(s) - tm.assert_series_equal(res, expected) - - # GH 14827 - df = pd.DataFrame(dict( - a=[1.2, decimal.Decimal(3.14), decimal.Decimal("infinity"), '0.1'], - b=[1.0, 2.0, 3.0, 4.0], - )) - expected = pd.DataFrame(dict( - a=[1.2, 3.14, np.inf, 0.1], - b=[1.0, 2.0, 3.0, 4.0], - )) - - # Test to_numeric over one column - df_copy = df.copy() - df_copy['a'] = df_copy['a'].apply(to_numeric) - tm.assert_frame_equal(df_copy, expected) - - # Test to_numeric over multiple columns - df_copy = df.copy() - df_copy[['a', 'b']] = df_copy[['a', 'b']].apply(to_numeric) - tm.assert_frame_equal(df_copy, expected) - - def test_numeric_lists_and_arrays(self): - # Test to_numeric with embedded lists and arrays - df = pd.DataFrame(dict( - a=[[decimal.Decimal(3.14), 1.0], decimal.Decimal(1.6), 0.1] - )) - df['a'] = df['a'].apply(to_numeric) - expected = pd.DataFrame(dict( - a=[[3.14, 1.0], 1.6, 0.1], - )) - tm.assert_frame_equal(df, expected) - - df = pd.DataFrame(dict( - a=[np.array([decimal.Decimal(3.14), 1.0]), 0.1] - )) - df['a'] = df['a'].apply(to_numeric) - expected = pd.DataFrame(dict( - a=[[3.14, 1.0], 0.1], - )) - tm.assert_frame_equal(df, expected) - - def test_all_nan(self): - s = pd.Series(['a', 'b', 'c']) - res = to_numeric(s, errors='coerce') - expected = pd.Series([np.nan, np.nan, np.nan]) - tm.assert_series_equal(res, expected) - - @pytest.mark.parametrize("errors", [None, "ignore", "raise", "coerce"]) - def test_type_check(self, errors): - # see gh-11776 - df = pd.DataFrame({"a": [1, -3.14, 7], "b": ["4", "5", "6"]}) - kwargs = dict(errors=errors) if errors is not None else dict() - error_ctx = pytest.raises(TypeError, match="1-d array") - - with error_ctx: - to_numeric(df, **kwargs) - - def test_scalar(self): - assert pd.to_numeric(1) == 1 - assert pd.to_numeric(1.1) == 1.1 - - assert pd.to_numeric('1') == 1 - assert pd.to_numeric('1.1') == 1.1 - - with pytest.raises(ValueError): - to_numeric('XX', errors='raise') - - assert to_numeric('XX', errors='ignore') == 'XX' - assert np.isnan(to_numeric('XX', errors='coerce')) - - def test_numeric_dtypes(self): - idx = pd.Index([1, 2, 3], name='xxx') - res = pd.to_numeric(idx) - tm.assert_index_equal(res, idx) - - res = pd.to_numeric(pd.Series(idx, name='xxx')) - tm.assert_series_equal(res, pd.Series(idx, name='xxx')) - - res = pd.to_numeric(idx.values) - tm.assert_numpy_array_equal(res, idx.values) - - idx = pd.Index([1., np.nan, 3., np.nan], name='xxx') - res = pd.to_numeric(idx) - tm.assert_index_equal(res, idx) - - res = pd.to_numeric(pd.Series(idx, name='xxx')) - tm.assert_series_equal(res, pd.Series(idx, name='xxx')) - - res = pd.to_numeric(idx.values) - tm.assert_numpy_array_equal(res, idx.values) - - def test_str(self): - idx = pd.Index(['1', '2', '3'], name='xxx') - exp = np.array([1, 2, 3], dtype='int64') - res = pd.to_numeric(idx) - tm.assert_index_equal(res, pd.Index(exp, name='xxx')) - - res = pd.to_numeric(pd.Series(idx, name='xxx')) - tm.assert_series_equal(res, pd.Series(exp, name='xxx')) - - res = pd.to_numeric(idx.values) - tm.assert_numpy_array_equal(res, exp) - - idx = pd.Index(['1.5', '2.7', '3.4'], name='xxx') - exp = np.array([1.5, 2.7, 3.4]) - res = pd.to_numeric(idx) - tm.assert_index_equal(res, pd.Index(exp, name='xxx')) - - res = pd.to_numeric(pd.Series(idx, name='xxx')) - tm.assert_series_equal(res, pd.Series(exp, name='xxx')) - - res = pd.to_numeric(idx.values) - tm.assert_numpy_array_equal(res, exp) - - def test_datetime_like(self, tz_naive_fixture): - idx = pd.date_range("20130101", periods=3, - tz=tz_naive_fixture, name="xxx") - res = pd.to_numeric(idx) - tm.assert_index_equal(res, pd.Index(idx.asi8, name="xxx")) - - res = pd.to_numeric(pd.Series(idx, name="xxx")) - tm.assert_series_equal(res, pd.Series(idx.asi8, name="xxx")) - - res = pd.to_numeric(idx.values) - tm.assert_numpy_array_equal(res, idx.asi8) - - def test_timedelta(self): - idx = pd.timedelta_range('1 days', periods=3, freq='D', name='xxx') - res = pd.to_numeric(idx) - tm.assert_index_equal(res, pd.Index(idx.asi8, name='xxx')) - - res = pd.to_numeric(pd.Series(idx, name='xxx')) - tm.assert_series_equal(res, pd.Series(idx.asi8, name='xxx')) - - res = pd.to_numeric(idx.values) - tm.assert_numpy_array_equal(res, idx.asi8) - - def test_period(self): - idx = pd.period_range('2011-01', periods=3, freq='M', name='xxx') - res = pd.to_numeric(idx) - tm.assert_index_equal(res, pd.Index(idx.asi8, name='xxx')) - - # TODO: enable when we can support native PeriodDtype - # res = pd.to_numeric(pd.Series(idx, name='xxx')) - # tm.assert_series_equal(res, pd.Series(idx.asi8, name='xxx')) + to_numeric(val, **kwargs) + else: + expected = float(val) if (errors == "coerce" and + val_is_string) else val + assert tm.assert_almost_equal(to_numeric(val, **kwargs), expected) + - def test_non_hashable(self): - # Test for Bug #13324 - s = pd.Series([[10.0, 2], 1.0, 'apple']) - res = pd.to_numeric(s, errors='coerce') - tm.assert_series_equal(res, pd.Series([np.nan, 1.0, np.nan])) +def test_really_large_in_arr(large_val, signed, transform, + multiple_elts, errors): + # see gh-24910 + kwargs = dict(errors=errors) if errors is not None else dict() + val = -large_val if signed else large_val + val = transform(val) - res = pd.to_numeric(s, errors='ignore') - tm.assert_series_equal(res, pd.Series([[10.0, 2], 1.0, 'apple'])) + extra_elt = "string" + arr = [val] + multiple_elts * [extra_elt] - with pytest.raises(TypeError, match="Invalid object type"): - pd.to_numeric(s) + val_is_string = isinstance(val, str) + coercing = errors == "coerce" - @pytest.mark.parametrize("data", [ - ["1", 2, 3], - [1, 2, 3], - np.array(["1970-01-02", "1970-01-03", - "1970-01-04"], dtype="datetime64[D]") - ]) - def test_downcast_basic(self, data): - # see gh-13352 - invalid_downcast = "unsigned-integer" - msg = "invalid downcasting method provided" + if errors in (None, "raise") and (val_is_string or multiple_elts): + if val_is_string: + msg = "Integer out of range. at position 0" + else: + msg = 'Unable to parse string "string" at position 1' with pytest.raises(ValueError, match=msg): - pd.to_numeric(data, downcast=invalid_downcast) - - expected = np.array([1, 2, 3], dtype=np.int64) - - # Basic function tests. - res = pd.to_numeric(data) - tm.assert_numpy_array_equal(res, expected) - - res = pd.to_numeric(data, downcast=None) - tm.assert_numpy_array_equal(res, expected) - - # Basic dtype support. - smallest_uint_dtype = np.dtype(np.typecodes["UnsignedInteger"][0]) - - # Support below np.float32 is rare and far between. - float_32_char = np.dtype(np.float32).char - smallest_float_dtype = float_32_char - - expected = np.array([1, 2, 3], dtype=smallest_uint_dtype) - res = pd.to_numeric(data, downcast="unsigned") - tm.assert_numpy_array_equal(res, expected) - - expected = np.array([1, 2, 3], dtype=smallest_float_dtype) - res = pd.to_numeric(data, downcast="float") - tm.assert_numpy_array_equal(res, expected) - - @pytest.mark.parametrize("signed_downcast", ["integer", "signed"]) - @pytest.mark.parametrize("data", [ - ["1", 2, 3], - [1, 2, 3], - np.array(["1970-01-02", "1970-01-03", - "1970-01-04"], dtype="datetime64[D]") - ]) - def test_signed_downcast(self, data, signed_downcast): - # see gh-13352 - smallest_int_dtype = np.dtype(np.typecodes["Integer"][0]) - expected = np.array([1, 2, 3], dtype=smallest_int_dtype) - - res = pd.to_numeric(data, downcast=signed_downcast) - tm.assert_numpy_array_equal(res, expected) - - def test_ignore_downcast_invalid_data(self): - # If we can't successfully cast the given - # data to a numeric dtype, do not bother - # with the downcast parameter. - data = ["foo", 2, 3] - expected = np.array(data, dtype=object) - - res = pd.to_numeric(data, errors="ignore", - downcast="unsigned") - tm.assert_numpy_array_equal(res, expected) - - def test_ignore_downcast_neg_to_unsigned(self): - # Cannot cast to an unsigned integer - # because we have a negative number. - data = ["-1", 2, 3] - expected = np.array([-1, 2, 3], dtype=np.int64) - - res = pd.to_numeric(data, downcast="unsigned") - tm.assert_numpy_array_equal(res, expected) - - @pytest.mark.parametrize("downcast", ["integer", "signed", "unsigned"]) - @pytest.mark.parametrize("data,expected", [ - (["1.1", 2, 3], - np.array([1.1, 2, 3], dtype=np.float64)), - ([10000.0, 20000, 3000, 40000.36, 50000, 50000.00], - np.array([10000.0, 20000, 3000, - 40000.36, 50000, 50000.00], dtype=np.float64)) - ]) - def test_ignore_downcast_cannot_convert_float( - self, data, expected, downcast): - # Cannot cast to an integer (signed or unsigned) - # because we have a float number. - res = pd.to_numeric(data, downcast=downcast) - tm.assert_numpy_array_equal(res, expected) - - @pytest.mark.parametrize("downcast,expected_dtype", [ - ("integer", np.int16), - ("signed", np.int16), - ("unsigned", np.uint16) - ]) - def test_downcast_not8bit(self, downcast, expected_dtype): - # the smallest integer dtype need not be np.(u)int8 - data = ["256", 257, 258] - - expected = np.array([256, 257, 258], dtype=expected_dtype) - res = pd.to_numeric(data, downcast=downcast) - tm.assert_numpy_array_equal(res, expected) - - @pytest.mark.parametrize("dtype,downcast,min_max", [ - ("int8", "integer", [iinfo(np.int8).min, - iinfo(np.int8).max]), - ("int16", "integer", [iinfo(np.int16).min, - iinfo(np.int16).max]), - ('int32', "integer", [iinfo(np.int32).min, - iinfo(np.int32).max]), - ('int64', "integer", [iinfo(np.int64).min, - iinfo(np.int64).max]), - ('uint8', "unsigned", [iinfo(np.uint8).min, - iinfo(np.uint8).max]), - ('uint16', "unsigned", [iinfo(np.uint16).min, - iinfo(np.uint16).max]), - ('uint32', "unsigned", [iinfo(np.uint32).min, - iinfo(np.uint32).max]), - ('uint64', "unsigned", [iinfo(np.uint64).min, - iinfo(np.uint64).max]), - ('int16', "integer", [iinfo(np.int8).min, - iinfo(np.int8).max + 1]), - ('int32', "integer", [iinfo(np.int16).min, - iinfo(np.int16).max + 1]), - ('int64', "integer", [iinfo(np.int32).min, - iinfo(np.int32).max + 1]), - ('int16', "integer", [iinfo(np.int8).min - 1, - iinfo(np.int16).max]), - ('int32', "integer", [iinfo(np.int16).min - 1, - iinfo(np.int32).max]), - ('int64', "integer", [iinfo(np.int32).min - 1, - iinfo(np.int64).max]), - ('uint16', "unsigned", [iinfo(np.uint8).min, - iinfo(np.uint8).max + 1]), - ('uint32', "unsigned", [iinfo(np.uint16).min, - iinfo(np.uint16).max + 1]), - ('uint64', "unsigned", [iinfo(np.uint32).min, - iinfo(np.uint32).max + 1]) - ]) - def test_downcast_limits(self, dtype, downcast, min_max): - # see gh-14404: test the limits of each downcast. - series = pd.to_numeric(pd.Series(min_max), downcast=downcast) - assert series.dtype == dtype - - def test_coerce_uint64_conflict(self): - # see gh-17007 and gh-17125 - # - # Still returns float despite the uint64-nan conflict, - # which would normally force the casting to object. - df = pd.DataFrame({"a": [200, 300, "", "NaN", 30000000000000000000]}) - expected = pd.Series([200, 300, np.nan, np.nan, - 30000000000000000000], dtype=float, name="a") - result = to_numeric(df["a"], errors="coerce") - tm.assert_series_equal(result, expected) + to_numeric(arr, **kwargs) + else: + result = to_numeric(arr, **kwargs) + + exp_val = float(val) if (coercing and val_is_string) else val + expected = [exp_val] + + if multiple_elts: + if coercing: + expected.append(np.nan) + exp_dtype = float + else: + expected.append(extra_elt) + exp_dtype = object + else: + exp_dtype = float if isinstance(exp_val, ( + int, compat.long, float)) else object + + tm.assert_almost_equal(result, np.array(expected, dtype=exp_dtype)) + + +def test_really_large_in_arr_consistent(large_val, signed, + multiple_elts, errors): + # see gh-24910 + # + # Even if we discover that we have to hold float, does not mean + # we should be lenient on subsequent elements that fail to be integer. + kwargs = dict(errors=errors) if errors is not None else dict() + arr = [str(-large_val if signed else large_val)] + + if multiple_elts: + arr.insert(0, large_val) + + if errors in (None, "raise"): + index = int(multiple_elts) + msg = "Integer out of range. at position {index}".format(index=index) - s = pd.Series(["12345678901234567890", "1234567890", "ITEM"]) - expected = pd.Series([12345678901234567890, - 1234567890, np.nan], dtype=float) - result = to_numeric(s, errors="coerce") + with pytest.raises(ValueError, match=msg): + to_numeric(arr, **kwargs) + else: + result = to_numeric(arr, **kwargs) + + if errors == "coerce": + expected = [float(i) for i in arr] + exp_dtype = float + else: + expected = arr + exp_dtype = object + + tm.assert_almost_equal(result, np.array(expected, dtype=exp_dtype)) + + +@pytest.mark.parametrize("errors,checker", [ + ("raise", 'Unable to parse string "fail" at position 0'), + ("ignore", lambda x: x == "fail"), + ("coerce", lambda x: np.isnan(x)) +]) +def test_scalar_fail(errors, checker): + scalar = "fail" + + if isinstance(checker, str): + with pytest.raises(ValueError, match=checker): + to_numeric(scalar, errors=errors) + else: + assert checker(to_numeric(scalar, errors=errors)) + + +@pytest.mark.parametrize("data", [ + [1, 2, 3], + [1., np.nan, 3, np.nan] +]) +def test_numeric_dtypes(data, transform_assert_equal): + transform, assert_equal = transform_assert_equal + data = transform(data) + + result = to_numeric(data) + assert_equal(result, data) + + +@pytest.mark.parametrize("data,exp", [ + (["1", "2", "3"], np.array([1, 2, 3], dtype="int64")), + (["1.5", "2.7", "3.4"], np.array([1.5, 2.7, 3.4])) +]) +def test_str(data, exp, transform_assert_equal): + transform, assert_equal = transform_assert_equal + result = to_numeric(transform(data)) + + expected = transform(exp) + assert_equal(result, expected) + + +def test_datetime_like(tz_naive_fixture, transform_assert_equal): + transform, assert_equal = transform_assert_equal + idx = pd.date_range("20130101", periods=3, tz=tz_naive_fixture) + + result = to_numeric(transform(idx)) + expected = transform(idx.asi8) + assert_equal(result, expected) + + +def test_timedelta(transform_assert_equal): + transform, assert_equal = transform_assert_equal + idx = pd.timedelta_range("1 days", periods=3, freq="D") + + result = to_numeric(transform(idx)) + expected = transform(idx.asi8) + assert_equal(result, expected) + + +def test_period(transform_assert_equal): + transform, assert_equal = transform_assert_equal + + idx = pd.period_range("2011-01", periods=3, freq="M", name="") + inp = transform(idx) + + if isinstance(inp, Index): + result = to_numeric(inp) + expected = transform(idx.asi8) + assert_equal(result, expected) + else: + # TODO: PeriodDtype, so support it in to_numeric. + pytest.skip("Missing PeriodDtype support in to_numeric") + + +@pytest.mark.parametrize("errors,expected", [ + ("raise", "Invalid object type at position 0"), + ("ignore", Series([[10.0, 2], 1.0, "apple"])), + ("coerce", Series([np.nan, 1.0, np.nan])) +]) +def test_non_hashable(errors, expected): + # see gh-13324 + ser = Series([[10.0, 2], 1.0, "apple"]) + + if isinstance(expected, str): + with pytest.raises(TypeError, match=expected): + to_numeric(ser, errors=errors) + else: + result = to_numeric(ser, errors=errors) tm.assert_series_equal(result, expected) - # For completeness, check against "ignore" and "raise" - result = to_numeric(s, errors="ignore") - tm.assert_series_equal(result, s) - msg = "Unable to parse string" - with pytest.raises(ValueError, match=msg): - to_numeric(s, errors="raise") +def test_downcast_invalid_cast(): + # see gh-13352 + data = ["1", 2, 3] + invalid_downcast = "unsigned-integer" + msg = "invalid downcasting method provided" + + with pytest.raises(ValueError, match=msg): + to_numeric(data, downcast=invalid_downcast) + + +@pytest.mark.parametrize("data", [ + ["1", 2, 3], + [1, 2, 3], + np.array(["1970-01-02", "1970-01-03", + "1970-01-04"], dtype="datetime64[D]") +]) +@pytest.mark.parametrize("kwargs,exp_dtype", [ + # Basic function tests. + (dict(), np.int64), + (dict(downcast=None), np.int64), + + # Support below np.float32 is rare and far between. + (dict(downcast="float"), np.dtype(np.float32).char), + + # Basic dtype support. + (dict(downcast="unsigned"), np.dtype(np.typecodes["UnsignedInteger"][0])) +]) +def test_downcast_basic(data, kwargs, exp_dtype): + # see gh-13352 + result = to_numeric(data, **kwargs) + expected = np.array([1, 2, 3], dtype=exp_dtype) + tm.assert_numpy_array_equal(result, expected) + + +@pytest.mark.parametrize("signed_downcast", ["integer", "signed"]) +@pytest.mark.parametrize("data", [ + ["1", 2, 3], + [1, 2, 3], + np.array(["1970-01-02", "1970-01-03", + "1970-01-04"], dtype="datetime64[D]") +]) +def test_signed_downcast(data, signed_downcast): + # see gh-13352 + smallest_int_dtype = np.dtype(np.typecodes["Integer"][0]) + expected = np.array([1, 2, 3], dtype=smallest_int_dtype) + + res = to_numeric(data, downcast=signed_downcast) + tm.assert_numpy_array_equal(res, expected) + + +def test_ignore_downcast_invalid_data(): + # If we can't successfully cast the given + # data to a numeric dtype, do not bother + # with the downcast parameter. + data = ["foo", 2, 3] + expected = np.array(data, dtype=object) + + res = to_numeric(data, errors="ignore", + downcast="unsigned") + tm.assert_numpy_array_equal(res, expected) + + +def test_ignore_downcast_neg_to_unsigned(): + # Cannot cast to an unsigned integer + # because we have a negative number. + data = ["-1", 2, 3] + expected = np.array([-1, 2, 3], dtype=np.int64) + + res = to_numeric(data, downcast="unsigned") + tm.assert_numpy_array_equal(res, expected) + + +@pytest.mark.parametrize("downcast", ["integer", "signed", "unsigned"]) +@pytest.mark.parametrize("data,expected", [ + (["1.1", 2, 3], + np.array([1.1, 2, 3], dtype=np.float64)), + ([10000.0, 20000, 3000, 40000.36, 50000, 50000.00], + np.array([10000.0, 20000, 3000, + 40000.36, 50000, 50000.00], dtype=np.float64)) +]) +def test_ignore_downcast_cannot_convert_float(data, expected, downcast): + # Cannot cast to an integer (signed or unsigned) + # because we have a float number. + res = to_numeric(data, downcast=downcast) + tm.assert_numpy_array_equal(res, expected) + + +@pytest.mark.parametrize("downcast,expected_dtype", [ + ("integer", np.int16), + ("signed", np.int16), + ("unsigned", np.uint16) +]) +def test_downcast_not8bit(downcast, expected_dtype): + # the smallest integer dtype need not be np.(u)int8 + data = ["256", 257, 258] + + expected = np.array([256, 257, 258], dtype=expected_dtype) + res = to_numeric(data, downcast=downcast) + tm.assert_numpy_array_equal(res, expected) + + +@pytest.mark.parametrize("dtype,downcast,min_max", [ + ("int8", "integer", [iinfo(np.int8).min, + iinfo(np.int8).max]), + ("int16", "integer", [iinfo(np.int16).min, + iinfo(np.int16).max]), + ("int32", "integer", [iinfo(np.int32).min, + iinfo(np.int32).max]), + ("int64", "integer", [iinfo(np.int64).min, + iinfo(np.int64).max]), + ("uint8", "unsigned", [iinfo(np.uint8).min, + iinfo(np.uint8).max]), + ("uint16", "unsigned", [iinfo(np.uint16).min, + iinfo(np.uint16).max]), + ("uint32", "unsigned", [iinfo(np.uint32).min, + iinfo(np.uint32).max]), + ("uint64", "unsigned", [iinfo(np.uint64).min, + iinfo(np.uint64).max]), + ("int16", "integer", [iinfo(np.int8).min, + iinfo(np.int8).max + 1]), + ("int32", "integer", [iinfo(np.int16).min, + iinfo(np.int16).max + 1]), + ("int64", "integer", [iinfo(np.int32).min, + iinfo(np.int32).max + 1]), + ("int16", "integer", [iinfo(np.int8).min - 1, + iinfo(np.int16).max]), + ("int32", "integer", [iinfo(np.int16).min - 1, + iinfo(np.int32).max]), + ("int64", "integer", [iinfo(np.int32).min - 1, + iinfo(np.int64).max]), + ("uint16", "unsigned", [iinfo(np.uint8).min, + iinfo(np.uint8).max + 1]), + ("uint32", "unsigned", [iinfo(np.uint16).min, + iinfo(np.uint16).max + 1]), + ("uint64", "unsigned", [iinfo(np.uint32).min, + iinfo(np.uint32).max + 1]) +]) +def test_downcast_limits(dtype, downcast, min_max): + # see gh-14404: test the limits of each downcast. + series = to_numeric(Series(min_max), downcast=downcast) + assert series.dtype == dtype + + +@pytest.mark.parametrize("data,exp_data", [ + ([200, 300, "", "NaN", 30000000000000000000], + [200, 300, np.nan, np.nan, 30000000000000000000]), + (["12345678901234567890", "1234567890", "ITEM"], + [12345678901234567890, 1234567890, np.nan]) +]) +def test_coerce_uint64_conflict(data, exp_data): + # see gh-17007 and gh-17125 + # + # Still returns float despite the uint64-nan conflict, + # which would normally force the casting to object. + result = to_numeric(Series(data), errors="coerce") + expected = Series(exp_data, dtype=float) + tm.assert_series_equal(result, expected) + + +@pytest.mark.parametrize("errors,exp", [ + ("ignore", Series(["12345678901234567890", "1234567890", "ITEM"])), + ("raise", "Unable to parse string") +]) +def test_non_coerce_uint64_conflict(errors, exp): + # see gh-17007 and gh-17125 + # + # For completeness. + ser = Series(["12345678901234567890", "1234567890", "ITEM"]) + + if isinstance(exp, str): + with pytest.raises(ValueError, match=exp): + to_numeric(ser, errors=errors) + else: + result = to_numeric(ser, errors=errors) + tm.assert_series_equal(result, ser) diff --git a/doc/source/api/scalars.rst b/pandas/tests/tseries/holiday/__init__.py similarity index 100% rename from doc/source/api/scalars.rst rename to pandas/tests/tseries/holiday/__init__.py diff --git a/pandas/tests/tseries/holiday/test_calendar.py b/pandas/tests/tseries/holiday/test_calendar.py new file mode 100644 index 0000000000000..a5cc4095ce583 --- /dev/null +++ b/pandas/tests/tseries/holiday/test_calendar.py @@ -0,0 +1,77 @@ +from datetime import datetime + +import pytest + +from pandas import DatetimeIndex +import pandas.util.testing as tm + +from pandas.tseries.holiday import ( + AbstractHolidayCalendar, Holiday, Timestamp, USFederalHolidayCalendar, + USThanksgivingDay, get_calendar) + + +@pytest.mark.parametrize("transform", [ + lambda x: x, + lambda x: x.strftime("%Y-%m-%d"), + lambda x: Timestamp(x) +]) +def test_calendar(transform): + start_date = datetime(2012, 1, 1) + end_date = datetime(2012, 12, 31) + + calendar = USFederalHolidayCalendar() + holidays = calendar.holidays(transform(start_date), transform(end_date)) + + expected = [ + datetime(2012, 1, 2), + datetime(2012, 1, 16), + datetime(2012, 2, 20), + datetime(2012, 5, 28), + datetime(2012, 7, 4), + datetime(2012, 9, 3), + datetime(2012, 10, 8), + datetime(2012, 11, 12), + datetime(2012, 11, 22), + datetime(2012, 12, 25) + ] + + assert list(holidays.to_pydatetime()) == expected + + +def test_calendar_caching(): + # see gh-9552. + + class TestCalendar(AbstractHolidayCalendar): + def __init__(self, name=None, rules=None): + super(TestCalendar, self).__init__(name=name, rules=rules) + + jan1 = TestCalendar(rules=[Holiday("jan1", year=2015, month=1, day=1)]) + jan2 = TestCalendar(rules=[Holiday("jan2", year=2015, month=1, day=2)]) + + # Getting holidays for Jan 1 should not alter results for Jan 2. + tm.assert_index_equal(jan1.holidays(), DatetimeIndex(["01-Jan-2015"])) + tm.assert_index_equal(jan2.holidays(), DatetimeIndex(["02-Jan-2015"])) + + +def test_calendar_observance_dates(): + # see gh-11477 + us_fed_cal = get_calendar("USFederalHolidayCalendar") + holidays0 = us_fed_cal.holidays(datetime(2015, 7, 3), datetime( + 2015, 7, 3)) # <-- same start and end dates + holidays1 = us_fed_cal.holidays(datetime(2015, 7, 3), datetime( + 2015, 7, 6)) # <-- different start and end dates + holidays2 = us_fed_cal.holidays(datetime(2015, 7, 3), datetime( + 2015, 7, 3)) # <-- same start and end dates + + # These should all produce the same result. + # + # In addition, calling with different start and end + # dates should not alter the output if we call the + # function again with the same start and end date. + tm.assert_index_equal(holidays0, holidays1) + tm.assert_index_equal(holidays0, holidays2) + + +def test_rule_from_name(): + us_fed_cal = get_calendar("USFederalHolidayCalendar") + assert us_fed_cal.rule_from_name("Thanksgiving") == USThanksgivingDay diff --git a/pandas/tests/tseries/holiday/test_federal.py b/pandas/tests/tseries/holiday/test_federal.py new file mode 100644 index 0000000000000..62b5ab2b849ae --- /dev/null +++ b/pandas/tests/tseries/holiday/test_federal.py @@ -0,0 +1,36 @@ +from datetime import datetime + +from pandas.tseries.holiday import ( + AbstractHolidayCalendar, USMartinLutherKingJr, USMemorialDay) + + +def test_no_mlk_before_1986(): + # see gh-10278 + class MLKCalendar(AbstractHolidayCalendar): + rules = [USMartinLutherKingJr] + + holidays = MLKCalendar().holidays(start="1984", + end="1988").to_pydatetime().tolist() + + # Testing to make sure holiday is not incorrectly observed before 1986. + assert holidays == [datetime(1986, 1, 20, 0, 0), + datetime(1987, 1, 19, 0, 0)] + + +def test_memorial_day(): + class MemorialDay(AbstractHolidayCalendar): + rules = [USMemorialDay] + + holidays = MemorialDay().holidays(start="1971", + end="1980").to_pydatetime().tolist() + + # Fixes 5/31 error and checked manually against Wikipedia. + assert holidays == [datetime(1971, 5, 31, 0, 0), + datetime(1972, 5, 29, 0, 0), + datetime(1973, 5, 28, 0, 0), + datetime(1974, 5, 27, 0, 0), + datetime(1975, 5, 26, 0, 0), + datetime(1976, 5, 31, 0, 0), + datetime(1977, 5, 30, 0, 0), + datetime(1978, 5, 29, 0, 0), + datetime(1979, 5, 28, 0, 0)] diff --git a/pandas/tests/tseries/holiday/test_holiday.py b/pandas/tests/tseries/holiday/test_holiday.py new file mode 100644 index 0000000000000..27bba1cc89dee --- /dev/null +++ b/pandas/tests/tseries/holiday/test_holiday.py @@ -0,0 +1,193 @@ +from datetime import datetime + +import pytest +from pytz import utc + +import pandas.util.testing as tm + +from pandas.tseries.holiday import ( + MO, SA, AbstractHolidayCalendar, DateOffset, EasterMonday, GoodFriday, + Holiday, HolidayCalendarFactory, Timestamp, USColumbusDay, USLaborDay, + USMartinLutherKingJr, USMemorialDay, USPresidentsDay, USThanksgivingDay, + get_calendar, next_monday) + + +def _check_holiday_results(holiday, start, end, expected): + """ + Check that the dates for a given holiday match in date and timezone. + + Parameters + ---------- + holiday : Holiday + The holiday to check. + start : datetime-like + The start date of range in which to collect dates for a given holiday. + end : datetime-like + The end date of range in which to collect dates for a given holiday. + expected : list + The list of dates we expect to get. + """ + assert list(holiday.dates(start, end)) == expected + + # Verify that timezone info is preserved. + assert (list(holiday.dates(utc.localize(Timestamp(start)), + utc.localize(Timestamp(end)))) == + [utc.localize(dt) for dt in expected]) + + +@pytest.mark.parametrize("holiday,start_date,end_date,expected", [ + (USMemorialDay, datetime(2011, 1, 1), datetime(2020, 12, 31), + [datetime(2011, 5, 30), datetime(2012, 5, 28), datetime(2013, 5, 27), + datetime(2014, 5, 26), datetime(2015, 5, 25), datetime(2016, 5, 30), + datetime(2017, 5, 29), datetime(2018, 5, 28), datetime(2019, 5, 27), + datetime(2020, 5, 25)]), + + (Holiday("July 4th Eve", month=7, day=3), "2001-01-01", "2003-03-03", + [Timestamp("2001-07-03 00:00:00"), Timestamp("2002-07-03 00:00:00")]), + (Holiday("July 4th Eve", month=7, day=3, days_of_week=(0, 1, 2, 3)), + "2001-01-01", "2008-03-03", [ + Timestamp("2001-07-03 00:00:00"), Timestamp("2002-07-03 00:00:00"), + Timestamp("2003-07-03 00:00:00"), Timestamp("2006-07-03 00:00:00"), + Timestamp("2007-07-03 00:00:00")]), + + (EasterMonday, datetime(2011, 1, 1), datetime(2020, 12, 31), + [Timestamp("2011-04-25 00:00:00"), Timestamp("2012-04-09 00:00:00"), + Timestamp("2013-04-01 00:00:00"), Timestamp("2014-04-21 00:00:00"), + Timestamp("2015-04-06 00:00:00"), Timestamp("2016-03-28 00:00:00"), + Timestamp("2017-04-17 00:00:00"), Timestamp("2018-04-02 00:00:00"), + Timestamp("2019-04-22 00:00:00"), Timestamp("2020-04-13 00:00:00")]), + (GoodFriday, datetime(2011, 1, 1), datetime(2020, 12, 31), + [Timestamp("2011-04-22 00:00:00"), Timestamp("2012-04-06 00:00:00"), + Timestamp("2013-03-29 00:00:00"), Timestamp("2014-04-18 00:00:00"), + Timestamp("2015-04-03 00:00:00"), Timestamp("2016-03-25 00:00:00"), + Timestamp("2017-04-14 00:00:00"), Timestamp("2018-03-30 00:00:00"), + Timestamp("2019-04-19 00:00:00"), Timestamp("2020-04-10 00:00:00")]), + + (USThanksgivingDay, datetime(2011, 1, 1), datetime(2020, 12, 31), + [datetime(2011, 11, 24), datetime(2012, 11, 22), datetime(2013, 11, 28), + datetime(2014, 11, 27), datetime(2015, 11, 26), datetime(2016, 11, 24), + datetime(2017, 11, 23), datetime(2018, 11, 22), datetime(2019, 11, 28), + datetime(2020, 11, 26)]) +]) +def test_holiday_dates(holiday, start_date, end_date, expected): + _check_holiday_results(holiday, start_date, end_date, expected) + + +@pytest.mark.parametrize("holiday,start,expected", [ + (USMemorialDay, datetime(2015, 7, 1), []), + (USMemorialDay, "2015-05-25", "2015-05-25"), + + (USLaborDay, datetime(2015, 7, 1), []), + (USLaborDay, "2015-09-07", "2015-09-07"), + + (USColumbusDay, datetime(2015, 7, 1), []), + (USColumbusDay, "2015-10-12", "2015-10-12"), + + (USThanksgivingDay, datetime(2015, 7, 1), []), + (USThanksgivingDay, "2015-11-26", "2015-11-26"), + + (USMartinLutherKingJr, datetime(2015, 7, 1), []), + (USMartinLutherKingJr, "2015-01-19", "2015-01-19"), + + (USPresidentsDay, datetime(2015, 7, 1), []), + (USPresidentsDay, "2015-02-16", "2015-02-16"), + + (GoodFriday, datetime(2015, 7, 1), []), + (GoodFriday, "2015-04-03", "2015-04-03"), + + (EasterMonday, "2015-04-06", "2015-04-06"), + (EasterMonday, datetime(2015, 7, 1), []), + (EasterMonday, "2015-04-05", []), + + ("New Years Day", "2015-01-01", "2015-01-01"), + ("New Years Day", "2010-12-31", "2010-12-31"), + ("New Years Day", datetime(2015, 7, 1), []), + ("New Years Day", "2011-01-01", []), + + ("July 4th", "2015-07-03", "2015-07-03"), + ("July 4th", datetime(2015, 7, 1), []), + ("July 4th", "2015-07-04", []), + + ("Veterans Day", "2012-11-12", "2012-11-12"), + ("Veterans Day", datetime(2015, 7, 1), []), + ("Veterans Day", "2012-11-11", []), + + ("Christmas", "2011-12-26", "2011-12-26"), + ("Christmas", datetime(2015, 7, 1), []), + ("Christmas", "2011-12-25", []), +]) +def test_holidays_within_dates(holiday, start, expected): + # see gh-11477 + # + # Fix holiday behavior where holiday.dates returned dates outside + # start/end date, or observed rules could not be applied because the + # holiday was not in the original date range (e.g., 7/4/2015 -> 7/3/2015). + if isinstance(holiday, str): + calendar = get_calendar("USFederalHolidayCalendar") + holiday = calendar.rule_from_name(holiday) + + if isinstance(expected, str): + expected = [Timestamp(expected)] + + _check_holiday_results(holiday, start, start, expected) + + +@pytest.mark.parametrize("transform", [ + lambda x: x.strftime("%Y-%m-%d"), + lambda x: Timestamp(x) +]) +def test_argument_types(transform): + start_date = datetime(2011, 1, 1) + end_date = datetime(2020, 12, 31) + + holidays = USThanksgivingDay.dates(start_date, end_date) + holidays2 = USThanksgivingDay.dates( + transform(start_date), transform(end_date)) + tm.assert_index_equal(holidays, holidays2) + + +@pytest.mark.parametrize("name,kwargs", [ + ("One-Time", dict(year=2012, month=5, day=28)), + ("Range", dict(month=5, day=28, start_date=datetime(2012, 1, 1), + end_date=datetime(2012, 12, 31), + offset=DateOffset(weekday=MO(1)))) +]) +def test_special_holidays(name, kwargs): + base_date = [datetime(2012, 5, 28)] + holiday = Holiday(name, **kwargs) + + start_date = datetime(2011, 1, 1) + end_date = datetime(2020, 12, 31) + + assert base_date == holiday.dates(start_date, end_date) + + +def test_get_calendar(): + class TestCalendar(AbstractHolidayCalendar): + rules = [] + + calendar = get_calendar("TestCalendar") + assert TestCalendar == calendar.__class__ + + +def test_factory(): + class_1 = HolidayCalendarFactory("MemorialDay", + AbstractHolidayCalendar, + USMemorialDay) + class_2 = HolidayCalendarFactory("Thanksgiving", + AbstractHolidayCalendar, + USThanksgivingDay) + class_3 = HolidayCalendarFactory("Combined", class_1, class_2) + + assert len(class_1.rules) == 1 + assert len(class_2.rules) == 1 + assert len(class_3.rules) == 2 + + +def test_both_offset_observance_raises(): + # see gh-10217 + msg = "Cannot use both offset and observance" + with pytest.raises(NotImplementedError, match=msg): + Holiday("Cyber Monday", month=11, day=1, + offset=[DateOffset(weekday=SA(4))], + observance=next_monday) diff --git a/pandas/tests/tseries/holiday/test_observance.py b/pandas/tests/tseries/holiday/test_observance.py new file mode 100644 index 0000000000000..1c22918b2efd8 --- /dev/null +++ b/pandas/tests/tseries/holiday/test_observance.py @@ -0,0 +1,93 @@ +from datetime import datetime + +import pytest + +from pandas.tseries.holiday import ( + after_nearest_workday, before_nearest_workday, nearest_workday, + next_monday, next_monday_or_tuesday, next_workday, previous_friday, + previous_workday, sunday_to_monday, weekend_to_monday) + +_WEDNESDAY = datetime(2014, 4, 9) +_THURSDAY = datetime(2014, 4, 10) +_FRIDAY = datetime(2014, 4, 11) +_SATURDAY = datetime(2014, 4, 12) +_SUNDAY = datetime(2014, 4, 13) +_MONDAY = datetime(2014, 4, 14) +_TUESDAY = datetime(2014, 4, 15) + + +@pytest.mark.parametrize("day", [_SATURDAY, _SUNDAY]) +def test_next_monday(day): + assert next_monday(day) == _MONDAY + + +@pytest.mark.parametrize("day,expected", [ + (_SATURDAY, _MONDAY), + (_SUNDAY, _TUESDAY), + (_MONDAY, _TUESDAY) +]) +def test_next_monday_or_tuesday(day, expected): + assert next_monday_or_tuesday(day) == expected + + +@pytest.mark.parametrize("day", [_SATURDAY, _SUNDAY]) +def test_previous_friday(day): + assert previous_friday(day) == _FRIDAY + + +def test_sunday_to_monday(): + assert sunday_to_monday(_SUNDAY) == _MONDAY + + +@pytest.mark.parametrize("day,expected", [ + (_SATURDAY, _FRIDAY), + (_SUNDAY, _MONDAY), + (_MONDAY, _MONDAY) +]) +def test_nearest_workday(day, expected): + assert nearest_workday(day) == expected + + +@pytest.mark.parametrize("day,expected", [ + (_SATURDAY, _MONDAY), + (_SUNDAY, _MONDAY), + (_MONDAY, _MONDAY) +]) +def test_weekend_to_monday(day, expected): + assert weekend_to_monday(day) == expected + + +@pytest.mark.parametrize("day,expected", [ + (_SATURDAY, _MONDAY), + (_SUNDAY, _MONDAY), + (_MONDAY, _TUESDAY) +]) +def test_next_workday(day, expected): + assert next_workday(day) == expected + + +@pytest.mark.parametrize("day,expected", [ + (_SATURDAY, _FRIDAY), + (_SUNDAY, _FRIDAY), + (_TUESDAY, _MONDAY) +]) +def test_previous_workday(day, expected): + assert previous_workday(day) == expected + + +@pytest.mark.parametrize("day,expected", [ + (_SATURDAY, _THURSDAY), + (_SUNDAY, _FRIDAY), + (_TUESDAY, _MONDAY) +]) +def test_before_nearest_workday(day, expected): + assert before_nearest_workday(day) == expected + + +@pytest.mark.parametrize("day,expected", [ + (_SATURDAY, _MONDAY), + (_SUNDAY, _TUESDAY), + (_FRIDAY, _MONDAY) +]) +def test_after_nearest_workday(day, expected): + assert after_nearest_workday(day) == expected diff --git a/pandas/tests/tseries/offsets/test_offsets.py b/pandas/tests/tseries/offsets/test_offsets.py index ac3955970587f..621572da57541 100644 --- a/pandas/tests/tseries/offsets/test_offsets.py +++ b/pandas/tests/tseries/offsets/test_offsets.py @@ -257,6 +257,26 @@ def test_offset_n(self, offset_types): mul_offset = offset * 3 assert mul_offset.n == 3 + def test_offset_timedelta64_arg(self, offset_types): + # check that offset._validate_n raises TypeError on a timedelt64 + # object + off = self._get_offset(offset_types) + + td64 = np.timedelta64(4567, 's') + with pytest.raises(TypeError, match="argument must be an integer"): + type(off)(n=td64, **off.kwds) + + def test_offset_mul_ndarray(self, offset_types): + off = self._get_offset(offset_types) + + expected = np.array([[off, off * 2], [off * 3, off * 4]]) + + result = np.array([[1, 2], [3, 4]]) * off + tm.assert_numpy_array_equal(result, expected) + + result = off * np.array([[1, 2], [3, 4]]) + tm.assert_numpy_array_equal(result, expected) + def test_offset_freqstr(self, offset_types): offset = self._get_offset(offset_types) diff --git a/pandas/tests/tseries/offsets/test_ticks.py b/pandas/tests/tseries/offsets/test_ticks.py index f4b012ec1897f..9a8251201f75f 100644 --- a/pandas/tests/tseries/offsets/test_ticks.py +++ b/pandas/tests/tseries/offsets/test_ticks.py @@ -11,6 +11,7 @@ import pytest from pandas import Timedelta, Timestamp +import pandas.util.testing as tm from pandas.tseries import offsets from pandas.tseries.offsets import Hour, Micro, Milli, Minute, Nano, Second @@ -262,6 +263,28 @@ def test_tick_division(cls): assert result.delta == off.delta / .001 +@pytest.mark.parametrize('cls', tick_classes) +def test_tick_rdiv(cls): + off = cls(10) + delta = off.delta + td64 = delta.to_timedelta64() + + with pytest.raises(TypeError): + 2 / off + with pytest.raises(TypeError): + 2.0 / off + + assert (td64 * 2.5) / off == 2.5 + + if cls is not Nano: + # skip pytimedelta for Nano since it gets dropped + assert (delta.to_pytimedelta() * 2) / off == 2 + + result = np.array([2 * td64, td64]) / off + expected = np.array([2., 1.]) + tm.assert_numpy_array_equal(result, expected) + + @pytest.mark.parametrize('cls1', tick_classes) @pytest.mark.parametrize('cls2', tick_classes) def test_tick_zero(cls1, cls2): diff --git a/pandas/tests/tseries/test_holiday.py b/pandas/tests/tseries/test_holiday.py deleted file mode 100644 index 86f154ed1acc2..0000000000000 --- a/pandas/tests/tseries/test_holiday.py +++ /dev/null @@ -1,382 +0,0 @@ -from datetime import datetime - -import pytest -from pytz import utc - -from pandas import DatetimeIndex, compat -import pandas.util.testing as tm - -from pandas.tseries.holiday import ( - MO, SA, AbstractHolidayCalendar, DateOffset, EasterMonday, GoodFriday, - Holiday, HolidayCalendarFactory, Timestamp, USColumbusDay, - USFederalHolidayCalendar, USLaborDay, USMartinLutherKingJr, USMemorialDay, - USPresidentsDay, USThanksgivingDay, after_nearest_workday, - before_nearest_workday, get_calendar, nearest_workday, next_monday, - next_monday_or_tuesday, next_workday, previous_friday, previous_workday, - sunday_to_monday, weekend_to_monday) - - -class TestCalendar(object): - - def setup_method(self, method): - self.holiday_list = [ - datetime(2012, 1, 2), - datetime(2012, 1, 16), - datetime(2012, 2, 20), - datetime(2012, 5, 28), - datetime(2012, 7, 4), - datetime(2012, 9, 3), - datetime(2012, 10, 8), - datetime(2012, 11, 12), - datetime(2012, 11, 22), - datetime(2012, 12, 25)] - - self.start_date = datetime(2012, 1, 1) - self.end_date = datetime(2012, 12, 31) - - def test_calendar(self): - - calendar = USFederalHolidayCalendar() - holidays = calendar.holidays(self.start_date, self.end_date) - - holidays_1 = calendar.holidays( - self.start_date.strftime('%Y-%m-%d'), - self.end_date.strftime('%Y-%m-%d')) - holidays_2 = calendar.holidays( - Timestamp(self.start_date), - Timestamp(self.end_date)) - - assert list(holidays.to_pydatetime()) == self.holiday_list - assert list(holidays_1.to_pydatetime()) == self.holiday_list - assert list(holidays_2.to_pydatetime()) == self.holiday_list - - def test_calendar_caching(self): - # Test for issue #9552 - - class TestCalendar(AbstractHolidayCalendar): - - def __init__(self, name=None, rules=None): - super(TestCalendar, self).__init__(name=name, rules=rules) - - jan1 = TestCalendar(rules=[Holiday('jan1', year=2015, month=1, day=1)]) - jan2 = TestCalendar(rules=[Holiday('jan2', year=2015, month=1, day=2)]) - - tm.assert_index_equal(jan1.holidays(), DatetimeIndex(['01-Jan-2015'])) - tm.assert_index_equal(jan2.holidays(), DatetimeIndex(['02-Jan-2015'])) - - def test_calendar_observance_dates(self): - # Test for issue 11477 - USFedCal = get_calendar('USFederalHolidayCalendar') - holidays0 = USFedCal.holidays(datetime(2015, 7, 3), datetime( - 2015, 7, 3)) # <-- same start and end dates - holidays1 = USFedCal.holidays(datetime(2015, 7, 3), datetime( - 2015, 7, 6)) # <-- different start and end dates - holidays2 = USFedCal.holidays(datetime(2015, 7, 3), datetime( - 2015, 7, 3)) # <-- same start and end dates - - tm.assert_index_equal(holidays0, holidays1) - tm.assert_index_equal(holidays0, holidays2) - - def test_rule_from_name(self): - USFedCal = get_calendar('USFederalHolidayCalendar') - assert USFedCal.rule_from_name('Thanksgiving') == USThanksgivingDay - - -class TestHoliday(object): - - def setup_method(self, method): - self.start_date = datetime(2011, 1, 1) - self.end_date = datetime(2020, 12, 31) - - def check_results(self, holiday, start, end, expected): - assert list(holiday.dates(start, end)) == expected - - # Verify that timezone info is preserved. - assert (list(holiday.dates(utc.localize(Timestamp(start)), - utc.localize(Timestamp(end)))) == - [utc.localize(dt) for dt in expected]) - - def test_usmemorialday(self): - self.check_results(holiday=USMemorialDay, - start=self.start_date, - end=self.end_date, - expected=[ - datetime(2011, 5, 30), - datetime(2012, 5, 28), - datetime(2013, 5, 27), - datetime(2014, 5, 26), - datetime(2015, 5, 25), - datetime(2016, 5, 30), - datetime(2017, 5, 29), - datetime(2018, 5, 28), - datetime(2019, 5, 27), - datetime(2020, 5, 25), - ], ) - - def test_non_observed_holiday(self): - - self.check_results( - Holiday('July 4th Eve', month=7, day=3), - start="2001-01-01", - end="2003-03-03", - expected=[ - Timestamp('2001-07-03 00:00:00'), - Timestamp('2002-07-03 00:00:00') - ] - ) - - self.check_results( - Holiday('July 4th Eve', month=7, day=3, days_of_week=(0, 1, 2, 3)), - start="2001-01-01", - end="2008-03-03", - expected=[ - Timestamp('2001-07-03 00:00:00'), - Timestamp('2002-07-03 00:00:00'), - Timestamp('2003-07-03 00:00:00'), - Timestamp('2006-07-03 00:00:00'), - Timestamp('2007-07-03 00:00:00'), - ] - ) - - def test_easter(self): - - self.check_results(EasterMonday, - start=self.start_date, - end=self.end_date, - expected=[ - Timestamp('2011-04-25 00:00:00'), - Timestamp('2012-04-09 00:00:00'), - Timestamp('2013-04-01 00:00:00'), - Timestamp('2014-04-21 00:00:00'), - Timestamp('2015-04-06 00:00:00'), - Timestamp('2016-03-28 00:00:00'), - Timestamp('2017-04-17 00:00:00'), - Timestamp('2018-04-02 00:00:00'), - Timestamp('2019-04-22 00:00:00'), - Timestamp('2020-04-13 00:00:00'), - ], ) - self.check_results(GoodFriday, - start=self.start_date, - end=self.end_date, - expected=[ - Timestamp('2011-04-22 00:00:00'), - Timestamp('2012-04-06 00:00:00'), - Timestamp('2013-03-29 00:00:00'), - Timestamp('2014-04-18 00:00:00'), - Timestamp('2015-04-03 00:00:00'), - Timestamp('2016-03-25 00:00:00'), - Timestamp('2017-04-14 00:00:00'), - Timestamp('2018-03-30 00:00:00'), - Timestamp('2019-04-19 00:00:00'), - Timestamp('2020-04-10 00:00:00'), - ], ) - - def test_usthanksgivingday(self): - - self.check_results(USThanksgivingDay, - start=self.start_date, - end=self.end_date, - expected=[ - datetime(2011, 11, 24), - datetime(2012, 11, 22), - datetime(2013, 11, 28), - datetime(2014, 11, 27), - datetime(2015, 11, 26), - datetime(2016, 11, 24), - datetime(2017, 11, 23), - datetime(2018, 11, 22), - datetime(2019, 11, 28), - datetime(2020, 11, 26), - ], ) - - def test_holidays_within_dates(self): - # Fix holiday behavior found in #11477 - # where holiday.dates returned dates outside start/end date - # or observed rules could not be applied as the holiday - # was not in the original date range (e.g., 7/4/2015 -> 7/3/2015) - start_date = datetime(2015, 7, 1) - end_date = datetime(2015, 7, 1) - - calendar = get_calendar('USFederalHolidayCalendar') - new_years = calendar.rule_from_name('New Years Day') - july_4th = calendar.rule_from_name('July 4th') - veterans_day = calendar.rule_from_name('Veterans Day') - christmas = calendar.rule_from_name('Christmas') - - # Holiday: (start/end date, holiday) - holidays = {USMemorialDay: ("2015-05-25", "2015-05-25"), - USLaborDay: ("2015-09-07", "2015-09-07"), - USColumbusDay: ("2015-10-12", "2015-10-12"), - USThanksgivingDay: ("2015-11-26", "2015-11-26"), - USMartinLutherKingJr: ("2015-01-19", "2015-01-19"), - USPresidentsDay: ("2015-02-16", "2015-02-16"), - GoodFriday: ("2015-04-03", "2015-04-03"), - EasterMonday: [("2015-04-06", "2015-04-06"), - ("2015-04-05", [])], - new_years: [("2015-01-01", "2015-01-01"), - ("2011-01-01", []), - ("2010-12-31", "2010-12-31")], - july_4th: [("2015-07-03", "2015-07-03"), - ("2015-07-04", [])], - veterans_day: [("2012-11-11", []), - ("2012-11-12", "2012-11-12")], - christmas: [("2011-12-25", []), - ("2011-12-26", "2011-12-26")]} - - for rule, dates in compat.iteritems(holidays): - empty_dates = rule.dates(start_date, end_date) - assert empty_dates.tolist() == [] - - if isinstance(dates, tuple): - dates = [dates] - - for start, expected in dates: - if len(expected): - expected = [Timestamp(expected)] - self.check_results(rule, start, start, expected) - - def test_argument_types(self): - holidays = USThanksgivingDay.dates(self.start_date, self.end_date) - - holidays_1 = USThanksgivingDay.dates( - self.start_date.strftime('%Y-%m-%d'), - self.end_date.strftime('%Y-%m-%d')) - - holidays_2 = USThanksgivingDay.dates( - Timestamp(self.start_date), - Timestamp(self.end_date)) - - tm.assert_index_equal(holidays, holidays_1) - tm.assert_index_equal(holidays, holidays_2) - - def test_special_holidays(self): - base_date = [datetime(2012, 5, 28)] - holiday_1 = Holiday('One-Time', year=2012, month=5, day=28) - holiday_2 = Holiday('Range', month=5, day=28, - start_date=datetime(2012, 1, 1), - end_date=datetime(2012, 12, 31), - offset=DateOffset(weekday=MO(1))) - - assert base_date == holiday_1.dates(self.start_date, self.end_date) - assert base_date == holiday_2.dates(self.start_date, self.end_date) - - def test_get_calendar(self): - class TestCalendar(AbstractHolidayCalendar): - rules = [] - - calendar = get_calendar('TestCalendar') - assert TestCalendar == calendar.__class__ - - def test_factory(self): - class_1 = HolidayCalendarFactory('MemorialDay', - AbstractHolidayCalendar, - USMemorialDay) - class_2 = HolidayCalendarFactory('Thansksgiving', - AbstractHolidayCalendar, - USThanksgivingDay) - class_3 = HolidayCalendarFactory('Combined', class_1, class_2) - - assert len(class_1.rules) == 1 - assert len(class_2.rules) == 1 - assert len(class_3.rules) == 2 - - -class TestObservanceRules(object): - - def setup_method(self, method): - self.we = datetime(2014, 4, 9) - self.th = datetime(2014, 4, 10) - self.fr = datetime(2014, 4, 11) - self.sa = datetime(2014, 4, 12) - self.su = datetime(2014, 4, 13) - self.mo = datetime(2014, 4, 14) - self.tu = datetime(2014, 4, 15) - - def test_next_monday(self): - assert next_monday(self.sa) == self.mo - assert next_monday(self.su) == self.mo - - def test_next_monday_or_tuesday(self): - assert next_monday_or_tuesday(self.sa) == self.mo - assert next_monday_or_tuesday(self.su) == self.tu - assert next_monday_or_tuesday(self.mo) == self.tu - - def test_previous_friday(self): - assert previous_friday(self.sa) == self.fr - assert previous_friday(self.su) == self.fr - - def test_sunday_to_monday(self): - assert sunday_to_monday(self.su) == self.mo - - def test_nearest_workday(self): - assert nearest_workday(self.sa) == self.fr - assert nearest_workday(self.su) == self.mo - assert nearest_workday(self.mo) == self.mo - - def test_weekend_to_monday(self): - assert weekend_to_monday(self.sa) == self.mo - assert weekend_to_monday(self.su) == self.mo - assert weekend_to_monday(self.mo) == self.mo - - def test_next_workday(self): - assert next_workday(self.sa) == self.mo - assert next_workday(self.su) == self.mo - assert next_workday(self.mo) == self.tu - - def test_previous_workday(self): - assert previous_workday(self.sa) == self.fr - assert previous_workday(self.su) == self.fr - assert previous_workday(self.tu) == self.mo - - def test_before_nearest_workday(self): - assert before_nearest_workday(self.sa) == self.th - assert before_nearest_workday(self.su) == self.fr - assert before_nearest_workday(self.tu) == self.mo - - def test_after_nearest_workday(self): - assert after_nearest_workday(self.sa) == self.mo - assert after_nearest_workday(self.su) == self.tu - assert after_nearest_workday(self.fr) == self.mo - - -class TestFederalHolidayCalendar(object): - - def test_no_mlk_before_1986(self): - # see gh-10278 - class MLKCalendar(AbstractHolidayCalendar): - rules = [USMartinLutherKingJr] - - holidays = MLKCalendar().holidays(start='1984', - end='1988').to_pydatetime().tolist() - - # Testing to make sure holiday is not incorrectly observed before 1986 - assert holidays == [datetime(1986, 1, 20, 0, 0), - datetime(1987, 1, 19, 0, 0)] - - def test_memorial_day(self): - class MemorialDay(AbstractHolidayCalendar): - rules = [USMemorialDay] - - holidays = MemorialDay().holidays(start='1971', - end='1980').to_pydatetime().tolist() - - # Fixes 5/31 error and checked manually against Wikipedia - assert holidays == [datetime(1971, 5, 31, 0, 0), - datetime(1972, 5, 29, 0, 0), - datetime(1973, 5, 28, 0, 0), - datetime(1974, 5, 27, 0, 0), - datetime(1975, 5, 26, 0, 0), - datetime(1976, 5, 31, 0, 0), - datetime(1977, 5, 30, 0, 0), - datetime(1978, 5, 29, 0, 0), - datetime(1979, 5, 28, 0, 0)] - - -class TestHolidayConflictingArguments(object): - - def test_both_offset_observance_raises(self): - # see gh-10217 - with pytest.raises(NotImplementedError): - Holiday("Cyber Monday", month=11, day=1, - offset=[DateOffset(weekday=SA(4))], - observance=next_monday) diff --git a/pandas/tests/util/test_hashing.py b/pandas/tests/util/test_hashing.py index d36de931e2610..c80b4483c0482 100644 --- a/pandas/tests/util/test_hashing.py +++ b/pandas/tests/util/test_hashing.py @@ -257,8 +257,7 @@ def test_categorical_with_nan_consistency(): assert result[1] in expected -@pytest.mark.filterwarnings("ignore:\\nPanel:FutureWarning") -@pytest.mark.parametrize("obj", [pd.Timestamp("20130101"), tm.makePanel()]) +@pytest.mark.parametrize("obj", [pd.Timestamp("20130101")]) def test_pandas_errors(obj): msg = "Unexpected type for hashing" with pytest.raises(TypeError, match=msg): diff --git a/pandas/tseries/frequencies.py b/pandas/tseries/frequencies.py index c454db3bbdffc..f591b24f5b648 100644 --- a/pandas/tseries/frequencies.py +++ b/pandas/tseries/frequencies.py @@ -77,7 +77,7 @@ def to_offset(freq): See Also -------- - pandas.DateOffset + DateOffset Examples -------- diff --git a/pandas/util/_decorators.py b/pandas/util/_decorators.py index 86cd8b1e698c6..e92051ebbea9a 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -4,12 +4,13 @@ import warnings from pandas._libs.properties import cache_readonly # noqa -from pandas.compat import PY2, callable, signature +from pandas.compat import PY2, signature def deprecate(name, alternative, version, alt_name=None, klass=None, stacklevel=2, msg=None): - """Return a new function that emits a deprecation warning on use. + """ + Return a new function that emits a deprecation warning on use. To use this method for a deprecated function, another function `alternative` with the same signature must exist. The deprecated diff --git a/pandas/util/move.c b/pandas/util/move.c index 62860adb1c1f6..9bb662d50cb3f 100644 --- a/pandas/util/move.c +++ b/pandas/util/move.c @@ -1,3 +1,12 @@ +/* +Copyright (c) 2019, PyData Development Team +All rights reserved. + +Distributed under the terms of the BSD Simplified License. + +The full license is in the LICENSE file, distributed with this software. +*/ + #include #define COMPILING_IN_PY2 (PY_VERSION_HEX <= 0x03000000) @@ -31,15 +40,13 @@ typedef struct { static PyTypeObject stolenbuf_type; /* forward declare type */ static void -stolenbuf_dealloc(stolenbufobject *self) -{ +stolenbuf_dealloc(stolenbufobject *self) { Py_DECREF(self->invalid_bytes); PyObject_Del(self); } static int -stolenbuf_getbuffer(stolenbufobject *self, Py_buffer *view, int flags) -{ +stolenbuf_getbuffer(stolenbufobject *self, Py_buffer *view, int flags) { return PyBuffer_FillInfo(view, (PyObject*) self, (void*) PyString_AS_STRING(self->invalid_bytes), @@ -51,8 +58,8 @@ stolenbuf_getbuffer(stolenbufobject *self, Py_buffer *view, int flags) #if COMPILING_IN_PY2 static Py_ssize_t -stolenbuf_getreadwritebuf(stolenbufobject *self, Py_ssize_t segment, void **out) -{ +stolenbuf_getreadwritebuf(stolenbufobject *self, + Py_ssize_t segment, void **out) { if (segment != 0) { PyErr_SetString(PyExc_SystemError, "accessing non-existent string segment"); @@ -63,8 +70,7 @@ stolenbuf_getreadwritebuf(stolenbufobject *self, Py_ssize_t segment, void **out) } static Py_ssize_t -stolenbuf_getsegcount(stolenbufobject *self, Py_ssize_t *len) -{ +stolenbuf_getsegcount(stolenbufobject *self, Py_ssize_t *len) { if (len) { *len = PyString_GET_SIZE(self->invalid_bytes); } @@ -157,8 +163,7 @@ PyDoc_STRVAR( however, if called through *unpacking like ``stolenbuf(*(a,))`` it would only have the one reference (the tuple). */ static PyObject* -move_into_mutable_buffer(PyObject *self, PyObject *bytes_rvalue) -{ +move_into_mutable_buffer(PyObject *self, PyObject *bytes_rvalue) { stolenbufobject *ret; if (!PyString_CheckExact(bytes_rvalue)) { diff --git a/pandas/util/testing.py b/pandas/util/testing.py index f441dd20f3982..387f402348513 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -1,5 +1,6 @@ from __future__ import division +from collections import Counter from contextlib import contextmanager from datetime import datetime from functools import wraps @@ -20,8 +21,8 @@ from pandas._libs import testing as _testing import pandas.compat as compat from pandas.compat import ( - PY2, PY3, Counter, callable, filter, httplib, lmap, lrange, lzip, map, - raise_with_traceback, range, string_types, u, unichr, zip) + PY2, PY3, filter, httplib, lmap, lrange, lzip, map, raise_with_traceback, + range, string_types, u, unichr, zip) from pandas.core.dtypes.common import ( is_bool, is_categorical_dtype, is_datetime64_dtype, is_datetime64tz_dtype, @@ -33,7 +34,7 @@ import pandas as pd from pandas import ( Categorical, CategoricalIndex, DataFrame, DatetimeIndex, Index, - IntervalIndex, MultiIndex, Panel, RangeIndex, Series, bdate_range) + IntervalIndex, MultiIndex, RangeIndex, Series, bdate_range) from pandas.core.algorithms import take_1d from pandas.core.arrays import ( DatetimeArray, ExtensionArray, IntervalArray, PeriodArray, TimedeltaArray, @@ -2051,22 +2052,6 @@ def makePeriodFrame(nper=None): return DataFrame(data) -def makePanel(nper=None): - with warnings.catch_warnings(record=True): - warnings.filterwarnings("ignore", "\\nPanel", FutureWarning) - cols = ['Item' + c for c in string.ascii_uppercase[:K - 1]] - data = {c: makeTimeDataFrame(nper) for c in cols} - return Panel.fromDict(data) - - -def makePeriodPanel(nper=None): - with warnings.catch_warnings(record=True): - warnings.filterwarnings("ignore", "\\nPanel", FutureWarning) - cols = ['Item' + c for c in string.ascii_uppercase[:K - 1]] - data = {c: makePeriodFrame(nper) for c in cols} - return Panel.fromDict(data) - - def makeCustomIndex(nentries, nlevels, prefix='#', names=False, ndupe_l=None, idx_type=None): """Create an index/multindex with given dimensions, levels, names, etc' @@ -2314,15 +2299,6 @@ def makeMissingDataframe(density=.9, random_state=None): return df -def add_nans(panel): - I, J, N = panel.shape - for i, item in enumerate(panel.items): - dm = panel[item] - for j, col in enumerate(dm.columns): - dm[col][:i + j] = np.NaN - return panel - - class TestSubDict(dict): def __init__(self, *args, **kwargs): diff --git a/scripts/validate_docstrings.py b/scripts/validate_docstrings.py index 4e389aed2b0d2..bce33f7e78daa 100755 --- a/scripts/validate_docstrings.py +++ b/scripts/validate_docstrings.py @@ -796,7 +796,8 @@ def validate_all(prefix, ignore_deprecated=False): seen = {} # functions from the API docs - api_doc_fnames = os.path.join(BASE_PATH, 'doc', 'source', 'api', '*.rst') + api_doc_fnames = os.path.join( + BASE_PATH, 'doc', 'source', 'reference', '*.rst') api_items = [] for api_doc_fname in glob.glob(api_doc_fnames): with open(api_doc_fname) as f: diff --git a/setup.cfg b/setup.cfg index 95c71826a80d4..b15c3ce8a110a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -46,8 +46,8 @@ ignore = E402, # module level import not at top of file E711, # comparison to none should be 'if cond is none:' exclude = - doc/source/basics.rst - doc/source/contributing_docstring.rst + doc/source/getting_started/basics.rst + doc/source/development/contributing_docstring.rst [yapf] @@ -114,7 +114,6 @@ force_sort_within_sections=True skip= pandas/core/api.py, pandas/core/frame.py, - asv_bench/benchmarks/algorithms.py, asv_bench/benchmarks/attrs_caching.py, asv_bench/benchmarks/binary_ops.py, asv_bench/benchmarks/categoricals.py, diff --git a/setup.py b/setup.py index ed2d905f4358b..c8d29a2e4be5a 100755 --- a/setup.py +++ b/setup.py @@ -450,13 +450,19 @@ def run(self): # Note: if not using `cythonize`, coverage can be enabled by # pinning `ext.cython_directives = directives` to each ext in extensions. # github.com/cython/cython/wiki/enhancements-compilerdirectives#in-setuppy -directives = {'linetrace': False} +directives = {'linetrace': False, + 'language_level': 2} macros = [] if linetrace: # https://pypkg.com/pypi/pytest-cython/f/tests/example-project/setup.py directives['linetrace'] = True macros = [('CYTHON_TRACE', '1'), ('CYTHON_TRACE_NOGIL', '1')] +# in numpy>=1.16.0, silence build warnings about deprecated API usage +# we can't do anything about these warnings because they stem from +# cython+numpy version mismatches. +macros.append(('NPY_NO_DEPRECATED_API', '0')) + # ---------------------------------------------------------------------- # Specification of Dependencies

    + The page has been moved to {title} +

    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