py2ls 0.2.4.6__tar.gz → 0.2.4.7__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 (230) hide show
  1. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/PKG-INFO +1 -1
  2. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/bio.py +22 -5
  3. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/ips.py +149 -60
  4. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/plot.py +12 -32
  5. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/pyproject.toml +1 -1
  6. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/README.md +0 -0
  7. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.DS_Store +0 -0
  8. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/COMMIT_EDITMSG +0 -0
  9. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/FETCH_HEAD +0 -0
  10. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/HEAD +0 -0
  11. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/config +0 -0
  12. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/description +0 -0
  13. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/applypatch-msg.sample +0 -0
  14. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/commit-msg.sample +0 -0
  15. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/fsmonitor-watchman.sample +0 -0
  16. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/post-update.sample +0 -0
  17. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/pre-applypatch.sample +0 -0
  18. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/pre-commit.sample +0 -0
  19. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/pre-merge-commit.sample +0 -0
  20. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/pre-push.sample +0 -0
  21. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/pre-rebase.sample +0 -0
  22. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/pre-receive.sample +0 -0
  23. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/prepare-commit-msg.sample +0 -0
  24. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/push-to-checkout.sample +0 -0
  25. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/hooks/update.sample +0 -0
  26. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/index +0 -0
  27. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/info/exclude +0 -0
  28. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/logs/HEAD +0 -0
  29. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/logs/refs/heads/main +0 -0
  30. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/logs/refs/remotes/origin/HEAD +0 -0
  31. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/logs/refs/remotes/origin/main +0 -0
  32. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/01/d5bd8065e6860c0bd23ff9fa57161806a099e1 +0 -0
  33. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/09/08da26de58c114225ad81f484b80bf5d351b34 +0 -0
  34. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/0b/409e1bc918277010f5679b402d1d1dda53e15c +0 -0
  35. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/12/c2808a1b3a4d0892a4154dfba1e2ae3770fa73 +0 -0
  36. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/14/449a0e6ba4ea2f1a73acf63ef91c9c6193f9ed +0 -0
  37. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/15/a8e468aacfcb440e090020f36d0b985d45da23 +0 -0
  38. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/1a/b4585881a6a42889f01aa0cfe25fd5acfaf46f +0 -0
  39. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/1c/3f92adda34344bcbbbf9d409c79855ae2aaea8 +0 -0
  40. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/1c/9314c5f69b9390068a2a8616875d974849d71f +0 -0
  41. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/1d/fe9d9633b24ea560354f4f93d39c6e5f163ea0 +0 -0
  42. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/20/72c28e83f4347959d29f7b3a6c1fc3e4ee6b59 +0 -0
  43. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/24/6b368b986f758630c46dc02b7fa512b53422f7 +0 -0
  44. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/25/b796accd261b9135fd32a2c00785f68edf6c46 +0 -0
  45. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/27/aa6074f652bc6f7078f8647489d9ee8e24f0e2 +0 -0
  46. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/28/c2969d785c1b892c2a96b3f00eba63a59811b3 +0 -0
  47. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/2a/ae95d517d213b660bf4f65a4e0cfae7bb893eb +0 -0
  48. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/2a/fdf45791a26d42ccead35ace76a8f0b2a56561 +0 -0
  49. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/30/a2f8da47ee947811dc8d993f5a06a45de374f4 +0 -0
  50. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/32/fd627b62fad7cf3b2f9e34ab9777126a0987ad +0 -0
  51. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/34/9e31b6a3634cea102ce5588b98c11cc1738605 +0 -0
  52. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/34/b6f3a2ee84f39bed4eee57f2c0e0afb994feb1 +0 -0
  53. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/35/1a5f491ab97eee9d1ee699478d75a8bb5d3dc2 +0 -0
  54. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/36/b4a1b7403abc6c360f8fe2cb656ab945254971 +0 -0
  55. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/36/e56a361f526eafa59c5235a5c990bf288b5f9c +0 -0
  56. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/36/ef43e50009e59db11812c258846d9e38718173 +0 -0
  57. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/39/7ead045fbbcfb17c62019eb18fe21ed05dbee5 +0 -0
  58. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/39/b13be65125556784e44c7a1d9821703c7ab67e +0 -0
  59. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/3b/507acc7f23391644cc0b824b1e79fd2677a362 +0 -0
  60. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/3b/bd972aa7ad680858f8dfbd0f7fcd97756f0d6f +0 -0
  61. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/3c/bbe5f4173d165127b9ad96119f1ec24c306ffc +0 -0
  62. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/3d/9d10d27724657a436c65a6254bfd213d4b3562 +0 -0
  63. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/3f/d6561300938afbb3d11976cf9c8f29549280d9 +0 -0
  64. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/41/dcf4b3bf0460946b2da93776cf9e836d62178f +0 -0
  65. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/43/dbd49b2ee367c5434dd545e3b5795434f2ef0b +0 -0
  66. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/45/b1b6178bacbfc997811a998b5cc60c1ea7fac8 +0 -0
  67. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/47/6cbd5a7c5e35cddef2f8a38bdc4896d403b095 +0 -0
  68. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/48/a88fc5806305d0bb0755ee6801161b79696972 +0 -0
  69. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/4f/7afb40dff2153d857fc85748c2eecb85125042 +0 -0
  70. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/50/08ddfcf53c02e82d7eee2e57c38e5672ef89f6 +0 -0
  71. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/53/e0deb1cb4c2c606bced6e7f9a66b0fda60980d +0 -0
  72. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/56/e4e8b2d5545e0256090f45aa8fc42c5fe067d0 +0 -0
  73. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/57/63d0c52f5c9c69e89d514a1f96034947abe21a +0 -0
  74. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/57/bd1c0199483ab316235b094543b85edec6c35e +0 -0
  75. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/58/20a729045d4dc7e37ccaf8aa8eec126850afe2 +0 -0
  76. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/59/380c4c26bdcd4d9b71ae3e2e35f05b3f26c5ab +0 -0
  77. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/5a/192565abf89c9d765af846ce6d53a92b1ce7ad +0 -0
  78. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/60/f273eb1c412d916fa3f11318a7da7a9911b52a +0 -0
  79. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/61/570cec8c061abe74121f27f5face6c69b98f99 +0 -0
  80. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/62/4488173ed2c8936fa5cea3cf5dd3f26a30b86e +0 -0
  81. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/62/7c81b23b4e56e87b042b650b0103653cc9e34a +0 -0
  82. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/62/d90ccf8cbefdc2e4fd475e7c6f4f76e9fdf801 +0 -0
  83. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/63/100154b27846e8010e55b6bf4b3d7762c14c5f +0 -0
  84. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/64/27a4edff08f93d98f511418423f09f2ab90bcd +0 -0
  85. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/66/6227eeeba24073e63811e89f1449f3d958f183 +0 -0
  86. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/66/c998778721d424bd0aae80602dabbffa93af2e +0 -0
  87. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/68/6df3072c8b025fb18106ed2df505994ad062a9 +0 -0
  88. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/69/13c452ca319f7cbf6a0836dc10a5bb033c84e4 +0 -0
  89. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/6a/52e747a2b349b128d1490d9e896d2323818eb7 +0 -0
  90. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/6b/7fde264d93a7a0986d394c46c7650d0ce2ab92 +0 -0
  91. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/6c/cebb29b7f3f5b0c889f6dadbf9ff066554587d +0 -0
  92. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/6d/c2cdf4a84e538e5d4777486aeff87e42f41799 +0 -0
  93. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/6d/ee29dbdcc84edeeacede105110446f3ccac963 +0 -0
  94. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/71/36b2074a2754be8b58127d82250e5b37e3c373 +0 -0
  95. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/72/245a05b0966011cb381e6b32b0465000e969ab +0 -0
  96. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/72/e4179337639859678ddaecf38b16f33aaec8e1 +0 -0
  97. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/78/063f4c863fc371ec0313303c0a81283b35d9b6 +0 -0
  98. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/78/3d4167bc95c9d2175e0df03ef1c1c880ba75ab +0 -0
  99. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/79/7ae089b2212a937840e215276005ce76881307 +0 -0
  100. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/7e/5956c806b5edc344d46dab599dec337891ba1f +0 -0
  101. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/81/8f26b7bf042269729020cf944fc362d66ba27e +0 -0
  102. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/82/70b319ce4046854fbe7dc41054b6c2d112dab2 +0 -0
  103. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/84/59071b722a255b774a80b27746033f8141ab39 +0 -0
  104. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/85/aee46f478e9afdb84d50a05242c53b04ed2e21 +0 -0
  105. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/86/e288b46f8fe179907e4413f665aeb5053fddb1 +0 -0
  106. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/87/ef1fc3f7f1ddc4d0ab9b3e65381ce9f3388621 +0 -0
  107. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/8b/84f56978e1de8f2ae82abce5f8b3e182d365cd +0 -0
  108. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/8e/55a7d2b96184030211f20c9b9af201eefcac82 +0 -0
  109. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/91/c69ad88fe0ba94aa7859fb5f7edac5e6f1a3f7 +0 -0
  110. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/94/74152b4b463d70ae5ad07f0c658be3e296026b +0 -0
  111. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/94/f7dbe88e80c4205a901b71eb8f181974376bba +0 -0
  112. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/97/1aef09ea939f46b60b9646f8d524c78a9220f4 +0 -0
  113. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/9b/ec5ee2236ee2d5532c36bfd132e23c58fdb69c +0 -0
  114. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/9d/0df52899fe95279059286d9c0ec42287edc168 +0 -0
  115. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/a1/5389729850729fc7bd78a54f26fce77f30be12 +0 -0
  116. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/a1/906da89d1174f74867800c74c43af36253bd5e +0 -0
  117. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/a4/63fdd23e5efd713db8a71f316f3a1c7bd60916 +0 -0
  118. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/a5/ec8f74642fbba27f7ea78c53b372ae0c7dedce +0 -0
  119. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/a7/3e13eafee65c5b8d73ad2d3ea46d0eee82f0d3 +0 -0
  120. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/b0/56be4be89ba6b76949dd641df45bb7036050c8 +0 -0
  121. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/b0/9cd7856d58590578ee1a4f3ad45d1310a97f87 +0 -0
  122. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/b2/18e6a0f0f1c4df8cdefa9852058348abc713b7 +0 -0
  123. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/b3/4f7f271c6d6105e35a6556ffda71d03afe8c96 +0 -0
  124. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/b3/69579064bde9de9a19d114fc33e4e48cc8c0e4 +0 -0
  125. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/b5/61831c7dce8ea51e7ee6b6fa35745f14d8242d +0 -0
  126. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/b7/2c9e75ab7d0afe594664650aa8f6c772f5ac64 +0 -0
  127. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/bb/81ccc0513f18fc160b54a82861e9a80d23f4f6 +0 -0
  128. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/bb/934eb33bc1a8b85630bf680caffd99560c1b8f +0 -0
  129. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/bf/67907e337021ebff434e02b19b30a741c144af +0 -0
  130. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/bf/b54d65922ce1dfda1aaa014913a54e7172d0bc +0 -0
  131. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/c1/20fc812b9ad311c34a3608512d6a9d976bb48e +0 -0
  132. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/c1/397c6ed72c4e20ef6b9ab83163e9a6baba5b45 +0 -0
  133. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/c4/cba65f1163661999ee4b8ed23342b63bc1300c +0 -0
  134. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/c6/7f17e5707313600efcb85e9a3fedea35dba591 +0 -0
  135. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/c6/f32aced880bd165a251cb52b26b0c1107e2141 +0 -0
  136. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/cc/45df1d317a2eb63ff1ff3a5f3b4a9f98fd92b5 +0 -0
  137. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/cd/822b3574a88ebdd1ed82fd6983f37e626d52b4 +0 -0
  138. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/cf/0c0d9c6fb09473aaeb7f7e2edbd770c3f2ef3d +0 -0
  139. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/d2/992df305f4b56a466a2f221aeb182ddd20f418 +0 -0
  140. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/d6/39e8af592cd75a318d8affddd1bcc70c2095f2 +0 -0
  141. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/d6/9ab1c4aadf279936dd778e8346ba60f74705b6 +0 -0
  142. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/d8/4688b54c0040a30976b3a6540bc47adf7ce680 +0 -0
  143. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/d9/005f2cc7fc4e65f14ed5518276007c08cf2fd0 +0 -0
  144. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/d9/c2403fd166ce791b4e9d0c6792ed8342c71fcd +0 -0
  145. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/d9/dfa5aee51e92a541b707e8e7baea6f06deff98 +0 -0
  146. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/db/141dbaa93594df2a8156182f361ee4db829359 +0 -0
  147. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/db/3f2cd643292057936230b95cf7ec3046affe11 +0 -0
  148. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/db/ffa8ea7bda721d0cee7b9e4ce5b2ef927733ff +0 -0
  149. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/dc/c2bdbafb3296e09d9ee4955cfa55d275825f94 +0 -0
  150. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/dc/cdbd4266765d840be2ae35ab1752a0fa312c16 +0 -0
  151. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/dd/87fb5f606fe380d81e6fe3a2c98f9f99e3e09b +0 -0
  152. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/de/214c626ac2dd2685bfaa0bc0fc20f528d014d7 +0 -0
  153. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/df/e0770424b2a19faf507a501ebfc23be8f54e7b +0 -0
  154. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/e2/f2f8f4c25e62a297fc55f36acc6b01cfbab76f +0 -0
  155. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/e3/1356f90ea6dd0577b5e0b40b206319adcbf085 +0 -0
  156. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/e3/5a4dafc50850cacac7bf76c56db2715cbda2c4 +0 -0
  157. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/e4/6c715352db9fe3c887a635f1916df4ca1f4ff9 +0 -0
  158. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/e5/0580a0bd1e1b3d29f834382b80fceb61d5cf0c +0 -0
  159. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/e9/391ffe371f1cc43b42ef09b705d9c767c2e14f +0 -0
  160. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/ea/3a18cc75e53792744ef754e05d3f4481768c13 +0 -0
  161. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/ec/40fd8bf8e4c342534a9fc020289e402ba6bc9d +0 -0
  162. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/ec/d980279432b13f0374b90ca439a6329cdece0f +0 -0
  163. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/ee/cee64eacaff022dcdc509c0c2b1da492f21060 +0 -0
  164. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/f1/e50757fddc28b445545dc7e2759b54cdd0f42e +0 -0
  165. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/f4/b64d3107b39e3ad6f540c6607004ea34e6c024 +0 -0
  166. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/f4/ba7f815b886797b73fede071d86e0c134d2bc7 +0 -0
  167. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/f5/61c3c1bf1c9ea9c9d1f556a7be2869f71f3bdf +0 -0
  168. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/f6/44a8ff56fa035105fc517cbb1ac46c3d8e349a +0 -0
  169. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/f7/c98ba5c2f903e603b1f5e63d49fbc8a43815cc +0 -0
  170. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/f9/045a08e96eb76848fc4d68e3e3e687cca39a2d +0 -0
  171. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/fa/147e6bb78a2e8db241d231295fd7f1ed061af8 +0 -0
  172. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/objects/fc/292e793ecfd42240ac43be407023bd731fa9e7 +0 -0
  173. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/refs/heads/main +0 -0
  174. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/refs/remotes/origin/HEAD +0 -0
  175. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.git/refs/remotes/origin/main +0 -0
  176. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.gitattributes +0 -0
  177. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/.gitignore +0 -0
  178. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/LICENSE +0 -0
  179. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/README.md +0 -0
  180. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/__init__.py +0 -0
  181. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/batman.py +0 -0
  182. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/brain_atlas.py +0 -0
  183. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/chat.py +0 -0
  184. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/correlators.py +0 -0
  185. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/.DS_Store +0 -0
  186. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/db2ls_sql_chtsht.json +0 -0
  187. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/docs_links.json +0 -0
  188. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/email/email_html_template.html +0 -0
  189. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/lang_code_iso639.json +0 -0
  190. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/mygenes_fields_241022.txt +0 -0
  191. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/sns_info.json +0 -0
  192. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style1.pdf +0 -0
  193. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style2.pdf +0 -0
  194. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style3.pdf +0 -0
  195. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style4.pdf +0 -0
  196. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style5.pdf +0 -0
  197. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style6.pdf +0 -0
  198. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style7.pdf +0 -0
  199. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style8.pdf +0 -0
  200. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/example/style9.pdf +0 -0
  201. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style1.json +0 -0
  202. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style10.json +0 -0
  203. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style11.json +0 -0
  204. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style12.json +0 -0
  205. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style2.json +0 -0
  206. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style3.json +0 -0
  207. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style4.json +0 -0
  208. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style5.json +0 -0
  209. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style6.json +0 -0
  210. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style7.json +0 -0
  211. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style8.json +0 -0
  212. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/styles/style9.json +0 -0
  213. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/usages_pd copy.json +0 -0
  214. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/usages_pd.json +0 -0
  215. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/data/usages_sns.json +0 -0
  216. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/db2ls.py +0 -0
  217. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/doc.py +0 -0
  218. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/export_requirements.py +0 -0
  219. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/fetch_update.py +0 -0
  220. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/freqanalysis.py +0 -0
  221. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/ich2ls.py +0 -0
  222. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/ml2ls.py +0 -0
  223. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/mol.py +0 -0
  224. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/netfinder.py +0 -0
  225. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/ocr.py +0 -0
  226. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/setuptools-70.1.0-py3-none-any.whl +0 -0
  227. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/sleep_events_detectors.py +0 -0
  228. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/stats.py +0 -0
  229. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/py2ls/translator.py +0 -0
  230. {py2ls-0.2.4.6 → py2ls-0.2.4.7}/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.6
