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
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
def _format_sns_kdeplot(id, tracked_dict, kwargs):
|
|
17
|
+
"""Format data from a sns_kdeplot call."""
|
|
18
|
+
# Kernel density estimate plot
|
|
19
|
+
if len(args) >= 1:
|
|
20
|
+
data = args[0]
|
|
21
|
+
x_var = kwtracked_dict.get("x")
|
|
22
|
+
y_var = kwtracked_dict.get("y")
|
|
23
|
+
|
|
24
|
+
# Handle DataFrame input with x, y variables
|
|
25
|
+
if isinstance(data, pd.DataFrame) and x_var:
|
|
26
|
+
if y_var: # Bivariate KDE
|
|
27
|
+
result = pd.DataFrame(
|
|
28
|
+
{
|
|
29
|
+
f"{id}_kde_{x_var}": data[x_var],
|
|
30
|
+
f"{id}_kde_{y_var}": data[y_var],
|
|
31
|
+
}
|
|
32
|
+
)
|
|
33
|
+
else: # Univariate KDE
|
|
34
|
+
result = pd.DataFrame({f"{id}_kde_{x_var}": data[x_var]})
|
|
35
|
+
return result
|
|
36
|
+
|
|
37
|
+
# Handle direct data array input
|
|
38
|
+
elif isinstance(data, (np.ndarray, list)):
|
|
39
|
+
y_data = (
|
|
40
|
+
args[1]
|
|
41
|
+
if len(args) > 1 and isinstance(args[1], (np.ndarray, list))
|
|
42
|
+
else None
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
if y_data is not None: # Bivariate KDE
|
|
46
|
+
return pd.DataFrame(
|
|
47
|
+
{f"{id}_kde_x": data, f"{id}_kde_y": y_data}
|
|
48
|
+
)
|
|
49
|
+
else: # Univariate KDE
|
|
50
|
+
return pd.DataFrame({f"{id}_kde_x": data})
|
|
51
|
+
|
|
52
|
+
# Handle DataFrame input without x, y specified
|
|
53
|
+
elif isinstance(data, pd.DataFrame):
|
|
54
|
+
result = data.copy()
|
|
55
|
+
if id is not None:
|
|
56
|
+
result.columns = [f"{id}_kde_{col}" for col in result.columns]
|
|
57
|
+
return result
|
|
58
|
+
|
|
59
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
def _format_sns_lineplot(id, tracked_dict, kwargs):
|
|
17
|
+
"""Format data from a sns_lineplot call."""
|
|
18
|
+
# Line plot with potential error bands from seaborn
|
|
19
|
+
if len(args) >= 1:
|
|
20
|
+
data = args[0]
|
|
21
|
+
x_var = kwtracked_dict.get("x")
|
|
22
|
+
y_var = kwtracked_dict.get("y")
|
|
23
|
+
|
|
24
|
+
# Handle DataFrame input with x, y variables
|
|
25
|
+
if isinstance(data, pd.DataFrame) and x_var and y_var:
|
|
26
|
+
result = pd.DataFrame(
|
|
27
|
+
{
|
|
28
|
+
f"{id}_line_{x_var}": data[x_var],
|
|
29
|
+
f"{id}_line_{y_var}": data[y_var],
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# Add grouping variable if present
|
|
34
|
+
hue_var = kwtracked_dict.get("hue")
|
|
35
|
+
if hue_var and hue_var in data.columns:
|
|
36
|
+
result[f"{id}_line_{hue_var}"] = data[hue_var]
|
|
37
|
+
|
|
38
|
+
return result
|
|
39
|
+
|
|
40
|
+
# Handle direct x, y data arrays
|
|
41
|
+
elif (
|
|
42
|
+
len(args) > 1
|
|
43
|
+
and isinstance(args[0], (np.ndarray, list))
|
|
44
|
+
and isinstance(args[1], (np.ndarray, list))
|
|
45
|
+
):
|
|
46
|
+
x_data, y_data = args[0], args[1]
|
|
47
|
+
return pd.DataFrame(
|
|
48
|
+
{f"{id}_line_x": x_data, f"{id}_line_y": y_data}
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# Handle DataFrame input without x, y specified
|
|
52
|
+
elif isinstance(data, pd.DataFrame):
|
|
53
|
+
result = data.copy()
|
|
54
|
+
if id is not None:
|
|
55
|
+
result.columns = [f"{id}_line_{col}" for col in result.columns]
|
|
56
|
+
return result
|
|
57
|
+
|
|
58
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
|
|
15
|
+
def _format_sns_pairplot(id, tracked_dict, kwargs):
|
|
16
|
+
"""Format data from a sns_pairplot call."""
|
|
17
|
+
# Check if tracked_dict is empty or not a dictionary
|
|
18
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
19
|
+
return pd.DataFrame()
|
|
20
|
+
|
|
21
|
+
# Get the args from tracked_dict
|
|
22
|
+
args = tracked_dict.get('args', [])
|
|
23
|
+
|
|
24
|
+
# Grid of plots showing pairwise relationships
|
|
25
|
+
if len(args) >= 1:
|
|
26
|
+
data = args[0]
|
|
27
|
+
|
|
28
|
+
# Handle DataFrame input
|
|
29
|
+
if isinstance(data, pd.DataFrame):
|
|
30
|
+
# For pairplot, just return the full DataFrame since it uses all variables
|
|
31
|
+
result = data.copy()
|
|
32
|
+
if id is not None:
|
|
33
|
+
result.columns = [f"{id}_pair_{col}" for col in result.columns]
|
|
34
|
+
|
|
35
|
+
# Add vars or hue columns if specified
|
|
36
|
+
vars_list = kwargs.get("vars")
|
|
37
|
+
if vars_list and all(var in data.columns for var in vars_list):
|
|
38
|
+
# Keep only the specified columns
|
|
39
|
+
result = pd.DataFrame(
|
|
40
|
+
{f"{id}_pair_{col}": data[col] for col in vars_list}
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return result
|
|
44
|
+
|
|
45
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
def _format_sns_scatterplot(id, tracked_dict, kwargs=None):
|
|
17
|
+
"""Format data from a sns_scatterplot call.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
id (str): Identifier for the plot (already unpacked from the record tuple)
|
|
21
|
+
tracked_dict (dict): Tracked data dictionary from the record tuple
|
|
22
|
+
kwargs (dict): Keyword arguments from the record tuple
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
pd.DataFrame: Formatted data for the plot
|
|
26
|
+
"""
|
|
27
|
+
# Look for the DataFrame in the kwargs dictionary if provided
|
|
28
|
+
if kwargs and isinstance(kwargs, dict) and 'data' in kwargs:
|
|
29
|
+
data = kwargs['data']
|
|
30
|
+
if isinstance(data, pd.DataFrame):
|
|
31
|
+
# Use the DataFrame provided in kwargs
|
|
32
|
+
result = pd.DataFrame()
|
|
33
|
+
|
|
34
|
+
# If x and y variables are specified in kwargs, use them to extract columns
|
|
35
|
+
x_var = kwargs.get('x')
|
|
36
|
+
y_var = kwargs.get('y')
|
|
37
|
+
|
|
38
|
+
if x_var and y_var and x_var in data.columns and y_var in data.columns:
|
|
39
|
+
# Extract these specific columns
|
|
40
|
+
result[f"{id}_x"] = data[x_var]
|
|
41
|
+
result[f"{id}_y"] = data[y_var]
|
|
42
|
+
|
|
43
|
+
# Also extract hue, size, style if they are specified
|
|
44
|
+
for extra_var in ['hue', 'size', 'style']:
|
|
45
|
+
var_name = kwargs.get(extra_var)
|
|
46
|
+
if var_name and var_name in data.columns:
|
|
47
|
+
result[f"{id}_{extra_var}"] = data[var_name]
|
|
48
|
+
|
|
49
|
+
return result
|
|
50
|
+
else:
|
|
51
|
+
# If columns aren't specified, include all columns
|
|
52
|
+
for col in data.columns:
|
|
53
|
+
result[f"{id}_{col}"] = data[col]
|
|
54
|
+
return result
|
|
55
|
+
|
|
56
|
+
# Alternative: try to find a DataFrame in tracked_dict
|
|
57
|
+
if tracked_dict and isinstance(tracked_dict, dict):
|
|
58
|
+
# Search for 'data' key
|
|
59
|
+
if 'data' in tracked_dict and isinstance(tracked_dict['data'], pd.DataFrame):
|
|
60
|
+
data = tracked_dict['data']
|
|
61
|
+
result = pd.DataFrame()
|
|
62
|
+
|
|
63
|
+
# Just copy all columns from the data
|
|
64
|
+
for col in data.columns:
|
|
65
|
+
result[f"{id}_{col}"] = data[col]
|
|
66
|
+
|
|
67
|
+
return result
|
|
68
|
+
|
|
69
|
+
# If all else fails, return an empty DataFrame
|
|
70
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
|
|
15
|
+
def _format_sns_stripplot(id, tracked_dict, kwargs):
|
|
16
|
+
"""Format data from a sns_stripplot call.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
id (str): Identifier for the plot
|
|
20
|
+
tracked_dict (dict): Dictionary containing tracked data
|
|
21
|
+
kwargs (dict): Keyword arguments passed to sns_stripplot
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
pd.DataFrame: Formatted data for the plot
|
|
25
|
+
"""
|
|
26
|
+
# Check if tracked_dict is empty or not a dictionary
|
|
27
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
28
|
+
return pd.DataFrame()
|
|
29
|
+
|
|
30
|
+
# If 'data' key is in tracked_dict, use it
|
|
31
|
+
if 'data' in tracked_dict:
|
|
32
|
+
data = tracked_dict['data']
|
|
33
|
+
|
|
34
|
+
# Handle DataFrame input with x and/or y variables
|
|
35
|
+
if isinstance(data, pd.DataFrame):
|
|
36
|
+
result = pd.DataFrame()
|
|
37
|
+
|
|
38
|
+
# Extract variables from kwargs
|
|
39
|
+
x_var = kwargs.get("x")
|
|
40
|
+
y_var = kwargs.get("y")
|
|
41
|
+
|
|
42
|
+
# Add x variable if specified
|
|
43
|
+
if x_var and x_var in data.columns:
|
|
44
|
+
result[f"{id}_strip_{x_var}"] = data[x_var]
|
|
45
|
+
|
|
46
|
+
# Add y variable if specified
|
|
47
|
+
if y_var and y_var in data.columns:
|
|
48
|
+
result[f"{id}_strip_{y_var}"] = data[y_var]
|
|
49
|
+
|
|
50
|
+
# Add grouping variable if present
|
|
51
|
+
hue_var = kwargs.get("hue")
|
|
52
|
+
if hue_var and hue_var in data.columns:
|
|
53
|
+
result[f"{id}_strip_{hue_var}"] = data[hue_var]
|
|
54
|
+
|
|
55
|
+
# If we've added columns, return the result
|
|
56
|
+
if not result.empty:
|
|
57
|
+
return result
|
|
58
|
+
|
|
59
|
+
# If no columns were explicitly specified, return all columns
|
|
60
|
+
result = data.copy()
|
|
61
|
+
result.columns = [f"{id}_strip_{col}" for col in result.columns]
|
|
62
|
+
return result
|
|
63
|
+
|
|
64
|
+
# Legacy handling for args
|
|
65
|
+
if 'args' in tracked_dict and len(tracked_dict['args']) >= 1:
|
|
66
|
+
data = tracked_dict['args'][0]
|
|
67
|
+
|
|
68
|
+
# Handle DataFrame input
|
|
69
|
+
if isinstance(data, pd.DataFrame):
|
|
70
|
+
result = data.copy()
|
|
71
|
+
result.columns = [f"{id}_strip_{col}" for col in result.columns]
|
|
72
|
+
return result
|
|
73
|
+
|
|
74
|
+
# Default empty DataFrame if we can't process the input
|
|
75
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
|
|
15
|
+
def _format_sns_swarmplot(id, tracked_dict, kwargs):
|
|
16
|
+
"""Format data from a sns_swarmplot call.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
id (str): Identifier for the plot
|
|
20
|
+
tracked_dict (dict): Dictionary containing tracked data
|
|
21
|
+
kwargs (dict): Keyword arguments passed to sns_swarmplot
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
pd.DataFrame: Formatted data for the plot
|
|
25
|
+
"""
|
|
26
|
+
# Check if tracked_dict is empty or not a dictionary
|
|
27
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
28
|
+
return pd.DataFrame()
|
|
29
|
+
|
|
30
|
+
# If 'data' key is in tracked_dict, use it
|
|
31
|
+
if 'data' in tracked_dict:
|
|
32
|
+
data = tracked_dict['data']
|
|
33
|
+
|
|
34
|
+
# Handle DataFrame input with x and/or y variables
|
|
35
|
+
if isinstance(data, pd.DataFrame):
|
|
36
|
+
result = pd.DataFrame()
|
|
37
|
+
|
|
38
|
+
# Extract variables from kwargs
|
|
39
|
+
x_var = kwargs.get("x")
|
|
40
|
+
y_var = kwargs.get("y")
|
|
41
|
+
|
|
42
|
+
# Add x variable if specified
|
|
43
|
+
if x_var and x_var in data.columns:
|
|
44
|
+
result[f"{id}_swarm_{x_var}"] = data[x_var]
|
|
45
|
+
|
|
46
|
+
# Add y variable if specified
|
|
47
|
+
if y_var and y_var in data.columns:
|
|
48
|
+
result[f"{id}_swarm_{y_var}"] = data[y_var]
|
|
49
|
+
|
|
50
|
+
# Add grouping variable if present
|
|
51
|
+
hue_var = kwargs.get("hue")
|
|
52
|
+
if hue_var and hue_var in data.columns:
|
|
53
|
+
result[f"{id}_swarm_{hue_var}"] = data[hue_var]
|
|
54
|
+
|
|
55
|
+
# If we've added columns, return the result
|
|
56
|
+
if not result.empty:
|
|
57
|
+
return result
|
|
58
|
+
|
|
59
|
+
# If no columns were explicitly specified, return all columns
|
|
60
|
+
result = data.copy()
|
|
61
|
+
result.columns = [f"{id}_swarm_{col}" for col in result.columns]
|
|
62
|
+
return result
|
|
63
|
+
|
|
64
|
+
# Legacy handling for args
|
|
65
|
+
if 'args' in tracked_dict and len(tracked_dict['args']) >= 1:
|
|
66
|
+
data = tracked_dict['args'][0]
|
|
67
|
+
|
|
68
|
+
# Handle DataFrame input
|
|
69
|
+
if isinstance(data, pd.DataFrame):
|
|
70
|
+
result = data.copy()
|
|
71
|
+
result.columns = [f"{id}_swarm_{col}" for col in result.columns]
|
|
72
|
+
return result
|
|
73
|
+
|
|
74
|
+
# Default empty DataFrame if we can't process the input
|
|
75
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
def _format_sns_violinplot(id, tracked_dict, kwargs):
|
|
17
|
+
"""Format data from a sns_violinplot call.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
id (str): Identifier for the plot
|
|
21
|
+
tracked_dict (dict): Dictionary containing tracked data
|
|
22
|
+
kwargs (dict): Keyword arguments passed to sns_violinplot
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
pd.DataFrame: Formatted data for the plot
|
|
26
|
+
"""
|
|
27
|
+
# Check if tracked_dict is empty
|
|
28
|
+
if not tracked_dict:
|
|
29
|
+
return pd.DataFrame()
|
|
30
|
+
|
|
31
|
+
# If tracked_dict is a dictionary
|
|
32
|
+
if isinstance(tracked_dict, dict):
|
|
33
|
+
# First try to get data from the 'data' key
|
|
34
|
+
if 'data' in tracked_dict:
|
|
35
|
+
data = tracked_dict['data']
|
|
36
|
+
|
|
37
|
+
# Handle pandas DataFrame
|
|
38
|
+
if isinstance(data, pd.DataFrame):
|
|
39
|
+
try:
|
|
40
|
+
df = data.copy()
|
|
41
|
+
# Add the id prefix to all columns
|
|
42
|
+
result_df = pd.DataFrame()
|
|
43
|
+
# Copy columns one by one to avoid ambiguity errors
|
|
44
|
+
for col in df.columns:
|
|
45
|
+
result_df[f"{id}_sns_violin_{col}"] = df[col]
|
|
46
|
+
return result_df
|
|
47
|
+
except Exception:
|
|
48
|
+
# In case of any errors, try to convert to a simpler format
|
|
49
|
+
try:
|
|
50
|
+
# Extract x and y variables if available in kwargs
|
|
51
|
+
x_var = kwargs.get('x')
|
|
52
|
+
y_var = kwargs.get('y')
|
|
53
|
+
|
|
54
|
+
# If we have both x and y variables, extract just those columns
|
|
55
|
+
if x_var in data.columns and y_var in data.columns:
|
|
56
|
+
return pd.DataFrame({
|
|
57
|
+
f"{id}_sns_violin_{x_var}": data[x_var],
|
|
58
|
+
f"{id}_sns_violin_{y_var}": data[y_var]
|
|
59
|
+
})
|
|
60
|
+
# Otherwise, just return the first column
|
|
61
|
+
elif len(data.columns) > 0:
|
|
62
|
+
first_col = data.columns[0]
|
|
63
|
+
return pd.DataFrame({
|
|
64
|
+
f"{id}_sns_violin_values": data[first_col]
|
|
65
|
+
})
|
|
66
|
+
except Exception:
|
|
67
|
+
# If all else fails, return an empty DataFrame
|
|
68
|
+
return pd.DataFrame()
|
|
69
|
+
|
|
70
|
+
# Handle list or numpy array
|
|
71
|
+
elif isinstance(data, (list, np.ndarray)):
|
|
72
|
+
# Try to convert to DataFrame
|
|
73
|
+
try:
|
|
74
|
+
if isinstance(data, list) and len(data) > 0 and all(isinstance(item, (list, np.ndarray)) for item in data):
|
|
75
|
+
# For list of lists/arrays (multiple violins)
|
|
76
|
+
result = pd.DataFrame()
|
|
77
|
+
for i, group_data in enumerate(data):
|
|
78
|
+
result[f"{id}_sns_violin_group{i:02d}"] = pd.Series(group_data)
|
|
79
|
+
return result
|
|
80
|
+
else:
|
|
81
|
+
# For a single list/array
|
|
82
|
+
return pd.DataFrame({f"{id}_sns_violin_values": data})
|
|
83
|
+
except:
|
|
84
|
+
# Return empty DataFrame if conversion fails
|
|
85
|
+
return pd.DataFrame()
|
|
86
|
+
|
|
87
|
+
# Legacy handling for args
|
|
88
|
+
args = tracked_dict.get('args', [])
|
|
89
|
+
if len(args) > 0:
|
|
90
|
+
data = args[0] # First arg to sns_violinplot is typically the data
|
|
91
|
+
|
|
92
|
+
# Handle pandas DataFrame
|
|
93
|
+
if isinstance(data, pd.DataFrame):
|
|
94
|
+
df = data.copy()
|
|
95
|
+
# Add the id prefix to all columns
|
|
96
|
+
return df.add_prefix(f"{id}_sns_violin_")
|
|
97
|
+
|
|
98
|
+
# Handle list or numpy array
|
|
99
|
+
elif isinstance(data, (list, np.ndarray)):
|
|
100
|
+
# Try to convert to DataFrame
|
|
101
|
+
try:
|
|
102
|
+
if all(isinstance(item, (list, np.ndarray)) for item in data):
|
|
103
|
+
# For list of lists/arrays (multiple violins)
|
|
104
|
+
result = pd.DataFrame()
|
|
105
|
+
for i, group_data in enumerate(data):
|
|
106
|
+
result[f"{id}_sns_violin_group{i:02d}"] = pd.Series(group_data)
|
|
107
|
+
return result
|
|
108
|
+
else:
|
|
109
|
+
# For a single list/array
|
|
110
|
+
return pd.DataFrame({f"{id}_sns_violin_values": data})
|
|
111
|
+
except:
|
|
112
|
+
# Return empty DataFrame if conversion fails
|
|
113
|
+
return pd.DataFrame()
|
|
114
|
+
|
|
115
|
+
# If tracked_dict is a DataFrame directly
|
|
116
|
+
elif isinstance(tracked_dict, pd.DataFrame):
|
|
117
|
+
try:
|
|
118
|
+
df = tracked_dict.copy()
|
|
119
|
+
# Add the id prefix to all columns, column by column to avoid ambiguity
|
|
120
|
+
result_df = pd.DataFrame()
|
|
121
|
+
for col in df.columns:
|
|
122
|
+
result_df[f"{id}_sns_violin_{col}"] = df[col]
|
|
123
|
+
return result_df
|
|
124
|
+
except Exception:
|
|
125
|
+
# In case of any errors, try a simpler approach
|
|
126
|
+
try:
|
|
127
|
+
# Just take the first column if possible
|
|
128
|
+
if len(tracked_dict.columns) > 0:
|
|
129
|
+
first_col = tracked_dict.columns[0]
|
|
130
|
+
return pd.DataFrame({
|
|
131
|
+
f"{id}_sns_violin_values": tracked_dict[first_col]
|
|
132
|
+
})
|
|
133
|
+
except Exception:
|
|
134
|
+
# If all else fails, return an empty DataFrame
|
|
135
|
+
return pd.DataFrame()
|
|
136
|
+
|
|
137
|
+
# If tracked_dict is a list or numpy array directly
|
|
138
|
+
elif isinstance(tracked_dict, (list, np.ndarray)):
|
|
139
|
+
# Try to convert to DataFrame
|
|
140
|
+
try:
|
|
141
|
+
if all(isinstance(item, (list, np.ndarray)) for item in tracked_dict):
|
|
142
|
+
# For list of lists/arrays (multiple violins)
|
|
143
|
+
result = pd.DataFrame()
|
|
144
|
+
for i, group_data in enumerate(tracked_dict):
|
|
145
|
+
result[f"{id}_sns_violin_group{i:02d}"] = pd.Series(group_data)
|
|
146
|
+
return result
|
|
147
|
+
else:
|
|
148
|
+
# For a single list/array
|
|
149
|
+
return pd.DataFrame({f"{id}_sns_violin_values": tracked_dict})
|
|
150
|
+
except:
|
|
151
|
+
# Return empty DataFrame if conversion fails
|
|
152
|
+
return pd.DataFrame()
|
|
153
|
+
|
|
154
|
+
# Default empty DataFrame if we can't process the input
|
|
155
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
def _format_violin(id, tracked_dict, kwargs):
|
|
17
|
+
"""Format data from a violin call.
|
|
18
|
+
|
|
19
|
+
Formats data in a long-format for better compatibility.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
id (str): Identifier for the plot
|
|
23
|
+
tracked_dict (dict): Dictionary containing tracked data
|
|
24
|
+
kwargs (dict): Keyword arguments passed to violin plot
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
pd.DataFrame: Formatted violin data in long format
|
|
28
|
+
"""
|
|
29
|
+
# Check if tracked_dict is empty or not a dictionary
|
|
30
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
31
|
+
return pd.DataFrame()
|
|
32
|
+
|
|
33
|
+
# Get the args from tracked_dict
|
|
34
|
+
args = tracked_dict.get('args', [])
|
|
35
|
+
|
|
36
|
+
# Similar to boxplot but shows probability density
|
|
37
|
+
if len(args) >= 1:
|
|
38
|
+
data = args[0]
|
|
39
|
+
|
|
40
|
+
# Handle case when data is a simple array or list
|
|
41
|
+
if isinstance(data, (list, np.ndarray)) and not isinstance(data[0], (list, np.ndarray, dict)):
|
|
42
|
+
# Convert to long format with group and value columns
|
|
43
|
+
rows = [{'group': '0', 'value': val} for val in data]
|
|
44
|
+
df = pd.DataFrame(rows)
|
|
45
|
+
# Prefix columns with id
|
|
46
|
+
df.columns = [f"{id}_violin_{col}" for col in df.columns]
|
|
47
|
+
return df
|
|
48
|
+
|
|
49
|
+
# Handle case when data is a dictionary
|
|
50
|
+
elif isinstance(data, dict):
|
|
51
|
+
# Convert to long format with group and value columns
|
|
52
|
+
rows = []
|
|
53
|
+
for group, values in data.items():
|
|
54
|
+
for val in values:
|
|
55
|
+
rows.append({'group': str(group), 'value': val})
|
|
56
|
+
|
|
57
|
+
if rows:
|
|
58
|
+
df = pd.DataFrame(rows)
|
|
59
|
+
# Prefix columns with id
|
|
60
|
+
df.columns = [f"{id}_violin_{col}" for col in df.columns]
|
|
61
|
+
return df
|
|
62
|
+
|
|
63
|
+
# If we get here, either no data or unsupported format
|
|
64
|
+
return pd.DataFrame()
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
def _format_violinplot(id, tracked_dict, kwargs):
|
|
17
|
+
"""Format data from a violinplot call.
|
|
18
|
+
|
|
19
|
+
Formats data in a long-format for better compatibility.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
id (str): Identifier for the plot
|
|
23
|
+
tracked_dict (dict): Dictionary containing tracked data
|
|
24
|
+
kwargs (dict): Keyword arguments passed to violinplot
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
pd.DataFrame: Formatted violinplot data in long format
|
|
28
|
+
"""
|
|
29
|
+
# Check if tracked_dict is empty or not a dictionary
|
|
30
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
31
|
+
return pd.DataFrame()
|
|
32
|
+
|
|
33
|
+
# Get the args from tracked_dict
|
|
34
|
+
args = tracked_dict.get('args', [])
|
|
35
|
+
|
|
36
|
+
# Similar to violin plot
|
|
37
|
+
if len(args) >= 1:
|
|
38
|
+
data = args[0]
|
|
39
|
+
|
|
40
|
+
# Handle case when data is a simple array or list
|
|
41
|
+
if isinstance(data, (list, np.ndarray)) and not isinstance(data[0], (list, np.ndarray, dict)):
|
|
42
|
+
# Convert to long format with group and value columns
|
|
43
|
+
rows = [{'group': '0', 'value': val} for val in data]
|
|
44
|
+
df = pd.DataFrame(rows)
|
|
45
|
+
# Prefix columns with id
|
|
46
|
+
df.columns = [f"{id}_violinplot_{col}" for col in df.columns]
|
|
47
|
+
return df
|
|
48
|
+
|
|
49
|
+
# Handle case when data is a dictionary
|
|
50
|
+
elif isinstance(data, dict):
|
|
51
|
+
# Convert to long format with group and value columns
|
|
52
|
+
rows = []
|
|
53
|
+
for group, values in data.items():
|
|
54
|
+
for val in values:
|
|
55
|
+
rows.append({'group': str(group), 'value': val})
|
|
56
|
+
|
|
57
|
+
if rows:
|
|
58
|
+
df = pd.DataFrame(rows)
|
|
59
|
+
# Prefix columns with id
|
|
60
|
+
df.columns = [f"{id}_violinplot_{col}" for col in df.columns]
|
|
61
|
+
return df
|
|
62
|
+
|
|
63
|
+
# Handle case when data is a list of arrays
|
|
64
|
+
elif isinstance(data, (list, tuple)) and all(isinstance(x, (list, np.ndarray)) for x in data):
|
|
65
|
+
rows = []
|
|
66
|
+
for i, values in enumerate(data):
|
|
67
|
+
for val in values:
|
|
68
|
+
rows.append({'group': str(i), 'value': val})
|
|
69
|
+
|
|
70
|
+
if rows:
|
|
71
|
+
df = pd.DataFrame(rows)
|
|
72
|
+
# Prefix columns with id
|
|
73
|
+
df.columns = [f"{id}_violinplot_{col}" for col in df.columns]
|
|
74
|
+
return df
|
|
75
|
+
|
|
76
|
+
# If we get here, either no data or unsupported format
|
|
77
|
+
return pd.DataFrame()
|