longling.lib.formatter 源代码
# coding: utf-8
# 2020/4/13 @ tongshiwei
__all__ = ["dict_format", "pandas_format", "table_format", "series_format"]
from contextlib import contextmanager
from longling.lib.candylib import as_ordered_dict
[文档]def dict_format(data: dict, digits=6, col: int = None):
"""
Examples
--------
>>> print(dict_format({"a": 123, "b": 3, "c": 4, "d": 5})) # doctest: +NORMALIZE_WHITESPACE
a: 123 b: 3 c: 4 d: 5
>>> print(dict_format({"a": 123, "b": 3, "c": 4, "d": 5}, col=3)) # doctest: +NORMALIZE_WHITESPACE
a: 123 b: 3 c: 4
d: 5
"""
if col is None:
msg = []
for name, value in data.items():
if isinstance(value, float):
_msg = "{}: {:.{digits}f}".format(name, value, digits=digits)
else:
_msg = "{}: {}".format(name, value)
msg.append(_msg)
msg = "\t".join([m for m in msg if m])
else:
msg = ""
for i, (name, value) in enumerate(data.items()):
if isinstance(value, float):
_msg = "{}: {:.{digits}f}".format(name, value, digits=digits)
else:
_msg = "{}: {}".format(name, value)
if (i + 1) % col == 0 and i != len(data) - 1:
_msg += "\n"
elif i != len(data) - 1:
_msg += "\t"
msg += _msg
return msg
[文档]def pandas_format(data: (dict, list, tuple), columns: list = None, index: (list, str) = None, orient="index",
pd_kwargs: dict = None, max_rows=80, max_columns=80, **kwargs):
"""
Parameters
----------
data: dict, list, tuple, pd.DataFrame
columns : list, default None
Column labels to use when ``orient='index'``. Raises a ValueError
if used with ``orient='columns'``.
index : list of strings
Optional display names matching the labels (same order).
orient : {'columns', 'index'}, default 'columns'
The "orientation" of the data. If the keys of the passed dict
should be the columns of the resulting DataFrame, pass 'columns'
(default). Otherwise if the keys should be rows, pass 'index'.
pd_kwargs: dict
max_rows: (int, None), default 80
max_columns: (int, None), default 80
Examples
--------
>>> print(pandas_format({"a": {"x": 1, "y": 2}, "b": {"x": 1.0, "y": 3}}, ["x", "y"]))
x y
a 1.0 2
b 1.0 3
>>> print(pandas_format([[1.0, 2], [1.0, 3]], ["x", "y"], index=["a", "b"]))
x y
a 1.0 2
b 1.0 3
"""
import pandas as pd
kwargs.update({
"display.max_rows": max_rows,
"display.max_columns": max_columns,
})
pd_kwargs = {} if pd_kwargs is None else pd_kwargs
@contextmanager
def pandas_session():
for key, value in kwargs.items():
pd.pandas.set_option(key, value)
yield
for key in kwargs:
pd.pandas.reset_option(key)
if isinstance(data, dict):
data = as_ordered_dict(data, index)
table = pd.DataFrame.from_dict(
data, orient=orient, columns=columns, **pd_kwargs,
)
elif isinstance(data, (list, tuple, pd.DataFrame)):
table = pd.DataFrame(data, index=index, columns=columns, **pd_kwargs)
else:
raise TypeError("cannot handle %s" % type(data))
with pandas_session():
return str(table)
series_format = dict_format
table_format = pandas_format