pyxllib 0.3.95__tar.gz → 0.3.100__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.
Files changed (342) hide show
  1. {pyxllib-0.3.95/pyxllib.egg-info → pyxllib-0.3.100}/PKG-INFO +1 -1
  2. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/matcher.py +78 -0
  3. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/stat.py +40 -0
  4. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/data/echarts.py +69 -3
  5. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/data/pglib.py +75 -6
  6. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/data/sqlite.py +7 -1
  7. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/kq5034lib.py +155 -2
  8. pyxllib-0.3.100/pyxllib/ext/robustprocfile.py +191 -0
  9. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/webhook.py +11 -12
  10. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/specialist/filelib.py +22 -0
  11. pyxllib-0.3.100/pyxllib/prog/multiprocs.py +101 -0
  12. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/newbie.py +1 -1
  13. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/pupil.py +36 -0
  14. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/jiebalib.py +5 -2
  15. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/xmllib.py +5 -3
  16. {pyxllib-0.3.95 → pyxllib-0.3.100/pyxllib.egg-info}/PKG-INFO +1 -1
  17. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib.egg-info/SOURCES.txt +2 -0
  18. {pyxllib-0.3.95 → pyxllib-0.3.100}/setup.py +1 -1
  19. {pyxllib-0.3.95 → pyxllib-0.3.100}/LICENSE +0 -0
  20. {pyxllib-0.3.95 → pyxllib-0.3.100}/MANIFEST.in +0 -0
  21. {pyxllib-0.3.95 → pyxllib-0.3.100}/README.md +0 -0
  22. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/__init__.py +0 -0
  23. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/__init__.py +0 -0
  24. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/disjoint.py +0 -0
  25. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/geo.py +0 -0
  26. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/intervals.py +0 -0
  27. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/newbie.py +0 -0
  28. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/pupil.py +0 -0
  29. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/shapelylib.py +0 -0
  30. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/specialist.py +0 -0
  31. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/treelib.py +0 -0
  32. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/algo/unitlib.py +0 -0
  33. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/__init__.py +0 -0
  34. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/expert.py +0 -0
  35. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/imfile.py +0 -0
  36. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/imhash.py +0 -0
  37. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/pupil.py +0 -0
  38. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/rgbfmt.py +0 -0
  39. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/trackbartools.py +0 -0
  40. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/xlcvlib.py +0 -0
  41. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/cv/xlpillib.py +0 -0
  42. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/data/__init__.py +0 -0
  43. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/data/oss.py +0 -0
  44. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/data/sqllib.py +0 -0
  45. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/JLineViewer.py +0 -0
  46. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/__init__.py +0 -0
  47. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/autogui/__init__.py +0 -0
  48. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/autogui/autogui.py +0 -0
  49. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/autogui/virtualkey.py +0 -0
  50. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/demolib.py +0 -0
  51. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/old.py +0 -0
  52. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/qt.py +0 -0
  53. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/seleniumlib.py +0 -0
  54. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/tk.py +0 -0
  55. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/unixlib.py +0 -0
  56. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/utools.py +0 -0
  57. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/win32lib.py +0 -0
  58. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/ext/yuquelib.py +0 -0
  59. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/__init__.py +0 -0
  60. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/docxlib.py +0 -0
  61. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/gitlib.py +0 -0
  62. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/movielib.py +0 -0
  63. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/newbie.py +0 -0
  64. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/onenotelib.py +0 -0
  65. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/packlib/__init__.py +0 -0
  66. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/packlib/zipfile.py +0 -0
  67. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/pdflib.py +0 -0
  68. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/pupil.py +0 -0
  69. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/specialist/__init__.py +0 -0
  70. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/specialist/dirlib.py +0 -0
  71. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/specialist/download.py +0 -0
  72. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/file/xlsxlib.py +0 -0
  73. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/__init__.py +0 -0
  74. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/deprecatedlib.py +0 -0
  75. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/ipyexec.py +0 -0
  76. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/sitepackages.py +0 -0
  77. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/specialist/__init__.py +0 -0
  78. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/specialist/bc.py +0 -0
  79. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/specialist/browser.py +0 -0
  80. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/specialist/common.py +0 -0
  81. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/specialist/datetime.py +0 -0
  82. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/specialist/tictoc.py +0 -0
  83. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/specialist/xllog.py +0 -0
  84. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/prog/xlosenv.py +0 -0
  85. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/stdlib/__init__.py +0 -0
  86. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
  87. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/stdlib/tablepyxl/style.py +0 -0
  88. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
  89. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/__init__.py +0 -0
  90. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/ahocorasick.py +0 -0
  91. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/charclasslib.py +0 -0
  92. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/jscode.py +0 -0
  93. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/latex/__init__.py +0 -0
  94. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/levenshtein.py +0 -0
  95. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/nestenv.py +0 -0
  96. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/newbie.py +0 -0
  97. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/pupil/__init__.py +0 -0
  98. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/pupil/common.py +0 -0
  99. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/pupil/xlalign.py +0 -0
  100. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/pycode.py +0 -0
  101. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/specialist/__init__.py +0 -0
  102. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/specialist/common.py +0 -0
  103. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/specialist/ptag.py +0 -0
  104. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/spellchecker.py +0 -0
  105. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/text/vbacode.py +0 -0
  106. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/xl.py +0 -0
  107. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib/xlcv.py +0 -0
  108. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib.egg-info/dependency_links.txt +0 -0
  109. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib.egg-info/requires.txt +3 -3
  110. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxllib.egg-info/top_level.txt +0 -0
  111. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/__init__.py +0 -0
  112. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ai/__init__.py +0 -0
  113. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ai/clientlib.py +0 -0
  114. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ai/specialist.py +0 -0
  115. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ai/torch_app.py +0 -0
  116. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ai/xlpaddle.py +0 -0
  117. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ai/xltorch.py +0 -0
  118. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/__init__.py +0 -0
  119. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/coco.py +0 -0
  120. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/datacls.py +0 -0
  121. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/datasets.py +0 -0
  122. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/gptlib.py +0 -0
  123. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/icdar/__init__.py +0 -0
  124. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/icdar/deteval.py +0 -0
  125. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/icdar/icdar2013.py +0 -0
  126. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/icdar/iou.py +0 -0
  127. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
  128. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/imtextline.py +0 -0
  129. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/labelme.py +0 -0
  130. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/removeline.py +0 -0
  131. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/data/specialist.py +0 -0
  132. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/eval/__init__.py +0 -0
  133. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/paddleocr.py +0 -0
  134. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/__init__.py +0 -0
  135. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
  136. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/__init__.py +0 -0
  137. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
  138. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
  139. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
  140. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
  141. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
  142. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
  143. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
  144. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
  145. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
  146. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
  147. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
  148. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
  149. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
  150. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
  151. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
  152. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
  153. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
  154. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
  155. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
  156. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
  157. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
  158. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
  159. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
  160. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/__init__.py +0 -0
  161. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
  162. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
  163. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/center_loss.py +0 -0
  164. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
  165. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
  166. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
  167. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
  168. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
  169. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
  170. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
  171. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
  172. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
  173. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
  174. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
  175. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
  176. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
  177. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
  178. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
  179. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
  180. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
  181. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
  182. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/__init__.py +0 -0
  183. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
  184. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
  185. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
  186. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
  187. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
  188. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
  189. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
  190. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
  191. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
  192. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
  193. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
  194. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
  195. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
  196. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
  197. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
  198. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
  199. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
  200. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
  201. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
  202. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
  203. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
  204. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
  205. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
  206. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
  207. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
  208. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
  209. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
  210. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
  211. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
  212. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
  213. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
  214. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
  215. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
  216. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
  217. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
  218. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
  219. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
  220. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
  221. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
  222. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
  223. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
  224. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
  225. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
  226. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
  227. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
  228. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
  229. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
  230. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
  231. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
  232. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
  233. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
  234. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
  235. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
  236. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
  237. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
  238. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
  239. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
  240. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
  241. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
  242. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
  243. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
  244. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
  245. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
  246. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
  247. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
  248. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
  249. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
  250. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
  251. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
  252. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
  253. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/__init__.py +0 -0
  254. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/eval.py +0 -0
  255. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/export_center.py +0 -0
  256. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/export_model.py +0 -0
  257. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
  258. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
  259. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
  260. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
  261. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
  262. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
  263. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
  264. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer_det.py +0 -0
  265. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
  266. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
  267. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
  268. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/infer_table.py +0 -0
  269. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/program.py +0 -0
  270. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
  271. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/train.py +0 -0
  272. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/tools/xlprog.py +0 -0
  273. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
  274. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/__init__.py +0 -0
  275. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
  276. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
  277. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
  278. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
  279. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
  280. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
  281. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
  282. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
  283. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
  284. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
  285. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
  286. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
  287. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
  288. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
  289. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
  290. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
  291. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
  292. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
  293. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
  294. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
  295. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
  296. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
  297. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
  298. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
  299. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
  300. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
  301. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
  302. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
  303. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
  304. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
  305. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
  306. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
  307. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/dict90.txt +0 -0
  308. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
  309. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
  310. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
  311. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
  312. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
  313. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
  314. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
  315. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
  316. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/gen_label.py +0 -0
  317. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
  318. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/iou.py +0 -0
  319. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/logging.py +0 -0
  320. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/network.py +0 -0
  321. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
  322. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/profiler.py +0 -0
  323. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/save_load.py +0 -0
  324. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/stats.py +0 -0
  325. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppocr/utils/utility.py +0 -0
  326. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/__init__.py +0 -0
  327. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/predict_system.py +0 -0
  328. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/__init__.py +0 -0
  329. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/eval_table.py +0 -0
  330. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/matcher.py +0 -0
  331. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
  332. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/predict_table.py +0 -0
  333. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
  334. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
  335. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
  336. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
  337. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
  338. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
  339. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/ppstructure/utility.py +0 -0
  340. {pyxllib-0.3.95 → pyxllib-0.3.100}/pyxlpr/xlai.py +0 -0
  341. {pyxllib-0.3.95 → pyxllib-0.3.100}/requirements.txt +0 -0
  342. {pyxllib-0.3.95 → pyxllib-0.3.100}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.95
