scitex 2.0.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. scitex/__init__.py +73 -0
  2. scitex/__main__.py +89 -0
  3. scitex/__version__.py +14 -0
  4. scitex/_sh.py +59 -0
  5. scitex/ai/_LearningCurveLogger.py +583 -0
  6. scitex/ai/__Classifiers.py +101 -0
  7. scitex/ai/__init__.py +55 -0
  8. scitex/ai/_gen_ai/_Anthropic.py +173 -0
  9. scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
  10. scitex/ai/_gen_ai/_DeepSeek.py +175 -0
  11. scitex/ai/_gen_ai/_Google.py +161 -0
  12. scitex/ai/_gen_ai/_Groq.py +97 -0
  13. scitex/ai/_gen_ai/_Llama.py +142 -0
  14. scitex/ai/_gen_ai/_OpenAI.py +230 -0
  15. scitex/ai/_gen_ai/_PARAMS.py +565 -0
  16. scitex/ai/_gen_ai/_Perplexity.py +191 -0
  17. scitex/ai/_gen_ai/__init__.py +32 -0
  18. scitex/ai/_gen_ai/_calc_cost.py +78 -0
  19. scitex/ai/_gen_ai/_format_output_func.py +183 -0
  20. scitex/ai/_gen_ai/_genai_factory.py +71 -0
  21. scitex/ai/act/__init__.py +8 -0
  22. scitex/ai/act/_define.py +11 -0
  23. scitex/ai/classification/__init__.py +7 -0
  24. scitex/ai/classification/classification_reporter.py +1137 -0
  25. scitex/ai/classification/classifier_server.py +131 -0
  26. scitex/ai/classification/classifiers.py +101 -0
  27. scitex/ai/classification_reporter.py +1161 -0
  28. scitex/ai/classifier_server.py +131 -0
  29. scitex/ai/clustering/__init__.py +11 -0
  30. scitex/ai/clustering/_pca.py +115 -0
  31. scitex/ai/clustering/_umap.py +376 -0
  32. scitex/ai/early_stopping.py +149 -0
  33. scitex/ai/feature_extraction/__init__.py +56 -0
  34. scitex/ai/feature_extraction/vit.py +148 -0
  35. scitex/ai/genai/__init__.py +277 -0
  36. scitex/ai/genai/anthropic.py +177 -0
  37. scitex/ai/genai/anthropic_provider.py +320 -0
  38. scitex/ai/genai/anthropic_refactored.py +109 -0
  39. scitex/ai/genai/auth_manager.py +200 -0
  40. scitex/ai/genai/base_genai.py +336 -0
  41. scitex/ai/genai/base_provider.py +291 -0
  42. scitex/ai/genai/calc_cost.py +78 -0
  43. scitex/ai/genai/chat_history.py +307 -0
  44. scitex/ai/genai/cost_tracker.py +276 -0
  45. scitex/ai/genai/deepseek.py +188 -0
  46. scitex/ai/genai/deepseek_provider.py +251 -0
  47. scitex/ai/genai/format_output_func.py +183 -0
  48. scitex/ai/genai/genai_factory.py +71 -0
  49. scitex/ai/genai/google.py +169 -0
  50. scitex/ai/genai/google_provider.py +228 -0
  51. scitex/ai/genai/groq.py +104 -0
  52. scitex/ai/genai/groq_provider.py +248 -0
  53. scitex/ai/genai/image_processor.py +250 -0
  54. scitex/ai/genai/llama.py +155 -0
  55. scitex/ai/genai/llama_provider.py +214 -0
  56. scitex/ai/genai/mock_provider.py +127 -0
  57. scitex/ai/genai/model_registry.py +304 -0
  58. scitex/ai/genai/openai.py +230 -0
  59. scitex/ai/genai/openai_provider.py +293 -0
  60. scitex/ai/genai/params.py +565 -0
  61. scitex/ai/genai/perplexity.py +202 -0
  62. scitex/ai/genai/perplexity_provider.py +205 -0
  63. scitex/ai/genai/provider_base.py +302 -0
  64. scitex/ai/genai/provider_factory.py +370 -0
  65. scitex/ai/genai/response_handler.py +235 -0
  66. scitex/ai/layer/_Pass.py +21 -0
  67. scitex/ai/layer/__init__.py +10 -0
  68. scitex/ai/layer/_switch.py +8 -0
  69. scitex/ai/loss/_L1L2Losses.py +34 -0
  70. scitex/ai/loss/__init__.py +12 -0
  71. scitex/ai/loss/multi_task_loss.py +47 -0
  72. scitex/ai/metrics/__init__.py +9 -0
  73. scitex/ai/metrics/_bACC.py +51 -0
  74. scitex/ai/metrics/silhoute_score_block.py +496 -0
  75. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  76. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  77. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  78. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  79. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  80. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  81. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  82. scitex/ai/optim/__init__.py +13 -0
  83. scitex/ai/optim/_get_set.py +31 -0
  84. scitex/ai/optim/_optimizers.py +71 -0
  85. scitex/ai/plt/__init__.py +21 -0
  86. scitex/ai/plt/_conf_mat.py +592 -0
  87. scitex/ai/plt/_learning_curve.py +194 -0
  88. scitex/ai/plt/_optuna_study.py +111 -0
  89. scitex/ai/plt/aucs/__init__.py +2 -0
  90. scitex/ai/plt/aucs/example.py +60 -0
  91. scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
  92. scitex/ai/plt/aucs/roc_auc.py +246 -0
  93. scitex/ai/sampling/undersample.py +29 -0
  94. scitex/ai/sk/__init__.py +11 -0
  95. scitex/ai/sk/_clf.py +58 -0
  96. scitex/ai/sk/_to_sktime.py +100 -0
  97. scitex/ai/sklearn/__init__.py +26 -0
  98. scitex/ai/sklearn/clf.py +58 -0
  99. scitex/ai/sklearn/to_sktime.py +100 -0
  100. scitex/ai/training/__init__.py +7 -0
  101. scitex/ai/training/early_stopping.py +150 -0
  102. scitex/ai/training/learning_curve_logger.py +555 -0
  103. scitex/ai/utils/__init__.py +22 -0
  104. scitex/ai/utils/_check_params.py +50 -0
  105. scitex/ai/utils/_default_dataset.py +46 -0
  106. scitex/ai/utils/_format_samples_for_sktime.py +26 -0
  107. scitex/ai/utils/_label_encoder.py +134 -0
  108. scitex/ai/utils/_merge_labels.py +22 -0
  109. scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
  110. scitex/ai/utils/_under_sample.py +51 -0
  111. scitex/ai/utils/_verify_n_gpus.py +16 -0
  112. scitex/ai/utils/grid_search.py +148 -0
  113. scitex/context/__init__.py +9 -0
  114. scitex/context/_suppress_output.py +38 -0
  115. scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
  116. scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
  117. scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
  118. scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
  119. scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
  120. scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
  121. scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
  122. scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
  123. scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
  124. scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
  125. scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
  126. scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
  127. scitex/db/_BaseMixins/__init__.py +30 -0
  128. scitex/db/_PostgreSQL.py +126 -0
  129. scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
  130. scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
  131. scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
  132. scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
  133. scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
  134. scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
  135. scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
  136. scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
  137. scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
  138. scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
  139. scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
  140. scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
  141. scitex/db/_PostgreSQLMixins/__init__.py +34 -0
  142. scitex/db/_SQLite3.py +2136 -0
  143. scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
  144. scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
  145. scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
  146. scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
  147. scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
  148. scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
  149. scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
  150. scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
  151. scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
  152. scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
  153. scitex/db/_SQLite3Mixins/__init__.py +30 -0
  154. scitex/db/__init__.py +14 -0
  155. scitex/db/_delete_duplicates.py +397 -0
  156. scitex/db/_inspect.py +163 -0
  157. scitex/decorators/__init__.py +54 -0
  158. scitex/decorators/_auto_order.py +172 -0
  159. scitex/decorators/_batch_fn.py +127 -0
  160. scitex/decorators/_cache_disk.py +32 -0
  161. scitex/decorators/_cache_mem.py +12 -0
  162. scitex/decorators/_combined.py +98 -0
  163. scitex/decorators/_converters.py +282 -0
  164. scitex/decorators/_deprecated.py +26 -0
  165. scitex/decorators/_not_implemented.py +30 -0
  166. scitex/decorators/_numpy_fn.py +86 -0
  167. scitex/decorators/_pandas_fn.py +121 -0
  168. scitex/decorators/_preserve_doc.py +19 -0
  169. scitex/decorators/_signal_fn.py +95 -0
  170. scitex/decorators/_timeout.py +55 -0
  171. scitex/decorators/_torch_fn.py +136 -0
  172. scitex/decorators/_wrap.py +39 -0
  173. scitex/decorators/_xarray_fn.py +88 -0
  174. scitex/dev/__init__.py +15 -0
  175. scitex/dev/_analyze_code_flow.py +284 -0
  176. scitex/dev/_reload.py +59 -0
  177. scitex/dict/_DotDict.py +442 -0
  178. scitex/dict/__init__.py +18 -0
  179. scitex/dict/_listed_dict.py +42 -0
  180. scitex/dict/_pop_keys.py +36 -0
  181. scitex/dict/_replace.py +13 -0
  182. scitex/dict/_safe_merge.py +62 -0
  183. scitex/dict/_to_str.py +32 -0
  184. scitex/dsp/__init__.py +72 -0
  185. scitex/dsp/_crop.py +122 -0
  186. scitex/dsp/_demo_sig.py +331 -0
  187. scitex/dsp/_detect_ripples.py +212 -0
  188. scitex/dsp/_ensure_3d.py +18 -0
  189. scitex/dsp/_hilbert.py +78 -0
  190. scitex/dsp/_listen.py +702 -0
  191. scitex/dsp/_misc.py +30 -0
  192. scitex/dsp/_mne.py +32 -0
  193. scitex/dsp/_modulation_index.py +79 -0
  194. scitex/dsp/_pac.py +319 -0
  195. scitex/dsp/_psd.py +102 -0
  196. scitex/dsp/_resample.py +65 -0
  197. scitex/dsp/_time.py +36 -0
  198. scitex/dsp/_transform.py +68 -0
  199. scitex/dsp/_wavelet.py +212 -0
  200. scitex/dsp/add_noise.py +111 -0
  201. scitex/dsp/example.py +253 -0
  202. scitex/dsp/filt.py +155 -0
  203. scitex/dsp/norm.py +18 -0
  204. scitex/dsp/params.py +51 -0
  205. scitex/dsp/reference.py +43 -0
  206. scitex/dsp/template.py +25 -0
  207. scitex/dsp/utils/__init__.py +15 -0
  208. scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
  209. scitex/dsp/utils/_ensure_3d.py +18 -0
  210. scitex/dsp/utils/_ensure_even_len.py +10 -0
  211. scitex/dsp/utils/_zero_pad.py +48 -0
  212. scitex/dsp/utils/filter.py +408 -0
  213. scitex/dsp/utils/pac.py +177 -0
  214. scitex/dt/__init__.py +8 -0
  215. scitex/dt/_linspace.py +130 -0
  216. scitex/etc/__init__.py +15 -0
  217. scitex/etc/wait_key.py +34 -0
  218. scitex/gen/_DimHandler.py +196 -0
  219. scitex/gen/_TimeStamper.py +244 -0
  220. scitex/gen/__init__.py +95 -0
  221. scitex/gen/_alternate_kwarg.py +13 -0
  222. scitex/gen/_cache.py +11 -0
  223. scitex/gen/_check_host.py +34 -0
  224. scitex/gen/_ci.py +12 -0
  225. scitex/gen/_close.py +222 -0
  226. scitex/gen/_embed.py +78 -0
  227. scitex/gen/_inspect_module.py +257 -0
  228. scitex/gen/_is_ipython.py +12 -0
  229. scitex/gen/_less.py +48 -0
  230. scitex/gen/_list_packages.py +139 -0
  231. scitex/gen/_mat2py.py +88 -0
  232. scitex/gen/_norm.py +170 -0
  233. scitex/gen/_paste.py +18 -0
  234. scitex/gen/_print_config.py +84 -0
  235. scitex/gen/_shell.py +48 -0
  236. scitex/gen/_src.py +111 -0
  237. scitex/gen/_start.py +451 -0
  238. scitex/gen/_symlink.py +55 -0
  239. scitex/gen/_symlog.py +27 -0
  240. scitex/gen/_tee.py +238 -0
  241. scitex/gen/_title2path.py +60 -0
  242. scitex/gen/_title_case.py +88 -0
  243. scitex/gen/_to_even.py +84 -0
  244. scitex/gen/_to_odd.py +34 -0
  245. scitex/gen/_to_rank.py +39 -0
  246. scitex/gen/_transpose.py +37 -0
  247. scitex/gen/_type.py +78 -0
  248. scitex/gen/_var_info.py +73 -0
  249. scitex/gen/_wrap.py +17 -0
  250. scitex/gen/_xml2dict.py +76 -0
  251. scitex/gen/misc.py +730 -0
  252. scitex/gen/path.py +0 -0
  253. scitex/general/__init__.py +5 -0
  254. scitex/gists/_SigMacro_processFigure_S.py +128 -0
  255. scitex/gists/_SigMacro_toBlue.py +172 -0
  256. scitex/gists/__init__.py +12 -0
  257. scitex/io/_H5Explorer.py +292 -0
  258. scitex/io/__init__.py +82 -0
  259. scitex/io/_cache.py +101 -0
  260. scitex/io/_flush.py +24 -0
  261. scitex/io/_glob.py +103 -0
  262. scitex/io/_json2md.py +113 -0
  263. scitex/io/_load.py +168 -0
  264. scitex/io/_load_configs.py +146 -0
  265. scitex/io/_load_modules/__init__.py +38 -0
  266. scitex/io/_load_modules/_catboost.py +66 -0
  267. scitex/io/_load_modules/_con.py +20 -0
  268. scitex/io/_load_modules/_db.py +24 -0
  269. scitex/io/_load_modules/_docx.py +42 -0
  270. scitex/io/_load_modules/_eeg.py +110 -0
  271. scitex/io/_load_modules/_hdf5.py +196 -0
  272. scitex/io/_load_modules/_image.py +19 -0
  273. scitex/io/_load_modules/_joblib.py +19 -0
  274. scitex/io/_load_modules/_json.py +18 -0
  275. scitex/io/_load_modules/_markdown.py +103 -0
  276. scitex/io/_load_modules/_matlab.py +37 -0
  277. scitex/io/_load_modules/_numpy.py +39 -0
  278. scitex/io/_load_modules/_optuna.py +155 -0
  279. scitex/io/_load_modules/_pandas.py +69 -0
  280. scitex/io/_load_modules/_pdf.py +31 -0
  281. scitex/io/_load_modules/_pickle.py +24 -0
  282. scitex/io/_load_modules/_torch.py +16 -0
  283. scitex/io/_load_modules/_txt.py +126 -0
  284. scitex/io/_load_modules/_xml.py +49 -0
  285. scitex/io/_load_modules/_yaml.py +23 -0
  286. scitex/io/_mv_to_tmp.py +19 -0
  287. scitex/io/_path.py +286 -0
  288. scitex/io/_reload.py +78 -0
  289. scitex/io/_save.py +539 -0
  290. scitex/io/_save_modules/__init__.py +66 -0
  291. scitex/io/_save_modules/_catboost.py +22 -0
  292. scitex/io/_save_modules/_csv.py +89 -0
  293. scitex/io/_save_modules/_excel.py +49 -0
  294. scitex/io/_save_modules/_hdf5.py +249 -0
  295. scitex/io/_save_modules/_html.py +48 -0
  296. scitex/io/_save_modules/_image.py +140 -0
  297. scitex/io/_save_modules/_joblib.py +25 -0
  298. scitex/io/_save_modules/_json.py +25 -0
  299. scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
  300. scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
  301. scitex/io/_save_modules/_matlab.py +24 -0
  302. scitex/io/_save_modules/_mp4.py +29 -0
  303. scitex/io/_save_modules/_numpy.py +57 -0
  304. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
  305. scitex/io/_save_modules/_pickle.py +45 -0
  306. scitex/io/_save_modules/_plotly.py +27 -0
  307. scitex/io/_save_modules/_text.py +23 -0
  308. scitex/io/_save_modules/_torch.py +26 -0
  309. scitex/io/_save_modules/_yaml.py +29 -0
  310. scitex/life/__init__.py +10 -0
  311. scitex/life/_monitor_rain.py +49 -0
  312. scitex/linalg/__init__.py +17 -0
  313. scitex/linalg/_distance.py +63 -0
  314. scitex/linalg/_geometric_median.py +64 -0
  315. scitex/linalg/_misc.py +73 -0
  316. scitex/nn/_AxiswiseDropout.py +27 -0
  317. scitex/nn/_BNet.py +126 -0
  318. scitex/nn/_BNet_Res.py +164 -0
  319. scitex/nn/_ChannelGainChanger.py +44 -0
  320. scitex/nn/_DropoutChannels.py +50 -0
  321. scitex/nn/_Filters.py +489 -0
  322. scitex/nn/_FreqGainChanger.py +110 -0
  323. scitex/nn/_GaussianFilter.py +48 -0
  324. scitex/nn/_Hilbert.py +111 -0
  325. scitex/nn/_MNet_1000.py +157 -0
  326. scitex/nn/_ModulationIndex.py +221 -0
  327. scitex/nn/_PAC.py +414 -0
  328. scitex/nn/_PSD.py +40 -0
  329. scitex/nn/_ResNet1D.py +120 -0
  330. scitex/nn/_SpatialAttention.py +25 -0
  331. scitex/nn/_Spectrogram.py +161 -0
  332. scitex/nn/_SwapChannels.py +50 -0
  333. scitex/nn/_TransposeLayer.py +19 -0
  334. scitex/nn/_Wavelet.py +183 -0
  335. scitex/nn/__init__.py +63 -0
  336. scitex/os/__init__.py +8 -0
  337. scitex/os/_mv.py +50 -0
  338. scitex/parallel/__init__.py +8 -0
  339. scitex/parallel/_run.py +151 -0
  340. scitex/path/__init__.py +33 -0
  341. scitex/path/_clean.py +52 -0
  342. scitex/path/_find.py +108 -0
  343. scitex/path/_get_module_path.py +51 -0
  344. scitex/path/_get_spath.py +35 -0
  345. scitex/path/_getsize.py +18 -0
  346. scitex/path/_increment_version.py +87 -0
  347. scitex/path/_mk_spath.py +51 -0
  348. scitex/path/_path.py +19 -0
  349. scitex/path/_split.py +23 -0
  350. scitex/path/_this_path.py +19 -0
  351. scitex/path/_version.py +101 -0
  352. scitex/pd/__init__.py +41 -0
  353. scitex/pd/_find_indi.py +126 -0
  354. scitex/pd/_find_pval.py +113 -0
  355. scitex/pd/_force_df.py +154 -0
  356. scitex/pd/_from_xyz.py +71 -0
  357. scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
  358. scitex/pd/_melt_cols.py +81 -0
  359. scitex/pd/_merge_columns.py +221 -0
  360. scitex/pd/_mv.py +63 -0
  361. scitex/pd/_replace.py +62 -0
  362. scitex/pd/_round.py +93 -0
  363. scitex/pd/_slice.py +63 -0
  364. scitex/pd/_sort.py +91 -0
  365. scitex/pd/_to_numeric.py +53 -0
  366. scitex/pd/_to_xy.py +59 -0
  367. scitex/pd/_to_xyz.py +110 -0
  368. scitex/plt/__init__.py +36 -0
  369. scitex/plt/_subplots/_AxesWrapper.py +182 -0
  370. scitex/plt/_subplots/_AxisWrapper.py +249 -0
  371. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
  372. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
  373. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
  374. scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
  375. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
  376. scitex/plt/_subplots/_FigWrapper.py +226 -0
  377. scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
  378. scitex/plt/_subplots/__init__.py +111 -0
  379. scitex/plt/_subplots/_export_as_csv.py +232 -0
  380. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
  381. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
  382. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
  383. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
  384. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
  385. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
  386. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
  387. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
  388. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
  389. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
  390. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
  391. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
  392. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
  393. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
  394. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
  395. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
  396. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
  397. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
  398. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
  399. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
  400. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
  401. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
  402. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
  403. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
  404. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
  405. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
  406. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
  407. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
  408. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
  409. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
  410. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
  411. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
  412. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
  413. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
  414. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
  415. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
  416. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
  417. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
  418. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
  419. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
  420. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
  421. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
  422. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
  423. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
  424. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
  425. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
  426. scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
  427. scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
  428. scitex/plt/_tpl.py +28 -0
  429. scitex/plt/ax/__init__.py +114 -0
  430. scitex/plt/ax/_plot/__init__.py +53 -0
  431. scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
  432. scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
  433. scitex/plt/ax/_plot/_plot_cube.py +57 -0
  434. scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
  435. scitex/plt/ax/_plot/_plot_fillv.py +55 -0
  436. scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
  437. scitex/plt/ax/_plot/_plot_image.py +94 -0
  438. scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
  439. scitex/plt/ax/_plot/_plot_raster.py +172 -0
  440. scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
  441. scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
  442. scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
  443. scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
  444. scitex/plt/ax/_plot/_plot_violin.py +343 -0
  445. scitex/plt/ax/_style/__init__.py +38 -0
  446. scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
  447. scitex/plt/ax/_style/_add_panel.py +92 -0
  448. scitex/plt/ax/_style/_extend.py +64 -0
  449. scitex/plt/ax/_style/_force_aspect.py +37 -0
  450. scitex/plt/ax/_style/_format_label.py +23 -0
  451. scitex/plt/ax/_style/_hide_spines.py +84 -0
  452. scitex/plt/ax/_style/_map_ticks.py +182 -0
  453. scitex/plt/ax/_style/_rotate_labels.py +215 -0
  454. scitex/plt/ax/_style/_sci_note.py +279 -0
  455. scitex/plt/ax/_style/_set_log_scale.py +299 -0
  456. scitex/plt/ax/_style/_set_meta.py +261 -0
  457. scitex/plt/ax/_style/_set_n_ticks.py +37 -0
  458. scitex/plt/ax/_style/_set_size.py +16 -0
  459. scitex/plt/ax/_style/_set_supxyt.py +116 -0
  460. scitex/plt/ax/_style/_set_ticks.py +276 -0
  461. scitex/plt/ax/_style/_set_xyt.py +121 -0
  462. scitex/plt/ax/_style/_share_axes.py +264 -0
  463. scitex/plt/ax/_style/_shift.py +139 -0
  464. scitex/plt/ax/_style/_show_spines.py +333 -0
  465. scitex/plt/color/_PARAMS.py +70 -0
  466. scitex/plt/color/__init__.py +52 -0
  467. scitex/plt/color/_add_hue_col.py +41 -0
  468. scitex/plt/color/_colors.py +205 -0
  469. scitex/plt/color/_get_colors_from_cmap.py +134 -0
  470. scitex/plt/color/_interpolate.py +29 -0
  471. scitex/plt/color/_vizualize_colors.py +54 -0
  472. scitex/plt/utils/__init__.py +44 -0
  473. scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
  474. scitex/plt/utils/_calc_nice_ticks.py +101 -0
  475. scitex/plt/utils/_close.py +68 -0
  476. scitex/plt/utils/_colorbar.py +96 -0
  477. scitex/plt/utils/_configure_mpl.py +295 -0
  478. scitex/plt/utils/_histogram_utils.py +132 -0
  479. scitex/plt/utils/_im2grid.py +70 -0
  480. scitex/plt/utils/_is_valid_axis.py +78 -0
  481. scitex/plt/utils/_mk_colorbar.py +65 -0
  482. scitex/plt/utils/_mk_patches.py +26 -0
  483. scitex/plt/utils/_scientific_captions.py +638 -0
  484. scitex/plt/utils/_scitex_config.py +223 -0
  485. scitex/reproduce/__init__.py +14 -0
  486. scitex/reproduce/_fix_seeds.py +45 -0
  487. scitex/reproduce/_gen_ID.py +55 -0
  488. scitex/reproduce/_gen_timestamp.py +35 -0
  489. scitex/res/__init__.py +5 -0
  490. scitex/resource/__init__.py +13 -0
  491. scitex/resource/_get_processor_usages.py +281 -0
  492. scitex/resource/_get_specs.py +280 -0
  493. scitex/resource/_log_processor_usages.py +190 -0
  494. scitex/resource/_utils/__init__.py +31 -0
  495. scitex/resource/_utils/_get_env_info.py +481 -0
  496. scitex/resource/limit_ram.py +33 -0
  497. scitex/scholar/__init__.py +24 -0
  498. scitex/scholar/_local_search.py +454 -0
  499. scitex/scholar/_paper.py +244 -0
  500. scitex/scholar/_pdf_downloader.py +325 -0
  501. scitex/scholar/_search.py +393 -0
  502. scitex/scholar/_vector_search.py +370 -0
  503. scitex/scholar/_web_sources.py +457 -0
  504. scitex/stats/__init__.py +31 -0
  505. scitex/stats/_calc_partial_corr.py +17 -0
  506. scitex/stats/_corr_test_multi.py +94 -0
  507. scitex/stats/_corr_test_wrapper.py +115 -0
  508. scitex/stats/_describe_wrapper.py +90 -0
  509. scitex/stats/_multiple_corrections.py +63 -0
  510. scitex/stats/_nan_stats.py +93 -0
  511. scitex/stats/_p2stars.py +116 -0
  512. scitex/stats/_p2stars_wrapper.py +56 -0
  513. scitex/stats/_statistical_tests.py +73 -0
  514. scitex/stats/desc/__init__.py +40 -0
  515. scitex/stats/desc/_describe.py +189 -0
  516. scitex/stats/desc/_nan.py +289 -0
  517. scitex/stats/desc/_real.py +94 -0
  518. scitex/stats/multiple/__init__.py +14 -0
  519. scitex/stats/multiple/_bonferroni_correction.py +72 -0
  520. scitex/stats/multiple/_fdr_correction.py +400 -0
  521. scitex/stats/multiple/_multicompair.py +28 -0
  522. scitex/stats/tests/__corr_test.py +277 -0
  523. scitex/stats/tests/__corr_test_multi.py +343 -0
  524. scitex/stats/tests/__corr_test_single.py +277 -0
  525. scitex/stats/tests/__init__.py +22 -0
  526. scitex/stats/tests/_brunner_munzel_test.py +192 -0
  527. scitex/stats/tests/_nocorrelation_test.py +28 -0
  528. scitex/stats/tests/_smirnov_grubbs.py +98 -0
  529. scitex/str/__init__.py +113 -0
  530. scitex/str/_clean_path.py +75 -0
  531. scitex/str/_color_text.py +52 -0
  532. scitex/str/_decapitalize.py +58 -0
  533. scitex/str/_factor_out_digits.py +281 -0
  534. scitex/str/_format_plot_text.py +498 -0
  535. scitex/str/_grep.py +48 -0
  536. scitex/str/_latex.py +155 -0
  537. scitex/str/_latex_fallback.py +471 -0
  538. scitex/str/_mask_api.py +39 -0
  539. scitex/str/_mask_api_key.py +8 -0
  540. scitex/str/_parse.py +158 -0
  541. scitex/str/_print_block.py +47 -0
  542. scitex/str/_print_debug.py +68 -0
  543. scitex/str/_printc.py +62 -0
  544. scitex/str/_readable_bytes.py +38 -0
  545. scitex/str/_remove_ansi.py +23 -0
  546. scitex/str/_replace.py +134 -0
  547. scitex/str/_search.py +125 -0
  548. scitex/str/_squeeze_space.py +36 -0
  549. scitex/tex/__init__.py +10 -0
  550. scitex/tex/_preview.py +103 -0
  551. scitex/tex/_to_vec.py +116 -0
  552. scitex/torch/__init__.py +18 -0
  553. scitex/torch/_apply_to.py +34 -0
  554. scitex/torch/_nan_funcs.py +77 -0
  555. scitex/types/_ArrayLike.py +44 -0
  556. scitex/types/_ColorLike.py +21 -0
  557. scitex/types/__init__.py +14 -0
  558. scitex/types/_is_listed_X.py +70 -0
  559. scitex/utils/__init__.py +22 -0
  560. scitex/utils/_compress_hdf5.py +116 -0
  561. scitex/utils/_email.py +120 -0
  562. scitex/utils/_grid.py +148 -0
  563. scitex/utils/_notify.py +247 -0
  564. scitex/utils/_search.py +121 -0
  565. scitex/web/__init__.py +38 -0
  566. scitex/web/_search_pubmed.py +438 -0
  567. scitex/web/_summarize_url.py +158 -0
  568. scitex-2.0.0.dist-info/METADATA +307 -0
  569. scitex-2.0.0.dist-info/RECORD +572 -0
  570. scitex-2.0.0.dist-info/WHEEL +6 -0
  571. scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
  572. scitex-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-25 01:37:20 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/db/_SQLite3Mixins/_MaintenanceMixin.py
