py2ls 0.2.4.24__tar.gz → 0.2.4.25__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/PKG-INFO +1 -1
  2. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/index +0 -0
  3. py2ls-0.2.4.25/py2ls/ec2ls.py +61 -0
  4. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/ips.py +105 -55
  5. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/ml2ls.py +244 -110
  6. py2ls-0.2.4.25/py2ls/nl2ls.py +283 -0
  7. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/plot.py +351 -40
  8. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/pyproject.toml +1 -1
  9. py2ls-0.2.4.24/py2ls/ml2ls copy.py +0 -2906
  10. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/README.md +0 -0
  11. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.DS_Store +0 -0
  12. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/.DS_Store +0 -0
  13. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/COMMIT_EDITMSG +0 -0
  14. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/FETCH_HEAD +0 -0
  15. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/HEAD +0 -0
  16. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/config +0 -0
  17. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/description +0 -0
  18. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/applypatch-msg.sample +0 -0
  19. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/commit-msg.sample +0 -0
  20. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/fsmonitor-watchman.sample +0 -0
  21. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/post-update.sample +0 -0
  22. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/pre-applypatch.sample +0 -0
  23. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/pre-commit.sample +0 -0
  24. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/pre-merge-commit.sample +0 -0
  25. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/pre-push.sample +0 -0
  26. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/pre-rebase.sample +0 -0
  27. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/pre-receive.sample +0 -0
  28. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/prepare-commit-msg.sample +0 -0
  29. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/push-to-checkout.sample +0 -0
  30. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/hooks/update.sample +0 -0
  31. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/info/exclude +0 -0
  32. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/logs/HEAD +0 -0
  33. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/logs/refs/heads/main +0 -0
  34. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/logs/refs/remotes/origin/HEAD +0 -0
  35. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/logs/refs/remotes/origin/main +0 -0
  36. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/.DS_Store +0 -0
  37. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/01/d5bd8065e6860c0bd23ff9fa57161806a099e1 +0 -0
  38. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/09/08da26de58c114225ad81f484b80bf5d351b34 +0 -0
  39. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/0b/409e1bc918277010f5679b402d1d1dda53e15c +0 -0
  40. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/12/c2808a1b3a4d0892a4154dfba1e2ae3770fa73 +0 -0
  41. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/14/449a0e6ba4ea2f1a73acf63ef91c9c6193f9ed +0 -0
  42. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/15/a8e468aacfcb440e090020f36d0b985d45da23 +0 -0
  43. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/1a/b4585881a6a42889f01aa0cfe25fd5acfaf46f +0 -0
  44. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/1c/3f92adda34344bcbbbf9d409c79855ae2aaea8 +0 -0
  45. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/1c/9314c5f69b9390068a2a8616875d974849d71f +0 -0
  46. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/1d/fe9d9633b24ea560354f4f93d39c6e5f163ea0 +0 -0
  47. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/20/72c28e83f4347959d29f7b3a6c1fc3e4ee6b59 +0 -0
  48. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/24/6b368b986f758630c46dc02b7fa512b53422f7 +0 -0
  49. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/25/b796accd261b9135fd32a2c00785f68edf6c46 +0 -0
  50. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/27/aa6074f652bc6f7078f8647489d9ee8e24f0e2 +0 -0
  51. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/28/c2969d785c1b892c2a96b3f00eba63a59811b3 +0 -0
  52. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/2a/ae95d517d213b660bf4f65a4e0cfae7bb893eb +0 -0
  53. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/2a/fdf45791a26d42ccead35ace76a8f0b2a56561 +0 -0
  54. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/30/a2f8da47ee947811dc8d993f5a06a45de374f4 +0 -0
  55. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/32/fd627b62fad7cf3b2f9e34ab9777126a0987ad +0 -0
  56. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/34/9e31b6a3634cea102ce5588b98c11cc1738605 +0 -0
  57. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/34/b6f3a2ee84f39bed4eee57f2c0e0afb994feb1 +0 -0
  58. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/35/1a5f491ab97eee9d1ee699478d75a8bb5d3dc2 +0 -0
  59. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/36/b4a1b7403abc6c360f8fe2cb656ab945254971 +0 -0
  60. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/36/e56a361f526eafa59c5235a5c990bf288b5f9c +0 -0
  61. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/36/ef43e50009e59db11812c258846d9e38718173 +0 -0
  62. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/39/7ead045fbbcfb17c62019eb18fe21ed05dbee5 +0 -0
  63. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/39/b13be65125556784e44c7a1d9821703c7ab67e +0 -0
  64. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/3b/507acc7f23391644cc0b824b1e79fd2677a362 +0 -0
  65. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/3b/bd972aa7ad680858f8dfbd0f7fcd97756f0d6f +0 -0
  66. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/3c/bbe5f4173d165127b9ad96119f1ec24c306ffc +0 -0
  67. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/3d/9d10d27724657a436c65a6254bfd213d4b3562 +0 -0
  68. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/3f/d6561300938afbb3d11976cf9c8f29549280d9 +0 -0
  69. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/41/dcf4b3bf0460946b2da93776cf9e836d62178f +0 -0
  70. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/43/dbd49b2ee367c5434dd545e3b5795434f2ef0b +0 -0
  71. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/45/b1b6178bacbfc997811a998b5cc60c1ea7fac8 +0 -0
  72. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/47/6cbd5a7c5e35cddef2f8a38bdc4896d403b095 +0 -0
  73. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/48/a88fc5806305d0bb0755ee6801161b79696972 +0 -0
  74. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/4f/7afb40dff2153d857fc85748c2eecb85125042 +0 -0
  75. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/50/08ddfcf53c02e82d7eee2e57c38e5672ef89f6 +0 -0
  76. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/53/e0deb1cb4c2c606bced6e7f9a66b0fda60980d +0 -0
  77. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/56/e4e8b2d5545e0256090f45aa8fc42c5fe067d0 +0 -0
  78. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/57/63d0c52f5c9c69e89d514a1f96034947abe21a +0 -0
  79. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/57/bd1c0199483ab316235b094543b85edec6c35e +0 -0
  80. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/58/20a729045d4dc7e37ccaf8aa8eec126850afe2 +0 -0
  81. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/59/380c4c26bdcd4d9b71ae3e2e35f05b3f26c5ab +0 -0
  82. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/5a/192565abf89c9d765af846ce6d53a92b1ce7ad +0 -0
  83. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/60/f273eb1c412d916fa3f11318a7da7a9911b52a +0 -0
  84. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/61/570cec8c061abe74121f27f5face6c69b98f99 +0 -0
  85. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/62/4488173ed2c8936fa5cea3cf5dd3f26a30b86e +0 -0
  86. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/62/7c81b23b4e56e87b042b650b0103653cc9e34a +0 -0
  87. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/62/d90ccf8cbefdc2e4fd475e7c6f4f76e9fdf801 +0 -0
  88. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/63/100154b27846e8010e55b6bf4b3d7762c14c5f +0 -0
  89. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/64/27a4edff08f93d98f511418423f09f2ab90bcd +0 -0
  90. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/66/6227eeeba24073e63811e89f1449f3d958f183 +0 -0
  91. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/66/c998778721d424bd0aae80602dabbffa93af2e +0 -0
  92. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/68/6df3072c8b025fb18106ed2df505994ad062a9 +0 -0
  93. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/69/13c452ca319f7cbf6a0836dc10a5bb033c84e4 +0 -0
  94. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/6a/52e747a2b349b128d1490d9e896d2323818eb7 +0 -0
  95. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/6b/7fde264d93a7a0986d394c46c7650d0ce2ab92 +0 -0
  96. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/6c/cebb29b7f3f5b0c889f6dadbf9ff066554587d +0 -0
  97. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/6d/c2cdf4a84e538e5d4777486aeff87e42f41799 +0 -0
  98. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/6d/ee29dbdcc84edeeacede105110446f3ccac963 +0 -0
  99. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/71/36b2074a2754be8b58127d82250e5b37e3c373 +0 -0
  100. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/72/245a05b0966011cb381e6b32b0465000e969ab +0 -0
  101. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/72/e4179337639859678ddaecf38b16f33aaec8e1 +0 -0
  102. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/78/063f4c863fc371ec0313303c0a81283b35d9b6 +0 -0
  103. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/78/3d4167bc95c9d2175e0df03ef1c1c880ba75ab +0 -0
  104. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/79/7ae089b2212a937840e215276005ce76881307 +0 -0
  105. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/7e/5956c806b5edc344d46dab599dec337891ba1f +0 -0
  106. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/81/8f26b7bf042269729020cf944fc362d66ba27e +0 -0
  107. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/82/70b319ce4046854fbe7dc41054b6c2d112dab2 +0 -0
  108. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/84/59071b722a255b774a80b27746033f8141ab39 +0 -0
  109. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/85/aee46f478e9afdb84d50a05242c53b04ed2e21 +0 -0
  110. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/86/e288b46f8fe179907e4413f665aeb5053fddb1 +0 -0
  111. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/87/ef1fc3f7f1ddc4d0ab9b3e65381ce9f3388621 +0 -0
  112. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/8b/84f56978e1de8f2ae82abce5f8b3e182d365cd +0 -0
  113. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/8e/55a7d2b96184030211f20c9b9af201eefcac82 +0 -0
  114. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/91/c69ad88fe0ba94aa7859fb5f7edac5e6f1a3f7 +0 -0
  115. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/94/74152b4b463d70ae5ad07f0c658be3e296026b +0 -0
  116. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/94/f7dbe88e80c4205a901b71eb8f181974376bba +0 -0
  117. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/97/1aef09ea939f46b60b9646f8d524c78a9220f4 +0 -0
  118. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/9b/ec5ee2236ee2d5532c36bfd132e23c58fdb69c +0 -0
  119. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/9d/0df52899fe95279059286d9c0ec42287edc168 +0 -0
  120. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/a1/5389729850729fc7bd78a54f26fce77f30be12 +0 -0
  121. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/a1/906da89d1174f74867800c74c43af36253bd5e +0 -0
  122. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/a4/63fdd23e5efd713db8a71f316f3a1c7bd60916 +0 -0
  123. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/a5/ec8f74642fbba27f7ea78c53b372ae0c7dedce +0 -0
  124. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/a7/3e13eafee65c5b8d73ad2d3ea46d0eee82f0d3 +0 -0
  125. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/b0/56be4be89ba6b76949dd641df45bb7036050c8 +0 -0
  126. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/b0/9cd7856d58590578ee1a4f3ad45d1310a97f87 +0 -0
  127. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/b2/18e6a0f0f1c4df8cdefa9852058348abc713b7 +0 -0
  128. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/b3/4f7f271c6d6105e35a6556ffda71d03afe8c96 +0 -0
  129. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/b3/69579064bde9de9a19d114fc33e4e48cc8c0e4 +0 -0
  130. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/b5/61831c7dce8ea51e7ee6b6fa35745f14d8242d +0 -0
  131. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/b7/2c9e75ab7d0afe594664650aa8f6c772f5ac64 +0 -0
  132. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/bb/81ccc0513f18fc160b54a82861e9a80d23f4f6 +0 -0
  133. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/bb/934eb33bc1a8b85630bf680caffd99560c1b8f +0 -0
  134. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/bf/67907e337021ebff434e02b19b30a741c144af +0 -0
  135. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/bf/b54d65922ce1dfda1aaa014913a54e7172d0bc +0 -0
  136. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/c1/20fc812b9ad311c34a3608512d6a9d976bb48e +0 -0
  137. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/c1/397c6ed72c4e20ef6b9ab83163e9a6baba5b45 +0 -0
  138. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/c4/cba65f1163661999ee4b8ed23342b63bc1300c +0 -0
  139. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/c6/7f17e5707313600efcb85e9a3fedea35dba591 +0 -0
  140. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/c6/f32aced880bd165a251cb52b26b0c1107e2141 +0 -0
  141. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/cc/45df1d317a2eb63ff1ff3a5f3b4a9f98fd92b5 +0 -0
  142. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/cd/822b3574a88ebdd1ed82fd6983f37e626d52b4 +0 -0
  143. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/cf/0c0d9c6fb09473aaeb7f7e2edbd770c3f2ef3d +0 -0
  144. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/d2/992df305f4b56a466a2f221aeb182ddd20f418 +0 -0
  145. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/d6/39e8af592cd75a318d8affddd1bcc70c2095f2 +0 -0
  146. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/d6/9ab1c4aadf279936dd778e8346ba60f74705b6 +0 -0
  147. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/d8/4688b54c0040a30976b3a6540bc47adf7ce680 +0 -0
  148. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/d9/005f2cc7fc4e65f14ed5518276007c08cf2fd0 +0 -0
  149. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/d9/c2403fd166ce791b4e9d0c6792ed8342c71fcd +0 -0
  150. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/d9/dfa5aee51e92a541b707e8e7baea6f06deff98 +0 -0
  151. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/db/141dbaa93594df2a8156182f361ee4db829359 +0 -0
  152. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/db/3f2cd643292057936230b95cf7ec3046affe11 +0 -0
  153. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/db/ffa8ea7bda721d0cee7b9e4ce5b2ef927733ff +0 -0
  154. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/dc/c2bdbafb3296e09d9ee4955cfa55d275825f94 +0 -0
  155. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/dc/cdbd4266765d840be2ae35ab1752a0fa312c16 +0 -0
  156. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/dd/87fb5f606fe380d81e6fe3a2c98f9f99e3e09b +0 -0
  157. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/de/214c626ac2dd2685bfaa0bc0fc20f528d014d7 +0 -0
  158. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/df/e0770424b2a19faf507a501ebfc23be8f54e7b +0 -0
  159. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/e2/f2f8f4c25e62a297fc55f36acc6b01cfbab76f +0 -0
  160. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/e3/1356f90ea6dd0577b5e0b40b206319adcbf085 +0 -0
  161. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/e3/5a4dafc50850cacac7bf76c56db2715cbda2c4 +0 -0
  162. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/e4/6c715352db9fe3c887a635f1916df4ca1f4ff9 +0 -0
  163. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/e5/0580a0bd1e1b3d29f834382b80fceb61d5cf0c +0 -0
  164. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/e9/391ffe371f1cc43b42ef09b705d9c767c2e14f +0 -0
  165. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/ea/3a18cc75e53792744ef754e05d3f4481768c13 +0 -0
  166. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/ec/40fd8bf8e4c342534a9fc020289e402ba6bc9d +0 -0
  167. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/ec/d980279432b13f0374b90ca439a6329cdece0f +0 -0
  168. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/ee/cee64eacaff022dcdc509c0c2b1da492f21060 +0 -0
  169. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/f1/e50757fddc28b445545dc7e2759b54cdd0f42e +0 -0
  170. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/f4/b64d3107b39e3ad6f540c6607004ea34e6c024 +0 -0
  171. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/f4/ba7f815b886797b73fede071d86e0c134d2bc7 +0 -0
  172. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/f5/61c3c1bf1c9ea9c9d1f556a7be2869f71f3bdf +0 -0
  173. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/f6/44a8ff56fa035105fc517cbb1ac46c3d8e349a +0 -0
  174. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/f7/c98ba5c2f903e603b1f5e63d49fbc8a43815cc +0 -0
  175. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/f9/045a08e96eb76848fc4d68e3e3e687cca39a2d +0 -0
  176. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/fa/147e6bb78a2e8db241d231295fd7f1ed061af8 +0 -0
  177. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/objects/fc/292e793ecfd42240ac43be407023bd731fa9e7 +0 -0
  178. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/refs/.DS_Store +0 -0
  179. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/refs/heads/main +0 -0
  180. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/refs/remotes/origin/HEAD +0 -0
  181. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.git/refs/remotes/origin/main +0 -0
  182. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.gitattributes +0 -0
  183. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/.gitignore +0 -0
  184. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/LICENSE +0 -0
  185. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/README.md +0 -0
  186. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/__init__.py +0 -0
  187. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/batman.py +0 -0
  188. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/bio.py +0 -0
  189. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/brain_atlas.py +0 -0
  190. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/chat.py +0 -0
  191. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/correlators.py +0 -0
  192. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/.DS_Store +0 -0
  193. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/db2ls_sql_chtsht.json +0 -0
  194. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/docs_links.json +0 -0
  195. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/email/email_html_template.html +0 -0
  196. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/lang_code_iso639.json +0 -0
  197. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/mygenes_fields_241022.txt +0 -0
  198. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/sns_info.json +0 -0
  199. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/.DS_Store +0 -0
  200. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style1.pdf +0 -0
  201. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style2.pdf +0 -0
  202. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style3.pdf +0 -0
  203. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style4.pdf +0 -0
  204. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style5.pdf +0 -0
  205. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style6.pdf +0 -0
  206. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style7.pdf +0 -0
  207. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style8.pdf +0 -0
  208. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/example/style9.pdf +0 -0
  209. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style1.json +0 -0
  210. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style10.json +0 -0
  211. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style11.json +0 -0
  212. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style12.json +0 -0
  213. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style2.json +0 -0
  214. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style3.json +0 -0
  215. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style4.json +0 -0
  216. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style5.json +0 -0
  217. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style6.json +0 -0
  218. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style7.json +0 -0
  219. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style8.json +0 -0
  220. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/style9.json +0 -0
  221. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/.DS_Store +0 -0
  222. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/grid.mplstyle +0 -0
  223. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/high-contrast.mplstyle +0 -0
  224. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/high-vis.mplstyle +0 -0
  225. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/ieee.mplstyle +0 -0
  226. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/light.mplstyl +0 -0
  227. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/muted.mplstyle +0 -0
  228. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/nature-reviews-latex.mplstyle +0 -0
  229. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/nature-reviews.mplstyle +0 -0
  230. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/nature.mplstyle +0 -0
  231. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/no-latex.mplstyle +0 -0
  232. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/notebook.mplstyle +0 -0
  233. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/paper.mplstyle +0 -0
  234. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/retro.mplstyle +0 -0
  235. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/sans.mplstyle +0 -0
  236. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/scatter.mplstyle +0 -0
  237. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/science.mplstyle +0 -0
  238. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/std-colors.mplstyle +0 -0
  239. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/styles/stylelib/vibrant.mplstyle +0 -0
  240. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/usages_pd copy.json +0 -0
  241. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/usages_pd.json +0 -0
  242. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/data/usages_sns.json +0 -0
  243. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/db2ls.py +0 -0
  244. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/doc.py +0 -0
  245. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/export_requirements.py +0 -0
  246. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/fetch_update.py +0 -0
  247. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/freqanalysis.py +0 -0
  248. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/ich2ls.py +0 -0
  249. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/mol.py +0 -0
  250. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/netfinder.py +0 -0
  251. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/ocr.py +0 -0
  252. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/setuptools-70.1.0-py3-none-any.whl +0 -0
  253. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/sleep_events_detectors.py +0 -0
  254. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/stats.py +0 -0
  255. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/translator.py +0 -0
  256. {py2ls-0.2.4.24 → py2ls-0.2.4.25}/py2ls/wb_detector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py2ls
