absfuyu 5.7.0__py3-none-any.whl → 5.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of absfuyu might be problematic. Click here for more details.
- absfuyu/__init__.py +1 -1
- absfuyu/__main__.py +2 -2
- absfuyu/cli/__init__.py +2 -2
- absfuyu/cli/color.py +2 -2
- absfuyu/cli/config_group.py +2 -2
- absfuyu/cli/do_group.py +2 -2
- absfuyu/cli/game_group.py +2 -2
- absfuyu/cli/tool_group.py +2 -2
- absfuyu/config/__init__.py +2 -2
- absfuyu/core/__init__.py +2 -2
- absfuyu/core/baseclass.py +2 -2
- absfuyu/core/baseclass2.py +2 -2
- absfuyu/core/decorator.py +2 -2
- absfuyu/core/docstring.py +2 -2
- absfuyu/core/dummy_cli.py +2 -2
- absfuyu/core/dummy_func.py +2 -2
- absfuyu/dxt/__init__.py +2 -2
- absfuyu/dxt/dictext.py +2 -2
- absfuyu/dxt/dxt_support.py +2 -2
- absfuyu/dxt/intext.py +2 -2
- absfuyu/dxt/listext.py +2 -2
- absfuyu/dxt/strext.py +2 -2
- absfuyu/extra/__init__.py +2 -2
- absfuyu/extra/beautiful.py +2 -2
- absfuyu/extra/da/__init__.py +1 -1
- absfuyu/extra/da/dadf.py +58 -21
- absfuyu/extra/da/dadf_base.py +2 -2
- absfuyu/extra/da/df_func.py +2 -2
- absfuyu/extra/da/mplt.py +2 -2
- absfuyu/extra/data_analysis.py +2 -2
- absfuyu/extra/pdf.py +1 -1
- absfuyu/extra/xml.py +1 -1
- absfuyu/fun/__init__.py +2 -2
- absfuyu/fun/rubik.py +2 -2
- absfuyu/fun/tarot.py +2 -2
- absfuyu/game/__init__.py +2 -2
- absfuyu/game/game_stat.py +2 -2
- absfuyu/game/sudoku.py +2 -2
- absfuyu/game/tictactoe.py +2 -2
- absfuyu/game/wordle.py +2 -2
- absfuyu/general/__init__.py +2 -2
- absfuyu/general/content.py +2 -2
- absfuyu/general/human.py +2 -2
- absfuyu/general/shape.py +2 -2
- absfuyu/logger.py +2 -2
- absfuyu/pkg_data/__init__.py +2 -2
- absfuyu/pkg_data/deprecated.py +2 -2
- absfuyu/pkg_data/logo.py +1462 -0
- absfuyu/sort.py +2 -2
- absfuyu/tools/__init__.py +2 -2
- absfuyu/tools/checksum.py +2 -2
- absfuyu/tools/converter.py +2 -2
- absfuyu/tools/generator.py +2 -2
- absfuyu/tools/inspector.py +2 -2
- absfuyu/tools/keygen.py +2 -2
- absfuyu/tools/obfuscator.py +2 -2
- absfuyu/tools/passwordlib.py +2 -2
- absfuyu/tools/shutdownizer.py +2 -2
- absfuyu/tools/sw.py +2 -2
- absfuyu/tools/web.py +2 -2
- absfuyu/typings.py +2 -2
- absfuyu/util/__init__.py +2 -2
- absfuyu/util/api.py +2 -2
- absfuyu/util/json_method.py +2 -2
- absfuyu/util/lunar.py +2 -2
- absfuyu/util/path.py +2 -2
- absfuyu/util/performance.py +2 -2
- absfuyu/util/shorten_number.py +2 -2
- absfuyu/util/text_table.py +2 -2
- absfuyu/util/zipped.py +2 -2
- absfuyu/version.py +2 -2
- {absfuyu-5.7.0.dist-info → absfuyu-5.8.0.dist-info}/METADATA +10 -1
- absfuyu-5.8.0.dist-info/RECORD +81 -0
- absfuyu-5.7.0.dist-info/RECORD +0 -80
- {absfuyu-5.7.0.dist-info → absfuyu-5.8.0.dist-info}/WHEEL +0 -0
- {absfuyu-5.7.0.dist-info → absfuyu-5.8.0.dist-info}/entry_points.txt +0 -0
- {absfuyu-5.7.0.dist-info → absfuyu-5.8.0.dist-info}/licenses/LICENSE +0 -0
absfuyu/__init__.py
CHANGED
absfuyu/__main__.py
CHANGED
absfuyu/cli/__init__.py
CHANGED
absfuyu/cli/color.py
CHANGED
absfuyu/cli/config_group.py
CHANGED
absfuyu/cli/do_group.py
CHANGED
absfuyu/cli/game_group.py
CHANGED
absfuyu/cli/tool_group.py
CHANGED
absfuyu/config/__init__.py
CHANGED
absfuyu/core/__init__.py
CHANGED
absfuyu/core/baseclass.py
CHANGED
absfuyu/core/baseclass2.py
CHANGED
absfuyu/core/decorator.py
CHANGED
absfuyu/core/docstring.py
CHANGED
absfuyu/core/dummy_cli.py
CHANGED
absfuyu/core/dummy_func.py
CHANGED
absfuyu/dxt/__init__.py
CHANGED
absfuyu/dxt/dictext.py
CHANGED
absfuyu/dxt/dxt_support.py
CHANGED
absfuyu/dxt/intext.py
CHANGED
absfuyu/dxt/listext.py
CHANGED
absfuyu/dxt/strext.py
CHANGED
absfuyu/extra/__init__.py
CHANGED
absfuyu/extra/beautiful.py
CHANGED
absfuyu/extra/da/__init__.py
CHANGED
absfuyu/extra/da/dadf.py
CHANGED
|
@@ -3,8 +3,8 @@ Absfuyu: Data Analysis
|
|
|
3
3
|
----------------------
|
|
4
4
|
Data Analyst DataFrame
|
|
5
5
|
|
|
6
|
-
Version: 5.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 5.8.0
|
|
7
|
+
Date updated: 17/09/2025 (dd/mm/yyyy)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
# Module level
|
|
@@ -41,7 +41,7 @@ except ImportError:
|
|
|
41
41
|
from absfuyu.core.decorator import dummy_decorator as override
|
|
42
42
|
|
|
43
43
|
from absfuyu.core.baseclass import GetClassMembersMixin
|
|
44
|
-
from absfuyu.core.docstring import deprecated, versionadded
|
|
44
|
+
from absfuyu.core.docstring import deprecated, versionadded, versionchanged
|
|
45
45
|
from absfuyu.extra.da.dadf_base import CityData
|
|
46
46
|
from absfuyu.extra.da.dadf_base import DataAnalystDataFrameBase as DFBase
|
|
47
47
|
from absfuyu.extra.da.dadf_base import SplittedDF
|
|
@@ -366,7 +366,7 @@ class DataAnalystDataFrameInfoMixin(DFBase):
|
|
|
366
366
|
return info
|
|
367
367
|
|
|
368
368
|
@override
|
|
369
|
-
def describe(self, percentiles=None, include=None, exclude=None) -> Self:
|
|
369
|
+
def describe(self, percentiles=None, include=None, exclude=None) -> Self: # type: ignore
|
|
370
370
|
"""pd.DataFrame.describe() override"""
|
|
371
371
|
return self.__class__(super().describe(percentiles, include, exclude)) # type: ignore [no-any-return]
|
|
372
372
|
|
|
@@ -1051,7 +1051,17 @@ class DataAnalystDataFrameExportMixin(DFBase):
|
|
|
1051
1051
|
- da_export
|
|
1052
1052
|
"""
|
|
1053
1053
|
|
|
1054
|
-
|
|
1054
|
+
@versionchanged("5.8.0", "New parameter")
|
|
1055
|
+
def da_export(
|
|
1056
|
+
self,
|
|
1057
|
+
path: str,
|
|
1058
|
+
sheet_name: str = "Sheet1",
|
|
1059
|
+
*,
|
|
1060
|
+
auto_width: bool = True,
|
|
1061
|
+
cols_contain_centered_text: list[str] | None = None,
|
|
1062
|
+
cols_contain_number: list[str] | None = None,
|
|
1063
|
+
cols_contain_percentage: list[str] | None = None,
|
|
1064
|
+
) -> None:
|
|
1055
1065
|
"""
|
|
1056
1066
|
Export DataFrame with `xlsxwriter` engine
|
|
1057
1067
|
|
|
@@ -1060,12 +1070,22 @@ class DataAnalystDataFrameExportMixin(DFBase):
|
|
|
1060
1070
|
path : Path | str
|
|
1061
1071
|
Path to export
|
|
1062
1072
|
|
|
1063
|
-
sheet_name : str
|
|
1064
|
-
Sheet name
|
|
1073
|
+
sheet_name : str, optional
|
|
1074
|
+
Sheet name, by default "Sheet1"
|
|
1075
|
+
|
|
1076
|
+
auto_width : bool, optional
|
|
1077
|
+
Auto resize column width, by default ``True``
|
|
1078
|
+
|
|
1079
|
+
cols_contain_centered_text : list[str] | None, optional
|
|
1080
|
+
Columns that contain centered text (Align center), by default None
|
|
1065
1081
|
|
|
1066
|
-
cols_contain_number : list[str]
|
|
1067
|
-
Columns that contain number value (to format as number)
|
|
1082
|
+
cols_contain_number : list[str] | None, optional
|
|
1083
|
+
Columns that contain number value (to format as number - int), by default None
|
|
1084
|
+
|
|
1085
|
+
cols_contain_percentage : list[str] | None, optional
|
|
1086
|
+
Columns that contain percentage value (to format as percentage), by default None
|
|
1068
1087
|
"""
|
|
1088
|
+
|
|
1069
1089
|
# Using xlsxwriter engine
|
|
1070
1090
|
with pd.ExcelWriter(path, engine="xlsxwriter") as writer:
|
|
1071
1091
|
self.to_excel(writer, sheet_name=sheet_name, index=False, float_format="%.2f", na_rep="")
|
|
@@ -1083,12 +1103,9 @@ class DataAnalystDataFrameExportMixin(DFBase):
|
|
|
1083
1103
|
}
|
|
1084
1104
|
)
|
|
1085
1105
|
number_fmt = workbook.add_format(
|
|
1086
|
-
{
|
|
1087
|
-
"num_format": "#,##0",
|
|
1088
|
-
"align": "center",
|
|
1089
|
-
"valign": "vcenter",
|
|
1090
|
-
}
|
|
1106
|
+
{"num_format": "#,##0", "align": "center", "valign": "vcenter"}
|
|
1091
1107
|
) # 1,000,000
|
|
1108
|
+
percent_fmt = workbook.add_format({"num_format": "0.00%", "align": "center", "valign": "vcenter"}) # 1.00%
|
|
1092
1109
|
text_fmt = workbook.add_format({"valign": "vcenter"})
|
|
1093
1110
|
text_center_fmt = workbook.add_format({"align": "center", "valign": "vcenter"})
|
|
1094
1111
|
|
|
@@ -1099,20 +1116,29 @@ class DataAnalystDataFrameExportMixin(DFBase):
|
|
|
1099
1116
|
for col_num, value in enumerate(self.columns.values):
|
|
1100
1117
|
worksheet.write(0, col_num, value, header_fmt)
|
|
1101
1118
|
|
|
1119
|
+
rules = [
|
|
1120
|
+
(cols_contain_number, number_fmt),
|
|
1121
|
+
(cols_contain_percentage, percent_fmt),
|
|
1122
|
+
(cols_contain_centered_text, text_center_fmt),
|
|
1123
|
+
]
|
|
1124
|
+
|
|
1102
1125
|
# Auto width + col format
|
|
1103
1126
|
for i, col in enumerate(self.columns):
|
|
1104
1127
|
# Max str len of each column
|
|
1105
|
-
max_len = max(self[col].astype(str).map(len).max(), len(col)) + 2
|
|
1128
|
+
max_len = None if auto_width is None else max(self[col].astype(str).map(len).max(), len(col)) + 2
|
|
1106
1129
|
worksheet.set_column(i, i, max_len) # Set width
|
|
1107
1130
|
|
|
1108
1131
|
# Format style
|
|
1109
|
-
|
|
1110
|
-
|
|
1132
|
+
fmt = text_fmt # default
|
|
1133
|
+
for cols, f in rules:
|
|
1134
|
+
if cols is not None and col in cols:
|
|
1135
|
+
fmt = f
|
|
1136
|
+
break
|
|
1137
|
+
worksheet.set_column(i, i, max_len, fmt)
|
|
1111
1138
|
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
worksheet.set_column(i, i, max_len, text_fmt)
|
|
1139
|
+
# if cols_contain_number is not None:
|
|
1140
|
+
# for x in cols_contain_number:
|
|
1141
|
+
# self[x] = pd.to_numeric(self[x], errors="coerce")
|
|
1116
1142
|
|
|
1117
1143
|
|
|
1118
1144
|
# City
|
|
@@ -1289,3 +1315,14 @@ class DADF_WIP(DADF):
|
|
|
1289
1315
|
"""
|
|
1290
1316
|
|
|
1291
1317
|
pass
|
|
1318
|
+
|
|
1319
|
+
if __name__ == "__main__":
|
|
1320
|
+
from pathlib import Path
|
|
1321
|
+
|
|
1322
|
+
t = DADF.sample_df().show_distribution("number_range", show_percentage=False)
|
|
1323
|
+
t.da_export(
|
|
1324
|
+
Path(__file__).parent.joinpath("a.xlsx").resolve().__str__(),
|
|
1325
|
+
cols_contain_number=["number_range"],
|
|
1326
|
+
cols_contain_percentage=["percentage"],
|
|
1327
|
+
)
|
|
1328
|
+
print(t)
|
absfuyu/extra/da/dadf_base.py
CHANGED
absfuyu/extra/da/df_func.py
CHANGED
absfuyu/extra/da/mplt.py
CHANGED
absfuyu/extra/data_analysis.py
CHANGED
absfuyu/extra/pdf.py
CHANGED
absfuyu/extra/xml.py
CHANGED
absfuyu/fun/__init__.py
CHANGED
absfuyu/fun/rubik.py
CHANGED
absfuyu/fun/tarot.py
CHANGED
absfuyu/game/__init__.py
CHANGED
absfuyu/game/game_stat.py
CHANGED
absfuyu/game/sudoku.py
CHANGED
absfuyu/game/tictactoe.py
CHANGED
absfuyu/game/wordle.py
CHANGED
absfuyu/general/__init__.py
CHANGED
absfuyu/general/content.py
CHANGED
absfuyu/general/human.py
CHANGED