pyxllib 0.3.84__tar.gz → 0.3.86__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.
- {pyxllib-0.3.84/pyxllib.egg-info → pyxllib-0.3.86}/PKG-INFO +1 -1
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/pupil.py +22 -14
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/stat.py +4 -4
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/echarts.py +14 -16
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/pglib.py +3 -4
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/sqlite.py +73 -9
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/filelib.py +116 -9
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/xlsxlib.py +417 -172
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/newbie.py +29 -13
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/pupil.py +26 -0
- pyxllib-0.3.86/pyxllib/text/charclasslib.py +109 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/newbie.py +0 -22
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pupil/common.py +2 -2
- {pyxllib-0.3.84 → pyxllib-0.3.86/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/SOURCES.txt +1 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/setup.py +1 -1
- {pyxllib-0.3.84 → pyxllib-0.3.86}/LICENSE +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/MANIFEST.in +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/README.md +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/kq5034lib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/requires.txt +5 -5
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/gptlib.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/requirements.txt +0 -0
- {pyxllib-0.3.84 → pyxllib-0.3.86}/setup.cfg +0 -0
@@ -10,7 +10,7 @@ import math
|
|
10
10
|
import re
|
11
11
|
import sys
|
12
12
|
|
13
|
-
from pyxllib.prog.newbie import typename
|
13
|
+
from pyxllib.prog.newbie import typename, human_readable_number
|
14
14
|
from pyxllib.text.pupil import listalign, int2myalphaenum
|
15
15
|
|
16
16
|
|
@@ -97,7 +97,7 @@ class ValuesStat:
|
|
97
97
|
def __len__(self):
|
98
98
|
return self.n
|
99
99
|
|
100
|
-
def summary(self, valfmt='
|
100
|
+
def summary(self, valfmt=lambda x: human_readable_number(x, '万', 4)):
|
101
101
|
""" 输出性能分析报告,data是每次运行得到的时间数组
|
102
102
|
|
103
103
|
:param valfmt: 数值显示的格式
|
@@ -109,37 +109,45 @@ class ValuesStat:
|
|
109
109
|
也可以传入长度5的格式清单,表示 [和、均值、标准差、最小值、最大值] 一次展示的格式
|
110
110
|
"""
|
111
111
|
if isinstance(valfmt, str) or callable(valfmt):
|
112
|
-
valfmt = [valfmt] *
|
112
|
+
valfmt = [valfmt] * 6
|
113
|
+
|
114
|
+
if len(valfmt) == 5: # 兼容旧版格式化,默认是不填充"总数"的格式化的
|
115
|
+
valfmt = [lambda x: x] + valfmt
|
116
|
+
assert len(valfmt) == 6, f'valfmt长度必须是6,现在是{len(valfmt)}'
|
113
117
|
|
114
118
|
ls = []
|
115
119
|
|
116
|
-
def format_value(value,
|
120
|
+
def format_value(value, fmt_id):
|
117
121
|
""" 根据指定的格式来格式化值 """
|
122
|
+
format_spec = valfmt[fmt_id]
|
123
|
+
if format_spec is None:
|
124
|
+
return ''
|
125
|
+
|
118
126
|
if callable(format_spec):
|
119
127
|
return format_spec(value)
|
120
128
|
else:
|
121
129
|
return f"{value:{format_spec}}"
|
122
130
|
|
123
131
|
if self.n > 1:
|
124
|
-
ls.append(f'总数: {self.n}') # 注意输出其实完整是6个值,还有个总数不用控制格式
|
125
|
-
if valfmt[
|
126
|
-
ls.append(f'总和: {format_value(self.sum,
|
127
|
-
if valfmt[
|
128
|
-
mean_str = format_value(self.mean,
|
129
|
-
std_str = format_value(self.std,
|
132
|
+
ls.append(f'总数: {format_value(self.n, 0)}') # 注意输出其实完整是6个值,还有个总数不用控制格式
|
133
|
+
if valfmt[1]:
|
134
|
+
ls.append(f'总和: {format_value(self.sum, 1)}')
|
135
|
+
if valfmt[2] or valfmt[3]:
|
136
|
+
mean_str = format_value(self.mean, 2)
|
137
|
+
std_str = format_value(self.std, 3)
|
130
138
|
if mean_str and std_str:
|
131
139
|
ls.append(f'均值标准差: {mean_str}±{std_str}')
|
132
140
|
elif mean_str:
|
133
141
|
ls.append(f'均值: {mean_str}')
|
134
142
|
elif std_str:
|
135
143
|
ls.append(f'标准差: {std_str}')
|
136
|
-
if valfmt[3]:
|
137
|
-
ls.append(f'最小值: {format_value(self.min, valfmt[3])}')
|
138
144
|
if valfmt[4]:
|
139
|
-
ls.append(f'
|
145
|
+
ls.append(f'最小值: {format_value(self.min, 4)}')
|
146
|
+
if valfmt[5]:
|
147
|
+
ls.append(f'最大值: {format_value(self.max, 5)}')
|
140
148
|
return '\t'.join(ls)
|
141
149
|
elif self.n == 1:
|
142
|
-
return format_value(self.sum, valfmt[
|
150
|
+
return format_value(self.sum, valfmt[1] or 'g')
|
143
151
|
else:
|
144
152
|
raise ValueError("无效的数据数量")
|
145
153
|
|
@@ -330,7 +330,7 @@ def count_key_combinations(df, col_names, count_col_name='count'):
|
|
330
330
|
return df2
|
331
331
|
|
332
332
|
|
333
|
-
def pareto_accumulate(weights, accuracy=0.01, *, print_mode=False):
|
333
|
+
def pareto_accumulate(weights, accuracy=0.01, *, print_mode=False, value_unit_type='K'):
|
334
334
|
""" 帕累托累计
|
335
335
|
|
336
336
|
可以用来分析主要出现的权重、频次
|
@@ -368,9 +368,9 @@ def pareto_accumulate(weights, accuracy=0.01, *, print_mode=False):
|
|
368
368
|
|
369
369
|
# 2 结果展示
|
370
370
|
def fmt(p):
|
371
|
-
from pyxllib.
|
372
|
-
ls = [f'{p[0]}
|
373
|
-
f'{
|
371
|
+
from pyxllib.prog.newbie import human_readable_number
|
372
|
+
ls = [f'{human_readable_number(p[0], "万")}条≥{human_readable_number(p[1])}',
|
373
|
+
f'{human_readable_number(p[2], value_unit_type)}({p[2] / total_size:.0%})']
|
374
374
|
return ','.join(map(str, ls))
|
375
375
|
|
376
376
|
total_size = points[-1][2]
|
@@ -104,27 +104,25 @@ class XlBar(Bar):
|
|
104
104
|
inject_members(XlBar, Bar)
|
105
105
|
|
106
106
|
|
107
|
-
def get_render_body(chart):
|
108
|
-
""" 得到渲染后的核心html内容 """
|
109
|
-
from pyxllib.text.nestenv import NestEnv
|
110
|
-
|
111
|
-
# 1 得到完整的html内容
|
112
|
-
file = XlPath.tempfile(suffix='.html')
|
113
|
-
chart.render(path=str(file))
|
114
|
-
res = file.read_text()
|
115
|
-
file.delete()
|
116
|
-
|
117
|
-
# 2 得到body核心内容
|
118
|
-
res = NestEnv(res).xmltag('body', inner=True).string()
|
119
|
-
|
120
|
-
return res
|
121
|
-
|
122
|
-
|
123
107
|
def render_echart_html(title='Awesome-pyecharts', body=''):
|
124
108
|
from pyxllib.text.xmllib import get_jinja_template
|
125
109
|
return get_jinja_template('echart_base.html').render(title=title, body=body)
|
126
110
|
|
127
111
|
|
112
|
+
# 绘制帕累托累计图
|
113
|
+
def draw_pareto_chart(data, accuracy=0.1, *, title='帕累托累积权重', value_unit_type='K'):
|
114
|
+
from pyxllib.algo.stat import pareto_accumulate
|
115
|
+
pts, labels = pareto_accumulate(data, accuracy=accuracy, value_unit_type=value_unit_type)
|
116
|
+
x = Line()
|
117
|
+
x.add_series(title, pts, labels=labels, label={'position': 'right'})
|
118
|
+
x.set_global_opts(
|
119
|
+
# x轴末尾要故意撑大一些,不然有部分内容会显示不全
|
120
|
+
xaxis_opts=opts.AxisOpts(name='条目数', max_=int(float(f'{pts[-1][0]*1.2:.2g}'))),
|
121
|
+
yaxis_opts=opts.AxisOpts(name='累积和')
|
122
|
+
)
|
123
|
+
return x
|
124
|
+
|
125
|
+
|
128
126
|
if __name__ == '__main__':
|
129
127
|
with TicToc(__name__):
|
130
128
|
pass
|
@@ -70,7 +70,7 @@ class Connection(psycopg.Connection, SqlBase):
|
|
70
70
|
""" 【查】表格有哪些字段
|
71
71
|
"""
|
72
72
|
cmd = f"SELECT column_name FROM information_schema.columns WHERE table_name='{table_name}'"
|
73
|
-
return
|
73
|
+
return self.exec2col(cmd)
|
74
74
|
|
75
75
|
def ensure_column(self, table_name, col_name, *args, comment=None, **kwargs):
|
76
76
|
super(Connection, self).ensure_column(table_name, col_name, *args, **kwargs)
|
@@ -401,7 +401,7 @@ class XlprDb(Connection):
|
|
401
401
|
TODO 功能还可以增加:gpu显卡温度、硬盘读写速率检查、网络上传下载带宽
|
402
402
|
"""
|
403
403
|
# 1 服务器列表
|
404
|
-
host_names =
|
404
|
+
host_names = self.exec2col('SELECT host_name FROM hosts WHERE id > 1 ORDER BY id')
|
405
405
|
host_cpu_gb = {h: v for h, v in self.execute('SELECT host_name, cpu_gb FROM hosts')}
|
406
406
|
|
407
407
|
# 2 去所有服务器取使用情况
|
@@ -466,7 +466,6 @@ class XlprDb(Connection):
|
|
466
466
|
:param list ls: n*3,第1列是时间,第2列是总值,第3列是每个用户具体的数据
|
467
467
|
"""
|
468
468
|
from pyecharts.charts import Line
|
469
|
-
from pyxllib.data.echarts import get_render_body
|
470
469
|
|
471
470
|
map_user_name = {}
|
472
471
|
for ks, v in self.execute('SELECT account_names, name FROM users'):
|
@@ -516,7 +515,7 @@ class XlprDb(Connection):
|
|
516
515
|
to_list([x[2].get(user, 0) for x in ls]),
|
517
516
|
areaStyle={}, stack='Total', emphasis={'focus': 'series'})
|
518
517
|
|
519
|
-
return
|
518
|
+
return '<body>' + chart.render_embed() + '</body>', sum(all_users_usaged.values())
|
520
519
|
|
521
520
|
def dbview_cpu(self, recent=datetime.timedelta(days=1), date_trunc='hour'):
|
522
521
|
from pyxllib.data.echarts import render_echart_html
|
@@ -5,6 +5,7 @@
|
|
5
5
|
# @Date : 2022/04/12 08:59
|
6
6
|
|
7
7
|
import json
|
8
|
+
import re
|
8
9
|
import sqlite3
|
9
10
|
|
10
11
|
import pandas as pd
|
@@ -106,13 +107,24 @@ class SqlBase:
|
|
106
107
|
def __3_execute(self):
|
107
108
|
pass
|
108
109
|
|
109
|
-
def
|
110
|
-
""" 获得第1
|
110
|
+
def exec2one(self, *args, **kwargs):
|
111
|
+
""" 获得第1行的值 """
|
112
|
+
return self.execute(*args, **kwargs).fetchone()[0]
|
111
113
|
|
112
|
-
|
113
|
-
"""
|
114
|
-
|
115
|
-
|
114
|
+
def exec2row(self, *args, **kwargs):
|
115
|
+
""" 获得第1行的值 """
|
116
|
+
return self.execute(*args, **kwargs).fetchone()
|
117
|
+
|
118
|
+
def exec2col(self, *args, **kwargs):
|
119
|
+
""" 获得第1列的值 """
|
120
|
+
return [row[0] for row in self.execute(*args, **kwargs).fetchall()]
|
121
|
+
|
122
|
+
# 兼容旧接口
|
123
|
+
exec_col = exec2col
|
124
|
+
|
125
|
+
def exec2df(self, *args, **kwargs):
|
126
|
+
""" 获得pandas.DataFrame类型的返回值 """
|
127
|
+
return pd.read_sql(*args, self, **kwargs)
|
116
128
|
|
117
129
|
def __4_数据类型(self):
|
118
130
|
pass
|
@@ -158,8 +170,10 @@ class SqlBase:
|
|
158
170
|
|
159
171
|
def select_col(self, table_name, col):
|
160
172
|
""" 获得一列数据,常使用的功能,所以做了一个封装
|
173
|
+
|
174
|
+
注意,"exec"前缀的方法一般返回的是迭代器,而"select"前缀获得一般是直接的全部列表、结果
|
161
175
|
"""
|
162
|
-
return
|
176
|
+
return self.exec2col(f'SELECT {col} FROM {table_name}')
|
163
177
|
|
164
178
|
def group_count(self, table_name, cols, count_column_name='cnt'):
|
165
179
|
""" 【查】分组统计各组值组合出现次数
|
@@ -177,6 +191,53 @@ class SqlBase:
|
|
177
191
|
df = pd.DataFrame.from_records(records, columns=cols.split(',') + [count_column_name])
|
178
192
|
return df
|
179
193
|
|
194
|
+
def get_count_by_altering_query(self, data_query: str) -> int:
|
195
|
+
"""
|
196
|
+
从给定的SQL SELECT查询中获取行数计数。这个方法通过修改原始的SELECT查询,
|
197
|
+
将其转换为一个COUNT查询来实现计数。这种方法特别适用于在获取大量数据之前,
|
198
|
+
需要预估数据量的场景。
|
199
|
+
|
200
|
+
问题背景:
|
201
|
+
在进行大规模数据处理前,了解数据的规模可以帮助进行更有效的资源分配和性能优化。
|
202
|
+
传统的做法是分两步执行:首先计算数据总量,然后再执行实际的数据提取。
|
203
|
+
这个函数旨在通过单个查询来简化这一流程,减少数据库的负载和响应时间。
|
204
|
+
|
205
|
+
实现机制:
|
206
|
+
函数首先使用正则表达式识别出SQL查询的FROM关键词,这是因为无论SELECT查询的复杂程度如何,
|
207
|
+
计数的核心都是保留FROM及其后面的表和条件语句。然后,它构造一个新的COUNT查询,
|
208
|
+
替换原始查询中的SELECT部分。最后,函数执行这个新的查询并返回结果。
|
209
|
+
|
210
|
+
:param data_query (str): 原始的SQL SELECT查询字符串。
|
211
|
+
:return int: 查询结果的行数。
|
212
|
+
|
213
|
+
示例:
|
214
|
+
>> sql = SqlBase()
|
215
|
+
>> query = "SELECT id, name FROM users WHERE active = True"
|
216
|
+
>> count = sql.get_count_by_altering_query(query)
|
217
|
+
>> print(count)
|
218
|
+
45
|
219
|
+
|
220
|
+
注意:
|
221
|
+
- 这个函数假设输入的是合法的SQL SELECT查询。
|
222
|
+
- 函数依赖于数据库连接的execute方法能够正确执行转换后的COUNT查询。
|
223
|
+
- 在一些复杂的SQL查询中,特别是包含子查询、特殊函数或复杂的JOIN操作时,
|
224
|
+
请确保转换后的计数查询仍然有效。
|
225
|
+
"""
|
226
|
+
# 使用正则表达式定位'FROM'(考虑各种大小写情况),并确保它前后是空格或语句的开始/结束
|
227
|
+
match = re.search(r'\bFROM\b', data_query, flags=re.IGNORECASE)
|
228
|
+
if match:
|
229
|
+
from_index = match.start()
|
230
|
+
count_query = 'SELECT COUNT(*) ' + data_query[from_index:] # 构造计数查询
|
231
|
+
try:
|
232
|
+
result = self.execute(count_query).fetchone() # 执行查询
|
233
|
+
return result[0] if result else 0 # 返回计数结果
|
234
|
+
except Exception as e:
|
235
|
+
print(f"Error executing count query: {e}")
|
236
|
+
return 0
|
237
|
+
else:
|
238
|
+
print("No 'FROM' keyword found in the data query.")
|
239
|
+
return 0
|
240
|
+
|
180
241
|
|
181
242
|
class Connection(sqlite3.Connection, SqlBase):
|
182
243
|
"""
|
@@ -219,12 +280,12 @@ class Connection(sqlite3.Connection, SqlBase):
|
|
219
280
|
def __3_execute(self):
|
220
281
|
pass
|
221
282
|
|
222
|
-
def
|
283
|
+
def exec2nametuple(self, *args, **kwargs):
|
223
284
|
cur = self.cursor()
|
224
285
|
cur.row_factory = sqlite3.Row
|
225
286
|
return cur.execute(*args, **kwargs)
|
226
287
|
|
227
|
-
def
|
288
|
+
def exec2dict(self, *args, **kwargs):
|
228
289
|
""" execute基础上,改成返回值为dict类型 """
|
229
290
|
|
230
291
|
def dict_factory(cursor, row):
|
@@ -237,6 +298,9 @@ class Connection(sqlite3.Connection, SqlBase):
|
|
237
298
|
cur.row_factory = dict_factory
|
238
299
|
return cur.execute(*args, **kwargs)
|
239
300
|
|
301
|
+
# 兼容老版本
|
302
|
+
exec_dict = exec2dict
|
303
|
+
|
240
304
|
def __4_数据类型(self):
|
241
305
|
pass
|
242
306
|
|
@@ -1600,7 +1600,7 @@ class XlPath(type(pathlib.Path())):
|
|
1600
1600
|
ext = '.' + t.extension
|
1601
1601
|
ext0 = file_path.suffix
|
1602
1602
|
|
1603
|
-
if ext0 in ('.docx', '.xlsx', '.pptx'):
|
1603
|
+
if ext0 in ('.docx', '.xlsx', '.pptx', '.xlsm'):
|
1604
1604
|
ext0 = '.zip'
|
1605
1605
|
elif ext0 in ('.JPG', '.jpeg'):
|
1606
1606
|
ext0 = '.jpg'
|
@@ -1751,7 +1751,8 @@ class XlPath(type(pathlib.Path())):
|
|
1751
1751
|
|
1752
1752
|
# 六 文件配对
|
1753
1753
|
if run_mode >= 6:
|
1754
|
-
printf(
|
1754
|
+
printf(
|
1755
|
+
'\n六、文件配对(检查每个目录里stem名称是否配对,列出文件组成不单一的目录结构,请重点检查落单未配对的情况)')
|
1755
1756
|
prompt = False
|
1756
1757
|
for root, dirs, files in os.walk(self):
|
1757
1758
|
suffix_counts = defaultdict(list)
|
@@ -1877,6 +1878,7 @@ class XlPath(type(pathlib.Path())):
|
|
1877
1878
|
这个不仅用于分组,返回的字符串,也会作为字典序排序的依据,如果想用自然序,记得加natural_sort_key进行转换
|
1878
1879
|
:param batch_name: 设置batch的名称,默认 'batch{}'
|
1879
1880
|
:param bias: 希望用不到这个参数,只有中途出bug,需要继续处理的时候,用来自动增加编号
|
1881
|
+
注意默认就是从1开始编号的,比如bias设成8的话,实际是从9开始编号的
|
1880
1882
|
:param tail_limit: 限制数量少于多少的batch,合并到上一个batch中
|
1881
1883
|
"""
|
1882
1884
|
from pyxllib.algo.pupil import Groups
|
@@ -1974,28 +1976,55 @@ class XlPath(type(pathlib.Path())):
|
|
1974
1976
|
dst_dir.mkdir(parents=True, exist_ok=True)
|
1975
1977
|
|
1976
1978
|
# 无法选定文件
|
1977
|
-
def _move_selectable(self, dst_dir):
|
1979
|
+
def _move_selectable(self, dst_dir, *, print_mode=False):
|
1978
1980
|
""" 目录功能,将目录下可选中的文件移动到目标目录
|
1979
1981
|
|
1980
|
-
1
|
1982
|
+
1、要理解这个看似有点奇怪的功能,需要了解一个背景,在数据处理中,可能会拿到超长文件名的文件,
|
1981
1983
|
这种在windows平台虽然手动可以操作,但在代码中,会glob不到,强制指定也会说文件不存在
|
1982
1984
|
2、为了解决这类文件问题,一般需要对其进行某种规则的重命名。因为linux里似乎不会限制文件名长度,所以要把这些特殊文件打包到linux里处理。
|
1983
1985
|
3、因为这些文件本来就无法被选中,所以只能反向操作,将目录下的可选中文件移动到目标目录。
|
1984
1986
|
"""
|
1985
|
-
for p in self.glob('*'):
|
1986
|
-
|
1987
|
-
|
1987
|
+
for p in tqdm(self.glob('*'), disable=not print_mode):
|
1988
|
+
# 231211周一16:03 一般本来就glob不到,现在的p就是存在的,但是可能以防万一加的捕捉,我现在也不敢删
|
1989
|
+
if p.is_file():
|
1990
|
+
try:
|
1991
|
+
p.move(dst_dir / p.name)
|
1992
|
+
except FileNotFoundError:
|
1993
|
+
continue
|
1988
1994
|
|
1989
|
-
def move_unselectable(self, dst_dir):
|
1995
|
+
def move_unselectable(self, dst_dir, *, print_mode=False):
|
1990
1996
|
""" 见_move_selectable,因为无法对这些特殊文件进行移动
|
1991
1997
|
所以这里只是对_move_selectable的封装,中间通过文件重命名,来伪造移动了无法选中文件的操作效果
|
1992
1998
|
"""
|
1993
1999
|
tempdir = self.create_tempdir_path(dir=self.parent)
|
1994
2000
|
tempdir.mkdir(exist_ok=True)
|
1995
|
-
self._move_selectable(tempdir)
|
2001
|
+
self._move_selectable(tempdir, print_mode=print_mode)
|
1996
2002
|
self.rename2(dst_dir)
|
1997
2003
|
tempdir.move(self)
|
1998
2004
|
|
2005
|
+
def rename_stem_until_not_exists(self):
|
2006
|
+
""" 比较高级的一个操作,会按照某种规则不断重命名,直到是当前并不存在的文件名,常用在文件拷贝避免重名冲突等场景
|
2007
|
+
|
2008
|
+
todo 写个支持自定义规则的输出参数?
|
2009
|
+
todo 有个首次要不要判断exists的问题,可能跟不同的业务场景有关,要思考怎么设计更好...
|
2010
|
+
"""
|
2011
|
+
|
2012
|
+
def add_stem(m):
|
2013
|
+
a = int(m.group(1)) + 1
|
2014
|
+
return f'({a})'
|
2015
|
+
|
2016
|
+
file = self
|
2017
|
+
while file.exists():
|
2018
|
+
stem = file.stem
|
2019
|
+
m = re.search(r'\(\d+\)$', stem)
|
2020
|
+
if m: # 已经有目标范式的编号,继续累加
|
2021
|
+
stem = re.sub(r'\((\d+)\)$', add_stem, stem)
|
2022
|
+
else: # 还没有编号的,直接从'2'开始编号
|
2023
|
+
stem += ' (2)'
|
2024
|
+
file = self.with_stem(stem.strip()) # 忽略最后空白,这个很容易出问题
|
2025
|
+
|
2026
|
+
return file
|
2027
|
+
|
1999
2028
|
|
2000
2029
|
def demo_file():
|
2001
2030
|
""" File类的综合测试"""
|
@@ -2506,3 +2535,81 @@ class TwinDirs:
|
|
2506
2535
|
def copy_dir_structure(self):
|
2507
2536
|
""" 复制目录结构 """
|
2508
2537
|
self.src_dir.copy_dir_structure(self.dst_dir)
|
2538
|
+
|
2539
|
+
|
2540
|
+
class BatchFileRenamer:
|
2541
|
+
""" 对一批数据,按照某种规则判重、重命名去重
|
2542
|
+
一般是对stem重命名后,确保数据随意混合后名称也不会有出现重复
|
2543
|
+
"""
|
2544
|
+
|
2545
|
+
def __init__(self, _dir=None):
|
2546
|
+
"""
|
2547
|
+
:param _dir: 输入待处理的第一个目录
|
2548
|
+
"""
|
2549
|
+
# 所有待处理的文件
|
2550
|
+
self.files = []
|
2551
|
+
if _dir is not None:
|
2552
|
+
self.add_dir(_dir)
|
2553
|
+
|
2554
|
+
def add_dir(self, _dir):
|
2555
|
+
""" 添加一个目录下的所有文件
|
2556
|
+
如果有比较零散的文件待处理,可以直接操作self.files
|
2557
|
+
|
2558
|
+
todo 目录的重命名?如果引入目录的重命名,算法会复杂非常多的,这个暂不考虑。
|
2559
|
+
"""
|
2560
|
+
for f in XlPath(_dir).rglob_files():
|
2561
|
+
self.files.append(f)
|
2562
|
+
|
2563
|
+
def get_key(self, file):
|
2564
|
+
""" 计算一个文件的重复标识,不同文件之间的判重依据 """
|
2565
|
+
# 默认的key,规则会比较严,stem不重复,大小写不重复
|
2566
|
+
return file.stem.lower()
|
2567
|
+
|
2568
|
+
def get_new_name(self, file, exists_keys=None):
|
2569
|
+
""" 输入的f必须是已经确定要进行重命名的文件
|
2570
|
+
|
2571
|
+
对于windows来说
|
2572
|
+
是先假定在一个组中,增加编号
|
2573
|
+
如果编号的文件已经存在,则换一个新的命名组
|
2574
|
+
|
2575
|
+
对我这里来说,就不搞这么复杂了,就是无脑加编号就行
|
2576
|
+
"""
|
2577
|
+
|
2578
|
+
def add_stem(m):
|
2579
|
+
a = int(m.group(1)) + 1
|
2580
|
+
return f'({a})'
|
2581
|
+
|
2582
|
+
stem = file.stem
|
2583
|
+
while True:
|
2584
|
+
m = re.search(r'\(\d+\)$', stem)
|
2585
|
+
if m: # 已经有目标范式的编号,继续累加
|
2586
|
+
stem = re.sub(r'\((\d+)\)$', add_stem, stem)
|
2587
|
+
else: # 还没有编号的,直接从'2'开始编号
|
2588
|
+
stem += ' (2)'
|
2589
|
+
|
2590
|
+
f2 = file.with_stem(stem.strip()) # 忽略最后空白,这个很容易出问题
|
2591
|
+
k2 = self.get_key(f2)
|
2592
|
+
if k2 not in exists_keys: # 如果新的命名不会跟旧有文件有任何重复,循环就可以终止了
|
2593
|
+
exists_keys.add(k2)
|
2594
|
+
return f2
|
2595
|
+
|
2596
|
+
def rename_files(self, print_mode=False, exists_keys=None):
|
2597
|
+
""" 对文件进行批量重命名 """
|
2598
|
+
# 1 先遍历一遍文件,确认哪些文件是确定要重命名的
|
2599
|
+
exists_keys = exists_keys or set()
|
2600
|
+
repeat_name_files = [] # 确认要进行重命名的文件
|
2601
|
+
for f in self.files:
|
2602
|
+
k = self.get_key(f)
|
2603
|
+
if k not in exists_keys:
|
2604
|
+
exists_keys.add(k)
|
2605
|
+
else:
|
2606
|
+
repeat_name_files.append(f)
|
2607
|
+
|
2608
|
+
# 2 对需要重命名的文件进行操作
|
2609
|
+
cnt = 0
|
2610
|
+
for f in repeat_name_files:
|
2611
|
+
cnt += 1
|
2612
|
+
f2 = self.get_new_name(f, exists_keys)
|
2613
|
+
if print_mode:
|
2614
|
+
print(cnt, f.as_posix(), '-->', f2.name)
|
2615
|
+
f.rename2(f2)
|