3
+ Version: 0.3.100
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -13,6 +13,8 @@ from pyxllib.prog.pupil import check_install_package
13
13
  # check_install_package('Levenshtein', 'python-Levenshtein')
14
14
 
15
15
  from collections import defaultdict
16
+ import heapq
17
+ import math
16
18
  import warnings
17
19
 
18
20
  warnings.filterwarnings("ignore", message="loaded more than 1 DLL from .libs:")
@@ -40,6 +42,53 @@ except ModuleNotFoundError:
40
42
  pass
41
43
 
42
44
 
45
+ def calculate_coeff_favoring_length(length1, length2, baseline=100, scale=10000):
46
+ """
47
+ 根据两文本的长度计算相似度调整系数,以解决短文本过高相似度评分的问题。
48
+
49
+ 短文本之间相似或完全相同的片段可能导致相似度评分过高,从而误判文本间的相关性比实际更高。
50
+ 通过引入相似度调整系数来平衡评分,降低短文本之间的相似度得分,使评分更加合理和公平。
51
+
52
+ :param length1: 第一文本的长度
53
+ :param length2: 第二文本的长度
54
+ :param baseline: 基线长度,影响系数调整的起始点。
55
+ :param scale: 尺度长度,定义了系数增长到2的长度标准。
56
+ :return: 相似度调整系数。
57
+ """
58
+ total_length = length1 + length2
59
+ length_ratio = min(length1, length2) / max(length1, length2)
60
+
61
+ if total_length < baseline:
62
+ coefficient = 0.5 + 0.5 * (total_length / baseline)
63
+ else:
64
+ coefficient = 1 + (math.log1p(total_length - baseline + 1) / math.log1p(scale - baseline + 1))
65
+
66
+ # 考虑长度差异的影响
67
+ coefficient *= length_ratio
68
+
69
+ return coefficient
70
+
71
+
72
+ def compute_text_similarity_favoring_length(text1, text2, baseline=100, scale=10000):
73
+ """
74
+ 计算两段文本之间的相似度,引入长度调整系数以解决短文本过高相似度评分的问题。
75
+
76
+ :param text1: 第一段文本
77
+ :param text2: 第二段文本
78
+ :param baseline: 基线长度,影响系数调整的起始点。
79
+ :param scale: 尺度长度,定义了系数增长到2的长度标准。
80
+ :return: 加权后的相似度得分,范围在0到1之间。
81
+ """
82
+ base_similarity = Levenshtein.ratio(text1, text2)
83
+ coefficient = calculate_coeff_favoring_length(len(text1), len(text2), baseline, scale)
84
+
85
+ # 计算加权相似度
86
+ weighted_similarity = base_similarity * coefficient
87
+
88
+ # 确保相似度不会超过1
89
+ return min(weighted_similarity, 1.0)
90
+
91
+
43
92
  class DataMatcher:
