-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
API: Restore implicit converter registration #18307
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
220d554
fba98b1
ba88a04
16c33f1
3766b78
5be9793
9364f60
39602f9
eb6388e
444bc4d
ec7f7e1
58bf2f6
5ee385e
ca6c945
77f76d2
ecf4154
61fbdbb
5e16157
d6798d1
576d244
04d8aa5
f061148
1112b28
897c7ea
2cf0601
ee7b457
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,7 +9,6 @@ | |
'ipython', | ||
'jinja2' | ||
'lxml', | ||
'matplotlib', | ||
'numexpr', | ||
'openpyxl', | ||
'py', | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,45 @@ This is a minor release from 0.21.1 and includes a number of deprecations, new | |
features, enhancements, and performance improvements along with a large number | ||
of bug fixes. We recommend that all users upgrade to this version. | ||
|
||
.. _whatsnew_0211.special: | ||
|
||
Restore Matplotlib datetime Converter Registration | ||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|
||
Pandas implements some matplotlib converters for nicely formatting the axis | ||
labels on plots with ``datetime`` or ``Period`` values. Prior to pandas 0.21.0, | ||
these were implicitly registered with matplotlib, as a side effect of | ||
``import pandas``. In pandas 0.21.0, we required users to explicitly register | ||
the converter. | ||
|
||
.. code-block:: python | ||
|
||
>>> from pandas.tseries import converter | ||
>>> converter.register() | ||
|
||
This caused problems for some users, so we're temporarily reverting that change; | ||
pandas will again register the converters on import. Using the converters | ||
without explicitly registering the formatters will cause a ``FutureWarning``: | ||
|
||
.. code-block:: python | ||
|
||
>>> import pandas as pd | ||
>>> import matplotlib.pyplot as plt | ||
>>> fig, ax = plt.subplots() | ||
>>> ax.plot(pd.Series(range(12), index=pd.date_range('2017', periods=12))) | ||
FutureWarning: Using an implicitly registered datetime converter for a | ||
matplotlib plotting method. The converter was registered by pandas on import. | ||
Future versions of pandas will require you to explicitly register matplotlib | ||
converters. | ||
|
||
To register the converters: | ||
>>> from pandas.tseries import converter | ||
>>> converter.register() | ||
|
||
As the error message says, you'll need to register the converts if you intend to | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. converts -> converters |
||
use them with matplotlib plotting functions. Pandas plotting functions, such as | ||
``Series.plot``, will register them for you. (:issue:`18301`) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe a bit more explicit like: "When using pandas plotting functions, such as Series.plot, the converters will be registered for you and you do not need to do this explicitly" |
||
|
||
.. _whatsnew_0211.enhancements: | ||
|
||
New features | ||
|
@@ -30,7 +69,7 @@ Other Enhancements | |
Deprecations | ||
~~~~~~~~~~~~ | ||
|
||
- | ||
- | ||
- | ||
- | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -40,16 +40,16 @@ | |
_get_xlim, _set_ticks_props, | ||
format_date_labels) | ||
|
||
_registered = False | ||
|
||
|
||
def _setup(): | ||
# delay the import of matplotlib until nescessary | ||
global _registered | ||
if not _registered: | ||
from pandas.plotting import _converter | ||
_converter.register() | ||
_registered = True | ||
try: | ||
# We want to warn if the formatter is called implicitly | ||
# by `ax.plot(datetimeindex, another)` | ||
# We don't want to warn if | ||
# * Series.plot | ||
# * User calls `register` explicitly | ||
from pandas.plotting import _converter | ||
_converter.register(warn=True) | ||
except ImportError: | ||
pass | ||
|
||
|
||
def _get_standard_kind(kind): | ||
|
@@ -99,7 +99,7 @@ def __init__(self, data, kind=None, by=None, subplots=False, sharex=None, | |
secondary_y=False, colormap=None, | ||
table=False, layout=None, **kwds): | ||
|
||
_setup() | ||
_converter._WARN = False | ||
self.data = data | ||
self.by = by | ||
|
||
|
@@ -2059,7 +2059,7 @@ def boxplot_frame(self, column=None, by=None, ax=None, fontsize=None, rot=0, | |
grid=True, figsize=None, layout=None, | ||
return_type=None, **kwds): | ||
import matplotlib.pyplot as plt | ||
_setup() | ||
_converter.WARN = False | ||
ax = boxplot(self, column=column, by=by, ax=ax, fontsize=fontsize, | ||
grid=grid, rot=rot, figsize=figsize, layout=layout, | ||
return_type=return_type, **kwds) | ||
|
@@ -2155,7 +2155,7 @@ def hist_frame(data, column=None, by=None, grid=True, xlabelsize=None, | |
kwds : other plotting keyword arguments | ||
To be passed to hist function | ||
""" | ||
_setup() | ||
_converter.WARN = False | ||
if by is not None: | ||
axes = grouped_hist(data, column=column, by=by, ax=ax, grid=grid, | ||
figsize=figsize, sharex=sharex, sharey=sharey, | ||
|
@@ -2289,6 +2289,8 @@ def grouped_hist(data, column=None, by=None, ax=None, bins=50, figsize=None, | |
------- | ||
axes: collection of Matplotlib Axes | ||
""" | ||
_converter.WARN = False | ||
|
||
def plot_group(group, ax): | ||
ax.hist(group.dropna().values, bins=bins, **kwargs) | ||
|
||
|
@@ -2352,7 +2354,6 @@ def boxplot_frame_groupby(grouped, subplots=True, column=None, fontsize=None, | |
>>> grouped = df.unstack(level='lvl1').groupby(level=0, axis=1) | ||
>>> boxplot_frame_groupby(grouped, subplots=False) | ||
""" | ||
_setup() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this one doesn't need to be replaced with _converter.WARN = False ? |
||
if subplots is True: | ||
naxes = len(grouped) | ||
fig, axes = _subplots(naxes=naxes, squeeze=False, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import pytest | ||
|
||
import pandas as pd | ||
import pandas.util.testing as tm | ||
|
||
from pandas.plotting import _converter | ||
from pandas.tseries import converter | ||
|
||
|
||
plt = pytest.importorskip('matplotlib.pyplot') | ||
|
||
|
||
def test_warns(): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this duplicate with the other test file? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, forgot to remove it from my first commit. |
||
s = pd.Series(range(12), index=pd.date_range('2017', periods=12)) | ||
fig, ax = plt.subplots() | ||
|
||
_converter._WARN = True | ||
with tm.assert_produces_warning(FutureWarning, | ||
check_stacklevel=False) as w: | ||
ax.plot(s.index, s.values) | ||
plt.close() | ||
|
||
assert len(w) == 1 | ||
|
||
|
||
def test_registering_no_warning(): | ||
s = pd.Series(range(12), index=pd.date_range('2017', periods=12)) | ||
fig, ax = plt.subplots() | ||
|
||
_converter._WARN = True | ||
converter.register() | ||
with tm.assert_produces_warning(None) as w: | ||
ax.plot(s.index, s.values) | ||
|
||
assert len(w) == 0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would not use 'the formatters' as it actually points to the same as 'converters' but with another word, just making it confusing. I would either just leave it out or use 'them' to avoid repeating converters
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Meant to use
formattersconverters everywhere. Fixing.