5
+
6
+ THIS_FILE = (
7
+ "/home/ywatanabe/proj/scitex_repo/src/scitex/db/_SQLite3Mixins/_MaintenanceMixin.py"
8
+ )
9
+
10
+ import contextlib
11
+ import sqlite3
12
+ from typing import Callable
13
+ from typing import ContextManager, Dict, List, Optional
14
+ import pandas as pd
15
+
16
+ from .._BaseMixins._BaseMaintenanceMixin import _BaseMaintenanceMixin
17
+
18
+
19
+ class _MaintenanceMixin:
20
+ """Database maintenance functionality"""
21
+
22
+ @contextlib.contextmanager
23
+ def maintenance_lock(self) -> ContextManager[None]:
24
+ if not self._maintenance_lock.acquire(timeout=300):
25
+ raise TimeoutError("Could not acquire maintenance lock")
26
+ try:
27
+ yield
28
+ finally:
29
+ self._maintenance_lock.release()
30
+
31
+ def backup(
32
+ self,
33
+ backup_path: str,
34
+ pages: int = -1,
35
+ progress: Optional[Callable[[sqlite3.Connection, int, int], None]] = None,
36
+ ) -> None:
37
+ with self.maintenance_lock():
38
+ try:
39
+
40
+ def _progress(
41
+ status: sqlite3.Connection, remaining: int, total: int
42
+ ) -> None:
43
+ if progress:
44
+ progress(total - remaining, total)
45
+
46
+ backup_conn = sqlite3.connect(backup_path)
47
+ with backup_conn:
48
+ self.conn.backup(backup_conn, pages=pages, progress=_progress)
49
+ backup_conn.close()
50
+ except (sqlite3.Error, Exception) as err:
51
+ raise ValueError(f"Failed to create backup: {err}")
52
+
53
+ def vacuum(self, into: Optional[str] = None) -> None:
54
+ with self.maintenance_lock():
55
+ try:
56
+ if into:
57
+ self.execute(f"VACUUM INTO '{into}'")
58
+ else:
59
+ self.execute("VACUUM")
60
+ except sqlite3.Error as err:
61
+ raise ValueError(f"Vacuum operation failed: {err}")
62
+
63
+ def optimize(self, analyze: bool = True) -> None:
64
+ with self.maintenance_lock():
65
+ try:
66
+ self.execute("PRAGMA optimize")
67
+ self.vacuum()
68
+ if analyze:
69
+ self.execute("ANALYZE")
70
+ except sqlite3.Error as err:
71
+ raise ValueError(f"Failed to optimize database: {err}")
72
+
73
+ def get_summaries(
74
+ self,
75
+ table_names: Optional[List[str]] = None,
76
+ verbose: bool = True,
77
+ limit: int = 5,
78
+ ) -> Dict[str, pd.DataFrame]:
79
+ if table_names is None:
80
+ table_names = self.get_table_names()
81
+ if isinstance(table_names, str):
82
+ table_names = [table_names]
83
+
84
+ sample_tables = {}
85
+ for table_name in table_names:
86
+ columns = self.get_table_schema(table_name)
87
+ table_sample = self.get_rows(table_name=table_name, limit=limit)
88
+
89
+ for column in table_sample.columns:
90
+ if table_sample[column].dtype == object:
91
+ try:
92
+ pd.to_datetime(table_sample[column])
93
+ continue
94
+ except:
95
+ pass
96
+
97
+ if table_sample[column].apply(lambda x: isinstance(x, str)).all():
98
+ continue
99
+
100
+ sample_tables[table_name] = table_sample
101
+
102
+ return sample_tables
103
+
104
+ def fix_corruption(self) -> bool:
105
+ """Attempts to fix database corruption"""
106
+ with self.maintenance_lock():
107
+ try:
108
+ # Integrity check
109
+ integrity_check = self.execute("PRAGMA integrity_check").fetchall()
110
+ if integrity_check[0][0] == "ok":
111
+ return True
112
+
113
+ # Backup good data
114
+ temp_db = f"{self.db_path}_temp"
115
+ self.execute("PRAGMA writable_schema = ON")
116
+ self.execute(".dump", output_file=temp_db)
117
+
118
+ # Recreate database
119
+ self.close()
120
+ os.remove(self.db_path)
121
+ self.connect(self.db_path)
122
+
123
+ # Restore from dump
124
+ self.execute(f".read {temp_db}")
125
+ os.remove(temp_db)
126
+ return True
127
+
128
+ except sqlite3.Error as error:
129
+ raise ValueError(f"Failed to fix corruption: {error}")
130
+
131
+ def fix_journal(self) -> bool:
132
+ """Removes stale journal files and resets journal mode"""
133
+ with self.maintenance_lock():
134
+ try:
135
+ self.close()
136
+
137
+ # Remove journal files
138
+ journal_file = f"{self.db_path}-journal"
139
+ wal_file = f"{self.db_path}-wal"
140
+ shm_file = f"{self.db_path}-shm"
141
+
142
+ for file in [journal_file, wal_file, shm_file]:
143
+ if os.path.exists(file):
144
+ os.remove(file)
145
+
146
+ # Reconnect and reset journal mode
147
+ self.connect(self.db_path)
148
+ self.execute("PRAGMA journal_mode = DELETE")
149
+ self.execute("PRAGMA synchronous = NORMAL")
150
+ return True
151
+
152
+ except (sqlite3.Error, OSError) as error:
153
+ raise ValueError(f"Failed to fix journal: {error}")
154
+
155
+ def fix_indexes(self) -> bool:
156
+ """Rebuilds all indexes"""
157
+ with self.maintenance_lock():
158
+ try:
159
+ # Get all indexes
160
+ indexes = self.execute(
161
+ "SELECT name, tbl_name, sql FROM sqlite_master WHERE type='index'"
162
+ ).fetchall()
163
+
164
+ # Drop and recreate each index
165
+ for name, table, sql in indexes:
166
+ if sql: # Skip internal indexes
167
+ self.execute(f"DROP INDEX IF EXISTS {name}")
168
+ self.execute(sql)
169
+
170
+ return True
171
+
172
+ except sqlite3.Error as error:
173
+ raise ValueError(f"Failed to fix indexes: {error}")
174
+
175
+
176
+ # EOF
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-29 04:31:43 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/db/_SQLite3Mixins/_QueryMixin.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/db/_SQLite3Mixins/_QueryMixin.py"
7
+
8
+ import sqlite3
9
+ from typing import List, Tuple
10
+
11
+ import pandas as pd
12
+ from .._BaseMixins._BaseQueryMixin import _BaseQueryMixin
13
+
14
+
15
+ class _QueryMixin:
16
+ """Query execution functionality"""
17
+
18
+ def _sanitize_parameters(self, parameters):
19
+ """Convert pandas Timestamp objects to strings"""
20
+ if isinstance(parameters, (list, tuple)):
21
+ return [str(p) if isinstance(p, pd.Timestamp) else p for p in parameters]
22
+ return parameters
23
+
24
+ def execute(self, query: str, parameters: Tuple = ()) -> None:
25
+ if not self.cursor:
26
+ raise ConnectionError("Database not connected")
27
+
28
+ if any(
29
+ keyword in query.upper()
30
+ for keyword in ["INSERT", "UPDATE", "DELETE", "DROP", "CREATE", "ALTER"]
31
+ ):
32
+ self._check_writable()
33
+
34
+ try:
35
+ parameters = self._sanitize_parameters(parameters)
36
+ self.cursor.execute(query, parameters)
37
+ self.conn.commit()
38
+ return self.cursor
39
+ except sqlite3.Error as err:
40
+ raise sqlite3.Error(f"Query execution failed: {err}")
41
+
42
+ def executemany(self, query: str, parameters: List[Tuple]) -> None:
43
+ if not self.cursor:
44
+ raise ConnectionError("Database not connected")
45
+
46
+ if any(
47
+ keyword in query.upper()
48
+ for keyword in ["INSERT", "UPDATE", "DELETE", "DROP", "CREATE", "ALTER"]
49
+ ):
50
+ self._check_writable()
51
+
52
+ try:
53
+ parameters = [self._sanitize_parameters(p) for p in parameters]
54
+ self.cursor.executemany(query, parameters)
55
+ self.conn.commit()
56
+ except sqlite3.Error as err:
57
+ raise sqlite3.Error(f"Batch query execution failed: {err}")
58
+
59
+ def executescript(self, script: str) -> None:
60
+ if not self.cursor:
61
+ raise ConnectionError("Database not connected")
62
+
63
+ if any(
64
+ keyword in script.upper()
65
+ for keyword in [
66
+ "INSERT",
67
+ "UPDATE",
68
+ "DELETE",
69
+ "DROP",
70
+ "CREATE",
71
+ "ALTER",
72
+ ]
73
+ ):
74
+ self._check_writable()
75
+
76
+ try:
77
+ self.cursor.executescript(script)
78
+ self.conn.commit()
79
+ except sqlite3.Error as err:
80
+ raise sqlite3.Error(f"Script execution failed: {err}")
81
+
82
+
83
+ # EOF
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-25 01:38:17 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/db/_SQLite3Mixins/_RowMixin.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/db/_SQLite3Mixins/_RowMixin.py"
7
+
8
+ import sqlite3
9
+ from typing import List
10
+ from typing import Optional
11
+ import pandas as pd
12
+ from .._BaseMixins._BaseRowMixin import _BaseRowMixin
13
+
14
+
15
+ class _RowMixin:
16
+ """Row operations functionality"""
17
+
18
+ def get_rows(
19
+ self,
20
+ table_name: str,
21
+ columns: List[str] = None,
22
+ where: str = None,
23
+ order_by: str = None,
24
+ limit: Optional[int] = None,
25
+ offset: Optional[int] = None,
26
+ return_as: str = "dataframe",
27
+ ):
28
+ if columns is None:
29
+ columns_str = "*"
30
+ elif isinstance(columns, str):
31
+ columns_str = f'"{columns}"'
32
+ else:
33
+ columns_str = ", ".join(f'"{col}"' for col in columns)
34
+
35
+ try:
36
+ query_parts = [f"SELECT {columns_str} FROM {table_name}"]
37
+
38
+ if where:
39
+ query_parts.append(f"WHERE {where}")
40
+ if order_by:
41
+ query_parts.append(f"ORDER BY {order_by}")
42
+ if limit is not None:
43
+ query_parts.append(f"LIMIT {limit}")
44
+ if offset is not None:
45
+ query_parts.append(f"OFFSET {offset}")
46
+
47
+ query = " ".join(query_parts)
48
+ self.cursor.execute(query)
49
+
50
+ column_names = [description[0] for description in self.cursor.description]
51
+ data = self.cursor.fetchall()
52
+
53
+ if return_as == "list":
54
+ return data
55
+ elif return_as == "dict":
56
+ return [dict(zip(column_names, row)) for row in data]
57
+ else:
58
+ return pd.DataFrame(data, columns=column_names)
59
+
60
+ except sqlite3.Error as error:
61
+ raise sqlite3.Error(f"Query execution failed: {str(error)}")
62
+
63
+ def get_row_count(self, table_name: str = None, where: str = None) -> int:
64
+ if table_name is None:
65
+ raise ValueError("Table name must be specified")
66
+
67
+ query = f"SELECT COUNT(*) FROM {table_name}"
68
+ if where:
69
+ query += f" WHERE {where}"
70
+
71
+ self.cursor.execute(query)
72
+ return self.cursor.fetchone()[0]
73
+
74
+
75
+ # EOF
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-25 01:38:47 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/db/_SQLite3Mixins/_TableMixin.py
5
+
6
+ THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/db/_SQLite3Mixins/_TableMixin.py"
7
+
8
+ #!/usr/bin/env python3
9
+ # -*- coding: utf-8 -*-
10
+ # Time-stamp: "2024-11-11 19:13:19 (ywatanabe)"
11
+ # File: ./scitex_repo/src/scitex/db/_BaseSQLiteDB_modules/_TableMixin.py
12
+
13
+ import sqlite3
14
+ from typing import Any, Dict, List, Union
15
+ import pandas as pd
16
+ from .._BaseMixins._BaseTableMixin import _BaseTableMixin
17
+
18
+
19
+ class _TableMixin:
20
+ """Table management functionality"""
21
+
22
+ def create_table(
23
+ self,
24
+ table_name: str,
25
+ columns: Dict[str, str],
26
+ foreign_keys: List[Dict[str, str]] = None,
27
+ if_not_exists: bool = True,
28
+ ) -> None:
29
+ with self.transaction():
30
+ try:
31
+ exists_clause = "IF NOT EXISTS " if if_not_exists else ""
32
+ column_defs = []
33
+
34
+ for col_name, col_type in columns.items():
35
+ column_defs.append(f"{col_name} {col_type}")
36
+ if "BLOB" in col_type.upper():
37
+ column_defs.extend(
38
+ [
39
+ f"{col_name}_dtype TEXT DEFAULT 'unknown'",
40
+ f"{col_name}_shape TEXT DEFAULT 'unknown'",
41
+ ]
42
+ )
43
+
44
+ if foreign_keys:
45
+ for fk in foreign_keys:
46
+ column_defs.append(
47
+ f"FOREIGN KEY ({fk['tgt_column']}) REFERENCES {fk['src_table']}({fk['src_column']})"
48
+ )
49
+
50
+ query = f"CREATE TABLE {exists_clause}{table_name} ({', '.join(column_defs)})"
51
+ self.execute(query)
52
+
53
+ except sqlite3.Error as err:
54
+ raise ValueError(f"Failed to create table {table_name}: {err}")
55
+
56
+ def drop_table(self, table_name: str, if_exists: bool = True) -> None:
57
+ with self.transaction():
58
+ try:
59
+ exists_clause = "IF EXISTS " if if_exists else ""
60
+ query = f"DROP TABLE {exists_clause}{table_name}"
61
+ self.execute(query)
62
+ except sqlite3.Error as err:
63
+ raise ValueError(f"Failed to drop table: {err}")
64
+
65
+ def rename_table(self, old_name: str, new_name: str) -> None:
66
+ with self.transaction():
67
+ try:
68
+ query = f"ALTER TABLE {old_name} RENAME TO {new_name}"
69
+ self.execute(query)
70
+ except sqlite3.Error as err:
71
+ raise ValueError(f"Failed to rename table: {err}")
72
+
73
+ def add_columns(
74
+ self,
75
+ table_name: str,
76
+ columns: Dict[str, str],
77
+ default_values: Dict[str, Any] = None,
78
+ ) -> None:
79
+ with self.transaction():
80
+ if default_values is None:
81
+ default_values = {}
82
+
83
+ for column_name, column_type in columns.items():
84
+ self.add_column(
85
+ table_name,
86
+ column_name,
87
+ column_type,
88
+ default_values.get(column_name),
89
+ )
90
+
91
+ def add_column(
92
+ self,
93
+ table_name: str,
94
+ column_name: str,
95
+ column_type: str,
96
+ default_value: Any = None,
97
+ ) -> None:
98
+ with self.transaction():
99
+ schema = self.get_table_schema(table_name)
100
+ if column_name in schema["name"].values:
101
+ return
102
+
103
+ try:
104
+ query = (
105
+ f"ALTER TABLE {table_name} ADD COLUMN {column_name} {column_type}"
106
+ )
107
+ if default_value is not None:
108
+ query += f" DEFAULT {default_value}"
109
+ self.execute(query)
110
+
111
+ if "BLOB" in column_type.upper():
112
+ self.add_column(
113
+ table_name,
114
+ f"{column_name}_dtype",
115
+ "TEXT",
116
+ default_value="'unknown'",
117
+ )
118
+ self.add_column(
119
+ table_name,
120
+ f"{column_name}_shape",
121
+ "TEXT",
122
+ default_value="'unknown'",
123
+ )
124
+
125
+ except sqlite3.OperationalError as err:
126
+ raise ValueError(f"Failed to add column: {err}")
127
+
128
+ def drop_columns(
129
+ self,
130
+ table_name: str,
131
+ columns: Union[str, List[str]],
132
+ if_exists: bool = True,
133
+ ) -> None:
134
+ with self.transaction():
135
+ if isinstance(columns, str):
136
+ columns = [columns]
137
+ schema = self.get_table_schema(table_name)
138
+ existing_columns = schema["name"].values
139
+ columns_to_drop = (
140
+ [col for col in columns if col in existing_columns]
141
+ if if_exists
142
+ else columns
143
+ )
144
+
145
+ if not columns_to_drop:
146
+ return
147
+
148
+ # Drop multiple columns in a single ALTER TABLE statement
149
+ drop_clause = ", ".join(f"DROP COLUMN {col}" for col in columns_to_drop)
150
+ self.execute(f"ALTER TABLE {table_name} {drop_clause}")
151
+
152
+ def get_table_names(self) -> List[str]:
153
+ query = "SELECT name FROM sqlite_master WHERE type='table'"
154
+ self.cursor.execute(query)
155
+ return [table[0] for table in self.cursor.fetchall()]
156
+
157
+ def get_table_schema(self, table_name: str) -> pd.DataFrame:
158
+ query = f"PRAGMA table_info({table_name})"
159
+ self.cursor.execute(query)
160
+ columns = ["cid", "name", "type", "notnull", "dflt_value", "pk"]
161
+ return pd.DataFrame(self.cursor.fetchall(), columns=columns)
162
+
163
+ def get_primary_key(self, table_name: str) -> str:
164
+ schema = self.get_table_schema(table_name)
165
+ pk_col = schema[schema["pk"] == 1]["name"].values
166
+ return pk_col[0] if len(pk_col) > 0 else None
167
+
168
+ def get_table_stats(self, table_name: str) -> Dict[str, int]:
169
+ try:
170
+ pages = self.cursor.execute(f"PRAGMA page_count").fetchone()[0]
171
+ page_size = self.cursor.execute(f"PRAGMA page_size").fetchone()[0]
172
+ row_count = self.get_row_count(table_name)
173
+ return {
174
+ "pages": pages,
175
+ "page_size": page_size,
176
+ "total_size": pages * page_size,
177
+ "row_count": row_count,
178
+ }
179
+ except sqlite3.Error as err:
180
+ raise ValueError(f"Failed to get table size: {err}")
181
+
182
+
183
+ # EOF
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-29 04:32:42 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/db/_SQLite3Mixins/_TransactionMixin.py
5
+
6
+ THIS_FILE = (
7
+ "/home/ywatanabe/proj/scitex_repo/src/scitex/db/_SQLite3Mixins/_TransactionMixin.py"
8
+ )
9
+
10
+ import sqlite3
11
+ import contextlib
12
+ from .._BaseMixins._BaseTransactionMixin import _BaseTransactionMixin
13
+
14
+
15
+ class _TransactionMixin:
16
+ """Transaction management functionality"""
17
+
18
+ @contextlib.contextmanager
19
+ def transaction(self):
20
+ with self.lock:
21
+ try:
22
+ self.begin()
23
+ yield
24
+ self.commit()
25
+ except Exception as e:
26
+ self.rollback()
27
+ raise e
28
+
29
+ def begin(self) -> None:
30
+ self.execute("BEGIN TRANSACTION")
31
+
32
+ def commit(self) -> None:
33
+ self.conn.commit()
34
+
35
+ def rollback(self) -> None:
36
+ self.conn.rollback()
37
+
38
+ def enable_foreign_keys(self) -> None:
39
+ self.execute("PRAGMA foreign_keys = ON")
40
+
41
+ def disable_foreign_keys(self) -> None:
42
+ self.execute("PRAGMA foreign_keys = OFF")
43
+
44
+ @property
45
+ def writable(self) -> bool:
46
+ try:
47
+ self.cursor.execute("SELECT value FROM _db_state WHERE key = 'writable'")
48
+ result = self.cursor.fetchone()
49
+ return result[0].lower() == "true" if result else True
50
+ except sqlite3.Error:
51
+ return True
52
+
53
+ @writable.setter
54
+ def writable(self, state: bool) -> None:
55
+ try:
56
+ self.execute("UPDATE _db_state SET protected = 0 WHERE key = 'writable'")
57
+ self.execute(
58
+ "UPDATE _db_state SET value = ? WHERE key = 'writable'",
59
+ (str(state).lower(),),
60
+ )
61
+ self.execute("UPDATE _db_state SET protected = 1 WHERE key = 'writable'")
62
+ self.execute("PRAGMA query_only = ?", (not state,))
63
+ except sqlite3.Error as err:
64
+ raise ValueError(f"Failed to set writable state: {err}")
65
+
66
+ def _check_writable(self) -> None:
67
+ if not self.writable:
68
+ raise ValueError("Database is in read-only mode")
69
+
70
+
71
+ # EOF
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-11-12 09:29:50 (ywatanabe)"
4
+ # File: ./scitex_repo/src/scitex/db/_SQLite3Mixins/__init__.py
5
+
6
+ from ._BatchMixin import _BatchMixin
7
+ from ._BlobMixin import _BlobMixin
8
+ from ._ConnectionMixin import _ConnectionMixin
9
+ from ._ImportExportMixin import _ImportExportMixin
10
+ from ._IndexMixin import _IndexMixin
11
+ from ._MaintenanceMixin import _MaintenanceMixin
12
+ from ._QueryMixin import _QueryMixin
13
+ from ._RowMixin import _RowMixin
14
+ from ._TableMixin import _TableMixin
15
+ from ._TransactionMixin import _TransactionMixin
16
+
17
+ __all__ = [
18
+ "_BatchMixin",
19
+ "_BlobMixin",
20
+ "_ConnectionMixin",
21
+ "_ImportExportMixin",
22
+ "_IndexMixin",
23
+ "_MaintenanceMixin",
24
+ "_QueryMixin",
25
+ "_RowMixin",
26
+ "_TableMixin",
27
+ "_TransactionMixin",
28
+ ]
29
+
30
+ # EOF
scitex/db/__init__.py ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env python3
2
+ """Database operations module for scitex."""
3
+
4
+ from ._PostgreSQL import PostgreSQL
5
+ from ._SQLite3 import SQLite3
6
+ from ._delete_duplicates import delete_duplicates
7
+ from ._inspect import inspect
8
+
9
+ __all__ = [
10
+ "PostgreSQL",
11
+ "SQLite3",
12
+ "delete_duplicates",
13
+ "inspect",
14
+ ]