44
93
  """ 泛化的匹配类,对任何类型的数据进行匹配 """
45
94
 
@@ -161,6 +210,35 @@ class DataMatcher:
161
210
  center_idx = max(indices, key=lambda x: sum(get_similarity(x, y) for y in indices))
162
211
  return center_idx
163
212
 
213
+ def find_top_similar_pairs(self, top_n=1):
214
+ """找到最相近的top_n对数据。
215
+
216
+ :param top_n: 需要返回的最相似的数据对的数量。
217
+ :return: 一个列表,包含(top_n个)最相似数据对的索引和它们之间的相似度。
218
+ """
219
+ if len(self.data) < 2:
220
+ return []
221
+
222
+ # 初始化一个列表来保存最相似的数据对,使用最小堆来维护这个列表
223
+ # 最小堆能够保证每次都能快速弹出相似度最小的数据对
224
+ top_pairs = []
225
+
226
+ for i in tqdm(range(len(self.data))):
227
+ for j in range(i + 1, len(self.data)):
228
+ similarity = self.compute_similarity(self.data[i], self.data[j])
229
+
230
+ # 如果当前相似度对数量还未达到top_n,直接添加
231
+ if len(top_pairs) < top_n:
232
+ heapq.heappush(top_pairs, (similarity, (i, j)))
233
+ else:
234
+ # 如果当前对的相似度大于堆中最小的相似度,替换之
235
+ if similarity > top_pairs[0][0]:
236
+ heapq.heapreplace(top_pairs, (similarity, (i, j)))
237
+
238
+ # 将堆转换为排序后的列表返回
239
+ top_pairs.sort(reverse=True, key=lambda x: x[0])
240
+ return [(pair[1], pair[0]) for pair in top_pairs]
241
+
164
242
 
