diff --git a/html/model_perfspec.html b/html/model_perfspec.html
new file mode 100644
index 0000000..8d9bc3c
--- /dev/null
+++ b/html/model_perfspec.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ model_perfspec.py
+
+
+
+
+
+ model perfspec
+
+
+
+
+
+
+
+
+
+ import%20marimo%0A%0A__generated_with%20%3D%20%220.10.17%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20title()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20notebook_name%20%3D%20'model_perfspec.py'%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_vars%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_vars.run()%0A%20%20%20%20perfspec%20%3D%20_defs%5B'perfspec'%5D%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_header%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_header.run()%0A%20%20%20%20lib_header%20%3D%20_defs%5B'header'%5D%0A%20%20%20%20lib_intro%20%3D%20_defs%5B'intro'%5D%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%7Blib_header(notebook_name)%7D%0A%0A%20%20%20%20%20%20%20%20%23%23%20Info%20about%20**%7Bperfspec%5B'app'%5D%5B'train_mode'%5D%7D**%20trained%20model%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20lib_header%2C%0A%20%20%20%20%20%20%20%20lib_intro%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20notebook_name%2C%0A%20%20%20%20%20%20%20%20perfspec%2C%0A%20%20%20%20%20%20%20%20perfspec_header%2C%0A%20%20%20%20%20%20%20%20perfspec_vars%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20imports()%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20return%20Path%2C%20np%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20intro_load(Path%2C%20lib_intro%2C%20mo%2C%20notebook_name%2C%20perfspec)%3A%0A%20%20%20%20verbose%20%3D%20perfspec%5B'settings'%5D%5B'verbose'%5D%0A%20%20%20%20perfspec%5B'vars'%5D%20%3D%20%7B%7D%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_args%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_args.run()%0A%0A%20%20%20%20if%20not%20Path(perfspec%5B'defaults'%5D%5B'models_dirpath'%5D).exists()%3A%20%0A%20%20%20%20%20%20%20exit(f%22Trained%20models%20dir%20path%20not%20found%3A%20%7Bperfspec%5B'defaults'%5D%5B'models_dirpath'%5D%7D%22)%20%20%0A%0A%20%20%20%20if%20not%20Path(perfspec%5B'defaults'%5D%5B'checkpoints_dirpath'%5D).exists()%3A%20%0A%20%20%20%20%20%20%20exit(f%22Trained%20checkpoints%20models%20dir%20path%20not%20found%3A%20%7Bperfspec%5B'defaults'%5D%5B'checkpoints_dirpath'%5D%7D%22)%20%20%0A%0A%20%20%20%20if%20not%20Path(perfspec%5B'defaults'%5D%5B'data_dirpath'%5D).exists()%3A%20%0A%20%20%20%20%20%20%20exit(f%22data%20dir%20path%20not%20found%3A%20%7Bperfspec%5B'defaults'%5D%5B'data_dirpath'%5D%7D%22)%20%20%0A%0A%20%20%20%20verbose%3Dperfspec%5B'settings'%5D.get('verbose')%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_load_actions%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_load_actions.run()%0A%20%20%20%20lib_load_actions%20%3D%20_defs%5B'load_actions'%5D%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_input_sequence%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_input_sequence.run()%0A%20%20%20%20lib_get_input_sequence%20%3D%20_defs%5B'get_input_sequence'%5D%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_predict%0A%20%20%20%20_%2C%20_defs%20%3D%20perfspec_predict.run()%0A%20%20%20%20lib_predict_action%20%3D%20_defs%5B'predict_action'%5D%0A%0A%20%20%20%20perfspec%5B'vars'%5D%5B'model'%5D%20%3D%20None%0A%20%20%20%20perfspec%5B'vars'%5D%5B'history'%5D%20%3D%20None%0A%0A%20%20%20%20(perfspec%5B'vars'%5D%5B'actions'%5D%2C%20%0A%20%20%20%20perfspec%5B'vars'%5D%5B'unique_actions'%5D%2C%20%0A%20%20%20%20perfspec%5B'vars'%5D%5B'label_encoder'%5D%2C%20%0A%20%20%20%20perfspec%5B'vars'%5D%5B'encoded_actions'%5D%0A%20%20%20%20)%20%3D%20lib_load_actions(%0A%20%20%20%20%20%20%20%20actions_path%3Dperfspec%5B'settings'%5D.get('actions_filepath')%2C%0A%20%20%20%20%20%20%20%20verbose%3DNone%0A%20%20%20%20)%0A%0A%20%20%20%20perfspec%5B'vars'%5D%5B'input_sequence'%5D%20%3D%20lib_get_input_sequence(%0A%20%20%20%20%20%20%20%20input_str%3Dperfspec%5B'settings'%5D%5B'input_str'%5D%2C%20%0A%20%20%20%20%20%20%20%20unique_actions%3Dperfspec%5B'vars'%5D%5B'unique_actions'%5D%0A%20%20%20%20)%0A%0A%20%20%20%20from%20train_perfspec%20import%20perfspec_prepare_model_train%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_prepare_model_train.run()%0A%20%20%20%20lib_prepare_train%20%3D%20_defs%5B'prepare_train'%5D%0A%0A%20%20%20%20from%20train_perfspec%20import%20perfspec_load_model_from_path%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_load_model_from_path.run()%0A%20%20%20%20lib_load_model_from_path%20%3D%20_defs%5B'load_model_from_path'%5D%0A%0A%20%20%20%20from%20train_perfspec%20import%20perfspec_evaluate_model%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_evaluate_model.run()%0A%20%20%20%20lib_evaluate_model%20%3D%20_defs%5B'evaluate_model'%5D%0A%20%20%20%20lib_run_evaluate%20%3D%20_defs%5B'run_evaluate'%5D%0A%20%20%20%20lib_history_info%20%3D%20_defs%5B'history_info'%5D%0A%0A%20%20%20%20from%20train_perfspec%20import%20perfspec_plot_history%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_plot_history.run()%0A%20%20%20%20plot_history%20%3D%20_defs%5B'plot_history'%5D%0A%0A%20%20%20%20from%20train_perfspec%20import%20perfspec_plot_defs%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_plot_defs.run()%0A%20%20%20%20lib_plot_accuracy%20%3D%20_defs%5B'plot_accuracy'%5D%0A%20%20%20%20lib_plot_loss%20%3D%20_defs%5B'plot_loss'%5D%0A%20%20%20%20lib_plot_precision%20%3D%20_defs%5B'plot_precision'%5D%0A%0A%20%20%20%20from%20train_perfspec%20import%20perfspec_define_confusion_matrix%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_define_confusion_matrix.run()%0A%20%20%20%20lib_make_confusion_matrix%20%3D%20_defs%5B'make_confusion_matrix'%5D%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%0A%20%20%20%20%20%20%20%20%7Blib_intro(notebook_name)%7D%0A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20lib_evaluate_model%2C%0A%20%20%20%20%20%20%20%20lib_get_input_sequence%2C%0A%20%20%20%20%20%20%20%20lib_history_info%2C%0A%20%20%20%20%20%20%20%20lib_load_actions%2C%0A%20%20%20%20%20%20%20%20lib_load_model_from_path%2C%0A%20%20%20%20%20%20%20%20lib_make_confusion_matrix%2C%0A%20%20%20%20%20%20%20%20lib_plot_accuracy%2C%0A%20%20%20%20%20%20%20%20lib_plot_loss%2C%0A%20%20%20%20%20%20%20%20lib_plot_precision%2C%0A%20%20%20%20%20%20%20%20lib_predict_action%2C%0A%20%20%20%20%20%20%20%20lib_prepare_train%2C%0A%20%20%20%20%20%20%20%20lib_run_evaluate%2C%0A%20%20%20%20%20%20%20%20perfspec_args%2C%0A%20%20%20%20%20%20%20%20perfspec_define_confusion_matrix%2C%0A%20%20%20%20%20%20%20%20perfspec_evaluate_model%2C%0A%20%20%20%20%20%20%20%20perfspec_input_sequence%2C%0A%20%20%20%20%20%20%20%20perfspec_load_actions%2C%0A%20%20%20%20%20%20%20%20perfspec_load_model_from_path%2C%0A%20%20%20%20%20%20%20%20perfspec_plot_defs%2C%0A%20%20%20%20%20%20%20%20perfspec_plot_history%2C%0A%20%20%20%20%20%20%20%20perfspec_predict%2C%0A%20%20%20%20%20%20%20%20perfspec_prepare_model_train%2C%0A%20%20%20%20%20%20%20%20plot_history%2C%0A%20%20%20%20%20%20%20%20verbose%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20perfspec_render_model_browser(mo%2C%20perfspec)%3A%0A%20%20%20%20model_file_browser%20%3D%20mo.ui.file_browser(%0A%20%20%20%20%20%20%20%20initial_path%3Dperfspec%5B'defaults'%5D%5B'models_dirpath'%5D%2C%20%0A%20%20%20%20%20%20%20%20multiple%3DFalse%2C%0A%20%20%20%20%20%20%20%20filetypes%3D%5B'.keras'%5D%2C%0A%20%20%20%20%20%20%20%20selection_mode%3D'file'%2C%0A%20%20%20%20%20%20%20%20restrict_navigation%3DTrue%2C%0A%20%20%20%20%20%20%20%20%23label%3D%22%3Csmall%3EModel%3C%2Fsmall%3E%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20def%20parse_model_browse_selection_value(values_only%3DTrue)%3A%0A%20%20%20%20%20%20%20%20if%20len(model_file_browser.value)%20%3E%200%20and%20not%20reset_model_button.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20values_only%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20model_file_browser.value%5B0%5D.path%20%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20f%22Selection%20%3Cb%3E%7Bmodel_file_browser.value%5B0%5D.path%7D%3C%2Fb%3E%22%20%0A%20%20%20%20%20%20%20%20else%3A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20values_only%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20f%22Use%20default%20value%22%0A%0A%20%20%20%20reset_model_button%20%3D%20mo.ui.button(label%3D%22Reset%20selected%20Model%22%2C%20kind%3D%22neutral%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20value%3DFalse%2C%20on_click%3Dlambda%20value%3A%20True%20if%20not%20value%20else%20False)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20model_file_browser%2C%0A%20%20%20%20%20%20%20%20parse_model_browse_selection_value%2C%0A%20%20%20%20%20%20%20%20reset_model_button%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(%0A%20%20%20%20mo%2C%0A%20%20%20%20model_file_browser%2C%0A%20%20%20%20parse_model_browse_selection_value%2C%0A%20%20%20%20reset_model_button%2C%0A)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%7B%20%20%20mo.vstack(items%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%22%22%20%23%23%20Model%20Selection%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%23%23%20Select%20a%20Model%20or%20use%20default%20one%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20model_file_browser%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(items%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%20%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reset_model_button%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(items%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%7Bparse_model_browse_selection_value(False)%7D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%3Csmall%3Ereset%3A%20%7Breset_model_button.value%7D%3C%2Fsmall%3E%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D)%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20settings(%0A%20%20%20%20Path%2C%0A%20%20%20%20lib_load_model_from_path%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20parse_model_browse_selection_value%2C%0A%20%20%20%20perfspec%2C%0A)%3A%0A%20%20%20%20_model_filepath%20%3D%20parse_model_browse_selection_value(True)%0A%20%20%20%20if%20_model_filepath%20!%3D%20%22%22%3A%0A%20%20%20%20%20%20%20%20perfspec%5B%22settings%22%5D%5B%22model_filepath%22%5D%20%3D%20_model_filepath%0A%20%20%20%20%20%20%20%20perfspec%5B%22settings%22%5D%5B%22model_history_filepath%22%5D%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20Path(_model_filepath).parent%20%2F%20perfspec%5B%22defaults%22%5D%5B%22history_path%22%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20if%20perfspec%5B%22settings%22%5D%5B%22verbose%22%5D%20!%3D%20None%20or%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Model%20filepath%3A%20%7Bperfspec%5B'settings'%5D%5B'model_filepath'%5D%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22History%20filepath%3A%20%7Bperfspec%5B'settings'%5D%5B'model_history_filepath'%5D%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%0A%20%20%20%20perfspec%5B%22vars%22%5D%5B%22model%22%5D%20%3D%20lib_load_model_from_path(perfspec%2C%20None)%0A%20%20%20%20if%20perfspec%5B%22vars%22%5D%5B%22model%22%5D%20%3D%3D%20None%3A%0A%20%20%20%20%20%20%20%20exit(%22No%20model%20loaded%20!%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20command_line_options(mo%2C%20notebook_name)%3A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_out_settings%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_out_settings.run()%0A%20%20%20%20out_settings%20%3D%20_defs%5B'out_settings'%5D%0A%0A%20%20%20%20mo.md(out_settings(notebook_name))%0A%20%20%20%20return%20out_settings%2C%20perfspec_out_settings%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20load_trainded_model(mo%2C%20notebook_name)%3A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_cli_ops%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_cli_ops.run()%0A%20%20%20%20out_cli_ops%20%3D%20_defs%5B'out_cli_ops'%5D%0A%20%20%20%20mo.accordion(%7B%20%0A%20%20%20%20%20%20%20%20%22Mostrar%20command%20Line%20options%20%22%3A%20out_cli_ops(notebook_name)%20%0A%20%20%20%20%7D)%0A%20%20%20%20return%20out_cli_ops%2C%20perfspec_cli_ops%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20model_summary(lib_load_model_from_path%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20def%20load_trained_model()%3A%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D%5B'model'%5D%20%3D%3D%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20_verbose%20%3D%20%221%22%20if%20mo.running_in_notebook()%20else%20perfspec%5B'settings'%5D%5B'verbose'%5D%0A%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'model'%5D%20%3D%20lib_load_model_from_path(perfspec%2C_verbose)%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D%5B'model'%5D%20%3D%3D%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%20(%22No%20model%20loaded%20!%22)%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Load%20trained%20model%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(load_trained_model%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20evaluate_mode(load_trained_model%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20def%20model_sumary()%3A%0A%20%20%20%20%20%20%20%20load_trained_model()%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D%5B'model'%5D%20!%3D%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'model'%5D.summary()%0A%0A%20%20%20%20_summary%20%3D%20model_sumary()%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Model%20Summary%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(model_sumary%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20history_info(lib_history_info%2C%20lib_run_evaluate%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20_evaluate_run%3Dlib_run_evaluate(perfspec)%0A%20%20%20%20_history%3Dlib_history_info(perfspec)%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Evaluate%20Model%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20model_plot_accuracy(lib_history_info%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20_history%3Dlib_history_info(perfspec)%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20History%20Model%20info%0A%0A%20%20%20%20%20%20%20%20%7Bmo.md(_history)%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20model_plot_loss(lib_plot_accuracy%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20_plot_acc%3Dlib_plot_accuracy(perfspec)%0A%0A%20%20%20%20if%20perfspec%5B'vars'%5D%5B'history'%5D%20!%3D%20None%20and%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20_output%20%3D%20%20mo.as_html(_plot_acc.gcf())%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20_output%20%3D%20None%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%23%20Model%20Accuracy%20history%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20From%20model%20train%20plot%20accuracy%20and%20epochs%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B_output%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20model_plot_precision(lib_plot_loss%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20_plot_loss%20%3D%20lib_plot_loss(perfspec)%0A%0A%20%20%20%20if%20perfspec%5B'vars'%5D%5B'history'%5D%20!%3D%20None%20and%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20_output%20%3D%20%20mo.as_html(_plot_loss.gcf())%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20_output%20%3D%20None%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Model%20loss%20%20history%0A%20%20%20%20%20%20%20%20From%20model%20train%20loss%0A%0A%20%20%20%20%20%20%20%20%7B_output%7D%0A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20confusion_matrix(lib_plot_precision%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20_plt_pre%20%3D%20lib_plot_precision(perfspec)%0A%20%20%20%20if%20_plt_pre%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%22%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20From%20model%20train%20plot%20Precision%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7Bmo.as_html(_plt_pre.gcf())%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(lib_load_model_from_path%2C%20lib_make_confusion_matrix%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20if%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D.get('model')%20%3D%3D%20None%3A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20lib_load_model_from_path(perfspec%5B'settings'%5D%5B'verbose'%5D)%0A%20%20%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D.get('model')%20!%3D%20None%3A%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20lib_make_confusion_matrix(perfspec)%0A%0A%20%20%20%20mo.md(%22%23%23%23%20Confusion%20Matrix%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20title_show_values_prediction(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Run%20Model%20Prediction%0A%0A%20%20%20%20%20%20%20%20To%20explore%20in%20interactive%20mode%20use%20**run_perfspec.py**%20notebook%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20).callout('neutral')%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20show_values_prediction(mo%2C%20perfspec)%3A%0A%20%20%20%20def%20on_show_values_prediction()%3A%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'settings'%5D%5B'sequence_length'%5D%20%3E%201%20or%20len(perfspec%5B'vars'%5D%5B'unique_actions'%5D)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22%22%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%20Show%20Values%20Prediction%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%0A%20%20%20%20mo.md(on_show_values_prediction())%0A%20%20%20%20return%20(on_show_values_prediction%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20title_run_prediction(%0A%20%20%20%20lib_predict_action%2C%0A%20%20%20%20load_trained_model%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20perfspec%2C%0A)%3A%0A%20%20%20%20def%20show_values_prediction()%3A%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'settings'%5D%5B'sequence_length'%5D%20%3E%201%20or%20len(perfspec%5B'vars'%5D%5B'unique_actions'%5D)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20%23if%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D%5B'model'%5D%20%3D%3D%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20load_trained_model()%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D%5B'model'%5D%20!%3D%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%20%20%20%20data%3D%5B%5D%0A%20%20%20%20%20%20%20%20for%20act%20in%20perfspec%5B'vars'%5D%5B'unique_actions'%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%23print%20(act)%0A%20%20%20%20%20%20%20%20%20%20%20(_%2Cprediction)%20%3D%20lib_predict_action(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'model'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'settings'%5D%5B'sequence_length'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5Bact%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'label_encoder'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22-1%22%0A%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20data.append(%7B%22action%22%3A%20act%2C%20'prediction'%3A%20prediction%5B'action'%5D%5B0%5D%2C%20'value'%3A%20prediction%5B'max_value'%5D%7D)%0A%20%20%20%20%20%20%20%20df_res%20%3D%20pd.DataFrame(data)%20%20%20%20%0A%20%20%20%20%20%20%20%20transformed_df%20%3D%20mo.ui.dataframe(df_res)%0A%20%20%20%20%20%20%20%20return%20(transformed_df)%0A%0A%20%20%20%20data_frame%3Dshow_values_prediction()%0A%20%20%20%20data_frame%0A%20%20%20%20return%20data_frame%2C%20show_values_prediction%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(%0A%20%20%20%20lib_get_input_sequence%2C%0A%20%20%20%20lib_history_info%2C%0A%20%20%20%20lib_predict_action%2C%0A%20%20%20%20lib_run_evaluate%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20model_sumary%2C%0A%20%20%20%20perfspec%2C%0A)%3A%0A%20%20%20%20_verbose%20%3D%20%221%22%20if%20mo.running_in_notebook()%20else%20perfspec%5B'settings'%5D%5B'verbose'%5D%0A%20%20%20%20_input_sequence%20%3D%20lib_get_input_sequence(perfspec%5B'settings'%5D%5B'input_str'%5D%2Cperfspec%5B'vars'%5D%5B'unique_actions'%5D)%0A%20%20%20%20if%20len(_input_sequence)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%23_model%20%3D%20lib_load_model_from_path(_verbose)%0A%20%20%20%20%20%20%20%20if%20_verbose%20%3D%3D%20%221%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20model_sumary()%0A%20%20%20%20%20%20%20%20%20%20%20lib_run_evaluate(perfspec)%0A%20%20%20%20%20%20%20%20%20%20%20lib_history_info(perfspec)%0A%20%20%20%20%20%20%20%20%20%20%20print%20(%22%5CnPrediction%22)%0A%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'vars'%5D%5B'model'%5D%20!%3D%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20(encoded_input%2Cpredicted_probabilities)%20%3D%20lib_predict_action(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'model'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'settings'%5D%5B'sequence_length'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_input_sequence%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'label_encoder'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_verbose%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%20(f%22No%20model%20found%20!%22)%0A%20%20%20%20return%20encoded_input%2C%20predicted_probabilities%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
+
+
+c5d7c6b886c0bb6929370c9fe5ecc731059b28f4be29c11f8be7581ebf225a63
+
+
diff --git a/html/prepare_perfspec.html b/html/prepare_perfspec.html
new file mode 100644
index 0000000..9e111df
--- /dev/null
+++ b/html/prepare_perfspec.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ prepare_perfspec.py
+
+
+
+
+
+ prepare perfspec
+
+
+
+
+
+
+
+
+
+ import%20marimo%0A%0A__generated_with%20%3D%20%220.10.17%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20header()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20notebook_name%20%3D%20'prepare_perfspec.py'%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_vars%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_vars.run()%0A%20%20%20%20perfspec%20%3D%20_defs%5B'perfspec'%5D%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_header%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_header.run()%0A%20%20%20%20lib_header%20%3D%20_defs%5B'header'%5D%0A%20%20%20%20lib_intro%20%3D%20_defs%5B'intro'%5D%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%7Blib_header(notebook_name)%7D%0A%0A%20%20%20%20%20%20%20%20%23%23%20Prepare%20data%20to%20train%20**%7Bperfspec%5B'app'%5D%5B'train_mode'%5D%7D**%20%20model%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20lib_header%2C%0A%20%20%20%20%20%20%20%20lib_intro%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20notebook_name%2C%0A%20%20%20%20%20%20%20%20perfspec%2C%0A%20%20%20%20%20%20%20%20perfspec_header%2C%0A%20%20%20%20%20%20%20%20perfspec_vars%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20imports()%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20json%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20return%20Path%2C%20json%2C%20np%2C%20pd%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20intro(Path%2C%20lib_intro%2C%20mo%2C%20notebook_name%2C%20perfspec)%3A%0A%20%20%20%20verbose%20%3D%20perfspec%5B'settings'%5D%5B'verbose'%5D%0A%20%20%20%20perfspec%5B'vars'%5D%20%3D%20%7B%7D%0A%0A%20%20%20%20from%20lib_perfspec%20import%20perfspec_args%0A%20%20%20%20(_%2C_defs)%20%3D%20perfspec_args.run()%0A%0A%20%20%20%20if%20not%20Path(perfspec%5B'defaults'%5D%5B'data_dirpath'%5D).exists()%3A%20%0A%20%20%20%20%20%20%20exit(f%22data%20dir%20path%20not%20found%3A%20%7Bperfspec%5B'defaults'%5D%5B'data_dirpath'%5D%7D%22)%20%20%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%7Blib_intro(notebook_name)%7D%0A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20perfspec_args%2C%20verbose%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20load_raw_logs(Path%2C%20mo%2C%20pd%2C%20perfspec)%3A%0A%20%20%20%20def%20load_raw_logs(filepath)%3A%0A%20%20%20%20%20%20%20%20file_path%20%3D%20Path(filepath)%0A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20the%20file%20exists%20using%20Path%0A%20%20%20%20%20%20%20%20if%20not%20file_path.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20exit(f%22File%20not%20found%3A%20%7Bfilepath%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Set%20the%20chunk%20size%20(number%20of%20rows%20to%20process%20at%20a%20time)%0A%20%20%20%20%20%20%20%20chunk_size%20%3D%201000%20%20%23%20Adjust%20based%20on%20your%20available%20memory%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20an%20empty%20list%20to%20hold%20the%20chunks%0A%20%20%20%20%20%20%20%20chunks%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Iterate%20over%20the%20file%20in%20chunks%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20chunk%20in%20pd.read_json(file_path%2C%20lines%3DTrue%2C%20chunksize%3Dchunk_size%2C%20encoding_errors%3D'ignore')%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Append%20each%20chunk%20to%20the%20list%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chunks.append(chunk)%0A%20%20%20%20%20%20%20%20except%20ValueError%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Error%20while%20parsing%20JSON%3A%20%7Be%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Combine%20all%20chunks%20into%20a%20single%20DataFrame%0A%20%20%20%20%20%20%20%20df%20%3D%20pd.concat(chunks%2C%20ignore_index%3DTrue)%0A%0A%20%20%20%20%20%20%20%20%23df%5B'user_parsed'%5D%20%3D%20df%5B'user'%5D.apply(json.loads)%0A%20%20%20%20%20%20%20%20%23df_exploded%20%3D%20df.explode('user')%0A%0A%20%20%20%20%20%20%20%20%23%20Normalize%20the%20JSON%20structure%20to%20flatten%20it%0A%20%20%20%20%20%20%20%20df_normalized%20%3D%20pd.json_normalize(%0A%20%20%20%20%20%20%20%20%20%20%20%20df.to_dict(orient%3D'records')%2C%20%20%23%20Convert%20the%20DataFrame%20to%20a%20list%20of%20records%0A%20%20%20%20%20%20%20%20%20%20%20%20sep%3D'_'%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'settings'%5D%5B'verbose'%5D%20!%3D%20None%20or%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%20(f%22Loaded%20%7Blen(df_normalized)%7D%20rows%20from%20raw%20logs%20%22)%20%0A%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'df_raw_data'%5D%3Ddf_normalized%0A%0A%20%20%20%20load_raw_logs(perfspec%5B'settings'%5D%5B'raw_audit_log'%5D)%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20%20%7Bmo.icon('lucide%3Adatabase'%2C%20color%3D%22green%22)%7D%20Load%20raw%20logs%20into%20a%20Dataset%0A%0A%20%20%20%20%20%20%20%20Loading%20raw%20data%20logs%20from%3A%20%7Bperfspec%5B'settings'%5D%5B'raw_audit_log'%5D%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(load_raw_logs%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20create_main_audit_logs(Path%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20def%20create_main_audit_logs(df_normalized%2Coutputfile)%3A%0A%20%20%20%20%20%20%20%20%23%20List%20of%20fields%20to%20remove%0A%20%20%20%20%20%20%20%20remove_fields%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22apiVersion%22%2C%20%22level%22%2C%20%22sourceIPs%22%2C%20%22kind%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22annotations%22%2C%20%22stageTimestamp%22%2C%20%22userAgent%22%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%23%20List%20of%20fields%20to%20keep%0A%20%20%20%20%20%20%20%20keep_fields%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22requestReceivedTimestamp%22%2C%20%22user_username%22%2C%20%22verb%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22objectRef_resource%22%2C%20%22objectRef_subresource%22%2C%20%22objectRef_name%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22requestURI%22%2C%20%22auditID%22%2C%20%22stage%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22responseStatus_code%22%2C%20%22objectRef_uid%22%2C%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Remove%20unwanted%20fields%20(drop%20them%20from%20the%20DataFrame%20if%20they%20exist)%0A%20%20%20%20%20%20%20%20df_cleaned%20%3D%20df_normalized.drop(columns%3D%5Bfield%20for%20field%20in%20remove_fields%20if%20field%20in%20df_normalized.columns%5D%2C%20errors%3D'ignore')%0A%0A%20%20%20%20%20%20%20%20%23%20Select%20only%20the%20fields%20you%20want%20to%20keep%20(ensure%20that%20they%20exist%20in%20the%20DataFrame)%0A%20%20%20%20%20%20%20%20df_final%20%3D%20df_cleaned%5Bkeep_fields%5D.copy()%0A%0A%20%20%20%20%20%20%20%20%23%20Display%20the%20final%20DataFrame%0A%20%20%20%20%20%20%20%20%23print(%22Final%20DataFrame%20with%20only%20the%20selected%20fields%3A%22)%0A%20%20%20%20%20%20%20%20%23print(df_final.head())%0A%0A%20%20%20%20%20%20%20%20%23%20Define%20the%20output%20path%20for%20the%20JSON%20file%0A%20%20%20%20%20%20%20%20output_file%20%3D%20Path(outputfile)%0A%0A%20%20%20%20%20%20%20%20if%20Path(output_file).exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20output_file.unlink()%0A%0A%20%20%20%20%20%20%20%20%23%20Write%20the%20DataFrame%20to%20JSON%0A%20%20%20%20%20%20%20%20df_final.to_json(output_file%2C%20orient%3D'records'%2C%20lines%3DTrue%2C%20force_ascii%3DFalse)%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'settings'%5D%5B'verbose'%5D%20!%3D%20None%20or%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Main%20audit%20log%20created%20in%20%7Boutput_file%7D%22)%0A%0A%20%20%20%20create_main_audit_logs(perfspec%5B'vars'%5D%5B'df_raw_data'%5D%2C%20perfspec%5B'settings'%5D%5B'main_audit_log'%5D)%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20%20%7Bmo.icon('lucide%3Ascroll'%2C%20color%3D%22red%22)%7D%20Cleanup%20Dataset%0A%0A%20%20%20%20%20%20%20%20Create%20a%20%20main%20**audit%20log**%20as%20starting%20point%20for%20operations%0A%0A%20%20%20%20%20%20%20%20Final%20log%20will%20be%20in%20%7Bperfspec%5B'settings'%5D%5B'main_audit_log'%5D%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(create_main_audit_logs%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20genereate_actions_data(Path%2C%20mo%2C%20pd%2C%20perfspec)%3A%0A%20%20%20%20def%20generate_actions_data(filepath)%3A%0A%20%20%20%20%20%20%20%20file_path%20%3D%20Path(filepath)%0A%20%20%20%20%20%20%20%20if%20not%20file_path.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20exit(f%22File%20path%3A%20%7Bfilepath%7D%20not%20exists%22)%0A%0A%20%20%20%20%20%20%20%20df_actions%20%3D%20pd.read_json(file_path%2C%20orient%3D'records'%2C%20lines%3DTrue)%0A%0A%20%20%20%20%20%20%20%20names%3D%5B'requestReceivedTimestamp'%2C%20'user_username'%2C%20'verb'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'objectRef_resource'%2C%20'objectRef_subresource'%2C%20'objectRef_name'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'requestURI'%2C%20'auditID'%2C%20'stage'%2C%20'responseStatus_code'%2C%20%22objectRef_uid%22%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Assign%20the%20column%20names%20to%20the%20DataFrame%0A%20%20%20%20%20%20%20%20df_actions.columns%20%3D%20names%0A%0A%20%20%20%20%20%20%20%20%23print(df_actions.count)%0A%20%20%20%20%20%20%20%20df_actions%20%3D%20df_actions.drop_duplicates(ignore_index%3DTrue)%0A%0A%20%20%20%20%20%20%20%20%23df_actions%20%3D%20df_actions.drop(df_actions.columns%5B%5B%5D%5D%2C%20axis%3D1)%0A%20%20%20%20%20%20%20%20df_actions%20%3D%20df_actions%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(df_actions%5B'verb'%5D%20!%3D%20%22get%22)%20%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(df_actions%5B'verb'%5D%20!%3D%20%22watch%22)%20%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(df_actions%5B'verb'%5D%20!%3D%20%22list%22)%20%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(df_actions%5B'objectRef_resource'%5D%20!%3D%20%22events%22)%20%26%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(df_actions%5B'objectRef_resource'%5D%20!%3D%20%22leases%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20df_actions%20%3D%20df_actions%5Bdf_actions.objectRef_resource%20!%3D%20%22replicationcontrollers%22%5D%0A%0A%20%20%20%20%20%20%20%20df_actions%5B%22event_type%22%5D%20%3D%20df_actions%5B%22verb%22%5D%20%2B%20%22_%22%20%2B%20df_actions%5B%22objectRef_resource%22%5D%0A%0A%20%20%20%20%20%20%20%20%23df_actions%20%3D%20df_actions.drop_duplicates()%0A%20%20%20%20%20%20%20%20%23print(df_actions.to_string())%0A%20%20%20%20%20%20%20%20%23print(df_actions.count)%0A%0A%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'df_actions_dataset'%5D%20%3D%20df_actions%0A%20%20%20%20%20%20%20%20if%20perfspec%5B'settings'%5D%5B'verbose'%5D%20!%3D%20None%20or%20mo.running_in_notebook()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Main%20audit%20log%20prepared%20for%20actions%20data%20with%3A%20%7Bdf_actions.count()%7D%20rows%22)%0A%0A%20%20%20%20generate_actions_data(perfspec%5B'settings'%5D%5B'main_audit_log'%5D)%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20%20%7Bmo.icon('lucide%3Adatabase'%2C%20color%3D%22green%22)%7D%20Load%20audit%20logs%20for%20Actions%0A%0A%20%20%20%20%20%20%20%20Loading%20**main%20audit%20data%20logs**%20from%3A%20%7Bperfspec%5B'settings'%5D%5B'main_audit_log'%5D%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(generate_actions_data%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20save_actions_data(Path%2C%20mo%2C%20perfspec)%3A%0A%20%20%20%20def%20save_actions_data(df_audit_logs%2Cfilepath)%3A%0A%20%20%20%20%20%20%20%20file_path%20%3D%20Path(filepath)%0A%20%20%20%20%20%20%20%20if%20file_path.exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23file_path.unlink()%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22File%20path%20already%20exist%3A%20%7Bfilepath%7D%20DELETE%20to%20process%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%0A%0A%20%20%20%20%20%20%20%20event_seq%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20event_sub_seq%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20audit_filepath%20%3D%20Path(filepath)%0A%20%20%20%20%20%20%20%20if%20Path(audit_filepath).exists()%3A%0A%20%20%20%20%20%20%20%20%20%20%20audit_filepath.unlink()%0A%20%20%20%20%20%20%20%20for%20c%2C%20r%20in%20df_audit_logs.iterrows()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20open(audit_filepath%2C%20%22a%22)%20as%20event_file%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event_file.write(%22%25s%5Cn%22%20%25%20r%5B'event_type'%5D)%0A%0A%20%20%20%20save_actions_data(perfspec%5B'vars'%5D%5B'df_actions_dataset'%5D%2Cperfspec%5B'settings'%5D%5B'actions_filepath'%5D)%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%23%20%20%7Bmo.icon('lucide%3Asave'%2C%20color%3D%22green%22)%7D%20Save%20Actions%20Data%20%0A%0A%20%20%20%20%20%20%20%20Save%20**actions%20data**%20logs%20in%3A%20%7Bperfspec%5B'settings'%5D%5B'actions_filepath'%5D%7D%0A%0A%20%20%20%20%20%20%20%20%3E%20If%20file%20exists%20it%20will%20not%20be%20deleted%20or%20overwritted%2C%20basically%20as%20a%20**trainded%20models%20data%20source**%20%0A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20(save_actions_data%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20plot_available_fonts(mo%2C%20perfspec)%3A%0A%20%20%20%20def%20available_fonts()%3A%0A%20%20%20%20%20%20%20%20import%20matplotlib.font_manager%0A%0A%20%20%20%20%20%20%20%20%23%20List%20all%20available%20fonts%20in%20Matplotlib%0A%20%20%20%20%20%20%20%20available_fonts%20%3D%20%5Bf.name%20for%20f%20in%20matplotlib.font_manager.fontManager.ttflist%5D%0A%20%20%20%20%20%20%20%20return%20(available_fonts)%0A%0A%20%20%20%20if%20perfspec%5B'settings'%5D%5B'verbose'%5D%20%3D%3D%20'dev'%3A%0A%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%23%20Matplot%20available%20fonts%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Fonts%3A%20%7Bavailable_fonts()%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%20(available_fonts%2C)%0A%0A%0A%40app.cell%0Adef%20main(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%3Ca%20id%3D'main'%20%2F%3E%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20actions_distrib(mo%2C%20perfspec)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%20%20%7Bmo.icon('lucide%3Achart-spline'%2C%20color%3D%22orange%22)%7D%20%20Plot%20actions%20distribution%0A%0A%20%20%20%20%20%20%20%20Show%20how%20**Resources**%20and%20critical%20**methods**%20are%20concentrated%20or%20dristributes%0A%0A%20%20%20%20%20%20%20%20A%20distribution%20map%20is%20generated%20with%20plot%20graphic%20and%20saved%20from%20**accions-dataset**%3Cbr%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20to%20%20%7Bperfspec%5B'settings'%5D%5B'actions_distrib_filepath'%5D%7D%20%3Cbr%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20usando%20formato%20%7Bperfspec%5B'settings'%5D%5B'actions_distrib_format'%5D%7D%20%3Cbr%3E%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20plot_actions_distrib(copy%2C%20mo%2C%20np%2C%20perfspec)%3A%0A%20%20%20%20def%20actions_distrib(filename%2C%20output_path%2C%20output_format)%3A%0A%20%20%20%20%20%20%20%20import%20re%0A%20%20%20%20%20%20%20%20from%20collections%20import%20defaultdict%2C%20Counter%0A%20%20%20%20%20%20%20%20from%20tqdm%20import%20trange%2C%20tqdm%0A%20%20%20%20%20%20%20%20import%20time%0A%20%20%20%20%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20%20%20%20%20import%20matplotlib%0A%20%20%20%20%20%20%20%20import%20textwrap%0A%0A%20%20%20%20%20%20%20%20font_size%20%3D%2017%0A%0A%20%20%20%20%20%20%20%20%23%20Set%20the%20font%20to%20a%20specific%20one%20that%20you%20know%20is%20available%20on%20your%20system%0A%20%20%20%20%20%20%20%20matplotlib.rcParams%5B'font.family'%5D%20%3D%20'DejaVu%20Serif'%0A%0A%20%20%20%20%20%20%20%20raw_text%20%3D%20open(filename%2C%20'r'%2C%20encoding%3D'utf-8').read()%0A%20%20%20%20%20%20%20%20raw_words%20%3D%20raw_text.replace('%5Cn'%2C%20'%2C').split('%2C')%5B%3A-1%5D%0A%0A%20%20%20%20%20%20%20%20def%20label_wrap(labels)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20work_labels%20%3D%20copy.deepcopy(labels)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20i%2C%20label%20in%20enumerate(work_labels)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20work_labels%5Bi%5D%20%3D%20%22%5Cn%22.join(textwrap.wrap(label%2Cwidth%3D15))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20work_labels%0A%0A%20%20%20%20%20%20%20%20words%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20event_filter%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%23%20Example%20of%20filtering%20out%20some%20unwanted%20events%0A%20%20%20%20%20%20%20%20for%20event%20in%20raw_words%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not('collection'%20in%20event)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20words.append(event)%0A%0A%20%20%20%20%20%20%20%20verbs%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20resources%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20counter%20%3D%20Counter(words)%0A%0A%20%20%20%20%20%20%20%20for%20word%20in%20words%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20verb%2C%20resource%20%3D%20word.split('_')%5B0%5D%2C%20word.split('_')%5B1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20verbs.append(verb)%0A%20%20%20%20%20%20%20%20%20%20%20%20resources.append(resource)%0A%0A%20%20%20%20%20%20%20%20%23%20verbs%20%3D%20verbs%5B%3A200%5D%0A%20%20%20%20%20%20%20%20%23%20resources%20%3D%20resources%5B%3A200%5D%0A%0A%20%20%20%20%20%20%20%20counter_verbs%20%3D%20Counter(verbs)%0A%20%20%20%20%20%20%20%20counter_resources%20%3D%20Counter(resources)%0A%0A%20%20%20%20%20%20%20%20verbs_set%20%3D%20list(set(verbs))%0A%20%20%20%20%20%20%20%20resources_set%20%3D%20list(set(resources))%0A%0A%20%20%20%20%20%20%20%20verbs_set.sort()%0A%20%20%20%20%20%20%20%20resources_set.sort(reverse%3DTrue)%0A%0A%20%20%20%20%20%20%20%20verbs%20%3D%20%5Be%20for%20e%20in%20verbs_set%20for%20k%20in%20resources_set%5D%0A%20%20%20%20%20%20%20%20resources%20%3D%20%5Be%20for%20k%20in%20verbs_set%20for%20e%20in%20resources_set%5D%0A%0A%20%20%20%20%20%20%20%20%23%20color_verb%20%3D%20%5Bcounter%5Be%2B%22_%22%2Bk%5D%20for%20e%20in%20verbs_set%20for%20k%20in%20resources_set%5D%0A%20%20%20%20%20%20%20%20area_resource%20%3D%20%5B3*counter%5Bverbs%5Bi%5D%2B%22_%22%2Bresources%5Bi%5D%5D%20for%20i%20in%20range(len(verbs))%5D%0A%20%20%20%20%20%20%20%20texts%20%3D%20%5Bcounter%5Bverbs%5Bi%5D%2B%22_%22%2Bresources%5Bi%5D%5D%20for%20i%20in%20range(len(verbs))%5D%0A%0A%20%20%20%20%20%20%20%20plt.rcParams.update(%7B'font.size'%3A%20font_size%7D)%0A%0A%20%20%20%20%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(9%2C%209)%2C%20dpi%3D100)%0A%0A%20%20%20%20%20%20%20%20ax%3Dfig.add_subplot(111%2C%20label%3D%221%22)%0A%0A%20%20%20%20%20%20%20%20ax.scatter(verbs%2C%20resources%2C%20s%3Darea_resource%2C%20alpha%3D0.4%2C%20color%3D'gray')%0A%0A%0A%20%20%20%20%20%20%20%20ax.set_xlabel(%22Methods%22%2C%20fontsize%3Dfont_size)%0A%20%20%20%20%20%20%20%20ax.set_xticks(verbs_set)%0A%20%20%20%20%20%20%20%20ax.set_xticklabels(verbs_set%2C%20fontsize%3Dfont_size-4%2C%20linespacing%3D1.0)%0A%20%20%20%20%20%20%20%20ax.xaxis.tick_bottom()%0A%20%20%20%20%20%20%20%20ax.set_xlim(-0.5%2C3.5)%0A%0A%20%20%20%20%20%20%20%20ax.set_ylabel(%22Resources%22%2C%20fontsize%3Dfont_size)%0A%20%20%20%20%20%20%20%20ax.set_yticks(resources_set)%0A%20%20%20%20%20%20%20%20ax.set_yticklabels(resources_set%2C%20fontsize%3Dfont_size-8%2C%20linespacing%3D1.0)%0A%20%20%20%20%20%20%20%20ax.yaxis.tick_left()%0A%0A%20%20%20%20%20%20%20%20for%20j%20in%20range(len(verbs))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20texts%5Bj%5D%20%3E%2020%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.annotate(str(texts%5Bj%5D)%2C%20(verbs%5Bj%5D%2C%20resources%5Bj%5D)%2C%20ha%3D'center'%2C%20va%3D'center'%2C%20fontsize%3Dnp.interp(texts%5Bj%5D%2C%20%5B20%2C%202234%5D%2C%20%5B8%2C%2020%5D))%0A%0A%0A%20%20%20%20%20%20%20%20plt.rcParams%5B'grid.linestyle'%5D%20%3D%20'dotted'%0A%20%20%20%20%20%20%20%20plt.rcParams%5B'grid.alpha'%5D%20%3D%200.3%0A%0A%20%20%20%20%20%20%20%20plt.grid()%0A%20%20%20%20%20%20%20%23%20plt.show()%0A%20%20%20%20%20%20%20%20fig.savefig(output_path%2C%20format%3Doutput_format%2C%20bbox_inches%3D%22tight%22)%0A%20%20%20%20%20%20%20%20perfspec%5B'vars'%5D%5B'actions_distrib'%5D%20%3D%20counter%0A%20%20%20%20%20%20%20%20return%20plt%0A%0A%20%20%20%20_plt%20%3D%20actions_distrib(%0A%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'settings'%5D%5B'actions_filepath'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'settings'%5D%5B'actions_distrib_filepath'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20perfspec%5B'settings'%5D%5B'actions_distrib_format'%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%0A%20%20%20%20if%20'actions_distrib'%20in%20perfspec%5B'vars'%5D%20and%20len(perfspec%5B'vars'%5D%5B'actions_distrib'%5D.items())%20%3E%200%3A%0A%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%22%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%23%20Plot%20actions%20distribution%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7Bmo.as_html(_plt.show())%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%23%20Plot%20actions%20distribution%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%20(actions_distrib%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20review_actions_distrib(mo%2C%20pd%2C%20perfspec)%3A%0A%20%20%20%20def%20df_actions_table()%3A%0A%20%20%20%20%20%20%20%20if%20len(perfspec%5B'vars'%5D%5B'actions_distrib'%5D.items())%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20df%20%3D%20pd.DataFrame(perfspec%5B'vars'%5D%5B'actions_distrib'%5D.items()%2C%20columns%3D%5B'Action'%2C%20'Count'%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20count_filter%20%3D%20mo.ui.slider(start%3D0%2C%20stop%3D100%2C%20value%3D50%2C%20label%3D%22Max%20age%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20count_filter%0A%20%20%20%20%20%20%20%20%20%20%20%20%23_transform_df%20%3D%20mo.ui.dataframe(_df)%0A%20%20%20%20%20%20%20%20%20%20%20%20transform_df%20%3D%20mo.ui.table(df%2Cselection%3D%22multi%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20transform_df%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20transform_df%20%3D%20df_actions_table()%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%0A%20%20%20%20%20%20%20%20%23%23%20Review%20actions%20distribution%0A%0A%20%20%20%20%20%20%20%20%7Btransform_df%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20df_actions_table%2C%20transform_df%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20select_actions_distrib(mo%2C%20transform_df)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Select%20actions%20distribution%0A%20%20%20%20%20%20%20%20%7Bmo.md(f%22Selecte%20value%3A%20%7Bmo.ui.table(transform_df.value)%7D%22)%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
+
+
+bb116188b7a79e8601a19ae893fb1707b120485586956d73b52b81db04dac132
+
+