From cd2776e3d8a3ff18cedda4f483069fb839072b5f Mon Sep 17 00:00:00 2001 From: arielsaffer <61440835+arielsaffer@users.noreply.github.com> Date: Tue, 12 Apr 2022 17:32:19 -0400 Subject: [PATCH] Add basic Excel-oriented import-export example (#188) - Basic example using Python. - Uses Excel (XLSX) configuration file. - Notebook is computed but the saved file is not included. --- examples/notebooks/data/small_config.xlsx | Bin 0 -> 15844 bytes examples/notebooks/run_from_xlsx.ipynb | 323 ++++++++++++++++++++++ 2 files changed, 323 insertions(+) create mode 100644 examples/notebooks/data/small_config.xlsx create mode 100644 examples/notebooks/run_from_xlsx.ipynb diff --git a/examples/notebooks/data/small_config.xlsx b/examples/notebooks/data/small_config.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48b2a503afaf9fb4d475b76d4b192a7a40b6a01b GIT binary patch literal 15844 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\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
missingfalse_negmissed_within_toleranceinterceptednum_inspectionsnum_boxesnum_itemsavg_boxes_opened_completionavg_boxes_opened_detectionpct_boxes_opened_completion...pct_contaminant_unreported_if_detectiontrue_contamination_ratemax_missed_contamination_rateavg_missed_contamination_ratemax_intercepted_contamination_rateavg_intercepted_contamination_ratefalse_negative_presenttrue_positive_presenttotal_intercepted_contaminantstotal_missed_contaminants
00.00.00.04.04.014.0280.03.51.25100.0...53.3333330.345625NoneNone0.550.3456250185.00.0
\n", + "

1 rows × 25 columns

\n", + "" + ], + "text/plain": [ + " missing false_neg missed_within_tolerance intercepted num_inspections \\\n", + "0 0.0 0.0 0.0 4.0 4.0 \n", + "\n", + " num_boxes num_items avg_boxes_opened_completion \\\n", + "0 14.0 280.0 3.5 \n", + "\n", + " avg_boxes_opened_detection pct_boxes_opened_completion ... \\\n", + "0 1.25 100.0 ... \n", + "\n", + " pct_contaminant_unreported_if_detection true_contamination_rate \\\n", + "0 53.333333 0.345625 \n", + "\n", + " max_missed_contamination_rate avg_missed_contamination_rate \\\n", + "0 None None \n", + "\n", + " max_intercepted_contamination_rate avg_intercepted_contamination_rate \\\n", + "0 0.55 0.345625 \n", + "\n", + " false_negative_present true_positive_present \\\n", + "0 0 1 \n", + "\n", + " total_intercepted_contaminants total_missed_contaminants \n", + "0 85.0 0.0 \n", + "\n", + "[1 rows x 25 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results_pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dataframe can also be exported to XLSX (or other formats, like CSV) to use later." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results_pd.to_excel('data/small_config_results.xlsx')" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "35a97950b3485d686f65df065bbd4f3ea2db4d126aaaac47be7ba4d8431a0071" + }, + "kernelspec": { + "display_name": "Python 3.9.7 ('pops_border')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}