165
243
  class GroupedDataMatcher(DataMatcher):
166
244
  """ 对数据量特别大的情况,我们可以先对数据进行分组,然后再对每个分组进行匹配 """
@@ -430,3 +430,43 @@ def print_full_dataframe(df):
430
430
  print(df)
431
431
 
432
432
  pd.options('display.max_rows', 60)
433
+
434
+
435
+ def custom_fillna(df, default_fill_value='', numeric_fill_value=None, specific_fill=None):
436
+ """ 使用更多灵活性填充DataFrame中的NaN值。
437
+
438
+ :param pandas.DataFrame df: 需要处理的DataFrame。
439
+ :param str default_fill_value: 非数值列中NaN的默认填充值。
440
+ :param numeric_fill_value: 数值列中NaN的填充值,如果不指定,则默认为None。
441
+ :param dict specific_fill: 指定列名及其NaN的填充值,如果不指定,则默认为None。
442
+ :return: 已根据指定标准填充NaN值的pandas.DataFrame。
443
+
444
+ >>> df = pd.DataFrame({'A': [1, 2, None], 'B': [None, 'x', 'y'], 'C': [None, None, None]})
445
+ >>> custom_fillna(df, 'filled', 0, {'C': 'special'})
446
+ """
447
+ for column in df.columns:
448
+ # 检查列是否在specific_fill中指定;如果是,则使用指定的值填充。
449
+ if specific_fill and column in specific_fill:
450
+ df[column] = df[column].fillna(specific_fill[column])
451
+ # 如果列是数值型且指定了numeric_fill_value,则使用numeric_fill_value填充。
452
+ elif numeric_fill_value is not None and pd.api.types.is_numeric_dtype(df[column]):
453
+ df[column] = df[column].fillna(numeric_fill_value)
454
+ # 否则,对非数值列使用default_fill_value进行填充。
455
+ elif pd.api.types.is_object_dtype(df[column]) or pd.api.types.is_string_dtype(df[column]):
456
+ df[column] = df[column].fillna(default_fill_value)
457
+ # 可以在这里添加更多条件,以处理其他数据类型,如datetime。
458
+ return df
459
+
460
+
461
+ def dataframe_to_list(df):
462
+ """将DataFrame转换为列表结构,第一行是表头,其余是数据"""
463
+ # 获取表头(列名)作为第一个列表元素
464
+ headers = df.columns.tolist()
465
+
466
+ # 获取数据行,每一行作为一个列表,然后将所有这些列表收集到一个大列表中
467
+ data_rows = df.values.tolist()
468
+
469
+ # 将表头和数据行合并成最终的列表
470
+ result_list = [headers] + data_rows
471
+
472
+ return result_list
@@ -14,10 +14,14 @@ from pyxllib.prog.pupil import check_install_package
14
14
 
15
15
  check_install_package('pyecharts')
16
16
 
17
+ # import types
18
+
17
19
  import pyecharts
18
20
  from pyecharts import options as opts
19
21
  from pyecharts.commons.utils import JsCode
20
- from pyecharts.charts import Bar, Line
22
+ from pyecharts.globals import ChartType
23
+ from pyecharts import types
24
+ from pyecharts.charts import Bar, Line, Radar
21
25
  from pyecharts.charts.chart import Chart
22
26
 
23
27
  from pyxllib.prog.pupil import inject_members
@@ -54,7 +58,7 @@ class XlChart(Chart):
54
58
  kwargs['label']['formatter'] = fmt
55
59
 
56
60
  self._append_color(color)
57
- self._append_legend(name)
61
+ self._append_legend(name, is_selected=True)
58
62
 
