scitex 2.0.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__init__.py +73 -0
- scitex/__main__.py +89 -0
- scitex/__version__.py +14 -0
- scitex/_sh.py +59 -0
- scitex/ai/_LearningCurveLogger.py +583 -0
- scitex/ai/__Classifiers.py +101 -0
- scitex/ai/__init__.py +55 -0
- scitex/ai/_gen_ai/_Anthropic.py +173 -0
- scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
- scitex/ai/_gen_ai/_DeepSeek.py +175 -0
- scitex/ai/_gen_ai/_Google.py +161 -0
- scitex/ai/_gen_ai/_Groq.py +97 -0
- scitex/ai/_gen_ai/_Llama.py +142 -0
- scitex/ai/_gen_ai/_OpenAI.py +230 -0
- scitex/ai/_gen_ai/_PARAMS.py +565 -0
- scitex/ai/_gen_ai/_Perplexity.py +191 -0
- scitex/ai/_gen_ai/__init__.py +32 -0
- scitex/ai/_gen_ai/_calc_cost.py +78 -0
- scitex/ai/_gen_ai/_format_output_func.py +183 -0
- scitex/ai/_gen_ai/_genai_factory.py +71 -0
- scitex/ai/act/__init__.py +8 -0
- scitex/ai/act/_define.py +11 -0
- scitex/ai/classification/__init__.py +7 -0
- scitex/ai/classification/classification_reporter.py +1137 -0
- scitex/ai/classification/classifier_server.py +131 -0
- scitex/ai/classification/classifiers.py +101 -0
- scitex/ai/classification_reporter.py +1161 -0
- scitex/ai/classifier_server.py +131 -0
- scitex/ai/clustering/__init__.py +11 -0
- scitex/ai/clustering/_pca.py +115 -0
- scitex/ai/clustering/_umap.py +376 -0
- scitex/ai/early_stopping.py +149 -0
- scitex/ai/feature_extraction/__init__.py +56 -0
- scitex/ai/feature_extraction/vit.py +148 -0
- scitex/ai/genai/__init__.py +277 -0
- scitex/ai/genai/anthropic.py +177 -0
- scitex/ai/genai/anthropic_provider.py +320 -0
- scitex/ai/genai/anthropic_refactored.py +109 -0
- scitex/ai/genai/auth_manager.py +200 -0
- scitex/ai/genai/base_genai.py +336 -0
- scitex/ai/genai/base_provider.py +291 -0
- scitex/ai/genai/calc_cost.py +78 -0
- scitex/ai/genai/chat_history.py +307 -0
- scitex/ai/genai/cost_tracker.py +276 -0
- scitex/ai/genai/deepseek.py +188 -0
- scitex/ai/genai/deepseek_provider.py +251 -0
- scitex/ai/genai/format_output_func.py +183 -0
- scitex/ai/genai/genai_factory.py +71 -0
- scitex/ai/genai/google.py +169 -0
- scitex/ai/genai/google_provider.py +228 -0
- scitex/ai/genai/groq.py +104 -0
- scitex/ai/genai/groq_provider.py +248 -0
- scitex/ai/genai/image_processor.py +250 -0
- scitex/ai/genai/llama.py +155 -0
- scitex/ai/genai/llama_provider.py +214 -0
- scitex/ai/genai/mock_provider.py +127 -0
- scitex/ai/genai/model_registry.py +304 -0
- scitex/ai/genai/openai.py +230 -0
- scitex/ai/genai/openai_provider.py +293 -0
- scitex/ai/genai/params.py +565 -0
- scitex/ai/genai/perplexity.py +202 -0
- scitex/ai/genai/perplexity_provider.py +205 -0
- scitex/ai/genai/provider_base.py +302 -0
- scitex/ai/genai/provider_factory.py +370 -0
- scitex/ai/genai/response_handler.py +235 -0
- scitex/ai/layer/_Pass.py +21 -0
- scitex/ai/layer/__init__.py +10 -0
- scitex/ai/layer/_switch.py +8 -0
- scitex/ai/loss/_L1L2Losses.py +34 -0
- scitex/ai/loss/__init__.py +12 -0
- scitex/ai/loss/multi_task_loss.py +47 -0
- scitex/ai/metrics/__init__.py +9 -0
- scitex/ai/metrics/_bACC.py +51 -0
- scitex/ai/metrics/silhoute_score_block.py +496 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ai/optim/__init__.py +13 -0
- scitex/ai/optim/_get_set.py +31 -0
- scitex/ai/optim/_optimizers.py +71 -0
- scitex/ai/plt/__init__.py +21 -0
- scitex/ai/plt/_conf_mat.py +592 -0
- scitex/ai/plt/_learning_curve.py +194 -0
- scitex/ai/plt/_optuna_study.py +111 -0
- scitex/ai/plt/aucs/__init__.py +2 -0
- scitex/ai/plt/aucs/example.py +60 -0
- scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
- scitex/ai/plt/aucs/roc_auc.py +246 -0
- scitex/ai/sampling/undersample.py +29 -0
- scitex/ai/sk/__init__.py +11 -0
- scitex/ai/sk/_clf.py +58 -0
- scitex/ai/sk/_to_sktime.py +100 -0
- scitex/ai/sklearn/__init__.py +26 -0
- scitex/ai/sklearn/clf.py +58 -0
- scitex/ai/sklearn/to_sktime.py +100 -0
- scitex/ai/training/__init__.py +7 -0
- scitex/ai/training/early_stopping.py +150 -0
- scitex/ai/training/learning_curve_logger.py +555 -0
- scitex/ai/utils/__init__.py +22 -0
- scitex/ai/utils/_check_params.py +50 -0
- scitex/ai/utils/_default_dataset.py +46 -0
- scitex/ai/utils/_format_samples_for_sktime.py +26 -0
- scitex/ai/utils/_label_encoder.py +134 -0
- scitex/ai/utils/_merge_labels.py +22 -0
- scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ai/utils/_under_sample.py +51 -0
- scitex/ai/utils/_verify_n_gpus.py +16 -0
- scitex/ai/utils/grid_search.py +148 -0
- scitex/context/__init__.py +9 -0
- scitex/context/_suppress_output.py +38 -0
- scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
- scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
- scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
- scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
- scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
- scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
- scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
- scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
- scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
- scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
- scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
- scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
- scitex/db/_BaseMixins/__init__.py +30 -0
- scitex/db/_PostgreSQL.py +126 -0
- scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
- scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
- scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
- scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
- scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
- scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
- scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
- scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
- scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
- scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
- scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
- scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
- scitex/db/_PostgreSQLMixins/__init__.py +34 -0
- scitex/db/_SQLite3.py +2136 -0
- scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
- scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
- scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
- scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
- scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
- scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
- scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
- scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
- scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
- scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
- scitex/db/_SQLite3Mixins/__init__.py +30 -0
- scitex/db/__init__.py +14 -0
- scitex/db/_delete_duplicates.py +397 -0
- scitex/db/_inspect.py +163 -0
- scitex/decorators/__init__.py +54 -0
- scitex/decorators/_auto_order.py +172 -0
- scitex/decorators/_batch_fn.py +127 -0
- scitex/decorators/_cache_disk.py +32 -0
- scitex/decorators/_cache_mem.py +12 -0
- scitex/decorators/_combined.py +98 -0
- scitex/decorators/_converters.py +282 -0
- scitex/decorators/_deprecated.py +26 -0
- scitex/decorators/_not_implemented.py +30 -0
- scitex/decorators/_numpy_fn.py +86 -0
- scitex/decorators/_pandas_fn.py +121 -0
- scitex/decorators/_preserve_doc.py +19 -0
- scitex/decorators/_signal_fn.py +95 -0
- scitex/decorators/_timeout.py +55 -0
- scitex/decorators/_torch_fn.py +136 -0
- scitex/decorators/_wrap.py +39 -0
- scitex/decorators/_xarray_fn.py +88 -0
- scitex/dev/__init__.py +15 -0
- scitex/dev/_analyze_code_flow.py +284 -0
- scitex/dev/_reload.py +59 -0
- scitex/dict/_DotDict.py +442 -0
- scitex/dict/__init__.py +18 -0
- scitex/dict/_listed_dict.py +42 -0
- scitex/dict/_pop_keys.py +36 -0
- scitex/dict/_replace.py +13 -0
- scitex/dict/_safe_merge.py +62 -0
- scitex/dict/_to_str.py +32 -0
- scitex/dsp/__init__.py +72 -0
- scitex/dsp/_crop.py +122 -0
- scitex/dsp/_demo_sig.py +331 -0
- scitex/dsp/_detect_ripples.py +212 -0
- scitex/dsp/_ensure_3d.py +18 -0
- scitex/dsp/_hilbert.py +78 -0
- scitex/dsp/_listen.py +702 -0
- scitex/dsp/_misc.py +30 -0
- scitex/dsp/_mne.py +32 -0
- scitex/dsp/_modulation_index.py +79 -0
- scitex/dsp/_pac.py +319 -0
- scitex/dsp/_psd.py +102 -0
- scitex/dsp/_resample.py +65 -0
- scitex/dsp/_time.py +36 -0
- scitex/dsp/_transform.py +68 -0
- scitex/dsp/_wavelet.py +212 -0
- scitex/dsp/add_noise.py +111 -0
- scitex/dsp/example.py +253 -0
- scitex/dsp/filt.py +155 -0
- scitex/dsp/norm.py +18 -0
- scitex/dsp/params.py +51 -0
- scitex/dsp/reference.py +43 -0
- scitex/dsp/template.py +25 -0
- scitex/dsp/utils/__init__.py +15 -0
- scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
- scitex/dsp/utils/_ensure_3d.py +18 -0
- scitex/dsp/utils/_ensure_even_len.py +10 -0
- scitex/dsp/utils/_zero_pad.py +48 -0
- scitex/dsp/utils/filter.py +408 -0
- scitex/dsp/utils/pac.py +177 -0
- scitex/dt/__init__.py +8 -0
- scitex/dt/_linspace.py +130 -0
- scitex/etc/__init__.py +15 -0
- scitex/etc/wait_key.py +34 -0
- scitex/gen/_DimHandler.py +196 -0
- scitex/gen/_TimeStamper.py +244 -0
- scitex/gen/__init__.py +95 -0
- scitex/gen/_alternate_kwarg.py +13 -0
- scitex/gen/_cache.py +11 -0
- scitex/gen/_check_host.py +34 -0
- scitex/gen/_ci.py +12 -0
- scitex/gen/_close.py +222 -0
- scitex/gen/_embed.py +78 -0
- scitex/gen/_inspect_module.py +257 -0
- scitex/gen/_is_ipython.py +12 -0
- scitex/gen/_less.py +48 -0
- scitex/gen/_list_packages.py +139 -0
- scitex/gen/_mat2py.py +88 -0
- scitex/gen/_norm.py +170 -0
- scitex/gen/_paste.py +18 -0
- scitex/gen/_print_config.py +84 -0
- scitex/gen/_shell.py +48 -0
- scitex/gen/_src.py +111 -0
- scitex/gen/_start.py +451 -0
- scitex/gen/_symlink.py +55 -0
- scitex/gen/_symlog.py +27 -0
- scitex/gen/_tee.py +238 -0
- scitex/gen/_title2path.py +60 -0
- scitex/gen/_title_case.py +88 -0
- scitex/gen/_to_even.py +84 -0
- scitex/gen/_to_odd.py +34 -0
- scitex/gen/_to_rank.py +39 -0
- scitex/gen/_transpose.py +37 -0
- scitex/gen/_type.py +78 -0
- scitex/gen/_var_info.py +73 -0
- scitex/gen/_wrap.py +17 -0
- scitex/gen/_xml2dict.py +76 -0
- scitex/gen/misc.py +730 -0
- scitex/gen/path.py +0 -0
- scitex/general/__init__.py +5 -0
- scitex/gists/_SigMacro_processFigure_S.py +128 -0
- scitex/gists/_SigMacro_toBlue.py +172 -0
- scitex/gists/__init__.py +12 -0
- scitex/io/_H5Explorer.py +292 -0
- scitex/io/__init__.py +82 -0
- scitex/io/_cache.py +101 -0
- scitex/io/_flush.py +24 -0
- scitex/io/_glob.py +103 -0
- scitex/io/_json2md.py +113 -0
- scitex/io/_load.py +168 -0
- scitex/io/_load_configs.py +146 -0
- scitex/io/_load_modules/__init__.py +38 -0
- scitex/io/_load_modules/_catboost.py +66 -0
- scitex/io/_load_modules/_con.py +20 -0
- scitex/io/_load_modules/_db.py +24 -0
- scitex/io/_load_modules/_docx.py +42 -0
- scitex/io/_load_modules/_eeg.py +110 -0
- scitex/io/_load_modules/_hdf5.py +196 -0
- scitex/io/_load_modules/_image.py +19 -0
- scitex/io/_load_modules/_joblib.py +19 -0
- scitex/io/_load_modules/_json.py +18 -0
- scitex/io/_load_modules/_markdown.py +103 -0
- scitex/io/_load_modules/_matlab.py +37 -0
- scitex/io/_load_modules/_numpy.py +39 -0
- scitex/io/_load_modules/_optuna.py +155 -0
- scitex/io/_load_modules/_pandas.py +69 -0
- scitex/io/_load_modules/_pdf.py +31 -0
- scitex/io/_load_modules/_pickle.py +24 -0
- scitex/io/_load_modules/_torch.py +16 -0
- scitex/io/_load_modules/_txt.py +126 -0
- scitex/io/_load_modules/_xml.py +49 -0
- scitex/io/_load_modules/_yaml.py +23 -0
- scitex/io/_mv_to_tmp.py +19 -0
- scitex/io/_path.py +286 -0
- scitex/io/_reload.py +78 -0
- scitex/io/_save.py +539 -0
- scitex/io/_save_modules/__init__.py +66 -0
- scitex/io/_save_modules/_catboost.py +22 -0
- scitex/io/_save_modules/_csv.py +89 -0
- scitex/io/_save_modules/_excel.py +49 -0
- scitex/io/_save_modules/_hdf5.py +249 -0
- scitex/io/_save_modules/_html.py +48 -0
- scitex/io/_save_modules/_image.py +140 -0
- scitex/io/_save_modules/_joblib.py +25 -0
- scitex/io/_save_modules/_json.py +25 -0
- scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
- scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
- scitex/io/_save_modules/_matlab.py +24 -0
- scitex/io/_save_modules/_mp4.py +29 -0
- scitex/io/_save_modules/_numpy.py +57 -0
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
- scitex/io/_save_modules/_pickle.py +45 -0
- scitex/io/_save_modules/_plotly.py +27 -0
- scitex/io/_save_modules/_text.py +23 -0
- scitex/io/_save_modules/_torch.py +26 -0
- scitex/io/_save_modules/_yaml.py +29 -0
- scitex/life/__init__.py +10 -0
- scitex/life/_monitor_rain.py +49 -0
- scitex/linalg/__init__.py +17 -0
- scitex/linalg/_distance.py +63 -0
- scitex/linalg/_geometric_median.py +64 -0
- scitex/linalg/_misc.py +73 -0
- scitex/nn/_AxiswiseDropout.py +27 -0
- scitex/nn/_BNet.py +126 -0
- scitex/nn/_BNet_Res.py +164 -0
- scitex/nn/_ChannelGainChanger.py +44 -0
- scitex/nn/_DropoutChannels.py +50 -0
- scitex/nn/_Filters.py +489 -0
- scitex/nn/_FreqGainChanger.py +110 -0
- scitex/nn/_GaussianFilter.py +48 -0
- scitex/nn/_Hilbert.py +111 -0
- scitex/nn/_MNet_1000.py +157 -0
- scitex/nn/_ModulationIndex.py +221 -0
- scitex/nn/_PAC.py +414 -0
- scitex/nn/_PSD.py +40 -0
- scitex/nn/_ResNet1D.py +120 -0
- scitex/nn/_SpatialAttention.py +25 -0
- scitex/nn/_Spectrogram.py +161 -0
- scitex/nn/_SwapChannels.py +50 -0
- scitex/nn/_TransposeLayer.py +19 -0
- scitex/nn/_Wavelet.py +183 -0
- scitex/nn/__init__.py +63 -0
- scitex/os/__init__.py +8 -0
- scitex/os/_mv.py +50 -0
- scitex/parallel/__init__.py +8 -0
- scitex/parallel/_run.py +151 -0
- scitex/path/__init__.py +33 -0
- scitex/path/_clean.py +52 -0
- scitex/path/_find.py +108 -0
- scitex/path/_get_module_path.py +51 -0
- scitex/path/_get_spath.py +35 -0
- scitex/path/_getsize.py +18 -0
- scitex/path/_increment_version.py +87 -0
- scitex/path/_mk_spath.py +51 -0
- scitex/path/_path.py +19 -0
- scitex/path/_split.py +23 -0
- scitex/path/_this_path.py +19 -0
- scitex/path/_version.py +101 -0
- scitex/pd/__init__.py +41 -0
- scitex/pd/_find_indi.py +126 -0
- scitex/pd/_find_pval.py +113 -0
- scitex/pd/_force_df.py +154 -0
- scitex/pd/_from_xyz.py +71 -0
- scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
- scitex/pd/_melt_cols.py +81 -0
- scitex/pd/_merge_columns.py +221 -0
- scitex/pd/_mv.py +63 -0
- scitex/pd/_replace.py +62 -0
- scitex/pd/_round.py +93 -0
- scitex/pd/_slice.py +63 -0
- scitex/pd/_sort.py +91 -0
- scitex/pd/_to_numeric.py +53 -0
- scitex/pd/_to_xy.py +59 -0
- scitex/pd/_to_xyz.py +110 -0
- scitex/plt/__init__.py +36 -0
- scitex/plt/_subplots/_AxesWrapper.py +182 -0
- scitex/plt/_subplots/_AxisWrapper.py +249 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
- scitex/plt/_subplots/_FigWrapper.py +226 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
- scitex/plt/_subplots/__init__.py +111 -0
- scitex/plt/_subplots/_export_as_csv.py +232 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
- scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
- scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
- scitex/plt/_tpl.py +28 -0
- scitex/plt/ax/__init__.py +114 -0
- scitex/plt/ax/_plot/__init__.py +53 -0
- scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
- scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
- scitex/plt/ax/_plot/_plot_cube.py +57 -0
- scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
- scitex/plt/ax/_plot/_plot_fillv.py +55 -0
- scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
- scitex/plt/ax/_plot/_plot_image.py +94 -0
- scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
- scitex/plt/ax/_plot/_plot_raster.py +172 -0
- scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
- scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
- scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
- scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
- scitex/plt/ax/_plot/_plot_violin.py +343 -0
- scitex/plt/ax/_style/__init__.py +38 -0
- scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
- scitex/plt/ax/_style/_add_panel.py +92 -0
- scitex/plt/ax/_style/_extend.py +64 -0
- scitex/plt/ax/_style/_force_aspect.py +37 -0
- scitex/plt/ax/_style/_format_label.py +23 -0
- scitex/plt/ax/_style/_hide_spines.py +84 -0
- scitex/plt/ax/_style/_map_ticks.py +182 -0
- scitex/plt/ax/_style/_rotate_labels.py +215 -0
- scitex/plt/ax/_style/_sci_note.py +279 -0
- scitex/plt/ax/_style/_set_log_scale.py +299 -0
- scitex/plt/ax/_style/_set_meta.py +261 -0
- scitex/plt/ax/_style/_set_n_ticks.py +37 -0
- scitex/plt/ax/_style/_set_size.py +16 -0
- scitex/plt/ax/_style/_set_supxyt.py +116 -0
- scitex/plt/ax/_style/_set_ticks.py +276 -0
- scitex/plt/ax/_style/_set_xyt.py +121 -0
- scitex/plt/ax/_style/_share_axes.py +264 -0
- scitex/plt/ax/_style/_shift.py +139 -0
- scitex/plt/ax/_style/_show_spines.py +333 -0
- scitex/plt/color/_PARAMS.py +70 -0
- scitex/plt/color/__init__.py +52 -0
- scitex/plt/color/_add_hue_col.py +41 -0
- scitex/plt/color/_colors.py +205 -0
- scitex/plt/color/_get_colors_from_cmap.py +134 -0
- scitex/plt/color/_interpolate.py +29 -0
- scitex/plt/color/_vizualize_colors.py +54 -0
- scitex/plt/utils/__init__.py +44 -0
- scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
- scitex/plt/utils/_calc_nice_ticks.py +101 -0
- scitex/plt/utils/_close.py +68 -0
- scitex/plt/utils/_colorbar.py +96 -0
- scitex/plt/utils/_configure_mpl.py +295 -0
- scitex/plt/utils/_histogram_utils.py +132 -0
- scitex/plt/utils/_im2grid.py +70 -0
- scitex/plt/utils/_is_valid_axis.py +78 -0
- scitex/plt/utils/_mk_colorbar.py +65 -0
- scitex/plt/utils/_mk_patches.py +26 -0
- scitex/plt/utils/_scientific_captions.py +638 -0
- scitex/plt/utils/_scitex_config.py +223 -0
- scitex/reproduce/__init__.py +14 -0
- scitex/reproduce/_fix_seeds.py +45 -0
- scitex/reproduce/_gen_ID.py +55 -0
- scitex/reproduce/_gen_timestamp.py +35 -0
- scitex/res/__init__.py +5 -0
- scitex/resource/__init__.py +13 -0
- scitex/resource/_get_processor_usages.py +281 -0
- scitex/resource/_get_specs.py +280 -0
- scitex/resource/_log_processor_usages.py +190 -0
- scitex/resource/_utils/__init__.py +31 -0
- scitex/resource/_utils/_get_env_info.py +481 -0
- scitex/resource/limit_ram.py +33 -0
- scitex/scholar/__init__.py +24 -0
- scitex/scholar/_local_search.py +454 -0
- scitex/scholar/_paper.py +244 -0
- scitex/scholar/_pdf_downloader.py +325 -0
- scitex/scholar/_search.py +393 -0
- scitex/scholar/_vector_search.py +370 -0
- scitex/scholar/_web_sources.py +457 -0
- scitex/stats/__init__.py +31 -0
- scitex/stats/_calc_partial_corr.py +17 -0
- scitex/stats/_corr_test_multi.py +94 -0
- scitex/stats/_corr_test_wrapper.py +115 -0
- scitex/stats/_describe_wrapper.py +90 -0
- scitex/stats/_multiple_corrections.py +63 -0
- scitex/stats/_nan_stats.py +93 -0
- scitex/stats/_p2stars.py +116 -0
- scitex/stats/_p2stars_wrapper.py +56 -0
- scitex/stats/_statistical_tests.py +73 -0
- scitex/stats/desc/__init__.py +40 -0
- scitex/stats/desc/_describe.py +189 -0
- scitex/stats/desc/_nan.py +289 -0
- scitex/stats/desc/_real.py +94 -0
- scitex/stats/multiple/__init__.py +14 -0
- scitex/stats/multiple/_bonferroni_correction.py +72 -0
- scitex/stats/multiple/_fdr_correction.py +400 -0
- scitex/stats/multiple/_multicompair.py +28 -0
- scitex/stats/tests/__corr_test.py +277 -0
- scitex/stats/tests/__corr_test_multi.py +343 -0
- scitex/stats/tests/__corr_test_single.py +277 -0
- scitex/stats/tests/__init__.py +22 -0
- scitex/stats/tests/_brunner_munzel_test.py +192 -0
- scitex/stats/tests/_nocorrelation_test.py +28 -0
- scitex/stats/tests/_smirnov_grubbs.py +98 -0
- scitex/str/__init__.py +113 -0
- scitex/str/_clean_path.py +75 -0
- scitex/str/_color_text.py +52 -0
- scitex/str/_decapitalize.py +58 -0
- scitex/str/_factor_out_digits.py +281 -0
- scitex/str/_format_plot_text.py +498 -0
- scitex/str/_grep.py +48 -0
- scitex/str/_latex.py +155 -0
- scitex/str/_latex_fallback.py +471 -0
- scitex/str/_mask_api.py +39 -0
- scitex/str/_mask_api_key.py +8 -0
- scitex/str/_parse.py +158 -0
- scitex/str/_print_block.py +47 -0
- scitex/str/_print_debug.py +68 -0
- scitex/str/_printc.py +62 -0
- scitex/str/_readable_bytes.py +38 -0
- scitex/str/_remove_ansi.py +23 -0
- scitex/str/_replace.py +134 -0
- scitex/str/_search.py +125 -0
- scitex/str/_squeeze_space.py +36 -0
- scitex/tex/__init__.py +10 -0
- scitex/tex/_preview.py +103 -0
- scitex/tex/_to_vec.py +116 -0
- scitex/torch/__init__.py +18 -0
- scitex/torch/_apply_to.py +34 -0
- scitex/torch/_nan_funcs.py +77 -0
- scitex/types/_ArrayLike.py +44 -0
- scitex/types/_ColorLike.py +21 -0
- scitex/types/__init__.py +14 -0
- scitex/types/_is_listed_X.py +70 -0
- scitex/utils/__init__.py +22 -0
- scitex/utils/_compress_hdf5.py +116 -0
- scitex/utils/_email.py +120 -0
- scitex/utils/_grid.py +148 -0
- scitex/utils/_notify.py +247 -0
- scitex/utils/_search.py +121 -0
- scitex/web/__init__.py +38 -0
- scitex/web/_search_pubmed.py +438 -0
- scitex/web/_summarize_url.py +158 -0
- scitex-2.0.0.dist-info/METADATA +307 -0
- scitex-2.0.0.dist-info/RECORD +572 -0
- scitex-2.0.0.dist-info/WHEEL +6 -0
- scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
- scitex-2.0.0.dist-info/top_level.txt +1 -0
scitex/gen/misc.py
ADDED
|
@@ -0,0 +1,730 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-16 16:26:59 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/gen/misc.py
|
|
5
|
+
|
|
6
|
+
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/gen/misc.py"
|
|
7
|
+
|
|
8
|
+
#!/usr/bin/env python3
|
|
9
|
+
# -*- coding: utf-8 -*-
|
|
10
|
+
# Time-stamp: "2024-11-02 12:50:29 (ywatanabe)"
|
|
11
|
+
# File: ./scitex_repo/src/scitex/gen/misc.py
|
|
12
|
+
|
|
13
|
+
import math
|
|
14
|
+
import os
|
|
15
|
+
import shutil
|
|
16
|
+
import threading
|
|
17
|
+
import time
|
|
18
|
+
import warnings
|
|
19
|
+
from bisect import bisect_left
|
|
20
|
+
from functools import wraps
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
import numpy as np
|
|
24
|
+
import pandas as pd
|
|
25
|
+
import readchar
|
|
26
|
+
import torch
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def find_closest(list_obj, num_insert):
|
|
30
|
+
"""Find the closest value in a sorted list to a given number.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
list_obj : list
|
|
35
|
+
A sorted list of numbers.
|
|
36
|
+
num_insert : float or int
|
|
37
|
+
The number to find the closest value to.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
tuple
|
|
42
|
+
A tuple containing (closest_value, index_of_closest_value).
|
|
43
|
+
|
|
44
|
+
Example
|
|
45
|
+
-------
|
|
46
|
+
>>> find_closest([1, 3, 5, 7, 9], 6)
|
|
47
|
+
(5, 2)
|
|
48
|
+
>>> find_closest([1, 3, 5, 7, 9], 8)
|
|
49
|
+
(7, 3)
|
|
50
|
+
"""
|
|
51
|
+
"""
|
|
52
|
+
Assumes list_obj is sorted. Returns the closest value to num.
|
|
53
|
+
If the same number is included in list_obj, the smaller number is returned.
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
list_obj = np.array([0, 1, 1, 2, 3, 3])
|
|
57
|
+
num = 1.2
|
|
58
|
+
closest_num, closest_pos = take_the_closest(list_obj, num)
|
|
59
|
+
print(closest_num, closest_pos)
|
|
60
|
+
# 1 2
|
|
61
|
+
|
|
62
|
+
list_obj = np.array([0, 1, 1, 2, 3, 3])
|
|
63
|
+
num = 1
|
|
64
|
+
closest_num, closest_pos = take_the_closest(list_obj, num)
|
|
65
|
+
print(closest_num, closest_pos)
|
|
66
|
+
# 1 1
|
|
67
|
+
"""
|
|
68
|
+
if math.isnan(num_insert):
|
|
69
|
+
closest_num = np.nan
|
|
70
|
+
closest_pos = np.nan
|
|
71
|
+
|
|
72
|
+
pos_num_insert = bisect_left(list_obj, num_insert)
|
|
73
|
+
|
|
74
|
+
if pos_num_insert == 0:
|
|
75
|
+
closest_num = list_obj[0]
|
|
76
|
+
closest_pos = pos_num_insert
|
|
77
|
+
|
|
78
|
+
if pos_num_insert == len(list_obj):
|
|
79
|
+
closest_num = list_obj[-1]
|
|
80
|
+
closest_pos = pos_num_insert
|
|
81
|
+
|
|
82
|
+
else:
|
|
83
|
+
pos_before = pos_num_insert - 1
|
|
84
|
+
|
|
85
|
+
before_num = list_obj[pos_before]
|
|
86
|
+
after_num = list_obj[pos_num_insert]
|
|
87
|
+
|
|
88
|
+
delta_after = abs(after_num - num_insert)
|
|
89
|
+
delta_before = abs(before_num - num_insert)
|
|
90
|
+
|
|
91
|
+
if np.abs(delta_after) < np.abs(delta_before):
|
|
92
|
+
closest_num = after_num
|
|
93
|
+
closest_pos = pos_num_insert
|
|
94
|
+
|
|
95
|
+
else:
|
|
96
|
+
closest_num = before_num
|
|
97
|
+
closest_pos = pos_before
|
|
98
|
+
|
|
99
|
+
return closest_num, closest_pos
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
################################################################################
|
|
103
|
+
## mutable
|
|
104
|
+
################################################################################
|
|
105
|
+
def isclose(mutable_a, mutable_b):
|
|
106
|
+
"""Check if two mutable objects are close to each other.
|
|
107
|
+
|
|
108
|
+
This function compares two mutable objects (e.g., lists, numpy arrays) element-wise
|
|
109
|
+
to determine if they are close to each other.
|
|
110
|
+
|
|
111
|
+
Parameters
|
|
112
|
+
----------
|
|
113
|
+
mutable_a : list or numpy.ndarray
|
|
114
|
+
The first mutable object to compare.
|
|
115
|
+
mutable_b : list or numpy.ndarray
|
|
116
|
+
The second mutable object to compare.
|
|
117
|
+
|
|
118
|
+
Returns
|
|
119
|
+
-------
|
|
120
|
+
bool
|
|
121
|
+
True if the objects are close to each other, False otherwise.
|
|
122
|
+
|
|
123
|
+
Example
|
|
124
|
+
-------
|
|
125
|
+
>>> isclose([1.0, 2.0, 3.0], [1.0, 2.0001, 3.0])
|
|
126
|
+
True
|
|
127
|
+
>>> isclose([1.0, 2.0, 3.0], [1.0, 2.1, 3.0])
|
|
128
|
+
False
|
|
129
|
+
"""
|
|
130
|
+
return [math.isclose(a, b) for a, b in zip(mutable_a, mutable_b)]
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
################################################################################
|
|
134
|
+
## dictionary
|
|
135
|
+
################################################################################
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
################################################################################
|
|
139
|
+
## variables
|
|
140
|
+
################################################################################
|
|
141
|
+
def is_defined_global(x_str):
|
|
142
|
+
"""
|
|
143
|
+
Example:
|
|
144
|
+
print(is_defined('a'))
|
|
145
|
+
# False
|
|
146
|
+
|
|
147
|
+
a = 5
|
|
148
|
+
print(is_defined('a'))
|
|
149
|
+
# True
|
|
150
|
+
"""
|
|
151
|
+
return x_str in globals()
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def is_defined_local(x_str):
|
|
155
|
+
"""
|
|
156
|
+
Example:
|
|
157
|
+
print(is_defined('a'))
|
|
158
|
+
# False
|
|
159
|
+
|
|
160
|
+
a = 5
|
|
161
|
+
print(is_defined('a'))
|
|
162
|
+
# True
|
|
163
|
+
"""
|
|
164
|
+
return x_str in locals()
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
################################################################################
|
|
168
|
+
## versioning
|
|
169
|
+
################################################################################
|
|
170
|
+
def is_later_or_equal(package, tgt_version, format="MAJOR.MINOR.PATCH"):
|
|
171
|
+
"""Check if the installed version of a package is later than or equal to a target version.
|
|
172
|
+
|
|
173
|
+
Parameters
|
|
174
|
+
----------
|
|
175
|
+
package : str
|
|
176
|
+
The name of the package to check.
|
|
177
|
+
tgt_version : str
|
|
178
|
+
The target version to compare against.
|
|
179
|
+
format : str, optional
|
|
180
|
+
The version format (default is "MAJOR.MINOR.PATCH").
|
|
181
|
+
|
|
182
|
+
Returns
|
|
183
|
+
-------
|
|
184
|
+
bool
|
|
185
|
+
True if the installed version is later than or equal to the target version, False otherwise.
|
|
186
|
+
|
|
187
|
+
Example
|
|
188
|
+
-------
|
|
189
|
+
>>> is_later_or_equal('numpy', '1.18.0')
|
|
190
|
+
True
|
|
191
|
+
>>> is_later_or_equal('pandas', '2.0.0')
|
|
192
|
+
False
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
import numpy as np
|
|
196
|
+
|
|
197
|
+
indi, matched = scitex.gen.search(["MAJOR", "MINOR", "PATCH"], format.split("."))
|
|
198
|
+
imp_major, imp_minor, imp_patch = [
|
|
199
|
+
int(v) for v in np.array(package.__version__.split("."))[indi]
|
|
200
|
+
]
|
|
201
|
+
tgt_major, tgt_minor, tgt_patch = [
|
|
202
|
+
int(v) for v in np.array(tgt_version.split("."))[indi]
|
|
203
|
+
]
|
|
204
|
+
|
|
205
|
+
print(
|
|
206
|
+
f"\npackage: {package.__name__}\n"
|
|
207
|
+
f"target_version: {tgt_version}\n"
|
|
208
|
+
f"imported_version: {imp_major}.{imp_minor}.{imp_patch}\n"
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
## Mjorr
|
|
212
|
+
if imp_major > tgt_major:
|
|
213
|
+
return True
|
|
214
|
+
|
|
215
|
+
if imp_major < tgt_major:
|
|
216
|
+
return False
|
|
217
|
+
|
|
218
|
+
if imp_major == tgt_major:
|
|
219
|
+
|
|
220
|
+
## Minor
|
|
221
|
+
if imp_minor > tgt_minor:
|
|
222
|
+
return True
|
|
223
|
+
|
|
224
|
+
if imp_minor < tgt_minor:
|
|
225
|
+
return False
|
|
226
|
+
|
|
227
|
+
if imp_minor == tgt_minor:
|
|
228
|
+
|
|
229
|
+
## Patch
|
|
230
|
+
if imp_patch > tgt_patch:
|
|
231
|
+
return True
|
|
232
|
+
if imp_patch < tgt_patch:
|
|
233
|
+
return False
|
|
234
|
+
if imp_patch == tgt_patch:
|
|
235
|
+
return True
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
################################################################################
|
|
239
|
+
## File
|
|
240
|
+
################################################################################
|
|
241
|
+
def _copy_a_file(src, dst, allow_overwrite=False):
|
|
242
|
+
"""Copy a single file from source to destination.
|
|
243
|
+
|
|
244
|
+
Parameters
|
|
245
|
+
----------
|
|
246
|
+
src : str
|
|
247
|
+
The path to the source file.
|
|
248
|
+
dst : str
|
|
249
|
+
The path to the destination file.
|
|
250
|
+
allow_overwrite : bool, optional
|
|
251
|
+
If True, allows overwriting existing files (default is False).
|
|
252
|
+
|
|
253
|
+
Raises
|
|
254
|
+
------
|
|
255
|
+
FileExistsError
|
|
256
|
+
If the destination file already exists and allow_overwrite is False.
|
|
257
|
+
|
|
258
|
+
Example
|
|
259
|
+
-------
|
|
260
|
+
>>> _copy_a_file('/path/to/source.txt', '/path/to/destination.txt')
|
|
261
|
+
>>> _copy_a_file('/path/to/source.txt', '/path/to/existing.txt', allow_overwrite=True)
|
|
262
|
+
"""
|
|
263
|
+
if src == "/dev/null":
|
|
264
|
+
print(f"\n/dev/null was not copied.\n")
|
|
265
|
+
|
|
266
|
+
else:
|
|
267
|
+
|
|
268
|
+
if dst.endswith("/"):
|
|
269
|
+
_, src_fname, src_ext = scitex.path.split(src)
|
|
270
|
+
# src_fname = src + src_ext
|
|
271
|
+
dst = dst + src_fname + src_ext
|
|
272
|
+
|
|
273
|
+
if not os.path.exists(dst):
|
|
274
|
+
shutil.copyfile(src, dst)
|
|
275
|
+
print(f'\nCopied "{src}" to "{dst}".\n')
|
|
276
|
+
|
|
277
|
+
else:
|
|
278
|
+
if allow_overwrite:
|
|
279
|
+
shutil.copyfile(src, dst)
|
|
280
|
+
print(f'\nCopied "{src}" to "{dst}" (overwritten).\n')
|
|
281
|
+
|
|
282
|
+
if not allow_overwrite:
|
|
283
|
+
print(f'\n"{dst}" exists and copying from "{src}" was aborted.\n')
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def copy_files(src_files, dists, allow_overwrite=False):
|
|
287
|
+
"""Copy multiple files from source(s) to destination(s).
|
|
288
|
+
|
|
289
|
+
Parameters
|
|
290
|
+
----------
|
|
291
|
+
src_files : str or list of str
|
|
292
|
+
The path(s) to the source file(s).
|
|
293
|
+
dists : str or list of str
|
|
294
|
+
The path(s) to the destination file(s) or directory(ies).
|
|
295
|
+
allow_overwrite : bool, optional
|
|
296
|
+
If True, allows overwriting existing files (default is False).
|
|
297
|
+
|
|
298
|
+
Example
|
|
299
|
+
-------
|
|
300
|
+
>>> copy_files('/path/to/source.txt', '/path/to/destination/')
|
|
301
|
+
>>> copy_files(['/path/to/file1.txt', '/path/to/file2.txt'], ['/path/to/dest1/', '/path/to/dest2/'])
|
|
302
|
+
>>> copy_files('/path/to/source.txt', '/path/to/existing.txt', allow_overwrite=True)
|
|
303
|
+
"""
|
|
304
|
+
if isinstance(src_files, str):
|
|
305
|
+
src_files = [src_files]
|
|
306
|
+
|
|
307
|
+
if isinstance(dists, str):
|
|
308
|
+
dists = [dists]
|
|
309
|
+
|
|
310
|
+
for sf in src_files:
|
|
311
|
+
for dst in dists:
|
|
312
|
+
_copy_a_file(sf, dst, allow_overwrite=allow_overwrite)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def copy_the_file(sdir):
|
|
316
|
+
"""Copy the current script file to a specified directory.
|
|
317
|
+
|
|
318
|
+
This function copies the script file that called it to a specified directory.
|
|
319
|
+
It uses the calling script's filename and copies it to the given directory.
|
|
320
|
+
|
|
321
|
+
Parameters
|
|
322
|
+
----------
|
|
323
|
+
sdir : str
|
|
324
|
+
The destination directory where the file should be copied.
|
|
325
|
+
|
|
326
|
+
Note
|
|
327
|
+
----
|
|
328
|
+
This function will not copy the file if it's run in an IPython environment.
|
|
329
|
+
|
|
330
|
+
Example
|
|
331
|
+
-------
|
|
332
|
+
>>> copy_the_file('/path/to/destination/')
|
|
333
|
+
"""
|
|
334
|
+
THIS_FILE = inspect.stack()[1].filename
|
|
335
|
+
_, fname, ext = scitex.path.split(__file__)
|
|
336
|
+
|
|
337
|
+
# dst = sdir + fname + ext
|
|
338
|
+
|
|
339
|
+
if "ipython" not in __file__:
|
|
340
|
+
_copy_a_file(__file__, dst)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def is_nan(X):
|
|
344
|
+
"""Check if the input contains any NaN values and raise an error if found.
|
|
345
|
+
|
|
346
|
+
This function checks for NaN values in various data types including pandas DataFrames,
|
|
347
|
+
numpy arrays, PyTorch tensors, and scalar values.
|
|
348
|
+
|
|
349
|
+
Parameters
|
|
350
|
+
----------
|
|
351
|
+
X : pandas.DataFrame, numpy.ndarray, torch.Tensor, float, or int
|
|
352
|
+
The input data to check for NaN values.
|
|
353
|
+
|
|
354
|
+
Raises
|
|
355
|
+
------
|
|
356
|
+
ValueError
|
|
357
|
+
If any NaN value is found in the input.
|
|
358
|
+
|
|
359
|
+
Example
|
|
360
|
+
-------
|
|
361
|
+
>>> import numpy as np
|
|
362
|
+
>>> import pandas as pd
|
|
363
|
+
>>> import torch
|
|
364
|
+
>>> is_nan(pd.DataFrame({'a': [1, 2, np.nan]}))
|
|
365
|
+
ValueError: NaN was found in X
|
|
366
|
+
>>> is_nan(np.array([1, 2, 3]))
|
|
367
|
+
# No error raised
|
|
368
|
+
>>> is_nan(torch.tensor([1.0, float('nan'), 3.0]))
|
|
369
|
+
ValueError: NaN was found in X
|
|
370
|
+
>>> is_nan(float('nan'))
|
|
371
|
+
ValueError: X was NaN
|
|
372
|
+
"""
|
|
373
|
+
if isinstance(X, pd.DataFrame):
|
|
374
|
+
if X.isna().any().any():
|
|
375
|
+
raise ValueError("NaN was found in X")
|
|
376
|
+
elif isinstance(X, np.ndarray):
|
|
377
|
+
if np.isnan(X).any():
|
|
378
|
+
raise ValueError("NaN was found in X")
|
|
379
|
+
elif torch.is_tensor(X):
|
|
380
|
+
if X.isnan().any():
|
|
381
|
+
raise ValueError("NaN was found in X")
|
|
382
|
+
elif isinstance(X, (float, int)):
|
|
383
|
+
if math.isnan(X):
|
|
384
|
+
raise ValueError("X was NaN")
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def partial_at(func, index, value):
|
|
388
|
+
"""Create a partial function with a fixed argument at a specific position.
|
|
389
|
+
|
|
390
|
+
This function creates a new function that calls the original function with a
|
|
391
|
+
fixed argument inserted at the specified index position.
|
|
392
|
+
|
|
393
|
+
Parameters
|
|
394
|
+
----------
|
|
395
|
+
func : callable
|
|
396
|
+
The original function to be partially applied.
|
|
397
|
+
index : int
|
|
398
|
+
The position at which to insert the fixed argument.
|
|
399
|
+
value : any
|
|
400
|
+
The fixed argument value to be inserted.
|
|
401
|
+
|
|
402
|
+
Returns
|
|
403
|
+
-------
|
|
404
|
+
callable
|
|
405
|
+
A new function that calls the original function with the fixed argument.
|
|
406
|
+
|
|
407
|
+
Example
|
|
408
|
+
-------
|
|
409
|
+
>>> def greet(greeting, name):
|
|
410
|
+
... return f"{greeting}, {name}!"
|
|
411
|
+
>>> hello = partial_at(greet, 0, "Hello")
|
|
412
|
+
>>> hello("Alice")
|
|
413
|
+
'Hello, Alice!'
|
|
414
|
+
>>> hello("Bob")
|
|
415
|
+
'Hello, Bob!'
|
|
416
|
+
"""
|
|
417
|
+
|
|
418
|
+
@wraps(func)
|
|
419
|
+
def result(*rest, **kwargs):
|
|
420
|
+
args = []
|
|
421
|
+
args.extend(rest[:index])
|
|
422
|
+
args.append(value)
|
|
423
|
+
args.extend(rest[index:])
|
|
424
|
+
return func(*args, **kwargs)
|
|
425
|
+
|
|
426
|
+
return result
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
# def describe(df, method="mean", round_factor=1, axis=0):
|
|
430
|
+
# assert method in ["mean_std", "mean_ci", "median_iqr"]
|
|
431
|
+
# df = pd.DataFrame(df)
|
|
432
|
+
# with warnings.catch_warnings():
|
|
433
|
+
# warnings.simplefilter("ignore", RuntimeWarning)
|
|
434
|
+
# if method == "mean":
|
|
435
|
+
# return round(np.nanmean(df, axis=axis), 3), round(
|
|
436
|
+
# np.nanstd(df, axis=axis) / round_factor, 3
|
|
437
|
+
# )
|
|
438
|
+
# if method == "median":
|
|
439
|
+
# med = df.median(axis=axis)
|
|
440
|
+
# IQR = df.quantile(0.75, axis=axis) - df.quantile(0.25, axis=axis)
|
|
441
|
+
# return round(med, 3), round(IQR / round_factor, 3)
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def describe(df, method="mean_std", round_factor=3, axis=0):
|
|
445
|
+
"""
|
|
446
|
+
Compute descriptive statistics for a DataFrame.
|
|
447
|
+
|
|
448
|
+
Example
|
|
449
|
+
-------
|
|
450
|
+
import pandas as pd
|
|
451
|
+
import numpy as np
|
|
452
|
+
data = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
|
|
453
|
+
result = describe(data, method='mean_std')
|
|
454
|
+
print(f"n={result['n']}, mean={result['mean']}, std={result['std']}")
|
|
455
|
+
|
|
456
|
+
Parameters
|
|
457
|
+
----------
|
|
458
|
+
df : pandas.DataFrame or array-like
|
|
459
|
+
Input data.
|
|
460
|
+
method : str, optional
|
|
461
|
+
Statistical method to use. Options are 'mean_std', 'mean_ci', 'median_iqr'.
|
|
462
|
+
Default is 'mean_std'.
|
|
463
|
+
round_factor : int, optional
|
|
464
|
+
Factor to divide the spread statistic by. Default is 3.
|
|
465
|
+
axis : int, optional
|
|
466
|
+
Axis along which to compute statistics. Default is 0.
|
|
467
|
+
|
|
468
|
+
Returns
|
|
469
|
+
-------
|
|
470
|
+
dict
|
|
471
|
+
Dictionary containing statistics based on the method chosen.
|
|
472
|
+
"""
|
|
473
|
+
assert method in ["mean_std", "mean_ci", "median_iqr"]
|
|
474
|
+
df = pd.DataFrame(df)
|
|
475
|
+
nn = df.notna().sum(axis=axis)
|
|
476
|
+
|
|
477
|
+
with warnings.catch_warnings():
|
|
478
|
+
warnings.simplefilter("ignore", RuntimeWarning)
|
|
479
|
+
if method in ["mean_std", "mean_ci"]:
|
|
480
|
+
mm = np.nanmean(df, axis=axis)
|
|
481
|
+
if method == "mean_std":
|
|
482
|
+
ss = np.nanstd(df, axis=axis)
|
|
483
|
+
key = "std"
|
|
484
|
+
else: # mean_ci
|
|
485
|
+
ss = 1.96 * np.nanstd(df, axis=axis) / np.sqrt(nn)
|
|
486
|
+
key = "ci"
|
|
487
|
+
return {
|
|
488
|
+
"n": np.round(nn, 3),
|
|
489
|
+
"mean": np.round(mm, 3),
|
|
490
|
+
key: np.round(ss, 3),
|
|
491
|
+
}
|
|
492
|
+
else: # median_iqr
|
|
493
|
+
med = df.median(axis=axis)
|
|
494
|
+
iqr = df.quantile(0.75, axis=axis) - df.quantile(0.25, axis=axis)
|
|
495
|
+
return {
|
|
496
|
+
"n": np.round(nn, round_factor),
|
|
497
|
+
"median": np.round(med, round_factor),
|
|
498
|
+
"iqr": np.round(iqr, round_factor),
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
def _return_counting_process():
|
|
503
|
+
import multiprocessing
|
|
504
|
+
|
|
505
|
+
def _count():
|
|
506
|
+
counter = 0
|
|
507
|
+
while True:
|
|
508
|
+
print(counter)
|
|
509
|
+
time.sleep(1)
|
|
510
|
+
counter += 1
|
|
511
|
+
|
|
512
|
+
p1 = multiprocessing.Process(target=_count)
|
|
513
|
+
p1.start()
|
|
514
|
+
return p1
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def wait_key(process, tgt_key="q"):
|
|
518
|
+
"""Wait for a specific key press while a process is running.
|
|
519
|
+
|
|
520
|
+
This function waits for a specific key to be pressed while a given process
|
|
521
|
+
is running. It's typically used to provide a way to interrupt or terminate
|
|
522
|
+
a long-running process.
|
|
523
|
+
|
|
524
|
+
Parameters
|
|
525
|
+
----------
|
|
526
|
+
process : multiprocessing.Process
|
|
527
|
+
The process to monitor while waiting for the key press.
|
|
528
|
+
tgt_key : str, optional
|
|
529
|
+
The target key to wait for (default is "q" for quit).
|
|
530
|
+
|
|
531
|
+
Returns
|
|
532
|
+
-------
|
|
533
|
+
None
|
|
534
|
+
|
|
535
|
+
Note
|
|
536
|
+
----
|
|
537
|
+
This function will block until either the target key is pressed or the
|
|
538
|
+
monitored process terminates.
|
|
539
|
+
|
|
540
|
+
Example
|
|
541
|
+
-------
|
|
542
|
+
>>> import multiprocessing
|
|
543
|
+
>>> def long_running_task():
|
|
544
|
+
... while True:
|
|
545
|
+
... pass
|
|
546
|
+
>>> p = multiprocessing.Process(target=long_running_task)
|
|
547
|
+
>>> p.start()
|
|
548
|
+
>>> wait_key(p) # This will wait until 'q' is pressed or the process ends
|
|
549
|
+
"""
|
|
550
|
+
"""
|
|
551
|
+
Example:
|
|
552
|
+
|
|
553
|
+
p1 = scitex.gen._return_counting_process()
|
|
554
|
+
scitex.gen.wait_key(p1)
|
|
555
|
+
# press q
|
|
556
|
+
"""
|
|
557
|
+
pressed_key = None
|
|
558
|
+
while pressed_key != tgt_key:
|
|
559
|
+
pressed_key = readchar.readchar()
|
|
560
|
+
print(pressed_key)
|
|
561
|
+
process.terminate()
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
class ThreadWithReturnValue(threading.Thread):
|
|
565
|
+
"""
|
|
566
|
+
Example:
|
|
567
|
+
t = ThreadWithReturnValue(
|
|
568
|
+
target=func, args=(,), kwargs={key: val}
|
|
569
|
+
)
|
|
570
|
+
t.start()
|
|
571
|
+
out = t.join()
|
|
572
|
+
|
|
573
|
+
"""
|
|
574
|
+
|
|
575
|
+
def __init__(
|
|
576
|
+
self,
|
|
577
|
+
group=None,
|
|
578
|
+
target=None,
|
|
579
|
+
name=None,
|
|
580
|
+
args=(),
|
|
581
|
+
kwargs={},
|
|
582
|
+
Verbose=None,
|
|
583
|
+
):
|
|
584
|
+
Thread.__init__(self, group, target, name, args, kwargs)
|
|
585
|
+
self._return = None
|
|
586
|
+
|
|
587
|
+
def run(self):
|
|
588
|
+
if self._target is not None:
|
|
589
|
+
self._return = self._target(*self._args, **self._kwargs)
|
|
590
|
+
|
|
591
|
+
def join(self, *args):
|
|
592
|
+
### fixme
|
|
593
|
+
Thread.join(self, *args)
|
|
594
|
+
return self._return
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
def unique(data, axis=None):
|
|
598
|
+
"""
|
|
599
|
+
Identifies unique elements in the data along the specified axis and their counts, returning a DataFrame.
|
|
600
|
+
|
|
601
|
+
Parameters:
|
|
602
|
+
- data (array-like): The input data to analyze for unique elements.
|
|
603
|
+
- axis (int, optional): The axis along which to find the unique elements. Defaults to None.
|
|
604
|
+
|
|
605
|
+
Returns:
|
|
606
|
+
- df (pandas.DataFrame): DataFrame with unique elements and their counts.
|
|
607
|
+
"""
|
|
608
|
+
if axis is None:
|
|
609
|
+
uqs, counts = np.unique(data, return_counts=True)
|
|
610
|
+
else:
|
|
611
|
+
uqs, counts = np.unique(data, axis=axis, return_counts=True)
|
|
612
|
+
|
|
613
|
+
if axis is None:
|
|
614
|
+
df = pd.DataFrame({"uq": uqs, "n": counts})
|
|
615
|
+
else:
|
|
616
|
+
df = pd.DataFrame(uqs, columns=[f"axis_{i}" for i in range(uqs.shape[1])])
|
|
617
|
+
df["n"] = counts
|
|
618
|
+
|
|
619
|
+
df["n"] = df["n"].apply(lambda x: f"{int(x):,}")
|
|
620
|
+
|
|
621
|
+
return df
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
def unique(data, axis=None):
|
|
625
|
+
"""
|
|
626
|
+
Identifies unique elements in the data along the specified axis and their counts, returning a DataFrame.
|
|
627
|
+
|
|
628
|
+
Parameters:
|
|
629
|
+
- data (array-like): The input data to analyze for unique elements.
|
|
630
|
+
- axis (int, optional): The axis along which to find the unique elements. Defaults to None.
|
|
631
|
+
|
|
632
|
+
Returns:
|
|
633
|
+
- df (pandas.DataFrame): DataFrame with unique elements and their counts.
|
|
634
|
+
"""
|
|
635
|
+
# Find unique elements and their counts
|
|
636
|
+
if axis is None:
|
|
637
|
+
uqs, counts = np.unique(data, return_counts=True)
|
|
638
|
+
df = pd.DataFrame({"Unique Elements": uqs, "Counts": counts})
|
|
639
|
+
else:
|
|
640
|
+
uqs, counts = np.unique(data, axis=axis, return_counts=True)
|
|
641
|
+
# Create a DataFrame with unique elements
|
|
642
|
+
df = pd.DataFrame(
|
|
643
|
+
uqs,
|
|
644
|
+
columns=[f"Unique Elements Axis {i}" for i in range(uqs.shape[1])],
|
|
645
|
+
)
|
|
646
|
+
# Add a column for counts
|
|
647
|
+
df["Counts"] = counts
|
|
648
|
+
|
|
649
|
+
# Format the 'Counts' column with commas for thousands
|
|
650
|
+
df["Counts"] = df["Counts"].apply(lambda x: f"{x:,}")
|
|
651
|
+
|
|
652
|
+
return df
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
def uq(*args, **kwargs):
|
|
656
|
+
"""Alias for the unique function.
|
|
657
|
+
|
|
658
|
+
This function is a wrapper around the unique function, providing the same
|
|
659
|
+
functionality with a shorter name.
|
|
660
|
+
|
|
661
|
+
Parameters
|
|
662
|
+
----------
|
|
663
|
+
*args : positional arguments
|
|
664
|
+
Positional arguments to be passed to the unique function.
|
|
665
|
+
**kwargs : keyword arguments
|
|
666
|
+
Keyword arguments to be passed to the unique function.
|
|
667
|
+
|
|
668
|
+
Returns
|
|
669
|
+
-------
|
|
670
|
+
array_like
|
|
671
|
+
The result of calling the unique function with the given arguments.
|
|
672
|
+
|
|
673
|
+
See Also
|
|
674
|
+
--------
|
|
675
|
+
unique : The main function for finding unique elements.
|
|
676
|
+
|
|
677
|
+
Example
|
|
678
|
+
-------
|
|
679
|
+
>>> uq([1, 2, 2, 3, 3, 3])
|
|
680
|
+
array([1, 2, 3])
|
|
681
|
+
"""
|
|
682
|
+
return unique(*args, **kwargs)
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
# def mv_col(dataframe, column_name, position):
|
|
686
|
+
# temp_col = dataframe[column_name]
|
|
687
|
+
# dataframe.drop(labels=[column_name], axis=1, inplace=True)
|
|
688
|
+
# dataframe.insert(loc=position, column=column_name, value=temp_col)
|
|
689
|
+
# return dataframe
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
def float_linspace(start, stop, num_points):
|
|
693
|
+
"""Generate evenly spaced floating-point numbers over a specified interval.
|
|
694
|
+
|
|
695
|
+
This function is similar to numpy's linspace, but ensures that the output
|
|
696
|
+
consists of floating-point numbers with a specified number of decimal places.
|
|
697
|
+
|
|
698
|
+
Parameters
|
|
699
|
+
----------
|
|
700
|
+
start : float
|
|
701
|
+
The starting value of the sequence.
|
|
702
|
+
stop : float
|
|
703
|
+
The end value of the sequence.
|
|
704
|
+
num_points : int
|
|
705
|
+
Number of points to generate.
|
|
706
|
+
|
|
707
|
+
Returns
|
|
708
|
+
-------
|
|
709
|
+
numpy.ndarray
|
|
710
|
+
Array of evenly spaced floating-point values.
|
|
711
|
+
|
|
712
|
+
Example
|
|
713
|
+
-------
|
|
714
|
+
>>> float_linspace(0, 1, 5)
|
|
715
|
+
array([0. , 0.25, 0.5 , 0.75, 1. ])
|
|
716
|
+
>>> float_linspace(1, 2, 3)
|
|
717
|
+
array([1. , 1.5, 2. ])
|
|
718
|
+
"""
|
|
719
|
+
num_points = int(num_points) # Ensure num_points is an integer
|
|
720
|
+
|
|
721
|
+
if num_points < 2:
|
|
722
|
+
return np.array([start, stop]) if num_points == 2 else np.array([start])
|
|
723
|
+
|
|
724
|
+
step = (stop - start) / (num_points - 1)
|
|
725
|
+
values = [start + i * step for i in range(num_points)]
|
|
726
|
+
|
|
727
|
+
return np.array(values)
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
# EOF
|