3
+ Version: 0.2.4.7
4
4
  Summary: py(thon)2(too)ls
5
5
  Author: Jianfeng
6
6
  Author-email: Jianfeng.Liu0413@gmail.com
@@ -166,9 +166,23 @@ def get_probe(
166
166
  if platform_id is None:
167
167
  df_meta = get_meta(geo=geo, dataset=dataset, verbose=False)
168
168
  platform_id = df_meta["platform_id"].unique().tolist()
169
- platform_id = platform_id[0] if len(platform_id) == 1 else platform_id
170
169
  print(f"Platform: {platform_id}")
171
- df_probe = geo[dataset].gpls[platform_id].table
170
+ if len(platform_id) > 1:
171
+ df_probe= geo[dataset].gpls[platform_id[0]].table
172
+ # df_probe=pd.DataFrame()
173
+ # # Iterate over each platform ID and collect the probe tables
174
+ # for platform_id_ in platform_id:
175
+ # if platform_id_ in geo[dataset].gpls:
176
+ # df_probe_ = geo[dataset].gpls[platform_id_].table
177
+ # if not df_probe_.empty:
178
+ # df_probe=pd.concat([df_probe, df_probe_])
179
+ # else:
180
+ # print(f"Warning: Probe table for platform {platform_id_} is empty.")
181
+ # else:
182
+ # print(f"Warning: Platform ID {platform_id_} not found in dataset {dataset}.")
183
+ else:
184
+ df_probe= geo[dataset].gpls[platform_id[0]].table
185
+
172
186
  if df_probe.empty:
173
187
  print(
174
188
  f"Warning: cannot find the probe info. 看一下是不是在单独的文件中包含了probe信息"
@@ -215,9 +229,12 @@ def get_data(geo: dict, dataset: str = "GSE25097", verbose=False):
215
229
  df_expression = get_expression_data(geo, dataset=dataset)
216
230
  if not df_expression.select_dtypes(include=["number"]).empty:
217
231
  # 如果数据全部是counts类型的话, 则使用TMM进行normalize
218
- if 'counts' in get_data_type(df_expression):
219
- print(f"{dataset}'s type is raw read counts, nomalized(transformed) via 'TMM'")
220
- df_expression=counts2expression(df_expression.T).T
232
+ if 'counts' in get_data_type(df_expression):
233
+ try:
234
+ df_expression=counts2expression(df_expression.T).T
235
+ print(f"{dataset}'s type is raw read counts, nomalized(transformed) via 'TMM'")
236
+ except Exception as e:
237
+ print("raw counts data")
221
238
  if any([df_probe.empty, df_expression.empty]):
222
239
  print(
223
240
  f"got empty values, check the probe info. 看一下是不是在单独的文件中包含了probe信息"
@@ -555,14 +555,28 @@ def shared(*args, strict=True, n_shared=2, verbose=True):
555
555
  # Get elements that appear in at least n_shared lists
556
556
  shared_elements = [item for item, count in element_count.items() if count >= n_shared]
557
557
 
558
- shared_elements = flatten(shared_elements, verbose=verbose)
558
+ shared_elements = flatten(shared_elements, verbose=verbose)
559
559
  if verbose:
560
560
  elements2show = shared_elements if len(shared_elements)<10 else shared_elements[:5]
561
561
  print(f"{' '*2}{len(shared_elements)} elements shared: {' '*2}{elements2show}")
562
562
  print("********* checking shared elements *********")
563
563
  return shared_elements
564
564
 
565
- def flatten(nested: Any, unique_list=True, verbose=True):
565
+ def not_shared(*args, strict=True, n_shared=2, verbose=False):
566
+ """
567
+ To find the elements in list1 that are not shared with list2 while maintaining the original order of list1
568
+ usage:
569
+ list1 = [1, 8, 3, 3, 4, 5]
570
+ list2 = [4, 5, 6, 7, 8]
571
+ not_shared(list1,list2)# output [1,3]
572
+ """
573
+ _common = shared(*args, strict=strict, n_shared=n_shared, verbose=verbose)
574
+ list1 = args[0]
575
+ _not_shared=[item for item in list1 if item not in _common]
576
+ return flatten(_not_shared, verbose=verbose)
577
+
578
+
579
+ def flatten(nested: Any, unique_list=True, verbose=False):
566
580
  """
567
581
  Recursively flattens a nested structure (lists, tuples, dictionaries, sets) into a single list.
568
582
  Parameters:
@@ -1560,13 +1574,26 @@ def unzip(dir_path, output_dir=None):
1560
1574
  tar_ref.extractall(output_dir)
1561
1575
  return output_dir
1562
1576
  # Handle .gz files
1563
- if dir_path.endswith(".gz"):
1577
+ if dir_path.endswith(".gz") or dir_path.endswith(".gzip"):
1564
1578
  import gzip
1565
1579
 
1566
1580
  output_file = os.path.splitext(dir_path)[0] # remove the .gz extension
1567
- with gzip.open(dir_path, "rb") as gz_file:
1568
- with open(output_file, "wb") as out_file:
1569
- shutil.copyfileobj(gz_file, out_file)
1581
+ try:
1582
+ with gzip.open(dir_path, "rb") as gz_file:
1583
+ with open(output_file, "wb") as out_file:
1584
+ shutil.copyfileobj(gz_file, out_file)
1585
+ print(f"unzipped '{dir_path}' to '{output_file}'")
1586
+ except FileNotFoundError:
1587
+ print(f"Error: The file '{dir_path}' was not found.")
1588
+ except PermissionError:
1589
+ print(f"Error: Permission denied when accessing '{dir_path}' or writing to '{output_file}'.")
1590
+ except Exception as e:
1591
+ try:
1592
+ import tarfile
1593
+ with tarfile.open(dir_path, 'r:gz') as tar:
1594
+ tar.extractall(path=output_file)
1595
+ except Exception as final_e:
1596
+ print(f"An final unexpected error occurred: {final_e}")
1570
1597
  return output_file
1571
1598
 
1572
1599
  # Handle .zip files
@@ -1648,9 +1675,12 @@ def is_df_abnormal(df: pd.DataFrame, verbose=False) -> bool:
1648
1675
  False: normal
1649
1676
 
1650
1677
  """
1678
+ if not isinstance(df, pd.DataFrame):
1679
+ return False
1680
+ df.columns = df.columns.astype(str)# 把它变成str, 这样就可以进行counts运算了
1651
1681
  # Initialize a list to hold messages about abnormalities
1652
1682
  messages = []
1653
- is_abnormal = False
1683
+ is_abnormal = True
1654
1684
  # Check the shape of the DataFrame
1655
1685
  actual_shape = df.shape
1656
1686
  messages.append(f"Shape of DataFrame: {actual_shape}")
@@ -1745,10 +1775,12 @@ def fload(fpath, kind=None, **kwargs):
1745
1775
  content = file.read()
1746
1776
  return content
1747
1777
 
1748
- def load_html(fpath):
1749
- with open(fpath, "r") as file:
1750
- content = file.read()
1751
- return content
1778
+ # def load_html(fpath):
1779
+ # with open(fpath, "r") as file:
1780
+ # content = file.read()
1781
+ # return content
1782
+ def load_html(fpath,**kwargs):
1783
+ return pd.read_html(fpath,**kwargs)
1752
1784
 
1753
1785
  def load_json(fpath, **kwargs):
1754
1786
  output=kwargs.pop("output","json")
@@ -1962,8 +1994,8 @@ def fload(fpath, kind=None, **kwargs):
1962
1994
  # display(df.head(2))
1963
1995
  # print(f"is_df_abnormal:{is_df_abnormal(df, verbose=0)}")
1964
1996
  if not is_df_abnormal(df, verbose=0):
1965
- display(df.head(2))
1966
- print(f"shape: {df.shape}")
1997
+ display(df.head(2)) if isinstance(df, pd.DataFrame) else display("it is not a DataFrame")
1998
+ print(f"shape: {df.shape}") if isinstance(df, pd.DataFrame) else display("it is not a DataFrame")
1967
1999
  return df
1968
2000
  except EmptyDataError as e:
1969
2001
  continue
@@ -1987,6 +2019,42 @@ def fload(fpath, kind=None, **kwargs):
1987
2019
  pass
1988
2020
  return df
1989
2021
 
2022
+
2023
+ def load_parquet(fpath, **kwargs):
2024
+ """
2025
+ Load a Parquet file into a Pandas DataFrame with advanced options.
2026
+
2027
+ Parameters:
2028
+ - fpath (str): The file path to the Parquet file.
2029
+ - engine (str): The engine to use for reading the Parquet file (default is 'pyarrow').
2030
+ - columns (list): List of columns to load. If None, loads all columns.
2031
+ - verbose (bool): If True, prints additional information about the loading process.
2032
+ - filters (list): List of filter conditions for predicate pushdown.
2033
+ - **kwargs: Additional keyword arguments for `pd.read_parquet`.
2034
+
2035
+ Returns:
2036
+ - df (DataFrame): The loaded DataFrame.
2037
+ """
2038
+
2039
+ engine = kwargs.get("engine", "pyarrow")
2040
+ verbose = kwargs.pop("verbose", False)
2041
+
2042
+ if verbose:
2043
+ use_pd("read_parquet", verbose=verbose)
2044
+ try:
2045
+ df = pd.read_parquet(fpath, engine=engine, **kwargs)
2046
+ if verbose:
2047
+ if 'columns' in kwargs:
2048
+ print(f"Loaded columns: {kwargs['columns']}")
2049
+ else:
2050
+ print("Loaded all columns.")
2051
+ print(f"shape: {df.shape}")
2052
+ except Exception as e:
2053
+ print(f"An error occurred while loading the Parquet file: {e}")
2054
+ df = None
2055
+
2056
+ return df
2057
+
1990
2058
  def load_ipynb(fpath, **kwargs):
1991
2059
  as_version = kwargs.get("as_version", 4)
1992
2060
  with open(fpath, "r") as file:
@@ -2055,51 +2123,21 @@ def fload(fpath, kind=None, **kwargs):
2055
2123
  kind = kind.lower()
2056
2124
  kind = kind.lstrip(".").lower()
2057
2125
  img_types = [
2058
- "bmp",
2059
- "eps",
2060
- "gif",
2061
- "icns",
2062
- "ico",
2063
- "im",
2064
- "jpg",
2065
- "jpeg",
2066
- "jpeg2000",
2067
- "msp",
2068
- "pcx",
2069
- "png",
2070
- "ppm",
2071
- "sgi",
2072
- "spider",
2073
- "tga",
2074
- "tiff",
2075
- "tif",
2076
- "webp",
2077
- "json",
2126
+ "bmp","eps","gif","png","jpg","jpeg","jpeg2000","tiff","tif",
2127
+ "icns","ico","im","msp","pcx","ppm","sgi","spider","tga","webp",
2078
2128
  ]
2079
2129
  doc_types = [
2080
- "docx",
2081
- "txt",
2082
- "md",
2083
- "html",
2084
- "json",
2085
- "yaml",
2086
- "xml",
2087
- "csv",
2088
- "xlsx",
2089
- "pdf",
2130
+ "docx","pdf",
2131
+ "txt","csv","xlsx","tsv","parquet","snappy",
2132
+ "md","html",
2133
+ "json","yaml","xml",
2090
2134
  "ipynb",
2135
+ "mtx"
2091
2136
  ]
2092
2137
  zip_types = [
2093
- "gz",
2094
- "zip",
2095
- "7z",
2096
- "tar",
2097
- "tar.gz",
2098
- "tar.bz2",
2099
- "bz2",
2100
- "xz",
2101
- "rar",
2102
- "tgz",
2138
+ "gz","zip","7z","rar","tgz",
2139
+ "tar","tar.gz","tar.bz2",
2140
+ "bz2","xz","gzip"
2103
2141
  ]
2104
2142
  other_types = ["fcs"]
2105
2143
  supported_types = [*doc_types, *img_types, *zip_types, *other_types]
@@ -2128,14 +2166,14 @@ def fload(fpath, kind=None, **kwargs):
2128
2166
  elif kind == "txt" or kind == "md":
2129
2167
  return load_txt_md(fpath)
2130
2168
  elif kind == "html":
2131
- return load_html(fpath)
2169
+ return load_html(fpath, **kwargs)
2132
2170
  elif kind == "json":
2133
- return load_json(fpath)
2171
+ return load_json(fpath, **kwargs)
2134
2172
  elif kind == "yaml":
2135
2173
  return load_yaml(fpath)
2136
2174
  elif kind == "xml":
2137
2175
  return load_xml(fpath)
2138
- elif kind == "csv":
2176
+ elif kind in ["csv","tsv"]:
2139
2177
  content = load_csv(fpath, **kwargs)
2140
2178
  return content
2141
2179
  elif kind in ["ods", "ods", "odt"]:
@@ -2146,14 +2184,25 @@ def fload(fpath, kind=None, **kwargs):
2146
2184
  engine = kwargs.get("engine", "xlrd")
2147
2185
  kwargs.pop("engine", None)
2148
2186
  content = load_excel(fpath, engine=engine, **kwargs)
2187
+ print(f"shape: {content.shape}")
2149
2188
  display(content.head(3))
2150
2189
  return content
2151
2190
  elif kind == "xlsx":
2152
2191
  content = load_excel(fpath, **kwargs)
2153
2192
  display(content.head(3))
2193
+ print(f"shape: {content.shape}")
2194
+ return content
2195
+ elif kind=='mtx':
2196
+ from scipy.io import mmread
2197
+ dat_mtx=mmread(fpath)
2198
+ content=pd.DataFrame.sparse.from_spmatrix(dat_mtx,**kwargs)
2199
+ display(content.head(3))
2200
+ print(f"shape: {content.shape}")
2154
2201
  return content
2155
2202
  elif kind == "ipynb":
2156
2203
  return load_ipynb(fpath, **kwargs)
2204
+ elif kind in ['parquet','snappy']:
2205
+ return load_parquet(fpath,**kwargs)
2157
2206
  elif kind == "pdf":
2158
2207
  # print('usage:load_pdf(fpath, page="all", verbose=False)')
2159
2208
  return load_pdf(fpath, **kwargs)
@@ -2199,9 +2248,7 @@ def fload(fpath, kind=None, **kwargs):
2199
2248
  return meta, data
2200
2249
 
2201
2250
  else:
2202
- # try:
2203
- # content = load_csv(fpath, **kwargs)
2204
- # except:
2251
+ print("direct reading...")
2205
2252
  try:
2206
2253
  try:
2207
2254
  with open(fpath, "r", encoding="utf-8") as f:
@@ -2501,6 +2548,25 @@ def fsave(
2501
2548
  tree = etree.ElementTree(root)
2502
2549
  tree.write(fpath, pretty_print=True, xml_declaration=True, encoding="UTF-8")
2503
2550
 
2551
+ def save_parquet(fpath:str, data:pd.DataFrame, **kwargs):
2552
+ engine = kwargs.pop("engine","auto") # auto先试pyarrow, 不行就转为fastparquet, {‘auto’, ‘pyarrow’, ‘fastparquet’}
2553
+ compression=kwargs.pop("compression",None) # Use None for no compression. Supported options: ‘snappy’, ‘gzip’, ‘brotli’, ‘lz4’, ‘zstd’
2554
+ try:
2555
+ # Attempt to save with "pyarrow" if engine is set to "auto"
2556
+ data.to_parquet(fpath, engine=engine, compression=compression, **kwargs)
2557
+ print(f"DataFrame successfully saved to {fpath} with engine '{engine}' and {compression} compression.")
2558
+ except Exception as e:
2559
+ print(f"Error using with engine '{engine}' and {compression} compression: {e}")
2560
+ if "Sparse" in str(e):
2561
+ try:
2562
+ # Handle sparse data by converting columns to dense
2563
+ print("Attempting to convert sparse columns to dense format...")
2564
+ data = data.apply(lambda x: x.sparse.to_dense() if pd.api.types.is_sparse(x) else x)
2565
+ save_parquet(fpath, data=data,**kwargs)
2566
+ except Exception as last_e:
2567
+ print(f"After converted sparse columns to dense format, Error using with engine '{engine}' and {compression} compression: {last_e}")
2568
+
2569
+
2504
2570
  if kind is None:
2505
2571
  _, kind = os.path.splitext(fpath)
2506
2572
  kind = kind.lower()
@@ -2546,6 +2612,15 @@ def fsave(
2546
2612
  save_yaml(fpath, content, **kwargs)
2547
2613
  elif kind == "ipynb":
2548
2614
  save_ipynb(fpath, content, **kwargs)
2615
+ elif kind.lower() in ["parquet","pq","big","par"]:
2616
+ compression=kwargs.pop("compression",None) # Use None for no compression. Supported options: ‘snappy’, ‘gzip’, ‘brotli’, ‘lz4’, ‘zstd’
2617
+ # fix the fpath ends
2618
+ if not '.parquet' in fpath:
2619
+ fpath=fpath.replace(kind, 'parquet')
2620
+ if compression is not None:
2621
+ if not fpath.endswith(compression):
2622
+ fpath=fpath+f".{compression}"
2623
+ save_parquet(fpath=fpath, data=content,compression=compression,**kwargs)
2549
2624
  else:
2550
2625
  try:
2551
2626
  netfinder.downloader(url=content, dir_save=dirname(fpath), kind=kind)
@@ -5518,7 +5593,21 @@ def df_reducer(
5518
5593
  ) -> pd.DataFrame:
5519
5594
  """
5520
5595
  Reduces the dimensionality of the selected DataFrame using PCA or UMAP.
5521
-
5596
+ method:
5597
+ 1. 'umap':
5598
+ - big dataset and global structure, often preferred in large-scale datasets for
5599
+ visualization and dimensionality reduction, balancing speed and quality of visualization.
5600
+ - t-SNE excels at preserving local structure (i.e., clusters), but it often loses global
5601
+ relationships, causing clusters to appear in arbitrary proximities to each other.
5602
+ 2. 'pca':
5603
+ - t-SNE excels at preserving local structure (i.e., clusters), but it often loses global
5604
+ relationships, causing clusters to appear in arbitrary proximities to each other.
5605
+ - useful as a preprocessing step and in datasets where linear relationships dominate.
5606
+ 3. 't-SNE':
5607
+ a. t-SNE excels at preserving local structure (i.e., clusters), but it often loses global
5608
+ relationships, causing clusters to appear in arbitrary proximities to each other.
5609
+ b. often preferred in large-scale datasets for visualization and dimensionality
5610
+ reduction, balancing speed and quality of visualization.
5522
5611
  Parameters:
5523
5612
  -----------
5524
5613
  data : pd.DataFrame
@@ -2337,40 +2337,20 @@ def get_color(
2337
2337
  if n == 1:
2338
2338
  colorlist = ["#3A4453"]
2339
2339
  elif n == 2:
2340
- colorlist = ["#3A4453", "#DF5932"]
2340
+ colorlist = ["#3A4453", "#FBAF63"]
2341
2341
  elif n == 3:
2342
- colorlist = ["#3A4453", "#DF5932", "#299D8F"]
2342
+ colorlist = ["#3A4453", "#FBAF63", "#299D8F"]
2343
2343
  elif n == 4:
2344
- # colorlist = ["#3A4453", "#DF5932", "#EBAA00", "#0B4083"]
2345
- colorlist = ["#81C6BD", "#FBAF63", "#F2675B", "#72A1C9"]
2344
+ colorlist = ["#087cf7", "#FBAF63", "#3C898A","#FF2C00"]
2346
2345
  elif n == 5:
2347
- colorlist = [
2348
- "#3A4453",
2349
- "#427AB2",
2350
- "#F09148",
2351
- "#DBDB8D",
2352
- "#C59D94",
2353
- "#AFC7E8",
2354
- ]
2346
+ colorlist = ["#459AA9", "#B25E9D", "#4B8C3B","#EF8632","#FF2C00"]
2355
2347
  elif n == 6:
2356
- colorlist = [
2357
- "#3A4453",
2358
- "#427AB2",
2359
- "#F09148",
2360
- "#DBDB8D",
2361
- "#C59D94",
2362
- "#E53528",
2363
- ]
2348
+ colorlist = ["#459AA9", "#B25E9D", "#4B8C3B","#EF8632", "#24578E","#FF2C00"]
2349
+ elif n==7:
2350
+ colorlist = [ "#7F7F7F", "#459AA9", "#B25E9D", "#4B8C3B","#EF8632", "#24578E" "#FF2C00"]
2364
2351
  else:
2365
- colorlist = [
2366
- "#474747",
2367
- "#FF2C00",
2368
- "#0C5DA5",
2369
- "#845B97",
2370
- "#58BBCC",
2371
- "#FF9500",
2372
- "#D57DBE",
2373
- ]
2352
+ colorlist = ['#FF7F0E','#2CA02C','#D62728','#9467BD','#E377C2','#7F7F7F','#7BB8CC','#06daf2']
2353
+
2374
2354
  by = "start"
2375
2355
  elif any(["cub" in cmap.lower(), "sns" in cmap.lower()]):
2376
2356
  if kwargs:
@@ -3106,9 +3086,9 @@ def plotxy(
3106
3086
  palette = kws_scatter.pop(
3107
3087
  "palette",
3108
3088
  (
3109
- sns.color_palette("tab10", data[hue].nunique())
3089
+ sns.color_palette("tab20", data[hue].nunique())
3110
3090
  if hue is not None
3111
- else sns.color_palette("tab10")
3091
+ else sns.color_palette("tab20")
3112
3092
  ),
3113
3093
  )
3114
3094
  s = kws_scatter.pop("s", 10)
@@ -3202,7 +3182,7 @@ def volcano(
3202
3182
  top_genes=[5, 5], # [down-regulated, up-regulated]
3203
3183
  thr_x=np.log2(1.5), # default: 0.585
3204
3184
  thr_y=-np.log10(0.05),
3205
- sort_xy="x", #'y'
3185
+ sort_xy="x", #'y', 'xy'
3206
3186
  colors=("#00BFFF", "#9d9a9a", "#FF3030"),
3207
3187
  s=20,
3208
3188
  fill=True, # plot filled scatter
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "py2ls"
3
- version = "0.2.4.6"
3
+ version = "0.2.4.7"
4
4
  description = "py(thon)2(too)ls"
5
5
  authors = ["Jianfeng <Jianfeng.Liu0413@gmail.com>"]
6
6
  readme = "README.md"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes