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,221 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-05 07:37:09 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/pd/_merge_columns.py
|
|
5
|
+
|
|
6
|
+
#!/usr/bin/env python3
|
|
7
|
+
# -*- coding: utf-8 -*-
|
|
8
|
+
# Time-stamp: "2024-10-07 12:03:29 (ywatanabe)"
|
|
9
|
+
# ./src/scitex/pd/_merge_cols.py
|
|
10
|
+
|
|
11
|
+
from typing import Union, List, Tuple
|
|
12
|
+
import pandas as pd
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def merge_columns(
|
|
16
|
+
df: pd.DataFrame,
|
|
17
|
+
*args: Union[str, List[str], Tuple[str, ...]],
|
|
18
|
+
sep: str = None,
|
|
19
|
+
sep1: str = "_",
|
|
20
|
+
sep2: str = "-",
|
|
21
|
+
name: str = "merged"
|
|
22
|
+
) -> pd.DataFrame:
|
|
23
|
+
"""Creates a new column by joining specified columns.
|
|
24
|
+
|
|
25
|
+
Example
|
|
26
|
+
-------
|
|
27
|
+
>>> df = pd.DataFrame({
|
|
28
|
+
... 'A': [0, 5, 10],
|
|
29
|
+
... 'B': [1, 6, 11],
|
|
30
|
+
... 'C': [2, 7, 12]
|
|
31
|
+
... })
|
|
32
|
+
>>> # Simple concatenation with separator
|
|
33
|
+
>>> merge_columns(df, 'A', 'B', sep=' ')
|
|
34
|
+
A B C A_B
|
|
35
|
+
0 0 1 2 0 1
|
|
36
|
+
1 5 6 7 5 6
|
|
37
|
+
2 10 11 12 10 11
|
|
38
|
+
|
|
39
|
+
>>> # With column labels
|
|
40
|
+
>>> merge_columns(df, 'A', 'B', sep1='_', sep2='-')
|
|
41
|
+
A B C A_B
|
|
42
|
+
0 0 1 2 A-0_B-1
|
|
43
|
+
1 5 6 7 A-5_B-6
|
|
44
|
+
2 10 11 12 A-10_B-11
|
|
45
|
+
|
|
46
|
+
Parameters
|
|
47
|
+
----------
|
|
48
|
+
df : pd.DataFrame
|
|
49
|
+
Input DataFrame
|
|
50
|
+
*args : Union[str, List[str], Tuple[str, ...]]
|
|
51
|
+
Column names to join
|
|
52
|
+
sep : str, optional
|
|
53
|
+
Simple separator for values only (overrides sep1/sep2)
|
|
54
|
+
sep1 : str, optional
|
|
55
|
+
Separator between column-value pairs, by default "_"
|
|
56
|
+
sep2 : str, optional
|
|
57
|
+
Separator between column name and value, by default "-"
|
|
58
|
+
name : str, optional
|
|
59
|
+
Name for the merged column, by default "merged"
|
|
60
|
+
|
|
61
|
+
Returns
|
|
62
|
+
-------
|
|
63
|
+
pd.DataFrame
|
|
64
|
+
DataFrame with added merged column
|
|
65
|
+
"""
|
|
66
|
+
_df = df.copy()
|
|
67
|
+
columns = args[0] if len(args) == 1 and isinstance(args[0], (list, tuple)) else args
|
|
68
|
+
|
|
69
|
+
if not columns:
|
|
70
|
+
raise ValueError("No columns specified for merging")
|
|
71
|
+
|
|
72
|
+
if not all(col in _df.columns for col in columns):
|
|
73
|
+
missing = [col for col in columns if col not in _df.columns]
|
|
74
|
+
raise KeyError(f"Columns not found in DataFrame: {missing}")
|
|
75
|
+
|
|
76
|
+
# Handle empty DataFrame case
|
|
77
|
+
if len(_df) == 0:
|
|
78
|
+
# Determine column name
|
|
79
|
+
if name == "merged" and sep is not None:
|
|
80
|
+
new_col_name = "_".join(columns)
|
|
81
|
+
else:
|
|
82
|
+
new_col_name = name
|
|
83
|
+
# Create empty Series with the correct name
|
|
84
|
+
_df[new_col_name] = pd.Series(dtype=str)
|
|
85
|
+
return _df
|
|
86
|
+
|
|
87
|
+
if sep is not None:
|
|
88
|
+
# Simple value concatenation
|
|
89
|
+
merged_col = (
|
|
90
|
+
_df[list(columns)]
|
|
91
|
+
.astype(str)
|
|
92
|
+
.apply(
|
|
93
|
+
lambda row: sep.join(row.values),
|
|
94
|
+
axis=1,
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
else:
|
|
98
|
+
# Concatenation with column labels
|
|
99
|
+
merged_col = _df[list(columns)].apply(
|
|
100
|
+
lambda row: sep1.join(f"{col}{sep2}{val}" for col, val in row.items()),
|
|
101
|
+
axis=1,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Determine column name
|
|
105
|
+
if name == "merged" and sep is not None:
|
|
106
|
+
# When using simple separator and default name, use joined column names
|
|
107
|
+
new_col_name = "_".join(columns)
|
|
108
|
+
else:
|
|
109
|
+
# Use provided name or default
|
|
110
|
+
new_col_name = name
|
|
111
|
+
|
|
112
|
+
_df[new_col_name] = merged_col
|
|
113
|
+
return _df
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
merge_cols = merge_columns
|
|
117
|
+
|
|
118
|
+
# EOF
|
|
119
|
+
|
|
120
|
+
# #!./env/bin/python3
|
|
121
|
+
# # -*- coding: utf-8 -*-
|
|
122
|
+
# # Time-stamp: "2024-10-07 12:03:29 (ywatanabe)"
|
|
123
|
+
# # ./src/scitex/pd/_merge_cols.py
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# def merge_columns(df, *args, sep1="_", sep2="-", name="merged"):
|
|
127
|
+
# """
|
|
128
|
+
# Join specified columns with their labels.
|
|
129
|
+
|
|
130
|
+
# Example:
|
|
131
|
+
# import pandas as pd
|
|
132
|
+
# import numpy as np
|
|
133
|
+
|
|
134
|
+
# df = pd.DataFrame(
|
|
135
|
+
# data=np.arange(25).reshape(5, 5),
|
|
136
|
+
# columns=["A", "B", "C", "D", "E"],
|
|
137
|
+
# )
|
|
138
|
+
|
|
139
|
+
# df1 = merge_columns(df, "A", "B", sep1="_", sep2="-")
|
|
140
|
+
# df2 = merge_columns(df, ["A", "B"], sep1="_", sep2="-")
|
|
141
|
+
# assert (df1 == df2).all().all() # True
|
|
142
|
+
|
|
143
|
+
# # A B C D E A_B
|
|
144
|
+
# # 0 0 1 2 3 4 A-0_B-1
|
|
145
|
+
# # 1 5 6 7 8 9 A-5_B-6
|
|
146
|
+
# # 2 10 11 12 13 14 A-10_B-11
|
|
147
|
+
# # 3 15 16 17 18 19 A-15_B-16
|
|
148
|
+
# # 4 20 21 22 23 24 A-20_B-21
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# Parameters
|
|
152
|
+
# ----------
|
|
153
|
+
# df : pandas.DataFrame
|
|
154
|
+
# Input DataFrame
|
|
155
|
+
# *args : str or list
|
|
156
|
+
# Column names to join, either as separate arguments or a single list
|
|
157
|
+
# sep1 : str, optional
|
|
158
|
+
# Separator for joining column names, default "_"
|
|
159
|
+
# sep2 : str, optional
|
|
160
|
+
# Separator between column name and value, default "-"
|
|
161
|
+
|
|
162
|
+
# Returns
|
|
163
|
+
# -------
|
|
164
|
+
# pandas.DataFrame
|
|
165
|
+
# DataFrame with added merged column
|
|
166
|
+
# """
|
|
167
|
+
# _df = df.copy()
|
|
168
|
+
# columns = (
|
|
169
|
+
# args[0]
|
|
170
|
+
# if len(args) == 1 and isinstance(args[0], (list, tuple))
|
|
171
|
+
# else args
|
|
172
|
+
# )
|
|
173
|
+
# merged_col = _df[list(columns)].apply(
|
|
174
|
+
# lambda row: sep1.join(f"{col}{sep2}{val}" for col, val in row.items()),
|
|
175
|
+
# axis=1,
|
|
176
|
+
# )
|
|
177
|
+
|
|
178
|
+
# new_col_name = sep1.join(columns) if not name else str(name)
|
|
179
|
+
# _df[new_col_name] = merged_col
|
|
180
|
+
# return _df
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
# merge_cols = merge_columns
|
|
184
|
+
|
|
185
|
+
# # def merge_columns(_df, *columns):
|
|
186
|
+
# # """
|
|
187
|
+
# # Add merged columns in string.
|
|
188
|
+
|
|
189
|
+
# # DF = pd.DataFrame(data=np.arange(25).reshape(5,5),
|
|
190
|
+
# # columns=["A", "B", "C", "D", "E"],
|
|
191
|
+
# # )
|
|
192
|
+
|
|
193
|
+
# # print(DF)
|
|
194
|
+
|
|
195
|
+
# # # A B C D E
|
|
196
|
+
# # # 0 0 1 2 3 4
|
|
197
|
+
# # # 1 5 6 7 8 9
|
|
198
|
+
# # # 2 10 11 12 13 14
|
|
199
|
+
# # # 3 15 16 17 18 19
|
|
200
|
+
# # # 4 20 21 22 23 24
|
|
201
|
+
|
|
202
|
+
# # print(merge_columns(DF, "A", "B", "C"))
|
|
203
|
+
|
|
204
|
+
# # # A B C D E A_B_C
|
|
205
|
+
# # # 0 0 1 2 3 4 0_1_2
|
|
206
|
+
# # # 1 5 6 7 8 9 5_6_7
|
|
207
|
+
# # # 2 10 11 12 13 14 10_11_12
|
|
208
|
+
# # # 3 15 16 17 18 19 15_16_17
|
|
209
|
+
# # # 4 20 21 22 23 24 20_21_22
|
|
210
|
+
# # """
|
|
211
|
+
# # from copy import deepcopy
|
|
212
|
+
|
|
213
|
+
# # df = deepcopy(_df)
|
|
214
|
+
# # merged = deepcopy(df[columns[0]]) # initialization
|
|
215
|
+
# # for c in columns[1:]:
|
|
216
|
+
# # merged = scitex.ml.utils.merge_labels(list(merged), deepcopy(df[c]))
|
|
217
|
+
# # df.loc[:, scitex.gen.connect_strs(columns)] = merged
|
|
218
|
+
# # return df
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# EOF
|
scitex/pd/_mv.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-05 07:39:12 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/pd/_mv.py
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def mv(df, key, position, axis=1):
|
|
8
|
+
"""
|
|
9
|
+
Move a row or column to a specified position in a DataFrame.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
df (pandas.DataFrame): The input DataFrame.
|
|
13
|
+
key (str): The label of the row or column to move.
|
|
14
|
+
position (int): The position to move the row or column to.
|
|
15
|
+
axis (int, optional): 0 for rows, 1 for columns. Defaults to 1.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
pandas.DataFrame: A new DataFrame with the row or column moved.
|
|
19
|
+
"""
|
|
20
|
+
if axis == 0:
|
|
21
|
+
items = df.index.tolist()
|
|
22
|
+
else:
|
|
23
|
+
items = df.columns.tolist()
|
|
24
|
+
items.remove(key)
|
|
25
|
+
|
|
26
|
+
if position < 0:
|
|
27
|
+
position += len(items) + 1
|
|
28
|
+
|
|
29
|
+
items.insert(position, key)
|
|
30
|
+
return df.reindex(items, axis=axis)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def mv_to_first(df, key, axis=1):
|
|
34
|
+
"""
|
|
35
|
+
Move a row or column to the first position in a DataFrame.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
df (pandas.DataFrame): The input DataFrame.
|
|
39
|
+
key (str): The label of the row or column to move.
|
|
40
|
+
axis (int, optional): 0 for rows, 1 for columns. Defaults to 1.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
pandas.DataFrame: A new DataFrame with the row or column moved to the first position.
|
|
44
|
+
"""
|
|
45
|
+
return mv(df, key, 0, axis)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def mv_to_last(df, key, axis=1):
|
|
49
|
+
"""
|
|
50
|
+
Move a row or column to the last position in a DataFrame.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
df (pandas.DataFrame): The input DataFrame.
|
|
54
|
+
key (str): The label of the row or column to move.
|
|
55
|
+
axis (int, optional): 0 for rows, 1 for columns. Defaults to 1.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
pandas.DataFrame: A new DataFrame with the row or column moved to the last position.
|
|
59
|
+
"""
|
|
60
|
+
return mv(df, key, -1, axis)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# EOF
|
scitex/pd/_replace.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!./env/bin/python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-08-29 23:08:35 (ywatanabe)"
|
|
4
|
+
# ./src/scitex/pd/_replace.py
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def replace(dataframe, old_value, new_value=None, regex=False, cols=None):
|
|
8
|
+
"""
|
|
9
|
+
Replace values in a DataFrame.
|
|
10
|
+
|
|
11
|
+
Example
|
|
12
|
+
-------
|
|
13
|
+
import pandas as pd
|
|
14
|
+
df = pd.DataFrame({'A': ['abc-123', 'def-456'], 'B': ['ghi-789', 'jkl-012']})
|
|
15
|
+
|
|
16
|
+
# Replace single value
|
|
17
|
+
df_replaced = replace(df, 'abc', 'xyz')
|
|
18
|
+
|
|
19
|
+
# Replace with dictionary
|
|
20
|
+
replace_dict = {'-': '_', '1': 'one'}
|
|
21
|
+
df_replaced = replace(df, replace_dict, cols=['A'])
|
|
22
|
+
print(df_replaced)
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
dataframe : pandas.DataFrame
|
|
27
|
+
Input DataFrame to modify.
|
|
28
|
+
old_value : str, dict
|
|
29
|
+
If str, the value to replace (requires new_value).
|
|
30
|
+
If dict, mapping of old values (keys) to new values (values).
|
|
31
|
+
new_value : str, optional
|
|
32
|
+
New value to replace old_value with. Required if old_value is str.
|
|
33
|
+
regex : bool, optional
|
|
34
|
+
If True, treat replacement keys as regular expressions. Default is False.
|
|
35
|
+
cols : list of str, optional
|
|
36
|
+
List of column names to apply replacements. If None, apply to all columns.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
pandas.DataFrame
|
|
41
|
+
DataFrame with specified replacements applied.
|
|
42
|
+
"""
|
|
43
|
+
dataframe = dataframe.copy()
|
|
44
|
+
|
|
45
|
+
# Handle different input formats
|
|
46
|
+
if isinstance(old_value, dict):
|
|
47
|
+
replace_dict = old_value
|
|
48
|
+
else:
|
|
49
|
+
if new_value is None:
|
|
50
|
+
raise ValueError("new_value must be provided when old_value is not a dict")
|
|
51
|
+
replace_dict = {old_value: new_value}
|
|
52
|
+
|
|
53
|
+
# Apply replacements to all columns if cols not specified
|
|
54
|
+
if cols is None:
|
|
55
|
+
# Use pandas replace method for all columns
|
|
56
|
+
return dataframe.replace(replace_dict, regex=regex)
|
|
57
|
+
else:
|
|
58
|
+
# Apply to specific columns
|
|
59
|
+
for column in cols:
|
|
60
|
+
if column in dataframe.columns:
|
|
61
|
+
dataframe[column] = dataframe[column].replace(replace_dict, regex=regex)
|
|
62
|
+
return dataframe
|
scitex/pd/_round.py
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-10-06 11:13:00 (ywatanabe)"
|
|
4
|
+
# /home/ywatanabe/proj/_scitex_repo_openhands/src/scitex/pd/_round.py
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def round(df: pd.DataFrame, factor: int = 3) -> pd.DataFrame:
|
|
11
|
+
"""
|
|
12
|
+
Round numeric values in a DataFrame to a specified number of decimal places.
|
|
13
|
+
|
|
14
|
+
Example
|
|
15
|
+
-------
|
|
16
|
+
>>> df = pd.DataFrame({'A': [1.23456, 2.34567], 'B': ['abc', 'def'], 'C': [3, 4]})
|
|
17
|
+
>>> round(df, 2)
|
|
18
|
+
A B C
|
|
19
|
+
0 1.23 abc 3
|
|
20
|
+
1 2.35 def 4
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
df : pd.DataFrame
|
|
25
|
+
Input DataFrame
|
|
26
|
+
factor : int, optional
|
|
27
|
+
Number of decimal places to round to (default is 3)
|
|
28
|
+
|
|
29
|
+
Returns
|
|
30
|
+
-------
|
|
31
|
+
pd.DataFrame
|
|
32
|
+
DataFrame with rounded numeric values
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def custom_round(column):
|
|
36
|
+
# Skip non-numeric types like datetime, categorical, string
|
|
37
|
+
if pd.api.types.is_datetime64_any_dtype(column):
|
|
38
|
+
return column
|
|
39
|
+
if pd.api.types.is_categorical_dtype(column):
|
|
40
|
+
return column
|
|
41
|
+
if pd.api.types.is_string_dtype(column):
|
|
42
|
+
return column
|
|
43
|
+
# Note: boolean types are allowed to be converted to numeric
|
|
44
|
+
if pd.api.types.is_object_dtype(column) and not pd.api.types.is_numeric_dtype(column) and not pd.api.types.is_bool_dtype(column):
|
|
45
|
+
return column
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
# Handle boolean columns explicitly
|
|
49
|
+
if pd.api.types.is_bool_dtype(column):
|
|
50
|
+
return column.astype(int)
|
|
51
|
+
|
|
52
|
+
numeric_column = pd.to_numeric(column, errors="coerce")
|
|
53
|
+
if np.issubdtype(numeric_column.dtype, np.integer):
|
|
54
|
+
return numeric_column.astype(int)
|
|
55
|
+
|
|
56
|
+
# For float columns, round first
|
|
57
|
+
rounded = numeric_column.round(factor)
|
|
58
|
+
|
|
59
|
+
# If factor is 0 and all values are whole numbers, convert to int
|
|
60
|
+
if factor == 0 and (rounded % 1 == 0).all() and not rounded.isna().any():
|
|
61
|
+
return rounded.astype(int)
|
|
62
|
+
|
|
63
|
+
return rounded
|
|
64
|
+
|
|
65
|
+
except (ValueError, TypeError):
|
|
66
|
+
return column
|
|
67
|
+
|
|
68
|
+
return df.apply(custom_round)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
#!/usr/bin/env python3
|
|
72
|
+
# -*- coding: utf-8 -*-
|
|
73
|
+
# Time-stamp: "2024-10-05 20:40:32 (ywatanabe)"
|
|
74
|
+
# /home/ywatanabe/proj/_scitex_repo_openhands/src/scitex/pd/_round.py
|
|
75
|
+
|
|
76
|
+
# import numpy as np
|
|
77
|
+
|
|
78
|
+
# def round(df, factor=3):
|
|
79
|
+
# return df.apply(lambda x: x.round(factor) if np.issubdtype(x.dtype, np.number) else x)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# def round(df, factor=3):
|
|
83
|
+
# def custom_round(x):
|
|
84
|
+
# try:
|
|
85
|
+
# numeric_x = pd.to_numeric(x, errors='raise')
|
|
86
|
+
# if np.issubdtype(numeric_x.dtype, np.integer):
|
|
87
|
+
# return numeric_x
|
|
88
|
+
# else:
|
|
89
|
+
# return numeric_x.apply(lambda y: float(f'{y:.{factor}g}'))
|
|
90
|
+
# except (ValueError, TypeError):
|
|
91
|
+
# return x
|
|
92
|
+
|
|
93
|
+
# return df.apply(custom_round)
|
scitex/pd/_slice.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-05 07:45:00 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/pd/_slice.py
|
|
5
|
+
|
|
6
|
+
from typing import Dict, Union, List, Optional
|
|
7
|
+
import builtins
|
|
8
|
+
|
|
9
|
+
import pandas as pd
|
|
10
|
+
|
|
11
|
+
from ._find_indi import find_indi
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def slice(
|
|
15
|
+
df: pd.DataFrame,
|
|
16
|
+
conditions: Union[
|
|
17
|
+
builtins.slice, Dict[str, Union[str, int, float, List]], None
|
|
18
|
+
] = None,
|
|
19
|
+
columns: Optional[List[str]] = None,
|
|
20
|
+
) -> pd.DataFrame:
|
|
21
|
+
"""Slices DataFrame rows and/or columns.
|
|
22
|
+
|
|
23
|
+
Example
|
|
24
|
+
-------
|
|
25
|
+
>>> df = pd.DataFrame({'A': [1, 2, 3], 'B': ['x', 'y', 'x']})
|
|
26
|
+
>>> # Slice by row indices
|
|
27
|
+
>>> result = slice(df, slice(0, 2))
|
|
28
|
+
>>> # Slice by conditions
|
|
29
|
+
>>> result = slice(df, {'A': [1, 2], 'B': 'x'})
|
|
30
|
+
>>> # Slice columns
|
|
31
|
+
>>> result = slice(df, columns=['A'])
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
df : pd.DataFrame
|
|
36
|
+
Input DataFrame to slice
|
|
37
|
+
conditions : slice, Dict, or None
|
|
38
|
+
Either a slice object for row indices, or a dictionary of column conditions
|
|
39
|
+
columns : List[str], optional
|
|
40
|
+
List of column names to select
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
pd.DataFrame
|
|
45
|
+
Sliced DataFrame
|
|
46
|
+
"""
|
|
47
|
+
result = df.copy()
|
|
48
|
+
|
|
49
|
+
# Handle row slicing
|
|
50
|
+
if isinstance(conditions, builtins.slice):
|
|
51
|
+
result = result.iloc[conditions]
|
|
52
|
+
elif isinstance(conditions, dict):
|
|
53
|
+
indices = find_indi(result, conditions)
|
|
54
|
+
result = result.loc[indices]
|
|
55
|
+
|
|
56
|
+
# Handle column slicing
|
|
57
|
+
if columns is not None:
|
|
58
|
+
result = result[columns]
|
|
59
|
+
|
|
60
|
+
return result
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# EOF
|
scitex/pd/_sort.py
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!./env/bin/python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-08-25 09:35:39 (ywatanabe)"
|
|
4
|
+
# ./src/scitex/pd/_sort.py
|
|
5
|
+
|
|
6
|
+
import pandas as pd
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def sort(
|
|
10
|
+
dataframe,
|
|
11
|
+
by=None,
|
|
12
|
+
ascending=True,
|
|
13
|
+
inplace=False,
|
|
14
|
+
kind="quicksort",
|
|
15
|
+
na_position="last",
|
|
16
|
+
ignore_index=False,
|
|
17
|
+
key=None,
|
|
18
|
+
orders=None,
|
|
19
|
+
):
|
|
20
|
+
"""
|
|
21
|
+
Sort DataFrame by specified column(s) with optional custom ordering and column reordering.
|
|
22
|
+
|
|
23
|
+
Example
|
|
24
|
+
-------
|
|
25
|
+
import pandas as pd
|
|
26
|
+
df = pd.DataFrame({'A': ['foo', 'bar', 'baz'], 'B': [3, 2, 1]})
|
|
27
|
+
custom_order = {'A': ['bar', 'baz', 'foo']}
|
|
28
|
+
sorted_df = sort(df, by=None, orders=custom_order)
|
|
29
|
+
print(sorted_df)
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
dataframe : pandas.DataFrame
|
|
34
|
+
The DataFrame to sort.
|
|
35
|
+
by : str or list of str, optional
|
|
36
|
+
Name(s) of column(s) to sort by.
|
|
37
|
+
ascending : bool or list of bool, default True
|
|
38
|
+
Sort ascending vs. descending.
|
|
39
|
+
inplace : bool, default False
|
|
40
|
+
If True, perform operation in-place.
|
|
41
|
+
kind : {'quicksort', 'mergesort', 'heapsort', 'stable'}, default 'quicksort'
|
|
42
|
+
Choice of sorting algorithm.
|
|
43
|
+
na_position : {'first', 'last'}, default 'last'
|
|
44
|
+
Puts NaNs at the beginning if 'first'; 'last' puts NaNs at the end.
|
|
45
|
+
ignore_index : bool, default False
|
|
46
|
+
If True, the resulting axis will be labeled 0, 1, …, n - 1.
|
|
47
|
+
key : callable, optional
|
|
48
|
+
Apply the key function to the values before sorting.
|
|
49
|
+
orders : dict, optional
|
|
50
|
+
Dictionary of column names and their custom sort orders.
|
|
51
|
+
|
|
52
|
+
Returns
|
|
53
|
+
-------
|
|
54
|
+
pandas.DataFrame
|
|
55
|
+
Sorted DataFrame with reordered columns.
|
|
56
|
+
"""
|
|
57
|
+
if orders:
|
|
58
|
+
by = [by] if isinstance(by, str) else list(orders.keys()) if by is None else by
|
|
59
|
+
|
|
60
|
+
def apply_custom_order(column):
|
|
61
|
+
return (
|
|
62
|
+
pd.Categorical(column, categories=orders[column.name], ordered=True)
|
|
63
|
+
if column.name in orders
|
|
64
|
+
else column
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
key = apply_custom_order
|
|
68
|
+
elif isinstance(by, str):
|
|
69
|
+
by = [by]
|
|
70
|
+
|
|
71
|
+
sorted_df = dataframe.sort_values(
|
|
72
|
+
by=by,
|
|
73
|
+
ascending=ascending,
|
|
74
|
+
inplace=False,
|
|
75
|
+
kind=kind,
|
|
76
|
+
na_position=na_position,
|
|
77
|
+
ignore_index=ignore_index,
|
|
78
|
+
key=key,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Reorder columns
|
|
82
|
+
if by:
|
|
83
|
+
other_columns = [col for col in sorted_df.columns if col not in by]
|
|
84
|
+
sorted_df = sorted_df[by + other_columns]
|
|
85
|
+
|
|
86
|
+
if inplace:
|
|
87
|
+
dataframe.update(sorted_df)
|
|
88
|
+
dataframe.reindex(columns=sorted_df.columns)
|
|
89
|
+
return dataframe
|
|
90
|
+
else:
|
|
91
|
+
return sorted_df
|
scitex/pd/_to_numeric.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-08 04:35:31 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/pd/_to_numeric.py
|
|
5
|
+
|
|
6
|
+
import pandas as pd
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def to_numeric(df, errors="coerce"):
|
|
10
|
+
"""Convert all possible columns in a DataFrame to numeric types.
|
|
11
|
+
|
|
12
|
+
Parameters
|
|
13
|
+
----------
|
|
14
|
+
df : pd.DataFrame
|
|
15
|
+
Input DataFrame
|
|
16
|
+
errors : str, optional
|
|
17
|
+
How to handle errors. 'coerce' (default) converts invalid values to NaN,
|
|
18
|
+
'ignore' leaves non-numeric columns unchanged, 'raise' raises exceptions.
|
|
19
|
+
|
|
20
|
+
Returns
|
|
21
|
+
-------
|
|
22
|
+
pd.DataFrame
|
|
23
|
+
DataFrame with numeric columns converted
|
|
24
|
+
"""
|
|
25
|
+
df_copy = df.copy()
|
|
26
|
+
for col in df_copy.columns:
|
|
27
|
+
# First try to convert
|
|
28
|
+
original_col = df_copy[col]
|
|
29
|
+
converted_col = pd.to_numeric(df_copy[col], errors="coerce")
|
|
30
|
+
|
|
31
|
+
# Check if conversion resulted in all NaN when original had values
|
|
32
|
+
if converted_col.isna().all() and not original_col.isna().all():
|
|
33
|
+
# This is likely a pure string column
|
|
34
|
+
if errors == "ignore":
|
|
35
|
+
# Keep original for pure string columns
|
|
36
|
+
continue
|
|
37
|
+
else:
|
|
38
|
+
# For coerce, still apply it
|
|
39
|
+
df_copy[col] = converted_col
|
|
40
|
+
elif not converted_col.equals(original_col):
|
|
41
|
+
# Conversion changed something
|
|
42
|
+
if errors == "ignore":
|
|
43
|
+
# Only convert if it doesn't introduce new NaNs
|
|
44
|
+
if converted_col.isna().sum() == original_col.isna().sum():
|
|
45
|
+
df_copy[col] = converted_col
|
|
46
|
+
elif errors == "coerce":
|
|
47
|
+
df_copy[col] = converted_col
|
|
48
|
+
elif errors == "raise":
|
|
49
|
+
df_copy[col] = pd.to_numeric(df_copy[col], errors="raise")
|
|
50
|
+
return df_copy
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# EOF
|