funcguard 0.2.56__tar.gz → 0.2.58__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.56 → funcguard-0.2.58}/PKG-INFO +3 -2
- {funcguard-0.2.56 → funcguard-0.2.58}/README.md +1 -0
- funcguard-0.2.58/funcguard/.version +1 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/__init__.py +8 -9
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/__init__.py +2 -1
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/filter.py +57 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/tools.py +1 -1
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard.egg-info/PKG-INFO +3 -2
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard.egg-info/SOURCES.txt +3 -2
- {funcguard-0.2.56 → funcguard-0.2.58}/setup.py +16 -6
- {funcguard-0.2.56 → funcguard-0.2.58}/LICENSE +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/calculate.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/core.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/ip_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/log_utils.py +0 -0
- {funcguard-0.2.56/funcguard/data_models → funcguard-0.2.58/funcguard/models}/__init__.py +0 -0
- {funcguard-0.2.56/funcguard/data_models → funcguard-0.2.58/funcguard/models}/request_models.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/convert_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/date_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/fill_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/json_utils/__init__.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/json_utils/json_parser.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/statistics/__init__.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/statistics/agg_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/statistics/count_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/statistics/df_statistics.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/pd_utils/statistics/mask_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/printer.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard/time_utils.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard.egg-info/dependency_links.txt +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard.egg-info/not-zip-safe +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard.egg-info/requires.txt +1 -1
- {funcguard-0.2.56 → funcguard-0.2.58}/funcguard.egg-info/top_level.txt +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/setup.cfg +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/tests/__init__.py +0 -0
- {funcguard-0.2.56 → funcguard-0.2.58}/tests/test_pd_filter_empty.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: funcguard
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.58
|
|
4
4
|
Summary: FuncGuard是一个Python库,提供函数执行超时控制、重试机制、HTTP请求封装和格式化打印工具。
|
|
5
5
|
Home-page: https://github.com/tinycen/funcguard
|
|
6
6
|
Author: tinycen
|
|
@@ -16,8 +16,8 @@ Classifier: Operating System :: OS Independent
|
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
License-File: LICENSE
|
|
19
|
-
Requires-Dist: requests
|
|
20
19
|
Requires-Dist: pandas
|
|
20
|
+
Requires-Dist: requests
|
|
21
21
|
Requires-Dist: curl_cffi
|
|
22
22
|
Dynamic: author
|
|
23
23
|
Dynamic: author-email
|
|
@@ -627,6 +627,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
|
|
|
627
627
|
| `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) |
|
|
628
628
|
| `pd_load_json` | JSON解析 | [查看](docs/pandas/json.md) |
|
|
629
629
|
| `pd_filter` | 数据筛选 | [查看](docs/pandas/filter.md) |
|
|
630
|
+
| `pd_select_columns` | 列选择(列表或txt文件) | [查看](docs/pandas/filter.md) |
|
|
630
631
|
| `pd_count` / `pd_value_counts` | 条件计数统计 | [查看](docs/pandas/count.md) |
|
|
631
632
|
| `pd_group_agg` | 分组聚合统计 | [查看](docs/pandas/agg.md) |
|
|
632
633
|
| `pd_build_mask` / `pd_build_masks` / `pd_combine_masks` | 掩码构建 | [查看](docs/pandas/mask.md) |
|
|
@@ -595,6 +595,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
|
|
|
595
595
|
| `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) |
|
|
596
596
|
| `pd_load_json` | JSON解析 | [查看](docs/pandas/json.md) |
|
|
597
597
|
| `pd_filter` | 数据筛选 | [查看](docs/pandas/filter.md) |
|
|
598
|
+
| `pd_select_columns` | 列选择(列表或txt文件) | [查看](docs/pandas/filter.md) |
|
|
598
599
|
| `pd_count` / `pd_value_counts` | 条件计数统计 | [查看](docs/pandas/count.md) |
|
|
599
600
|
| `pd_group_agg` | 分组聚合统计 | [查看](docs/pandas/agg.md) |
|
|
600
601
|
| `pd_build_mask` / `pd_build_masks` / `pd_combine_masks` | 掩码构建 | [查看](docs/pandas/mask.md) |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.58
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
except Exception:
|
|
5
|
-
__version__ = "unknown"
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
__author__ = "tinycen"
|
|
3
|
+
__version__ = (Path(__file__).parent / ".version").read_text().strip()
|
|
6
4
|
|
|
7
5
|
from .core import timeout_handler, retry_function, ask_select
|
|
8
6
|
from .tools import send_request, curl_cffi_request, check_url_valid, encode_basic_auth, md5_hash
|
|
@@ -33,6 +31,7 @@ from .pd_utils import (
|
|
|
33
31
|
|
|
34
32
|
# 数据筛选类
|
|
35
33
|
pd_filter,
|
|
34
|
+
pd_select_columns,
|
|
36
35
|
pd_build_mask,
|
|
37
36
|
pd_build_masks,
|
|
38
37
|
pd_combine_masks,
|
|
@@ -44,15 +43,14 @@ from .pd_utils import (
|
|
|
44
43
|
)
|
|
45
44
|
from .calculate import format_difference
|
|
46
45
|
|
|
47
|
-
from .
|
|
46
|
+
from .models import RequestLog
|
|
48
47
|
from .log_utils import setup_logger
|
|
49
48
|
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
__author__ = "ruocen"
|
|
53
|
-
|
|
54
50
|
# 暴露主要接口
|
|
55
51
|
__all__ = [
|
|
52
|
+
"__version__",
|
|
53
|
+
|
|
56
54
|
# 核心功能
|
|
57
55
|
"timeout_handler",
|
|
58
56
|
"retry_function",
|
|
@@ -105,6 +103,7 @@ __all__ = [
|
|
|
105
103
|
|
|
106
104
|
# 数据筛选类
|
|
107
105
|
"pd_filter",
|
|
106
|
+
"pd_select_columns",
|
|
108
107
|
|
|
109
108
|
# 统计分析类
|
|
110
109
|
"pd_build_mask",
|
|
@@ -20,7 +20,7 @@ from .statistics import (
|
|
|
20
20
|
pd_group_agg,
|
|
21
21
|
DataFrameStatistics
|
|
22
22
|
)
|
|
23
|
-
from .filter import pd_filter
|
|
23
|
+
from .filter import pd_filter, pd_select_columns
|
|
24
24
|
|
|
25
25
|
# 启用未来行为:禁止静默降级
|
|
26
26
|
pd.set_option("future.no_silent_downcasting", True)
|
|
@@ -44,6 +44,7 @@ __all__ = [
|
|
|
44
44
|
|
|
45
45
|
# 数据筛选类
|
|
46
46
|
"pd_filter",
|
|
47
|
+
"pd_select_columns",
|
|
47
48
|
|
|
48
49
|
# 统计分析类
|
|
49
50
|
"pd_build_mask",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import pandas as pd
|
|
2
|
+
from os import PathLike
|
|
2
3
|
|
|
3
4
|
from .statistics.mask_utils import build_single_mask, build_base_mask, combine_masks
|
|
4
5
|
|
|
@@ -100,3 +101,59 @@ def pd_filter(
|
|
|
100
101
|
f"不支持的条件类型: {type(first_item)}。"
|
|
101
102
|
"请使用 Tuple(单个条件)、List[Tuple](多个条件)或 List[pd.Series](掩码列表)"
|
|
102
103
|
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def pd_select_columns(
|
|
107
|
+
df: pd.DataFrame,
|
|
108
|
+
retain_columns: list[str] | str | PathLike[str],
|
|
109
|
+
raise_on_missing: bool = True
|
|
110
|
+
) -> pd.DataFrame:
|
|
111
|
+
"""
|
|
112
|
+
根据列名列表或txt文件路径裁剪DataFrame,仅保留指定列
|
|
113
|
+
|
|
114
|
+
参数:
|
|
115
|
+
- df (pd.DataFrame): 输入的DataFrame
|
|
116
|
+
- columns (list[str] | str):
|
|
117
|
+
- 列名列表: ['col1', 'col2', 'col3']
|
|
118
|
+
- txt文件路径: 'C:/path/to/columns.txt' 或 'columns.txt'
|
|
119
|
+
txt文件每行一个列名,支持空行和注释行(以#开头)
|
|
120
|
+
- raise_on_missing (bool): 当指定列在DataFrame中不存在时是否报错,
|
|
121
|
+
默认为True;为False时跳过缺失列
|
|
122
|
+
|
|
123
|
+
返回:
|
|
124
|
+
- pd.DataFrame: 仅保留指定列的新DataFrame
|
|
125
|
+
|
|
126
|
+
示例:
|
|
127
|
+
# 使用列名列表
|
|
128
|
+
result = pd_select_columns(df, ['name', 'age', 'salary'])
|
|
129
|
+
|
|
130
|
+
# 使用txt文件
|
|
131
|
+
result = pd_select_columns(df, 'config/selected_columns.txt')
|
|
132
|
+
|
|
133
|
+
# 跳过缺失列
|
|
134
|
+
result = pd_select_columns(df, ['name', 'age'], raise_on_missing=False)
|
|
135
|
+
|
|
136
|
+
"""
|
|
137
|
+
if df.empty:
|
|
138
|
+
return df.copy()
|
|
139
|
+
|
|
140
|
+
# 处理txt文件路径
|
|
141
|
+
if isinstance(retain_columns, list):
|
|
142
|
+
column_list = retain_columns
|
|
143
|
+
else:
|
|
144
|
+
column_list = []
|
|
145
|
+
with open(retain_columns, 'r', encoding='utf-8') as f:
|
|
146
|
+
for line in f:
|
|
147
|
+
line = line.strip()
|
|
148
|
+
# 跳过空行和注释行
|
|
149
|
+
if line and not line.startswith('#'):
|
|
150
|
+
column_list.append(line)
|
|
151
|
+
|
|
152
|
+
# 检查列是否存在
|
|
153
|
+
missing_cols = set(column_list) - set(df.columns)
|
|
154
|
+
if missing_cols:
|
|
155
|
+
if raise_on_missing:
|
|
156
|
+
raise ValueError(f"DataFrame中不存在以下列: {missing_cols}")
|
|
157
|
+
column_list = [col for col in column_list if col in df.columns]
|
|
158
|
+
|
|
159
|
+
return df[column_list].copy()
|
|
@@ -7,7 +7,7 @@ from curl_cffi import requests as cffi_requests
|
|
|
7
7
|
|
|
8
8
|
from typing import Any, Literal
|
|
9
9
|
from .core import retry_function
|
|
10
|
-
from .
|
|
10
|
+
from .models import RequestLog
|
|
11
11
|
|
|
12
12
|
# HTTP 方法类型别名
|
|
13
13
|
HttpMethod = Literal["GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "TRACE", "PATCH"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: funcguard
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.58
|
|
4
4
|
Summary: FuncGuard是一个Python库,提供函数执行超时控制、重试机制、HTTP请求封装和格式化打印工具。
|
|
5
5
|
Home-page: https://github.com/tinycen/funcguard
|
|
6
6
|
Author: tinycen
|
|
@@ -16,8 +16,8 @@ Classifier: Operating System :: OS Independent
|
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
License-File: LICENSE
|
|
19
|
-
Requires-Dist: requests
|
|
20
19
|
Requires-Dist: pandas
|
|
20
|
+
Requires-Dist: requests
|
|
21
21
|
Requires-Dist: curl_cffi
|
|
22
22
|
Dynamic: author
|
|
23
23
|
Dynamic: author-email
|
|
@@ -627,6 +627,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
|
|
|
627
627
|
| `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) |
|
|
628
628
|
| `pd_load_json` | JSON解析 | [查看](docs/pandas/json.md) |
|
|
629
629
|
| `pd_filter` | 数据筛选 | [查看](docs/pandas/filter.md) |
|
|
630
|
+
| `pd_select_columns` | 列选择(列表或txt文件) | [查看](docs/pandas/filter.md) |
|
|
630
631
|
| `pd_count` / `pd_value_counts` | 条件计数统计 | [查看](docs/pandas/count.md) |
|
|
631
632
|
| `pd_group_agg` | 分组聚合统计 | [查看](docs/pandas/agg.md) |
|
|
632
633
|
| `pd_build_mask` / `pd_build_masks` / `pd_combine_masks` | 掩码构建 | [查看](docs/pandas/mask.md) |
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
LICENSE
|
|
2
2
|
README.md
|
|
3
3
|
setup.py
|
|
4
|
+
funcguard/.version
|
|
4
5
|
funcguard/__init__.py
|
|
5
6
|
funcguard/calculate.py
|
|
6
7
|
funcguard/core.py
|
|
@@ -15,8 +16,8 @@ funcguard.egg-info/dependency_links.txt
|
|
|
15
16
|
funcguard.egg-info/not-zip-safe
|
|
16
17
|
funcguard.egg-info/requires.txt
|
|
17
18
|
funcguard.egg-info/top_level.txt
|
|
18
|
-
funcguard/
|
|
19
|
-
funcguard/
|
|
19
|
+
funcguard/models/__init__.py
|
|
20
|
+
funcguard/models/request_models.py
|
|
20
21
|
funcguard/pd_utils/__init__.py
|
|
21
22
|
funcguard/pd_utils/convert_utils.py
|
|
22
23
|
funcguard/pd_utils/date_utils.py
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
from setuptools import setup, find_packages
|
|
2
3
|
|
|
3
4
|
# 读取README文件
|
|
@@ -7,15 +8,19 @@ try:
|
|
|
7
8
|
except FileNotFoundError:
|
|
8
9
|
long_description = 'A funcguard for Python.'
|
|
9
10
|
|
|
11
|
+
root_dir = os.path.dirname(__file__)
|
|
12
|
+
|
|
13
|
+
with open(os.path.join(root_dir, "requirements.txt"), encoding="utf-8") as fh:
|
|
14
|
+
requirements = [line.strip() for line in fh if line.strip() and not line.startswith("#")]
|
|
15
|
+
|
|
16
|
+
with open(os.path.join(root_dir, "funcguard", ".version"), encoding="utf-8") as fh:
|
|
17
|
+
version = "v" + fh.read().strip()
|
|
18
|
+
|
|
10
19
|
setup(
|
|
11
20
|
name='funcguard',
|
|
12
|
-
version=
|
|
21
|
+
version=version,
|
|
13
22
|
packages=find_packages(),
|
|
14
|
-
install_requires=
|
|
15
|
-
'requests',
|
|
16
|
-
'pandas',
|
|
17
|
-
'curl_cffi',
|
|
18
|
-
],
|
|
23
|
+
install_requires=requirements,
|
|
19
24
|
author='tinycen',
|
|
20
25
|
author_email='sky_ruocen@qq.com',
|
|
21
26
|
description='FuncGuard是一个Python库,提供函数执行超时控制、重试机制、HTTP请求封装和格式化打印工具。',
|
|
@@ -35,4 +40,9 @@ setup(
|
|
|
35
40
|
python_requires='>=3.10',
|
|
36
41
|
include_package_data=True,
|
|
37
42
|
zip_safe=False,
|
|
43
|
+
package_data={
|
|
44
|
+
"funcguard": [
|
|
45
|
+
".version",
|
|
46
|
+
]
|
|
47
|
+
},
|
|
38
48
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funcguard-0.2.56/funcguard/data_models → funcguard-0.2.58/funcguard/models}/request_models.py
RENAMED
|
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
|