From 62bd9733070b696525c9ffa36febf204ada4299f Mon Sep 17 00:00:00 2001 From: tp Date: Sat, 4 Jul 2020 13:59:13 +0100 Subject: [PATCH 1/7] CLN: remove kwargs in Index.format --- pandas/core/indexes/base.py | 4 ++-- pandas/core/indexes/datetimelike.py | 16 ++++++++++++++++ pandas/core/indexes/multi.py | 2 +- pandas/core/indexes/range.py | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 2f12a2e4c27ea..b5d270603acdf 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -902,7 +902,7 @@ def _mpl_repr(self): # how to represent ourselves to matplotlib return self.values - def format(self, name: bool = False, formatter=None, **kwargs): + def format(self, name: bool = False, formatter=None, na_rep="NaN") -> List[str_t]: """ Render a string representation of the Index. """ @@ -917,7 +917,7 @@ def format(self, name: bool = False, formatter=None, **kwargs): if formatter is not None: return header + list(self.map(formatter)) - return self._format_with_header(header, **kwargs) + return self._format_with_header(header, na_rep=na_rep) def _format_with_header(self, header, na_rep="NaN") -> List[str_t]: from pandas.io.formats.format import format_array diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 7be6aa50fa16b..f136405beb0b1 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -338,6 +338,22 @@ def argmax(self, axis=None, skipna=True, *args, **kwargs): # -------------------------------------------------------------------- # Rendering Methods + def format( + self, name: bool = False, formatter=None, date_format=None, na_rep="NaT" + ) -> List[str]: + """ + Render a string representation of the Index. + """ + header = [] + if name: + fmt_name = ibase.pprint_thing(self.name, escape_chars=("\t", "\r", "\n")) + header.append(fmt_name) + + if formatter is not None: + return header + list(self.map(formatter)) + + return self._format_with_header(header, date_format=date_format, na_rep=na_rep) + def _format_with_header(self, header, na_rep="NaT", date_format=None) -> List[str]: return header + list( self._format_native_types(na_rep=na_rep, date_format=date_format) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 15db6c51a1f2f..018b6806c5603 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1237,7 +1237,7 @@ def format( names=False, na_rep=None, formatter=None, - ): + ) -> list: if len(self) == 0: return [] diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index 6d9fd6efe54a3..e5e98039ff77b 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -198,7 +198,7 @@ def _format_data(self, name=None): return None def _format_with_header(self, header, na_rep="NaN") -> List[str]: - return header + list(map(pprint_thing, self._range)) + return header + [pprint_thing(x) for x in self._range] # -------------------------------------------------------------------- _deprecation_message = ( From 75da29aaa7184a9b2d3377352f3186521b269110 Mon Sep 17 00:00:00 2001 From: tp Date: Sat, 4 Jul 2020 15:10:26 +0100 Subject: [PATCH 2/7] fix mypy errors --- pandas/core/indexes/datetimelike.py | 2 +- pandas/core/indexes/multi.py | 16 ++++++++++------ pandas/io/formats/format.py | 3 +-- pandas/io/formats/html.py | 1 + 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index f136405beb0b1..e526bddb0fccb 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -339,7 +339,7 @@ def argmax(self, axis=None, skipna=True, *args, **kwargs): # Rendering Methods def format( - self, name: bool = False, formatter=None, date_format=None, na_rep="NaT" + self, name: bool = False, formatter=None, na_rep="NaT", date_format=None ) -> List[str]: """ Render a string representation of the Index. diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 018b6806c5603..0878b9344a2f1 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1231,13 +1231,17 @@ def _format_native_types(self, na_rep="nan", **kwargs): def format( self, + name=None, + formatter=None, + na_rep=None, + names=False, space=2, sparsify=None, adjoin=True, - names=False, - na_rep=None, - formatter=None, ) -> list: + if name is not None: + names = name + if len(self) == 0: return [] @@ -1265,13 +1269,13 @@ def format( stringified_levels.append(formatted) result_levels = [] - for lev, name in zip(stringified_levels, self.names): + for lev, lev_name in zip(stringified_levels, self.names): level = [] if names: level.append( - pprint_thing(name, escape_chars=("\t", "\r", "\n")) - if name is not None + pprint_thing(lev_name, escape_chars=("\t", "\r", "\n")) + if lev_name is not None else "" ) diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index 27df014620f56..fe85eab4bfbf5 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -330,9 +330,8 @@ def _get_footer(self) -> str: def _get_formatted_index(self) -> Tuple[List[str], bool]: index = self.tr_series.index - is_multi = isinstance(index, MultiIndex) - if is_multi: + if isinstance(index, MultiIndex): have_header = any(name for name in index.names) fmt_index = index.format(names=True) else: diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 7ea2417ceb24b..13f0ab1e8a52c 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -442,6 +442,7 @@ def _write_hierarchical_rows( frame = self.fmt.tr_frame nrows = len(frame) + assert isinstance(frame.index, MultiIndex) idx_values = frame.index.format(sparsify=False, adjoin=False, names=False) idx_values = list(zip(*idx_values)) From fe76e0f32cabeaa68ea332c5dd5225ae66fcc6ac Mon Sep 17 00:00:00 2001 From: tp Date: Tue, 7 Jul 2020 07:15:20 +0100 Subject: [PATCH 3/7] Update type hints --- pandas/core/indexes/multi.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 0878b9344a2f1..fb9ecc2067842 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -2,6 +2,7 @@ from typing import ( TYPE_CHECKING, Any, + Callable, Hashable, Iterable, List, @@ -1231,13 +1232,13 @@ def _format_native_types(self, na_rep="nan", **kwargs): def format( self, - name=None, - formatter=None, - na_rep=None, - names=False, - space=2, - sparsify=None, - adjoin=True, + name: Optional[bool] = None, + formatter: Optional[Callable] = None, + na_rep: Optional[str] = None, + names: bool = False, + space: int = 2, + sparsify: Optional[bool] = None, + adjoin: bool = True, ) -> list: if name is not None: names = name From fabb60afe270c8779966cc9908e9c43c5680550c Mon Sep 17 00:00:00 2001 From: tp Date: Tue, 7 Jul 2020 07:43:23 +0100 Subject: [PATCH 4/7] sparsify --- pandas/core/indexes/multi.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index fb9ecc2067842..1ef54bc5401a7 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1237,7 +1237,7 @@ def format( na_rep: Optional[str] = None, names: bool = False, space: int = 2, - sparsify: Optional[bool] = None, + sparsify = None, adjoin: bool = True, ) -> list: if name is not None: @@ -1288,10 +1288,9 @@ def format( if sparsify: sentinel = "" - # GH3547 - # use value of sparsify as sentinel, unless it's an obvious - # "Truthy" value - if sparsify not in [True, 1]: + # GH3547 use value of sparsify as sentinel if it's "Falsey" + assert isinstance(sparsify, bool) or sparsify is lib.no_default + if sparsify in [False, lib.no_default]: sentinel = sparsify # little bit of a kludge job for #1217 result_levels = _sparsify( From 752bbfdbb22c157a2dfba2ed02e3ae1f31131de2 Mon Sep 17 00:00:00 2001 From: tp Date: Tue, 7 Jul 2020 08:03:25 +0100 Subject: [PATCH 5/7] fixes --- pandas/core/indexes/multi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 1ef54bc5401a7..5f98dba86db7b 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1237,7 +1237,7 @@ def format( na_rep: Optional[str] = None, names: bool = False, space: int = 2, - sparsify = None, + sparsify=None, adjoin: bool = True, ) -> list: if name is not None: From 8aca54886c1d756ecaa22904a34e2f683fef402f Mon Sep 17 00:00:00 2001 From: tp Date: Tue, 7 Jul 2020 08:14:58 +0100 Subject: [PATCH 6/7] more typing --- pandas/core/indexes/base.py | 7 ++++++- pandas/core/indexes/datetimelike.py | 10 +++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index b5d270603acdf..3dbee7d0929cb 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -902,7 +902,12 @@ def _mpl_repr(self): # how to represent ourselves to matplotlib return self.values - def format(self, name: bool = False, formatter=None, na_rep="NaN") -> List[str_t]: + def format( + self, + name: bool = False, + formatter: Optional[Callable] = None, + na_rep: str_t = "NaN", + ) -> List[str_t]: """ Render a string representation of the Index. """ diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index e526bddb0fccb..15a7e25238983 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -9,7 +9,7 @@ from pandas._libs import NaT, Timedelta, iNaT, join as libjoin, lib from pandas._libs.tslibs import BaseOffset, Resolution, Tick, timezones from pandas._libs.tslibs.parsing import DateParseError -from pandas._typing import Label +from pandas._typing import Callable, Label from pandas.compat.numpy import function as nv from pandas.errors import AbstractMethodError from pandas.util._decorators import Appender, cache_readonly, doc @@ -339,7 +339,11 @@ def argmax(self, axis=None, skipna=True, *args, **kwargs): # Rendering Methods def format( - self, name: bool = False, formatter=None, na_rep="NaT", date_format=None + self, + name: bool = False, + formatter: Optional[Callable] = None, + na_rep: str = "NaT", + date_format: Optional[str] = None, ) -> List[str]: """ Render a string representation of the Index. @@ -352,7 +356,7 @@ def format( if formatter is not None: return header + list(self.map(formatter)) - return self._format_with_header(header, date_format=date_format, na_rep=na_rep) + return self._format_with_header(header, na_rep=na_rep, date_format=date_format) def _format_with_header(self, header, na_rep="NaT", date_format=None) -> List[str]: return header + list( From 43f07279ce33c97d8bfaf62cb2b74494cc00cd8c Mon Sep 17 00:00:00 2001 From: tp Date: Tue, 14 Jul 2020 21:50:06 +0100 Subject: [PATCH 7/7] change return type --- pandas/core/indexes/multi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 5f98dba86db7b..235da89083d0a 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1239,7 +1239,7 @@ def format( space: int = 2, sparsify=None, adjoin: bool = True, - ) -> list: + ) -> List: if name is not None: names = name