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