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.
- scitex/__init__.py +73 -0
- scitex/__main__.py +89 -0
- scitex/__version__.py +14 -0
- scitex/_sh.py +59 -0
- scitex/ai/_LearningCurveLogger.py +583 -0
- scitex/ai/__Classifiers.py +101 -0
- scitex/ai/__init__.py +55 -0
- scitex/ai/_gen_ai/_Anthropic.py +173 -0
- scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
- scitex/ai/_gen_ai/_DeepSeek.py +175 -0
- scitex/ai/_gen_ai/_Google.py +161 -0
- scitex/ai/_gen_ai/_Groq.py +97 -0
- scitex/ai/_gen_ai/_Llama.py +142 -0
- scitex/ai/_gen_ai/_OpenAI.py +230 -0
- scitex/ai/_gen_ai/_PARAMS.py +565 -0
- scitex/ai/_gen_ai/_Perplexity.py +191 -0
- scitex/ai/_gen_ai/__init__.py +32 -0
- scitex/ai/_gen_ai/_calc_cost.py +78 -0
- scitex/ai/_gen_ai/_format_output_func.py +183 -0
- scitex/ai/_gen_ai/_genai_factory.py +71 -0
- scitex/ai/act/__init__.py +8 -0
- scitex/ai/act/_define.py +11 -0
- scitex/ai/classification/__init__.py +7 -0
- scitex/ai/classification/classification_reporter.py +1137 -0
- scitex/ai/classification/classifier_server.py +131 -0
- scitex/ai/classification/classifiers.py +101 -0
- scitex/ai/classification_reporter.py +1161 -0
- scitex/ai/classifier_server.py +131 -0
- scitex/ai/clustering/__init__.py +11 -0
- scitex/ai/clustering/_pca.py +115 -0
- scitex/ai/clustering/_umap.py +376 -0
- scitex/ai/early_stopping.py +149 -0
- scitex/ai/feature_extraction/__init__.py +56 -0
- scitex/ai/feature_extraction/vit.py +148 -0
- scitex/ai/genai/__init__.py +277 -0
- scitex/ai/genai/anthropic.py +177 -0
- scitex/ai/genai/anthropic_provider.py +320 -0
- scitex/ai/genai/anthropic_refactored.py +109 -0
- scitex/ai/genai/auth_manager.py +200 -0
- scitex/ai/genai/base_genai.py +336 -0
- scitex/ai/genai/base_provider.py +291 -0
- scitex/ai/genai/calc_cost.py +78 -0
- scitex/ai/genai/chat_history.py +307 -0
- scitex/ai/genai/cost_tracker.py +276 -0
- scitex/ai/genai/deepseek.py +188 -0
- scitex/ai/genai/deepseek_provider.py +251 -0
- scitex/ai/genai/format_output_func.py +183 -0
- scitex/ai/genai/genai_factory.py +71 -0
- scitex/ai/genai/google.py +169 -0
- scitex/ai/genai/google_provider.py +228 -0
- scitex/ai/genai/groq.py +104 -0
- scitex/ai/genai/groq_provider.py +248 -0
- scitex/ai/genai/image_processor.py +250 -0
- scitex/ai/genai/llama.py +155 -0
- scitex/ai/genai/llama_provider.py +214 -0
- scitex/ai/genai/mock_provider.py +127 -0
- scitex/ai/genai/model_registry.py +304 -0
- scitex/ai/genai/openai.py +230 -0
- scitex/ai/genai/openai_provider.py +293 -0
- scitex/ai/genai/params.py +565 -0
- scitex/ai/genai/perplexity.py +202 -0
- scitex/ai/genai/perplexity_provider.py +205 -0
- scitex/ai/genai/provider_base.py +302 -0
- scitex/ai/genai/provider_factory.py +370 -0
- scitex/ai/genai/response_handler.py +235 -0
- scitex/ai/layer/_Pass.py +21 -0
- scitex/ai/layer/__init__.py +10 -0
- scitex/ai/layer/_switch.py +8 -0
- scitex/ai/loss/_L1L2Losses.py +34 -0
- scitex/ai/loss/__init__.py +12 -0
- scitex/ai/loss/multi_task_loss.py +47 -0
- scitex/ai/metrics/__init__.py +9 -0
- scitex/ai/metrics/_bACC.py +51 -0
- scitex/ai/metrics/silhoute_score_block.py +496 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ai/optim/__init__.py +13 -0
- scitex/ai/optim/_get_set.py +31 -0
- scitex/ai/optim/_optimizers.py +71 -0
- scitex/ai/plt/__init__.py +21 -0
- scitex/ai/plt/_conf_mat.py +592 -0
- scitex/ai/plt/_learning_curve.py +194 -0
- scitex/ai/plt/_optuna_study.py +111 -0
- scitex/ai/plt/aucs/__init__.py +2 -0
- scitex/ai/plt/aucs/example.py +60 -0
- scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
- scitex/ai/plt/aucs/roc_auc.py +246 -0
- scitex/ai/sampling/undersample.py +29 -0
- scitex/ai/sk/__init__.py +11 -0
- scitex/ai/sk/_clf.py +58 -0
- scitex/ai/sk/_to_sktime.py +100 -0
- scitex/ai/sklearn/__init__.py +26 -0
- scitex/ai/sklearn/clf.py +58 -0
- scitex/ai/sklearn/to_sktime.py +100 -0
- scitex/ai/training/__init__.py +7 -0
- scitex/ai/training/early_stopping.py +150 -0
- scitex/ai/training/learning_curve_logger.py +555 -0
- scitex/ai/utils/__init__.py +22 -0
- scitex/ai/utils/_check_params.py +50 -0
- scitex/ai/utils/_default_dataset.py +46 -0
- scitex/ai/utils/_format_samples_for_sktime.py +26 -0
- scitex/ai/utils/_label_encoder.py +134 -0
- scitex/ai/utils/_merge_labels.py +22 -0
- scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ai/utils/_under_sample.py +51 -0
- scitex/ai/utils/_verify_n_gpus.py +16 -0
- scitex/ai/utils/grid_search.py +148 -0
- scitex/context/__init__.py +9 -0
- scitex/context/_suppress_output.py +38 -0
- scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
- scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
- scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
- scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
- scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
- scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
- scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
- scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
- scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
- scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
- scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
- scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
- scitex/db/_BaseMixins/__init__.py +30 -0
- scitex/db/_PostgreSQL.py +126 -0
- scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
- scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
- scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
- scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
- scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
- scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
- scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
- scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
- scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
- scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
- scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
- scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
- scitex/db/_PostgreSQLMixins/__init__.py +34 -0
- scitex/db/_SQLite3.py +2136 -0
- scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
- scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
- scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
- scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
- scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
- scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
- scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
- scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
- scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
- scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
- scitex/db/_SQLite3Mixins/__init__.py +30 -0
- scitex/db/__init__.py +14 -0
- scitex/db/_delete_duplicates.py +397 -0
- scitex/db/_inspect.py +163 -0
- scitex/decorators/__init__.py +54 -0
- scitex/decorators/_auto_order.py +172 -0
- scitex/decorators/_batch_fn.py +127 -0
- scitex/decorators/_cache_disk.py +32 -0
- scitex/decorators/_cache_mem.py +12 -0
- scitex/decorators/_combined.py +98 -0
- scitex/decorators/_converters.py +282 -0
- scitex/decorators/_deprecated.py +26 -0
- scitex/decorators/_not_implemented.py +30 -0
- scitex/decorators/_numpy_fn.py +86 -0
- scitex/decorators/_pandas_fn.py +121 -0
- scitex/decorators/_preserve_doc.py +19 -0
- scitex/decorators/_signal_fn.py +95 -0
- scitex/decorators/_timeout.py +55 -0
- scitex/decorators/_torch_fn.py +136 -0
- scitex/decorators/_wrap.py +39 -0
- scitex/decorators/_xarray_fn.py +88 -0
- scitex/dev/__init__.py +15 -0
- scitex/dev/_analyze_code_flow.py +284 -0
- scitex/dev/_reload.py +59 -0
- scitex/dict/_DotDict.py +442 -0
- scitex/dict/__init__.py +18 -0
- scitex/dict/_listed_dict.py +42 -0
- scitex/dict/_pop_keys.py +36 -0
- scitex/dict/_replace.py +13 -0
- scitex/dict/_safe_merge.py +62 -0
- scitex/dict/_to_str.py +32 -0
- scitex/dsp/__init__.py +72 -0
- scitex/dsp/_crop.py +122 -0
- scitex/dsp/_demo_sig.py +331 -0
- scitex/dsp/_detect_ripples.py +212 -0
- scitex/dsp/_ensure_3d.py +18 -0
- scitex/dsp/_hilbert.py +78 -0
- scitex/dsp/_listen.py +702 -0
- scitex/dsp/_misc.py +30 -0
- scitex/dsp/_mne.py +32 -0
- scitex/dsp/_modulation_index.py +79 -0
- scitex/dsp/_pac.py +319 -0
- scitex/dsp/_psd.py +102 -0
- scitex/dsp/_resample.py +65 -0
- scitex/dsp/_time.py +36 -0
- scitex/dsp/_transform.py +68 -0
- scitex/dsp/_wavelet.py +212 -0
- scitex/dsp/add_noise.py +111 -0
- scitex/dsp/example.py +253 -0
- scitex/dsp/filt.py +155 -0
- scitex/dsp/norm.py +18 -0
- scitex/dsp/params.py +51 -0
- scitex/dsp/reference.py +43 -0
- scitex/dsp/template.py +25 -0
- scitex/dsp/utils/__init__.py +15 -0
- scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
- scitex/dsp/utils/_ensure_3d.py +18 -0
- scitex/dsp/utils/_ensure_even_len.py +10 -0
- scitex/dsp/utils/_zero_pad.py +48 -0
- scitex/dsp/utils/filter.py +408 -0
- scitex/dsp/utils/pac.py +177 -0
- scitex/dt/__init__.py +8 -0
- scitex/dt/_linspace.py +130 -0
- scitex/etc/__init__.py +15 -0
- scitex/etc/wait_key.py +34 -0
- scitex/gen/_DimHandler.py +196 -0
- scitex/gen/_TimeStamper.py +244 -0
- scitex/gen/__init__.py +95 -0
- scitex/gen/_alternate_kwarg.py +13 -0
- scitex/gen/_cache.py +11 -0
- scitex/gen/_check_host.py +34 -0
- scitex/gen/_ci.py +12 -0
- scitex/gen/_close.py +222 -0
- scitex/gen/_embed.py +78 -0
- scitex/gen/_inspect_module.py +257 -0
- scitex/gen/_is_ipython.py +12 -0
- scitex/gen/_less.py +48 -0
- scitex/gen/_list_packages.py +139 -0
- scitex/gen/_mat2py.py +88 -0
- scitex/gen/_norm.py +170 -0
- scitex/gen/_paste.py +18 -0
- scitex/gen/_print_config.py +84 -0
- scitex/gen/_shell.py +48 -0
- scitex/gen/_src.py +111 -0
- scitex/gen/_start.py +451 -0
- scitex/gen/_symlink.py +55 -0
- scitex/gen/_symlog.py +27 -0
- scitex/gen/_tee.py +238 -0
- scitex/gen/_title2path.py +60 -0
- scitex/gen/_title_case.py +88 -0
- scitex/gen/_to_even.py +84 -0
- scitex/gen/_to_odd.py +34 -0
- scitex/gen/_to_rank.py +39 -0
- scitex/gen/_transpose.py +37 -0
- scitex/gen/_type.py +78 -0
- scitex/gen/_var_info.py +73 -0
- scitex/gen/_wrap.py +17 -0
- scitex/gen/_xml2dict.py +76 -0
- scitex/gen/misc.py +730 -0
- scitex/gen/path.py +0 -0
- scitex/general/__init__.py +5 -0
- scitex/gists/_SigMacro_processFigure_S.py +128 -0
- scitex/gists/_SigMacro_toBlue.py +172 -0
- scitex/gists/__init__.py +12 -0
- scitex/io/_H5Explorer.py +292 -0
- scitex/io/__init__.py +82 -0
- scitex/io/_cache.py +101 -0
- scitex/io/_flush.py +24 -0
- scitex/io/_glob.py +103 -0
- scitex/io/_json2md.py +113 -0
- scitex/io/_load.py +168 -0
- scitex/io/_load_configs.py +146 -0
- scitex/io/_load_modules/__init__.py +38 -0
- scitex/io/_load_modules/_catboost.py +66 -0
- scitex/io/_load_modules/_con.py +20 -0
- scitex/io/_load_modules/_db.py +24 -0
- scitex/io/_load_modules/_docx.py +42 -0
- scitex/io/_load_modules/_eeg.py +110 -0
- scitex/io/_load_modules/_hdf5.py +196 -0
- scitex/io/_load_modules/_image.py +19 -0
- scitex/io/_load_modules/_joblib.py +19 -0
- scitex/io/_load_modules/_json.py +18 -0
- scitex/io/_load_modules/_markdown.py +103 -0
- scitex/io/_load_modules/_matlab.py +37 -0
- scitex/io/_load_modules/_numpy.py +39 -0
- scitex/io/_load_modules/_optuna.py +155 -0
- scitex/io/_load_modules/_pandas.py +69 -0
- scitex/io/_load_modules/_pdf.py +31 -0
- scitex/io/_load_modules/_pickle.py +24 -0
- scitex/io/_load_modules/_torch.py +16 -0
- scitex/io/_load_modules/_txt.py +126 -0
- scitex/io/_load_modules/_xml.py +49 -0
- scitex/io/_load_modules/_yaml.py +23 -0
- scitex/io/_mv_to_tmp.py +19 -0
- scitex/io/_path.py +286 -0
- scitex/io/_reload.py +78 -0
- scitex/io/_save.py +539 -0
- scitex/io/_save_modules/__init__.py +66 -0
- scitex/io/_save_modules/_catboost.py +22 -0
- scitex/io/_save_modules/_csv.py +89 -0
- scitex/io/_save_modules/_excel.py +49 -0
- scitex/io/_save_modules/_hdf5.py +249 -0
- scitex/io/_save_modules/_html.py +48 -0
- scitex/io/_save_modules/_image.py +140 -0
- scitex/io/_save_modules/_joblib.py +25 -0
- scitex/io/_save_modules/_json.py +25 -0
- scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
- scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
- scitex/io/_save_modules/_matlab.py +24 -0
- scitex/io/_save_modules/_mp4.py +29 -0
- scitex/io/_save_modules/_numpy.py +57 -0
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
- scitex/io/_save_modules/_pickle.py +45 -0
- scitex/io/_save_modules/_plotly.py +27 -0
- scitex/io/_save_modules/_text.py +23 -0
- scitex/io/_save_modules/_torch.py +26 -0
- scitex/io/_save_modules/_yaml.py +29 -0
- scitex/life/__init__.py +10 -0
- scitex/life/_monitor_rain.py +49 -0
- scitex/linalg/__init__.py +17 -0
- scitex/linalg/_distance.py +63 -0
- scitex/linalg/_geometric_median.py +64 -0
- scitex/linalg/_misc.py +73 -0
- scitex/nn/_AxiswiseDropout.py +27 -0
- scitex/nn/_BNet.py +126 -0
- scitex/nn/_BNet_Res.py +164 -0
- scitex/nn/_ChannelGainChanger.py +44 -0
- scitex/nn/_DropoutChannels.py +50 -0
- scitex/nn/_Filters.py +489 -0
- scitex/nn/_FreqGainChanger.py +110 -0
- scitex/nn/_GaussianFilter.py +48 -0
- scitex/nn/_Hilbert.py +111 -0
- scitex/nn/_MNet_1000.py +157 -0
- scitex/nn/_ModulationIndex.py +221 -0
- scitex/nn/_PAC.py +414 -0
- scitex/nn/_PSD.py +40 -0
- scitex/nn/_ResNet1D.py +120 -0
- scitex/nn/_SpatialAttention.py +25 -0
- scitex/nn/_Spectrogram.py +161 -0
- scitex/nn/_SwapChannels.py +50 -0
- scitex/nn/_TransposeLayer.py +19 -0
- scitex/nn/_Wavelet.py +183 -0
- scitex/nn/__init__.py +63 -0
- scitex/os/__init__.py +8 -0
- scitex/os/_mv.py +50 -0
- scitex/parallel/__init__.py +8 -0
- scitex/parallel/_run.py +151 -0
- scitex/path/__init__.py +33 -0
- scitex/path/_clean.py +52 -0
- scitex/path/_find.py +108 -0
- scitex/path/_get_module_path.py +51 -0
- scitex/path/_get_spath.py +35 -0
- scitex/path/_getsize.py +18 -0
- scitex/path/_increment_version.py +87 -0
- scitex/path/_mk_spath.py +51 -0
- scitex/path/_path.py +19 -0
- scitex/path/_split.py +23 -0
- scitex/path/_this_path.py +19 -0
- scitex/path/_version.py +101 -0
- scitex/pd/__init__.py +41 -0
- scitex/pd/_find_indi.py +126 -0
- scitex/pd/_find_pval.py +113 -0
- scitex/pd/_force_df.py +154 -0
- scitex/pd/_from_xyz.py +71 -0
- scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
- scitex/pd/_melt_cols.py +81 -0
- scitex/pd/_merge_columns.py +221 -0
- scitex/pd/_mv.py +63 -0
- scitex/pd/_replace.py +62 -0
- scitex/pd/_round.py +93 -0
- scitex/pd/_slice.py +63 -0
- scitex/pd/_sort.py +91 -0
- scitex/pd/_to_numeric.py +53 -0
- scitex/pd/_to_xy.py +59 -0
- scitex/pd/_to_xyz.py +110 -0
- scitex/plt/__init__.py +36 -0
- scitex/plt/_subplots/_AxesWrapper.py +182 -0
- scitex/plt/_subplots/_AxisWrapper.py +249 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
- scitex/plt/_subplots/_FigWrapper.py +226 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
- scitex/plt/_subplots/__init__.py +111 -0
- scitex/plt/_subplots/_export_as_csv.py +232 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
- scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
- scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
- scitex/plt/_tpl.py +28 -0
- scitex/plt/ax/__init__.py +114 -0
- scitex/plt/ax/_plot/__init__.py +53 -0
- scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
- scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
- scitex/plt/ax/_plot/_plot_cube.py +57 -0
- scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
- scitex/plt/ax/_plot/_plot_fillv.py +55 -0
- scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
- scitex/plt/ax/_plot/_plot_image.py +94 -0
- scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
- scitex/plt/ax/_plot/_plot_raster.py +172 -0
- scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
- scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
- scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
- scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
- scitex/plt/ax/_plot/_plot_violin.py +343 -0
- scitex/plt/ax/_style/__init__.py +38 -0
- scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
- scitex/plt/ax/_style/_add_panel.py +92 -0
- scitex/plt/ax/_style/_extend.py +64 -0
- scitex/plt/ax/_style/_force_aspect.py +37 -0
- scitex/plt/ax/_style/_format_label.py +23 -0
- scitex/plt/ax/_style/_hide_spines.py +84 -0
- scitex/plt/ax/_style/_map_ticks.py +182 -0
- scitex/plt/ax/_style/_rotate_labels.py +215 -0
- scitex/plt/ax/_style/_sci_note.py +279 -0
- scitex/plt/ax/_style/_set_log_scale.py +299 -0
- scitex/plt/ax/_style/_set_meta.py +261 -0
- scitex/plt/ax/_style/_set_n_ticks.py +37 -0
- scitex/plt/ax/_style/_set_size.py +16 -0
- scitex/plt/ax/_style/_set_supxyt.py +116 -0
- scitex/plt/ax/_style/_set_ticks.py +276 -0
- scitex/plt/ax/_style/_set_xyt.py +121 -0
- scitex/plt/ax/_style/_share_axes.py +264 -0
- scitex/plt/ax/_style/_shift.py +139 -0
- scitex/plt/ax/_style/_show_spines.py +333 -0
- scitex/plt/color/_PARAMS.py +70 -0
- scitex/plt/color/__init__.py +52 -0
- scitex/plt/color/_add_hue_col.py +41 -0
- scitex/plt/color/_colors.py +205 -0
- scitex/plt/color/_get_colors_from_cmap.py +134 -0
- scitex/plt/color/_interpolate.py +29 -0
- scitex/plt/color/_vizualize_colors.py +54 -0
- scitex/plt/utils/__init__.py +44 -0
- scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
- scitex/plt/utils/_calc_nice_ticks.py +101 -0
- scitex/plt/utils/_close.py +68 -0
- scitex/plt/utils/_colorbar.py +96 -0
- scitex/plt/utils/_configure_mpl.py +295 -0
- scitex/plt/utils/_histogram_utils.py +132 -0
- scitex/plt/utils/_im2grid.py +70 -0
- scitex/plt/utils/_is_valid_axis.py +78 -0
- scitex/plt/utils/_mk_colorbar.py +65 -0
- scitex/plt/utils/_mk_patches.py +26 -0
- scitex/plt/utils/_scientific_captions.py +638 -0
- scitex/plt/utils/_scitex_config.py +223 -0
- scitex/reproduce/__init__.py +14 -0
- scitex/reproduce/_fix_seeds.py +45 -0
- scitex/reproduce/_gen_ID.py +55 -0
- scitex/reproduce/_gen_timestamp.py +35 -0
- scitex/res/__init__.py +5 -0
- scitex/resource/__init__.py +13 -0
- scitex/resource/_get_processor_usages.py +281 -0
- scitex/resource/_get_specs.py +280 -0
- scitex/resource/_log_processor_usages.py +190 -0
- scitex/resource/_utils/__init__.py +31 -0
- scitex/resource/_utils/_get_env_info.py +481 -0
- scitex/resource/limit_ram.py +33 -0
- scitex/scholar/__init__.py +24 -0
- scitex/scholar/_local_search.py +454 -0
- scitex/scholar/_paper.py +244 -0
- scitex/scholar/_pdf_downloader.py +325 -0
- scitex/scholar/_search.py +393 -0
- scitex/scholar/_vector_search.py +370 -0
- scitex/scholar/_web_sources.py +457 -0
- scitex/stats/__init__.py +31 -0
- scitex/stats/_calc_partial_corr.py +17 -0
- scitex/stats/_corr_test_multi.py +94 -0
- scitex/stats/_corr_test_wrapper.py +115 -0
- scitex/stats/_describe_wrapper.py +90 -0
- scitex/stats/_multiple_corrections.py +63 -0
- scitex/stats/_nan_stats.py +93 -0
- scitex/stats/_p2stars.py +116 -0
- scitex/stats/_p2stars_wrapper.py +56 -0
- scitex/stats/_statistical_tests.py +73 -0
- scitex/stats/desc/__init__.py +40 -0
- scitex/stats/desc/_describe.py +189 -0
- scitex/stats/desc/_nan.py +289 -0
- scitex/stats/desc/_real.py +94 -0
- scitex/stats/multiple/__init__.py +14 -0
- scitex/stats/multiple/_bonferroni_correction.py +72 -0
- scitex/stats/multiple/_fdr_correction.py +400 -0
- scitex/stats/multiple/_multicompair.py +28 -0
- scitex/stats/tests/__corr_test.py +277 -0
- scitex/stats/tests/__corr_test_multi.py +343 -0
- scitex/stats/tests/__corr_test_single.py +277 -0
- scitex/stats/tests/__init__.py +22 -0
- scitex/stats/tests/_brunner_munzel_test.py +192 -0
- scitex/stats/tests/_nocorrelation_test.py +28 -0
- scitex/stats/tests/_smirnov_grubbs.py +98 -0
- scitex/str/__init__.py +113 -0
- scitex/str/_clean_path.py +75 -0
- scitex/str/_color_text.py +52 -0
- scitex/str/_decapitalize.py +58 -0
- scitex/str/_factor_out_digits.py +281 -0
- scitex/str/_format_plot_text.py +498 -0
- scitex/str/_grep.py +48 -0
- scitex/str/_latex.py +155 -0
- scitex/str/_latex_fallback.py +471 -0
- scitex/str/_mask_api.py +39 -0
- scitex/str/_mask_api_key.py +8 -0
- scitex/str/_parse.py +158 -0
- scitex/str/_print_block.py +47 -0
- scitex/str/_print_debug.py +68 -0
- scitex/str/_printc.py +62 -0
- scitex/str/_readable_bytes.py +38 -0
- scitex/str/_remove_ansi.py +23 -0
- scitex/str/_replace.py +134 -0
- scitex/str/_search.py +125 -0
- scitex/str/_squeeze_space.py +36 -0
- scitex/tex/__init__.py +10 -0
- scitex/tex/_preview.py +103 -0
- scitex/tex/_to_vec.py +116 -0
- scitex/torch/__init__.py +18 -0
- scitex/torch/_apply_to.py +34 -0
- scitex/torch/_nan_funcs.py +77 -0
- scitex/types/_ArrayLike.py +44 -0
- scitex/types/_ColorLike.py +21 -0
- scitex/types/__init__.py +14 -0
- scitex/types/_is_listed_X.py +70 -0
- scitex/utils/__init__.py +22 -0
- scitex/utils/_compress_hdf5.py +116 -0
- scitex/utils/_email.py +120 -0
- scitex/utils/_grid.py +148 -0
- scitex/utils/_notify.py +247 -0
- scitex/utils/_search.py +121 -0
- scitex/web/__init__.py +38 -0
- scitex/web/_search_pubmed.py +438 -0
- scitex/web/_summarize_url.py +158 -0
- scitex-2.0.0.dist-info/METADATA +307 -0
- scitex-2.0.0.dist-info/RECORD +572 -0
- scitex-2.0.0.dist-info/WHEEL +6 -0
- scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
- 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
|
+
]
|