xlin 0.1.38__tar.gz → 0.2.2__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.
- xlin-0.2.2/PKG-INFO +282 -0
- xlin-0.2.2/README.md +252 -0
- {xlin-0.1.38 → xlin-0.2.2}/pyproject.toml +1 -1
- xlin-0.2.2/xlin/__init__.py +12 -0
- xlin-0.1.38/xlin/read_as_dataframe.py → xlin-0.2.2/xlin/dataframe_util.py +92 -3
- xlin-0.2.2/xlin/datetime_util.py +175 -0
- xlin-0.1.38/xlin/util.py → xlin-0.2.2/xlin/file_util.py +0 -108
- xlin-0.2.2/xlin/image_util.py +248 -0
- xlin-0.1.38/xlin/jsonl.py → xlin-0.2.2/xlin/jsonlist_util.py +15 -2
- xlin-0.1.38/xlin/multiprocess_mapping.py → xlin-0.2.2/xlin/multiprocess_util.py +3 -3
- {xlin-0.1.38 → xlin-0.2.2}/xlin/statistic.py +17 -1
- xlin-0.2.2/xlin/text_util.py +24 -0
- xlin-0.1.38/xlin/timing.py → xlin-0.2.2/xlin/timing_util.py +14 -0
- xlin-0.1.38/PKG-INFO +0 -33
- xlin-0.1.38/README.md +0 -2
- xlin-0.1.38/xlin/__init__.py +0 -10
- xlin-0.1.38/xlin/ischinese.py +0 -13
- {xlin-0.1.38 → xlin-0.2.2}/LICENSE +0 -0
- {xlin-0.1.38 → xlin-0.2.2}/xlin/metric.py +0 -0
- /xlin-0.1.38/xlin/xls2xlsx.py → /xlin-0.2.2/xlin/xlsx_util.py +0 -0
- /xlin-0.1.38/xlin/yaml.py → /xlin-0.2.2/xlin/yaml_util.py +0 -0
xlin-0.2.2/PKG-INFO
ADDED
@@ -0,0 +1,282 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: xlin
|
3
|
+
Version: 0.2.2
|
4
|
+
Summary: toolbox for LinXueyuan
|
5
|
+
License: MIT
|
6
|
+
Author: LinXueyuanStdio
|
7
|
+
Author-email: 23211526+LinXueyuanStdio@users.noreply.github.com
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
9
|
+
Classifier: Programming Language :: Python :: 2
|
10
|
+
Classifier: Programming Language :: Python :: 2.7
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
12
|
+
Classifier: Programming Language :: Python :: 3.4
|
13
|
+
Classifier: Programming Language :: Python :: 3.5
|
14
|
+
Classifier: Programming Language :: Python :: 3.6
|
15
|
+
Classifier: Programming Language :: Python :: 3.7
|
16
|
+
Classifier: Programming Language :: Python :: 3.8
|
17
|
+
Classifier: Programming Language :: Python :: 3.9
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
21
|
+
Requires-Dist: loguru
|
22
|
+
Requires-Dist: pandas
|
23
|
+
Requires-Dist: pyexcel
|
24
|
+
Requires-Dist: pyexcel-xls
|
25
|
+
Requires-Dist: pyexcel-xlsx
|
26
|
+
Requires-Dist: pyyaml
|
27
|
+
Requires-Dist: tqdm
|
28
|
+
Requires-Dist: xlsxwriter
|
29
|
+
Description-Content-Type: text/markdown
|
30
|
+
|
31
|
+
# xlin
|
32
|
+
|
33
|
+
Python 工具代码集合,提供了丰富的工具函数,涵盖文件操作、数据处理、多进程处理等多个方面,旨在提高开发效率。
|
34
|
+
|
35
|
+
## 安装
|
36
|
+
|
37
|
+
```bash
|
38
|
+
pip install xlin --upgrade
|
39
|
+
```
|
40
|
+
|
41
|
+
## 使用方法
|
42
|
+
|
43
|
+
```python
|
44
|
+
from xlin import *
|
45
|
+
```
|
46
|
+
|
47
|
+
### 文件操作类:`ls`,`rm` 和 `cp`
|
48
|
+
- `ls`: 列出文件或文件夹下的所有文件。
|
49
|
+
- `rm`: 删除文件或文件夹。
|
50
|
+
- `cp`: 复制文件或文件夹。
|
51
|
+
|
52
|
+
```python
|
53
|
+
from xlin import ls, rm, cp
|
54
|
+
|
55
|
+
dir_path = "./data"
|
56
|
+
dir_path = "/mnt/data.json"
|
57
|
+
dir_path = "./data,/mnt/data.json"
|
58
|
+
dir_path = ["./data", "/mnt/data.json", "./data,/mnt/data.json"]
|
59
|
+
def filter_func(path: Path) -> bool:
|
60
|
+
return path.name.endswith('.json')
|
61
|
+
|
62
|
+
filepaths: list[Path] = ls(dir_path, filter=filter_func)
|
63
|
+
rm(dir_path)
|
64
|
+
cp(dir_path, "./backup_data") # 会根据最大公共前缀保持文件夹结构
|
65
|
+
```
|
66
|
+
|
67
|
+
### 读取类
|
68
|
+
|
69
|
+
- `read_as_json_list`:读取 JSON 文件为列表。
|
70
|
+
- `read_as_dataframe`:读取文件为表格。如果是文件夹,则读取文件夹下的所有文件为表格并拼接。
|
71
|
+
- `read_as_dataframe_dict`:读取文件为字典,键为表头,值为列数据。
|
72
|
+
- `load_text`:加载文本文件。
|
73
|
+
- `load_yaml`:加载 YAML 文件。
|
74
|
+
- `load_json`:加载 JSON 文件。
|
75
|
+
- `load_json_list`:加载 JSON 列表文件。
|
76
|
+
|
77
|
+
|
78
|
+
> `read_as_**` 函数支持文件夹或者文件,支持多种文件格式,包括 Excel、CSV、JSON、Parquet 等。
|
79
|
+
>
|
80
|
+
> `load_**` 函数主要用于加载单个文件,支持文本、YAML 和 JSON 格式。
|
81
|
+
|
82
|
+
```python
|
83
|
+
from xlin import *
|
84
|
+
import pandas as pd
|
85
|
+
|
86
|
+
dir_path = "./data"
|
87
|
+
dir_path = "./data,data.xlsx,data.csv,data.json,data.jsonl,data.parquet,data.feather,data.pkl,data.h5,data.txt,data.tsv,data.xml,data.html,data.db"
|
88
|
+
dir_path = "./data,/mnt/data.json"
|
89
|
+
dir_path = ["./data", "/mnt/data.json", "./data,/mnt/data.json"]
|
90
|
+
df_single = read_as_dataframe(dir_path)
|
91
|
+
jsonlist = read_as_json_list(dir_path)
|
92
|
+
df_dict = read_as_dataframe_dict(dir_path) # xlsx or dirs
|
93
|
+
for sheet_name, df in df_dict.items():
|
94
|
+
print(f"Sheet: {sheet_name}")
|
95
|
+
print(df)
|
96
|
+
|
97
|
+
text = load_text("example.txt")
|
98
|
+
yaml_data = load_yaml("example.yaml")
|
99
|
+
json_data = load_json("example.json")
|
100
|
+
json_list_data = load_json_list("example.jsonl")
|
101
|
+
```
|
102
|
+
|
103
|
+
### 保存类
|
104
|
+
|
105
|
+
```python
|
106
|
+
save_json(data, 'output.json')
|
107
|
+
save_json_list(jsonlist, 'output.jsonl')
|
108
|
+
save_df(df, 'output.xlsx')
|
109
|
+
save_df_dict(df_dict, 'output.xlsx') # 将 read_as_dataframe_dict 返回的字典保存为 Excel 文件。
|
110
|
+
save_df_from_jsonlist(jsonlist, 'output_from_jsonlist.xlsx')
|
111
|
+
append_to_json_list(data, 'output.jsonl')
|
112
|
+
```
|
113
|
+
|
114
|
+
### 并行处理类:`xmap`
|
115
|
+
高效处理 JSON 列表,支持多进程/多线程。
|
116
|
+
|
117
|
+
```python
|
118
|
+
from xlin import xmap
|
119
|
+
|
120
|
+
jsonlist = [{"id": 1, "text": "Hello"}, {"id": 2, "text": "World"}]
|
121
|
+
|
122
|
+
def work_func(item):
|
123
|
+
item["text"] = item["text"].upper()
|
124
|
+
return item
|
125
|
+
|
126
|
+
results = xmap(jsonlist, work_func, output_path="output.jsonl", batch_size=2)
|
127
|
+
print(results)
|
128
|
+
```
|
129
|
+
|
130
|
+
### 合并多个文件:`merge_json_list`,`merge_multiple_df_dict`
|
131
|
+
合并多个 JSONL 文件。
|
132
|
+
|
133
|
+
```python
|
134
|
+
from xlin import merge_json_list
|
135
|
+
|
136
|
+
filenames = ['example1.jsonl', 'example2.jsonl']
|
137
|
+
output_filename = 'merged.jsonl'
|
138
|
+
merge_json_list(filenames, output_filename)
|
139
|
+
```
|
140
|
+
|
141
|
+
合并多个 `read_as_dataframe_dict` 返回的字典。
|
142
|
+
|
143
|
+
```python
|
144
|
+
from xlin import read_as_dataframe_dict, merge_multiple_df_dict
|
145
|
+
|
146
|
+
df_dict1 = read_as_dataframe_dict('example1.xlsx')
|
147
|
+
df_dict2 = read_as_dataframe_dict('example2.xlsx')
|
148
|
+
merged_df_dict = merge_multiple_df_dict([df_dict1, df_dict2])
|
149
|
+
for sheet_name, df in merged_df_dict.items():
|
150
|
+
print(f"Sheet: {sheet_name}")
|
151
|
+
print(df)
|
152
|
+
```
|
153
|
+
|
154
|
+
### 对 json 文件批量操作
|
155
|
+
- 对 JSON 列表应用更改:`apply_changes_to_paths`,`apply_changes_to_jsonlist`
|
156
|
+
|
157
|
+
```python
|
158
|
+
from xlin import *
|
159
|
+
|
160
|
+
paths = [Path('example1.jsonl'), Path('example2.jsonl')]
|
161
|
+
jsonlist = [{"id": 1, "text": "Hello"}, {"id": 2, "text": "World"}]
|
162
|
+
|
163
|
+
def change_func(row):
|
164
|
+
if row["id"] == 1:
|
165
|
+
row["text"] = "New Hello"
|
166
|
+
return "updated", row
|
167
|
+
return "unchanged", row
|
168
|
+
|
169
|
+
changes = {"update_text": change_func}
|
170
|
+
|
171
|
+
# 1. 对文件路径应用更改
|
172
|
+
apply_changes_to_paths(paths, changes, save=True)
|
173
|
+
# 2. 对 JSON 列表应用更改
|
174
|
+
new_jsonlist, updated, deleted = apply_changes_to_jsonlist(jsonlist, changes)
|
175
|
+
print(new_jsonlist)
|
176
|
+
```
|
177
|
+
|
178
|
+
### 生成器
|
179
|
+
- 从多个文件中生成 JSON 列表的生成器:`generator_from_paths`
|
180
|
+
|
181
|
+
```python
|
182
|
+
from xlin import generator_from_paths
|
183
|
+
from pathlib import Path
|
184
|
+
|
185
|
+
paths = [Path('example1.jsonl'), Path('example2.jsonl')]
|
186
|
+
|
187
|
+
for path, row in generator_from_paths(paths):
|
188
|
+
print(f"Path: {path}, Row: {row}")
|
189
|
+
```
|
190
|
+
|
191
|
+
### 数据转换
|
192
|
+
- DataFrame 和 JSON 列表之间的转换:`dataframe_to_json_list` 和 `jsonlist_to_dataframe`
|
193
|
+
|
194
|
+
```python
|
195
|
+
from xlin import dataframe_to_json_list, jsonlist_to_dataframe
|
196
|
+
import pandas as pd
|
197
|
+
|
198
|
+
data = {'col1': [1, 2], 'col2': [3, 4]}
|
199
|
+
df = pd.DataFrame(data)
|
200
|
+
|
201
|
+
json_list = dataframe_to_json_list(df)
|
202
|
+
print(json_list)
|
203
|
+
|
204
|
+
new_df = jsonlist_to_dataframe(json_list)
|
205
|
+
print(new_df)
|
206
|
+
```
|
207
|
+
|
208
|
+
### 分组
|
209
|
+
- 对 DataFrame 进行分组:`grouped_col_list`、`grouped_col` 和 `grouped_row`
|
210
|
+
|
211
|
+
```python
|
212
|
+
from xlin import grouped_col_list, grouped_col, grouped_row
|
213
|
+
import pandas as pd
|
214
|
+
|
215
|
+
data = {'query': ['a', 'a', 'b'], 'output': [1, 2, 3]}
|
216
|
+
df = pd.DataFrame(data)
|
217
|
+
|
218
|
+
grouped_col_list_result = grouped_col_list(df)
|
219
|
+
print(grouped_col_list_result)
|
220
|
+
|
221
|
+
grouped_col_result = grouped_col(df)
|
222
|
+
print(grouped_col_result)
|
223
|
+
|
224
|
+
grouped_row_result = grouped_row(df)
|
225
|
+
print(grouped_row_result)
|
226
|
+
```
|
227
|
+
|
228
|
+
- 对 JSON 列表进行分组:`grouped_row_in_jsonlist`
|
229
|
+
|
230
|
+
```python
|
231
|
+
from xlin import grouped_row_in_jsonlist
|
232
|
+
|
233
|
+
jsonlist = [{"query": "a", "output": 1}, {"query": "a", "output": 2}, {"query": "b", "output": 3}]
|
234
|
+
grouped_row_in_jsonlist_result = grouped_row_in_jsonlist(jsonlist)
|
235
|
+
print(grouped_row_in_jsonlist_result)
|
236
|
+
```
|
237
|
+
|
238
|
+
### 工具类
|
239
|
+
|
240
|
+
- `random_timestamp` 和 `random_timestamp_str`:生成随机时间戳和格式化的随机时间字符串。
|
241
|
+
|
242
|
+
```python
|
243
|
+
from xlin import random_timestamp, random_timestamp_str
|
244
|
+
|
245
|
+
timestamp = random_timestamp()
|
246
|
+
print(timestamp)
|
247
|
+
|
248
|
+
timestamp_str = random_timestamp_str()
|
249
|
+
print(timestamp_str)
|
250
|
+
```
|
251
|
+
|
252
|
+
|
253
|
+
- `df_dict_summary`: 对 `read_as_dataframe_dict` 返回的字典进行总结,返回一个 DataFrame 包含每个表的基本信息。
|
254
|
+
|
255
|
+
```python
|
256
|
+
from xlin import read_as_dataframe_dict, df_dict_summary
|
257
|
+
|
258
|
+
df_dict = read_as_dataframe_dict('example.xlsx')
|
259
|
+
summary = df_dict_summary(df_dict)
|
260
|
+
print(summary)
|
261
|
+
```
|
262
|
+
|
263
|
+
- `text_is_all_chinese` 和 `text_contains_chinese`:判断文本是否全为中文或是否包含中文。
|
264
|
+
|
265
|
+
```python
|
266
|
+
from xlin import text_is_all_chinese, text_contains_chinese
|
267
|
+
|
268
|
+
text1 = "你好"
|
269
|
+
text2 = "Hello 你好"
|
270
|
+
|
271
|
+
print(text_is_all_chinese(text1)) # True
|
272
|
+
print(text_is_all_chinese(text2)) # False
|
273
|
+
print(text_contains_chinese(text2)) # True
|
274
|
+
```
|
275
|
+
|
276
|
+
## 许可证
|
277
|
+
|
278
|
+
本项目采用 MIT 许可证,详情请参阅 [LICENSE](LICENSE) 文件。
|
279
|
+
|
280
|
+
## 作者
|
281
|
+
|
282
|
+
- LinXueyuanStdio <23211526+LinXueyuanStdio@users.noreply.github.com>
|
xlin-0.2.2/README.md
ADDED
@@ -0,0 +1,252 @@
|
|
1
|
+
# xlin
|
2
|
+
|
3
|
+
Python 工具代码集合,提供了丰富的工具函数,涵盖文件操作、数据处理、多进程处理等多个方面,旨在提高开发效率。
|
4
|
+
|
5
|
+
## 安装
|
6
|
+
|
7
|
+
```bash
|
8
|
+
pip install xlin --upgrade
|
9
|
+
```
|
10
|
+
|
11
|
+
## 使用方法
|
12
|
+
|
13
|
+
```python
|
14
|
+
from xlin import *
|
15
|
+
```
|
16
|
+
|
17
|
+
### 文件操作类:`ls`,`rm` 和 `cp`
|
18
|
+
- `ls`: 列出文件或文件夹下的所有文件。
|
19
|
+
- `rm`: 删除文件或文件夹。
|
20
|
+
- `cp`: 复制文件或文件夹。
|
21
|
+
|
22
|
+
```python
|
23
|
+
from xlin import ls, rm, cp
|
24
|
+
|
25
|
+
dir_path = "./data"
|
26
|
+
dir_path = "/mnt/data.json"
|
27
|
+
dir_path = "./data,/mnt/data.json"
|
28
|
+
dir_path = ["./data", "/mnt/data.json", "./data,/mnt/data.json"]
|
29
|
+
def filter_func(path: Path) -> bool:
|
30
|
+
return path.name.endswith('.json')
|
31
|
+
|
32
|
+
filepaths: list[Path] = ls(dir_path, filter=filter_func)
|
33
|
+
rm(dir_path)
|
34
|
+
cp(dir_path, "./backup_data") # 会根据最大公共前缀保持文件夹结构
|
35
|
+
```
|
36
|
+
|
37
|
+
### 读取类
|
38
|
+
|
39
|
+
- `read_as_json_list`:读取 JSON 文件为列表。
|
40
|
+
- `read_as_dataframe`:读取文件为表格。如果是文件夹,则读取文件夹下的所有文件为表格并拼接。
|
41
|
+
- `read_as_dataframe_dict`:读取文件为字典,键为表头,值为列数据。
|
42
|
+
- `load_text`:加载文本文件。
|
43
|
+
- `load_yaml`:加载 YAML 文件。
|
44
|
+
- `load_json`:加载 JSON 文件。
|
45
|
+
- `load_json_list`:加载 JSON 列表文件。
|
46
|
+
|
47
|
+
|
48
|
+
> `read_as_**` 函数支持文件夹或者文件,支持多种文件格式,包括 Excel、CSV、JSON、Parquet 等。
|
49
|
+
>
|
50
|
+
> `load_**` 函数主要用于加载单个文件,支持文本、YAML 和 JSON 格式。
|
51
|
+
|
52
|
+
```python
|
53
|
+
from xlin import *
|
54
|
+
import pandas as pd
|
55
|
+
|
56
|
+
dir_path = "./data"
|
57
|
+
dir_path = "./data,data.xlsx,data.csv,data.json,data.jsonl,data.parquet,data.feather,data.pkl,data.h5,data.txt,data.tsv,data.xml,data.html,data.db"
|
58
|
+
dir_path = "./data,/mnt/data.json"
|
59
|
+
dir_path = ["./data", "/mnt/data.json", "./data,/mnt/data.json"]
|
60
|
+
df_single = read_as_dataframe(dir_path)
|
61
|
+
jsonlist = read_as_json_list(dir_path)
|
62
|
+
df_dict = read_as_dataframe_dict(dir_path) # xlsx or dirs
|
63
|
+
for sheet_name, df in df_dict.items():
|
64
|
+
print(f"Sheet: {sheet_name}")
|
65
|
+
print(df)
|
66
|
+
|
67
|
+
text = load_text("example.txt")
|
68
|
+
yaml_data = load_yaml("example.yaml")
|
69
|
+
json_data = load_json("example.json")
|
70
|
+
json_list_data = load_json_list("example.jsonl")
|
71
|
+
```
|
72
|
+
|
73
|
+
### 保存类
|
74
|
+
|
75
|
+
```python
|
76
|
+
save_json(data, 'output.json')
|
77
|
+
save_json_list(jsonlist, 'output.jsonl')
|
78
|
+
save_df(df, 'output.xlsx')
|
79
|
+
save_df_dict(df_dict, 'output.xlsx') # 将 read_as_dataframe_dict 返回的字典保存为 Excel 文件。
|
80
|
+
save_df_from_jsonlist(jsonlist, 'output_from_jsonlist.xlsx')
|
81
|
+
append_to_json_list(data, 'output.jsonl')
|
82
|
+
```
|
83
|
+
|
84
|
+
### 并行处理类:`xmap`
|
85
|
+
高效处理 JSON 列表,支持多进程/多线程。
|
86
|
+
|
87
|
+
```python
|
88
|
+
from xlin import xmap
|
89
|
+
|
90
|
+
jsonlist = [{"id": 1, "text": "Hello"}, {"id": 2, "text": "World"}]
|
91
|
+
|
92
|
+
def work_func(item):
|
93
|
+
item["text"] = item["text"].upper()
|
94
|
+
return item
|
95
|
+
|
96
|
+
results = xmap(jsonlist, work_func, output_path="output.jsonl", batch_size=2)
|
97
|
+
print(results)
|
98
|
+
```
|
99
|
+
|
100
|
+
### 合并多个文件:`merge_json_list`,`merge_multiple_df_dict`
|
101
|
+
合并多个 JSONL 文件。
|
102
|
+
|
103
|
+
```python
|
104
|
+
from xlin import merge_json_list
|
105
|
+
|
106
|
+
filenames = ['example1.jsonl', 'example2.jsonl']
|
107
|
+
output_filename = 'merged.jsonl'
|
108
|
+
merge_json_list(filenames, output_filename)
|
109
|
+
```
|
110
|
+
|
111
|
+
合并多个 `read_as_dataframe_dict` 返回的字典。
|
112
|
+
|
113
|
+
```python
|
114
|
+
from xlin import read_as_dataframe_dict, merge_multiple_df_dict
|
115
|
+
|
116
|
+
df_dict1 = read_as_dataframe_dict('example1.xlsx')
|
117
|
+
df_dict2 = read_as_dataframe_dict('example2.xlsx')
|
118
|
+
merged_df_dict = merge_multiple_df_dict([df_dict1, df_dict2])
|
119
|
+
for sheet_name, df in merged_df_dict.items():
|
120
|
+
print(f"Sheet: {sheet_name}")
|
121
|
+
print(df)
|
122
|
+
```
|
123
|
+
|
124
|
+
### 对 json 文件批量操作
|
125
|
+
- 对 JSON 列表应用更改:`apply_changes_to_paths`,`apply_changes_to_jsonlist`
|
126
|
+
|
127
|
+
```python
|
128
|
+
from xlin import *
|
129
|
+
|
130
|
+
paths = [Path('example1.jsonl'), Path('example2.jsonl')]
|
131
|
+
jsonlist = [{"id": 1, "text": "Hello"}, {"id": 2, "text": "World"}]
|
132
|
+
|
133
|
+
def change_func(row):
|
134
|
+
if row["id"] == 1:
|
135
|
+
row["text"] = "New Hello"
|
136
|
+
return "updated", row
|
137
|
+
return "unchanged", row
|
138
|
+
|
139
|
+
changes = {"update_text": change_func}
|
140
|
+
|
141
|
+
# 1. 对文件路径应用更改
|
142
|
+
apply_changes_to_paths(paths, changes, save=True)
|
143
|
+
# 2. 对 JSON 列表应用更改
|
144
|
+
new_jsonlist, updated, deleted = apply_changes_to_jsonlist(jsonlist, changes)
|
145
|
+
print(new_jsonlist)
|
146
|
+
```
|
147
|
+
|
148
|
+
### 生成器
|
149
|
+
- 从多个文件中生成 JSON 列表的生成器:`generator_from_paths`
|
150
|
+
|
151
|
+
```python
|
152
|
+
from xlin import generator_from_paths
|
153
|
+
from pathlib import Path
|
154
|
+
|
155
|
+
paths = [Path('example1.jsonl'), Path('example2.jsonl')]
|
156
|
+
|
157
|
+
for path, row in generator_from_paths(paths):
|
158
|
+
print(f"Path: {path}, Row: {row}")
|
159
|
+
```
|
160
|
+
|
161
|
+
### 数据转换
|
162
|
+
- DataFrame 和 JSON 列表之间的转换:`dataframe_to_json_list` 和 `jsonlist_to_dataframe`
|
163
|
+
|
164
|
+
```python
|
165
|
+
from xlin import dataframe_to_json_list, jsonlist_to_dataframe
|
166
|
+
import pandas as pd
|
167
|
+
|
168
|
+
data = {'col1': [1, 2], 'col2': [3, 4]}
|
169
|
+
df = pd.DataFrame(data)
|
170
|
+
|
171
|
+
json_list = dataframe_to_json_list(df)
|
172
|
+
print(json_list)
|
173
|
+
|
174
|
+
new_df = jsonlist_to_dataframe(json_list)
|
175
|
+
print(new_df)
|
176
|
+
```
|
177
|
+
|
178
|
+
### 分组
|
179
|
+
- 对 DataFrame 进行分组:`grouped_col_list`、`grouped_col` 和 `grouped_row`
|
180
|
+
|
181
|
+
```python
|
182
|
+
from xlin import grouped_col_list, grouped_col, grouped_row
|
183
|
+
import pandas as pd
|
184
|
+
|
185
|
+
data = {'query': ['a', 'a', 'b'], 'output': [1, 2, 3]}
|
186
|
+
df = pd.DataFrame(data)
|
187
|
+
|
188
|
+
grouped_col_list_result = grouped_col_list(df)
|
189
|
+
print(grouped_col_list_result)
|
190
|
+
|
191
|
+
grouped_col_result = grouped_col(df)
|
192
|
+
print(grouped_col_result)
|
193
|
+
|
194
|
+
grouped_row_result = grouped_row(df)
|
195
|
+
print(grouped_row_result)
|
196
|
+
```
|
197
|
+
|
198
|
+
- 对 JSON 列表进行分组:`grouped_row_in_jsonlist`
|
199
|
+
|
200
|
+
```python
|
201
|
+
from xlin import grouped_row_in_jsonlist
|
202
|
+
|
203
|
+
jsonlist = [{"query": "a", "output": 1}, {"query": "a", "output": 2}, {"query": "b", "output": 3}]
|
204
|
+
grouped_row_in_jsonlist_result = grouped_row_in_jsonlist(jsonlist)
|
205
|
+
print(grouped_row_in_jsonlist_result)
|
206
|
+
```
|
207
|
+
|
208
|
+
### 工具类
|
209
|
+
|
210
|
+
- `random_timestamp` 和 `random_timestamp_str`:生成随机时间戳和格式化的随机时间字符串。
|
211
|
+
|
212
|
+
```python
|
213
|
+
from xlin import random_timestamp, random_timestamp_str
|
214
|
+
|
215
|
+
timestamp = random_timestamp()
|
216
|
+
print(timestamp)
|
217
|
+
|
218
|
+
timestamp_str = random_timestamp_str()
|
219
|
+
print(timestamp_str)
|
220
|
+
```
|
221
|
+
|
222
|
+
|
223
|
+
- `df_dict_summary`: 对 `read_as_dataframe_dict` 返回的字典进行总结,返回一个 DataFrame 包含每个表的基本信息。
|
224
|
+
|
225
|
+
```python
|
226
|
+
from xlin import read_as_dataframe_dict, df_dict_summary
|
227
|
+
|
228
|
+
df_dict = read_as_dataframe_dict('example.xlsx')
|
229
|
+
summary = df_dict_summary(df_dict)
|
230
|
+
print(summary)
|
231
|
+
```
|
232
|
+
|
233
|
+
- `text_is_all_chinese` 和 `text_contains_chinese`:判断文本是否全为中文或是否包含中文。
|
234
|
+
|
235
|
+
```python
|
236
|
+
from xlin import text_is_all_chinese, text_contains_chinese
|
237
|
+
|
238
|
+
text1 = "你好"
|
239
|
+
text2 = "Hello 你好"
|
240
|
+
|
241
|
+
print(text_is_all_chinese(text1)) # True
|
242
|
+
print(text_is_all_chinese(text2)) # False
|
243
|
+
print(text_contains_chinese(text2)) # True
|
244
|
+
```
|
245
|
+
|
246
|
+
## 许可证
|
247
|
+
|
248
|
+
本项目采用 MIT 许可证,详情请参阅 [LICENSE](LICENSE) 文件。
|
249
|
+
|
250
|
+
## 作者
|
251
|
+
|
252
|
+
- LinXueyuanStdio <23211526+LinXueyuanStdio@users.noreply.github.com>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
from .dataframe_util import *
|
2
|
+
from .datetime_util import *
|
3
|
+
from .file_util import *
|
4
|
+
from .image_util import *
|
5
|
+
from .jsonlist_util import *
|
6
|
+
from .metric import *
|
7
|
+
from .multiprocess_util import *
|
8
|
+
from .statistic import *
|
9
|
+
from .text_util import *
|
10
|
+
from .timing_util import *
|
11
|
+
from .xlsx_util import *
|
12
|
+
from .yaml_util import *
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import asyncio
|
1
2
|
from collections import defaultdict
|
2
3
|
import os
|
3
4
|
from typing import Callable, Dict, List, Optional, Tuple, Union
|
@@ -7,9 +8,9 @@ from loguru import logger
|
|
7
8
|
import pandas as pd
|
8
9
|
import pyexcel
|
9
10
|
|
10
|
-
from xlin.
|
11
|
-
from xlin.
|
12
|
-
from xlin.
|
11
|
+
from xlin.file_util import ls
|
12
|
+
from xlin.jsonlist_util import dataframe_to_json_list, load_json, load_json_list, save_json_list
|
13
|
+
from xlin.xlsx_util import is_xslx
|
13
14
|
|
14
15
|
|
15
16
|
def read_as_dataframe(
|
@@ -269,3 +270,91 @@ def split_dataframe(
|
|
269
270
|
df_i.to_excel(filepath, index=False)
|
270
271
|
df_list.append(df_i)
|
271
272
|
return df_list
|
273
|
+
|
274
|
+
def append_column(df: pd.DataFrame, query_column: str, output_column: str, transform):
|
275
|
+
query = df[query_column].tolist()
|
276
|
+
loop = asyncio.get_event_loop()
|
277
|
+
result = loop.run_until_complete(transform(query))
|
278
|
+
df[output_column] = [str(r) for r in result]
|
279
|
+
return df
|
280
|
+
|
281
|
+
def grouped_col_list(df: pd.DataFrame, key_col="query", value_col="output"):
|
282
|
+
grouped = defaultdict(list)
|
283
|
+
if key_col not in df.columns:
|
284
|
+
logger.warning(f"`{key_col}` not in columns: {list(df.columns)}")
|
285
|
+
return grouped
|
286
|
+
for i, row in df.iterrows():
|
287
|
+
grouped[row[key_col]].append(row[value_col])
|
288
|
+
return grouped
|
289
|
+
|
290
|
+
|
291
|
+
def grouped_col(df: pd.DataFrame, key_col="query", value_col="output"):
|
292
|
+
grouped = {}
|
293
|
+
if key_col not in df.columns:
|
294
|
+
logger.warning(f"`{key_col}` not in columns: {list(df.columns)}")
|
295
|
+
return grouped
|
296
|
+
for i, row in df.iterrows():
|
297
|
+
grouped[row[key_col]] = row[value_col]
|
298
|
+
return grouped
|
299
|
+
|
300
|
+
|
301
|
+
def grouped_row(df: pd.DataFrame, key_col="query"):
|
302
|
+
grouped = defaultdict(list)
|
303
|
+
if key_col not in df.columns:
|
304
|
+
logger.warning(f"`{key_col}` not in columns: {list(df.columns)}")
|
305
|
+
return grouped
|
306
|
+
for i, row in df.iterrows():
|
307
|
+
grouped[row[key_col]].append(row)
|
308
|
+
return grouped
|
309
|
+
|
310
|
+
def select_sub_df(
|
311
|
+
df: pd.DataFrame,
|
312
|
+
start_date: str,
|
313
|
+
end_date: str,
|
314
|
+
lookback_window: int = 0,
|
315
|
+
lookforward_window: int = 0,
|
316
|
+
include_end_date: bool = False,
|
317
|
+
) -> pd.DataFrame:
|
318
|
+
"""
|
319
|
+
从DataFrame中选择指定日期范围内的子DataFrame。
|
320
|
+
|
321
|
+
Args:
|
322
|
+
df (pd.DataFrame): 带有日期索引的DataFrame,index是日期。
|
323
|
+
start_date (str): 起始日期,格式'YYYY-MM-DD'。
|
324
|
+
end_date (str): 结束日期,格式'YYYY-MM-DD'。
|
325
|
+
lookback_window (int): 向后查看的天数,默认为0。
|
326
|
+
lookforward_window (int): 向前查看的天数,默认为0。
|
327
|
+
include_end_date (bool): 是否包含结束日期,默认为False。
|
328
|
+
|
329
|
+
Returns:
|
330
|
+
pd.DataFrame: 指定日期范围内的子DataFrame。
|
331
|
+
"""
|
332
|
+
# 确保索引是DatetimeIndex类型
|
333
|
+
if not isinstance(df.index, pd.DatetimeIndex):
|
334
|
+
df.index = pd.to_datetime(df.index)
|
335
|
+
|
336
|
+
# 确保索引是有序的
|
337
|
+
if not df.index.is_monotonic_increasing:
|
338
|
+
df = df.sort_index()
|
339
|
+
|
340
|
+
# 获取索引的时区信息
|
341
|
+
tz = df.index.tz
|
342
|
+
|
343
|
+
# 创建带时区的切片日期
|
344
|
+
start = pd.Timestamp(start_date, tz=tz)
|
345
|
+
end = pd.Timestamp(end_date, tz=tz)
|
346
|
+
|
347
|
+
# 选择子DataFrame
|
348
|
+
try:
|
349
|
+
if lookback_window > 0:
|
350
|
+
start = start - pd.Timedelta(days=lookback_window)
|
351
|
+
if lookforward_window > 0:
|
352
|
+
end = end + pd.Timedelta(days=lookforward_window)
|
353
|
+
if include_end_date:
|
354
|
+
end = end + pd.Timedelta(days=1)
|
355
|
+
sub_df = df[start:end]
|
356
|
+
except KeyError:
|
357
|
+
print(f"日期 {start_date} 或 {end_date} 不在索引范围内。")
|
358
|
+
sub_df = pd.DataFrame()
|
359
|
+
|
360
|
+
return sub_df
|