funcguard 0.2.41__tar.gz → 0.2.43__tar.gz

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.
Files changed (34) hide show
  1. {funcguard-0.2.41 → funcguard-0.2.43}/PKG-INFO +2 -2
  2. {funcguard-0.2.41 → funcguard-0.2.43}/README.md +1 -1
  3. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/__init__.py +4 -2
  4. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/__init__.py +3 -1
  5. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/convert_utils.py +42 -1
  6. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/statistics/agg_utils.py +10 -7
  7. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/statistics/count_utils.py +10 -6
  8. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/statistics/df_statistics.py +20 -14
  9. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard.egg-info/PKG-INFO +2 -2
  10. {funcguard-0.2.41 → funcguard-0.2.43}/setup.py +1 -1
  11. {funcguard-0.2.41 → funcguard-0.2.43}/LICENSE +0 -0
  12. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/calculate.py +0 -0
  13. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/core.py +0 -0
  14. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/data_models/__init__.py +0 -0
  15. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/data_models/request_models.py +0 -0
  16. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/ip_utils.py +0 -0
  17. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/log_utils.py +0 -0
  18. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/date_utils.py +0 -0
  19. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/fill_round.py +0 -0
  20. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/filter.py +0 -0
  21. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/json_utils/__init__.py +0 -0
  22. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/json_utils/json_parser.py +0 -0
  23. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/statistics/__init__.py +0 -0
  24. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/pd_utils/statistics/mask_utils.py +0 -0
  25. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/printer.py +0 -0
  26. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/time_utils.py +0 -0
  27. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard/tools.py +0 -0
  28. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard.egg-info/SOURCES.txt +0 -0
  29. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard.egg-info/dependency_links.txt +0 -0
  30. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard.egg-info/not-zip-safe +0 -0
  31. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard.egg-info/requires.txt +0 -0
  32. {funcguard-0.2.41 → funcguard-0.2.43}/funcguard.egg-info/top_level.txt +0 -0
  33. {funcguard-0.2.41 → funcguard-0.2.43}/setup.cfg +0 -0
  34. {funcguard-0.2.41 → funcguard-0.2.43}/tests/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: funcguard
3
- Version: 0.2.41
3
+ Version: 0.2.43
4
4
  Summary: FuncGuard是一个Python库,提供函数执行超时控制、重试机制、HTTP请求封装和格式化打印工具。
5
5
  Home-page: https://github.com/tinycen/funcguard
6
6
  Author: tinycen
@@ -542,7 +542,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
542
542
  | 函数/类名 | 功能说明 | 文档 |
543
543
  |-----------|----------|------|
544
544
  | `pd_fill_na` / `pd_fill_nat` | 数据填充 | [查看](docs/pandas/fill.md) |
545
- | `pd_convert_columns` / `pd_convert_decimal` / `pd_convert_numeric_series` / `pd_convert_str_datetime` / `pd_convert_datetime_str` | 类型转换 | [查看](docs/pandas/convert.md) |
545
+ | `pd_convert_columns` / `pd_convert_decimal` / `pd_convert_numeric_series` / `pd_convert_str_datetime` / `pd_convert_datetime_str` / `pd_convert_series` | 类型转换 | [查看](docs/pandas/convert.md) |
546
546
  | `pd_load_json` | JSON解析 | [查看](docs/pandas/json.md) |
547
547
  | `pd_filter` | 数据筛选 | [查看](docs/pandas/filter.md) |
548
548
  | `pd_count` / `pd_value_counts` | 条件计数统计 | [查看](docs/pandas/count.md) |
@@ -515,7 +515,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
515
515
  | 函数/类名 | 功能说明 | 文档 |
516
516
  |-----------|----------|------|
517
517
  | `pd_fill_na` / `pd_fill_nat` | 数据填充 | [查看](docs/pandas/fill.md) |
518
- | `pd_convert_columns` / `pd_convert_decimal` / `pd_convert_numeric_series` / `pd_convert_str_datetime` / `pd_convert_datetime_str` | 类型转换 | [查看](docs/pandas/convert.md) |
518
+ | `pd_convert_columns` / `pd_convert_decimal` / `pd_convert_numeric_series` / `pd_convert_str_datetime` / `pd_convert_datetime_str` / `pd_convert_series` | 类型转换 | [查看](docs/pandas/convert.md) |
519
519
  | `pd_load_json` | JSON解析 | [查看](docs/pandas/json.md) |
