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/io/_save.py
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 16:49:44 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/io/_save.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/io/_save.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import warnings
|
|
13
|
+
|
|
14
|
+
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/io/_save.py"
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
1. Functionality:
|
|
18
|
+
- Provides utilities for saving various data types to different file formats.
|
|
19
|
+
2. Input:
|
|
20
|
+
- Objects to be saved (e.g., NumPy arrays, PyTorch tensors, Pandas DataFrames, etc.)
|
|
21
|
+
- File path or name where the object should be saved
|
|
22
|
+
3. Output:
|
|
23
|
+
- Saved files in various formats (e.g., CSV, NPY, PKL, JOBLIB, PNG, HTML, TIFF, MP4, YAML, JSON, HDF5, PTH, MAT, CBM)
|
|
24
|
+
4. Prerequisites:
|
|
25
|
+
- Python 3.x
|
|
26
|
+
- Required libraries: numpy, pandas, torch, matplotlib, plotly, h5py, joblib, PIL, ruamel.yaml
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
"""Imports"""
|
|
30
|
+
import inspect
|
|
31
|
+
import logging
|
|
32
|
+
import os as _os
|
|
33
|
+
from typing import Any
|
|
34
|
+
|
|
35
|
+
from .._sh import sh
|
|
36
|
+
from ..path._clean import clean
|
|
37
|
+
from ..path._getsize import getsize
|
|
38
|
+
from ..str._clean_path import clean_path
|
|
39
|
+
from ..str._color_text import color_text
|
|
40
|
+
from ..str._readable_bytes import readable_bytes
|
|
41
|
+
|
|
42
|
+
# Import save functions from the new modular structure
|
|
43
|
+
from ._save_modules import (
|
|
44
|
+
save_csv,
|
|
45
|
+
save_excel,
|
|
46
|
+
save_npy,
|
|
47
|
+
save_npz,
|
|
48
|
+
save_pickle,
|
|
49
|
+
save_pickle_compressed,
|
|
50
|
+
save_joblib,
|
|
51
|
+
save_torch,
|
|
52
|
+
save_json,
|
|
53
|
+
save_yaml,
|
|
54
|
+
save_hdf5,
|
|
55
|
+
save_matlab,
|
|
56
|
+
save_catboost,
|
|
57
|
+
save_text,
|
|
58
|
+
save_html,
|
|
59
|
+
save_image,
|
|
60
|
+
save_mp4,
|
|
61
|
+
save_listed_dfs_as_csv,
|
|
62
|
+
save_listed_scalars_as_csv,
|
|
63
|
+
save_optuna_study_as_csv_and_pngs,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _get_figure_with_data(obj):
|
|
68
|
+
"""
|
|
69
|
+
Extract figure or axes object that may contain plotting data for CSV export.
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
obj : various matplotlib objects
|
|
74
|
+
Could be Figure, Axes, FigWrapper, AxisWrapper, or other matplotlib objects
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
object or None
|
|
79
|
+
Figure or axes object that has export_as_csv methods, or None if not found
|
|
80
|
+
"""
|
|
81
|
+
import matplotlib.pyplot as plt
|
|
82
|
+
import matplotlib.figure
|
|
83
|
+
import matplotlib.axes
|
|
84
|
+
|
|
85
|
+
# Check if object already has export methods (SciTeX wrapped objects)
|
|
86
|
+
if hasattr(obj, 'export_as_csv'):
|
|
87
|
+
return obj
|
|
88
|
+
|
|
89
|
+
# Handle matplotlib Figure objects
|
|
90
|
+
if isinstance(obj, matplotlib.figure.Figure):
|
|
91
|
+
# Get the current axes that might be wrapped with SciTeX functionality
|
|
92
|
+
current_ax = plt.gca()
|
|
93
|
+
if hasattr(current_ax, 'export_as_csv'):
|
|
94
|
+
return current_ax
|
|
95
|
+
|
|
96
|
+
# Check all axes in the figure
|
|
97
|
+
for ax in obj.axes:
|
|
98
|
+
if hasattr(ax, 'export_as_csv'):
|
|
99
|
+
return ax
|
|
100
|
+
|
|
101
|
+
return None
|
|
102
|
+
|
|
103
|
+
# Handle matplotlib Axes objects
|
|
104
|
+
if isinstance(obj, matplotlib.axes.Axes):
|
|
105
|
+
if hasattr(obj, 'export_as_csv'):
|
|
106
|
+
return obj
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
# Handle FigWrapper or similar SciTeX objects
|
|
110
|
+
if hasattr(obj, 'figure') and hasattr(obj.figure, 'axes'):
|
|
111
|
+
# Check if the wrapper itself has export methods
|
|
112
|
+
if hasattr(obj, 'export_as_csv'):
|
|
113
|
+
return obj
|
|
114
|
+
|
|
115
|
+
# Check the underlying figure's axes
|
|
116
|
+
for ax in obj.figure.axes:
|
|
117
|
+
if hasattr(ax, 'export_as_csv'):
|
|
118
|
+
return ax
|
|
119
|
+
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
# Handle AxisWrapper or similar SciTeX objects
|
|
123
|
+
if hasattr(obj, '_axis_mpl') or hasattr(obj, '_ax'):
|
|
124
|
+
if hasattr(obj, 'export_as_csv'):
|
|
125
|
+
return obj
|
|
126
|
+
return None
|
|
127
|
+
|
|
128
|
+
# Try to get the current figure and its axes as fallback
|
|
129
|
+
try:
|
|
130
|
+
current_fig = plt.gcf()
|
|
131
|
+
current_ax = plt.gca()
|
|
132
|
+
|
|
133
|
+
if hasattr(current_ax, 'export_as_csv'):
|
|
134
|
+
return current_ax
|
|
135
|
+
elif hasattr(current_fig, 'export_as_csv'):
|
|
136
|
+
return current_fig
|
|
137
|
+
|
|
138
|
+
# Check all axes in current figure
|
|
139
|
+
for ax in current_fig.axes:
|
|
140
|
+
if hasattr(ax, 'export_as_csv'):
|
|
141
|
+
return ax
|
|
142
|
+
|
|
143
|
+
except:
|
|
144
|
+
pass
|
|
145
|
+
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def save(
|
|
150
|
+
obj: Any,
|
|
151
|
+
specified_path: str,
|
|
152
|
+
makedirs: bool = True,
|
|
153
|
+
verbose: bool = True,
|
|
154
|
+
symlink_from_cwd: bool = False,
|
|
155
|
+
dry_run: bool = False,
|
|
156
|
+
no_csv: bool = False,
|
|
157
|
+
**kwargs,
|
|
158
|
+
) -> None:
|
|
159
|
+
"""
|
|
160
|
+
Save an object to a file with the specified format.
|
|
161
|
+
|
|
162
|
+
Parameters
|
|
163
|
+
----------
|
|
164
|
+
obj : Any
|
|
165
|
+
The object to be saved. Can be a NumPy array, PyTorch tensor, Pandas DataFrame, or any serializable object.
|
|
166
|
+
specified_path : str
|
|
167
|
+
The file name or path where the object should be saved. The file extension determines the format.
|
|
168
|
+
makedirs : bool, optional
|
|
169
|
+
If True, create the directory path if it does not exist. Default is True.
|
|
170
|
+
verbose : bool, optional
|
|
171
|
+
If True, print a message upon successful saving. Default is True.
|
|
172
|
+
symlink_from_cwd : bool, optional
|
|
173
|
+
If True, create a _symlink from the current working directory. Default is False.
|
|
174
|
+
dry_run : bool, optional
|
|
175
|
+
If True, simulate the saving process without actually writing files. Default is False.
|
|
176
|
+
**kwargs
|
|
177
|
+
Additional keyword arguments to pass to the underlying save function of the specific format.
|
|
178
|
+
|
|
179
|
+
Returns
|
|
180
|
+
-------
|
|
181
|
+
None
|
|
182
|
+
|
|
183
|
+
Notes
|
|
184
|
+
-----
|
|
185
|
+
Supported formats include CSV, NPY, PKL, JOBLIB, PNG, HTML, TIFF, MP4, YAML, JSON, HDF5, PTH, MAT, and CBM.
|
|
186
|
+
The function dynamically selects the appropriate saving mechanism based on the file extension.
|
|
187
|
+
|
|
188
|
+
Examples
|
|
189
|
+
--------
|
|
190
|
+
>>> import scitex
|
|
191
|
+
>>> import numpy as np
|
|
192
|
+
>>> import pandas as pd
|
|
193
|
+
>>> import torch
|
|
194
|
+
>>> import matplotlib.pyplot as plt
|
|
195
|
+
|
|
196
|
+
>>> # Save NumPy array
|
|
197
|
+
>>> arr = np.array([1, 2, 3])
|
|
198
|
+
>>> scitex.io.save(arr, "data.npy")
|
|
199
|
+
|
|
200
|
+
>>> # Save Pandas DataFrame
|
|
201
|
+
>>> df = pd.DataFrame({"col1": [1, 2], "col2": [3, 4]})
|
|
202
|
+
>>> scitex.io.save(df, "data.csv")
|
|
203
|
+
|
|
204
|
+
>>> # Save PyTorch tensor
|
|
205
|
+
>>> tensor = torch.tensor([1, 2, 3])
|
|
206
|
+
>>> scitex.io.save(tensor, "model.pth")
|
|
207
|
+
|
|
208
|
+
>>> # Save dictionary
|
|
209
|
+
>>> data_dict = {"a": 1, "b": 2, "c": [3, 4, 5]}
|
|
210
|
+
>>> scitex.io.save(data_dict, "data.pkl")
|
|
211
|
+
|
|
212
|
+
>>> # Save matplotlib figure
|
|
213
|
+
>>> plt.figure()
|
|
214
|
+
>>> plt.plot(np.array([1, 2, 3]))
|
|
215
|
+
>>> scitex.io.save(plt, "plot.png")
|
|
216
|
+
|
|
217
|
+
>>> # Save as YAML
|
|
218
|
+
>>> scitex.io.save(data_dict, "config.yaml")
|
|
219
|
+
|
|
220
|
+
>>> # Save as JSON
|
|
221
|
+
>>> scitex.io.save(data_dict, "data.json")
|
|
222
|
+
"""
|
|
223
|
+
try:
|
|
224
|
+
########################################
|
|
225
|
+
# DO NOT MODIFY THIS SECTION
|
|
226
|
+
########################################
|
|
227
|
+
#
|
|
228
|
+
# Determine saving directory from the script.
|
|
229
|
+
#
|
|
230
|
+
# When called in /path/to/script.py,
|
|
231
|
+
# data will be saved under `/path/to/script.py_out/`
|
|
232
|
+
#
|
|
233
|
+
# On the other hand, when called in ipython environment,
|
|
234
|
+
# data will be saved under `/tmp/{_os.getenv("USER")/`
|
|
235
|
+
#
|
|
236
|
+
########################################
|
|
237
|
+
spath, sfname = None, None
|
|
238
|
+
|
|
239
|
+
# f-expression handling - safely parse f-strings
|
|
240
|
+
if specified_path.startswith('f"') or specified_path.startswith("f'"):
|
|
241
|
+
# Remove the f prefix and quotes
|
|
242
|
+
path_content = specified_path[2:-1]
|
|
243
|
+
|
|
244
|
+
# Get the caller's frame to access their local variables
|
|
245
|
+
frame = inspect.currentframe().f_back
|
|
246
|
+
try:
|
|
247
|
+
# Use string formatting with the caller's locals and globals
|
|
248
|
+
# This is much safer than eval() as it only does string substitution
|
|
249
|
+
import re
|
|
250
|
+
# Find all {variable} patterns
|
|
251
|
+
variables = re.findall(r'\{([^}]+)\}', path_content)
|
|
252
|
+
format_dict = {}
|
|
253
|
+
for var in variables:
|
|
254
|
+
# Only allow simple variable names, not arbitrary expressions
|
|
255
|
+
if re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', var):
|
|
256
|
+
if var in frame.f_locals:
|
|
257
|
+
format_dict[var] = frame.f_locals[var]
|
|
258
|
+
elif var in frame.f_globals:
|
|
259
|
+
format_dict[var] = frame.f_globals[var]
|
|
260
|
+
else:
|
|
261
|
+
raise ValueError(f"Invalid variable name in f-string: {var}")
|
|
262
|
+
|
|
263
|
+
# Use str.format() which is safe
|
|
264
|
+
specified_path = path_content.format(**format_dict)
|
|
265
|
+
finally:
|
|
266
|
+
del frame # Avoid reference cycles
|
|
267
|
+
|
|
268
|
+
# When full path
|
|
269
|
+
if specified_path.startswith("/"):
|
|
270
|
+
spath = specified_path
|
|
271
|
+
|
|
272
|
+
# When relative path
|
|
273
|
+
else:
|
|
274
|
+
script_path = inspect.stack()[1].filename
|
|
275
|
+
|
|
276
|
+
# Fake path if in ipython
|
|
277
|
+
if ("ipython" in script_path) or ("<stdin>" in script_path):
|
|
278
|
+
script_path = f'/tmp/{_os.getenv("USER")}'
|
|
279
|
+
|
|
280
|
+
sdir = clean_path(_os.path.splitext(script_path)[0] + "_out")
|
|
281
|
+
spath = _os.path.join(sdir, specified_path)
|
|
282
|
+
|
|
283
|
+
# Sanitization
|
|
284
|
+
spath_final = clean(spath)
|
|
285
|
+
########################################
|
|
286
|
+
|
|
287
|
+
# Potential path to _symlink
|
|
288
|
+
spath_cwd = _os.getcwd() + "/" + specified_path
|
|
289
|
+
spath_cwd = clean(spath_cwd)
|
|
290
|
+
|
|
291
|
+
# Removes spath and spath_cwd to prevent potential circular links
|
|
292
|
+
# Skip deletion for CSV files to allow caching to work
|
|
293
|
+
# Also skip deletion for HDF5 files when a key is specified
|
|
294
|
+
should_skip_deletion = (
|
|
295
|
+
spath_final.endswith('.csv') or
|
|
296
|
+
((spath_final.endswith('.hdf5') or spath_final.endswith('.h5')) and 'key' in kwargs)
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
if not should_skip_deletion:
|
|
300
|
+
for path in [spath_final, spath_cwd]:
|
|
301
|
+
sh(f"rm -f {path}", verbose=False)
|
|
302
|
+
|
|
303
|
+
if dry_run:
|
|
304
|
+
print(color_text(f"\n(dry run) Saved to: {spath_final}", c="yellow"))
|
|
305
|
+
return
|
|
306
|
+
|
|
307
|
+
# Ensure directory exists
|
|
308
|
+
if makedirs:
|
|
309
|
+
_os.makedirs(_os.path.dirname(spath_final), exist_ok=True)
|
|
310
|
+
|
|
311
|
+
# Main
|
|
312
|
+
_save(
|
|
313
|
+
obj,
|
|
314
|
+
spath_final,
|
|
315
|
+
verbose=verbose,
|
|
316
|
+
symlink_from_cwd=symlink_from_cwd,
|
|
317
|
+
dry_run=dry_run,
|
|
318
|
+
no_csv=no_csv,
|
|
319
|
+
**kwargs,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
# Symbolic link
|
|
323
|
+
_symlink(spath, spath_cwd, symlink_from_cwd, verbose)
|
|
324
|
+
|
|
325
|
+
except Exception as e:
|
|
326
|
+
logging.error(
|
|
327
|
+
f"Error occurred while saving: {str(e)}"
|
|
328
|
+
f"Debug: Initial script_path = {inspect.stack()[1].filename}"
|
|
329
|
+
f"Debug: Final spath = {spath}"
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def _symlink(spath, spath_cwd, symlink_from_cwd, verbose):
|
|
334
|
+
"""Create a symbolic link from the current working directory."""
|
|
335
|
+
if symlink_from_cwd and (spath != spath_cwd):
|
|
336
|
+
_os.makedirs(_os.path.dirname(spath_cwd), exist_ok=True)
|
|
337
|
+
sh(f"rm -f {spath_cwd}", verbose=False)
|
|
338
|
+
sh(f"ln -sfr {spath} {spath_cwd}", verbose=False)
|
|
339
|
+
if verbose:
|
|
340
|
+
print(color_text(f"\n(Symlinked to: {spath_cwd})", "yellow"))
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def _save(
|
|
344
|
+
obj,
|
|
345
|
+
spath,
|
|
346
|
+
verbose=True,
|
|
347
|
+
symlink_from_cwd=False,
|
|
348
|
+
dry_run=False,
|
|
349
|
+
no_csv=False,
|
|
350
|
+
**kwargs,
|
|
351
|
+
):
|
|
352
|
+
# Get file extension
|
|
353
|
+
ext = _os.path.splitext(spath)[1].lower()
|
|
354
|
+
|
|
355
|
+
# Try dispatch dictionary first for O(1) lookup
|
|
356
|
+
if ext in _FILE_HANDLERS:
|
|
357
|
+
# Check if handler needs special parameters
|
|
358
|
+
if ext in ['.png', '.jpg', '.jpeg', '.gif', '.tiff', '.tif', '.svc']:
|
|
359
|
+
_FILE_HANDLERS[ext](obj, spath, no_csv=no_csv, symlink_from_cwd=symlink_from_cwd, dry_run=dry_run, **kwargs)
|
|
360
|
+
elif ext in ['.hdf5', '.h5']:
|
|
361
|
+
# HDF5 files may need special 'key' parameter
|
|
362
|
+
_FILE_HANDLERS[ext](obj, spath, **kwargs)
|
|
363
|
+
else:
|
|
364
|
+
_FILE_HANDLERS[ext](obj, spath, **kwargs)
|
|
365
|
+
# csv - special case as it doesn't have a dot prefix in dispatch
|
|
366
|
+
elif spath.endswith(".csv"):
|
|
367
|
+
save_csv(obj, spath, **kwargs)
|
|
368
|
+
# Check for special extension cases not in dispatch
|
|
369
|
+
elif spath.endswith(".pkl.gz"):
|
|
370
|
+
save_pickle_compressed(obj, spath, **kwargs)
|
|
371
|
+
else:
|
|
372
|
+
warnings.warn(f"Unsupported file format. {spath} was not saved.")
|
|
373
|
+
|
|
374
|
+
if verbose:
|
|
375
|
+
if _os.path.exists(spath):
|
|
376
|
+
file_size = getsize(spath)
|
|
377
|
+
file_size = readable_bytes(file_size)
|
|
378
|
+
print(color_text(f"\nSaved to: {spath} ({file_size})", c="yellow"))
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def _save_separate_legends(obj, spath, symlink_from_cwd=False, dry_run=False, **kwargs):
|
|
382
|
+
"""Save separate legend files if ax.legend('separate') was used."""
|
|
383
|
+
import matplotlib.pyplot as plt
|
|
384
|
+
import matplotlib.figure
|
|
385
|
+
|
|
386
|
+
# Get the matplotlib figure object
|
|
387
|
+
fig = None
|
|
388
|
+
if isinstance(obj, matplotlib.figure.Figure):
|
|
389
|
+
fig = obj
|
|
390
|
+
elif hasattr(obj, '_fig_mpl'):
|
|
391
|
+
fig = obj._fig_mpl
|
|
392
|
+
elif hasattr(obj, 'figure'):
|
|
393
|
+
if isinstance(obj.figure, matplotlib.figure.Figure):
|
|
394
|
+
fig = obj.figure
|
|
395
|
+
elif hasattr(obj.figure, '_fig_mpl'):
|
|
396
|
+
fig = obj.figure._fig_mpl
|
|
397
|
+
|
|
398
|
+
if fig is None:
|
|
399
|
+
return
|
|
400
|
+
|
|
401
|
+
# Check if there are separate legend parameters stored
|
|
402
|
+
if not hasattr(fig, '_separate_legend_params'):
|
|
403
|
+
return
|
|
404
|
+
|
|
405
|
+
# Save each legend as a separate file
|
|
406
|
+
base_path = _os.path.splitext(spath)[0]
|
|
407
|
+
ext = _os.path.splitext(spath)[1]
|
|
408
|
+
|
|
409
|
+
for legend_params in fig._separate_legend_params:
|
|
410
|
+
# Create a new figure for the legend
|
|
411
|
+
legend_fig = plt.figure(figsize=legend_params['figsize'])
|
|
412
|
+
legend_ax = legend_fig.add_subplot(111)
|
|
413
|
+
|
|
414
|
+
# Create the legend
|
|
415
|
+
legend = legend_ax.legend(
|
|
416
|
+
legend_params['handles'],
|
|
417
|
+
legend_params['labels'],
|
|
418
|
+
loc='center',
|
|
419
|
+
frameon=legend_params['frameon'],
|
|
420
|
+
fancybox=legend_params['fancybox'],
|
|
421
|
+
shadow=legend_params['shadow'],
|
|
422
|
+
**legend_params['kwargs']
|
|
423
|
+
)
|
|
424
|
+
|
|
425
|
+
# Remove axes
|
|
426
|
+
legend_ax.axis('off')
|
|
427
|
+
|
|
428
|
+
# Adjust layout to fit the legend
|
|
429
|
+
legend_fig.tight_layout()
|
|
430
|
+
|
|
431
|
+
# Save the legend figure
|
|
432
|
+
legend_filename = f"{base_path}_{legend_params['axis_id']}_legend{ext}"
|
|
433
|
+
save_image(legend_fig, legend_filename, **kwargs)
|
|
434
|
+
|
|
435
|
+
# Close the legend figure to free memory
|
|
436
|
+
plt.close(legend_fig)
|
|
437
|
+
|
|
438
|
+
if not dry_run and _os.path.exists(legend_filename):
|
|
439
|
+
file_size = getsize(legend_filename)
|
|
440
|
+
file_size = readable_bytes(file_size)
|
|
441
|
+
print(color_text(f"\nSaved legend to: {legend_filename} ({file_size})", c="yellow"))
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def _handle_image_with_csv(obj, spath, no_csv=False, symlink_from_cwd=False, dry_run=False, **kwargs):
|
|
445
|
+
"""Handle image file saving with optional CSV export."""
|
|
446
|
+
save_image(obj, spath, **kwargs)
|
|
447
|
+
|
|
448
|
+
# Handle separate legend saving
|
|
449
|
+
_save_separate_legends(obj, spath, symlink_from_cwd=symlink_from_cwd, dry_run=dry_run, **kwargs)
|
|
450
|
+
|
|
451
|
+
if not no_csv:
|
|
452
|
+
ext = _os.path.splitext(spath)[1].lower()
|
|
453
|
+
ext_wo_dot = ext.replace(".", "")
|
|
454
|
+
|
|
455
|
+
try:
|
|
456
|
+
# Get the figure object that may contain plot data
|
|
457
|
+
fig_obj = _get_figure_with_data(obj)
|
|
458
|
+
|
|
459
|
+
if fig_obj is not None:
|
|
460
|
+
# Save regular CSV if export method exists
|
|
461
|
+
if hasattr(fig_obj, 'export_as_csv'):
|
|
462
|
+
csv_data = fig_obj.export_as_csv()
|
|
463
|
+
if csv_data is not None and not csv_data.empty:
|
|
464
|
+
save(
|
|
465
|
+
csv_data,
|
|
466
|
+
spath.replace(ext_wo_dot, "csv"),
|
|
467
|
+
symlink_from_cwd=symlink_from_cwd,
|
|
468
|
+
dry_run=dry_run,
|
|
469
|
+
no_csv=True,
|
|
470
|
+
**kwargs,
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
# Save SigmaPlot CSV if method exists
|
|
474
|
+
if hasattr(fig_obj, 'export_as_csv_for_sigmaplot'):
|
|
475
|
+
sigmaplot_data = fig_obj.export_as_csv_for_sigmaplot()
|
|
476
|
+
if sigmaplot_data is not None and not sigmaplot_data.empty:
|
|
477
|
+
save(
|
|
478
|
+
sigmaplot_data,
|
|
479
|
+
spath.replace(ext_wo_dot, "csv").replace(".csv", "_for_sigmaplot.csv"),
|
|
480
|
+
symlink_from_cwd=symlink_from_cwd,
|
|
481
|
+
dry_run=dry_run,
|
|
482
|
+
no_csv=True,
|
|
483
|
+
**kwargs,
|
|
484
|
+
)
|
|
485
|
+
except Exception:
|
|
486
|
+
pass
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
# Dispatch dictionary for O(1) file format lookup
|
|
490
|
+
_FILE_HANDLERS = {
|
|
491
|
+
# Excel formats
|
|
492
|
+
'.xlsx': save_excel,
|
|
493
|
+
'.xls': save_excel,
|
|
494
|
+
|
|
495
|
+
# NumPy formats
|
|
496
|
+
'.npy': save_npy,
|
|
497
|
+
'.npz': save_npz,
|
|
498
|
+
|
|
499
|
+
# Pickle formats
|
|
500
|
+
'.pkl': save_pickle,
|
|
501
|
+
'.pickle': save_pickle,
|
|
502
|
+
'.pkl.gz': save_pickle_compressed,
|
|
503
|
+
|
|
504
|
+
# Other binary formats
|
|
505
|
+
'.joblib': save_joblib,
|
|
506
|
+
'.pth': save_torch,
|
|
507
|
+
'.pt': save_torch,
|
|
508
|
+
'.mat': save_matlab,
|
|
509
|
+
'.cbm': save_catboost,
|
|
510
|
+
|
|
511
|
+
# Text formats
|
|
512
|
+
'.json': save_json,
|
|
513
|
+
'.yaml': save_yaml,
|
|
514
|
+
'.yml': save_yaml,
|
|
515
|
+
'.txt': save_text,
|
|
516
|
+
'.md': save_text,
|
|
517
|
+
'.py': save_text,
|
|
518
|
+
'.css': save_text,
|
|
519
|
+
'.js': save_text,
|
|
520
|
+
|
|
521
|
+
# Data formats
|
|
522
|
+
'.html': save_html,
|
|
523
|
+
'.hdf5': save_hdf5,
|
|
524
|
+
'.h5': save_hdf5,
|
|
525
|
+
|
|
526
|
+
# Media formats
|
|
527
|
+
'.mp4': save_mp4,
|
|
528
|
+
'.png': _handle_image_with_csv,
|
|
529
|
+
'.jpg': _handle_image_with_csv,
|
|
530
|
+
'.jpeg': _handle_image_with_csv,
|
|
531
|
+
'.gif': _handle_image_with_csv,
|
|
532
|
+
'.tiff': _handle_image_with_csv,
|
|
533
|
+
'.tif': _handle_image_with_csv,
|
|
534
|
+
'.svg': _handle_image_with_csv,
|
|
535
|
+
'.pdf': _handle_image_with_csv,
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
# EOF
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-06-12 13:05:00 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/.claude-worktree/scitex_repo/src/scitex/io/_save_modules/__init__.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/io/_save_modules/__init__.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Save modules for scitex.io.save functionality
|
|
14
|
+
|
|
15
|
+
This package contains format-specific save handlers for various file types.
|
|
16
|
+
Each module provides a save_<format> function that handles saving objects
|
|
17
|
+
to that specific format.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# Import save functions from individual modules
|
|
21
|
+
from ._csv import _save_csv as save_csv
|
|
22
|
+
from ._excel import save_excel
|
|
23
|
+
from ._numpy import _save_npy as save_npy, _save_npz as save_npz
|
|
24
|
+
from ._pickle import _save_pickle as save_pickle, _save_pickle_gz as save_pickle_compressed
|
|
25
|
+
from ._joblib import _save_joblib as save_joblib
|
|
26
|
+
from ._torch import _save_torch as save_torch
|
|
27
|
+
from ._json import _save_json as save_json
|
|
28
|
+
from ._yaml import _save_yaml as save_yaml
|
|
29
|
+
from ._hdf5 import _save_hdf5 as save_hdf5
|
|
30
|
+
from ._matlab import _save_matlab as save_matlab
|
|
31
|
+
from ._catboost import _save_catboost as save_catboost
|
|
32
|
+
from ._text import _save_text as save_text
|
|
33
|
+
from ._html import save_html
|
|
34
|
+
from ._image import save_image
|
|
35
|
+
from ._mp4 import _mk_mp4 as save_mp4
|
|
36
|
+
|
|
37
|
+
# Import additional save utilities
|
|
38
|
+
from ._listed_dfs_as_csv import _save_listed_dfs_as_csv as save_listed_dfs_as_csv
|
|
39
|
+
from ._listed_scalars_as_csv import _save_listed_scalars_as_csv as save_listed_scalars_as_csv
|
|
40
|
+
from ._optuna_study_as_csv_and_pngs import save_optuna_study_as_csv_and_pngs
|
|
41
|
+
|
|
42
|
+
# Define what gets imported with "from scitex.io._save_modules import *"
|
|
43
|
+
__all__ = [
|
|
44
|
+
"save_csv",
|
|
45
|
+
"save_excel",
|
|
46
|
+
"save_npy",
|
|
47
|
+
"save_npz",
|
|
48
|
+
"save_pickle",
|
|
49
|
+
"save_pickle_compressed",
|
|
50
|
+
"save_joblib",
|
|
51
|
+
"save_torch",
|
|
52
|
+
"save_json",
|
|
53
|
+
"save_yaml",
|
|
54
|
+
"save_hdf5",
|
|
55
|
+
"save_matlab",
|
|
56
|
+
"save_catboost",
|
|
57
|
+
"save_text",
|
|
58
|
+
"save_html",
|
|
59
|
+
"save_image",
|
|
60
|
+
"save_mp4",
|
|
61
|
+
"save_listed_dfs_as_csv",
|
|
62
|
+
"save_listed_scalars_as_csv",
|
|
63
|
+
"save_optuna_study_as_csv_and_pngs",
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
# EOF
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-16 12:29:11 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/io/_save_modules/_catboost.py
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _save_catboost(obj, spath):
|
|
8
|
+
"""
|
|
9
|
+
Save a CatBoost model.
|
|
10
|
+
|
|
11
|
+
Parameters
|
|
12
|
+
----------
|
|
13
|
+
obj : catboost.CatBoost
|
|
14
|
+
The CatBoost model to save.
|
|
15
|
+
spath : str
|
|
16
|
+
Path where the CatBoost model file will be saved.
|
|
17
|
+
|
|
18
|
+
Returns
|
|
19
|
+
-------
|
|
20
|
+
None
|
|
21
|
+
"""
|
|
22
|
+
obj.save_model(spath)
|