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,415 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-07-04 12:05:00 (ywatanabe)"
|
|
4
|
+
# File: ./src/scitex/stats/_additional_tests.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Additional statistical tests for comprehensive analysis.
|
|
8
|
+
|
|
9
|
+
This module provides additional statistical tests commonly used in scientific research,
|
|
10
|
+
with a focus on robust methods and clear interpretations.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
from typing import Tuple, Union, Dict, Any, List
|
|
15
|
+
import warnings
|
|
16
|
+
from scipy import stats as scipy_stats
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def f_oneway(*args) -> Tuple[float, float]:
|
|
20
|
+
"""
|
|
21
|
+
Perform one-way ANOVA test.
|
|
22
|
+
|
|
23
|
+
NOTE: Consider using Kruskal-Wallis test for non-parametric alternative
|
|
24
|
+
when normality assumptions are violated.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
*args : array_like
|
|
29
|
+
Sample data arrays. Need at least 2 groups.
|
|
30
|
+
|
|
31
|
+
Returns
|
|
32
|
+
-------
|
|
33
|
+
statistic : float
|
|
34
|
+
The F-statistic
|
|
35
|
+
pvalue : float
|
|
36
|
+
The p-value
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> from scitex import stats
|
|
41
|
+
>>> group1 = np.random.normal(0, 1, 100)
|
|
42
|
+
>>> group2 = np.random.normal(0.5, 1, 100)
|
|
43
|
+
>>> group3 = np.random.normal(1, 1, 100)
|
|
44
|
+
>>> f_stat, p = stats.f_oneway(group1, group2, group3)
|
|
45
|
+
>>> print(f"F-statistic: {f_stat:.4f}, p-value: {p:.4f}")
|
|
46
|
+
"""
|
|
47
|
+
if len(args) < 2:
|
|
48
|
+
raise ValueError("Need at least 2 groups for ANOVA")
|
|
49
|
+
|
|
50
|
+
# Use scipy's implementation
|
|
51
|
+
return scipy_stats.f_oneway(*args)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def kruskal(*args) -> Tuple[float, float]:
|
|
55
|
+
"""
|
|
56
|
+
Perform Kruskal-Wallis H-test (non-parametric alternative to one-way ANOVA).
|
|
57
|
+
|
|
58
|
+
This test is more robust than ANOVA when normality assumptions are violated.
|
|
59
|
+
|
|
60
|
+
Parameters
|
|
61
|
+
----------
|
|
62
|
+
*args : array_like
|
|
63
|
+
Sample data arrays. Need at least 2 groups.
|
|
64
|
+
|
|
65
|
+
Returns
|
|
66
|
+
-------
|
|
67
|
+
statistic : float
|
|
68
|
+
The Kruskal-Wallis H-statistic
|
|
69
|
+
pvalue : float
|
|
70
|
+
The p-value
|
|
71
|
+
|
|
72
|
+
Examples
|
|
73
|
+
--------
|
|
74
|
+
>>> from scitex import stats
|
|
75
|
+
>>> group1 = np.random.exponential(1, 100) # Non-normal data
|
|
76
|
+
>>> group2 = np.random.exponential(1.5, 100)
|
|
77
|
+
>>> group3 = np.random.exponential(2, 100)
|
|
78
|
+
>>> h_stat, p = stats.kruskal(group1, group2, group3)
|
|
79
|
+
>>> print(f"H-statistic: {h_stat:.4f}, p-value: {p:.4f}")
|
|
80
|
+
"""
|
|
81
|
+
if len(args) < 2:
|
|
82
|
+
raise ValueError("Need at least 2 groups for Kruskal-Wallis test")
|
|
83
|
+
|
|
84
|
+
return scipy_stats.kruskal(*args)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def chi2_contingency(observed: np.ndarray, correction: bool = True,
|
|
88
|
+
lambda_: Union[None, float] = None) -> Tuple[float, float, int, np.ndarray]:
|
|
89
|
+
"""
|
|
90
|
+
Chi-square test of independence of variables in a contingency table.
|
|
91
|
+
|
|
92
|
+
Parameters
|
|
93
|
+
----------
|
|
94
|
+
observed : array_like
|
|
95
|
+
The contingency table
|
|
96
|
+
correction : bool, optional
|
|
97
|
+
If True, apply Yates' correction for continuity
|
|
98
|
+
lambda_ : float or None, optional
|
|
99
|
+
The cressie-read power divergence statistic
|
|
100
|
+
|
|
101
|
+
Returns
|
|
102
|
+
-------
|
|
103
|
+
chi2 : float
|
|
104
|
+
The test statistic
|
|
105
|
+
p : float
|
|
106
|
+
The p-value of the test
|
|
107
|
+
dof : int
|
|
108
|
+
Degrees of freedom
|
|
109
|
+
expected : ndarray
|
|
110
|
+
The expected frequencies
|
|
111
|
+
|
|
112
|
+
Examples
|
|
113
|
+
--------
|
|
114
|
+
>>> from scitex import stats
|
|
115
|
+
>>> # Contingency table: treatment vs outcome
|
|
116
|
+
>>> observed = np.array([[10, 10, 20], [20, 20, 40]])
|
|
117
|
+
>>> chi2, p, dof, expected = stats.chi2_contingency(observed)
|
|
118
|
+
>>> print(f"Chi-square: {chi2:.4f}, p-value: {p:.4f}")
|
|
119
|
+
"""
|
|
120
|
+
return scipy_stats.chi2_contingency(observed, correction=correction, lambda_=lambda_)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def shapiro(x: np.ndarray) -> Tuple[float, float]:
|
|
124
|
+
"""
|
|
125
|
+
Shapiro-Wilk test for normality.
|
|
126
|
+
|
|
127
|
+
Parameters
|
|
128
|
+
----------
|
|
129
|
+
x : array_like
|
|
130
|
+
Sample data
|
|
131
|
+
|
|
132
|
+
Returns
|
|
133
|
+
-------
|
|
134
|
+
statistic : float
|
|
135
|
+
The test statistic
|
|
136
|
+
pvalue : float
|
|
137
|
+
The p-value
|
|
138
|
+
|
|
139
|
+
Examples
|
|
140
|
+
--------
|
|
141
|
+
>>> from scitex import stats
|
|
142
|
+
>>> data = np.random.normal(0, 1, 100)
|
|
143
|
+
>>> stat, p = stats.shapiro(data)
|
|
144
|
+
>>> print(f"Shapiro-Wilk statistic: {stat:.4f}, p-value: {p:.4f}")
|
|
145
|
+
"""
|
|
146
|
+
return scipy_stats.shapiro(x)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def pearsonr(x: np.ndarray, y: np.ndarray) -> Tuple[float, float]:
|
|
150
|
+
"""
|
|
151
|
+
Pearson correlation coefficient and p-value.
|
|
152
|
+
|
|
153
|
+
Parameters
|
|
154
|
+
----------
|
|
155
|
+
x : array_like
|
|
156
|
+
First variable
|
|
157
|
+
y : array_like
|
|
158
|
+
Second variable
|
|
159
|
+
|
|
160
|
+
Returns
|
|
161
|
+
-------
|
|
162
|
+
r : float
|
|
163
|
+
Pearson correlation coefficient
|
|
164
|
+
pvalue : float
|
|
165
|
+
Two-tailed p-value
|
|
166
|
+
|
|
167
|
+
Examples
|
|
168
|
+
--------
|
|
169
|
+
>>> from scitex import stats
|
|
170
|
+
>>> x = np.random.normal(0, 1, 100)
|
|
171
|
+
>>> y = x + np.random.normal(0, 0.5, 100)
|
|
172
|
+
>>> r, p = stats.pearsonr(x, y)
|
|
173
|
+
>>> print(f"Pearson r: {r:.4f}, p-value: {p:.4f}")
|
|
174
|
+
"""
|
|
175
|
+
return scipy_stats.pearsonr(x, y)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def spearmanr(x: np.ndarray, y: np.ndarray = None, axis: int = 0,
|
|
179
|
+
nan_policy: str = 'propagate') -> Tuple[float, float]:
|
|
180
|
+
"""
|
|
181
|
+
Spearman rank-order correlation coefficient and p-value.
|
|
182
|
+
|
|
183
|
+
Parameters
|
|
184
|
+
----------
|
|
185
|
+
x : array_like
|
|
186
|
+
First variable or 2D array
|
|
187
|
+
y : array_like, optional
|
|
188
|
+
Second variable (if x is 1D)
|
|
189
|
+
axis : int, optional
|
|
190
|
+
Axis along which to compute
|
|
191
|
+
nan_policy : str, optional
|
|
192
|
+
How to handle NaN values
|
|
193
|
+
|
|
194
|
+
Returns
|
|
195
|
+
-------
|
|
196
|
+
correlation : float
|
|
197
|
+
Spearman correlation coefficient
|
|
198
|
+
pvalue : float
|
|
199
|
+
Two-tailed p-value
|
|
200
|
+
|
|
201
|
+
Examples
|
|
202
|
+
--------
|
|
203
|
+
>>> from scitex import stats
|
|
204
|
+
>>> x = np.random.normal(0, 1, 100)
|
|
205
|
+
>>> y = x**2 + np.random.normal(0, 0.5, 100) # Non-linear relationship
|
|
206
|
+
>>> rho, p = stats.spearmanr(x, y)
|
|
207
|
+
>>> print(f"Spearman rho: {rho:.4f}, p-value: {p:.4f}")
|
|
208
|
+
"""
|
|
209
|
+
result = scipy_stats.spearmanr(x, y, axis=axis, nan_policy=nan_policy)
|
|
210
|
+
if isinstance(result.correlation, np.ndarray):
|
|
211
|
+
# If 2D input, return correlation matrix and p-value matrix
|
|
212
|
+
return result.correlation, result.pvalue
|
|
213
|
+
else:
|
|
214
|
+
# If 1D input, return scalar values
|
|
215
|
+
return result.correlation, result.pvalue
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def sem(a: np.ndarray, axis: int = 0, ddof: int = 1) -> Union[float, np.ndarray]:
|
|
219
|
+
"""
|
|
220
|
+
Standard error of the mean.
|
|
221
|
+
|
|
222
|
+
Parameters
|
|
223
|
+
----------
|
|
224
|
+
a : array_like
|
|
225
|
+
Input array
|
|
226
|
+
axis : int or None, optional
|
|
227
|
+
Axis along which to compute
|
|
228
|
+
ddof : int, optional
|
|
229
|
+
Delta degrees of freedom
|
|
230
|
+
|
|
231
|
+
Returns
|
|
232
|
+
-------
|
|
233
|
+
s : float or ndarray
|
|
234
|
+
Standard error of the mean
|
|
235
|
+
|
|
236
|
+
Examples
|
|
237
|
+
--------
|
|
238
|
+
>>> from scitex import stats
|
|
239
|
+
>>> data = np.random.normal(0, 1, 100)
|
|
240
|
+
>>> se = stats.sem(data)
|
|
241
|
+
>>> print(f"Standard error: {se:.4f}")
|
|
242
|
+
"""
|
|
243
|
+
return scipy_stats.sem(a, axis=axis, ddof=ddof)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def trim_mean(a: np.ndarray, proportiontocut: float, axis: int = 0) -> Union[float, np.ndarray]:
|
|
247
|
+
"""
|
|
248
|
+
Trimmed mean (robust measure of central tendency).
|
|
249
|
+
|
|
250
|
+
Parameters
|
|
251
|
+
----------
|
|
252
|
+
a : array_like
|
|
253
|
+
Input array
|
|
254
|
+
proportiontocut : float
|
|
255
|
+
Proportion to cut from each end (0 to 0.5)
|
|
256
|
+
axis : int or None, optional
|
|
257
|
+
Axis along which to compute
|
|
258
|
+
|
|
259
|
+
Returns
|
|
260
|
+
-------
|
|
261
|
+
mean : float or ndarray
|
|
262
|
+
Trimmed mean
|
|
263
|
+
|
|
264
|
+
Examples
|
|
265
|
+
--------
|
|
266
|
+
>>> from scitex import stats
|
|
267
|
+
>>> data = np.concatenate([np.random.normal(0, 1, 90), [10, -10]]) # With outliers
|
|
268
|
+
>>> mean_trimmed = stats.trim_mean(data, 0.1) # Trim 10% from each end
|
|
269
|
+
>>> print(f"Trimmed mean: {mean_trimmed:.4f}")
|
|
270
|
+
"""
|
|
271
|
+
return scipy_stats.trim_mean(a, proportiontocut, axis=axis)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def probplot(x: np.ndarray, sparams=(), dist='norm', fit=True, plot=None):
|
|
275
|
+
"""
|
|
276
|
+
Probability plot to assess if data follows a distribution.
|
|
277
|
+
|
|
278
|
+
Parameters
|
|
279
|
+
----------
|
|
280
|
+
x : array_like
|
|
281
|
+
Sample data
|
|
282
|
+
sparams : tuple, optional
|
|
283
|
+
Shape parameters for the distribution
|
|
284
|
+
dist : str or stats.distributions instance, optional
|
|
285
|
+
Distribution to test against
|
|
286
|
+
fit : bool, optional
|
|
287
|
+
If True, fit a line to the data
|
|
288
|
+
plot : object, optional
|
|
289
|
+
Plot object with 'plot' method
|
|
290
|
+
|
|
291
|
+
Returns
|
|
292
|
+
-------
|
|
293
|
+
(osm, osr) : tuple of ndarrays
|
|
294
|
+
Ordered statistic medians and ordered response data
|
|
295
|
+
(slope, intercept, r) : tuple of floats, optional
|
|
296
|
+
Regression results
|
|
297
|
+
|
|
298
|
+
Examples
|
|
299
|
+
--------
|
|
300
|
+
>>> from scitex import stats
|
|
301
|
+
>>> import matplotlib.pyplot as plt
|
|
302
|
+
>>> data = np.random.normal(0, 1, 100)
|
|
303
|
+
>>> stats.probplot(data, plot=plt)
|
|
304
|
+
>>> plt.show()
|
|
305
|
+
"""
|
|
306
|
+
return scipy_stats.probplot(x, sparams=sparams, dist=dist, fit=fit, plot=plot)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
# Statistical distribution objects
|
|
310
|
+
class norm:
|
|
311
|
+
"""Normal distribution utilities."""
|
|
312
|
+
|
|
313
|
+
@staticmethod
|
|
314
|
+
def ppf(q: Union[float, np.ndarray], loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
315
|
+
"""Percent point function (inverse CDF) for normal distribution."""
|
|
316
|
+
return scipy_stats.norm.ppf(q, loc=loc, scale=scale)
|
|
317
|
+
|
|
318
|
+
@staticmethod
|
|
319
|
+
def cdf(x: Union[float, np.ndarray], loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
320
|
+
"""Cumulative distribution function for normal distribution."""
|
|
321
|
+
return scipy_stats.norm.cdf(x, loc=loc, scale=scale)
|
|
322
|
+
|
|
323
|
+
@staticmethod
|
|
324
|
+
def pdf(x: Union[float, np.ndarray], loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
325
|
+
"""Probability density function for normal distribution."""
|
|
326
|
+
return scipy_stats.norm.pdf(x, loc=loc, scale=scale)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class t:
|
|
330
|
+
"""Student's t-distribution utilities."""
|
|
331
|
+
|
|
332
|
+
@staticmethod
|
|
333
|
+
def ppf(q: Union[float, np.ndarray], df: float, loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
334
|
+
"""Percent point function (inverse CDF) for t-distribution."""
|
|
335
|
+
return scipy_stats.t.ppf(q, df, loc=loc, scale=scale)
|
|
336
|
+
|
|
337
|
+
@staticmethod
|
|
338
|
+
def cdf(x: Union[float, np.ndarray], df: float, loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
339
|
+
"""Cumulative distribution function for t-distribution."""
|
|
340
|
+
return scipy_stats.t.cdf(x, df, loc=loc, scale=scale)
|
|
341
|
+
|
|
342
|
+
@staticmethod
|
|
343
|
+
def pdf(x: Union[float, np.ndarray], df: float, loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
344
|
+
"""Probability density function for t-distribution."""
|
|
345
|
+
return scipy_stats.t.pdf(x, df, loc=loc, scale=scale)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
class chi2:
|
|
349
|
+
"""Chi-square distribution utilities."""
|
|
350
|
+
|
|
351
|
+
@staticmethod
|
|
352
|
+
def ppf(q: Union[float, np.ndarray], df: float, loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
353
|
+
"""Percent point function (inverse CDF) for chi-square distribution."""
|
|
354
|
+
return scipy_stats.chi2.ppf(q, df, loc=loc, scale=scale)
|
|
355
|
+
|
|
356
|
+
@staticmethod
|
|
357
|
+
def cdf(x: Union[float, np.ndarray], df: float, loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
358
|
+
"""Cumulative distribution function for chi-square distribution."""
|
|
359
|
+
return scipy_stats.chi2.cdf(x, df, loc=loc, scale=scale)
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
class nct:
|
|
363
|
+
"""Non-central t-distribution utilities."""
|
|
364
|
+
|
|
365
|
+
@staticmethod
|
|
366
|
+
def cdf(x: Union[float, np.ndarray], df: float, nc: float, loc: float = 0, scale: float = 1) -> Union[float, np.ndarray]:
|
|
367
|
+
"""Cumulative distribution function for non-central t-distribution."""
|
|
368
|
+
return scipy_stats.nct.cdf(x, df, nc, loc=loc, scale=scale)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
# Multiple testing correction utilities
|
|
372
|
+
class multitest:
|
|
373
|
+
"""Multiple testing correction methods."""
|
|
374
|
+
|
|
375
|
+
@staticmethod
|
|
376
|
+
def multipletests(pvals: np.ndarray, alpha: float = 0.05, method: str = 'fdr_bh',
|
|
377
|
+
is_sorted: bool = False, returnsorted: bool = False):
|
|
378
|
+
"""
|
|
379
|
+
Multiple testing p-value correction.
|
|
380
|
+
|
|
381
|
+
Parameters
|
|
382
|
+
----------
|
|
383
|
+
pvals : array_like
|
|
384
|
+
Uncorrected p-values
|
|
385
|
+
alpha : float
|
|
386
|
+
Family-wise error rate
|
|
387
|
+
method : str
|
|
388
|
+
Correction method ('bonferroni', 'fdr_bh', 'fdr_by', etc.)
|
|
389
|
+
is_sorted : bool
|
|
390
|
+
If True, pvals are already sorted
|
|
391
|
+
returnsorted : bool
|
|
392
|
+
If True, return sorted p-values
|
|
393
|
+
|
|
394
|
+
Returns
|
|
395
|
+
-------
|
|
396
|
+
reject : ndarray, bool
|
|
397
|
+
True if hypothesis is rejected after correction
|
|
398
|
+
pvals_corrected : ndarray
|
|
399
|
+
Corrected p-values
|
|
400
|
+
alphacSidak : float
|
|
401
|
+
Sidak corrected alpha
|
|
402
|
+
alphacBonf : float
|
|
403
|
+
Bonferroni corrected alpha
|
|
404
|
+
"""
|
|
405
|
+
from statsmodels.stats.multitest import multipletests as sm_multipletests
|
|
406
|
+
return sm_multipletests(pvals, alpha=alpha, method=method,
|
|
407
|
+
is_sorted=is_sorted, returnsorted=returnsorted)
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
# Aliases for common use
|
|
411
|
+
anova = f_oneway
|
|
412
|
+
chisquare = chi2_contingency
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
# EOF
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-09-29 13:43:40 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/stats/_p2stars.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
import os
|
|
8
|
+
__FILE__ = __file__
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
3
11
|
# Time-stamp: "2024-10-06 10:39:57 (ywatanabe)"
|
|
4
12
|
|
|
13
|
+
from typing import Union
|
|
14
|
+
|
|
5
15
|
import pandas as pd
|
|
6
|
-
import re
|
|
7
|
-
from typing import Union, List
|
|
8
16
|
|
|
9
17
|
|
|
10
18
|
def p2stars(
|
|
@@ -47,7 +55,9 @@ def p2stars(
|
|
|
47
55
|
elif isinstance(input_data, pd.DataFrame):
|
|
48
56
|
return _p2stars_pd(input_data, ns)
|
|
49
57
|
else:
|
|
50
|
-
raise ValueError(
|
|
58
|
+
raise ValueError(
|
|
59
|
+
"Input must be a float, string, or a pandas DataFrame"
|
|
60
|
+
)
|
|
51
61
|
|
|
52
62
|
|
|
53
63
|
def _p2stars_str(pvalue: Union[float, str], ns: bool = False) -> str:
|
|
@@ -58,7 +68,9 @@ def _p2stars_str(pvalue: Union[float, str], ns: bool = False) -> str:
|
|
|
58
68
|
return "NA"
|
|
59
69
|
pvalue_float = float(pvalue)
|
|
60
70
|
if pvalue_float < 0 or pvalue_float > 1:
|
|
61
|
-
raise ValueError(
|
|
71
|
+
raise ValueError(
|
|
72
|
+
f"P-value must be between 0 and 1, got {pvalue_float}"
|
|
73
|
+
)
|
|
62
74
|
except ValueError as e:
|
|
63
75
|
raise ValueError(f"Invalid p-value: {pvalue}. {str(e)}")
|
|
64
76
|
|
|
@@ -73,7 +85,7 @@ def _p2stars_str(pvalue: Union[float, str], ns: bool = False) -> str:
|
|
|
73
85
|
|
|
74
86
|
|
|
75
87
|
def _p2stars_pd(df: pd.DataFrame, ns: bool = False) -> pd.DataFrame:
|
|
76
|
-
from scitex.
|
|
88
|
+
from scitex.pd import find_pval
|
|
77
89
|
|
|
78
90
|
pvalue_cols = find_pval(df, multiple=True)
|
|
79
91
|
assert pvalue_cols, "No p-value columns found in DataFrame"
|
|
@@ -114,3 +126,5 @@ def _p2stars_pd(df: pd.DataFrame, ns: bool = False) -> pd.DataFrame:
|
|
|
114
126
|
# List of column names that likely contain p-values
|
|
115
127
|
# """
|
|
116
128
|
# return [col for col in df.columns if re.search(r'p[_.-]?val', col.lower())]
|
|
129
|
+
|
|
130
|
+
# EOF
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-07-04 12:00:00 (ywatanabe)"
|
|
4
|
+
# File: ./src/scitex/stats/_two_sample_tests.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Two-sample statistical tests with Brunner-Munzel as the preferred method.
|
|
8
|
+
|
|
9
|
+
This module provides robust two-sample tests, prioritizing the Brunner-Munzel test
|
|
10
|
+
over traditional t-tests due to its superior robustness to assumption violations.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
from typing import Tuple, Union, Dict, Any
|
|
15
|
+
import warnings
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def ttest_ind(a: np.ndarray, b: np.ndarray, equal_var: bool = True) -> Tuple[float, float]:
|
|
19
|
+
"""
|
|
20
|
+
Perform two-sample test using Brunner-Munzel test (more robust than t-test).
|
|
21
|
+
|
|
22
|
+
NOTE: This function uses Brunner-Munzel test instead of traditional t-test
|
|
23
|
+
for better robustness. The Brunner-Munzel test is valid under less restrictive
|
|
24
|
+
assumptions and provides better Type I error control.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
a : array_like
|
|
29
|
+
First sample
|
|
30
|
+
b : array_like
|
|
31
|
+
Second sample
|
|
32
|
+
equal_var : bool, optional
|
|
33
|
+
Ignored. Kept for API compatibility with scipy.stats.ttest_ind
|
|
34
|
+
|
|
35
|
+
Returns
|
|
36
|
+
-------
|
|
37
|
+
statistic : float
|
|
38
|
+
The test statistic
|
|
39
|
+
pvalue : float
|
|
40
|
+
Two-sided p-value
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> from scitex import stats
|
|
45
|
+
>>> group1 = np.random.normal(0, 1, 100)
|
|
46
|
+
>>> group2 = np.random.normal(0.5, 1, 100)
|
|
47
|
+
>>> stat, p = stats.ttest_ind(group1, group2)
|
|
48
|
+
>>> print(f"Statistic: {stat:.4f}, p-value: {p:.4f}")
|
|
49
|
+
"""
|
|
50
|
+
warnings.warn(
|
|
51
|
+
"Using Brunner-Munzel test instead of t-test for better robustness. "
|
|
52
|
+
"To use traditional t-test, use scipy.stats.ttest_ind directly.",
|
|
53
|
+
UserWarning
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
from ._statistical_tests import brunner_munzel_test
|
|
57
|
+
|
|
58
|
+
result = brunner_munzel_test(a, b)
|
|
59
|
+
return result["statistic"], result["p_value"]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def brunner_munzel(a: np.ndarray, b: np.ndarray) -> Tuple[float, float]:
|
|
63
|
+
"""
|
|
64
|
+
Perform Brunner-Munzel test for two independent samples.
|
|
65
|
+
|
|
66
|
+
The Brunner-Munzel test is a robust alternative to the Mann-Whitney U test
|
|
67
|
+
and t-test that doesn't assume equal variances or specific distributions.
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
a : array_like
|
|
72
|
+
First sample
|
|
73
|
+
b : array_like
|
|
74
|
+
Second sample
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
statistic : float
|
|
79
|
+
The test statistic
|
|
80
|
+
pvalue : float
|
|
81
|
+
Two-sided p-value
|
|
82
|
+
|
|
83
|
+
Examples
|
|
84
|
+
--------
|
|
85
|
+
>>> from scitex import stats
|
|
86
|
+
>>> group1 = np.random.normal(0, 1, 100)
|
|
87
|
+
>>> group2 = np.random.normal(0.5, 2, 100) # Different variance
|
|
88
|
+
>>> stat, p = stats.brunner_munzel(group1, group2)
|
|
89
|
+
>>> print(f"Brunner-Munzel statistic: {stat:.4f}, p-value: {p:.4f}")
|
|
90
|
+
"""
|
|
91
|
+
from ._statistical_tests import brunner_munzel_test
|
|
92
|
+
|
|
93
|
+
result = brunner_munzel_test(a, b)
|
|
94
|
+
return result["statistic"], result["p_value"]
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def mannwhitneyu(x: np.ndarray, y: np.ndarray, use_continuity: bool = True,
|
|
98
|
+
alternative: str = 'two-sided') -> Tuple[float, float]:
|
|
99
|
+
"""
|
|
100
|
+
Perform two-sample test using Brunner-Munzel (more robust than Mann-Whitney U).
|
|
101
|
+
|
|
102
|
+
NOTE: This function uses Brunner-Munzel test for better robustness.
|
|
103
|
+
The Brunner-Munzel test handles tied values and unequal variances better
|
|
104
|
+
than the traditional Mann-Whitney U test.
|
|
105
|
+
|
|
106
|
+
Parameters
|
|
107
|
+
----------
|
|
108
|
+
x : array_like
|
|
109
|
+
First sample
|
|
110
|
+
y : array_like
|
|
111
|
+
Second sample
|
|
112
|
+
use_continuity : bool, optional
|
|
113
|
+
Ignored. Kept for API compatibility
|
|
114
|
+
alternative : str, optional
|
|
115
|
+
Ignored. Always performs two-sided test
|
|
116
|
+
|
|
117
|
+
Returns
|
|
118
|
+
-------
|
|
119
|
+
statistic : float
|
|
120
|
+
The test statistic
|
|
121
|
+
pvalue : float
|
|
122
|
+
Two-sided p-value
|
|
123
|
+
"""
|
|
124
|
+
warnings.warn(
|
|
125
|
+
"Using Brunner-Munzel test instead of Mann-Whitney U for better robustness. "
|
|
126
|
+
"To use traditional Mann-Whitney U, use scipy.stats.mannwhitneyu directly.",
|
|
127
|
+
UserWarning
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
from ._statistical_tests import brunner_munzel_test
|
|
131
|
+
|
|
132
|
+
result = brunner_munzel_test(x, y)
|
|
133
|
+
return result["statistic"], result["p_value"]
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# Aliases for convenience
|
|
137
|
+
ttest = ttest_ind
|
|
138
|
+
bm_test = brunner_munzel
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# EOF
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Scitex desc module."""
|
|
3
|
+
|
|
4
|
+
from ._describe import describe, verify_non_leakage
|
|
5
|
+
from ._nan import (
|
|
6
|
+
nanargmax,
|
|
7
|
+
nanargmin,
|
|
8
|
+
nancount,
|
|
9
|
+
nancumprod,
|
|
10
|
+
nancumsum,
|
|
11
|
+
nankurtosis,
|
|
12
|
+
nanmax,
|
|
13
|
+
nanmean,
|
|
14
|
+
nanmin,
|
|
15
|
+
nanprod,
|
|
16
|
+
nanq25,
|
|
17
|
+
nanq50,
|
|
18
|
+
nanq75,
|
|
19
|
+
nanquantile,
|
|
20
|
+
nanskewness,
|
|
21
|
+
nanstd,
|
|
22
|
+
nansum,
|
|
23
|
+
nanvar,
|
|
24
|
+
nanzscore,
|
|
25
|
+
)
|
|
26
|
+
from ._real import (
|
|
27
|
+
kurtosis,
|
|
28
|
+
mean,
|
|
29
|
+
q25,
|
|
30
|
+
q50,
|
|
31
|
+
q75,
|
|
32
|
+
quantile,
|
|
33
|
+
skewness,
|
|
34
|
+
std,
|
|
35
|
+
var,
|
|
36
|
+
zscore,
|
|
37
|
+
)
|
|
38
|
+
from ._circular import (
|
|
39
|
+
circular_mean,
|
|
40
|
+
circular_concentration,
|
|
41
|
+
circular_skewness,
|
|
42
|
+
circular_kurtosis,
|
|
43
|
+
describe_circular,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
__all__ = [
|
|
47
|
+
"describe",
|
|
48
|
+
"kurtosis",
|
|
49
|
+
"mean",
|
|
50
|
+
"nanargmax",
|
|
51
|
+
"nanargmin",
|
|
52
|
+
"nancount",
|
|
53
|
+
"nancumprod",
|
|
54
|
+
"nancumsum",
|
|
55
|
+
"nankurtosis",
|
|
56
|
+
"nanmax",
|
|
57
|
+
"nanmean",
|
|
58
|
+
"nanmin",
|
|
59
|
+
"nanprod",
|
|
60
|
+
"nanq25",
|
|
61
|
+
"nanq50",
|
|
62
|
+
"nanq75",
|
|
63
|
+
"nanquantile",
|
|
64
|
+
"nanskewness",
|
|
65
|
+
"nanstd",
|
|
66
|
+
"nansum",
|
|
67
|
+
"nanvar",
|
|
68
|
+
"nanzscore",
|
|
69
|
+
"q25",
|
|
70
|
+
"q50",
|
|
71
|
+
"q75",
|
|
72
|
+
"quantile",
|
|
73
|
+
"skewness",
|
|
74
|
+
"std",
|
|
75
|
+
"var",
|
|
76
|
+
"verify_non_leakage",
|
|
77
|
+
"zscore",
|
|
78
|
+
"circular_mean",
|
|
79
|
+
"circular_concentration",
|
|
80
|
+
"circular_skewness",
|
|
81
|
+
"circular_kurtosis",
|
|
82
|
+
"describe_circular",
|
|
83
|
+
]
|