pyxllib 0.3.197__py3-none-any.whl → 3.201.1__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.
- pyxllib/__init__.py +14 -21
- pyxllib/algo/__init__.py +8 -8
- pyxllib/algo/disjoint.py +54 -54
- pyxllib/algo/geo.py +537 -541
- pyxllib/algo/intervals.py +964 -964
- pyxllib/algo/matcher.py +389 -389
- pyxllib/algo/newbie.py +166 -166
- pyxllib/algo/pupil.py +629 -629
- pyxllib/algo/shapelylib.py +67 -67
- pyxllib/algo/specialist.py +241 -241
- pyxllib/algo/stat.py +494 -494
- pyxllib/algo/treelib.py +145 -149
- pyxllib/algo/unitlib.py +62 -66
- pyxllib/autogui/__init__.py +5 -5
- pyxllib/autogui/activewin.py +246 -246
- pyxllib/autogui/all.py +9 -9
- pyxllib/autogui/autogui.py +846 -852
- pyxllib/autogui/uiautolib.py +362 -362
- pyxllib/autogui/virtualkey.py +102 -102
- pyxllib/autogui/wechat.py +827 -827
- pyxllib/autogui/wechat_msg.py +421 -421
- pyxllib/autogui/wxautolib.py +84 -84
- pyxllib/cv/__init__.py +5 -5
- pyxllib/cv/expert.py +267 -267
- pyxllib/cv/imfile.py +159 -159
- pyxllib/cv/imhash.py +39 -39
- pyxllib/cv/pupil.py +9 -9
- pyxllib/cv/rgbfmt.py +1525 -1525
- pyxllib/cv/slidercaptcha.py +137 -137
- pyxllib/cv/trackbartools.py +251 -251
- pyxllib/cv/xlcvlib.py +1040 -1040
- pyxllib/cv/xlpillib.py +423 -423
- pyxllib/data/echarts.py +236 -240
- pyxllib/data/jsonlib.py +85 -89
- pyxllib/data/oss.py +72 -72
- pyxllib/data/pglib.py +1111 -1127
- pyxllib/data/sqlite.py +568 -568
- pyxllib/data/sqllib.py +297 -297
- pyxllib/ext/JLineViewer.py +505 -505
- pyxllib/ext/__init__.py +6 -6
- pyxllib/ext/demolib.py +251 -246
- pyxllib/ext/drissionlib.py +277 -277
- pyxllib/ext/kq5034lib.py +12 -12
- pyxllib/ext/qt.py +449 -449
- pyxllib/ext/robustprocfile.py +493 -497
- pyxllib/ext/seleniumlib.py +76 -76
- pyxllib/ext/tk.py +173 -173
- pyxllib/ext/unixlib.py +821 -827
- pyxllib/ext/utools.py +345 -351
- pyxllib/ext/webhook.py +124 -119
- pyxllib/ext/win32lib.py +40 -40
- pyxllib/ext/wjxlib.py +91 -88
- pyxllib/ext/wpsapi.py +124 -124
- pyxllib/ext/xlwork.py +9 -9
- pyxllib/ext/yuquelib.py +1110 -1105
- pyxllib/file/__init__.py +17 -17
- pyxllib/file/docxlib.py +757 -761
- pyxllib/file/gitlib.py +309 -309
- pyxllib/file/libreoffice.py +165 -165
- pyxllib/file/movielib.py +144 -148
- pyxllib/file/newbie.py +10 -10
- pyxllib/file/onenotelib.py +1469 -1469
- pyxllib/file/packlib/__init__.py +330 -330
- pyxllib/file/packlib/zipfile.py +2441 -2441
- pyxllib/file/pdflib.py +422 -426
- pyxllib/file/pupil.py +185 -185
- pyxllib/file/specialist/__init__.py +681 -685
- pyxllib/file/specialist/dirlib.py +799 -799
- pyxllib/file/specialist/download.py +193 -193
- pyxllib/file/specialist/filelib.py +2825 -2829
- pyxllib/file/xlsxlib.py +3122 -3131
- pyxllib/file/xlsyncfile.py +341 -341
- pyxllib/prog/__init__.py +5 -5
- pyxllib/prog/cachetools.py +58 -64
- pyxllib/prog/deprecatedlib.py +233 -233
- pyxllib/prog/filelock.py +42 -42
- pyxllib/prog/ipyexec.py +253 -253
- pyxllib/prog/multiprogs.py +940 -940
- pyxllib/prog/newbie.py +451 -451
- pyxllib/prog/pupil.py +1208 -1197
- pyxllib/prog/sitepackages.py +33 -33
- pyxllib/prog/specialist/__init__.py +348 -391
- pyxllib/prog/specialist/bc.py +203 -203
- pyxllib/prog/specialist/browser.py +497 -497
- pyxllib/prog/specialist/common.py +347 -347
- pyxllib/prog/specialist/datetime.py +198 -198
- pyxllib/prog/specialist/tictoc.py +240 -240
- pyxllib/prog/specialist/xllog.py +180 -180
- pyxllib/prog/xlosenv.py +110 -108
- pyxllib/stdlib/__init__.py +17 -17
- pyxllib/stdlib/tablepyxl/__init__.py +10 -10
- pyxllib/stdlib/tablepyxl/style.py +303 -303
- pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
- pyxllib/text/__init__.py +8 -8
- pyxllib/text/ahocorasick.py +36 -39
- pyxllib/text/airscript.js +754 -744
- pyxllib/text/charclasslib.py +121 -121
- pyxllib/text/jiebalib.py +267 -267
- pyxllib/text/jinjalib.py +27 -32
- pyxllib/text/jsa_ai_prompt.md +271 -271
- pyxllib/text/jscode.py +922 -922
- pyxllib/text/latex/__init__.py +158 -158
- pyxllib/text/levenshtein.py +303 -303
- pyxllib/text/nestenv.py +1215 -1215
- pyxllib/text/newbie.py +300 -300
- pyxllib/text/pupil/__init__.py +8 -8
- pyxllib/text/pupil/common.py +1121 -1121
- pyxllib/text/pupil/xlalign.py +326 -326
- pyxllib/text/pycode.py +47 -47
- pyxllib/text/specialist/__init__.py +8 -8
- pyxllib/text/specialist/common.py +112 -112
- pyxllib/text/specialist/ptag.py +186 -186
- pyxllib/text/spellchecker.py +172 -172
- pyxllib/text/templates/echart_base.html +10 -10
- pyxllib/text/templates/highlight_code.html +16 -16
- pyxllib/text/templates/latex_editor.html +102 -102
- pyxllib/text/vbacode.py +17 -17
- pyxllib/text/xmllib.py +741 -747
- pyxllib/xl.py +42 -39
- pyxllib/xlcv.py +17 -17
- pyxllib-3.201.1.dist-info/METADATA +296 -0
- pyxllib-3.201.1.dist-info/RECORD +125 -0
- {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/licenses/LICENSE +190 -190
- pyxllib/ext/old.py +0 -663
- pyxllib-0.3.197.dist-info/METADATA +0 -48
- pyxllib-0.3.197.dist-info/RECORD +0 -126
- {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/WHEEL +0 -0
pyxllib/data/echarts.py
CHANGED
@@ -1,240 +1,236 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
# @Author : 陈坤泽
|
4
|
-
# @Email : 877362867@qq.com
|
5
|
-
# @Date : 2022/02/09 11:14
|
6
|
-
|
7
|
-
|
8
|
-
"""
|
9
|
-
Apache ECharts: https://echarts.apache.org/zh/index.html
|
10
|
-
python版:pyechats的封装
|
11
|
-
"""
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
import
|
20
|
-
from pyecharts import
|
21
|
-
from pyecharts.
|
22
|
-
|
23
|
-
from
|
24
|
-
from
|
25
|
-
from
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
kwargs['label'] =
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
self.
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
if
|
102
|
-
configs['
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
if
|
136
|
-
configs['
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
for
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
def
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
linestyle_opts.
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
if __name__ == '__main__':
|
239
|
-
with TicToc(__name__):
|
240
|
-
pass
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Author : 陈坤泽
|
4
|
+
# @Email : 877362867@qq.com
|
5
|
+
# @Date : 2022/02/09 11:14
|
6
|
+
|
7
|
+
|
8
|
+
"""
|
9
|
+
Apache ECharts: https://echarts.apache.org/zh/index.html
|
10
|
+
python版:pyechats的封装
|
11
|
+
"""
|
12
|
+
|
13
|
+
# import types
|
14
|
+
|
15
|
+
import pyecharts
|
16
|
+
from pyecharts import options as opts
|
17
|
+
from pyecharts.commons.utils import JsCode
|
18
|
+
from pyecharts.globals import ChartType
|
19
|
+
from pyecharts import types
|
20
|
+
from pyecharts.charts import Bar, Line, Radar
|
21
|
+
from pyecharts.charts.chart import Chart
|
22
|
+
|
23
|
+
from pyxllib.prog.pupil import inject_members
|
24
|
+
from pyxllib.prog.specialist import TicToc
|
25
|
+
from pyxllib.file.specialist import XlPath
|
26
|
+
|
27
|
+
|
28
|
+
class XlChart(Chart):
|
29
|
+
def set_title(self, title):
|
30
|
+
self.set_global_opts(title_opts=pyecharts.options.TitleOpts(title=title))
|
31
|
+
|
32
|
+
def add_series(self, name, data, *, type=None, color=None, labels=None,
|
33
|
+
**kwargs):
|
34
|
+
""" 垃圾pyecharts,毁我青春~~
|
35
|
+
|
36
|
+
很多图x都不是等间距的,pyecharts处理不等间距x好像有很大的不兼容问题
|
37
|
+
需要手动添加x、y坐标位置
|
38
|
+
|
39
|
+
:param list|tuple labels: 直接提供现成的文本标签
|
40
|
+
|
41
|
+
"""
|
42
|
+
if type is None:
|
43
|
+
type = self.__class__.__name__.lower()
|
44
|
+
|
45
|
+
if labels:
|
46
|
+
s = [[x[0][0], x[1]] for x in zip(data, labels)]
|
47
|
+
fmt = JsCode(f"function(x){{var m = new Map({s}); return m.get(x.value[0]);}}")
|
48
|
+
if 'label' not in kwargs:
|
49
|
+
kwargs['label'] = opts.LabelOpts(is_show=True, formatter=fmt)
|
50
|
+
elif isinstance(kwargs['label'], opts.LabelOpts):
|
51
|
+
kwargs['label'].opts['formatter'] = fmt
|
52
|
+
else:
|
53
|
+
kwargs['label']['show'] = True
|
54
|
+
kwargs['label']['formatter'] = fmt
|
55
|
+
|
56
|
+
self._append_color(color)
|
57
|
+
# self._append_legend(name, is_selected=True)
|
58
|
+
self._append_legend(name)
|
59
|
+
|
60
|
+
self.options.get('series').append(
|
61
|
+
{
|
62
|
+
'type': type,
|
63
|
+
'name': name,
|
64
|
+
'data': data,
|
65
|
+
**kwargs,
|
66
|
+
}
|
67
|
+
)
|
68
|
+
return self
|
69
|
+
|
70
|
+
|
71
|
+
inject_members(XlChart, Chart)
|
72
|
+
|
73
|
+
|
74
|
+
class XlLine(Line):
|
75
|
+
@classmethod
|
76
|
+
def from_dict(cls, yaxis, xaxis=None, *, title=None,
|
77
|
+
xaxis_name=None, yaxis_name=None, **kwargs):
|
78
|
+
""" 查看一个数据的折线图
|
79
|
+
|
80
|
+
:param list|dict yaxis: 列表数据,或者字典name: values表示的多组数据
|
81
|
+
"""
|
82
|
+
c = cls()
|
83
|
+
|
84
|
+
if isinstance(yaxis, (list, tuple)):
|
85
|
+
yaxis = {'value': yaxis}
|
86
|
+
if xaxis is None:
|
87
|
+
xaxis = list(range(max([len(v) for v in yaxis.values()])))
|
88
|
+
c.add_xaxis(xaxis)
|
89
|
+
for k, v in yaxis.items():
|
90
|
+
c.add_yaxis(k, v)
|
91
|
+
|
92
|
+
configs = {
|
93
|
+
'tooltip_opts': opts.TooltipOpts(trigger="axis"),
|
94
|
+
**kwargs,
|
95
|
+
}
|
96
|
+
c.set_global_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))
|
97
|
+
if title:
|
98
|
+
configs['title_opts'] = opts.TitleOpts(title=title)
|
99
|
+
if xaxis_name:
|
100
|
+
configs['xaxis_opts'] = opts.AxisOpts(name=xaxis_name, axislabel_opts=opts.LabelOpts(rotate=45, interval=0))
|
101
|
+
if yaxis_name:
|
102
|
+
configs['yaxis_opts'] = opts.AxisOpts(name=yaxis_name)
|
103
|
+
c.set_global_opts(**configs)
|
104
|
+
return c
|
105
|
+
|
106
|
+
|
107
|
+
class XlBar(Bar):
|
108
|
+
|
109
|
+
@classmethod
|
110
|
+
def from_dict(cls, yaxis, xaxis=None, *, title=None,
|
111
|
+
xaxis_name=None, yaxis_name=None, **kwargs):
|
112
|
+
""" 查看一个数据的条形图
|
113
|
+
|
114
|
+
:param list|dict yaxis: 列表数据,或者字典name: values表示的多组数据
|
115
|
+
"""
|
116
|
+
c = cls()
|
117
|
+
|
118
|
+
if isinstance(yaxis, (list, tuple)):
|
119
|
+
yaxis = {'value': yaxis}
|
120
|
+
if xaxis is None:
|
121
|
+
xaxis = list(range(max([len(v) for v in yaxis.values()])))
|
122
|
+
c.add_xaxis(xaxis)
|
123
|
+
for k, v in yaxis.items():
|
124
|
+
c.add_yaxis(k, v)
|
125
|
+
|
126
|
+
configs = {
|
127
|
+
'tooltip_opts': opts.TooltipOpts(trigger="axis"),
|
128
|
+
**kwargs,
|
129
|
+
}
|
130
|
+
c.set_global_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))
|
131
|
+
if title:
|
132
|
+
configs['title_opts'] = opts.TitleOpts(title=title)
|
133
|
+
if xaxis_name:
|
134
|
+
configs['xaxis_opts'] = opts.AxisOpts(name=xaxis_name)
|
135
|
+
if yaxis_name:
|
136
|
+
configs['yaxis_opts'] = opts.AxisOpts(name=yaxis_name)
|
137
|
+
c.set_global_opts(**configs)
|
138
|
+
return c
|
139
|
+
|
140
|
+
@classmethod
|
141
|
+
def from_list(cls, yaxis, xaxis=None, *, title=None):
|
142
|
+
"""
|
143
|
+
>> browser(pyecharts.charts.Bar.from_list(numbers))
|
144
|
+
"""
|
145
|
+
return cls.from_dict({'value': list(yaxis)}, xaxis=xaxis, title=title)
|
146
|
+
|
147
|
+
@classmethod
|
148
|
+
def from_data_split_into_groups(cls, data, groups, *, title=None):
|
149
|
+
"""根据给定的组数自动拆分数据并生成条形图
|
150
|
+
:param list data: 数据清单
|
151
|
+
:param int groups: 要拆分成的组数
|
152
|
+
"""
|
153
|
+
# 找到最大值和最小值
|
154
|
+
min_val, max_val = min(data), max(data)
|
155
|
+
|
156
|
+
# 计算间隔
|
157
|
+
interval = (max_val - min_val) / groups
|
158
|
+
|
159
|
+
# 分组和标签
|
160
|
+
group_counts = [0] * groups
|
161
|
+
labels = []
|
162
|
+
# todo 如果数据量特别大,这里应该排序后,再用特殊方法计算分组
|
163
|
+
for value in data:
|
164
|
+
index = min(int((value - min_val) / interval), groups - 1)
|
165
|
+
group_counts[index] += 1
|
166
|
+
|
167
|
+
for i in range(groups):
|
168
|
+
labels.append(f"{min_val + interval * i:.2f}-{min_val + interval * (i + 1):.2f}")
|
169
|
+
# t = cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
|
170
|
+
|
171
|
+
return cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
|
172
|
+
|
173
|
+
|
174
|
+
class XlRadar(Radar):
|
175
|
+
""" 雷达图 """
|
176
|
+
|
177
|
+
def __init__(self, *args, **kwargs):
|
178
|
+
super().__init__(*args, **kwargs)
|
179
|
+
self.color_idx = 0
|
180
|
+
|
181
|
+
def add(
|
182
|
+
self,
|
183
|
+
series_name: str,
|
184
|
+
data: types.Sequence[types.Union[opts.RadarItem, dict]],
|
185
|
+
*,
|
186
|
+
label_opts=None,
|
187
|
+
color: types.Optional[str] = None,
|
188
|
+
linestyle_opts=None,
|
189
|
+
**kwargs
|
190
|
+
):
|
191
|
+
""" 标准库(2.0.5版)的雷达图颜色渲染有问题,这里要增加一个修正过程 """
|
192
|
+
if label_opts is None:
|
193
|
+
label_opts = opts.LabelOpts(is_show=False)
|
194
|
+
|
195
|
+
if linestyle_opts is None:
|
196
|
+
linestyle_opts = opts.LineStyleOpts(color=self.colors[self.color_idx % len(self.colors)])
|
197
|
+
self.color_idx += 1
|
198
|
+
elif linestyle_opts.get('color') is None:
|
199
|
+
linestyle_opts.update(color=self.colors[self.color_idx % len(self.colors)])
|
200
|
+
self.color_idx += 1
|
201
|
+
|
202
|
+
if color is None:
|
203
|
+
color = linestyle_opts.get('color')
|
204
|
+
|
205
|
+
return super(XlRadar, self).add(series_name, data,
|
206
|
+
label_opts=label_opts,
|
207
|
+
color=color,
|
208
|
+
linestyle_opts=linestyle_opts,
|
209
|
+
**kwargs)
|
210
|
+
|
211
|
+
|
212
|
+
inject_members(XlBar, Bar)
|
213
|
+
|
214
|
+
|
215
|
+
def render_echart_html(title='Awesome-pyecharts', body=''):
|
216
|
+
from pyxllib.text.xmllib import get_jinja_template
|
217
|
+
return get_jinja_template('echart_base.html').render(title=title, body=body)
|
218
|
+
|
219
|
+
|
220
|
+
# 绘制帕累托累计图
|
221
|
+
def draw_pareto_chart(data, accuracy=0.1, *, title='帕累托累积权重', value_unit_type='K'):
|
222
|
+
from pyxllib.algo.stat import pareto_accumulate
|
223
|
+
pts, labels = pareto_accumulate(data, accuracy=accuracy, value_unit_type=value_unit_type)
|
224
|
+
x = Line()
|
225
|
+
x.add_series(title, pts, labels=labels, label={'position': 'right'})
|
226
|
+
x.set_global_opts(
|
227
|
+
# x轴末尾要故意撑大一些,不然有部分内容会显示不全
|
228
|
+
xaxis_opts=opts.AxisOpts(name='条目数', max_=int(float(f'{pts[-1][0] * 1.2:.2g}'))),
|
229
|
+
yaxis_opts=opts.AxisOpts(name='累积和')
|
230
|
+
)
|
231
|
+
return x
|
232
|
+
|
233
|
+
|
234
|
+
if __name__ == '__main__':
|
235
|
+
with TicToc(__name__):
|
236
|
+
pass
|