3
- Version: 0.2.4.24
3
+ Version: 0.2.4.25
4
4
  Summary: py(thon)2(too)ls
5
5
  Author: Jianfeng
6
6
  Author-email: Jianfeng.Liu0413@gmail.com
@@ -0,0 +1,61 @@
1
+ def get_trend(
2
+ keywords: list = None, # ["AI", "Python", "Data Science"]
3
+ timezone: str = "Europe/Berlin", # minutes differ from UTC
4
+ cat=0,
5
+ timeframe="today 12-m",
6
+ geo="DE",
7
+ gprop="",
8
+ **kwargs
9
+ ):
10
+ from pytrends.request import TrendReq
11
+ from pytrends.exceptions import TooManyRequestsError
12
+ import pytz
13
+ from datetime import datetime
14
+ import time
15
+ import requests
16
+ from urllib3.util.retry import Retry
17
+
18
+ if isinstance(timezone, str):
19
+ stadt = pytz.timezone(timezone)
20
+ current_time = datetime.now(stadt) # This will be timezone-aware
21
+ # Convert the timezone-aware datetime to naive UTC datetime
22
+ naive_time = current_time.astimezone(pytz.utc).replace(tzinfo=None)
23
+ tz_offset = stadt.utcoffset(naive_time).seconds // 60 # in minutes
24
+ elif isinstance(timezone, int):
25
+ tz_offset = timezone
26
+
27
+ # Initialize TrendReq with correct timezone offset
28
+ pytrends = TrendReq(hl="en-US", tz=tz_offset )
29
+
30
+ # Ensure that keywords are in list form
31
+ if isinstance(keywords, str):
32
+ keywords = [keywords]
33
+
34
+ pytrends.build_payload(keywords, cat=cat, timeframe=timeframe, geo=geo, gprop=gprop)
35
+
36
+ res = {}
37
+ # Try fetching data with error handling
38
+ for func_name, fetch_func in [
39
+ ("interest_over_time", pytrends.interest_over_time),
40
+ ("related_topics", pytrends.related_topics),
41
+ ("related_queries", pytrends.related_queries),
42
+ ("categories", pytrends.categories)
43
+ ]:
44
+ try:
45
+ print(f"Fetching {func_name}...")
46
+ res[func_name] = fetch_func()
47
+ print(f"done: {func_name}")
48
+ except TooManyRequestsError:
49
+ print(f"Too many requests error for {func_name}. Retrying...")
50
+ time.sleep(5) # Delay to avoid spamming the server
51
+ if retries > 0:
52
+ return get_trend(keywords, timezone, cat, timeframe, geo, gprop, retries=retries-1)
53
+ res[func_name] = None
54
+ except requests.exceptions.RequestException as e:
55
+ print(f"Request error for {func_name}: {e}")
56
+ res[func_name] = None
57
+ except Exception as e:
58
+ print(f"Error fetching {func_name}: {e}")
59
+ res[func_name] = None
60
+
61
+ return res
@@ -18,15 +18,17 @@ warnings.simplefilter("ignore", category=pd.errors.SettingWithCopyWarning)
18
18
  warnings.filterwarnings("ignore", category=pd.errors.PerformanceWarning)
