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
scitex/plt/__init__.py
CHANGED
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
# File: /ssh:sp:/home/ywatanabe/proj/SciTeX-Code/src/scitex/plt/__init__.py
|
|
5
5
|
# ----------------------------------------
|
|
6
6
|
import os
|
|
7
|
-
__FILE__ =
|
|
8
|
-
"./src/scitex/plt/__init__.py"
|
|
9
|
-
)
|
|
7
|
+
__FILE__ = __file__
|
|
10
8
|
__DIR__ = os.path.dirname(__FILE__)
|
|
11
9
|
# ----------------------------------------
|
|
12
10
|
"""Scitex plt module."""
|
|
@@ -14,23 +12,134 @@ __DIR__ = os.path.dirname(__FILE__)
|
|
|
14
12
|
from ._tpl import termplot
|
|
15
13
|
from . import color
|
|
16
14
|
from . import utils
|
|
15
|
+
from . import ax
|
|
17
16
|
|
|
18
17
|
# Lazy import for subplots to avoid circular dependencies
|
|
19
18
|
_subplots = None
|
|
19
|
+
_figure = None
|
|
20
20
|
|
|
21
21
|
def subplots(*args, **kwargs):
|
|
22
22
|
"""Lazy-loaded subplots function."""
|
|
23
23
|
global _subplots
|
|
24
24
|
if _subplots is None:
|
|
25
|
-
from ._subplots._SubplotsWrapper import subplots as
|
|
26
|
-
_subplots =
|
|
25
|
+
from ._subplots._SubplotsWrapper import subplots as _subplots_func
|
|
26
|
+
_subplots = _subplots_func
|
|
27
27
|
return _subplots(*args, **kwargs)
|
|
28
28
|
|
|
29
|
+
def figure(*args, **kwargs):
|
|
30
|
+
"""Lazy-loaded figure function that returns a FigWrapper."""
|
|
31
|
+
global _figure
|
|
32
|
+
if _figure is None:
|
|
33
|
+
import matplotlib.pyplot as plt
|
|
34
|
+
from ._subplots._FigWrapper import FigWrapper
|
|
35
|
+
def _figure_func(*args, **kwargs):
|
|
36
|
+
fig_mpl = plt.figure(*args, **kwargs)
|
|
37
|
+
return FigWrapper(fig_mpl)
|
|
38
|
+
_figure = _figure_func
|
|
39
|
+
return _figure(*args, **kwargs)
|
|
40
|
+
|
|
41
|
+
def tight_layout(**kwargs):
|
|
42
|
+
"""
|
|
43
|
+
Wrapper for matplotlib.pyplot.tight_layout that suppresses the layout change warning.
|
|
44
|
+
|
|
45
|
+
This function calls tight_layout on the current figure and suppresses the common
|
|
46
|
+
UserWarning: "The figure layout has changed to tight" which is informational
|
|
47
|
+
and typically not actionable.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
**kwargs
|
|
52
|
+
All keyword arguments are passed to matplotlib.pyplot.tight_layout()
|
|
53
|
+
"""
|
|
54
|
+
import warnings
|
|
55
|
+
import matplotlib.pyplot as plt
|
|
56
|
+
|
|
57
|
+
with warnings.catch_warnings():
|
|
58
|
+
warnings.filterwarnings("ignore", message="The figure layout has changed to tight")
|
|
59
|
+
plt.tight_layout(**kwargs)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def colorbar(mappable=None, cax=None, ax=None, **kwargs):
|
|
63
|
+
"""
|
|
64
|
+
Create a colorbar, automatically unwrapping SciTeX AxisWrapper objects.
|
|
65
|
+
|
|
66
|
+
This function handles both regular matplotlib axes and SciTeX AxisWrapper
|
|
67
|
+
objects transparently, making it a drop-in replacement for plt.colorbar().
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
mappable : ScalarMappable, optional
|
|
72
|
+
The image, contour set, etc. to which the colorbar applies.
|
|
73
|
+
If None, uses the current image.
|
|
74
|
+
cax : Axes, optional
|
|
75
|
+
Axes into which the colorbar will be drawn.
|
|
76
|
+
ax : Axes or AxisWrapper or list thereof, optional
|
|
77
|
+
Parent axes from which space for the colorbar will be stolen.
|
|
78
|
+
If None, uses current axes.
|
|
79
|
+
**kwargs
|
|
80
|
+
Additional keyword arguments passed to matplotlib.pyplot.colorbar()
|
|
81
|
+
|
|
82
|
+
Returns
|
|
83
|
+
-------
|
|
84
|
+
Colorbar
|
|
85
|
+
The created colorbar object
|
|
86
|
+
"""
|
|
87
|
+
import matplotlib.pyplot as plt
|
|
88
|
+
|
|
89
|
+
# Unwrap ax if it's a SciTeX AxisWrapper
|
|
90
|
+
if ax is not None:
|
|
91
|
+
if hasattr(ax, '__iter__') and not isinstance(ax, str):
|
|
92
|
+
# Handle list/array of axes
|
|
93
|
+
ax = [a._axis_mpl if hasattr(a, '_axis_mpl') else a for a in ax]
|
|
94
|
+
else:
|
|
95
|
+
# Single axis
|
|
96
|
+
ax = ax._axis_mpl if hasattr(ax, '_axis_mpl') else ax
|
|
97
|
+
|
|
98
|
+
# Unwrap cax if provided
|
|
99
|
+
if cax is not None:
|
|
100
|
+
cax = cax._axis_mpl if hasattr(cax, '_axis_mpl') else cax
|
|
101
|
+
|
|
102
|
+
# Call matplotlib's colorbar with unwrapped axes
|
|
103
|
+
return plt.colorbar(mappable=mappable, cax=cax, ax=ax, **kwargs)
|
|
104
|
+
|
|
29
105
|
__all__ = [
|
|
30
106
|
"termplot",
|
|
31
107
|
"subplots",
|
|
108
|
+
"figure",
|
|
109
|
+
"tight_layout",
|
|
32
110
|
"utils",
|
|
33
111
|
"color",
|
|
34
112
|
]
|
|
35
113
|
|
|
114
|
+
def __getattr__(name):
|
|
115
|
+
"""
|
|
116
|
+
Fallback to matplotlib.pyplot for any missing attributes.
|
|
117
|
+
This makes scitex.plt a complete drop-in replacement for matplotlib.pyplot.
|
|
118
|
+
"""
|
|
119
|
+
try:
|
|
120
|
+
import matplotlib.pyplot as plt
|
|
121
|
+
if hasattr(plt, name):
|
|
122
|
+
return getattr(plt, name)
|
|
123
|
+
else:
|
|
124
|
+
raise AttributeError(f"module 'scitex.plt' has no attribute '{name}'")
|
|
125
|
+
except ImportError:
|
|
126
|
+
raise AttributeError(f"module 'scitex.plt' has no attribute '{name}' (matplotlib not available)")
|
|
127
|
+
|
|
128
|
+
def __dir__():
|
|
129
|
+
"""
|
|
130
|
+
Provide comprehensive directory listing including matplotlib.pyplot functions.
|
|
131
|
+
"""
|
|
132
|
+
# Get local attributes
|
|
133
|
+
local_attrs = __all__.copy()
|
|
134
|
+
|
|
135
|
+
# Add matplotlib.pyplot attributes
|
|
136
|
+
try:
|
|
137
|
+
import matplotlib.pyplot as plt
|
|
138
|
+
mpl_attrs = [attr for attr in dir(plt) if not attr.startswith('_')]
|
|
139
|
+
local_attrs.extend(mpl_attrs)
|
|
140
|
+
except ImportError:
|
|
141
|
+
pass
|
|
142
|
+
|
|
143
|
+
return sorted(set(local_attrs))
|
|
144
|
+
|
|
36
145
|
# EOF
|
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
# File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxesWrapper.py
|
|
5
5
|
# ----------------------------------------
|
|
6
6
|
import os
|
|
7
|
-
__FILE__ =
|
|
8
|
-
"./src/scitex/plt/_subplots/_AxesWrapper.py"
|
|
9
|
-
)
|
|
7
|
+
__FILE__ = __file__
|
|
10
8
|
__DIR__ = os.path.dirname(__FILE__)
|
|
11
9
|
# ----------------------------------------
|
|
12
10
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
# Timestamp: "2025-05-01 17:11:28 (ywatanabe)"
|
|
4
|
-
# File: /home/ywatanabe/proj/
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapper.py
|
|
5
5
|
# ----------------------------------------
|
|
6
6
|
import os
|
|
7
7
|
|
|
8
|
-
__FILE__ =
|
|
8
|
+
__FILE__ = __file__
|
|
9
9
|
__DIR__ = os.path.dirname(__FILE__)
|
|
10
10
|
# ----------------------------------------
|
|
11
11
|
|
|
@@ -19,10 +19,11 @@ from ._AxisWrapperMixins import (
|
|
|
19
19
|
MatplotlibPlotMixin,
|
|
20
20
|
SeabornMixin,
|
|
21
21
|
TrackingMixin,
|
|
22
|
+
UnitAwareMixin,
|
|
22
23
|
)
|
|
23
24
|
|
|
24
25
|
|
|
25
|
-
class AxisWrapper(MatplotlibPlotMixin, SeabornMixin, AdjustmentMixin, TrackingMixin):
|
|
26
|
+
class AxisWrapper(MatplotlibPlotMixin, SeabornMixin, AdjustmentMixin, TrackingMixin, UnitAwareMixin):
|
|
26
27
|
def __init__(self, fig_scitex, axis_mpl, track):
|
|
27
28
|
"""Initialize the AxisWrapper.
|
|
28
29
|
|
|
@@ -50,6 +51,9 @@ class AxisWrapper(MatplotlibPlotMixin, SeabornMixin, AdjustmentMixin, TrackingMi
|
|
|
50
51
|
self.track = track
|
|
51
52
|
self.id = 0
|
|
52
53
|
self._counter_part = matplotlib.axes.Axes
|
|
54
|
+
|
|
55
|
+
# Initialize unit awareness
|
|
56
|
+
UnitAwareMixin.__init__(self)
|
|
53
57
|
|
|
54
58
|
def get_figure(self, root=True):
|
|
55
59
|
"""Get the figure, compatible with matplotlib 3.8+"""
|
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
# File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/.claude-worktree/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py
|
|
5
5
|
# ----------------------------------------
|
|
6
6
|
import os
|
|
7
|
-
__FILE__ =
|
|
8
|
-
"./src/scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py"
|
|
9
|
-
)
|
|
7
|
+
__FILE__ = __file__
|
|
10
8
|
__DIR__ = os.path.dirname(__FILE__)
|
|
11
9
|
# ----------------------------------------
|
|
12
10
|
|
|
@@ -20,20 +18,55 @@ class AdjustmentMixin:
|
|
|
20
18
|
|
|
21
19
|
def rotate_labels(
|
|
22
20
|
self,
|
|
23
|
-
x: float =
|
|
24
|
-
y: float =
|
|
25
|
-
x_ha: str =
|
|
26
|
-
y_ha: str =
|
|
21
|
+
x: float = None,
|
|
22
|
+
y: float = None,
|
|
23
|
+
x_ha: str = None,
|
|
24
|
+
y_ha: str = None,
|
|
25
|
+
x_va: str = None,
|
|
26
|
+
y_va: str = None,
|
|
27
|
+
auto_adjust: bool = True,
|
|
28
|
+
scientific_convention: bool = True,
|
|
29
|
+
tight_layout: bool = False,
|
|
27
30
|
) -> None:
|
|
31
|
+
"""Rotate x and y axis labels with automatic positioning.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
x : float or None, optional
|
|
36
|
+
Rotation angle for x-axis labels in degrees.
|
|
37
|
+
If None or 0, x-axis labels are not rotated. Default is None.
|
|
38
|
+
y : float or None, optional
|
|
39
|
+
Rotation angle for y-axis labels in degrees.
|
|
40
|
+
If None or 0, y-axis labels are not rotated. Default is None.
|
|
41
|
+
x_ha : str or None, optional
|
|
42
|
+
Horizontal alignment for x-axis labels. If None, automatically determined.
|
|
43
|
+
y_ha : str or None, optional
|
|
44
|
+
Horizontal alignment for y-axis labels. If None, automatically determined.
|
|
45
|
+
x_va : str or None, optional
|
|
46
|
+
Vertical alignment for x-axis labels. If None, automatically determined.
|
|
47
|
+
y_va : str or None, optional
|
|
48
|
+
Vertical alignment for y-axis labels. If None, automatically determined.
|
|
49
|
+
auto_adjust : bool, optional
|
|
50
|
+
Whether to automatically adjust alignment. Default is True.
|
|
51
|
+
scientific_convention : bool, optional
|
|
52
|
+
Whether to follow scientific conventions. Default is True.
|
|
53
|
+
tight_layout : bool, optional
|
|
54
|
+
Whether to apply tight_layout to prevent overlapping. Default is False.
|
|
55
|
+
"""
|
|
28
56
|
self._axis_mpl = ax_module.rotate_labels(
|
|
29
|
-
self._axis_mpl, x=x, y=y, x_ha=x_ha, y_ha=y_ha
|
|
57
|
+
self._axis_mpl, x=x, y=y, x_ha=x_ha, y_ha=y_ha,
|
|
58
|
+
x_va=x_va, y_va=y_va, auto_adjust=auto_adjust,
|
|
59
|
+
scientific_convention=scientific_convention,
|
|
60
|
+
tight_layout=tight_layout
|
|
30
61
|
)
|
|
31
62
|
|
|
32
|
-
def legend(self, loc: str = "upper left", **kwargs) -> None:
|
|
63
|
+
def legend(self, *args, loc: str = "upper left", **kwargs) -> None:
|
|
33
64
|
"""Places legend at specified location, with support for outside positions.
|
|
34
65
|
|
|
35
66
|
Parameters
|
|
36
67
|
----------
|
|
68
|
+
*args : tuple
|
|
69
|
+
Positional arguments (handles, labels) as in matplotlib
|
|
37
70
|
loc : str
|
|
38
71
|
Legend position. Standard matplotlib positions plus:
|
|
39
72
|
- "outer": Automatically place legend outside plot area (right side)
|
|
@@ -47,12 +80,13 @@ class AdjustmentMixin:
|
|
|
47
80
|
For "separate": can include 'filename' (default: 'legend.png')
|
|
48
81
|
"""
|
|
49
82
|
import matplotlib.pyplot as plt
|
|
50
|
-
|
|
83
|
+
|
|
51
84
|
# Handle special cases
|
|
52
85
|
if loc == "outer":
|
|
53
86
|
# Place legend outside on the right, adjusting figure to make room
|
|
54
87
|
legend = self._axis_mpl.legend(
|
|
55
|
-
|
|
88
|
+
*args,
|
|
89
|
+
loc='center left',
|
|
56
90
|
bbox_to_anchor=(1.02, 0.5),
|
|
57
91
|
**kwargs
|
|
58
92
|
)
|
|
@@ -170,8 +204,8 @@ class AdjustmentMixin:
|
|
|
170
204
|
|
|
171
205
|
if loc in outside_positions:
|
|
172
206
|
location, bbox = outside_positions[loc]
|
|
173
|
-
return self._axis_mpl.legend(loc=location, bbox_to_anchor=bbox, **kwargs)
|
|
174
|
-
return self._axis_mpl.legend(loc=loc, **kwargs)
|
|
207
|
+
return self._axis_mpl.legend(*args, loc=location, bbox_to_anchor=bbox, **kwargs)
|
|
208
|
+
return self._axis_mpl.legend(*args, loc=loc, **kwargs)
|
|
175
209
|
|
|
176
210
|
def set_xyt(
|
|
177
211
|
self,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
# Timestamp: "2025-05-18 17:51:44 (ywatanabe)"
|
|
4
|
-
# File: /
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py
|
|
5
5
|
# ----------------------------------------
|
|
6
6
|
import os
|
|
7
7
|
|
|
8
|
-
__FILE__ =
|
|
8
|
+
__FILE__ = __file__
|
|
9
9
|
__DIR__ = os.path.dirname(__FILE__)
|
|
10
10
|
# ----------------------------------------
|
|
11
11
|
|
|
@@ -893,4 +893,162 @@ class MatplotlibPlotMixin:
|
|
|
893
893
|
|
|
894
894
|
return self._axis_mpl, plot_df
|
|
895
895
|
|
|
896
|
+
# Standard matplotlib plot methods with plot_ prefix
|
|
897
|
+
def plot_bar(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
898
|
+
"""Wrapper for matplotlib bar plot with tracking support."""
|
|
899
|
+
method_name = "plot_bar"
|
|
900
|
+
|
|
901
|
+
with self._no_tracking():
|
|
902
|
+
result = self._axis_mpl.bar(*args, **kwargs)
|
|
903
|
+
|
|
904
|
+
# Track bar data
|
|
905
|
+
if len(args) >= 2:
|
|
906
|
+
tracked_dict = {"bar_df": pd.DataFrame({"x": args[0], "height": args[1]})}
|
|
907
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
908
|
+
|
|
909
|
+
return result
|
|
910
|
+
|
|
911
|
+
def plot_barh(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
912
|
+
"""Wrapper for matplotlib horizontal bar plot with tracking support."""
|
|
913
|
+
method_name = "plot_barh"
|
|
914
|
+
|
|
915
|
+
with self._no_tracking():
|
|
916
|
+
result = self._axis_mpl.barh(*args, **kwargs)
|
|
917
|
+
|
|
918
|
+
# Track bar data
|
|
919
|
+
if len(args) >= 2:
|
|
920
|
+
tracked_dict = {"barh_df": pd.DataFrame({"y": args[0], "width": args[1]})}
|
|
921
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
922
|
+
|
|
923
|
+
return result
|
|
924
|
+
|
|
925
|
+
def plot_scatter(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
926
|
+
"""Wrapper for matplotlib scatter plot with tracking support."""
|
|
927
|
+
method_name = "plot_scatter"
|
|
928
|
+
|
|
929
|
+
with self._no_tracking():
|
|
930
|
+
result = self._axis_mpl.scatter(*args, **kwargs)
|
|
931
|
+
|
|
932
|
+
# Track scatter data
|
|
933
|
+
if len(args) >= 2:
|
|
934
|
+
tracked_dict = {"scatter_df": pd.DataFrame({"x": args[0], "y": args[1]})}
|
|
935
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
936
|
+
|
|
937
|
+
return result
|
|
938
|
+
|
|
939
|
+
def plot_errorbar(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
940
|
+
"""Wrapper for matplotlib errorbar plot with tracking support."""
|
|
941
|
+
method_name = "plot_errorbar"
|
|
942
|
+
|
|
943
|
+
with self._no_tracking():
|
|
944
|
+
result = self._axis_mpl.errorbar(*args, **kwargs)
|
|
945
|
+
|
|
946
|
+
# Track errorbar data
|
|
947
|
+
if len(args) >= 2:
|
|
948
|
+
df_dict = {"x": args[0], "y": args[1]}
|
|
949
|
+
if "yerr" in kwargs:
|
|
950
|
+
df_dict["yerr"] = kwargs["yerr"]
|
|
951
|
+
if "xerr" in kwargs:
|
|
952
|
+
df_dict["xerr"] = kwargs["xerr"]
|
|
953
|
+
tracked_dict = {"errorbar_df": pd.DataFrame(df_dict)}
|
|
954
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
955
|
+
|
|
956
|
+
return result
|
|
957
|
+
|
|
958
|
+
def plot_fill_between(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
959
|
+
"""Wrapper for matplotlib fill_between with tracking support."""
|
|
960
|
+
method_name = "plot_fill_between"
|
|
961
|
+
|
|
962
|
+
with self._no_tracking():
|
|
963
|
+
result = self._axis_mpl.fill_between(*args, **kwargs)
|
|
964
|
+
|
|
965
|
+
# Track fill_between data
|
|
966
|
+
if len(args) >= 3:
|
|
967
|
+
tracked_dict = {"fill_between_df": pd.DataFrame({
|
|
968
|
+
"x": args[0],
|
|
969
|
+
"y1": args[1],
|
|
970
|
+
"y2": args[2] if len(args) > 2 else 0
|
|
971
|
+
})}
|
|
972
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
973
|
+
|
|
974
|
+
return result
|
|
975
|
+
|
|
976
|
+
def plot_contour(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
977
|
+
"""Wrapper for matplotlib contour plot with tracking support."""
|
|
978
|
+
method_name = "plot_contour"
|
|
979
|
+
|
|
980
|
+
with self._no_tracking():
|
|
981
|
+
result = self._axis_mpl.contour(*args, **kwargs)
|
|
982
|
+
|
|
983
|
+
# Track contour data
|
|
984
|
+
if len(args) >= 3:
|
|
985
|
+
# Flatten 2D arrays for CSV export
|
|
986
|
+
X, Y, Z = args[0], args[1], args[2]
|
|
987
|
+
tracked_dict = {"contour_df": pd.DataFrame({
|
|
988
|
+
"X": np.ravel(X),
|
|
989
|
+
"Y": np.ravel(Y),
|
|
990
|
+
"Z": np.ravel(Z)
|
|
991
|
+
})}
|
|
992
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
993
|
+
|
|
994
|
+
return result
|
|
995
|
+
|
|
996
|
+
def plot_imshow(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
997
|
+
"""Wrapper for matplotlib imshow with tracking support."""
|
|
998
|
+
method_name = "plot_imshow"
|
|
999
|
+
|
|
1000
|
+
with self._no_tracking():
|
|
1001
|
+
result = self._axis_mpl.imshow(*args, **kwargs)
|
|
1002
|
+
|
|
1003
|
+
# Track image data
|
|
1004
|
+
if len(args) >= 1:
|
|
1005
|
+
# Create DataFrame with unique column names to avoid duplicates
|
|
1006
|
+
img_data = args[0]
|
|
1007
|
+
if hasattr(img_data, 'shape') and len(img_data.shape) == 2:
|
|
1008
|
+
n_rows, n_cols = img_data.shape
|
|
1009
|
+
# Use column names like "col_0", "col_1", etc. instead of just integers
|
|
1010
|
+
df = pd.DataFrame(img_data, columns=[f"col_{i}" for i in range(n_cols)])
|
|
1011
|
+
else:
|
|
1012
|
+
df = pd.DataFrame(args[0])
|
|
1013
|
+
tracked_dict = {"imshow_df": df}
|
|
1014
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
1015
|
+
|
|
1016
|
+
return result
|
|
1017
|
+
|
|
1018
|
+
def plot_boxplot(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
1019
|
+
"""Wrapper for matplotlib boxplot with tracking support."""
|
|
1020
|
+
method_name = "plot_boxplot"
|
|
1021
|
+
|
|
1022
|
+
with self._no_tracking():
|
|
1023
|
+
result = self._axis_mpl.boxplot(*args, **kwargs)
|
|
1024
|
+
|
|
1025
|
+
# Track boxplot data
|
|
1026
|
+
if len(args) >= 1:
|
|
1027
|
+
data = args[0]
|
|
1028
|
+
if isinstance(data, list):
|
|
1029
|
+
tracked_dict = {"boxplot_df": pd.DataFrame(data)}
|
|
1030
|
+
else:
|
|
1031
|
+
tracked_dict = {"boxplot_df": pd.DataFrame({"data": data})}
|
|
1032
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
1033
|
+
|
|
1034
|
+
return result
|
|
1035
|
+
|
|
1036
|
+
def plot_violinplot(self, *args, track: bool = True, id: Optional[str] = None, **kwargs):
|
|
1037
|
+
"""Wrapper for matplotlib violinplot with tracking support."""
|
|
1038
|
+
method_name = "plot_violinplot"
|
|
1039
|
+
|
|
1040
|
+
with self._no_tracking():
|
|
1041
|
+
result = self._axis_mpl.violinplot(*args, **kwargs)
|
|
1042
|
+
|
|
1043
|
+
# Track violin data
|
|
1044
|
+
if len(args) >= 1:
|
|
1045
|
+
data = args[0]
|
|
1046
|
+
if isinstance(data, list):
|
|
1047
|
+
tracked_dict = {"violinplot_df": pd.DataFrame(data)}
|
|
1048
|
+
else:
|
|
1049
|
+
tracked_dict = {"violinplot_df": pd.DataFrame({"data": data})}
|
|
1050
|
+
self._track(track, id, method_name, tracked_dict, None)
|
|
1051
|
+
|
|
1052
|
+
return result
|
|
1053
|
+
|
|
896
1054
|
# EOF
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
# Timestamp: "2025-05-18 16:26:18 (ywatanabe)"
|
|
4
|
-
# File: /
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py
|
|
5
5
|
# ----------------------------------------
|
|
6
6
|
import os
|
|
7
7
|
|
|
8
|
-
__FILE__ =
|
|
8
|
+
__FILE__ = __file__
|
|
9
9
|
__DIR__ = os.path.dirname(__FILE__)
|
|
10
10
|
# ----------------------------------------
|
|
11
11
|
|
|
@@ -43,7 +43,29 @@ class SeabornMixin:
|
|
|
43
43
|
kwargs, primary_key="palette", alternate_key="hue_colors"
|
|
44
44
|
)
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
# Suppress matplotlib's categorical units warning and info messages
|
|
47
|
+
import warnings
|
|
48
|
+
from scitex import logging
|
|
49
|
+
|
|
50
|
+
# Temporarily suppress matplotlib's INFO level logging
|
|
51
|
+
mpl_logger = logging.getLogger('matplotlib')
|
|
52
|
+
original_level = mpl_logger.level
|
|
53
|
+
mpl_logger.setLevel(logging.WARNING)
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
with warnings.catch_warnings():
|
|
57
|
+
warnings.filterwarnings('ignore',
|
|
58
|
+
message='.*categorical units.*parsable as floats or dates.*',
|
|
59
|
+
category=UserWarning)
|
|
60
|
+
warnings.filterwarnings('ignore',
|
|
61
|
+
message='.*Using categorical units.*',
|
|
62
|
+
module='matplotlib.*')
|
|
63
|
+
warnings.simplefilter('ignore', UserWarning)
|
|
64
|
+
|
|
65
|
+
self._axis_mpl = sns_plot_fn(ax=self._axis_mpl, *args, **kwargs)
|
|
66
|
+
finally:
|
|
67
|
+
# Restore original logging level
|
|
68
|
+
mpl_logger.setLevel(original_level)
|
|
47
69
|
|
|
48
70
|
# Track the plot if required
|
|
49
71
|
track_obj = track_obj if track_obj is not None else args
|
|
@@ -58,7 +80,7 @@ class SeabornMixin:
|
|
|
58
80
|
"""Formats data passed to sns functions with (data=data, x=x, y=y) keyword arguments"""
|
|
59
81
|
df = kwargs.get("data")
|
|
60
82
|
x, y, hue = kwargs.get("x"), kwargs.get("y"), kwargs.get("hue")
|
|
61
|
-
|
|
83
|
+
|
|
62
84
|
track_obj = self._sns_prepare_xyhue(df, x, y, hue) if df is not None else None
|
|
63
85
|
self._sns_base(
|
|
64
86
|
method_name,
|