seraplot 2.3.62__tar.gz → 2.3.69__tar.gz
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.
- {seraplot-2.3.62 → seraplot-2.3.69}/Cargo.lock +11 -1
- {seraplot-2.3.62 → seraplot-2.3.69}/Cargo.toml +2 -10
- {seraplot-2.3.62 → seraplot-2.3.69}/PKG-INFO +3 -1
- {seraplot-2.3.62 → seraplot-2.3.69}/README.md +2 -0
- seraplot-2.3.69/bench_issues.json +13 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_seraplot.py +71 -16
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_sklearn.py +2 -1
- seraplot-2.3.69/benchmark_gridsearch.py +201 -0
- seraplot-2.3.69/benchmark_gridsearch2.py +138 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/pyproject.toml +2 -2
- seraplot-2.3.69/python/seraplot/__init__.py +29 -0
- seraplot-2.3.69/python/seraplot/seraplot.cp311-win_amd64.pyd.old +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/results_seraplot.json +33 -33
- {seraplot-2.3.62 → seraplot-2.3.69}/results_sklearn.json +34 -34
- seraplot-2.3.62/src/bindings/python/python.rs → seraplot-2.3.69/src/bindings/commands/charts.rs +201 -105
- seraplot-2.3.69/src/bindings/commands/docs.rs +2481 -0
- seraplot-2.3.69/src/bindings/commands/ml.rs +2215 -0
- seraplot-2.3.69/src/bindings/commands/mod.rs +17 -0
- seraplot-2.3.69/src/bindings/commands/registry.rs +45 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/mod.rs +4 -4
- seraplot-2.3.69/src/bindings/registry_macro.rs +141 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/book.toml +1 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/SUMMARY.md +12 -9
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/api/index.md +5 -7
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/area.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/bar.md +0 -11
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/boxplot.md +0 -9
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/bubble.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/bullet.md +1 -5
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/candlestick.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/donut.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/dumbbell.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/funnel.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/gauge.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/grid.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/grouped-bar.md +7 -9
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/hbar.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/heatmap.md +22 -24
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/histogram-overlay.md +21 -24
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/histogram.md +16 -20
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/kde.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/line.md +0 -9
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/lollipop.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/multiline.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/parallel.md +0 -9
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/pie.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/radar.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/ridgeline.md +0 -11
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/scatter.md +32 -32
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/slideshow.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/slope.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/stacked-bar.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/sunburst.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/treemap.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/violin.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/waterfall.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/wordcloud.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/bar3d.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/bubble3d.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/candlestick3d.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/dumbbell3d.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/funnel3d.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/globe3d.md +1 -5
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/heatmap3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/index.md +0 -2
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/kde3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/line3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/lollipop3d.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/pie3d.md +1 -5
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/radar3d.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/ridgeline3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/scatter3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/stacked-bar3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/sunburst3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/3d/violin3d.md +0 -6
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/map/bubble-map.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/map/choropleth.md +0 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/map/index.md +1 -3
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/background.md +0 -9
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/hover.md +100 -143
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/palette.md +123 -202
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/chart-methods.md +1 -76
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/chart-object.md +138 -214
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/installation.md +187 -289
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/getting-started/quickstart.md +0 -4
- seraplot-2.3.69/src/docs/ml/adaboost.md +185 -0
- seraplot-2.3.69/src/docs/ml/bayes-index.md +43 -0
- seraplot-2.3.69/src/docs/ml/clustering-index.md +39 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/dbscan-class.md +0 -12
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/dbscan.md +0 -9
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/dbscan3d.md +0 -9
- seraplot-2.3.69/src/docs/ml/decision-tree.md +197 -0
- seraplot-2.3.69/src/docs/ml/decomposition-index.md +69 -0
- seraplot-2.3.69/src/docs/ml/decomposition.md +239 -0
- seraplot-2.3.69/src/docs/ml/elastic-net.md +175 -0
- seraplot-2.3.69/src/docs/ml/evaluation-index.md +79 -0
- seraplot-2.3.69/src/docs/ml/gradient-boosting.md +193 -0
- seraplot-2.3.69/src/docs/ml/grid-search.md +491 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/index.md +18 -2
- seraplot-2.3.69/src/docs/ml/knn.md +175 -0
- seraplot-2.3.69/src/docs/ml/lasso.md +159 -0
- seraplot-2.3.69/src/docs/ml/linear-index.md +53 -0
- seraplot-2.3.69/src/docs/ml/linear-regression.md +151 -0
- seraplot-2.3.69/src/docs/ml/logistic-regression.md +171 -0
- seraplot-2.3.69/src/docs/ml/metrics.md +211 -0
- seraplot-2.3.69/src/docs/ml/naive-bayes.md +249 -0
- seraplot-2.3.69/src/docs/ml/neighbors-index.md +35 -0
- seraplot-2.3.69/src/docs/ml/preprocessing-index.md +69 -0
- seraplot-2.3.69/src/docs/ml/preprocessing.md +281 -0
- seraplot-2.3.69/src/docs/ml/random-forest.md +185 -0
- seraplot-2.3.69/src/docs/ml/ridge.md +177 -0
- seraplot-2.3.69/src/docs/ml/selection-index.md +89 -0
- seraplot-2.3.69/src/docs/ml/sgd.md +229 -0
- seraplot-2.3.69/src/docs/ml/svm-index.md +51 -0
- seraplot-2.3.69/src/docs/ml/svm.md +209 -0
- seraplot-2.3.69/src/docs/ml/train-test-split.md +229 -0
- seraplot-2.3.69/src/docs/ml/tree-index.md +57 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/theme/custom.css +30 -0
- seraplot-2.3.69/src/docs/theme/lang-switcher.js +141 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/lib.rs +42 -49
- seraplot-2.3.69/src/ml/cache.rs +422 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linear/elastic_net.rs +19 -2
- seraplot-2.3.69/src/ml/linear/lasso.rs +32 -0
- seraplot-2.3.69/src/ml/linear/logistic.rs +497 -0
- seraplot-2.3.69/src/ml/linear/ols.rs +148 -0
- seraplot-2.3.69/src/ml/linear/ridge.rs +152 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linear/sgd.rs +62 -10
- seraplot-2.3.69/src/ml/mod.rs +40 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/model_selection/cross_val.rs +7 -6
- seraplot-2.3.69/src/ml/model_selection/grid_search.rs +1256 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/model_selection/mod.rs +2 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/model_selection/split.rs +41 -20
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/bernoulli.rs +11 -1
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/gaussian.rs +28 -42
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/multinomial.rs +5 -0
- seraplot-2.3.69/src/ml/neighbors/knn.rs +609 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/svm/svm.rs +14 -4
- seraplot-2.3.69/src/ml/tree/adaboost.rs +396 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/decision_tree.rs +10 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/gradient_boosting.rs +10 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/random_forest.rs +10 -0
- seraplot-2.3.62/bench_issues.json +0 -32
- seraplot-2.3.62/python/seraplot/__init__.py +0 -2
- seraplot-2.3.62/src/bindings/js/mod.rs +0 -2
- seraplot-2.3.62/src/bindings/python/mod.rs +0 -7
- seraplot-2.3.62/src/bindings/python/python_ml.rs +0 -1916
- seraplot-2.3.62/src/bindings/python/python_registry.rs +0 -175
- seraplot-2.3.62/src/docs/ml/adaboost.md +0 -107
- seraplot-2.3.62/src/docs/ml/decision-tree.md +0 -143
- seraplot-2.3.62/src/docs/ml/decomposition.md +0 -277
- seraplot-2.3.62/src/docs/ml/elastic-net.md +0 -129
- seraplot-2.3.62/src/docs/ml/gradient-boosting.md +0 -141
- seraplot-2.3.62/src/docs/ml/knn.md +0 -143
- seraplot-2.3.62/src/docs/ml/lasso.md +0 -123
- seraplot-2.3.62/src/docs/ml/linear-regression.md +0 -210
- seraplot-2.3.62/src/docs/ml/logistic-regression.md +0 -117
- seraplot-2.3.62/src/docs/ml/metrics.md +0 -141
- seraplot-2.3.62/src/docs/ml/naive-bayes.md +0 -152
- seraplot-2.3.62/src/docs/ml/preprocessing.md +0 -345
- seraplot-2.3.62/src/docs/ml/random-forest.md +0 -146
- seraplot-2.3.62/src/docs/ml/ridge.md +0 -112
- seraplot-2.3.62/src/docs/ml/sgd.md +0 -331
- seraplot-2.3.62/src/docs/ml/svm.md +0 -316
- seraplot-2.3.62/src/docs/ml/train-test-split.md +0 -110
- seraplot-2.3.62/src/docs/theme/lang-switcher.js +0 -70
- seraplot-2.3.62/src/ml/linear/lasso.rs +0 -19
- seraplot-2.3.62/src/ml/linear/logistic.rs +0 -351
- seraplot-2.3.62/src/ml/linear/ols.rs +0 -81
- seraplot-2.3.62/src/ml/linear/ridge.rs +0 -84
- seraplot-2.3.62/src/ml/mod.rs +0 -21
- seraplot-2.3.62/src/ml/neighbors/knn.rs +0 -546
- seraplot-2.3.62/src/ml/tree/adaboost.rs +0 -212
- {seraplot-2.3.62 → seraplot-2.3.69}/.gitignore +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/05--Diabetes_SeraPlot.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/07--OpenFoodFacts_SeraPlot_Benchmark.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/TEST_1M_Battle.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_all.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_bigdata.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_full.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_knn_sgd.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_perf.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_quick.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_quick2.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_scale.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_svc.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_svc2.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/bench_test.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_kmeans_heavy.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_kmeans_openfoodfacts.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_ml.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_ml_openfoodfacts.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/benchmark_ml_out.ipynb +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/gen_bench_slides.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/1.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/2.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/3.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/4.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/5.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/6.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/7.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/2d/8.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/1.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/2.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/3.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/4.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/5.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/6.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/7.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/3d/8.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/README.md +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/benchmark/1.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/benchmark/2.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/benchmark/3.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/images/logo.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/kmeans_test.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/python/seraplot/matplotlib.py +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/.github/workflows/mdbook.yml +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/README.md +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/asset/SVG World Map with labels.svg +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/asset/logo.png +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/asset/world.svg +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/builder_template.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/chart_types.rs +0 -0
- /seraplot-2.3.62/src/bindings/js/js_bindings.rs → /seraplot-2.3.69/src/bindings/commands/wasm.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/export_builder.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/fast_export_c.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/fast_render.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/memory_pool.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/unified_builder.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/unified_config.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/arena_alloc.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/bitset.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/compact_state.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/data_processor.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/image_processor.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/lazy_builders.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/memory_pool.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/simd_ops.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/bindings/utils/state_export.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/core/builders.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/core/math.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/core/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/data/conversion.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/data/index.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/data/loader.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/data/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/data/processor.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/charts/2d/index.md +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/config/auto-display.md +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/introduction.md +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/kmeans-class.md +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/ml/kmeans.md +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/area.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bar.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bar3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bench-matplotlib.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bench-plotly.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bench-seraplot.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/boxplot.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bubble-map.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bubble.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bubble3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/bullet.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/candlestick.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/candlestick3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/choropleth.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dbscan-class.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dbscan.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dbscan3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/donut.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dumbbell.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/dumbbell3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/funnel.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/funnel3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/gauge.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/globe3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/grid.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/grouped-bar.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/hbar.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/heatmap.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/heatmap3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/histogram-overlay.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/histogram.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/kde.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/kde3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/line.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/line3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/lollipop.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/lollipop3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/multiline.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/parallel.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/pie.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/pie3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/radar.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/radar3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/ridgeline.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/ridgeline3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/scatter.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/scatter3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/slideshow.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/slope.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/stacked-bar.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/stacked-bar3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/sunburst.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/sunburst3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/treemap.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/violin.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/violin3d.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/waterfall.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/docs/previews/wordcloud.html +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/assets.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/fast_builders.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/fast_exporter.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/hover.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/html_export.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/html_template.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/js_3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/html/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/decomposition/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/decomposition/pca.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linalg.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/linear/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/metrics/classification.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/metrics/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/metrics/regression.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/naive_bayes/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/neighbors/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/preprocessing/encoders.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/preprocessing/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/preprocessing/scalers.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/svm/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/decision_tree_backup.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/ml/tree/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/camera.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/canvas.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/containers_3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/controller/chart_controller.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/controller/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/controller/plot_3d_controller.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/bar_3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/line_3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/plot_3d_types.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/_3d/scatter_3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/bar.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/chart.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/kmeans.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/line.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/scatter.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/default/svg.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/generic.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/globe.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/globe_html.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/globe_types.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/_3d/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/bubble_map.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/chart.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/choropleth.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/svg_parser.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/map/world_data.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/projection.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/renderers.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/scale_renderer.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/_3d/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/_3d/plot_3d_types.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/chart.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/seaborn/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/candlestick3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/dumbbell3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/funnel3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/heatmap3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/kde3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/lollipop3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/pie3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/plot_3d_types.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/radar3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/ridgeline3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/stacked_bar3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/sunburst3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/_3d/violin3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/area.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/boxplot.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/bubble.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/bullet.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/candlestick.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/common.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/dumbbell.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/funnel.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/gauge.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/grouped_bar.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/heatmap.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/histogram.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/kde.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/lollipop.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/multiline.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/parallel.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/pie.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/radar.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/ridgeline.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/slope.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/sunburst.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/treemap.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/violin.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/waterfall.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/plot/statistical/wordcloud.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/cache.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/chart.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/gui.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/hybrid.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/manager/button_manager.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/manager/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/advanced_render.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/fast_render_gui.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/pipeline.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/viewer_3d.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/render/wiki_viewer.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/utils/image_loader.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/viewer/utils/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/api.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/extractor.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/language.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/macros.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/metadata.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/src/wiki/mod.rs +0 -0
- {seraplot-2.3.62 → seraplot-2.3.69}/test_accuracy.py +0 -0
|
@@ -2107,6 +2107,15 @@ dependencies = [
|
|
|
2107
2107
|
"cfg-if",
|
|
2108
2108
|
]
|
|
2109
2109
|
|
|
2110
|
+
[[package]]
|
|
2111
|
+
name = "inventory"
|
|
2112
|
+
version = "0.3.24"
|
|
2113
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2114
|
+
checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b"
|
|
2115
|
+
dependencies = [
|
|
2116
|
+
"rustversion",
|
|
2117
|
+
]
|
|
2118
|
+
|
|
2110
2119
|
[[package]]
|
|
2111
2120
|
name = "io-lifetimes"
|
|
2112
2121
|
version = "1.0.11"
|
|
@@ -3048,6 +3057,7 @@ checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8"
|
|
|
3048
3057
|
dependencies = [
|
|
3049
3058
|
"cfg-if",
|
|
3050
3059
|
"indoc",
|
|
3060
|
+
"inventory",
|
|
3051
3061
|
"libc",
|
|
3052
3062
|
"memoffset 0.9.1",
|
|
3053
3063
|
"parking_lot",
|
|
@@ -3461,7 +3471,7 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
|
|
|
3461
3471
|
|
|
3462
3472
|
[[package]]
|
|
3463
3473
|
name = "seraplot"
|
|
3464
|
-
version = "2.3.
|
|
3474
|
+
version = "2.3.69"
|
|
3465
3475
|
dependencies = [
|
|
3466
3476
|
"base64 0.22.1",
|
|
3467
3477
|
"criterion",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "seraplot"
|
|
3
|
-
version = "2.3.
|
|
3
|
+
version = "2.3.69"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
authors = ["feur25"]
|
|
6
6
|
description = "Rust data visualization framework - The modern Plotly alternative"
|
|
@@ -17,7 +17,7 @@ serde = { version = "1.0", features = ["derive"] }
|
|
|
17
17
|
serde_json = "1.0"
|
|
18
18
|
thiserror = "1.0"
|
|
19
19
|
parking_lot = "0.12"
|
|
20
|
-
pyo3 = { version = "0.21", features = ["extension-module"], optional = true }
|
|
20
|
+
pyo3 = { version = "0.21", features = ["extension-module", "multiple-pymethods"], optional = true }
|
|
21
21
|
csv = "1.3"
|
|
22
22
|
egui = { version = "0.27", optional = true }
|
|
23
23
|
eframe = { version = "0.27", optional = true }
|
|
@@ -43,14 +43,6 @@ js = ["dep:wasm-bindgen", "dep:js-sys", "dep:getrandom", "dep:egui"]
|
|
|
43
43
|
all = ["python"]
|
|
44
44
|
pyo3 = ["dep:pyo3"]
|
|
45
45
|
|
|
46
|
-
[[example]]
|
|
47
|
-
name = "csv_test"
|
|
48
|
-
path = "examples/csv_test.rs"
|
|
49
|
-
|
|
50
|
-
[[example]]
|
|
51
|
-
name = "csv_viewer"
|
|
52
|
-
path = "examples/csv_viewer.rs"
|
|
53
|
-
|
|
54
46
|
[profile.release]
|
|
55
47
|
lto = "thin"
|
|
56
48
|
codegen-units = 1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seraplot
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.69
|
|
4
4
|
Classifier: Development Status :: 5 - Production/Stable
|
|
5
5
|
Classifier: Environment :: Win32 (MS Windows)
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -37,6 +37,8 @@ alternative to Plotly, designed specifically for data visualization. This librar
|
|
|
37
37
|
across multiple programming languages (Python, C#, C++, JavaScript), regularly maintained and
|
|
38
38
|
updated, offering superior speed and significantly lower memory consumption compared to competitors.
|
|
39
39
|
|
|
40
|
+
documentation : https://feur25.github.io/seraplot/introduction.html
|
|
41
|
+
|
|
40
42
|
---
|
|
41
43
|
|
|
42
44
|
### Why Choose SeraPlot
|
|
@@ -5,6 +5,8 @@ alternative to Plotly, designed specifically for data visualization. This librar
|
|
|
5
5
|
across multiple programming languages (Python, C#, C++, JavaScript), regularly maintained and
|
|
6
6
|
updated, offering superior speed and significantly lower memory consumption compared to competitors.
|
|
7
7
|
|
|
8
|
+
documentation : https://feur25.github.io/seraplot/introduction.html
|
|
9
|
+
|
|
8
10
|
---
|
|
9
11
|
|
|
10
12
|
### Why Choose SeraPlot
|
|
@@ -3,6 +3,21 @@ import json
|
|
|
3
3
|
import numpy as np
|
|
4
4
|
import pandas as pd
|
|
5
5
|
import seraplot as sp
|
|
6
|
+
from sklearn.linear_model import (
|
|
7
|
+
LinearRegression as SkLR, Ridge as SkRidge, Lasso as SkLasso,
|
|
8
|
+
ElasticNet as SkEN, SGDRegressor as SkSGDR,
|
|
9
|
+
LogisticRegression as SkLogR, SGDClassifier as SkSGDC,
|
|
10
|
+
)
|
|
11
|
+
from sklearn.tree import DecisionTreeClassifier as SkDTC
|
|
12
|
+
from sklearn.ensemble import (
|
|
13
|
+
RandomForestClassifier as SkRFC, GradientBoostingClassifier as SkGBC,
|
|
14
|
+
AdaBoostClassifier as SkABC,
|
|
15
|
+
)
|
|
16
|
+
from sklearn.neighbors import KNeighborsClassifier as SkKNN
|
|
17
|
+
from sklearn.naive_bayes import GaussianNB as SkGNB, BernoulliNB as SkBNB
|
|
18
|
+
from sklearn.svm import LinearSVC as SkSVC
|
|
19
|
+
from sklearn.model_selection import StratifiedKFold, cross_val_score
|
|
20
|
+
from sklearn.metrics import accuracy_score, r2_score as sk_r2
|
|
6
21
|
|
|
7
22
|
DATA_PATH = r"C:\Users\Quentin\Desktop\SeraPlot\v2\en.openfoodfacts.org.products.csv.gz"
|
|
8
23
|
N_MAX = 50_000
|
|
@@ -18,8 +33,9 @@ CLASS_COL = "pnns_groups_1"
|
|
|
18
33
|
|
|
19
34
|
print("Chargement des données…")
|
|
20
35
|
df = pd.read_csv(
|
|
21
|
-
DATA_PATH, sep="\t", on_bad_lines="skip",
|
|
36
|
+
DATA_PATH, sep="\t", on_bad_lines="skip",
|
|
22
37
|
usecols=NUMERIC_COLS + [CLASS_COL],
|
|
38
|
+
engine="python", nrows=500_000, quoting=3,
|
|
23
39
|
)
|
|
24
40
|
NUMERIC_COLS = [c for c in NUMERIC_COLS if c in df.columns]
|
|
25
41
|
FEATURE_COLS = [c for c in NUMERIC_COLS if c != TARGET_REG]
|
|
@@ -58,6 +74,7 @@ yc_tr, yc_te = y_cls[tr], y_cls[te]
|
|
|
58
74
|
ls_tr = label_strings[tr]
|
|
59
75
|
|
|
60
76
|
records = {}
|
|
77
|
+
sk_records = {}
|
|
61
78
|
|
|
62
79
|
def run(name, model, Xtr, ytr, Xte, yte, metric="acc"):
|
|
63
80
|
t0 = time.perf_counter()
|
|
@@ -70,6 +87,16 @@ def run(name, model, Xtr, ytr, Xte, yte, metric="acc"):
|
|
|
70
87
|
records[name] = {"fit_s": round(fit_s, 4), "pred_s": round(pred_s, 4), "metric": metric, "score": round(score, 4)}
|
|
71
88
|
print(f" {name:<40} fit={fit_s:8.4f}s pred={pred_s:7.4f}s {metric}={score:.4f}")
|
|
72
89
|
|
|
90
|
+
def run_sk(name, model, Xtr, ytr, Xte, yte, metric="acc"):
|
|
91
|
+
t0 = time.perf_counter()
|
|
92
|
+
model.fit(Xtr, ytr)
|
|
93
|
+
fit_s = time.perf_counter() - t0
|
|
94
|
+
t0 = time.perf_counter()
|
|
95
|
+
pred = model.predict(Xte)
|
|
96
|
+
pred_s = time.perf_counter() - t0
|
|
97
|
+
score = float(accuracy_score(yte, pred) if metric == "acc" else sk_r2(yte, pred))
|
|
98
|
+
sk_records[name] = {"fit_s": round(fit_s, 4), "pred_s": round(pred_s, 4), "metric": metric, "score": round(score, 4)}
|
|
99
|
+
|
|
73
100
|
def runt(name, fn, *args, **kw):
|
|
74
101
|
t0 = time.perf_counter()
|
|
75
102
|
fn(*args, **kw)
|
|
@@ -94,6 +121,12 @@ run("Lasso(α=0.1)", sp.Lasso(alpha=0.1, max_iter=500),
|
|
|
94
121
|
run("ElasticNet(α=0.1,l1=.5)", sp.ElasticNet(alpha=0.1, l1_ratio=0.5, max_iter=500), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
|
|
95
122
|
run("SGDRegressor", sp.SGDRegressor(loss="squared_error", alpha=1e-4, max_iter=200, eta0=0.01), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
|
|
96
123
|
|
|
124
|
+
run_sk("LinearRegression", SkLR(), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
|
|
125
|
+
run_sk("Ridge(α=1.0)", SkRidge(alpha=1.0), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
|
|
126
|
+
run_sk("Lasso(α=0.1)", SkLasso(alpha=0.1, max_iter=500), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
|
|
127
|
+
run_sk("ElasticNet(α=0.1,l1=.5)",SkEN(alpha=0.1, l1_ratio=0.5, max_iter=500), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
|
|
128
|
+
run_sk("SGDRegressor", SkSGDR(loss="squared_error", alpha=1e-4, max_iter=200, eta0=0.01), Xs_tr, yr_tr, Xs_te, yr_te, "r2")
|
|
129
|
+
|
|
97
130
|
print()
|
|
98
131
|
run("LogisticRegression(C=1)", sp.LogisticRegression(c=1.0, max_iter=300), Xs_tr, yc_tr, Xs_te, yc_te)
|
|
99
132
|
run("SGDClassifier(hinge)", sp.SGDClassifier(loss="hinge", alpha=1e-4, max_iter=200), Xs_tr, yc_tr, Xs_te, yc_te)
|
|
@@ -106,28 +139,50 @@ run("GaussianNB", sp.GaussianNB(),
|
|
|
106
139
|
run("BernoulliNB", sp.BernoulliNB(), Xb_tr, yc_tr, Xb_te, yc_te)
|
|
107
140
|
run("LinearSVC(C=1)", sp.LinearSVC(c=1.0, max_iter=500), Xs_tr, yc_tr, Xs_te, yc_te)
|
|
108
141
|
|
|
142
|
+
run_sk("LogisticRegression(C=1)",SkLogR(C=1.0, max_iter=300, solver="lbfgs"), Xs_tr, yc_tr, Xs_te, yc_te)
|
|
143
|
+
run_sk("SGDClassifier(hinge)", SkSGDC(loss="hinge", alpha=1e-4, max_iter=200), Xs_tr, yc_tr, Xs_te, yc_te)
|
|
144
|
+
run_sk("DecisionTree(d=10)", SkDTC(max_depth=10), X_tr, yc_tr, X_te, yc_te)
|
|
145
|
+
run_sk("RandomForest(50,d=10)", SkRFC(n_estimators=50, max_depth=10, n_jobs=-1), X_tr, yc_tr, X_te, yc_te)
|
|
146
|
+
run_sk("GradientBoosting(50,d=3)",SkGBC(n_estimators=50, max_depth=3, learning_rate=0.1), X_tr, yc_tr, X_te, yc_te)
|
|
147
|
+
run_sk("AdaBoost(50)", SkABC(n_estimators=50), X_tr, yc_tr, X_te, yc_te)
|
|
148
|
+
run_sk("KNeighbors(k=5)", SkKNN(n_neighbors=5), Xs_tr, yc_tr, Xs_te, yc_te)
|
|
149
|
+
run_sk("GaussianNB", SkGNB(), X_tr, yc_tr, X_te, yc_te)
|
|
150
|
+
run_sk("BernoulliNB", SkBNB(), Xb_tr, yc_tr, Xb_te, yc_te)
|
|
151
|
+
run_sk("LinearSVC(C=1)", SkSVC(C=1.0, max_iter=500), Xs_tr, yc_tr, Xs_te, yc_te)
|
|
152
|
+
|
|
109
153
|
print()
|
|
110
154
|
skf = sp.StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)
|
|
111
|
-
|
|
155
|
+
folds_data = list(skf.split(Xs_tr, yc_tr))
|
|
112
156
|
t0 = time.perf_counter()
|
|
113
|
-
|
|
114
|
-
m = sp.LogisticRegression(c=1.0, max_iter=200)
|
|
115
|
-
m.fit(Xs_tr[ti], yc_tr[ti])
|
|
116
|
-
cv_acc.append(float(sp.accuracy_score(yc_tr[vi], m.predict(Xs_tr[vi]))))
|
|
157
|
+
cv_acc = sp.parallel_cv_cls(Xs_tr, yc_tr, folds_data, c=1.0, max_iter=200)
|
|
117
158
|
cv_s = time.perf_counter() - t0
|
|
118
159
|
cv_mean = float(np.mean(cv_acc))
|
|
119
160
|
records["StratifiedKFold(5)×LR"] = {"fit_s": round(cv_s, 4), "pred_s": 0.0, "metric": "cv_acc", "score": round(cv_mean, 4)}
|
|
120
161
|
print(f" {'StratifiedKFold(5)×LR':<40} {cv_s:.4f}s mean_acc={cv_mean:.4f}")
|
|
121
162
|
|
|
122
|
-
|
|
123
|
-
|
|
163
|
+
skf_sk = StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)
|
|
164
|
+
t0 = time.perf_counter()
|
|
165
|
+
sk_cv_scores = cross_val_score(SkLogR(C=1.0, max_iter=200, solver="lbfgs"), Xs_tr, yc_tr, cv=skf_sk, scoring="accuracy")
|
|
166
|
+
sk_cv_s = time.perf_counter() - t0
|
|
167
|
+
sk_records["StratifiedKFold(5)×LR"] = {"fit_s": round(sk_cv_s, 4), "pred_s": 0.0, "metric": "cv_acc", "score": round(float(np.mean(sk_cv_scores)), 4)}
|
|
124
168
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
169
|
+
with open("results_seraplot.json", "w") as f:
|
|
170
|
+
json.dump({"seraplot": records, "sklearn": sk_records}, f, indent=2)
|
|
171
|
+
|
|
172
|
+
print(f"\n{'═'*100}")
|
|
173
|
+
print(f" {'Algorithme':<40} {'SP fit':>8} {'SK fit':>8} {'Speedup':>8} {'SP score':>10} {'SK score':>10} {'Δ score':>8}")
|
|
174
|
+
print(f"{'═'*100}")
|
|
175
|
+
all_keys = list(records.keys())
|
|
176
|
+
for k in all_keys:
|
|
177
|
+
sp_r = records.get(k, {})
|
|
178
|
+
sk_r = sk_records.get(k, {})
|
|
179
|
+
sp_t = sp_r.get("fit_s", 0.0)
|
|
180
|
+
sk_t = sk_r.get("fit_s", 0.0)
|
|
181
|
+
sp_s = sp_r.get("score", 0.0)
|
|
182
|
+
sk_s = sk_r.get("score", 0.0)
|
|
183
|
+
ratio_str = f"{sk_t/sp_t:.1f}×" if sp_t > 0 and sk_t > 0 else "-"
|
|
184
|
+
delta = abs(sp_s - sk_s) if sp_r.get("metric") not in ("s",) else 0.0
|
|
185
|
+
ok = "✓" if delta < 0.01 else "✗" if sp_r.get("metric") not in ("s",) else ""
|
|
186
|
+
print(f" {k:<40} {sp_t:>8.4f} {sk_t:>8.4f} {ratio_str:>8} {sp_s:>10.4f} {sk_s:>10.4f} {delta:>7.4f}{ok}")
|
|
187
|
+
print(f"{'═'*100}")
|
|
133
188
|
print(f"\nRésultats sauvegardés → results_seraplot.json")
|
|
@@ -32,8 +32,9 @@ CLASS_COL = "pnns_groups_1"
|
|
|
32
32
|
|
|
33
33
|
print("Chargement des données…")
|
|
34
34
|
df = pd.read_csv(
|
|
35
|
-
DATA_PATH, sep="\t", on_bad_lines="skip",
|
|
35
|
+
DATA_PATH, sep="\t", on_bad_lines="skip",
|
|
36
36
|
usecols=NUMERIC_COLS + [CLASS_COL],
|
|
37
|
+
engine="python",
|
|
37
38
|
)
|
|
38
39
|
NUMERIC_COLS = [c for c in NUMERIC_COLS if c in df.columns]
|
|
39
40
|
FEATURE_COLS = [c for c in NUMERIC_COLS if c != TARGET_REG]
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Benchmark: SeraPlot GridSearchCV vs scikit-learn GridSearchCV
|
|
3
|
+
Dataset: OpenFoodFacts (500k rows)
|
|
4
|
+
"""
|
|
5
|
+
import time
|
|
6
|
+
import numpy as np
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
FEATURES = [
|
|
10
|
+
'energy-kcal_100g', 'fat_100g', 'saturated-fat_100g',
|
|
11
|
+
'carbohydrates_100g', 'sugars_100g', 'fiber_100g',
|
|
12
|
+
'proteins_100g', 'salt_100g',
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
def load_data(n_rows=500_000):
|
|
16
|
+
print(f"Loading OpenFoodFacts ({n_rows} rows)...")
|
|
17
|
+
t0 = time.perf_counter()
|
|
18
|
+
df = pd.read_csv(
|
|
19
|
+
r'C:\Users\Quentin\Desktop\SeraPlot\v2\en.openfoodfacts.org.products.csv.gz',
|
|
20
|
+
sep='\t', usecols=FEATURES + ['nutriscore_score', 'nutriscore_grade'],
|
|
21
|
+
nrows=n_rows * 3, # load extra to handle NaN drops
|
|
22
|
+
)
|
|
23
|
+
df = df.dropna(subset=FEATURES + ['nutriscore_score']).head(n_rows)
|
|
24
|
+
X = df[FEATURES].values.astype(np.float64)
|
|
25
|
+
y_reg = df['nutriscore_score'].values.astype(np.float64)
|
|
26
|
+
# For classification: bin nutriscore into 5 classes (0-4)
|
|
27
|
+
y_cls = pd.qcut(y_reg, q=5, labels=False, duplicates='drop').astype(np.int32)
|
|
28
|
+
print(f" Loaded {X.shape[0]} rows x {X.shape[1]} features in {time.perf_counter()-t0:.2f}s")
|
|
29
|
+
print(f" Classes: {np.unique(y_cls)}")
|
|
30
|
+
return X, y_reg, y_cls
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def bench_sklearn_gridsearch_ridge(X, y):
|
|
34
|
+
from sklearn.linear_model import Ridge
|
|
35
|
+
from sklearn.model_selection import GridSearchCV
|
|
36
|
+
param_grid = {'alpha': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]}
|
|
37
|
+
gs = GridSearchCV(Ridge(), param_grid, cv=5, scoring='r2', n_jobs=-1)
|
|
38
|
+
t0 = time.perf_counter()
|
|
39
|
+
gs.fit(X, y)
|
|
40
|
+
elapsed = time.perf_counter() - t0
|
|
41
|
+
return elapsed, gs.best_score_, gs.best_params_
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def bench_seraplot_gridsearch_ridge(X, y):
|
|
45
|
+
from seraplot import GridSearchCV
|
|
46
|
+
param_grid = {'alpha': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]}
|
|
47
|
+
gs = GridSearchCV('Ridge', param_grid, cv=5)
|
|
48
|
+
t0 = time.perf_counter()
|
|
49
|
+
gs.fit(X, y)
|
|
50
|
+
elapsed = time.perf_counter() - t0
|
|
51
|
+
return elapsed, gs.best_score_, gs.best_params_
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def bench_sklearn_gridsearch_rf(X, y):
|
|
55
|
+
from sklearn.ensemble import RandomForestClassifier
|
|
56
|
+
from sklearn.model_selection import GridSearchCV
|
|
57
|
+
param_grid = {
|
|
58
|
+
'n_estimators': [50, 100],
|
|
59
|
+
'max_depth': [5, 10, 20],
|
|
60
|
+
'min_samples_split': [2, 5],
|
|
61
|
+
'min_samples_leaf': [1, 2],
|
|
62
|
+
}
|
|
63
|
+
gs = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=3, scoring='accuracy', n_jobs=-1)
|
|
64
|
+
t0 = time.perf_counter()
|
|
65
|
+
gs.fit(X, y)
|
|
66
|
+
elapsed = time.perf_counter() - t0
|
|
67
|
+
return elapsed, gs.best_score_, gs.best_params_
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def bench_seraplot_gridsearch_rf(X, y):
|
|
71
|
+
from seraplot import GridSearchCV
|
|
72
|
+
param_grid = {
|
|
73
|
+
'n_estimators': [50, 100],
|
|
74
|
+
'max_depth': [5, 10, 20],
|
|
75
|
+
'min_samples_split': [2, 5],
|
|
76
|
+
'min_samples_leaf': [1, 2],
|
|
77
|
+
}
|
|
78
|
+
gs = GridSearchCV('RandomForestClassifier', param_grid, cv=3)
|
|
79
|
+
t0 = time.perf_counter()
|
|
80
|
+
gs.fit(X, y)
|
|
81
|
+
elapsed = time.perf_counter() - t0
|
|
82
|
+
return elapsed, gs.best_score_, gs.best_params_
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def bench_sklearn_randomsearch_gb(X, y):
|
|
86
|
+
from sklearn.ensemble import GradientBoostingClassifier
|
|
87
|
+
from sklearn.model_selection import RandomizedSearchCV
|
|
88
|
+
param_dist = {
|
|
89
|
+
'n_estimators': [50, 100, 200],
|
|
90
|
+
'learning_rate': [0.01, 0.05, 0.1, 0.2],
|
|
91
|
+
'max_depth': [3, 5, 7, 10],
|
|
92
|
+
'min_samples_split': [2, 5, 10],
|
|
93
|
+
'min_samples_leaf': [1, 2, 4],
|
|
94
|
+
}
|
|
95
|
+
rs = RandomizedSearchCV(GradientBoostingClassifier(random_state=42), param_dist, n_iter=20, cv=3, scoring='accuracy', n_jobs=-1, random_state=42)
|
|
96
|
+
t0 = time.perf_counter()
|
|
97
|
+
rs.fit(X, y)
|
|
98
|
+
elapsed = time.perf_counter() - t0
|
|
99
|
+
return elapsed, rs.best_score_, rs.best_params_
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def bench_seraplot_randomsearch_gb(X, y):
|
|
103
|
+
from seraplot import RandomizedSearchCV
|
|
104
|
+
param_dist = {
|
|
105
|
+
'n_estimators': [50, 100, 200],
|
|
106
|
+
'learning_rate': [0.01, 0.05, 0.1, 0.2],
|
|
107
|
+
'max_depth': [3, 5, 7, 10],
|
|
108
|
+
'min_samples_split': [2, 5, 10],
|
|
109
|
+
'min_samples_leaf': [1, 2, 4],
|
|
110
|
+
}
|
|
111
|
+
rs = RandomizedSearchCV('GradientBoostingClassifier', param_dist, n_iter=20, cv=3)
|
|
112
|
+
t0 = time.perf_counter()
|
|
113
|
+
rs.fit(X, y)
|
|
114
|
+
elapsed = time.perf_counter() - t0
|
|
115
|
+
return elapsed, rs.best_score_, rs.best_params_
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def bench_sklearn_halving_rf(X, y):
|
|
119
|
+
from sklearn.ensemble import RandomForestClassifier
|
|
120
|
+
from sklearn.experimental import enable_halving_search_cv
|
|
121
|
+
from sklearn.model_selection import HalvingGridSearchCV
|
|
122
|
+
param_grid = {
|
|
123
|
+
'n_estimators': [50, 100, 200],
|
|
124
|
+
'max_depth': [3, 5, 10, 20],
|
|
125
|
+
'min_samples_split': [2, 5, 10],
|
|
126
|
+
'min_samples_leaf': [1, 2, 4],
|
|
127
|
+
}
|
|
128
|
+
hg = HalvingGridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=3, factor=3, scoring='accuracy', n_jobs=-1, random_state=42)
|
|
129
|
+
t0 = time.perf_counter()
|
|
130
|
+
hg.fit(X, y)
|
|
131
|
+
elapsed = time.perf_counter() - t0
|
|
132
|
+
return elapsed, hg.best_score_, hg.best_params_
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def bench_seraplot_halving_rf(X, y):
|
|
136
|
+
from seraplot import HalvingGridSearchCV
|
|
137
|
+
param_grid = {
|
|
138
|
+
'n_estimators': [50, 100, 200],
|
|
139
|
+
'max_depth': [3, 5, 10, 20],
|
|
140
|
+
'min_samples_split': [2, 5, 10],
|
|
141
|
+
'min_samples_leaf': [1, 2, 4],
|
|
142
|
+
}
|
|
143
|
+
hg = HalvingGridSearchCV('RandomForestClassifier', param_grid, cv=3, factor=3)
|
|
144
|
+
t0 = time.perf_counter()
|
|
145
|
+
hg.fit(X, y)
|
|
146
|
+
elapsed = time.perf_counter() - t0
|
|
147
|
+
return elapsed, hg.best_score_, hg.best_params_
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def print_result(name, t_sk, score_sk, params_sk, t_sp, score_sp, params_sp):
|
|
151
|
+
speedup = t_sk / t_sp if t_sp > 0 else float('inf')
|
|
152
|
+
print(f"\n{'='*70}")
|
|
153
|
+
print(f" {name}")
|
|
154
|
+
print(f"{'='*70}")
|
|
155
|
+
print(f" scikit-learn : {t_sk:8.2f}s score={score_sk:.4f} params={params_sk}")
|
|
156
|
+
print(f" SeraPlot : {t_sp:8.2f}s score={score_sp:.4f} params={params_sp}")
|
|
157
|
+
print(f" Speedup : {speedup:8.1f}x")
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def main():
|
|
161
|
+
X, y_reg, y_cls = load_data(500_000)
|
|
162
|
+
|
|
163
|
+
# Reduce data for slower benchmarks
|
|
164
|
+
X_small = X[:50_000]
|
|
165
|
+
y_cls_small = y_cls[:50_000]
|
|
166
|
+
|
|
167
|
+
print("\n" + "="*70)
|
|
168
|
+
print(" BENCHMARK: SeraPlot vs scikit-learn GridSearchCV")
|
|
169
|
+
print("="*70)
|
|
170
|
+
|
|
171
|
+
# 1. Ridge GridSearchCV (full 500k)
|
|
172
|
+
print("\n[1/4] Ridge GridSearchCV (500k rows, 6 alpha values, cv=5)...")
|
|
173
|
+
t_sk, s_sk, p_sk = bench_sklearn_gridsearch_ridge(X, y_reg)
|
|
174
|
+
t_sp, s_sp, p_sp = bench_seraplot_gridsearch_ridge(X, y_reg)
|
|
175
|
+
print_result("Ridge GridSearchCV (500k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
|
|
176
|
+
|
|
177
|
+
# 2. RandomForest GridSearchCV (50k subset - RF is heavy)
|
|
178
|
+
print("\n[2/4] RandomForest GridSearchCV (50k rows, 24 combos, cv=3)...")
|
|
179
|
+
t_sk, s_sk, p_sk = bench_sklearn_gridsearch_rf(X_small, y_cls_small)
|
|
180
|
+
t_sp, s_sp, p_sp = bench_seraplot_gridsearch_rf(X_small, y_cls_small)
|
|
181
|
+
print_result("RandomForest GridSearchCV (50k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
|
|
182
|
+
|
|
183
|
+
# 3. GradientBoosting RandomizedSearchCV (50k subset)
|
|
184
|
+
print("\n[3/4] GradientBoosting RandomizedSearchCV (50k rows, 20 iters, cv=3)...")
|
|
185
|
+
t_sk, s_sk, p_sk = bench_sklearn_randomsearch_gb(X_small, y_cls_small)
|
|
186
|
+
t_sp, s_sp, p_sp = bench_seraplot_randomsearch_gb(X_small, y_cls_small)
|
|
187
|
+
print_result("GradientBoosting RandomizedSearchCV (50k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
|
|
188
|
+
|
|
189
|
+
# 4. HalvingGridSearchCV with RF (50k subset)
|
|
190
|
+
print("\n[4/4] HalvingGridSearchCV RF (50k rows, 108 combos, factor=3)...")
|
|
191
|
+
t_sk, s_sk, p_sk = bench_sklearn_halving_rf(X_small, y_cls_small)
|
|
192
|
+
t_sp, s_sp, p_sp = bench_seraplot_halving_rf(X_small, y_cls_small)
|
|
193
|
+
print_result("HalvingGridSearchCV RF (50k rows)", t_sk, s_sk, p_sk, t_sp, s_sp, p_sp)
|
|
194
|
+
|
|
195
|
+
print("\n" + "="*70)
|
|
196
|
+
print(" BENCHMARK COMPLETE")
|
|
197
|
+
print("="*70)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
if __name__ == '__main__':
|
|
201
|
+
main()
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Benchmark #2: Large search spaces - SeraPlot vs scikit-learn
|
|
3
|
+
Focus on where parallel Rust execution dominates.
|
|
4
|
+
"""
|
|
5
|
+
import time
|
|
6
|
+
import numpy as np
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_data():
|
|
11
|
+
print("Loading OpenFoodFacts...")
|
|
12
|
+
t0 = time.perf_counter()
|
|
13
|
+
cols = ['energy-kcal_100g', 'fat_100g', 'saturated-fat_100g',
|
|
14
|
+
'carbohydrates_100g', 'sugars_100g', 'proteins_100g',
|
|
15
|
+
'salt_100g', 'nutriscore_score']
|
|
16
|
+
df = pd.read_csv(
|
|
17
|
+
r'C:\Users\Quentin\Desktop\SeraPlot\v2\en.openfoodfacts.org.products.csv.gz',
|
|
18
|
+
sep='\t', nrows=500_000, low_memory=False, on_bad_lines='skip',
|
|
19
|
+
)
|
|
20
|
+
df = df[cols].dropna()
|
|
21
|
+
X = df[cols[:-1]].values.astype(np.float64)
|
|
22
|
+
y_reg = df['nutriscore_score'].values.astype(np.float64)
|
|
23
|
+
y_cls = pd.qcut(y_reg, q=3, labels=False, duplicates='drop').astype(np.int32)
|
|
24
|
+
print(f" {X.shape[0]} rows x {X.shape[1]} features in {time.perf_counter()-t0:.2f}s")
|
|
25
|
+
return X, y_reg, y_cls
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def main():
|
|
29
|
+
X, y_reg, y_cls = load_data()
|
|
30
|
+
|
|
31
|
+
# Use subsets for different tests
|
|
32
|
+
X_100k, y_reg_100k = X[:100_000], y_reg[:100_000]
|
|
33
|
+
X_50k, y_cls_50k = X[:50_000], y_cls[:50_000]
|
|
34
|
+
|
|
35
|
+
print(f"\n{'='*70}")
|
|
36
|
+
print(" BENCHMARK 2: Large search spaces")
|
|
37
|
+
print(f"{'='*70}")
|
|
38
|
+
|
|
39
|
+
# 1. Lasso: 5 alphas x 3 max_iter x 3 tol = 45 combos, cv=5 = 225 fits, 100k rows
|
|
40
|
+
print("\n[1] Lasso GridSearchCV (100k rows, 45 combos, cv=5 = 225 fits)...")
|
|
41
|
+
from sklearn.linear_model import Lasso as SkLasso
|
|
42
|
+
from sklearn.model_selection import GridSearchCV as SkGS
|
|
43
|
+
pg = {'alpha': [0.0001, 0.001, 0.01, 0.1, 1.0], 'max_iter': [500, 1000, 2000], 'tol': [1e-4, 1e-3, 1e-2]}
|
|
44
|
+
t0 = time.perf_counter()
|
|
45
|
+
sk = SkGS(SkLasso(), pg, cv=5, scoring='r2', n_jobs=-1); sk.fit(X_100k, y_reg_100k)
|
|
46
|
+
t_sk = time.perf_counter() - t0
|
|
47
|
+
|
|
48
|
+
from seraplot import GridSearchCV as SpGS
|
|
49
|
+
t0 = time.perf_counter()
|
|
50
|
+
sp = SpGS('Lasso', pg, cv=5); sp.fit(X_100k, y_reg_100k)
|
|
51
|
+
t_sp = time.perf_counter() - t0
|
|
52
|
+
print(f" sklearn: {t_sk:.2f}s score={sk.best_score_:.4f} params={sk.best_params_}")
|
|
53
|
+
print(f" SeraPlot: {t_sp:.2f}s score={sp.best_score_:.4f} params={sp.best_params_}")
|
|
54
|
+
print(f" Speedup: {t_sk/t_sp:.1f}x")
|
|
55
|
+
|
|
56
|
+
# 2. ElasticNet: 5 alpha x 5 l1_ratio x 3 max_iter = 75 combos, cv=5 = 375 fits, 100k rows
|
|
57
|
+
print("\n[2] ElasticNet GridSearchCV (100k rows, 75 combos, cv=5 = 375 fits)...")
|
|
58
|
+
from sklearn.linear_model import ElasticNet as SkEN
|
|
59
|
+
pg2 = {'alpha': [0.0001, 0.001, 0.01, 0.1, 1.0], 'l1_ratio': [0.1, 0.3, 0.5, 0.7, 0.9], 'max_iter': [500, 1000, 2000]}
|
|
60
|
+
t0 = time.perf_counter()
|
|
61
|
+
sk2 = SkGS(SkEN(), pg2, cv=5, scoring='r2', n_jobs=-1); sk2.fit(X_100k, y_reg_100k)
|
|
62
|
+
t_sk2 = time.perf_counter() - t0
|
|
63
|
+
t0 = time.perf_counter()
|
|
64
|
+
sp2 = SpGS('ElasticNet', pg2, cv=5); sp2.fit(X_100k, y_reg_100k)
|
|
65
|
+
t_sp2 = time.perf_counter() - t0
|
|
66
|
+
print(f" sklearn: {t_sk2:.2f}s score={sk2.best_score_:.4f}")
|
|
67
|
+
print(f" SeraPlot: {t_sp2:.2f}s score={sp2.best_score_:.4f}")
|
|
68
|
+
print(f" Speedup: {t_sk2/t_sp2:.1f}x")
|
|
69
|
+
|
|
70
|
+
# 3. LogisticRegression GridSearchCV: 6C x 3 max_iter = 18 combos, cv=5, 50k rows
|
|
71
|
+
print("\n[3] LogisticRegression GridSearchCV (50k rows, 18 combos, cv=5 = 90 fits)...")
|
|
72
|
+
from sklearn.linear_model import LogisticRegression as SkLR
|
|
73
|
+
pg3 = {'C': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0], 'max_iter': [100, 500, 1000]}
|
|
74
|
+
t0 = time.perf_counter()
|
|
75
|
+
sk3 = SkGS(SkLR(), pg3, cv=5, scoring='accuracy', n_jobs=-1); sk3.fit(X_50k, y_cls_50k)
|
|
76
|
+
t_sk3 = time.perf_counter() - t0
|
|
77
|
+
t0 = time.perf_counter()
|
|
78
|
+
sp3 = SpGS('LogisticRegression', pg3, cv=5); sp3.fit(X_50k, y_cls_50k)
|
|
79
|
+
t_sp3 = time.perf_counter() - t0
|
|
80
|
+
print(f" sklearn: {t_sk3:.2f}s score={sk3.best_score_:.4f}")
|
|
81
|
+
print(f" SeraPlot: {t_sp3:.2f}s score={sp3.best_score_:.4f}")
|
|
82
|
+
print(f" Speedup: {t_sk3/t_sp3:.1f}x")
|
|
83
|
+
|
|
84
|
+
# 4. KNN GridSearchCV: 8 k-values x 2 weights = 16 combos, cv=5 = 80 fits, 50k
|
|
85
|
+
print("\n[4] KNN GridSearchCV (50k rows, 16 combos, cv=5 = 80 fits)...")
|
|
86
|
+
from sklearn.neighbors import KNeighborsClassifier as SkKNN
|
|
87
|
+
pg4 = {'n_neighbors': [3, 5, 7, 9, 11, 15, 21, 31], 'weights': ['uniform', 'distance']}
|
|
88
|
+
t0 = time.perf_counter()
|
|
89
|
+
sk4 = SkGS(SkKNN(), pg4, cv=5, scoring='accuracy', n_jobs=-1); sk4.fit(X_50k, y_cls_50k)
|
|
90
|
+
t_sk4 = time.perf_counter() - t0
|
|
91
|
+
t0 = time.perf_counter()
|
|
92
|
+
sp4 = SpGS('KNeighborsClassifier', pg4, cv=5); sp4.fit(X_50k, y_cls_50k)
|
|
93
|
+
t_sp4 = time.perf_counter() - t0
|
|
94
|
+
print(f" sklearn: {t_sk4:.2f}s score={sk4.best_score_:.4f}")
|
|
95
|
+
print(f" SeraPlot: {t_sp4:.2f}s score={sp4.best_score_:.4f}")
|
|
96
|
+
print(f" Speedup: {t_sk4/t_sp4:.1f}x")
|
|
97
|
+
|
|
98
|
+
# 5. HalvingRandomSearchCV: Large space, 256 candidates, factor=3
|
|
99
|
+
print("\n[5] HalvingRandomSearchCV GradientBoosting (50k, 256 candidates)...")
|
|
100
|
+
from sklearn.ensemble import GradientBoostingClassifier as SkGB
|
|
101
|
+
from sklearn.experimental import enable_halving_search_cv
|
|
102
|
+
from sklearn.model_selection import HalvingRandomSearchCV as SkHRS
|
|
103
|
+
from seraplot import HalvingRandomSearchCV as SpHRS
|
|
104
|
+
pg5 = {
|
|
105
|
+
'n_estimators': [25, 50, 100, 200],
|
|
106
|
+
'learning_rate': [0.01, 0.05, 0.1, 0.2],
|
|
107
|
+
'max_depth': [3, 5, 7, 10],
|
|
108
|
+
'min_samples_split': [2, 5, 10],
|
|
109
|
+
'min_samples_leaf': [1, 2, 4],
|
|
110
|
+
}
|
|
111
|
+
t0 = time.perf_counter()
|
|
112
|
+
sk5 = SkHRS(SkGB(random_state=42), pg5, n_candidates=256, cv=3, factor=3, scoring='accuracy', n_jobs=-1, random_state=42); sk5.fit(X_50k, y_cls_50k)
|
|
113
|
+
t_sk5 = time.perf_counter() - t0
|
|
114
|
+
t0 = time.perf_counter()
|
|
115
|
+
sp5 = SpHRS('GradientBoostingClassifier', pg5, n_candidates=256, cv=3, factor=3); sp5.fit(X_50k, y_cls_50k)
|
|
116
|
+
t_sp5 = time.perf_counter() - t0
|
|
117
|
+
print(f" sklearn: {t_sk5:.2f}s score={sk5.best_score_:.4f}")
|
|
118
|
+
print(f" SeraPlot: {t_sp5:.2f}s score={sp5.best_score_:.4f}")
|
|
119
|
+
print(f" Speedup: {t_sk5/t_sp5:.1f}x")
|
|
120
|
+
|
|
121
|
+
print(f"\n{'='*70}")
|
|
122
|
+
print(f" SUMMARY")
|
|
123
|
+
print(f"{'='*70}")
|
|
124
|
+
results = [
|
|
125
|
+
("Lasso GS 45x5", t_sk, t_sp),
|
|
126
|
+
("ElasticNet GS 75x5", t_sk2, t_sp2),
|
|
127
|
+
("LogisticReg GS 18x5", t_sk3, t_sp3),
|
|
128
|
+
("KNN GS 16x5", t_sk4, t_sp4),
|
|
129
|
+
("HalvingRandom GB 256", t_sk5, t_sp5),
|
|
130
|
+
]
|
|
131
|
+
for name, ts, tp in results:
|
|
132
|
+
print(f" {name:30s} sklearn={ts:7.2f}s seraplot={tp:7.2f}s speedup={ts/tp:7.1f}x")
|
|
133
|
+
avg_speedup = sum(ts/tp for _, ts, tp in results) / len(results)
|
|
134
|
+
print(f"\n Average speedup: {avg_speedup:.1f}x")
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
if __name__ == '__main__':
|
|
138
|
+
main()
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["maturin>=
|
|
2
|
+
requires = ["maturin>=1.0"]
|
|
3
3
|
build-backend = "maturin"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "seraplot"
|
|
7
|
-
version = "2.3.
|
|
7
|
+
version = "2.3.69"
|
|
8
8
|
description = "Rust data visualization framework - The modern Plotly alternative"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
readme-content-type = "text/markdown"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from .seraplot import *
|
|
2
|
+
from .seraplot import __version__, Chart
|
|
3
|
+
import numpy as _np
|
|
4
|
+
import pandas as _pd
|
|
5
|
+
|
|
6
|
+
class LabelEncoder:
|
|
7
|
+
def __init__(self):
|
|
8
|
+
self.classes_ = None
|
|
9
|
+
|
|
10
|
+
def fit(self, y):
|
|
11
|
+
_, uniques = _pd.factorize(y, sort=True)
|
|
12
|
+
self.classes_ = _np.asarray(uniques)
|
|
13
|
+
return self
|
|
14
|
+
|
|
15
|
+
def transform(self, y):
|
|
16
|
+
y = _np.asarray(y)
|
|
17
|
+
idx = _np.searchsorted(self.classes_, y)
|
|
18
|
+
return idx.astype(_np.int32)
|
|
19
|
+
|
|
20
|
+
def fit_transform(self, y):
|
|
21
|
+
codes, uniques = _pd.factorize(y, sort=True)
|
|
22
|
+
self.classes_ = _np.asarray(uniques)
|
|
23
|
+
return codes.astype(_np.int32)
|
|
24
|
+
|
|
25
|
+
def inverse_transform(self, y):
|
|
26
|
+
return self.classes_[_np.asarray(y)]
|
|
27
|
+
|
|
28
|
+
def __repr__(self):
|
|
29
|
+
return "LabelEncoder()"
|
|
Binary file
|