520
520
  | `pd_filter` | 数据筛选 | [查看](docs/pandas/filter.md) |
521
521
  | `pd_count` / `pd_value_counts` | 条件计数统计 | [查看](docs/pandas/count.md) |
@@ -14,7 +14,8 @@ from .pd_utils import (
14
14
  round_columns as pd_round_columns,
15
15
  cal_date_diff as pd_cal_date_diff,
16
16
 
17
- # 数据类型转换类
17
+ # 数据转换类
18
+ convert_series as pd_convert_series,
18
19
  convert_columns as pd_convert_columns,
19
20
  convert_decimal as pd_convert_decimal,
20
21
  convert_numeric_series as pd_convert_numeric_series,
@@ -86,7 +87,8 @@ __all__ = [
86
87
  "pd_fill_nat",
87
88
  "pd_round_columns",
88
89
 
89
- # 数据类型转换类
90
+ # 数据转换类
91
+ "pd_convert_series",
90
92
  "pd_cal_date_diff",
91
93
  "pd_convert_columns",
92
94
  "pd_convert_decimal",
@@ -2,6 +2,7 @@ import pandas as pd
2
2
  from .fill_round import fill_na, round_columns
3
3
  from .date_utils import fill_nat, cal_date_diff
4
4
  from .convert_utils import (
5
+ convert_series,
5
6
  convert_columns,
6
7
  convert_decimal,
7
8
  convert_numeric_series,
@@ -31,7 +32,8 @@ __all__ = [
31
32
  'round_columns',
32
33
  'cal_date_diff',
33
34
 
34
- # 数据类型转换类
35
+ # 数据转换类
36
+ 'convert_series',
35
37
  'convert_columns',
36
38
  'convert_decimal',
37
39
  'convert_numeric_series',
@@ -1,6 +1,6 @@
1
1
  import pandas as pd
2
2
  from decimal import Decimal
3
- from typing import Union, List, Dict, Any, Optional
3
+ from typing import Union, List, Dict, Any, Optional, Literal
4
4
  from pandas import (
5
5
  Int64Dtype,
6
6
  Float64Dtype,
@@ -10,6 +10,47 @@ from pandas import (
10
10
  from .json_utils import json_loads
11
11
 
12
12
 
13
+ def convert_series(
14
+ data: pd.Series,
15
+ return_type: Literal["dict", "df", "series"] = "dict"
16
+ ) -> Union[Dict[Any, Union[int, float]], pd.DataFrame, pd.Series]:
17
+ """
18
+ 将 pandas Series 格式化为指定的返回类型。
19
+
20
+ 参数:
21
+ - data (pd.Series):输入的 pandas Series 数据。
22
+ - return_type (str):返回类型,支持:
23
+ - "dict":返回字典(默认)。
24
+ - "df":返回 DataFrame。
25
+ - "series":返回 pandas Series。
26
+
27
+ 返回:
28
+ - Union[Dict[Any, Union[int, float]], pd.DataFrame, pd.Series]:
29
+ 根据 return_type 返回格式化后的结果。
30
+
31
+ 示例:
32
+ >>> series = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
33
+ >>> convert_series(series, "dict")
34
+ {'a': 1, 'b': 2, 'c': 3}
35
+ >>> convert_series(series, "df")
36
+ 0
37
+ a 1
38
+ b 2
39
+ c 3
40
+ >>> convert_series(series, "series")
41
+ a 1
42
+ b 2
43
+ c 3
44
+ dtype: int64
45
+ """
46
+
47
+ if return_type == "dict":
48
+ return data.to_dict()
49
+ elif return_type == "df":
50
+ return data.to_frame()
51
+ else: # "series"
52
+ return data
53
+
13
54
 
14
55
  # 数据类型映射常量
15
56
  TYPE_MAPPING = {
@@ -1,4 +1,3 @@
1
-
2
1
  """
3
2
  聚合(aggregation)操作工具模块。
4
3
 
@@ -7,8 +6,9 @@ sum、mean、max、min、count、median、std、var等聚合计算。
7
6
  """
8
7
 
9
8
  import pandas as pd
10
- from typing import Any, Dict, Optional, Union, List, Tuple
9
+ from typing import Any, Dict, Optional, Union, List, Tuple, Literal
11
10
  from .mask_utils import build_single_mask, build_base_mask
11
+ from ..convert_utils import convert_series
12
12
 
13
13
 
14
14
  def group_agg(
@@ -20,8 +20,9 @@ def group_agg(
20
20
  conditions: Optional[Union[Tuple, List[Tuple]]] = None,
21
21
  logic: str = "and",
22
22
  true_mask: Optional[pd.Series] = None,
23
- false_mask: Optional[pd.Series] = None
24
- ) -> Dict[Any, Union[int, float]]:
23
+ false_mask: Optional[pd.Series] = None,
24
+ return_type: Literal["dict", "df", "series"] = "dict"
25
+ ) -> Union[Dict[Any, Union[int, float]], pd.DataFrame, pd.Series]:
25
26
  """
26
27
  按指定列分组,对另一列进行聚合统计。
27
28
 
@@ -38,9 +39,11 @@ def group_agg(
38
39
  - logic (str):逻辑操作类型,"and" 或 "or",默认为 "and"。
39
40
  - true_mask (pd.Series):初始True掩码,默认为None。
40
41
  - false_mask (pd.Series):初始False掩码,默认为None。
42
+ - return_type (str):返回类型,支持 "dict"(字典)、"df"(DataFrame)和 "series"(Series),
43
+ 默认为 "dict"。
41
44
 
42
45
  返回:
43
- - Dict[Any, Union[int, float]]:以分组值为键,聚合结果为值的字典。
46
+ - Union[Dict[Any, Union[int, float]], pd.Series]:以分组值为键,聚合结果为值的字典或Series。
44
47
 
45
48
  示例:
46
49
  >>> group_agg(df, "category", "amount", "sum")
@@ -79,5 +82,5 @@ def group_agg(
79
82
  elif sort == "desc":
80
83
  result_series = result_series.sort_values(ascending=False)
81
84
 
82
- # 转换为字典返回
83
- return result_series.to_dict()
85
+ # 格式化并返回结果
86
+ return convert_series(result_series, return_type)
@@ -1,6 +1,7 @@
1
1
  import pandas as pd
2
- from typing import List, Tuple, Union, Optional, Dict, Any, Mapping
2
+ from typing import List, Tuple, Union, Optional, Dict, Any, Mapping, Literal
3
3
  from .mask_utils import build_single_mask, build_base_mask
4
+ from ..convert_utils import convert_series
4
5
 
5
6
 
6
7
  def value_counts(
@@ -12,8 +13,9 @@ def value_counts(
12
13
  conditions: Optional[Union[Tuple, List[Tuple]]] = None,
13
14
  logic: str = "and",
14
15
  true_mask: Optional[pd.Series] = None,
15
- false_mask: Optional[pd.Series] = None
16
- ) -> Mapping[Any, Union[int, float]]:
16
+ false_mask: Optional[pd.Series] = None,
17
+ return_type: Literal["dict", "df", "series"] = "dict"
18
+ ) -> Union[Mapping[Any, Union[int, float]], pd.DataFrame, pd.Series]:
17
19
  """
18
20
  统计DataFrame指定列中不同值的计数数据。
19
21
 
@@ -29,9 +31,11 @@ def value_counts(
29
31
  - logic (str):逻辑操作类型,"and" 或 "or",默认为 "and"。
30
32
  - true_mask (pd.Series):初始True掩码,默认为None。
31
33
  - false_mask (pd.Series):初始False掩码,默认为None。
34
+ - return_type (str):返回类型,支持 "dict"(字典)、"df"(DataFrame)和 "series"(Series),
35
+ 默认为 "dict"。
32
36
 
33
37
  返回:
34
- - Mapping[Any, Union[int, float]]:以值为键,计数/百分比为值的字典。
38
+ - Union[Mapping[Any, Union[int, float]], pd.Series]:以值为键,计数/百分比为值的字典或Series。
35
39
 
36
40
  示例:
37
41
  >>> value_counts(df, "status")
@@ -74,8 +78,8 @@ def value_counts(
74
78
  dropna=dropna
75
79
  )
76
80
 
77
- # 转换为字典返回
78
- return result_series.to_dict()
81
+ # 格式化并返回结果
82
+ return convert_series(result_series, return_type)
79
83
 
80
84
 
81
85
  def count(
@@ -1,5 +1,5 @@
1
1
  import pandas as pd
2
- from typing import Any, Dict, List, Tuple, Union, Optional, Mapping
2
+ from typing import Any, Dict, List, Tuple, Union, Optional, Mapping, Literal
3
3
  from .mask_utils import build_single_mask as _original_build_single_mask, build_base_mask as _original_build_base_mask, combine_masks
4
4
  from .count_utils import count as _original_count, value_counts as _original_value_counts
5
5
  from .agg_utils import group_agg as _original_group_agg
@@ -43,8 +43,8 @@ class DataFrameStatistics:
43
43
  self._false_mask = pd.Series([False] * self._length, index=self._index)
44
44
 
45
45
 
46
- def build_base_mask(self, conditions: List[Tuple], logic: str = "and",
47
- true_mask: Optional[pd.Series] = None,
46
+ def build_base_mask(self, conditions: List[Tuple], logic: str = "and",
47
+ true_mask: Optional[pd.Series] = None,
48
48
  false_mask: Optional[pd.Series] = None) -> pd.Series:
49
49
  """
50
50
  构建基础查询条件掩码,自动使用内部掩码参数
@@ -54,7 +54,7 @@ class DataFrameStatistics:
54
54
  - logic (str):逻辑操作类型,"and" 或 "or",默认为 "and"
55
55
  - true_mask (pd.Series):初始True掩码,默认为None(使用内部缓存)
56
56
  - false_mask (pd.Series):初始False掩码,默认为None(使用内部缓存)
57
-
57
+
58
58
  返回:
59
59
  - pd.Series:布尔掩码,True表示符合条件的行
60
60
  """
@@ -69,10 +69,10 @@ class DataFrameStatistics:
69
69
  def build_single_mask(self, condition: Tuple) -> pd.Series:
70
70
  """
71
71
  构建单个掩码,用于简单条件判断,自动使用内部DataFrame
72
-
72
+
73
73
  参数:
74
74
  - condition (Tuple):条件元组,包含(列名, 运算符, 值)
75
-
75
+
76
76
  返回:
77
77
  - pd.Series:布尔掩码,True表示符合条件的行
78
78
  **注意**:此Series是通过原生pandas表达式(df[col] > value)直接返回,
@@ -113,8 +113,9 @@ class DataFrameStatistics:
113
113
  conditions: Optional[Union[Tuple, List[Tuple]]] = None,
114
114
  logic: str = "and",
115
115
  true_mask: Optional[pd.Series] = None,
116
- false_mask: Optional[pd.Series] = None
117
- ) -> Mapping[Any, Union[int, float]]:
116
+ false_mask: Optional[pd.Series] = None,
117
+ return_type: Literal["dict", "df", "series"] = "dict"
118
+ ) -> Union[Mapping[Any, Union[int, float]], pd.DataFrame, pd.Series]:
118
119
  """
119
120
  统计指定列中不同值的计数数据,自动使用内部掩码参数
120
121
 
@@ -128,9 +129,11 @@ class DataFrameStatistics:
128
129
  - logic (str):逻辑操作类型,"and" 或 "or",默认为 "and"
129
130
  - true_mask (pd.Series):初始True掩码,默认为None(使用内部缓存)
130
131
  - false_mask (pd.Series):初始False掩码,默认为None(使用内部缓存)
132
+ - return_type (str):返回类型,支持 "dict"(字典)、"df"(DataFrame)和 "series"(Series),
133
+ 默认为 "dict"。
131
134
 
132
135
  返回:
133
- - Mapping[Any, Union[int, float]]:以值为键,计数/百分比为值的字典
136
+ - Union[Mapping[Any, Union[int, float]], pd.DataFrame, pd.Series]:以值为键,计数/百分比为值的字典、DataFrame或Series
134
137
 
135
138
  示例:
136
139
  >>> stats.value_counts("status")
@@ -151,7 +154,7 @@ class DataFrameStatistics:
151
154
  false_mask = self._false_mask
152
155
  return _original_value_counts(
153
156
  self._df, column, mode, sort, dropna,
154
- conditions, logic, true_mask, false_mask
157
+ conditions, logic, true_mask, false_mask, return_type
155
158
  )
156
159
 
157
160
 
@@ -164,8 +167,9 @@ class DataFrameStatistics:
164
167
  conditions: Optional[Union[Tuple, List[Tuple]]] = None,
165
168
  logic: str = "and",
166
169
  true_mask: Optional[pd.Series] = None,
167
- false_mask: Optional[pd.Series] = None
168
- ) -> Dict[Any, Union[int, float]]:
170
+ false_mask: Optional[pd.Series] = None,
171
+ return_type: Literal["dict", "df", "series"] = "dict"
172
+ ) -> Union[Dict[Any, Union[int, float]], pd.DataFrame, pd.Series]:
169
173
  """
170
174
  按指定列分组,对另一列进行聚合统计,自动使用内部掩码参数
171
175
 
@@ -180,9 +184,11 @@ class DataFrameStatistics:
180
184
  - logic (str):逻辑操作类型,"and" 或 "or",默认为 "and"
181
185
  - true_mask (pd.Series):初始True掩码,默认为None(使用内部缓存)
182
186
  - false_mask (pd.Series):初始False掩码,默认为None(使用内部缓存)
187
+ - return_type (str):返回类型,支持 "dict"(字典)、"df"(DataFrame)和 "series"(Series),
188
+ 默认为 "dict"。
183
189
 
184
190
  返回:
185
- - Dict[Any, Union[int, float]]:以分组值为键,聚合结果为值的字典
191
+ - Union[Dict[Any, Union[int, float]], pd.DataFrame, pd.Series]:以分组值为键,聚合结果为值的字典、DataFrame或Series
186
192
 
187
193
  示例:
188
194
  >>> stats.group_agg("category", "amount", "sum")
@@ -199,7 +205,7 @@ class DataFrameStatistics:
199
205
  false_mask = self._false_mask
200
206
  return _original_group_agg(
201
207
  self._df, group_col, agg_col, agg_func, sort,
202
- conditions, logic, true_mask, false_mask
208
+ conditions, logic, true_mask, false_mask, return_type
203
209
  )
204
210
 
205
211
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: funcguard
3
- Version: 0.2.41
3
+ Version: 0.2.43
4
4
  Summary: FuncGuard是一个Python库,提供函数执行超时控制、重试机制、HTTP请求封装和格式化打印工具。
5
5
  Home-page: https://github.com/tinycen/funcguard
6
6
  Author: tinycen
@@ -542,7 +542,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
542
542
  | 函数/类名 | 功能说明 | 文档 |
543
543
  |-----------|----------|------|
544
544
  | `pd_fill_na` / `pd_fill_nat` | 数据填充 | [查看](docs/pandas/fill.md) |
545
- | `pd_convert_columns` / `pd_convert_decimal` / `pd_convert_numeric_series` / `pd_convert_str_datetime` / `pd_convert_datetime_str` | 类型转换 | [查看](docs/pandas/convert.md) |
545
+ | `pd_convert_columns` / `pd_convert_decimal` / `pd_convert_numeric_series` / `pd_convert_str_datetime` / `pd_convert_datetime_str` / `pd_convert_series` | 类型转换 | [查看](docs/pandas/convert.md) |
546
546
  | `pd_load_json` | JSON解析 | [查看](docs/pandas/json.md) |
547
547
  | `pd_filter` | 数据筛选 | [查看](docs/pandas/filter.md) |
548
548
  | `pd_count` / `pd_value_counts` | 条件计数统计 | [查看](docs/pandas/count.md) |
@@ -9,7 +9,7 @@ except FileNotFoundError:
9
9
 
10
10
  setup(
11
11
  name='funcguard',
12
- version='0.2.41',
12
+ version='0.2.43',
13
13
  packages=find_packages(),
14
14
  install_requires=[
15
15
  'requests',
File without changes
File without changes
File without changes
File without changes