funcguard 0.2.45__tar.gz → 0.2.47__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.
- {funcguard-0.2.45 → funcguard-0.2.47}/PKG-INFO +1 -1
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/core.py +4 -2
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/filter.py +1 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/statistics/mask_utils.py +20 -2
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard.egg-info/PKG-INFO +1 -1
- {funcguard-0.2.45 → funcguard-0.2.47}/setup.py +1 -1
- {funcguard-0.2.45 → funcguard-0.2.47}/LICENSE +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/README.md +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/__init__.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/calculate.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/data_models/__init__.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/data_models/request_models.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/ip_utils.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/log_utils.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/__init__.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/convert_utils.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/date_utils.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/fill_round.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/json_utils/__init__.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/json_utils/json_parser.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/statistics/__init__.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/statistics/agg_utils.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/statistics/count_utils.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/pd_utils/statistics/df_statistics.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/printer.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/time_utils.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard/tools.py +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard.egg-info/SOURCES.txt +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard.egg-info/dependency_links.txt +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard.egg-info/not-zip-safe +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard.egg-info/requires.txt +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/funcguard.egg-info/top_level.txt +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/setup.cfg +0 -0
- {funcguard-0.2.45 → funcguard-0.2.47}/tests/__init__.py +0 -0
|
@@ -171,8 +171,10 @@ def ask_select(
|
|
|
171
171
|
# 验证输入
|
|
172
172
|
try:
|
|
173
173
|
choice = int(user_input)
|
|
174
|
-
if
|
|
175
|
-
|
|
174
|
+
if 0 <= choice < len(items):
|
|
175
|
+
selected_key, selected_label = items[choice]
|
|
176
|
+
print(f"\n已选择 {choice}:{selected_label}")
|
|
177
|
+
return selected_key
|
|
176
178
|
except ValueError:
|
|
177
179
|
pass
|
|
178
180
|
|
|
@@ -2,6 +2,24 @@ import pandas as pd
|
|
|
2
2
|
from typing import List, Tuple, Optional
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
def _is_empty(x):
|
|
6
|
+
"""检查值是否为空(NaN/None、空字符串、空列表、空元组、空字典、空集合)"""
|
|
7
|
+
if pd.isna(x):
|
|
8
|
+
return True
|
|
9
|
+
if isinstance(x, (str, list, tuple, dict, set)):
|
|
10
|
+
return len(x) == 0
|
|
11
|
+
return False
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _is_not_empty(x):
|
|
15
|
+
"""检查值是否非空(与_is_empty相反)"""
|
|
16
|
+
if pd.isna(x):
|
|
17
|
+
return False
|
|
18
|
+
if isinstance(x, (str, list, tuple, dict, set)):
|
|
19
|
+
return len(x) > 0
|
|
20
|
+
return True
|
|
21
|
+
|
|
22
|
+
|
|
5
23
|
def build_single_mask(df: pd.DataFrame, condition: Tuple) -> pd.Series:
|
|
6
24
|
"""
|
|
7
25
|
构建单个掩码,用于简单条件判断
|
|
@@ -64,9 +82,9 @@ def build_single_mask(df: pd.DataFrame, condition: Tuple) -> pd.Series:
|
|
|
64
82
|
return df[column].notnull()
|
|
65
83
|
|
|
66
84
|
elif op == "empty":
|
|
67
|
-
return df[column].
|
|
85
|
+
return df[column].apply(_is_empty)
|
|
68
86
|
elif op == "not empty":
|
|
69
|
-
return df[column].
|
|
87
|
+
return df[column].apply(_is_not_empty)
|
|
70
88
|
|
|
71
89
|
elif op == "contains":
|
|
72
90
|
return df[column].str.contains(value, na=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|