19
19
 
20
20
 
21
- def run_once_within(duration=60): # default 60s
21
+ def run_once_within(duration=60,reverse=False): # default 60s
22
22
  import time
23
23
 
24
24
  """
25
+ 如果reverse is True, 则在第一次运行时并不运行.但是在第二次运行时则运行
25
26
  usage:
26
27
  if run_once_within():
27
28
  print("This code runs once per minute.")
28
29
  else:
29
30
  print("The code has already been run in the last minute.")
31
+
30
32
  """
31
33
  if not hasattr(run_once_within, "time_last"):
32
34
  run_once_within.time_last = None
@@ -36,9 +38,9 @@ def run_once_within(duration=60): # default 60s
36
38
  time_curr - run_once_within.time_last >= duration
37
39
  ):
38
40
  run_once_within.time_last = time_curr # Update the last execution time
39
- return True
41
+ return False if reverse else True
40
42
  else:
41
- return False
43
+ return True if reverse else False
42
44
 
43
45
 
44
46
  def plt_font(dir_font: str = "/System/Library/Fonts/Hiragino Sans GB.ttc"):
@@ -3497,12 +3499,8 @@ def figsave(*args, dpi=300):
3497
3499
  )
3498
3500
  else:
3499
3501
  plt.savefig(
3500
- fname, format=ftype.lower(), dpi=dpi, bbox_inches="tight", pad_inches=0
3501
- )
3502
- # elif ftype.lower() == "png":
3503
- # plt.savefig(fname, format="png", dpi=dpi, bbox_inches="tight", transparent=True,pad_inches=0)
3504
- # elif ftype.lower() in ["tiff", "tif"]:
3505
- # plt.savefig(fname, format="tiff", dpi=dpi, bbox_inches="tight",pad_inches=0)
3502
+ fname, format=ftype.lower(), dpi=dpi, bbox_inches="tight", transparent=True,pad_inches=0
3503
+ )
3506
3504
  elif ftype.lower() == "emf":
