scitex 2.0.0__py2.py3-none-any.whl → 2.1.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 +53 -15
- scitex/__main__.py +72 -26
- scitex/__version__.py +1 -1
- scitex/_sh.py +145 -23
- scitex/ai/__init__.py +30 -16
- scitex/ai/_gen_ai/_Anthropic.py +5 -7
- scitex/ai/_gen_ai/_BaseGenAI.py +2 -2
- scitex/ai/_gen_ai/_DeepSeek.py +10 -2
- scitex/ai/_gen_ai/_Google.py +2 -2
- scitex/ai/_gen_ai/_Llama.py +2 -2
- scitex/ai/_gen_ai/_OpenAI.py +2 -2
- scitex/ai/_gen_ai/_PARAMS.py +51 -65
- scitex/ai/_gen_ai/_Perplexity.py +2 -2
- scitex/ai/_gen_ai/__init__.py +25 -14
- scitex/ai/_gen_ai/_format_output_func.py +4 -4
- scitex/ai/classification/{classifier_server.py → Classifier.py} +5 -5
- scitex/ai/classification/CrossValidationExperiment.py +374 -0
- scitex/ai/classification/__init__.py +43 -4
- scitex/ai/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ai/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ai/classification/reporters/__init__.py +11 -0
- scitex/ai/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ai/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ai/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ai/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ai/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ai/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ai/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ai/classification/timeseries/__init__.py +39 -0
- scitex/ai/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ai/clustering/_umap.py +2 -2
- scitex/ai/feature_extraction/vit.py +1 -0
- scitex/ai/feature_selection/__init__.py +30 -0
- scitex/ai/feature_selection/feature_selection.py +364 -0
- scitex/ai/loss/multi_task_loss.py +1 -1
- scitex/ai/metrics/__init__.py +51 -4
- scitex/ai/metrics/_calc_bacc.py +61 -0
- scitex/ai/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ai/metrics/_calc_clf_report.py +78 -0
- scitex/ai/metrics/_calc_conf_mat.py +93 -0
- scitex/ai/metrics/_calc_feature_importance.py +183 -0
- scitex/ai/metrics/_calc_mcc.py +61 -0
- scitex/ai/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ai/metrics/_calc_roc_auc.py +110 -0
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ai/metrics/{silhoute_score_block.py → _calc_silhouette_score.py} +15 -8
- scitex/ai/metrics/_normalize_labels.py +83 -0
- scitex/ai/plt/__init__.py +47 -8
- scitex/ai/plt/{_conf_mat.py → _plot_conf_mat.py} +158 -87
- scitex/ai/plt/_plot_feature_importance.py +323 -0
- scitex/ai/plt/_plot_learning_curve.py +345 -0
- scitex/ai/plt/_plot_optuna_study.py +225 -0
- scitex/ai/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ai/plt/_plot_roc_curve.py +255 -0
- scitex/ai/training/{learning_curve_logger.py → _LearningCurveLogger.py} +197 -213
- scitex/ai/training/__init__.py +2 -2
- scitex/ai/utils/grid_search.py +3 -3
- scitex/benchmark/__init__.py +52 -0
- scitex/benchmark/benchmark.py +400 -0
- scitex/benchmark/monitor.py +370 -0
- scitex/benchmark/profiler.py +297 -0
- scitex/browser/__init__.py +48 -0
- scitex/browser/automation/CookieHandler.py +216 -0
- scitex/browser/automation/__init__.py +7 -0
- scitex/browser/collaboration/__init__.py +55 -0
- scitex/browser/collaboration/auth_helpers.py +94 -0
- scitex/browser/collaboration/collaborative_agent.py +136 -0
- scitex/browser/collaboration/credential_manager.py +188 -0
- scitex/browser/collaboration/interactive_panel.py +400 -0
- scitex/browser/collaboration/persistent_browser.py +170 -0
- scitex/browser/collaboration/shared_session.py +383 -0
- scitex/browser/collaboration/standard_interactions.py +246 -0
- scitex/browser/collaboration/visual_feedback.py +181 -0
- scitex/browser/core/BrowserMixin.py +326 -0
- scitex/browser/core/ChromeProfileManager.py +446 -0
- scitex/browser/core/__init__.py +9 -0
- scitex/browser/debugging/__init__.py +18 -0
- scitex/browser/debugging/_browser_logger.py +657 -0
- scitex/browser/debugging/_highlight_element.py +143 -0
- scitex/browser/debugging/_show_grid.py +154 -0
- scitex/browser/interaction/__init__.py +24 -0
- scitex/browser/interaction/click_center.py +149 -0
- scitex/browser/interaction/click_with_fallbacks.py +206 -0
- scitex/browser/interaction/close_popups.py +498 -0
- scitex/browser/interaction/fill_with_fallbacks.py +209 -0
- scitex/browser/pdf/__init__.py +14 -0
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +200 -0
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +198 -0
- scitex/browser/remote/CaptchaHandler.py +434 -0
- scitex/browser/remote/ZenRowsAPIClient.py +347 -0
- scitex/browser/remote/ZenRowsBrowserManager.py +570 -0
- scitex/browser/remote/__init__.py +11 -0
- scitex/browser/stealth/HumanBehavior.py +344 -0
- scitex/browser/stealth/StealthManager.py +1008 -0
- scitex/browser/stealth/__init__.py +9 -0
- scitex/browser/template.py +122 -0
- scitex/capture/__init__.py +110 -0
- scitex/capture/__main__.py +25 -0
- scitex/capture/capture.py +848 -0
- scitex/capture/cli.py +233 -0
- scitex/capture/gif.py +344 -0
- scitex/capture/mcp_server.py +961 -0
- scitex/capture/session.py +70 -0
- scitex/capture/utils.py +705 -0
- scitex/cli/__init__.py +17 -0
- scitex/cli/cloud.py +447 -0
- scitex/cli/main.py +42 -0
- scitex/cli/scholar.py +280 -0
- scitex/context/_suppress_output.py +5 -3
- scitex/db/__init__.py +30 -3
- scitex/db/__main__.py +75 -0
- scitex/db/_check_health.py +381 -0
- scitex/db/_delete_duplicates.py +25 -386
- scitex/db/_inspect.py +335 -114
- scitex/db/_inspect_optimized.py +301 -0
- scitex/db/{_PostgreSQL.py → _postgresql/_PostgreSQL.py} +3 -3
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BackupMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BatchMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BlobMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ConnectionMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_MaintenanceMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_QueryMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_SchemaMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TransactionMixin.py +1 -1
- scitex/db/_postgresql/__init__.py +6 -0
- scitex/db/_sqlite3/_SQLite3.py +210 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +581 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +517 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_BatchMixin.py +1 -1
- scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +281 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +548 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ConnectionMixin.py +29 -13
- scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ImportExportMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_IndexMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_MaintenanceMixin.py +2 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_QueryMixin.py +37 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_RowMixin.py +46 -6
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TableMixin.py +56 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TransactionMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/__init__.py +14 -2
- scitex/db/_sqlite3/__init__.py +7 -0
- scitex/db/_sqlite3/_delete_duplicates.py +274 -0
- scitex/decorators/__init__.py +2 -0
- scitex/decorators/_cache_disk.py +13 -5
- scitex/decorators/_cache_disk_async.py +49 -0
- scitex/decorators/_deprecated.py +175 -10
- scitex/decorators/_timeout.py +1 -1
- scitex/dev/_analyze_code_flow.py +2 -2
- scitex/dict/_DotDict.py +73 -15
- scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +442 -0
- scitex/dict/_DotDict_v02-not-serializing-Path-object.py +446 -0
- scitex/dict/__init__.py +2 -0
- scitex/dict/_flatten.py +27 -0
- scitex/dsp/_crop.py +2 -2
- scitex/dsp/_demo_sig.py +2 -2
- scitex/dsp/_detect_ripples.py +2 -2
- scitex/dsp/_hilbert.py +2 -2
- scitex/dsp/_listen.py +6 -6
- scitex/dsp/_modulation_index.py +2 -2
- scitex/dsp/_pac.py +1 -1
- scitex/dsp/_psd.py +2 -2
- scitex/dsp/_resample.py +2 -1
- scitex/dsp/_time.py +3 -2
- scitex/dsp/_wavelet.py +3 -2
- scitex/dsp/add_noise.py +2 -2
- scitex/dsp/example.py +1 -0
- scitex/dsp/filt.py +10 -9
- scitex/dsp/template.py +3 -2
- scitex/dsp/utils/_differential_bandpass_filters.py +1 -1
- scitex/dsp/utils/pac.py +2 -2
- scitex/dt/_normalize_timestamp.py +432 -0
- scitex/errors.py +572 -0
- scitex/gen/_DimHandler.py +2 -2
- scitex/gen/__init__.py +37 -7
- scitex/gen/_deprecated_close.py +80 -0
- scitex/gen/_deprecated_start.py +26 -0
- scitex/gen/_detect_environment.py +152 -0
- scitex/gen/_detect_notebook_path.py +169 -0
- scitex/gen/_embed.py +6 -2
- scitex/gen/_get_notebook_path.py +257 -0
- scitex/gen/_less.py +1 -1
- scitex/gen/_list_packages.py +2 -2
- scitex/gen/_norm.py +44 -9
- scitex/gen/_norm_cache.py +269 -0
- scitex/gen/_src.py +3 -5
- scitex/gen/_title_case.py +3 -3
- scitex/io/__init__.py +28 -6
- scitex/io/_glob.py +13 -7
- scitex/io/_load.py +108 -21
- scitex/io/_load_cache.py +303 -0
- scitex/io/_load_configs.py +40 -15
- scitex/io/{_H5Explorer.py → _load_modules/_H5Explorer.py} +80 -17
- scitex/io/_load_modules/_ZarrExplorer.py +114 -0
- scitex/io/_load_modules/_bibtex.py +207 -0
- scitex/io/_load_modules/_hdf5.py +53 -178
- scitex/io/_load_modules/_json.py +5 -3
- scitex/io/_load_modules/_pdf.py +871 -16
- scitex/io/_load_modules/_sqlite3.py +15 -0
- scitex/io/_load_modules/_txt.py +41 -12
- scitex/io/_load_modules/_yaml.py +4 -3
- scitex/io/_load_modules/_zarr.py +126 -0
- scitex/io/_save.py +429 -171
- scitex/io/_save_modules/__init__.py +6 -0
- scitex/io/_save_modules/_bibtex.py +194 -0
- scitex/io/_save_modules/_csv.py +8 -4
- scitex/io/_save_modules/_excel.py +174 -15
- scitex/io/_save_modules/_hdf5.py +251 -226
- scitex/io/_save_modules/_image.py +1 -3
- scitex/io/_save_modules/_json.py +49 -4
- scitex/io/_save_modules/_listed_dfs_as_csv.py +1 -3
- scitex/io/_save_modules/_listed_scalars_as_csv.py +1 -3
- scitex/io/_save_modules/_tex.py +277 -0
- scitex/io/_save_modules/_yaml.py +42 -3
- scitex/io/_save_modules/_zarr.py +160 -0
- scitex/io/utils/__init__.py +20 -0
- scitex/io/utils/h5_to_zarr.py +616 -0
- scitex/linalg/_geometric_median.py +6 -2
- scitex/{gen/_tee.py → logging/_Tee.py} +43 -84
- scitex/logging/__init__.py +122 -0
- scitex/logging/_config.py +158 -0
- scitex/logging/_context.py +103 -0
- scitex/logging/_formatters.py +128 -0
- scitex/logging/_handlers.py +64 -0
- scitex/logging/_levels.py +35 -0
- scitex/logging/_logger.py +163 -0
- scitex/logging/_print_capture.py +95 -0
- scitex/ml/__init__.py +69 -0
- scitex/{ai/genai/anthropic.py → ml/_gen_ai/_Anthropic.py} +13 -19
- scitex/{ai/genai/base_genai.py → ml/_gen_ai/_BaseGenAI.py} +5 -5
- scitex/{ai/genai/deepseek.py → ml/_gen_ai/_DeepSeek.py} +11 -16
- scitex/{ai/genai/google.py → ml/_gen_ai/_Google.py} +7 -15
- scitex/{ai/genai/groq.py → ml/_gen_ai/_Groq.py} +1 -8
- scitex/{ai/genai/llama.py → ml/_gen_ai/_Llama.py} +3 -16
- scitex/{ai/genai/openai.py → ml/_gen_ai/_OpenAI.py} +3 -3
- scitex/{ai/genai/params.py → ml/_gen_ai/_PARAMS.py} +51 -65
- scitex/{ai/genai/perplexity.py → ml/_gen_ai/_Perplexity.py} +3 -14
- scitex/ml/_gen_ai/__init__.py +43 -0
- scitex/{ai/genai/calc_cost.py → ml/_gen_ai/_calc_cost.py} +1 -1
- scitex/{ai/genai/format_output_func.py → ml/_gen_ai/_format_output_func.py} +4 -4
- scitex/{ai/genai/genai_factory.py → ml/_gen_ai/_genai_factory.py} +8 -8
- scitex/ml/activation/__init__.py +8 -0
- scitex/ml/activation/_define.py +11 -0
- scitex/{ai/classifier_server.py → ml/classification/Classifier.py} +5 -5
- scitex/ml/classification/CrossValidationExperiment.py +374 -0
- scitex/ml/classification/__init__.py +46 -0
- scitex/ml/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ml/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ml/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ml/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ml/classification/reporters/__init__.py +11 -0
- scitex/ml/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ml/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ml/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ml/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ml/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ml/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ml/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ml/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ml/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ml/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ml/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ml/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ml/classification/timeseries/__init__.py +39 -0
- scitex/ml/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ml/clustering/__init__.py +11 -0
- scitex/ml/clustering/_pca.py +115 -0
- scitex/ml/clustering/_umap.py +376 -0
- scitex/ml/feature_extraction/__init__.py +56 -0
- scitex/ml/feature_extraction/vit.py +149 -0
- scitex/ml/feature_selection/__init__.py +30 -0
- scitex/ml/feature_selection/feature_selection.py +364 -0
- scitex/ml/loss/_L1L2Losses.py +34 -0
- scitex/ml/loss/__init__.py +12 -0
- scitex/ml/loss/multi_task_loss.py +47 -0
- scitex/ml/metrics/__init__.py +56 -0
- scitex/ml/metrics/_calc_bacc.py +61 -0
- scitex/ml/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ml/metrics/_calc_clf_report.py +78 -0
- scitex/ml/metrics/_calc_conf_mat.py +93 -0
- scitex/ml/metrics/_calc_feature_importance.py +183 -0
- scitex/ml/metrics/_calc_mcc.py +61 -0
- scitex/ml/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ml/metrics/_calc_roc_auc.py +110 -0
- scitex/ml/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ml/metrics/_calc_silhouette_score.py +503 -0
- scitex/ml/metrics/_normalize_labels.py +83 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ml/optim/__init__.py +13 -0
- scitex/ml/optim/_get_set.py +31 -0
- scitex/ml/optim/_optimizers.py +71 -0
- scitex/ml/plt/__init__.py +60 -0
- scitex/ml/plt/_plot_conf_mat.py +663 -0
- scitex/ml/plt/_plot_feature_importance.py +323 -0
- scitex/ml/plt/_plot_learning_curve.py +345 -0
- scitex/ml/plt/_plot_optuna_study.py +225 -0
- scitex/ml/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ml/plt/_plot_roc_curve.py +255 -0
- scitex/ml/sk/__init__.py +11 -0
- scitex/ml/sk/_clf.py +58 -0
- scitex/ml/sk/_to_sktime.py +100 -0
- scitex/ml/sklearn/__init__.py +26 -0
- scitex/ml/sklearn/clf.py +58 -0
- scitex/ml/sklearn/to_sktime.py +100 -0
- scitex/{ai/training/early_stopping.py → ml/training/_EarlyStopping.py} +1 -2
- scitex/{ai → ml/training}/_LearningCurveLogger.py +198 -242
- scitex/ml/training/__init__.py +7 -0
- scitex/ml/utils/__init__.py +22 -0
- scitex/ml/utils/_check_params.py +50 -0
- scitex/ml/utils/_default_dataset.py +46 -0
- scitex/ml/utils/_format_samples_for_sktime.py +26 -0
- scitex/ml/utils/_label_encoder.py +134 -0
- scitex/ml/utils/_merge_labels.py +22 -0
- scitex/ml/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ml/utils/_under_sample.py +51 -0
- scitex/ml/utils/_verify_n_gpus.py +16 -0
- scitex/ml/utils/grid_search.py +148 -0
- scitex/nn/_BNet.py +15 -9
- scitex/nn/_Filters.py +2 -2
- scitex/nn/_ModulationIndex.py +2 -2
- scitex/nn/_PAC.py +1 -1
- scitex/nn/_Spectrogram.py +12 -3
- scitex/nn/__init__.py +9 -10
- scitex/path/__init__.py +18 -0
- scitex/path/_clean.py +4 -0
- scitex/path/_find.py +9 -4
- scitex/path/_symlink.py +348 -0
- scitex/path/_version.py +4 -3
- scitex/pd/__init__.py +2 -0
- scitex/pd/_get_unique.py +99 -0
- scitex/plt/__init__.py +114 -5
- scitex/plt/_subplots/_AxesWrapper.py +1 -3
- scitex/plt/_subplots/_AxisWrapper.py +7 -3
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +47 -13
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +160 -2
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +26 -4
- scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +322 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +1 -0
- scitex/plt/_subplots/_FigWrapper.py +62 -6
- scitex/plt/_subplots/_export_as_csv.py +43 -27
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +5 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +81 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +20 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +35 -18
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +15 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +35 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +6 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +60 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters.py +56 -59
- scitex/plt/ax/_style/_hide_spines.py +1 -3
- scitex/plt/ax/_style/_rotate_labels.py +180 -76
- scitex/plt/ax/_style/_rotate_labels_v01.py +248 -0
- scitex/plt/ax/_style/_set_meta.py +11 -4
- scitex/plt/ax/_style/_set_supxyt.py +3 -3
- scitex/plt/ax/_style/_set_xyt.py +3 -3
- scitex/plt/ax/_style/_share_axes.py +2 -2
- scitex/plt/color/__init__.py +4 -4
- scitex/plt/color/{_get_colors_from_cmap.py → _get_colors_from_conf_matap.py} +7 -7
- scitex/plt/utils/_configure_mpl.py +99 -86
- scitex/plt/utils/_histogram_utils.py +1 -3
- scitex/plt/utils/_is_valid_axis.py +1 -3
- scitex/plt/utils/_scitex_config.py +1 -0
- scitex/repro/__init__.py +75 -0
- scitex/{reproduce → repro}/_gen_ID.py +1 -1
- scitex/{reproduce → repro}/_gen_timestamp.py +1 -1
- scitex/repro_rng/_RandomStateManager.py +590 -0
- scitex/repro_rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/repro_rng/__init__.py +39 -0
- scitex/reproduce/__init__.py +25 -13
- scitex/reproduce/_hash_array.py +22 -0
- scitex/resource/_get_processor_usages.py +4 -4
- scitex/resource/_get_specs.py +2 -2
- scitex/resource/_log_processor_usages.py +2 -2
- scitex/rng/_RandomStateManager.py +590 -0
- scitex/rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/rng/__init__.py +39 -0
- scitex/scholar/__init__.py +309 -19
- scitex/scholar/__main__.py +319 -0
- scitex/scholar/auth/ScholarAuthManager.py +308 -0
- scitex/scholar/auth/__init__.py +12 -0
- scitex/scholar/auth/core/AuthenticationGateway.py +473 -0
- scitex/scholar/auth/core/BrowserAuthenticator.py +386 -0
- scitex/scholar/auth/core/StrategyResolver.py +309 -0
- scitex/scholar/auth/core/__init__.py +16 -0
- scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +120 -0
- scitex/scholar/auth/gateway/_OpenURLResolver.py +209 -0
- scitex/scholar/auth/gateway/__init__.py +38 -0
- scitex/scholar/auth/gateway/_resolve_functions.py +101 -0
- scitex/scholar/auth/providers/BaseAuthenticator.py +166 -0
- scitex/scholar/auth/providers/EZProxyAuthenticator.py +484 -0
- scitex/scholar/auth/providers/OpenAthensAuthenticator.py +619 -0
- scitex/scholar/auth/providers/ShibbolethAuthenticator.py +686 -0
- scitex/scholar/auth/providers/__init__.py +18 -0
- scitex/scholar/auth/session/AuthCacheManager.py +189 -0
- scitex/scholar/auth/session/SessionManager.py +159 -0
- scitex/scholar/auth/session/__init__.py +11 -0
- scitex/scholar/auth/sso/BaseSSOAutomator.py +373 -0
- scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +378 -0
- scitex/scholar/auth/sso/SSOAutomator.py +180 -0
- scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +380 -0
- scitex/scholar/auth/sso/__init__.py +15 -0
- scitex/scholar/browser/ScholarBrowserManager.py +705 -0
- scitex/scholar/browser/__init__.py +38 -0
- scitex/scholar/browser/utils/__init__.py +13 -0
- scitex/scholar/browser/utils/click_and_wait.py +205 -0
- scitex/scholar/browser/utils/close_unwanted_pages.py +140 -0
- scitex/scholar/browser/utils/wait_redirects.py +732 -0
- scitex/scholar/config/PublisherRules.py +132 -0
- scitex/scholar/config/ScholarConfig.py +126 -0
- scitex/scholar/config/__init__.py +17 -0
- scitex/scholar/core/Paper.py +627 -0
- scitex/scholar/core/Papers.py +722 -0
- scitex/scholar/core/Scholar.py +1975 -0
- scitex/scholar/core/__init__.py +9 -0
- scitex/scholar/impact_factor/ImpactFactorEngine.py +204 -0
- scitex/scholar/impact_factor/__init__.py +20 -0
- scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
- scitex/scholar/impact_factor/estimation/__init__.py +40 -0
- scitex/scholar/impact_factor/estimation/build_database.py +0 -0
- scitex/scholar/impact_factor/estimation/core/__init__.py +28 -0
- scitex/scholar/impact_factor/estimation/core/cache_manager.py +523 -0
- scitex/scholar/impact_factor/estimation/core/calculator.py +355 -0
- scitex/scholar/impact_factor/estimation/core/journal_matcher.py +428 -0
- scitex/scholar/integration/__init__.py +59 -0
- scitex/scholar/integration/base.py +502 -0
- scitex/scholar/integration/mendeley/__init__.py +22 -0
- scitex/scholar/integration/mendeley/exporter.py +166 -0
- scitex/scholar/integration/mendeley/importer.py +236 -0
- scitex/scholar/integration/mendeley/linker.py +79 -0
- scitex/scholar/integration/mendeley/mapper.py +212 -0
- scitex/scholar/integration/zotero/__init__.py +27 -0
- scitex/scholar/integration/zotero/__main__.py +264 -0
- scitex/scholar/integration/zotero/exporter.py +351 -0
- scitex/scholar/integration/zotero/importer.py +372 -0
- scitex/scholar/integration/zotero/linker.py +415 -0
- scitex/scholar/integration/zotero/mapper.py +286 -0
- scitex/scholar/metadata_engines/ScholarEngine.py +588 -0
- scitex/scholar/metadata_engines/__init__.py +21 -0
- scitex/scholar/metadata_engines/individual/ArXivEngine.py +397 -0
- scitex/scholar/metadata_engines/individual/CrossRefEngine.py +274 -0
- scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +263 -0
- scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +350 -0
- scitex/scholar/metadata_engines/individual/PubMedEngine.py +329 -0
- scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +438 -0
- scitex/scholar/metadata_engines/individual/URLDOIEngine.py +410 -0
- scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +487 -0
- scitex/scholar/metadata_engines/individual/__init__.py +7 -0
- scitex/scholar/metadata_engines/utils/_PubMedConverter.py +469 -0
- scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +283 -0
- scitex/scholar/metadata_engines/utils/__init__.py +30 -0
- scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +103 -0
- scitex/scholar/metadata_engines/utils/_standardize_metadata.py +376 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +579 -0
- scitex/scholar/pdf_download/__init__.py +5 -0
- scitex/scholar/pdf_download/strategies/__init__.py +38 -0
- scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +376 -0
- scitex/scholar/pdf_download/strategies/direct_download.py +131 -0
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +167 -0
- scitex/scholar/pdf_download/strategies/manual_download_utils.py +996 -0
- scitex/scholar/pdf_download/strategies/response_body.py +207 -0
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +364 -0
- scitex/scholar/pipelines/ScholarPipelineParallel.py +478 -0
- scitex/scholar/pipelines/ScholarPipelineSingle.py +767 -0
- scitex/scholar/pipelines/__init__.py +49 -0
- scitex/scholar/storage/BibTeXHandler.py +1018 -0
- scitex/scholar/storage/PaperIO.py +468 -0
- scitex/scholar/storage/ScholarLibrary.py +182 -0
- scitex/scholar/storage/_DeduplicationManager.py +548 -0
- scitex/scholar/storage/_LibraryCacheManager.py +724 -0
- scitex/scholar/storage/_LibraryManager.py +1835 -0
- scitex/scholar/storage/__init__.py +28 -0
- scitex/scholar/url_finder/ScholarURLFinder.py +379 -0
- scitex/scholar/url_finder/__init__.py +7 -0
- scitex/scholar/url_finder/strategies/__init__.py +33 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +261 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +67 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +204 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +256 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +165 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +163 -0
- scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +70 -0
- scitex/scholar/utils/__init__.py +22 -0
- scitex/scholar/utils/bibtex/__init__.py +9 -0
- scitex/scholar/utils/bibtex/_parse_bibtex.py +71 -0
- scitex/scholar/utils/cleanup/__init__.py +8 -0
- scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +96 -0
- scitex/scholar/utils/cleanup/cleanup_old_extractions.py +117 -0
- scitex/scholar/utils/text/_TextNormalizer.py +407 -0
- scitex/scholar/utils/text/__init__.py +9 -0
- scitex/scholar/zotero/__init__.py +38 -0
- scitex/session/__init__.py +51 -0
- scitex/session/_lifecycle.py +736 -0
- scitex/session/_manager.py +102 -0
- scitex/session/template.py +122 -0
- scitex/stats/__init__.py +30 -26
- scitex/stats/correct/__init__.py +21 -0
- scitex/stats/correct/_correct_bonferroni.py +551 -0
- scitex/stats/correct/_correct_fdr.py +634 -0
- scitex/stats/correct/_correct_holm.py +548 -0
- scitex/stats/correct/_correct_sidak.py +499 -0
- scitex/stats/descriptive/__init__.py +85 -0
- scitex/stats/descriptive/_circular.py +540 -0
- scitex/stats/descriptive/_describe.py +219 -0
- scitex/stats/descriptive/_nan.py +518 -0
- scitex/stats/descriptive/_real.py +189 -0
- scitex/stats/effect_sizes/__init__.py +41 -0
- scitex/stats/effect_sizes/_cliffs_delta.py +325 -0
- scitex/stats/effect_sizes/_cohens_d.py +342 -0
- scitex/stats/effect_sizes/_epsilon_squared.py +315 -0
- scitex/stats/effect_sizes/_eta_squared.py +302 -0
- scitex/stats/effect_sizes/_prob_superiority.py +296 -0
- scitex/stats/posthoc/__init__.py +19 -0
- scitex/stats/posthoc/_dunnett.py +463 -0
- scitex/stats/posthoc/_games_howell.py +383 -0
- scitex/stats/posthoc/_tukey_hsd.py +367 -0
- scitex/stats/power/__init__.py +19 -0
- scitex/stats/power/_power.py +433 -0
- scitex/stats/template.py +119 -0
- scitex/stats/utils/__init__.py +62 -0
- scitex/stats/utils/_effect_size.py +985 -0
- scitex/stats/utils/_formatters.py +270 -0
- scitex/stats/utils/_normalizers.py +927 -0
- scitex/stats/utils/_power.py +433 -0
- scitex/stats_v01/_EffectSizeCalculator.py +488 -0
- scitex/stats_v01/_StatisticalValidator.py +411 -0
- scitex/stats_v01/__init__.py +60 -0
- scitex/stats_v01/_additional_tests.py +415 -0
- scitex/{stats → stats_v01}/_p2stars.py +19 -5
- scitex/stats_v01/_two_sample_tests.py +141 -0
- scitex/stats_v01/desc/__init__.py +83 -0
- scitex/stats_v01/desc/_circular.py +540 -0
- scitex/stats_v01/desc/_describe.py +219 -0
- scitex/stats_v01/desc/_nan.py +518 -0
- scitex/{stats/desc/_nan.py → stats_v01/desc/_nan_v01-20250920_145731.py} +23 -12
- scitex/stats_v01/desc/_real.py +189 -0
- scitex/stats_v01/tests/__corr_test_optimized.py +221 -0
- scitex/stats_v01/tests/_corr_test_optimized.py +179 -0
- scitex/str/__init__.py +1 -3
- scitex/str/_clean_path.py +6 -2
- scitex/str/_latex_fallback.py +267 -160
- scitex/str/_parse.py +44 -36
- scitex/str/_printc.py +1 -3
- scitex/template/__init__.py +87 -0
- scitex/template/_create_project.py +267 -0
- scitex/template/create_pip_project.py +80 -0
- scitex/template/create_research.py +80 -0
- scitex/template/create_singularity.py +80 -0
- scitex/units.py +291 -0
- scitex/utils/_compress_hdf5.py +14 -3
- scitex/utils/_email.py +21 -2
- scitex/utils/_grid.py +6 -4
- scitex/utils/_notify.py +13 -10
- scitex/utils/_verify_scitex_format.py +589 -0
- scitex/utils/_verify_scitex_format_v01.py +370 -0
- scitex/utils/template.py +122 -0
- scitex/web/_search_pubmed.py +62 -16
- scitex-2.1.0.dist-info/LICENSE +21 -0
- scitex-2.1.0.dist-info/METADATA +677 -0
- scitex-2.1.0.dist-info/RECORD +919 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/WHEEL +1 -1
- scitex-2.1.0.dist-info/entry_points.txt +3 -0
- scitex/ai/__Classifiers.py +0 -101
- scitex/ai/classification/classification_reporter.py +0 -1137
- scitex/ai/classification/classifiers.py +0 -101
- scitex/ai/classification_reporter.py +0 -1161
- scitex/ai/genai/__init__.py +0 -277
- scitex/ai/genai/anthropic_provider.py +0 -320
- scitex/ai/genai/anthropic_refactored.py +0 -109
- scitex/ai/genai/auth_manager.py +0 -200
- scitex/ai/genai/base_provider.py +0 -291
- scitex/ai/genai/chat_history.py +0 -307
- scitex/ai/genai/cost_tracker.py +0 -276
- scitex/ai/genai/deepseek_provider.py +0 -251
- scitex/ai/genai/google_provider.py +0 -228
- scitex/ai/genai/groq_provider.py +0 -248
- scitex/ai/genai/image_processor.py +0 -250
- scitex/ai/genai/llama_provider.py +0 -214
- scitex/ai/genai/mock_provider.py +0 -127
- scitex/ai/genai/model_registry.py +0 -304
- scitex/ai/genai/openai_provider.py +0 -293
- scitex/ai/genai/perplexity_provider.py +0 -205
- scitex/ai/genai/provider_base.py +0 -302
- scitex/ai/genai/provider_factory.py +0 -370
- scitex/ai/genai/response_handler.py +0 -235
- scitex/ai/layer/_Pass.py +0 -21
- scitex/ai/layer/__init__.py +0 -10
- scitex/ai/layer/_switch.py +0 -8
- scitex/ai/metrics/_bACC.py +0 -51
- scitex/ai/plt/_learning_curve.py +0 -194
- scitex/ai/plt/_optuna_study.py +0 -111
- scitex/ai/plt/aucs/__init__.py +0 -2
- scitex/ai/plt/aucs/example.py +0 -60
- scitex/ai/plt/aucs/pre_rec_auc.py +0 -223
- scitex/ai/plt/aucs/roc_auc.py +0 -246
- scitex/ai/sampling/undersample.py +0 -29
- scitex/db/_SQLite3.py +0 -2136
- scitex/db/_SQLite3Mixins/_BlobMixin.py +0 -229
- scitex/gen/_close.py +0 -222
- scitex/gen/_start.py +0 -451
- scitex/general/__init__.py +0 -5
- scitex/io/_load_modules/_db.py +0 -24
- scitex/life/__init__.py +0 -10
- scitex/life/_monitor_rain.py +0 -49
- scitex/reproduce/_fix_seeds.py +0 -45
- scitex/res/__init__.py +0 -5
- scitex/scholar/_local_search.py +0 -454
- scitex/scholar/_paper.py +0 -244
- scitex/scholar/_pdf_downloader.py +0 -325
- scitex/scholar/_search.py +0 -393
- scitex/scholar/_vector_search.py +0 -370
- scitex/scholar/_web_sources.py +0 -457
- scitex/stats/desc/__init__.py +0 -40
- scitex-2.0.0.dist-info/METADATA +0 -307
- scitex-2.0.0.dist-info/RECORD +0 -572
- scitex-2.0.0.dist-info/licenses/LICENSE +0 -7
- /scitex/ai/{act → activation}/__init__.py +0 -0
- /scitex/ai/{act → activation}/_define.py +0 -0
- /scitex/ai/{early_stopping.py → training/_EarlyStopping.py} +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ImportExportMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_IndexMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_RowMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TableMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/__init__.py +0 -0
- /scitex/{stats → stats_v01}/_calc_partial_corr.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_describe_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_multiple_corrections.py +0 -0
- /scitex/{stats → stats_v01}/_nan_stats.py +0 -0
- /scitex/{stats → stats_v01}/_p2stars_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_statistical_tests.py +0 -0
- /scitex/{stats/desc/_describe.py → stats_v01/desc/_describe_v01-20250920_145731.py} +0 -0
- /scitex/{stats/desc/_real.py → stats_v01/desc/_real_v01-20250920_145731.py} +0 -0
- /scitex/{stats → stats_v01}/multiple/__init__.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_bonferroni_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_fdr_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_multicompair.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_single.py +0 -0
- /scitex/{stats → stats_v01}/tests/__init__.py +0 -0
- /scitex/{stats → stats_v01}/tests/_brunner_munzel_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_nocorrelation_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_smirnov_grubbs.py +0 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-10-02 19:44:13 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/ml/plt/plot_roc_curve.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
import os
|
|
8
|
+
__FILE__ = __file__
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import argparse
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
import scitex
|
|
16
|
+
from scitex.plt.color import get_colors_from_conf_matap
|
|
17
|
+
from sklearn.metrics import roc_auc_score, roc_curve
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _to_onehot(class_indices, n_classes):
|
|
21
|
+
"""Convert class indices to one-hot encoding."""
|
|
22
|
+
eye = np.eye(n_classes, dtype=int)
|
|
23
|
+
return eye[class_indices]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def plot_roc_curve(true_class, pred_proba, labels, ax=None, spath=None):
|
|
27
|
+
"""
|
|
28
|
+
Plot ROC-AUC curve.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
true_class : array-like
|
|
33
|
+
True class labels
|
|
34
|
+
pred_proba : array-like
|
|
35
|
+
Predicted probabilities
|
|
36
|
+
labels : list
|
|
37
|
+
Class labels
|
|
38
|
+
ax : matplotlib axis, optional
|
|
39
|
+
Axis to plot on. If None, creates new figure
|
|
40
|
+
spath : str, optional
|
|
41
|
+
Path to save figure
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
fig : matplotlib.figure.Figure
|
|
46
|
+
Figure object
|
|
47
|
+
metrics : dict
|
|
48
|
+
ROC metrics
|
|
49
|
+
"""
|
|
50
|
+
import scitex as stx
|
|
51
|
+
|
|
52
|
+
# Use label_binarize to be multi-label like settings
|
|
53
|
+
n_classes = len(labels)
|
|
54
|
+
|
|
55
|
+
# Handle 1D pred_proba (binary classification with only positive class probabilities)
|
|
56
|
+
if pred_proba.ndim == 1:
|
|
57
|
+
# Convert to 2D: [P(class=0), P(class=1)]
|
|
58
|
+
pred_proba = np.column_stack([1 - pred_proba, pred_proba])
|
|
59
|
+
|
|
60
|
+
# Convert string labels to integer indices if needed
|
|
61
|
+
if true_class.dtype.kind in ('U', 'S', 'O'): # Unicode, bytes, or object (string)
|
|
62
|
+
label_to_idx = {label: idx for idx, label in enumerate(labels)}
|
|
63
|
+
true_class_idx = np.array([label_to_idx[tc] for tc in true_class])
|
|
64
|
+
else:
|
|
65
|
+
true_class_idx = true_class
|
|
66
|
+
|
|
67
|
+
true_class_onehot = _to_onehot(true_class_idx, n_classes)
|
|
68
|
+
|
|
69
|
+
# For each class
|
|
70
|
+
fpr = dict()
|
|
71
|
+
tpr = dict()
|
|
72
|
+
threshold = dict()
|
|
73
|
+
roc_auc = dict()
|
|
74
|
+
for i in range(n_classes):
|
|
75
|
+
true_class_i_onehot = true_class_onehot[:, i]
|
|
76
|
+
pred_proba_i = pred_proba[:, i]
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
fpr[i], tpr[i], threshold[i] = roc_curve(
|
|
80
|
+
true_class_i_onehot, pred_proba_i
|
|
81
|
+
)
|
|
82
|
+
roc_auc[i] = roc_auc_score(true_class_i_onehot, pred_proba_i)
|
|
83
|
+
except Exception as e:
|
|
84
|
+
print(e)
|
|
85
|
+
fpr[i], tpr[i], threshold[i], roc_auc[i] = (
|
|
86
|
+
[np.nan],
|
|
87
|
+
[np.nan],
|
|
88
|
+
[np.nan],
|
|
89
|
+
np.nan,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
## Average fpr: micro and macro
|
|
93
|
+
|
|
94
|
+
# A "micro-average": quantifying score on all classes jointly
|
|
95
|
+
fpr["micro"], tpr["micro"], threshold["micro"] = roc_curve(
|
|
96
|
+
true_class_onehot.ravel(), pred_proba.ravel()
|
|
97
|
+
)
|
|
98
|
+
roc_auc["micro"] = roc_auc_score(
|
|
99
|
+
true_class_onehot, pred_proba, average="micro"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# macro
|
|
103
|
+
_roc_aucs = []
|
|
104
|
+
for i in range(n_classes):
|
|
105
|
+
try:
|
|
106
|
+
_roc_aucs.append(
|
|
107
|
+
roc_auc_score(
|
|
108
|
+
true_class_onehot[:, i], pred_proba[:, i], average="macro"
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
except Exception as e:
|
|
112
|
+
print(
|
|
113
|
+
f'\nROC-AUC for "{labels[i]}" was not defined and NaN-filled '
|
|
114
|
+
"for a calculation purpose (for the macro avg.)\n"
|
|
115
|
+
)
|
|
116
|
+
_roc_aucs.append(np.nan)
|
|
117
|
+
roc_auc["macro"] = np.nanmean(_roc_aucs)
|
|
118
|
+
|
|
119
|
+
# Plot FPR-TPR curve for each class and iso-f1 curves
|
|
120
|
+
# Use scitex color palette for consistent styling
|
|
121
|
+
colors = get_colors_from_conf_matap("tab10", n_classes)
|
|
122
|
+
|
|
123
|
+
if ax is None:
|
|
124
|
+
fig, ax = stx.plt.subplots()
|
|
125
|
+
else:
|
|
126
|
+
fig = ax.get_figure()
|
|
127
|
+
ax.set_box_aspect(1)
|
|
128
|
+
lines = []
|
|
129
|
+
legends = []
|
|
130
|
+
|
|
131
|
+
## Chance Level (the diagonal line)
|
|
132
|
+
(l,) = ax.plot(
|
|
133
|
+
np.linspace(0.01, 1),
|
|
134
|
+
np.linspace(0.01, 1),
|
|
135
|
+
color="gray",
|
|
136
|
+
lw=2,
|
|
137
|
+
linestyle="--",
|
|
138
|
+
alpha=0.8,
|
|
139
|
+
)
|
|
140
|
+
lines.append(l)
|
|
141
|
+
legends.append("Chance")
|
|
142
|
+
|
|
143
|
+
## Each Class
|
|
144
|
+
for i in range(n_classes):
|
|
145
|
+
(l,) = ax.plot(fpr[i], tpr[i], color=colors[i], lw=2)
|
|
146
|
+
lines.append(l)
|
|
147
|
+
legends.append("{0} (AUC = {1:0.2f})" "".format(labels[i], roc_auc[i]))
|
|
148
|
+
|
|
149
|
+
# fig = plt.gcf()
|
|
150
|
+
fig.subplots_adjust(bottom=0.25)
|
|
151
|
+
ax.set_xlim([-0.01, 1.01])
|
|
152
|
+
ax.set_ylim([-0.01, 1.01])
|
|
153
|
+
ax.set_xticks([0.0, 0.5, 1.0])
|
|
154
|
+
ax.set_yticks([0.0, 0.5, 1.0])
|
|
155
|
+
ax.set_xlabel("FPR")
|
|
156
|
+
ax.set_ylabel("TPR")
|
|
157
|
+
ax.set_title("ROC Curve")
|
|
158
|
+
ax.legend(lines, legends, loc="lower right")
|
|
159
|
+
|
|
160
|
+
metrics = dict(roc_auc=roc_auc, fpr=fpr, tpr=tpr, threshold=threshold)
|
|
161
|
+
|
|
162
|
+
# Save figure if spath is provided
|
|
163
|
+
if spath is not None:
|
|
164
|
+
from pathlib import Path
|
|
165
|
+
# Resolve to absolute path to prevent _out directory creation
|
|
166
|
+
spath_abs = Path(spath).resolve() if isinstance(spath, (str, Path)) else spath
|
|
167
|
+
scitex.io.save(fig, str(spath_abs), use_caller_path=False)
|
|
168
|
+
|
|
169
|
+
return fig, metrics
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def main(args):
|
|
173
|
+
"""Demo ROC AUC plotting with MNIST dataset."""
|
|
174
|
+
import matplotlib.pyplot as plt
|
|
175
|
+
from sklearn import datasets, svm
|
|
176
|
+
from sklearn.model_selection import train_test_split
|
|
177
|
+
|
|
178
|
+
np.random.seed(42)
|
|
179
|
+
|
|
180
|
+
digits = datasets.load_digits()
|
|
181
|
+
n_samples = len(digits.images)
|
|
182
|
+
data = digits.images.reshape((n_samples, -1))
|
|
183
|
+
|
|
184
|
+
clf = svm.SVC(gamma=0.001, probability=True)
|
|
185
|
+
|
|
186
|
+
X_train, X_test, y_train, y_test = train_test_split(
|
|
187
|
+
data, digits.target, test_size=0.5, shuffle=False
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
clf.fit(X_train, y_train)
|
|
191
|
+
predicted_proba = clf.predict_proba(X_test)
|
|
192
|
+
|
|
193
|
+
n_classes = len(np.unique(digits.target))
|
|
194
|
+
labels = ["Class {}".format(i) for i in range(n_classes)]
|
|
195
|
+
|
|
196
|
+
# plt.rcParams["font.size"] = 20
|
|
197
|
+
# plt.rcParams["legend.fontsize"] = "xx-small"
|
|
198
|
+
# plt.rcParams["figure.figsize"] = (16 * 1.2, 9 * 1.2)
|
|
199
|
+
|
|
200
|
+
y_test[y_test == 9] = 8 # override 9 as 8
|
|
201
|
+
|
|
202
|
+
fig, metrics_dict = plot_roc_curve(
|
|
203
|
+
true_class=y_test, pred_proba=predicted_proba, labels=labels
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
scitex.io.save(fig, "plot_roc_curve_demo.jpg")
|
|
207
|
+
return 0
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def parse_args() -> argparse.Namespace:
|
|
211
|
+
"""Parse command line arguments."""
|
|
212
|
+
parser = argparse.ArgumentParser(description="Demo ROC AUC plotting")
|
|
213
|
+
return parser.parse_args()
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def run_main() -> None:
|
|
217
|
+
"""Initialize scitex framework, run main function, and cleanup."""
|
|
218
|
+
global CONFIG, CC, sys, plt, rng
|
|
219
|
+
|
|
220
|
+
import sys
|
|
221
|
+
|
|
222
|
+
import matplotlib.pyplot as plt
|
|
223
|
+
import scitex as stx
|
|
224
|
+
|
|
225
|
+
args = parse_args()
|
|
226
|
+
|
|
227
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
|
|
228
|
+
sys,
|
|
229
|
+
plt,
|
|
230
|
+
args=args,
|
|
231
|
+
file=__FILE__,
|
|
232
|
+
sdir_suffix=None,
|
|
233
|
+
verbose=False,
|
|
234
|
+
agg=True,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
exit_status = main(args)
|
|
238
|
+
|
|
239
|
+
stx.session.close(
|
|
240
|
+
CONFIG,
|
|
241
|
+
verbose=False,
|
|
242
|
+
notify=False,
|
|
243
|
+
message="",
|
|
244
|
+
exit_status=exit_status,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
if __name__ == "__main__":
|
|
249
|
+
run_main()
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
# Backward compatibility alias
|
|
253
|
+
roc_auc = plot_roc_curve
|
|
254
|
+
|
|
255
|
+
# EOF
|
scitex/ml/sk/__init__.py
ADDED
scitex/ml/sk/_clf.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-03-23 17:36:05 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
from sklearn.decomposition import PCA
|
|
7
|
+
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
|
|
8
|
+
from sklearn.feature_selection import SelectKBest, f_classif
|
|
9
|
+
from sklearn.linear_model import LogisticRegression, RidgeClassifierCV
|
|
10
|
+
from sklearn.pipeline import make_pipeline
|
|
11
|
+
from sklearn.svm import SVC, LinearSVC
|
|
12
|
+
from sktime.classification.deep_learning.cnn import CNNClassifier
|
|
13
|
+
from sktime.classification.deep_learning.inceptiontime import (
|
|
14
|
+
InceptionTimeClassifier,
|
|
15
|
+
)
|
|
16
|
+
from sktime.classification.deep_learning.lstmfcn import LSTMFCNClassifier
|
|
17
|
+
from sktime.classification.dummy import DummyClassifier
|
|
18
|
+
from sktime.classification.feature_based import TSFreshClassifier
|
|
19
|
+
from sktime.classification.hybrid import HIVECOTEV2
|
|
20
|
+
from sktime.classification.interval_based import TimeSeriesForestClassifier
|
|
21
|
+
from sktime.classification.kernel_based import RocketClassifier, TimeSeriesSVC
|
|
22
|
+
from sktime.transformations.panel.reduce import Tabularizer
|
|
23
|
+
from sktime.transformations.panel.rocket import Rocket
|
|
24
|
+
|
|
25
|
+
# _rocket_pipeline = make_pipeline(
|
|
26
|
+
# Rocket(n_jobs=-1),
|
|
27
|
+
# RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
|
|
28
|
+
# )
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# def rocket_pipeline(*args, **kwargs):
|
|
32
|
+
# return _rocket_pipeline
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def rocket_pipeline(*args, **kwargs):
|
|
36
|
+
return make_pipeline(
|
|
37
|
+
Rocket(*args, **kwargs),
|
|
38
|
+
LogisticRegression(
|
|
39
|
+
max_iter=1000
|
|
40
|
+
), # Increase max_iter if needed for convergence
|
|
41
|
+
# RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
|
|
42
|
+
# SVC(probability=True, kernel="linear"),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# def rocket_pipeline(*args, **kwargs):
|
|
47
|
+
# return make_pipeline(
|
|
48
|
+
# Rocket(*args, **kwargs),
|
|
49
|
+
# SelectKBest(f_classif, k=500),
|
|
50
|
+
# PCA(n_components=100),
|
|
51
|
+
# LinearSVC(dual=False, tol=1e-3, C=0.1, probability=True),
|
|
52
|
+
# )
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
GB_pipeline = make_pipeline(
|
|
56
|
+
Tabularizer(),
|
|
57
|
+
GradientBoostingClassifier(),
|
|
58
|
+
)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-03-05 13:17:04 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
# import warnings
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import pandas as pd
|
|
9
|
+
import torch
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def to_sktime_df(X):
|
|
13
|
+
"""
|
|
14
|
+
Converts a dataset to a format compatible with sktime, encapsulating each sample as a pandas DataFrame.
|
|
15
|
+
|
|
16
|
+
Arguments:
|
|
17
|
+
- X (numpy.ndarray or torch.Tensor or pandas.DataFrame): The input dataset with shape (n_samples, n_chs, seq_len).
|
|
18
|
+
It should be a 3D array-like structure containing the time series data.
|
|
19
|
+
|
|
20
|
+
Return:
|
|
21
|
+
- sktime_df (pandas.DataFrame): A DataFrame where each element is a pandas Series representing a univariate time series.
|
|
22
|
+
|
|
23
|
+
Data Types and Shapes:
|
|
24
|
+
- If X is a numpy.ndarray, it should have the shape (n_samples, n_chs, seq_len).
|
|
25
|
+
- If X is a torch.Tensor, it should have the shape (n_samples, n_chs, seq_len) and will be converted to a numpy array.
|
|
26
|
+
- If X is a pandas.DataFrame, it is assumed to already be in the correct format and will be returned as is.
|
|
27
|
+
|
|
28
|
+
References:
|
|
29
|
+
- sktime: https://github.com/alan-turing-institute/sktime
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
--------
|
|
33
|
+
>>> X_np = np.random.rand(64, 160, 1024)
|
|
34
|
+
>>> sktime_df = to_sktime_df(X_np)
|
|
35
|
+
>>> type(sktime_df)
|
|
36
|
+
<class 'pandas.core.frame.DataFrame'>
|
|
37
|
+
"""
|
|
38
|
+
if isinstance(X, pd.DataFrame):
|
|
39
|
+
return X
|
|
40
|
+
elif torch.is_tensor(X):
|
|
41
|
+
X = X.numpy()
|
|
42
|
+
elif not isinstance(X, np.ndarray):
|
|
43
|
+
raise ValueError(
|
|
44
|
+
"Input X must be a numpy.ndarray, torch.Tensor, or pandas.DataFrame"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
X = X.astype(np.float64)
|
|
48
|
+
|
|
49
|
+
def _format_a_sample_for_sktime(x):
|
|
50
|
+
"""
|
|
51
|
+
Formats a single sample for sktime compatibility.
|
|
52
|
+
|
|
53
|
+
Arguments:
|
|
54
|
+
- x (numpy.ndarray): A 2D array with shape (n_chs, seq_len) representing a single sample.
|
|
55
|
+
|
|
56
|
+
Return:
|
|
57
|
+
- dims (pandas.Series): A Series where each element is a pandas Series representing a univariate time series.
|
|
58
|
+
"""
|
|
59
|
+
return pd.Series([pd.Series(x[d], name=f"dim_{d}") for d in range(x.shape[0])])
|
|
60
|
+
|
|
61
|
+
sktime_df = pd.DataFrame(
|
|
62
|
+
[_format_a_sample_for_sktime(X[i]) for i in range(X.shape[0])]
|
|
63
|
+
)
|
|
64
|
+
return sktime_df
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# # Obsolete warning for future compatibility
|
|
68
|
+
# def to_sktime(*args, **kwargs):
|
|
69
|
+
# warnings.warn(
|
|
70
|
+
# "to_sktime is deprecated; use to_sktime_df instead.", FutureWarning
|
|
71
|
+
# )
|
|
72
|
+
# return to_sktime_df(*args, **kwargs)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# import pandas as pd
|
|
76
|
+
# import numpy as np
|
|
77
|
+
# import torch
|
|
78
|
+
|
|
79
|
+
# def to_sktime(X):
|
|
80
|
+
# """
|
|
81
|
+
# X.shape: (n_samples, n_chs, seq_len)
|
|
82
|
+
# """
|
|
83
|
+
|
|
84
|
+
# def _format_a_sample_for_sktime(x):
|
|
85
|
+
# """
|
|
86
|
+
# x.shape: (n_chs, seq_len)
|
|
87
|
+
# """
|
|
88
|
+
# dims = pd.Series(
|
|
89
|
+
# [pd.Series(x[d], name=f"dim_{d}") for d in range(len(x))],
|
|
90
|
+
# index=[f"dim_{i}" for i in np.arange(len(x))],
|
|
91
|
+
# )
|
|
92
|
+
# return dims
|
|
93
|
+
|
|
94
|
+
# if torch.is_tensor(X):
|
|
95
|
+
# X = X.numpy()
|
|
96
|
+
# X = X.astype(np.float64)
|
|
97
|
+
|
|
98
|
+
# return pd.DataFrame(
|
|
99
|
+
# [_format_a_sample_for_sktime(X[i]) for i in range(len(X))]
|
|
100
|
+
# )
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Sklearn wrappers and utilities."""
|
|
3
|
+
|
|
4
|
+
import warnings
|
|
5
|
+
|
|
6
|
+
try:
|
|
7
|
+
from .clf import *
|
|
8
|
+
except ImportError as e:
|
|
9
|
+
warnings.warn(
|
|
10
|
+
f"Could not import clf from scitex.ai.sklearn: {str(e)}. "
|
|
11
|
+
f"Some functionality may be unavailable. "
|
|
12
|
+
f"Consider installing missing dependencies if you need this module.",
|
|
13
|
+
ImportWarning,
|
|
14
|
+
stacklevel=2
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from .to_sktime import *
|
|
19
|
+
except ImportError as e:
|
|
20
|
+
warnings.warn(
|
|
21
|
+
f"Could not import to_sktime from scitex.ai.sklearn: {str(e)}. "
|
|
22
|
+
f"Some functionality may be unavailable. "
|
|
23
|
+
f"Consider installing missing dependencies if you need this module.",
|
|
24
|
+
ImportWarning,
|
|
25
|
+
stacklevel=2
|
|
26
|
+
)
|
scitex/ml/sklearn/clf.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-03-23 17:36:05 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
from sklearn.decomposition import PCA
|
|
7
|
+
from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier
|
|
8
|
+
from sklearn.feature_selection import SelectKBest, f_classif
|
|
9
|
+
from sklearn.linear_model import LogisticRegression, RidgeClassifierCV
|
|
10
|
+
from sklearn.pipeline import make_pipeline
|
|
11
|
+
from sklearn.svm import SVC, LinearSVC
|
|
12
|
+
from sktime.classification.deep_learning.cnn import CNNClassifier
|
|
13
|
+
from sktime.classification.deep_learning.inceptiontime import (
|
|
14
|
+
InceptionTimeClassifier,
|
|
15
|
+
)
|
|
16
|
+
from sktime.classification.deep_learning.lstmfcn import LSTMFCNClassifier
|
|
17
|
+
from sktime.classification.dummy import DummyClassifier
|
|
18
|
+
from sktime.classification.feature_based import TSFreshClassifier
|
|
19
|
+
from sktime.classification.hybrid import HIVECOTEV2
|
|
20
|
+
from sktime.classification.interval_based import TimeSeriesForestClassifier
|
|
21
|
+
from sktime.classification.kernel_based import RocketClassifier, TimeSeriesSVC
|
|
22
|
+
from sktime.transformations.panel.reduce import Tabularizer
|
|
23
|
+
from sktime.transformations.panel.rocket import Rocket
|
|
24
|
+
|
|
25
|
+
# _rocket_pipeline = make_pipeline(
|
|
26
|
+
# Rocket(n_jobs=-1),
|
|
27
|
+
# RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
|
|
28
|
+
# )
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# def rocket_pipeline(*args, **kwargs):
|
|
32
|
+
# return _rocket_pipeline
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def rocket_pipeline(*args, **kwargs):
|
|
36
|
+
return make_pipeline(
|
|
37
|
+
Rocket(*args, **kwargs),
|
|
38
|
+
LogisticRegression(
|
|
39
|
+
max_iter=1000
|
|
40
|
+
), # Increase max_iter if needed for convergence
|
|
41
|
+
# RidgeClassifierCV(alphas=np.logspace(-3, 3, 10)),
|
|
42
|
+
# SVC(probability=True, kernel="linear"),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# def rocket_pipeline(*args, **kwargs):
|
|
47
|
+
# return make_pipeline(
|
|
48
|
+
# Rocket(*args, **kwargs),
|
|
49
|
+
# SelectKBest(f_classif, k=500),
|
|
50
|
+
# PCA(n_components=100),
|
|
51
|
+
# LinearSVC(dual=False, tol=1e-3, C=0.1, probability=True),
|
|
52
|
+
# )
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
GB_pipeline = make_pipeline(
|
|
56
|
+
Tabularizer(),
|
|
57
|
+
GradientBoostingClassifier(),
|
|
58
|
+
)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-03-05 13:17:04 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
# import warnings
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import pandas as pd
|
|
9
|
+
import torch
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def to_sktime_df(X):
|
|
13
|
+
"""
|
|
14
|
+
Converts a dataset to a format compatible with sktime, encapsulating each sample as a pandas DataFrame.
|
|
15
|
+
|
|
16
|
+
Arguments:
|
|
17
|
+
- X (numpy.ndarray or torch.Tensor or pandas.DataFrame): The input dataset with shape (n_samples, n_chs, seq_len).
|
|
18
|
+
It should be a 3D array-like structure containing the time series data.
|
|
19
|
+
|
|
20
|
+
Return:
|
|
21
|
+
- sktime_df (pandas.DataFrame): A DataFrame where each element is a pandas Series representing a univariate time series.
|
|
22
|
+
|
|
23
|
+
Data Types and Shapes:
|
|
24
|
+
- If X is a numpy.ndarray, it should have the shape (n_samples, n_chs, seq_len).
|
|
25
|
+
- If X is a torch.Tensor, it should have the shape (n_samples, n_chs, seq_len) and will be converted to a numpy array.
|
|
26
|
+
- If X is a pandas.DataFrame, it is assumed to already be in the correct format and will be returned as is.
|
|
27
|
+
|
|
28
|
+
References:
|
|
29
|
+
- sktime: https://github.com/alan-turing-institute/sktime
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
--------
|
|
33
|
+
>>> X_np = np.random.rand(64, 160, 1024)
|
|
34
|
+
>>> sktime_df = to_sktime_df(X_np)
|
|
35
|
+
>>> type(sktime_df)
|
|
36
|
+
<class 'pandas.core.frame.DataFrame'>
|
|
37
|
+
"""
|
|
38
|
+
if isinstance(X, pd.DataFrame):
|
|
39
|
+
return X
|
|
40
|
+
elif torch.is_tensor(X):
|
|
41
|
+
X = X.detach().numpy()
|
|
42
|
+
elif not isinstance(X, np.ndarray):
|
|
43
|
+
raise ValueError(
|
|
44
|
+
"Input X must be a numpy.ndarray, torch.Tensor, or pandas.DataFrame"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
X = X.astype(np.float64)
|
|
48
|
+
|
|
49
|
+
def _format_a_sample_for_sktime(x):
|
|
50
|
+
"""
|
|
51
|
+
Formats a single sample for sktime compatibility.
|
|
52
|
+
|
|
53
|
+
Arguments:
|
|
54
|
+
- x (numpy.ndarray): A 2D array with shape (n_chs, seq_len) representing a single sample.
|
|
55
|
+
|
|
56
|
+
Return:
|
|
57
|
+
- dims (pandas.Series): A Series where each element is a pandas Series representing a univariate time series.
|
|
58
|
+
"""
|
|
59
|
+
return pd.Series([pd.Series(x[d], name=f"dim_{d}") for d in range(x.shape[0])])
|
|
60
|
+
|
|
61
|
+
sktime_df = pd.DataFrame(
|
|
62
|
+
[_format_a_sample_for_sktime(X[i]) for i in range(X.shape[0])]
|
|
63
|
+
)
|
|
64
|
+
return sktime_df
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# # Obsolete warning for future compatibility
|
|
68
|
+
# def to_sktime(*args, **kwargs):
|
|
69
|
+
# warnings.warn(
|
|
70
|
+
# "to_sktime is deprecated; use to_sktime_df instead.", FutureWarning
|
|
71
|
+
# )
|
|
72
|
+
# return to_sktime_df(*args, **kwargs)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# import pandas as pd
|
|
76
|
+
# import numpy as np
|
|
77
|
+
# import torch
|
|
78
|
+
|
|
79
|
+
# def to_sktime(X):
|
|
80
|
+
# """
|
|
81
|
+
# X.shape: (n_samples, n_chs, seq_len)
|
|
82
|
+
# """
|
|
83
|
+
|
|
84
|
+
# def _format_a_sample_for_sktime(x):
|
|
85
|
+
# """
|
|
86
|
+
# x.shape: (n_chs, seq_len)
|
|
87
|
+
# """
|
|
88
|
+
# dims = pd.Series(
|
|
89
|
+
# [pd.Series(x[d], name=f"dim_{d}") for d in range(len(x))],
|
|
90
|
+
# index=[f"dim_{i}" for i in np.arange(len(x))],
|
|
91
|
+
# )
|
|
92
|
+
# return dims
|
|
93
|
+
|
|
94
|
+
# if torch.is_tensor(X):
|
|
95
|
+
# X = X.numpy()
|
|
96
|
+
# X = X.astype(np.float64)
|
|
97
|
+
|
|
98
|
+
# return pd.DataFrame(
|
|
99
|
+
# [_format_a_sample_for_sktime(X[i]) for i in range(len(X))]
|
|
100
|
+
# )
|
|
@@ -60,9 +60,8 @@ class EarlyStopping:
|
|
|
60
60
|
)
|
|
61
61
|
if self.counter >= self.patience:
|
|
62
62
|
if self.verbose:
|
|
63
|
-
scitex.
|
|
63
|
+
scitex.gen.print_block("Early-stopped.", c="yellow")
|
|
64
64
|
return True
|
|
65
|
-
return False
|
|
66
65
|
|
|
67
66
|
def save(self, current_score, models_spaths_dict, i_global):
|
|
68
67
|
"""Saves model when validation score decrease."""
|