59
63
  self.options.get('series').append(
60
64
  {
@@ -100,6 +104,68 @@ class XlBar(Bar):
100
104
  """
101
105
  return cls.from_dict({'value': list(yaxis)}, xaxis=xaxis, title=title)
102
106
 
107
+ @classmethod
108
+ def from_data_split_into_groups(cls, data, groups, *, title=None):
109
+ """根据给定的组数自动拆分数据并生成条形图
110
+ :param list data: 数据清单
111
+ :param int groups: 要拆分成的组数
112
+ """
113
+ # 找到最大值和最小值
114
+ min_val, max_val = min(data), max(data)
115
+
116
+ # 计算间隔
117
+ interval = (max_val - min_val) / groups
118
+
119
+ # 分组和标签
120
+ group_counts = [0] * groups
121
+ labels = []
122
+ # todo 如果数据量特别大,这里应该排序后,再用特殊方法计算分组
123
+ for value in data:
124
+ index = min(int((value - min_val) / interval), groups - 1)
125
+ group_counts[index] += 1
126
+
127
+ for i in range(groups):
128
+ labels.append(f"{min_val + interval * i:.2f}-{min_val + interval * (i + 1):.2f}")
129
+ # t = cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
130
+
131
+ return cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
132
+
133
+
134
+ class XlRadar(Radar):
135
+ def __init__(self, *args, **kwargs):
136
+ super().__init__(*args, **kwargs)
137
+ self.color_idx = 0
138
+
139
+ def add(
140
+ self,
141
+ series_name: str,
142
+ data: types.Sequence[types.Union[opts.RadarItem, dict]],
143
+ *,
144
+ label_opts=None,
145
+ color: types.Optional[str] = None,
146
+ linestyle_opts=None,
147
+ **kwargs
148
+ ):
149
+ """ 标准库(2.0.5版)的雷达图颜色渲染有问题,这里要增加一个修正过程 """
150
+ if label_opts is None:
151
+ label_opts = opts.LabelOpts(is_show=False)
152
+
153
+ if linestyle_opts is None:
154
+ linestyle_opts = opts.LineStyleOpts(color=self.colors[self.color_idx % len(self.colors)])
155
+ self.color_idx += 1
156
+ elif linestyle_opts.get('color') is None:
157
+ linestyle_opts.update(color=self.colors[self.color_idx % len(self.colors)])
158
+ self.color_idx += 1
159
+
160
+ if color is None:
161
+ color = linestyle_opts.get('color')
162
+
163
+ return super(XlRadar, self).add(series_name, data,
164
+ label_opts=label_opts,
165
+ color=color,
166
+ linestyle_opts=linestyle_opts,
167
+ **kwargs)
168
+
103
169
 
104
170
  inject_members(XlBar, Bar)
105
171
 
@@ -117,7 +183,7 @@ def draw_pareto_chart(data, accuracy=0.1, *, title='帕累托累积权重', valu
117
183
  x.add_series(title, pts, labels=labels, label={'position': 'right'})
118
184
  x.set_global_opts(
119
185
  # x轴末尾要故意撑大一些,不然有部分内容会显示不全
120
- xaxis_opts=opts.AxisOpts(name='条目数', max_=int(float(f'{pts[-1][0]*1.2:.2g}'))),
186
+ xaxis_opts=opts.AxisOpts(name='条目数', max_=int(float(f'{pts[-1][0] * 1.2:.2g}'))),
121
187
  yaxis_opts=opts.AxisOpts(name='累积和')
122
188
  )
123
189
  return x
@@ -52,6 +52,17 @@ class Connection(psycopg.Connection, SqlBase):
52
52
  def __1_库(self):
53
53
  pass
54
54
 
55
+ def get_db_activities(self):
56
+ """
57
+ 检索当前数据库的活动信息。
58
+ """
59
+ sql = """
60
+ SELECT pid, datname, usename, state, query, age(now(), query_start) AS "query_age"
61
+ FROM pg_stat_activity
62
+ WHERE state = 'active'
63
+ """
64
+ return self.exec2dict(sql).fetchall()
65
+
55
66
  def __2_表格(self):
56
67
  pass
57
68
 
@@ -140,6 +151,10 @@ class Connection(psycopg.Connection, SqlBase):
140
151
  也可以写复杂的处理算法规则,详见 http://postgres.cn/docs/12/sql-insert.html
141
152
  比如这里是插入的id重复的话,就把host_name替换掉,还可以指定nick_name替换为'abc'
142
153
  注意前面的(id)是必须要输入的
154
+
155
+ 注意:有个常见需求,是想插入后返回对应的id,但是这样就需要知道这张表自增的id字段名
156
+ 以及还是很难获得插入后的id值,可以默认刚插入的id是最大的,但是这样并不安全,有风险
157
+ 建议还是外部自己先计算全表最大的id值,自己实现自增,就能知道插入的这条数据的id了
143
158
  """
144
159
  ks = ','.join(cols.keys())
145
160
  vs = ','.join(['%s'] * (len(cols.keys())))
@@ -419,8 +434,8 @@ class XlprDb(Connection):
419
434
  if gpu:
420
435
  status['gpu_memory'] = ssh.check_gpu_usage(print_mode=True)
421
436
  if disk:
422
- # 检查磁盘空间会很慢,如果超时可以跳过。
423
- status['disk_memory'] = ssh.check_disk_usage(print_mode=True, timeout=7200)
437
+ # 检查磁盘空间会很慢,如果超时可以跳过。(设置超时6小时)
438
+ status['disk_memory'] = ssh.check_disk_usage(print_mode=True, timeout=60 * 60 * 6)
424
439
  except Exception as e:
425
440
  status = {'error': f'{str(type(e))[8:-2]}: {e}'}
426
441
  print(status)
@@ -524,7 +539,8 @@ class XlprDb(Connection):
524
539
 
525
540
  args = ['CPU核心数(比如4核显示是400%)', date_trunc, recent, 'sum(hosts.cpu_number)*100']
526
541
 
527
- htmltexts = ['<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
542
+ htmltexts = [
543
+ '<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
528
544
  res = self._get_host_trace_total('cpu', 'XLPR服务器 CPU 使用近况', *args)
529
545
  htmltexts.append(res[0])
530
546
 
@@ -546,7 +562,8 @@ class XlprDb(Connection):
546
562
 
547
563
  args = ['内存(单位:GB)', date_trunc, recent, 'sum(hosts.cpu_gb)']
548
564
 
549
- htmltexts = ['<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
565
+ htmltexts = [
566
+ '<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
550
567
  res = self._get_host_trace_total('cpu_memory', 'XLPR服务器 内存 使用近况', *args)
551
568
  htmltexts.append(res[0])
552
569
 
@@ -570,7 +587,8 @@ class XlprDb(Connection):
570
587
 
571
588
  args = ['硬盘(单位:GB)', date_trunc, recent, 'sum(hosts.disk_gb)']
572
589
 
573
- htmltexts = ['<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
590
+ htmltexts = [
591
+ '<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
574
592
  res = self._get_host_trace_total('disk_memory', 'XLPR服务器 DISK硬盘 使用近况', *args)
575
593
  htmltexts.append(res[0])
576
594
  htmltexts.append('注:xlpr4(四卡)服务器使用du计算/home大小有问题,未统计在列<br/>')
@@ -597,7 +615,8 @@ class XlprDb(Connection):
597
615
 
598
616
  args = ['显存(单位:GB)', date_trunc, recent, 'sum(hosts.gpu_gb)']
599
617
 
600
- htmltexts = ['<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
618
+ htmltexts = [
619
+ '<a target="_blank" href="https://www.yuque.com/xlpr/data/hnpb2g?singleDoc#"> 《服务器监控》工具使用文档 </a>']
601
620
  res = self._get_host_trace_total('gpu_memory', 'XLPR八台服务器 GPU显存 使用近况', *args)
602
621
  htmltexts.append(res[0])
603
622
 
@@ -641,3 +660,53 @@ class XlprDb(Connection):
641
660
  self.update_row('files', {'dhash': computed_dhash}, {'id': file_id})
642
661
  progress_bar.update(1)
643
662
  self.commit()
663
+
664
+ def append_history(self, table_name, where, backup_keys, *,
665
+ can_merge=None,
666
+ update_time=None,
667
+ commit=False):
668
+ """ 为表格添加历史记录,请确保这个表有一个jsonb格式的historys字段
669
+
670
+ 这里每次都会对关键字段进行全量备份,没有进行高级的优化。
671
+ 所以只适用于一些历史记录功能场景。更复杂的还是需要另外自己定制。
672
+
673
+ :param table_name: 表名
674
+ :param where: 要记录的id的规则,请确保筛选后记录是唯一的
675
+ :param backup_keys: 需要备份的字段名
676
+ :param can_merge: 在某些情况下,history不需要非常冗余地记录,可以给定与上一条合并的规则
677
+ def can_merge(last, now):
678
+ "last是上一条字典记录,now是当前要记录的字典数据,
679
+ 返回True,则用now替换last,并不新增记录"
680
+ ...
681
+
682
+ :param update_time: 更新时间,如果不指定则使用当前时间
683
+ """
684
+ # 1 获得历史记录
685
+ ops = ' AND '.join([f'{k}=%s' for k in where.keys()])
686
+ historys = self.exec2one(f'SELECT historys FROM {table_name} WHERE {ops}', list(where.values())) or []
687
+ if historys:
688
+ status1 = historys[-1]
689
+ else:
690
+ status1 = {}
691
+
692
+ # 2 获得新记录
693
+ if update_time is None:
694
+ update_time = utc_timestamp()
695
+ status2 = self.exec2dict(f'SELECT {",".join(backup_keys)} FROM {table_name} WHERE {ops}',
696
+ list(where.values())).fetchone()
697
+ status2['update_time'] = update_time
698
+
699
+ # 3 添加历史记录
700
+ if can_merge is None:
701
+ def can_merge(status1, status2):
702
+ for k in backup_keys:
703
+ if status1.get(k) != status2.get(k):
704
+ return False
705
+ return True
706
+
707
+ if historys and can_merge(status1, status2):
708
+ historys[-1] = status2
709
+ else:
710
+ historys.append(status2)
711
+
712
+ self.update_row(table_name, {'historys': historys}, where, commit=commit)
@@ -7,9 +7,12 @@
7
7
  import json
8
8
  import re
9
9
  import sqlite3
10
+ import warnings
10
11
 
11
12
  import pandas as pd
12
13
 
14
+ warnings.filterwarnings('ignore', message="pandas only support SQLAlchemy connectable")
15
+
13
16
 
14
17
  class SqlBase:
15
18
  """ Sql语法通用的功能 """
@@ -109,7 +112,10 @@ class SqlBase:
109
112
 
110
113
  def exec2one(self, *args, **kwargs):
111
114
  """ 获得第1行的值 """
112
- return self.execute(*args, **kwargs).fetchone()[0]
115
+ try:
116
+ return self.execute(*args, **kwargs).fetchone()[0]
117
+ except TypeError:
118
+ return None
113
119
 
114
120
  def exec2row(self, *args, **kwargs):
115
121
  """ 获得第1行的值 """
@@ -15,13 +15,14 @@ from pyxllib.prog.pupil import check_install_package
15
15
  check_install_package('fire') # 自动安装依赖包
16
16
 
17
17
  from collections import Counter, defaultdict
18
- from datetime import date
18
+ from datetime import date, timedelta
19
19
  import datetime
20
20
  import math
21
21
  import os
22
22
  import re
23
23
  import time
24
24
  from io import StringIO
25
+ import csv
25
26
 
26
27
  import fire
27
28
  import pandas as pd
@@ -50,7 +51,7 @@ class Xiaoetong:
50
51
  self.token = ''
51
52
 
52
53
  def login(self, app_id, client_id, secret_key):
53
- """ 登录
54
+ """ 登录,获取token
54
55
  """
55
56
  self.app_id = app_id
56
57
  self.client_id = client_id
@@ -78,6 +79,8 @@ class Xiaoetong:
78
79
  raise Exception("HTTP request failed with status code {}".format(response.status_code))
79
80
 
80
81
  def get_alive_user_list(self, resource_id, page_size=100):
82
+ """ 获取直播间用户
83
+ """
81
84
  # 1 获取总页数
82
85
  url = "https://api.xiaoe-tech.com/xe.alive.user.list/1.0.0" # 接口地址【路径:API列表 -> 直播管理 -> 获取直播间用户列表】
83
86
  data_1 = {
@@ -106,6 +109,36 @@ class Xiaoetong:
106
109
  # lst.extend(data_1)
107
110
  return lst
108
111
 
112
+ def get_elock_actor(self, activity_id, page_size=100):
113
+ """ 获取打卡参与用户
114
+ """
115
+ # 获取总页数
116
+ url = "https://api.xiaoe-tech.com/xe.elock.actor/1.0.0" # 接口地址【路径:API列表 -> 打卡管理 -> 获取打卡参与用户】
117
+ data_1 = {
118
+ "access_token": self.token,
119
+ "activity_id": activity_id,
120
+ "page_index": 1,
121
+ "page_size": page_size
122
+ }
123
+ response_1 = requests.post(url, data=data_1)
124
+ result_1 = response_1.json()
125
+ page = math.ceil(result_1['data']['count'] / page_size) # 页数
126
+ # 获取打卡用户数据
127
+ lst = result_1['data']['list']
128
+ for i in range(1, page): # 为什么从1开始,因为第一页的数据上面已经获取到了,这里没必要从新获取一次
129
+ data = {
130
+ "access_token": self.token,
131
+ "activity_id": activity_id,
132
+ "page_index": i + 1,
133
+ "page_size": page_size
134
+ }
135
+ response = requests.post(url, data=data)
136
+ result = response.json()
137
+ data_1 = result['data']['list']
138
+ lst += data_1
139
+ # lst.extend(data_1)
140
+ return lst
141
+
109
142
 
110
143
  class 网课考勤:
111
144
  def __init__(self, today=None):
@@ -652,6 +685,12 @@ class 网课考勤:
652
685
  except UnicodeDecodeError:
653
686
  pass
654
687
 
688
+ if df is None:
689
+ try:
690
+ df = pd.read_csv(files[-1], encoding="ANSI") # 240226周一11:21,
691
+ except UnicodeDecodeError:
692
+ pass
693
+
655
694
  if df is None:
656
695
  raise ValueError
657
696
 
@@ -921,6 +960,120 @@ class 网课考勤:
921
960
  # driver.click('//*[@id="commitRefundApplyBtn"]') # 建议手动点"提交申请"
922
961
 
923
962
 
963
+ class 网课考勤2(网课考勤):
964
+ def login_xe(self):
965
+ self.xe = Xiaoetong() # 实例化
966
+ self.xe.login(self.app_id,
967
+ self.client_id,
968
+ self.secret_key) # 获取了token
969
+
970
+ # 依据课程链接,获取资源id(与课次)
971
+ def 获取课次与资源id(self):
972
+ 课程链接 = self.课程链接[1:]
973
+ ls_resource_id = [""]
974
+ for item in 课程链接: # 课次
975
+ resource_id = re.search(r"detail\?id=(.+?)\&", item) # 资源id
976
+ ls_resource_id.append(resource_id.group(1))
977
+ return ls_resource_id
978
+
979
+ # 获取直播间用户数据
980
+ def 获取直播间用户数据(self, resource_id, path):
981
+ if path.is_file():
982
+ return
983
+ # 2)获取直播间用户数据:
984
+ lst = self.xe.get_alive_user_list(resource_id)
985
+ fieldnames = ['用户ID', '用户昵称', '备注名', '状态', '直播间停留时长(秒)', '直播间停留时长',
986
+ '累计观看时长(秒)', '累计观看时长', '直播观看时长(秒)', '直播观看时长', '回放观看时长(秒)',
987
+ '回放观看时长', '评论次数', '直播间成交金额']
988
+ p = path
989
+ with open(p, mode='w', newline='', encoding='utf-8') as file:
990
+ writer = csv.DictWriter(file, fieldnames=fieldnames)
991
+ writer.writeheader()
992
+ for x in lst:
993
+ record = {
994
+ '用户ID': x['user_id'],
995
+ '用户昵称': x['wx_nickname'],
996
+ '备注名': None,
997
+ '状态': "其它关联权益",
998
+ '直播间停留时长(秒)': x['his_online_time'],
999
+ '直播间停留时长': str(timedelta(seconds=x['his_online_time'])),
1000
+ '累计观看时长(秒)': x['his_learn_time'],
1001
+ '累计观看时长': str(timedelta(seconds=x['his_learn_time'])),
1002
+ '直播观看时长(秒)': x['his_learning_time'],
1003
+ '直播观看时长': str(timedelta(seconds=x['his_learning_time'])),
1004
+ '回放观看时长(秒)': x['his_learned_time'],
1005
+ '回放观看时长': str(timedelta(seconds=x['his_learned_time'])),
1006
+ '评论次数': x['comment_num'],
1007
+ '直播间成交金额': x['user_total_price']
1008
+ }
1009
+ writer.writerow(record)
1010
+
1011
+ def 获取课次列表(self):
1012
+ return list(range(max(self.结束课次2, 1), self.当天课次2 + 1))
1013
+
1014
+ def 下载课程(self):
1015
+ prfx = self.prfx
1016
+ lt = self.获取课次与资源id()
1017
+ for i in tqdm(self.获取课次列表()):
1018
+ resource_id = lt[i]
1019
+ formatted_date = self.today # datetime.datetime.now().strftime("%Y-%m-%d")
1020
+ path = prfx.format(x=i, y=formatted_date)
1021
+ self.获取直播间用户数据(resource_id, self.root / "数据表" / path)
1022
+
1023
+ # 20240206 新增【针对打卡部分
1024
+ def 获取打卡id(self):
1025
+ """ 依据打卡链接,获取activity_id(打卡id)
1026
+ """
1027
+ 打卡链接 = self.打卡链接[1:]
1028
+ ls_activity_id = []
1029
+ for item in 打卡链接: # 课次
1030
+ activity_id = re.search(r"\?activity_id=(.+?)\&", item)
1031
+ ls_activity_id.append(activity_id.group(1))
1032
+ return ls_activity_id
1033
+
1034
+ def 获取打卡参与用户(self, activity_id, path):
1035
+ # 1)如果路径中已经有了,就跳过
1036
+ if path.is_file():
1037
+ return
1038
+ # 2)获取打卡用户数据:
1039
+ lst = self.xe.get_elock_actor(activity_id)
1040
+ fieldnames = ['用户id', '用户昵称', '打卡昵称', '打卡分组', '姓名', '电话', '最近采集号码', '城市', '微信号',
1041
+ '打卡天数', '打卡次数', '被点赞数', '被评论数', '被点评数', '被精选数', '参与时间']
1042
+ p = path
1043
+ with open(p, mode='w', newline='', encoding='utf-8') as file:
1044
+ writer = csv.DictWriter(file, fieldnames=fieldnames)
1045
+ writer.writeheader()
1046
+ for x in lst:
1047
+ record = {
1048
+ '用户id': x['user_id'],
1049
+ '用户昵称': x['wx_nickname'],
1050
+ '打卡昵称': x['clock_nickname'],
1051
+ '打卡分组': None,
1052
+ '姓名': x['wx_nickname'],
1053
+ '电话': x['phone'],
1054
+ '最近采集号码': None,
1055
+ '城市': x['wx_city'],
1056
+ '微信号': None,
1057
+ '打卡天数': x['clock_days'],
1058
+ '打卡次数': x['clock_days'],
1059
+ '被点赞数': x['zan_count'],
1060
+ '被评论数': x['comment_count'],
1061
+ '被点评数': x['review_count'],
1062
+ '被精选数': 0,
1063
+ '参与时间': x['created_at']
1064
+ }
1065
+ writer.writerow(record)
1066
+
1067
+ def 下载打卡数据(self):
1068
+ prfx = "{x}-" + f"《{self.返款标题}技术公益网课【中心教室】-日历打卡学员数据.csv"
1069
+ lt = self.获取打卡id()
1070
+ for i in tqdm(range(1)):
1071
+ activity_id = lt[i]
1072
+ formatted_date = self.today # datetime.datetime.now().strftime("%Y-%m-%d")
1073
+ path = prfx.format(x=formatted_date)
1074
+ self.获取打卡参与用户(activity_id, self.root / "数据表" / path)
1075
+
1076
+
924
1077
  class KqDb(Connection):
925
1078
  """ 五一身心行修考勤工具 """
926
1079