3507
3505
  plt.savefig(fname, format="emf", dpi=dpi, bbox_inches="tight", pad_inches=0)
3508
3506
  elif ftype.lower() == "fig":
@@ -5230,16 +5228,16 @@ def df_extend(data: pd.DataFrame, column, axis=0, sep=None, prefix="col"):
5230
5228
  data = data.explode(column, ignore_index=True)
5231
5229
  return data
5232
5230
 
5233
- def df_circular(data: pd.DataFrame, columns=None, max_val=None, inplace=False):
5231
+ def df_cycle(data: pd.DataFrame, columns=None, max_val=None, inplace=False):
5234
5232
  """
5235
5233
  Purpose: transforms a datetime feature (like month or day) into a cyclic encoding for use in machine learning models, particularly neural networks.
5236
5234
  Usage:
5237
5235
  data = pd.DataFrame({'month': [1, 4, 7, 10, 12]}) # Just months as an example
5238
- # df_circular month cyclically
5239
- data = df_circular(data, 'month', 12)
5236
+ # df_cycle month cyclically
5237
+ data = df_cycle(data, 'month', 12)
5240
5238
  """
5241
5239
  if columns is None:
5242
- columns = list(data.columns) # If no columns specified, use all columns
5240
+ columns = list(data.select_dtypes(include=np.number).columns) # If no columns specified, use all columns
5243
5241
  if max_val is None:
5244
5242
  max_val = np.max(data[columns]) # If no max_val specified, use the maximum value across all columns
5245
5243
  if isinstance(columns, str):
@@ -5424,7 +5422,7 @@ def df_astype(
5424
5422
  # print(f"Successfully converted '{column}' to timedelta.")
5425
5423
  elif astype == "circular":
5426
5424
  max_val = kwargs.get('max_val',None)
5427
- data[column]=df_circular(data=data,columns=column,max_val=max_val)
5425
+ data[column]=df_cycle(data=data,columns=column,max_val=max_val)
5428
5426
  else:
5429
5427
  # Convert to other types (e.g., float, int)
5430
5428
  if astype=='int':
@@ -5910,11 +5908,13 @@ def df_encoder(
5910
5908
 
5911
5909
  def df_scaler(
5912
5910
  data: pd.DataFrame, # should be numeric dtype
5911
+ scaler=None,
5913
5912
  method="standard",
5914
5913
  columns=None, # default, select all numeric col/row
5915
5914
  inplace=False,
5916
5915
  verbose=False, # show usage
5917
5916
  axis=0, # defalut column-wise
5917
+ return_scaler:bool=False,# True: return both: return df, scaler
5918
5918
  **kwargs,
5919
5919
  ):
5920
5920
  """
@@ -5932,31 +5932,49 @@ def df_scaler(
5932
5932
  """
5933
5933
  if verbose:
5934
5934
  print('df_scaler(data, scaler="standard", inplace=False, axis=0, verbose=True)')
5935
-
5936
- methods = ["standard", "minmax", "robust"]
5937
- method = strcmp(method, methods)[0]
5938
- if method == "standard":
5939
- from sklearn.preprocessing import StandardScaler
5940
-
5941
- scaler = StandardScaler(**kwargs)
5942
- elif method == "minmax":
5943
- from sklearn.preprocessing import MinMaxScaler
5944
-
5945
- scaler = MinMaxScaler(**kwargs)
5946
- elif method == "robust":
5947
- from sklearn.preprocessing import RobustScaler
5948
-
5949
- scaler = RobustScaler(**kwargs)
5950
- if axis not in [0, 1]:
5951
- raise ValueError("Axis must be 0 (column-wise) or 1 (row-wise).")
5952
-
5935
+ if scaler is None:
5936
+ methods = ["standard", "minmax", "robust","maxabs"]
5937
+ method = strcmp(method, methods)[0]
5938
+ if method == "standard":
5939
+ from sklearn.preprocessing import StandardScaler
5940
+ if verbose:
5941
+ print("performs z-score normalization: This will standardize each feature to have a mean of 0 and a standard deviation of 1.")
5942
+ print("Use when the data is approximately normally distributed (Gaussian).\nWorks well with algorithms sensitive to feature distribution, such as SVMs, linear regression, logistic regression, and neural networks.")
5943
+ scaler = StandardScaler(**kwargs)
5944
+ elif method == "minmax":
5945
+ from sklearn.preprocessing import MinMaxScaler
5946
+ if verbose:
5947
+ print("don't forget to define the range: e.g., 'feature_range=(0, 1)'. ")
5948
+ print("scales the features to the range [0, 1]. Adjust feature_range if you want a different range, like [-1, 1].")
5949
+ print("Use when the data does not follow a normal distribution and you need all features in a specific range (e.g., [0, 1]).\nIdeal for algorithms that do not assume a particular distribution, such as k-nearest neighbors and neural networks.")
5950
+ scaler = MinMaxScaler(**kwargs)
5951
+ elif method == "robust":
5952
+ from sklearn.preprocessing import RobustScaler
5953
+ if verbose:
5954
+ print("scales the data based on the median and interquartile range, which is robust to outliers.")
5955
+ print("Use when the dataset contains outliers.\nThis method is useful because it scales based on the median and the interquartile range (IQR), which are more robust to outliers than the mean and standard deviation.")
5956
+ scaler = RobustScaler(**kwargs)
5957
+ elif method=="maxabs":
5958
+ from sklearn.preprocessing import MaxAbsScaler
5959
+ if verbose:
5960
+ print("This scales each feature by its maximum absolute value, resulting in values within the range [-1, 1] for each feature.")
5961
+ print("Use for data that is already sparse or when features have positive or negative values that need scaling without shifting the data.\nOften used with sparse data (data with many zeros), where preserving zero entries is essential, such as in text data or recommendation systems.")
5962
+ scaler = MaxAbsScaler(**kwargs)
5963
+ if axis not in [0, 1]:
5964
+ raise ValueError("Axis must be 0 (column-wise) or 1 (row-wise).")
5965
+ if verbose:
5966
+ print(scaler)
5953
5967
  if axis == 0:
5954
5968
  # Column-wise scaling (default)
5955
5969
  if columns is None:
5956
5970
  columns = data.select_dtypes(include=np.number).columns.tolist()
5957
5971
  non_numeric_columns = data.columns.difference(columns)
5958
5972
 
5959
- scaled_data = scaler.fit_transform(data[columns])
5973
+ # scaled_data = scaler.fit_transform(data[columns])
5974
+ if scaler is None or not hasattr(scaler, 'mean_'):
5975
+ scaled_data = scaler.fit_transform(data[columns])
5976
+ else:
5977
+ scaled_data = scaler.transform(data[columns])
5960
5978
 
5961
5979
  if inplace:
5962
5980
  data[columns] = scaled_data
@@ -5970,7 +5988,10 @@ def df_scaler(
5970
5988
  axis=1,
5971
5989
  )
5972
5990
  scaled_df = scaled_df[data.columns] # Maintain column order
5973
- return scaled_df
5991
+ if return_scaler:
5992
+ return scaled_df,scaler
5993
+ else:
5994
+ return scaled_df
5974
5995
 
5975
5996
  elif axis == 1:
5976
5997
  # Row-wise scaling
@@ -5982,9 +6003,10 @@ def df_scaler(
5982
6003
 
5983
6004
  print(f"Scaling rows")
5984
6005
 
5985
- scaled_data = scaler.fit_transform(
5986
- numeric_rows.T
5987
- ).T # Transpose for scaling and then back
6006
+ # scaled_data = scaler.fit_transform(
6007
+ # numeric_rows.T
6008
+ # ).T # Transpose for scaling and then back
6009
+ scaled_data = scaler.fit_transform(numeric_rows.T).T if scaler is None or not hasattr(scaler, 'mean_') else scaler.transform(numeric_rows.T).T
5988
6010
 
5989
6011
  if inplace:
5990
6012
  data.loc[numeric_rows.index] = scaled_data
@@ -5992,7 +6014,10 @@ def df_scaler(
5992
6014
  else:
5993
6015
  scaled_df = data.copy()
5994
6016
  scaled_df.loc[numeric_rows.index] = scaled_data
5995
- return scaled_df
6017
+ if return_scaler:
6018
+ return scaled_df,scaler
6019
+ else:
6020
+ return scaled_df
5996
6021
 
5997
6022
 
5998
6023
  def df_special_characters_cleaner(
@@ -7590,21 +7615,18 @@ def df_qc(
7590
7615
  for warning in res_qc["warnings"]:
7591
7616
  print(" -", warning)
7592
7617
  if plot_:
7593
- df_qc_plots(data=data, res_qc=res_qc, max_cols=max_cols,hue=hue)
7594
- if dir_save:
7595
- try:
7596
- figsave(dir_save)
7597
- except Exception as e:
7598
- print(f"⚠️: {e}")
7599
- if output:
7618
+ df_qc_plots(data=data, res_qc=res_qc, max_cols=max_cols,hue=hue,dir_save=dir_save)
7619
+ if output or not plot_:
7600
7620
  return res_qc
7601
7621
  return None
7602
7622
 
7603
7623
 
7604
- def df_qc_plots(data: pd.DataFrame, columns=None,res_qc: dict=None, max_cols=20,hue=None):
7624
+ def df_qc_plots(data: pd.DataFrame, columns=None,res_qc: dict=None, max_cols=20,hue=None,dir_save=None):
7605
7625
  import matplotlib.pyplot as plt
7606
7626
  import seaborn as sns
7607
7627
  from .plot import subplot, figsets, get_color
7628
+ from datetime import datetime
7629
+ now_ = datetime.now().strftime("%y%m%d_%H%M%S")
7608
7630
 
7609
7631
  if columns is not None:
7610
7632
  if isinstance(columns, (list,pd.core.indexes.base.Index)):
@@ -7638,15 +7660,7 @@ def df_qc_plots(data: pd.DataFrame, columns=None,res_qc: dict=None, max_cols=20,
7638
7660
  ax=nexttile(),
7639
7661
  )
7640
7662
  figsets(ax=ax_outlier_num,title="Outliers (#)", xlabel="#",ylabel=None,fontsize=8 if len(outlier_num)<=20 else 6)
7641
-
7642
- #!
7643
- try:
7644
- if data.select_dtypes(include=np.number).shape[1]<=10:
7645
- for col in data.select_dtypes(include=np.number).columns:
7646
- sns.histplot(data[col], kde=True, bins=30, ax=nexttile())
7647
- figsets(title=f"Distribution: {col}", xlabel=col, ylabel="Frequency")
7648
- except:
7649
- pass
7663
+
7650
7664
  #!
7651
7665
  try:
7652
7666
  for col in data.select_dtypes(include='category').columns:
@@ -7857,7 +7871,43 @@ def df_qc_plots(data: pd.DataFrame, columns=None,res_qc: dict=None, max_cols=20,
7857
7871
  title="Correlation Heatmap",
7858
7872
  ax=ax_heatmap
7859
7873
  )
7874
+ # save figure
7875
+ if dir_save:
7876
+ figsave(dir_save,f"qc_plot_{now_}.pdf")
7860
7877
 
7878
+ if columns is not None:
7879
+ if isinstance(columns, (list,pd.core.indexes.base.Index)):
7880
+ data=data[columns]
7881
+ len_total = len(res_qc)
7882
+ n_row, n_col = int((len_total + 10) / 3), 3
7883
+ nexttile = subplot(n_row, n_col, figsize=[5 * n_col, 5 * n_row],verbose=False)
7884
+ #! check distribution
7885
+ data_num = data.select_dtypes(include=np.number)
7886
+ if len(data_num) > max_cols:
7887
+ data_num = data_num.iloc[:,:max_cols]
7888
+
7889
+ data_num = df_scaler(data=data_num, method='standard')
7890
+
7891
+ import scipy.stats as stats
7892
+ for column in data_num.columns:
7893
+ #* Shapiro-Wilk test for normality
7894
+ stat, p_value = stats.shapiro(data_num[column])
7895
+ normality = "norm" if p_value > 0.05 else "not_norm"
7896
+ #* Plot histogram
7897
+ ax_hist=sns.histplot(data_num[column], kde=True, ax=nexttile())
7898
+ x_min, x_max = ax_hist.get_xlim()
7899
+ y_min, y_max = ax_hist.get_ylim()
7900
+ ax_hist.text(x_min+(x_max-x_min)*0.5, y_min+(y_max-y_min)*0.75,
7901
+ f'p(Shapiro-Wilk)={p_value:.3f}\n{normality}',
7902
+ ha='center', va='top')
7903
+ figsets(title=column,ax=ax_hist)
7904
+ ax_twin=ax_hist.twinx()
7905
+ #* Q-Q plot
7906
+ stats.probplot(data_num[column], dist="norm", plot=ax_twin)
7907
+ figsets(ylabel=f'Q-Q Plot:{column}',title=None)
7908
+ # save figure
7909
+ if dir_save:
7910
+ figsave(dir_save,f"qq_plot_{now_}.pdf")
7861
7911
  def use_pd(
7862
7912
  func_name="excel",
7863
7913
  verbose=True,