From 67bcd4ccae3ee8e59f7ba1856bcb3a55884d5802 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Mon, 24 Feb 2025 12:29:41 -1000 Subject: [PATCH 01/13] Created event_processing file with 3 methods to run analysis on given csv file Signed-off-by: Connor Narowetz --- event_processing.py | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 event_processing.py diff --git a/event_processing.py b/event_processing.py new file mode 100644 index 0000000..7b6a49e --- /dev/null +++ b/event_processing.py @@ -0,0 +1,65 @@ +# ============================================================================= +# Title: Event Processing +# Author: Sailuh +# Description: +# This Python script utilizes the pm4py library for process mining tasks. +# +# Requirements: +# - Python 3.x +# +# Usage: +# - Ensure the script is run in a Python environment +# - If pm4py is not installed, the script will install it +# +# License: MIT License +# ============================================================================= + +# Install pm4py if not already done +try: + import pm4py + print("pm4py already installed") +except ImportError: + import subprocess + subprocess.check_call(["python", "-m", "pip", "install", "pm4py"]) + import pm4py + print("pm4py installed!") + +import pandas +import os +from datetime import datetime + +# Return start & end activities +def start_end_activities(csv_path): + event_log = pandas.read_csv(csv_path) + event_log = pm4py.format_dataframe(event_log, case_id='id', activity_key='event', timestamp_key='created_at') + start_activities = pm4py.get_start_activities(event_log) + end_activities = pm4py.get_end_activities(event_log) + return start_activities, end_activities + +# Generate tree at output_dir directory from csv_path file +def generate_tree(csv_path, output_dir): + event_log = pandas.read_csv(csv_path) + event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at') + + output_dir = os.path.expanduser(output_dir) + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + file_name = f"process_tree_{timestamp}.png" + output_path = os.path.join(output_dir, file_name) + + process_tree = pm4py.discover_process_tree_inductive(event_log) + pm4py.save_vis_process_tree(process_tree, output_path) + +# Generate graph at output_dir directory from csv_path file +def generate_graph(csv_path, output_dir): + event_log = pandas.read_csv(csv_path) + event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at') + + output_dir = os.path.expanduser(output_dir) + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + file_name = f"process_tree_{timestamp}.png" + output_path = os.path.join(output_dir, file_name) + + process_tree = pm4py.discover_process_tree_inductive(event_log) + bpmn_model = pm4py.convert_to_bpmn(process_tree) + pm4py.save_vis_bpmn(bpmn_model, output_path, format="png") + From ee15aa150e74db032d91bdb2ae556590be933b32 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Mon, 24 Feb 2025 19:40:35 -1000 Subject: [PATCH 02/13] i #1 added comments to name .png file Signed-off-by: Connor Narowetz --- event_processing.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/event_processing.py b/event_processing.py index 7b6a49e..a69f00e 100644 --- a/event_processing.py +++ b/event_processing.py @@ -41,6 +41,7 @@ def generate_tree(csv_path, output_dir): event_log = pandas.read_csv(csv_path) event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at') + # Set up path and name of .png output_dir = os.path.expanduser(output_dir) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") file_name = f"process_tree_{timestamp}.png" @@ -54,6 +55,7 @@ def generate_graph(csv_path, output_dir): event_log = pandas.read_csv(csv_path) event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at') + # Set up path and name of .png output_dir = os.path.expanduser(output_dir) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") file_name = f"process_tree_{timestamp}.png" From da1591bbfb1252185d3d6e0f1f22db6126d8d092 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Sat, 1 Mar 2025 14:56:36 -1000 Subject: [PATCH 03/13] i #341 Updated script to be called from terminal - Added config_file and action argument - Run chosen action Signed-off-by: Connor Narowetz --- event_processing.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/event_processing.py b/event_processing.py index a69f00e..53a118f 100644 --- a/event_processing.py +++ b/event_processing.py @@ -24,9 +24,13 @@ import pm4py print("pm4py installed!") +import argparse import pandas import os from datetime import datetime +import pm4py +import subprocess +import yaml # Return start & end activities def start_end_activities(csv_path): @@ -49,6 +53,7 @@ def generate_tree(csv_path, output_dir): process_tree = pm4py.discover_process_tree_inductive(event_log) pm4py.save_vis_process_tree(process_tree, output_path) + print("Tree generated and saved") # Generate graph at output_dir directory from csv_path file def generate_graph(csv_path, output_dir): @@ -64,4 +69,37 @@ def generate_graph(csv_path, output_dir): process_tree = pm4py.discover_process_tree_inductive(event_log) bpmn_model = pm4py.convert_to_bpmn(process_tree) pm4py.save_vis_bpmn(bpmn_model, output_path, format="png") + print("Graph generated and saved") +# Load config file from given path +def load_config(config_path): + with open(config_path, 'r') as file: + config = yaml.safe_load(file) + return config + +def main(config_file, action): + # Load config file + conf = load_config(config_file) + csv_file = conf.get('process_mining', {}).get('csv_file_path') + output_dir = conf.get('process_mining', {}).get('image_output_dir') + + # If-else for action choosen + if action == 'start_end': + start_activities, end_activities = start_end_activities(csv_file) + print("Start Activities:", start_activities) + print("End Activities:", end_activities) + elif action == 'generate_tree': + generate_tree(csv_file, output_dir) + elif action == 'generate_graph': + generate_graph(csv_file, output_dir) + else: + print(f"Unknown action choose: start_end, generate_tree, generate_graph.") + +if __name__ == "__main__": + # Parse arguments + parser = argparse.ArgumentParser(description="Process mining script with pm4py") + parser.add_argument('config_file', help='Path to the configuration file (.yml)') + parser.add_argument('action', help='Action to perform (start_end, generate_tree, generate_graph)') + args = parser.parse_args() + # Call main + main(args.config_file, args.action) \ No newline at end of file From 0faa4f8e9ed6dcb1b7abd5b568c786b9ecaeb3b8 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Sun, 9 Mar 2025 09:10:44 -1000 Subject: [PATCH 04/13] i #1 Created Python Notebook with example - Added Python notebook with all functionality. --- event_processing.py | 20 +++ pm.ipynb | 401 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 421 insertions(+) create mode 100644 pm.ipynb diff --git a/event_processing.py b/event_processing.py index 53a118f..28a9ba8 100644 --- a/event_processing.py +++ b/event_processing.py @@ -32,6 +32,20 @@ import subprocess import yaml + +# Download data from CLI +def download_data(config_path, cli_path): + command = f"Rscript {cli_path} download {config_path} --token_path=~/.ssh/github_token" + subprocess.run(command, shell=True, check=True) + print("Event data downloaded successfully.") + +# Parse data from CLI +def parse_data(config_path, cli_path): + command = f"Rscript exec/ghevents.R parse conf/process_mining.yml" + target_directory = os.path.expanduser(cli_path) + subprocess.run(command, shell=True, check=True, cwd=target_directory) + print("Event data parsed successfully.") + # Return start & end activities def start_end_activities(csv_path): event_log = pandas.read_csv(csv_path) @@ -92,6 +106,12 @@ def main(config_file, action): generate_tree(csv_file, output_dir) elif action == 'generate_graph': generate_graph(csv_file, output_dir) + elif action == 'download': + cli_path = conf.get('process_mining', {}).get('ghevents_path') + download_data(config_file, cli_path) + elif action == 'parse': + cli_path = conf.get('process_mining', {}).get('kaiaulu_wd') + parse_data(config_file, cli_path) else: print(f"Unknown action choose: start_end, generate_tree, generate_graph.") diff --git a/pm.ipynb b/pm.ipynb new file mode 100644 index 0000000..91186e2 --- /dev/null +++ b/pm.ipynb @@ -0,0 +1,401 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "Process mining helps uncover insights from data that represent different events in a process. It is valuable for understanding workflows, finding inefficiencies, and optimizing development processes. Using Kaiaulu for process mining enables this discovery for Github Events (e.g. creating issues, push events, deleting branches, etc). Allowing users to visualize and analyze event data effectively. This notebook demonstrates how to use Kaiaulu to download and parse Github Event data. As well how to interact with the data to leverage process discovery for deeper analysis. This [video](https://www.youtube.com/watch?v=XLHtvt36g6U&t=1181s) provides an overview of process mining concepts and its applications and can be used as a reference point to begin. This notebook heavily relies on the python package [pm4py](https://github.com/process-intelligence-solutions/pm4py) to create event mappings." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Requirements\n", + "\n", + "- Gihub Access Token \n", + "- [Kaiaulu](https://github.com/sailuh/kaiaulu) R package to download data via CLI\n", + "- Python environment with [pm4py](https://github.com/process-intelligence-solutions/pm4py) installed\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Python Imports \n", + "\n", + "import argparse\n", + "import pandas\n", + "import os\n", + "from datetime import datetime\n", + "import pm4py\n", + "import subprocess\n", + "import yaml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Project Configuration File\n", + "\n", + "To streamline downloading and parsing data for Github Events we will specify a configuration file instead of entering parameters manually for both R and python environments. We can use the Kaiaulu.yml configuration file as a template. The configuration file content that interests us is the `issue_event` download path.\n", + "\n", + "```yaml\n", + "github:\n", + " project_key_1:\n", + " # Obtained from the project's GitHub URL\n", + " owner: sailuh\n", + " repo: kaiaulu\n", + " # Download using `download_github_comments.Rmd`\n", + " issue_or_pr_comment: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/issue_or_pr_comment/\n", + " issue: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/issue/\n", + " issue_search: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/issue_search/\n", + " issue_event: ../rawdata/kaiaulu/github/sailuh_kaiaulu/issue_event/\n", + " pull_request: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/pull_request/\n", + " commit: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/commit/\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Download and Parse data with Kaiaulu ghevents.R (CLI)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ℹ Downloading GitHub Project Issue Events using R/github.R\n", + "Latest date:1740475673\n", + "Oldest date:1733730684\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1733730684_1740475673.json\n", + "extracted dates for page 1\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1733730684_1740475673.json\n", + "Latest date:1733730684\n", + "Oldest date:1733658435\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1733658435_1733730684.json\n", + "extracted dates for page 2\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1733658435_1733730684.json\n", + "Latest date:1733658435\n", + "Oldest date:1731893713\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1731893713_1733658435.json\n", + "extracted dates for page 3\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1731893713_1733658435.json\n", + "Latest date:1731889586\n", + "Oldest date:1731360656\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1731360656_1731889586.json\n", + "extracted dates for page 4\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1731360656_1731889586.json\n", + "Latest date:1731360646\n", + "Oldest date:1730956035\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1730956035_1731360646.json\n", + "extracted dates for page 5\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1730956035_1731360646.json\n", + "Latest date:1730947764\n", + "Oldest date:1729679876\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1729679876_1730947764.json\n", + "extracted dates for page 6\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1729679876_1730947764.json\n", + "Latest date:1729679876\n", + "Oldest date:1728595549\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1728595549_1729679876.json\n", + "extracted dates for page 7\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1728595549_1729679876.json\n", + "Latest date:1728595111\n", + "Oldest date:1728257981\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1728257981_1728595111.json\n", + "extracted dates for page 8\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1728257981_1728595111.json\n", + "Latest date:1728250918\n", + "Oldest date:1726749691\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1726749691_1728250918.json\n", + "extracted dates for page 9\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1726749691_1728250918.json\n", + "Latest date:1726749691\n", + "Oldest date:1718236363\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1718236363_1726749691.json\n", + "extracted dates for page 10\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1718236363_1726749691.json\n", + "Latest date:1718236363\n", + "Oldest date:1713076556\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1713076556_1718236363.json\n", + "extracted dates for page 11\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1713076556_1718236363.json\n", + "Latest date:1713075921\n", + "Oldest date:1710329511\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1710329511_1713075921.json\n", + "extracted dates for page 12\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1710329511_1713075921.json\n", + "Latest date:1710329511\n", + "Oldest date:1708571010\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1708571010_1710329511.json\n", + "extracted dates for page 13\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1708571010_1710329511.json\n", + "Latest date:1708567489\n", + "Oldest date:1701809003\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1701809003_1708567489.json\n", + "extracted dates for page 14\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1701809003_1708567489.json\n", + "Latest date:1701786486\n", + "Oldest date:1699853761\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1699853761_1701786486.json\n", + "extracted dates for page 15\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1699853761_1701786486.json\n", + "Latest date:1699853020\n", + "Oldest date:1699002621\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1699002621_1699853020.json\n", + "extracted dates for page 16\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1699002621_1699853020.json\n", + "Latest date:1698840145\n", + "Oldest date:1693554777\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1693554777_1698840145.json\n", + "extracted dates for page 17\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1693554777_1698840145.json\n", + "Latest date:1693554776\n", + "Oldest date:1684045431\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1684045431_1693554776.json\n", + "extracted dates for page 18\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1684045431_1693554776.json\n", + "Latest date:1684045415\n", + "Oldest date:1682907675\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1682907675_1684045415.json\n", + "extracted dates for page 19\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1682907675_1684045415.json\n", + "Latest date:1682907662\n", + "Oldest date:1682818511\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1682818511_1682907662.json\n", + "extracted dates for page 20\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1682818511_1682907662.json\n", + "Latest date:1682818510\n", + "Oldest date:1682241242\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1682241242_1682818510.json\n", + "extracted dates for page 21\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1682241242_1682818510.json\n", + "Latest date:1682241242\n", + "Oldest date:1681788171\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1681788171_1682241242.json\n", + "extracted dates for page 22\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1681788171_1682241242.json\n", + "Latest date:1681788170\n", + "Oldest date:1681415890\n", + "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1681415890_1681788170.json\n", + "extracted dates for page 23\n", + "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1681415890_1681788170.json\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[11], line 8\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# To download use the download command specifing the \u001b[39;00m\n\u001b[1;32m 7\u001b[0m command \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRscript exec/ghevents.R download conf/process_mining.yml --token_path=~/.ssh/github_token\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 8\u001b[0m subprocess\u001b[38;5;241m.\u001b[39mrun(command, shell\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, check\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:550\u001b[0m, in \u001b[0;36mrun\u001b[0;34m(input, capture_output, timeout, check, *popenargs, **kwargs)\u001b[0m\n\u001b[1;32m 548\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Popen(\u001b[38;5;241m*\u001b[39mpopenargs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;28;01mas\u001b[39;00m process:\n\u001b[1;32m 549\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 550\u001b[0m stdout, stderr \u001b[38;5;241m=\u001b[39m process\u001b[38;5;241m.\u001b[39mcommunicate(\u001b[38;5;28minput\u001b[39m, timeout\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m TimeoutExpired \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 552\u001b[0m process\u001b[38;5;241m.\u001b[39mkill()\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:1201\u001b[0m, in \u001b[0;36mPopen.communicate\u001b[0;34m(self, input, timeout)\u001b[0m\n\u001b[1;32m 1199\u001b[0m stderr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mread()\n\u001b[1;32m 1200\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m-> 1201\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwait()\n\u001b[1;32m 1202\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1203\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:1264\u001b[0m, in \u001b[0;36mPopen.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1262\u001b[0m endtime \u001b[38;5;241m=\u001b[39m _time() \u001b[38;5;241m+\u001b[39m timeout\n\u001b[1;32m 1263\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1264\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wait(timeout\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[1;32m 1265\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[1;32m 1266\u001b[0m \u001b[38;5;66;03m# https://bugs.python.org/issue25942\u001b[39;00m\n\u001b[1;32m 1267\u001b[0m \u001b[38;5;66;03m# The first keyboard interrupt waits briefly for the child to\u001b[39;00m\n\u001b[1;32m 1268\u001b[0m \u001b[38;5;66;03m# exit under the common assumption that it also received the ^C\u001b[39;00m\n\u001b[1;32m 1269\u001b[0m \u001b[38;5;66;03m# generated SIGINT and will exit rapidly.\u001b[39;00m\n\u001b[1;32m 1270\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:2053\u001b[0m, in \u001b[0;36mPopen._wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 2051\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 2052\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m \u001b[38;5;66;03m# Another thread waited.\u001b[39;00m\n\u001b[0;32m-> 2053\u001b[0m (pid, sts) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_try_wait(\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m 2054\u001b[0m \u001b[38;5;66;03m# Check the pid and loop as waitpid has been known to\u001b[39;00m\n\u001b[1;32m 2055\u001b[0m \u001b[38;5;66;03m# return 0 even without WNOHANG in odd situations.\u001b[39;00m\n\u001b[1;32m 2056\u001b[0m \u001b[38;5;66;03m# http://bugs.python.org/issue14396.\u001b[39;00m\n\u001b[1;32m 2057\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pid \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpid:\n", + "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:2011\u001b[0m, in \u001b[0;36mPopen._try_wait\u001b[0;34m(self, wait_flags)\u001b[0m\n\u001b[1;32m 2009\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"All callers to this function MUST hold self._waitpid_lock.\"\"\"\u001b[39;00m\n\u001b[1;32m 2010\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 2011\u001b[0m (pid, sts) \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mwaitpid(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpid, wait_flags)\n\u001b[1;32m 2012\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mChildProcessError\u001b[39;00m:\n\u001b[1;32m 2013\u001b[0m \u001b[38;5;66;03m# This happens if SIGCLD is set to be ignored or waiting\u001b[39;00m\n\u001b[1;32m 2014\u001b[0m \u001b[38;5;66;03m# for child processes has otherwise been disabled for our\u001b[39;00m\n\u001b[1;32m 2015\u001b[0m \u001b[38;5;66;03m# process. This child is dead, we can't get the status.\u001b[39;00m\n\u001b[1;32m 2016\u001b[0m pid \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpid\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# Save and set the current working directory to Kaiaulu\n", + "cwd = os.getcwd()\n", + "os.chdir(os.path.expanduser(\"~/Desktop/Kaiaulu/Working_issues/kaiaulu/\"))\n", + "\n", + "# To download use the download command specifing the \n", + "\n", + "command = f\"Rscript exec/ghevents.R download conf/process_mining.yml --token_path=~/.ssh/github_token\"\n", + "subprocess.run(command, shell=True, check=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ℹ Parsing Github issue events from ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/\n", + "ℹ Parsed data saved to ../rawdata/output.csv\n" + ] + }, + { + "data": { + "text/plain": [ + "CompletedProcess(args='Rscript exec/ghevents.R parse conf/kaiaulu.yml ../rawdata/output.csv', returncode=0)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# To Parse use the parse command and specify the \n", + "\n", + "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml ../rawdata/output.csv\"\n", + "subprocess.run(command, shell=True, check=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get Start and End Activies From Event Logs" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "({'renamed': 84, 'referenced': 778, 'closed': 244, 'labeled': 385, 'assigned': 391, 'mentioned': 634, 'subscribed': 630, 'merged': 38, 'unassigned': 56, 'head_ref_force_pushed': 25, 'review_requested': 39, 'convert_to_draft': 1, 'unsubscribed': 2, 'head_ref_deleted': 8, 'locked': 1, 'converted_to_discussion': 1, 'review_request_removed': 3, 'connected': 22, 'added_to_project_v2': 43, 'ready_for_review': 1, 'project_v2_item_status_changed': 67, 'milestoned': 96, 'demilestoned': 6, 'sub_issue_added': 1, 'parent_issue_added': 1, 'sub_issue_removed': 1, 'parent_issue_removed': 1, 'reopened': 5, 'unlabeled': 9, 'pinned': 3}, {'renamed': 84, 'referenced': 778, 'closed': 244, 'labeled': 385, 'assigned': 391, 'mentioned': 634, 'subscribed': 630, 'merged': 38, 'unassigned': 56, 'head_ref_force_pushed': 25, 'review_requested': 39, 'convert_to_draft': 1, 'unsubscribed': 2, 'head_ref_deleted': 8, 'locked': 1, 'converted_to_discussion': 1, 'review_request_removed': 3, 'connected': 22, 'added_to_project_v2': 43, 'ready_for_review': 1, 'project_v2_item_status_changed': 67, 'milestoned': 96, 'demilestoned': 6, 'sub_issue_added': 1, 'parent_issue_added': 1, 'sub_issue_removed': 1, 'parent_issue_removed': 1, 'reopened': 5, 'unlabeled': 9, 'pinned': 3})\n" + ] + } + ], + "source": [ + "# Specify the csv file path \n", + "csv_path = \"../rawdata/output.csv\"\n", + "\n", + "def start_end_activities(csv_path): \n", + " event_log = pandas.read_csv(csv_path)\n", + " event_log = pm4py.format_dataframe(event_log, case_id='id', activity_key='event', timestamp_key='created_at')\n", + " start_activities = pm4py.get_start_activities(event_log)\n", + " end_activities = pm4py.get_end_activities(event_log)\n", + " return start_activities, end_activities\n", + "\n", + "print(start_end_activities(csv_path))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Tree from Event Logs" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tree generated and saved\n" + ] + } + ], + "source": [ + "# Specify a output_dir where the images will be sent, if it doesnt exist it will be created\n", + "output_dir = \"../rawdata/images/\"\n", + "\n", + "def generate_tree(csv_path, output_dir):\n", + " event_log = pandas.read_csv(csv_path)\n", + " event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at')\n", + "\n", + " # Create if folder doesn't exist\n", + " output_dir = os.path.expanduser(output_dir)\n", + " os.makedirs(output_dir, exist_ok=True)\n", + "\n", + " # Set up path and name of .png\n", + " output_dir = os.path.expanduser(output_dir)\n", + " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + " file_name = f\"process_tree_{timestamp}.png\"\n", + " output_path = os.path.join(output_dir, file_name)\n", + "\n", + " process_tree = pm4py.discover_process_tree_inductive(event_log)\n", + " pm4py.save_vis_process_tree(process_tree, output_path)\n", + " print(\"Tree generated and saved\")\n", + "\n", + "generate_tree(csv_path, output_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Graph from Event Logs" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Graph generated and saved\n" + ] + } + ], + "source": [ + "# Pass the same arguments as trees\n", + "\n", + "def generate_graph(csv_path, output_dir):\n", + " event_log = pandas.read_csv(csv_path)\n", + " event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at')\n", + " \n", + " # Create if folder doesn't exist\n", + " output_dir = os.path.expanduser(output_dir)\n", + " os.makedirs(output_dir, exist_ok=True)\n", + "\n", + " # Set up path and name of .png\n", + " output_dir = os.path.expanduser(output_dir)\n", + " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + " file_name = f\"process_graph_{timestamp}.png\"\n", + " output_path = os.path.join(output_dir, file_name)\n", + "\n", + " process_tree = pm4py.discover_process_tree_inductive(event_log)\n", + " bpmn_model = pm4py.convert_to_bpmn(process_tree)\n", + " pm4py.save_vis_bpmn(bpmn_model, output_path, format=\"png\")\n", + " print(\"Graph generated and saved\")\n", + "\n", + "generate_graph(csv_path, output_dir)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 522b906e150416d3ddd961acf664b9911b2ba005 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Sun, 9 Mar 2025 09:12:24 -1000 Subject: [PATCH 05/13] i #1 Deleted script and changed notebook name - Deleted .py script to have notebook replace - Changed name of notebook --- event_processing.py | 125 ----------------------- pm.ipynb => issue_event_processing.ipynb | 0 2 files changed, 125 deletions(-) delete mode 100644 event_processing.py rename pm.ipynb => issue_event_processing.ipynb (100%) diff --git a/event_processing.py b/event_processing.py deleted file mode 100644 index 28a9ba8..0000000 --- a/event_processing.py +++ /dev/null @@ -1,125 +0,0 @@ -# ============================================================================= -# Title: Event Processing -# Author: Sailuh -# Description: -# This Python script utilizes the pm4py library for process mining tasks. -# -# Requirements: -# - Python 3.x -# -# Usage: -# - Ensure the script is run in a Python environment -# - If pm4py is not installed, the script will install it -# -# License: MIT License -# ============================================================================= - -# Install pm4py if not already done -try: - import pm4py - print("pm4py already installed") -except ImportError: - import subprocess - subprocess.check_call(["python", "-m", "pip", "install", "pm4py"]) - import pm4py - print("pm4py installed!") - -import argparse -import pandas -import os -from datetime import datetime -import pm4py -import subprocess -import yaml - - -# Download data from CLI -def download_data(config_path, cli_path): - command = f"Rscript {cli_path} download {config_path} --token_path=~/.ssh/github_token" - subprocess.run(command, shell=True, check=True) - print("Event data downloaded successfully.") - -# Parse data from CLI -def parse_data(config_path, cli_path): - command = f"Rscript exec/ghevents.R parse conf/process_mining.yml" - target_directory = os.path.expanduser(cli_path) - subprocess.run(command, shell=True, check=True, cwd=target_directory) - print("Event data parsed successfully.") - -# Return start & end activities -def start_end_activities(csv_path): - event_log = pandas.read_csv(csv_path) - event_log = pm4py.format_dataframe(event_log, case_id='id', activity_key='event', timestamp_key='created_at') - start_activities = pm4py.get_start_activities(event_log) - end_activities = pm4py.get_end_activities(event_log) - return start_activities, end_activities - -# Generate tree at output_dir directory from csv_path file -def generate_tree(csv_path, output_dir): - event_log = pandas.read_csv(csv_path) - event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at') - - # Set up path and name of .png - output_dir = os.path.expanduser(output_dir) - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - file_name = f"process_tree_{timestamp}.png" - output_path = os.path.join(output_dir, file_name) - - process_tree = pm4py.discover_process_tree_inductive(event_log) - pm4py.save_vis_process_tree(process_tree, output_path) - print("Tree generated and saved") - -# Generate graph at output_dir directory from csv_path file -def generate_graph(csv_path, output_dir): - event_log = pandas.read_csv(csv_path) - event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at') - - # Set up path and name of .png - output_dir = os.path.expanduser(output_dir) - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - file_name = f"process_tree_{timestamp}.png" - output_path = os.path.join(output_dir, file_name) - - process_tree = pm4py.discover_process_tree_inductive(event_log) - bpmn_model = pm4py.convert_to_bpmn(process_tree) - pm4py.save_vis_bpmn(bpmn_model, output_path, format="png") - print("Graph generated and saved") - -# Load config file from given path -def load_config(config_path): - with open(config_path, 'r') as file: - config = yaml.safe_load(file) - return config - -def main(config_file, action): - # Load config file - conf = load_config(config_file) - csv_file = conf.get('process_mining', {}).get('csv_file_path') - output_dir = conf.get('process_mining', {}).get('image_output_dir') - - # If-else for action choosen - if action == 'start_end': - start_activities, end_activities = start_end_activities(csv_file) - print("Start Activities:", start_activities) - print("End Activities:", end_activities) - elif action == 'generate_tree': - generate_tree(csv_file, output_dir) - elif action == 'generate_graph': - generate_graph(csv_file, output_dir) - elif action == 'download': - cli_path = conf.get('process_mining', {}).get('ghevents_path') - download_data(config_file, cli_path) - elif action == 'parse': - cli_path = conf.get('process_mining', {}).get('kaiaulu_wd') - parse_data(config_file, cli_path) - else: - print(f"Unknown action choose: start_end, generate_tree, generate_graph.") - -if __name__ == "__main__": - # Parse arguments - parser = argparse.ArgumentParser(description="Process mining script with pm4py") - parser.add_argument('config_file', help='Path to the configuration file (.yml)') - parser.add_argument('action', help='Action to perform (start_end, generate_tree, generate_graph)') - args = parser.parse_args() - # Call main - main(args.config_file, args.action) \ No newline at end of file diff --git a/pm.ipynb b/issue_event_processing.ipynb similarity index 100% rename from pm.ipynb rename to issue_event_processing.ipynb From 6405531b16dd07e2b51c23955a38368ca17a4721 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Tue, 1 Apr 2025 11:58:29 -1000 Subject: [PATCH 06/13] i #1 added examples section and more models The following was added: - Example section at bottom of notebook - Petri Net model - Performance Models - BPMN filtered model - Cleaned up wording - Images folder Signed-off-by: Connor Narowetz --- images/occurrence_dfg.png | Bin 0 -> 37495 bytes images/performance_dfg.png | Bin 0 -> 39761 bytes images/petri_net.png | Bin 0 -> 37916 bytes images/process_graph.png | Bin 0 -> 25428 bytes images/process_tree.png | Bin 0 -> 50956 bytes images/starting_data.png | Bin 0 -> 63006 bytes issue_event_processing.html | 7968 ++++++++++++++++++++++++++++++++++ issue_event_processing.ipynb | 501 ++- 8 files changed, 8247 insertions(+), 222 deletions(-) create mode 100644 images/occurrence_dfg.png create mode 100644 images/performance_dfg.png create mode 100644 images/petri_net.png create mode 100644 images/process_graph.png create mode 100644 images/process_tree.png create mode 100644 images/starting_data.png create mode 100644 issue_event_processing.html diff --git a/images/occurrence_dfg.png b/images/occurrence_dfg.png new file mode 100644 index 0000000000000000000000000000000000000000..e9465f5cb6511984822cdbdc49133b2fe18aaa9b GIT binary patch literal 37495 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

vO zu`u=%*I(IAEZH(Qa;o#^SL|N7az`|6v)Fbf`%7LI&)6)8f`6}Gx#P>^> zBfHRV=*1|ceR-}lo}{(x-SSeNzYwiUKApKrg6SvkWP-y4_DHomg8))q8zA^IqJbAL za6JzD5uh;fix+{6jX=`E8kV3+a-i&dK`5mwz%OV2{ywI^I+`Fhgn*_Wh6S^Zd6FeQ zwP+Typ#mOBR5$F#%|Y8U9LUyYY@cjrwi!hl)#?wj3*Wz`{J6~-s@UpjLHrXjnobER z_Q(j_9LKWbL4SA&tI^q=`D9S6W)7DGly0Cp#&QJCQZkXmjTh88pu?kkCf)MAD5kn~S)F!mH^Ngtv1t9EX_rM~S>0Y$TRK;vbK5D2yR&g|f-5b=Jx99=2~+6kk4`D=h)$V}C2e%1FF zto8*W7-E?I6)=>WGJDpnm0v8=I6FRo_ZLb1U+LM7Dcn$fx9)AFyrGv0+yL|$1fl$c zsA1O37ueqFtQhK5S8vG;Xcl8ru&w?2_a|&rv+fvDRvtI18+J(~Rq9Aa=}7L9dHZ$j zdy_zf{qQtANRg{CoV+_`6M{YTQJXlY8E}NddZ{WMRZ`jHd^b*+tpg~1)vYUOLMG-; zxmQv{GH09$6NOybBYKIjls#v*Y`F{aju96*yTA1jPx!`nn{3KTu=w=@duLc1>R}?{7$YMeGOqK01_J;Z{ENtg;&?H9zbHH0P2LdCw|3NKT&5N( zh(U+M@&!a31(~>i4!r<1Av3@zdI-w>Ol`hF@;Py`)kkmKOxODO*rm2mM?%(N)`3@5 zDL3l&!gi#kZX*7=?qNGI(-@6J5BQJPZ-1{(i{M^3iyrgo-|@9%1I(}Bs7)X4KTJ6n zA;^!+W2}3DD;7o)y0GcPvzcNk@tY7tkt?yK2TY^KHeX*IHLrnVUB#9L1pwz~*@lv| zqMkF5E4kWJGE+_icC!V`d`t?w?8c*agpg*n5I8$shmJaAX?$bgbOQ+rNGNyVcVUBmmDm4u5cM(J!xMO31gh!yMaC)j2^^z zVArXdAygNwWS4i11oXe+i3z@Kz*H8tenmjivyAZULQZ5OI;*rXd@%sZEpjx)j@&ZFcu%`%!nW& zbDl0k2cVR?rZ%f-s=D;IMyyJ4-ltDXz_-!tbC`cJHNbh_vEX!aU^^I-BBh?y(F38Qflq~#-WFEgJh1=h-o3Zo4fi1`OJB%B?_Ln;Nf0u&D5X>wx)5|SPu zyU5Mgu8rE6=?(c}x_$43#mW1po?3dtXGet&Db!x%-N|n&E8ztiAEyqAy3BK3XlJ)H z**oO_{=k+YfURJ}=$tEbtd_&66EIP-?1es&l*M`ttY#@wd~LYBrHymzPJ;-4Y((zy zm0&K_Qp5+>vVW>pVX==43p3GT?ITwMAW zu$o0p73hh;cFwuEP*_)j_d0+uG7QwGPms9IKoW<=bxuz}<3jabU^!Wb%***;sCOaG zC6W4c7K8Y)#QK^lu4K4@35zTn7M{2RTh4;pLV)AzQ=xORhmk9X!dP+yyZGoECSrNs z4%@dcO18DmiqY?Tb`hZX48?t@LBop^&VT5bY`@U+oZgflLVhubMk5Ba&YXikgn+?pZ zKIQTkV?9o6_djceWBK__ zv*cA37+i%y8_NISxXF#t6F}qnQ7cV~$#9W@E!Kl_Z&|1WO@`rK@=Ce9?uQ==42&^1 zFjmjm44MJayxXM+RVr#|i}hPJjC#wKXR8cp^wjRz69)Lri+y#n!KyK`n{P(6rq?!J zh7~JoE&1b1w9zf7joc4UvY0*l%B@>VmF4B6^ii_4a*Sn&!(m&;D6reAChOdf-o&E6 zCvMQ_^7WCPRF_u!&yc?7e{?LV+hwxIsMj;Y5myp!>&EPMRaKcYyw_wC3&)jRPb(2Q zLwhfr)oF=Or}4fzG3_#D$LK^}dDJsvinZC{qc%t9|2bhmuEWZ!28E3+5x&c_A8owf z;2;0;OVz@qS!TDc7AbD(Lg#T(x8SFv0L*sG1CZFSQ&VZ*)+&E z|HGvRsw8v2!erLC(%6bM7?0CWBm<|K)J8ykwz6wLf`) zp&^IL5ySp23hr+!kK(SP$u79I)|c50NWNoQcB4QkWMF^pvl7&YqW;X|C6w}#@v_rW)Fdfbhv zMMZNYsSBe1z>^5=5Ch?HUoplNrvNHD^9`2)rm0&h!zc9*V~!6yhlOYI3;a|i2P-1v z-UAb3ywg#trZY4!=GnCPd0xHH|xX`uNcoQrf>(DNptRLBx zFK$M!(~9sIVSO6T=1-MAopxrW{c>9|uOK-I+_+0Td z8+k1;k@9jUpRqUl6|1B72k&~SGa8k_YCFpY`~D=;L8DQun{WuHiZ4rJ7epj*4mdXw z-tCW_>`_^88hhe`!MLmXs7dMO;*EwbUUJ8tH zWL!_-;iE@4X%azd9UP*{1}6z6C~j%Qnol1-Z09@GX|Tr>G_|yrUUDGQty{kQ6a_?? zaZ(Mjh5B27TEv!fbN{5PtJ6qHkaS)Fdh+eTLl6;g-8ntSZn{o3~qXl5bN=$?2B|d#sg^mo` zBI3ugqns918<&!$|!nk8V|Bp{r5b z_P{X;V9pE4|R2fQD({7#+;=MVF`X>XSZr(#2=eBfej#e zMa1GB(Noe<6W4tc#TxM#{zVwJ)Yc9<_<&xJr%Tol2i|YlqId8?RU8L7BrG68oFb#0 zJ4ZT!@~{8(>&uS@gm`>xh*j^8sRFj*E*3u^hKEk%#I)t0=5R3d6Ttn1%h~6?qtB?W zhD4=_q%7oxkth%Y^LWuSA4Qtlo|?Tf(T*?CqsPF8v655^wi8(V0_hn(sMNoRF+nK~ z?`h`uSx112_Jb@fEG*bK+#|8qZ<6t5QpHJu<|^DI{!f4m$&#w?M+@*%3ivBcuIQCs UsYTY5E8_1{CfJORw{i&jU%Sy-1poj5 literal 0 HcmV?d00001 diff --git a/images/petri_net.png b/images/petri_net.png new file mode 100644 index 0000000000000000000000000000000000000000..3271b11b6f55dcb3d809d5c91cbc39a20de148a1 GIT binary patch literal 37916 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 literal 0 HcmV?d00001 diff --git a/images/process_tree.png b/images/process_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..eea983ecdda5b7ecf7b88c019a6f765ffaba7967 GIT binary patch literal 50956 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 z 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%0Drzx+H_mo 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 literal 0 HcmV?d00001 diff --git a/images/starting_data.png b/images/starting_data.png new file mode 100644 index 0000000000000000000000000000000000000000..b2bf1b12b7901fa7a975dc85f47888e01f12f471 GIT binary patch literal 63006 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 literal 0 HcmV?d00001 diff --git a/issue_event_processing.html b/issue_event_processing.html new file mode 100644 index 0000000..ea12256 --- /dev/null +++ b/issue_event_processing.html @@ -0,0 +1,7968 @@ + + + + + +issue_event_processing + + + + + + + + + + + + +

+ + + + + + + + + +
+ + diff --git a/issue_event_processing.ipynb b/issue_event_processing.ipynb index 91186e2..35596c8 100644 --- a/issue_event_processing.ipynb +++ b/issue_event_processing.ipynb @@ -5,7 +5,9 @@ "metadata": {}, "source": [ "# Introduction\n", - "Process mining helps uncover insights from data that represent different events in a process. It is valuable for understanding workflows, finding inefficiencies, and optimizing development processes. Using Kaiaulu for process mining enables this discovery for Github Events (e.g. creating issues, push events, deleting branches, etc). Allowing users to visualize and analyze event data effectively. This notebook demonstrates how to use Kaiaulu to download and parse Github Event data. As well how to interact with the data to leverage process discovery for deeper analysis. This [video](https://www.youtube.com/watch?v=XLHtvt36g6U&t=1181s) provides an overview of process mining concepts and its applications and can be used as a reference point to begin. This notebook heavily relies on the python package [pm4py](https://github.com/process-intelligence-solutions/pm4py) to create event mappings." + "Process mining helps uncover insights from data that represent different events in a process. It is valuable for understanding workflows, finding inefficiencies, and optimizing development processes. Using Kaiaulu for process mining enables this discovery for Github Events (e.g. creating issues, push events, deleting branches, etc). Allowing users to visualize and analyze event data effectively. This notebook demonstrates how to use Kaiaulu to download and parse Github Event data. As well how to interact with the data to leverage process discovery for deeper analysis. This [video](https://www.youtube.com/watch?v=XLHtvt36g6U&t=1181s) provides an overview of process mining concepts and its applications and can be used as a reference point to begin. This notebook heavily relies on the python package [pm4py](https://github.com/process-intelligence-solutions/pm4py) to create event mappings.\n", + "\n", + "This notebook walks through multiple different models and algorithms for modeling the process. It is reccomended you start with a small number of event issues and gradually build multiple versions to have a deeper understanding of what events are changed the process model. At the bottom of the notebook is an examples section that shows what the models can generate. " ] }, { @@ -19,197 +21,43 @@ "- Python environment with [pm4py](https://github.com/process-intelligence-solutions/pm4py) installed\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Python Imports" + ] + }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 137, "metadata": {}, "outputs": [], "source": [ - "# Python Imports \n", - "\n", - "import argparse\n", "import pandas\n", "import os\n", "from datetime import datetime\n", "import pm4py\n", "import subprocess\n", - "import yaml" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Project Configuration File\n", - "\n", - "To streamline downloading and parsing data for Github Events we will specify a configuration file instead of entering parameters manually for both R and python environments. We can use the Kaiaulu.yml configuration file as a template. The configuration file content that interests us is the `issue_event` download path.\n", - "\n", - "```yaml\n", - "github:\n", - " project_key_1:\n", - " # Obtained from the project's GitHub URL\n", - " owner: sailuh\n", - " repo: kaiaulu\n", - " # Download using `download_github_comments.Rmd`\n", - " issue_or_pr_comment: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/issue_or_pr_comment/\n", - " issue: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/issue/\n", - " issue_search: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/issue_search/\n", - " issue_event: ../rawdata/kaiaulu/github/sailuh_kaiaulu/issue_event/\n", - " pull_request: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/pull_request/\n", - " commit: ../../rawdata/kaiaulu/github/sailuh_kaiaulu/commit/\n" + "\n", + "from pm4py.algo.discovery.dfg import algorithm as dfg_discovery\n", + "from pm4py.algo.discovery.heuristics import algorithm as heuristics_miner" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Download and Parse data with Kaiaulu ghevents.R (CLI)\n" + "### Download and Parse data with Kaiaulu ghevents.R (CLI)\n", + "\n", + "#### Set Up and Execute Download Command\n" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "ℹ Downloading GitHub Project Issue Events using R/github.R\n", - "Latest date:1740475673\n", - "Oldest date:1733730684\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1733730684_1740475673.json\n", - "extracted dates for page 1\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1733730684_1740475673.json\n", - "Latest date:1733730684\n", - "Oldest date:1733658435\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1733658435_1733730684.json\n", - "extracted dates for page 2\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1733658435_1733730684.json\n", - "Latest date:1733658435\n", - "Oldest date:1731893713\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1731893713_1733658435.json\n", - "extracted dates for page 3\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1731893713_1733658435.json\n", - "Latest date:1731889586\n", - "Oldest date:1731360656\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1731360656_1731889586.json\n", - "extracted dates for page 4\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1731360656_1731889586.json\n", - "Latest date:1731360646\n", - "Oldest date:1730956035\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1730956035_1731360646.json\n", - "extracted dates for page 5\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1730956035_1731360646.json\n", - "Latest date:1730947764\n", - "Oldest date:1729679876\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1729679876_1730947764.json\n", - "extracted dates for page 6\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1729679876_1730947764.json\n", - "Latest date:1729679876\n", - "Oldest date:1728595549\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1728595549_1729679876.json\n", - "extracted dates for page 7\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1728595549_1729679876.json\n", - "Latest date:1728595111\n", - "Oldest date:1728257981\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1728257981_1728595111.json\n", - "extracted dates for page 8\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1728257981_1728595111.json\n", - "Latest date:1728250918\n", - "Oldest date:1726749691\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1726749691_1728250918.json\n", - "extracted dates for page 9\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1726749691_1728250918.json\n", - "Latest date:1726749691\n", - "Oldest date:1718236363\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1718236363_1726749691.json\n", - "extracted dates for page 10\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1718236363_1726749691.json\n", - "Latest date:1718236363\n", - "Oldest date:1713076556\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1713076556_1718236363.json\n", - "extracted dates for page 11\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1713076556_1718236363.json\n", - "Latest date:1713075921\n", - "Oldest date:1710329511\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1710329511_1713075921.json\n", - "extracted dates for page 12\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1710329511_1713075921.json\n", - "Latest date:1710329511\n", - "Oldest date:1708571010\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1708571010_1710329511.json\n", - "extracted dates for page 13\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1708571010_1710329511.json\n", - "Latest date:1708567489\n", - "Oldest date:1701809003\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1701809003_1708567489.json\n", - "extracted dates for page 14\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1701809003_1708567489.json\n", - "Latest date:1701786486\n", - "Oldest date:1699853761\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1699853761_1701786486.json\n", - "extracted dates for page 15\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1699853761_1701786486.json\n", - "Latest date:1699853020\n", - "Oldest date:1699002621\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1699002621_1699853020.json\n", - "extracted dates for page 16\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1699002621_1699853020.json\n", - "Latest date:1698840145\n", - "Oldest date:1693554777\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1693554777_1698840145.json\n", - "extracted dates for page 17\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1693554777_1698840145.json\n", - "Latest date:1693554776\n", - "Oldest date:1684045431\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1684045431_1693554776.json\n", - "extracted dates for page 18\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1684045431_1693554776.json\n", - "Latest date:1684045415\n", - "Oldest date:1682907675\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1682907675_1684045415.json\n", - "extracted dates for page 19\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1682907675_1684045415.json\n", - "Latest date:1682907662\n", - "Oldest date:1682818511\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1682818511_1682907662.json\n", - "extracted dates for page 20\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1682818511_1682907662.json\n", - "Latest date:1682818510\n", - "Oldest date:1682241242\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1682241242_1682818510.json\n", - "extracted dates for page 21\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1682241242_1682818510.json\n", - "Latest date:1682241242\n", - "Oldest date:1681788171\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1681788171_1682241242.json\n", - "extracted dates for page 22\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1681788171_1682241242.json\n", - "Latest date:1681788170\n", - "Oldest date:1681415890\n", - "File name: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/_1681415890_1681788170.json\n", - "extracted dates for page 23\n", - "Written to file: ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/sailuh_kaiaulu_1681415890_1681788170.json\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[11], line 8\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# To download use the download command specifing the \u001b[39;00m\n\u001b[1;32m 7\u001b[0m command \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRscript exec/ghevents.R download conf/process_mining.yml --token_path=~/.ssh/github_token\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m----> 8\u001b[0m subprocess\u001b[38;5;241m.\u001b[39mrun(command, shell\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, check\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", - "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:550\u001b[0m, in \u001b[0;36mrun\u001b[0;34m(input, capture_output, timeout, check, *popenargs, **kwargs)\u001b[0m\n\u001b[1;32m 548\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Popen(\u001b[38;5;241m*\u001b[39mpopenargs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;28;01mas\u001b[39;00m process:\n\u001b[1;32m 549\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 550\u001b[0m stdout, stderr \u001b[38;5;241m=\u001b[39m process\u001b[38;5;241m.\u001b[39mcommunicate(\u001b[38;5;28minput\u001b[39m, timeout\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m TimeoutExpired \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 552\u001b[0m process\u001b[38;5;241m.\u001b[39mkill()\n", - "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:1201\u001b[0m, in \u001b[0;36mPopen.communicate\u001b[0;34m(self, input, timeout)\u001b[0m\n\u001b[1;32m 1199\u001b[0m stderr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mread()\n\u001b[1;32m 1200\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mclose()\n\u001b[0;32m-> 1201\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwait()\n\u001b[1;32m 1202\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1203\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:1264\u001b[0m, in \u001b[0;36mPopen.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1262\u001b[0m endtime \u001b[38;5;241m=\u001b[39m _time() \u001b[38;5;241m+\u001b[39m timeout\n\u001b[1;32m 1263\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1264\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wait(timeout\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[1;32m 1265\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[1;32m 1266\u001b[0m \u001b[38;5;66;03m# https://bugs.python.org/issue25942\u001b[39;00m\n\u001b[1;32m 1267\u001b[0m \u001b[38;5;66;03m# The first keyboard interrupt waits briefly for the child to\u001b[39;00m\n\u001b[1;32m 1268\u001b[0m \u001b[38;5;66;03m# exit under the common assumption that it also received the ^C\u001b[39;00m\n\u001b[1;32m 1269\u001b[0m \u001b[38;5;66;03m# generated SIGINT and will exit rapidly.\u001b[39;00m\n\u001b[1;32m 1270\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:2053\u001b[0m, in \u001b[0;36mPopen._wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 2051\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturncode \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 2052\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m \u001b[38;5;66;03m# Another thread waited.\u001b[39;00m\n\u001b[0;32m-> 2053\u001b[0m (pid, sts) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_try_wait(\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m 2054\u001b[0m \u001b[38;5;66;03m# Check the pid and loop as waitpid has been known to\u001b[39;00m\n\u001b[1;32m 2055\u001b[0m \u001b[38;5;66;03m# return 0 even without WNOHANG in odd situations.\u001b[39;00m\n\u001b[1;32m 2056\u001b[0m \u001b[38;5;66;03m# http://bugs.python.org/issue14396.\u001b[39;00m\n\u001b[1;32m 2057\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pid \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpid:\n", - "File \u001b[0;32m/opt/anaconda3/lib/python3.12/subprocess.py:2011\u001b[0m, in \u001b[0;36mPopen._try_wait\u001b[0;34m(self, wait_flags)\u001b[0m\n\u001b[1;32m 2009\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"All callers to this function MUST hold self._waitpid_lock.\"\"\"\u001b[39;00m\n\u001b[1;32m 2010\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 2011\u001b[0m (pid, sts) \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mwaitpid(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpid, wait_flags)\n\u001b[1;32m 2012\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mChildProcessError\u001b[39;00m:\n\u001b[1;32m 2013\u001b[0m \u001b[38;5;66;03m# This happens if SIGCLD is set to be ignored or waiting\u001b[39;00m\n\u001b[1;32m 2014\u001b[0m \u001b[38;5;66;03m# for child processes has otherwise been disabled for our\u001b[39;00m\n\u001b[1;32m 2015\u001b[0m \u001b[38;5;66;03m# process. This child is dead, we can't get the status.\u001b[39;00m\n\u001b[1;32m 2016\u001b[0m pid \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpid\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], + "outputs": [], "source": [ "# Save and set the current working directory to Kaiaulu\n", "cwd = os.getcwd()\n", @@ -217,38 +65,30 @@ "\n", "# To download use the download command specifing the \n", "\n", - "command = f\"Rscript exec/ghevents.R download conf/process_mining.yml --token_path=~/.ssh/github_token\"\n", + "command = f\"Rscript exec/ghevents.R download conf/kaiaulu.yml --token_path=~/.ssh/github_token\"\n", "subprocess.run(command, shell=True, check=True)\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Execute Parse Command\n", + "\n", + "As stated above it is reccomended you start with only a few event issues. To do this you can open the created issue_output.csv with Excel or Google Sheets and modify the table to only include a few. \n", + "\n", + "Note: commit_output.csv has been implemented for furture development and is note currently used for any process modeling. " + ] + }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "ℹ Parsing Github issue events from ../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/\n", - "ℹ Parsed data saved to ../rawdata/output.csv\n" - ] - }, - { - "data": { - "text/plain": [ - "CompletedProcess(args='Rscript exec/ghevents.R parse conf/kaiaulu.yml ../rawdata/output.csv', returncode=0)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# To Parse use the parse command and specify the \n", "\n", - "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml ../rawdata/output.csv\"\n", + "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml ../rawdata/issue_output.csv ../rawdata/commit_output.csv\"\n", "subprocess.run(command, shell=True, check=True)" ] }, @@ -256,25 +96,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Get Start and End Activies From Event Logs" + "### Get Start and End Activies From Event Logs\n", + "\n", + "The start and end activies are the first and last recorded events in the process workflow. Marking the entry and exit points where no prior or further events occur. These activies are useful for reasoning through process grpahs and finding inefficencies in a non-graphical manner." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "({'renamed': 84, 'referenced': 778, 'closed': 244, 'labeled': 385, 'assigned': 391, 'mentioned': 634, 'subscribed': 630, 'merged': 38, 'unassigned': 56, 'head_ref_force_pushed': 25, 'review_requested': 39, 'convert_to_draft': 1, 'unsubscribed': 2, 'head_ref_deleted': 8, 'locked': 1, 'converted_to_discussion': 1, 'review_request_removed': 3, 'connected': 22, 'added_to_project_v2': 43, 'ready_for_review': 1, 'project_v2_item_status_changed': 67, 'milestoned': 96, 'demilestoned': 6, 'sub_issue_added': 1, 'parent_issue_added': 1, 'sub_issue_removed': 1, 'parent_issue_removed': 1, 'reopened': 5, 'unlabeled': 9, 'pinned': 3}, {'renamed': 84, 'referenced': 778, 'closed': 244, 'labeled': 385, 'assigned': 391, 'mentioned': 634, 'subscribed': 630, 'merged': 38, 'unassigned': 56, 'head_ref_force_pushed': 25, 'review_requested': 39, 'convert_to_draft': 1, 'unsubscribed': 2, 'head_ref_deleted': 8, 'locked': 1, 'converted_to_discussion': 1, 'review_request_removed': 3, 'connected': 22, 'added_to_project_v2': 43, 'ready_for_review': 1, 'project_v2_item_status_changed': 67, 'milestoned': 96, 'demilestoned': 6, 'sub_issue_added': 1, 'parent_issue_added': 1, 'sub_issue_removed': 1, 'parent_issue_removed': 1, 'reopened': 5, 'unlabeled': 9, 'pinned': 3})\n" + "({'renamed': 2, 'assigned': 1, 'milestoned': 1, 'referenced': 2, 'labeled': 2, 'closed': 1}, {'renamed': 2, 'assigned': 1, 'milestoned': 1, 'referenced': 2, 'labeled': 2, 'closed': 1})\n" ] } ], "source": [ "# Specify the csv file path \n", - "csv_path = \"../rawdata/output.csv\"\n", + "csv_path = \"../rawdata/issue_output.csv\"\n", "\n", "def start_end_activities(csv_path): \n", " event_log = pandas.read_csv(csv_path)\n", @@ -290,22 +132,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Generate Tree from Event Logs" + "### Generate Tree from Event Logs\n", + "\n", + "The process tree generated from event logs is our first visual we will generate. It uses the Inductive Miner Algorithm to generate a hierarchical visualization of the workflow. Capturing the sequences and dependecies of events. The algorithm is based on process discovery, and will highligh decision points and parallel activities. It is important for understanding the overall flow and structure of events and identifiying transitions and potential ineffcientices in the process. " ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tree generated and saved\n" - ] - } - ], + "outputs": [], "source": [ "# Specify a output_dir where the images will be sent, if it doesnt exist it will be created\n", "output_dir = \"../rawdata/images/\"\n", @@ -335,30 +171,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Generate Graph from Event Logs" + "### Generate Graph from Event Logs\n", + "\n", + "Next we will generate a graph from the tree we just generated. In case you skipped the last part we will regenerate the tree then convert the tree to a BPMN (Business Process Model and Notation) visual. The BPMN model is a standard graphical representation of the process, it is the simpilest graph we will generate. It highlights the sequences of activies, decision points, and possible parallel paths in the process model. Compared to the tree it is easier to identify ineffcienceies and deviation the process flow from the simplistic nature. " ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Graph generated and saved\n" - ] - } - ], + "outputs": [], "source": [ - "# Pass the same arguments as trees\n", "\n", "def generate_graph(csv_path, output_dir):\n", " event_log = pandas.read_csv(csv_path)\n", " event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at')\n", " \n", - " # Create if folder doesn't exist\n", + " # Create folder if it doesn't exist\n", " output_dir = os.path.expanduser(output_dir)\n", " os.makedirs(output_dir, exist_ok=True)\n", "\n", @@ -368,6 +197,7 @@ " file_name = f\"process_graph_{timestamp}.png\"\n", " output_path = os.path.join(output_dir, file_name)\n", "\n", + " # Run process tree and convert to BPMN\n", " process_tree = pm4py.discover_process_tree_inductive(event_log)\n", " bpmn_model = pm4py.convert_to_bpmn(process_tree)\n", " pm4py.save_vis_bpmn(bpmn_model, output_path, format=\"png\")\n", @@ -375,6 +205,233 @@ "\n", "generate_graph(csv_path, output_dir)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Graph with Filtering\n", + "\n", + "Filtering can also be applied to the process. By applying filtering we refine the model to focus on the most signifcant part of the process. It does this by reducing the noise and making the key patterns more apparent. This noise could be events that are not required to complete the process or that stray away from the main process for example. You can set the noise threshold at the top of the code block, note the default is 0.0 for the inductive miner but this notebook sets it to 0.8. For this we directly create the bpmn model without any convertions opposed to converting the process tree in the last code block." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def generate_graph(csv_path, output_dir):\n", + " # Set threshold here\n", + " noise_threshold = 0.8\n", + "\n", + " event_log = pandas.read_csv(csv_path)\n", + " event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at')\n", + " \n", + " # Create if folder doesn't exist\n", + " output_dir = os.path.expanduser(output_dir)\n", + " os.makedirs(output_dir, exist_ok=True)\n", + "\n", + " # Set up path and name of .png\n", + " output_dir = os.path.expanduser(output_dir)\n", + " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + " file_name = f\"process_graph_filtered_{timestamp}.png\"\n", + " output_path = os.path.join(output_dir, file_name)\n", + " \n", + " # Run the inductive miner \n", + " bpmn_filtered = pm4py.discover_bpmn_inductive(event_log, noise_threshold)\n", + " pm4py.view_bpmn(bpmn_filtered)\n", + " pm4py.save_vis_bpmn(bpmn_filtered, output_path, format=\"png\")\n", + " print(\"Graph generated and saved\")\n", + "\n", + "generate_graph(csv_path, output_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Performance Graph: Time or Occurrence Edge Weights\n", + "\n", + "### Time Edge Weight Graph\n", + "The time edge weight graph visualizes the process flow with a focus on the time spent between activities. It uses the Performance DFG (Directly-Follows Graph). Every edge has a value which represents the interval between consecutive events. These time-based relations are useful to show where the process may need to be optimized to reduce the overall cycle time in the process. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def generate_performance_graph(csv_path, output_dir):\n", + " event_log = pandas.read_csv(csv_path)\n", + " event_log['issue_number'] = event_log['issue_number'].astype(str)\n", + " event_log['created_at'] = pandas.to_datetime(event_log['created_at'], errors='coerce')\n", + "\n", + " # Create folder if it doesn't exist\n", + " output_dir = os.path.expanduser(output_dir)\n", + " os.makedirs(output_dir, exist_ok=True)\n", + " \n", + " # Set up path and name of .png\n", + " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + " file_name = f\"performance_dfg_{timestamp}.png\"\n", + " output_path = os.path.join(output_dir, file_name)\n", + " \n", + " # Run DFG and save visual\n", + " performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at')\n", + " pm4py.save_vis_performance_dfg(performance_dfg, start_activities, end_activities, output_path)\n", + " print(\"Graph generated and saved\")\n", + "\n", + "\n", + "generate_performance_graph(csv_path, output_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Occurrence Edge Weight Graph\n", + "\n", + "The DFG (Directly-Follows Graph) generates the graph with occurrence edges. The weight is based on the frequency of transitions between nodes. This model highlights the most common paths, allowing for a better understanding of the domnant workflow patterns. It can help identify redudent steps in the process. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def generate_count_graph(csv_path, output_dir):\n", + " event_log = pandas.read_csv(csv_path)\n", + " event_log['issue_number'] = event_log['issue_number'].astype(str)\n", + " event_log['created_at'] = pandas.to_datetime(event_log['created_at'], errors='coerce')\n", + "\n", + " # Create folder if it doesn't exist\n", + " output_dir = os.path.expanduser(output_dir)\n", + " os.makedirs(output_dir, exist_ok=True)\n", + "\n", + " # Set up path and name of .png\n", + " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + " file_name = f\"occurrence_dfg_{timestamp}.png\"\n", + " output_path = os.path.join(output_dir, file_name)\n", + " \n", + " # Run DFG and save visual\n", + " performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at')\n", + " dfg, start_activities, end_activities = pm4py.discover_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at')\n", + " pm4py.save_vis_dfg(dfg, start_activities, end_activities, output_path)\n", + " print(\"Graph generated and saved\")\n", + "\n", + "\n", + "generate_count_graph(csv_path, output_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Petri Net\n", + "\n", + "A Petri Net is a commonly used formal model used to represent workflows in automation and process mining. Unlike simplier models such as BPMN, Petri Nets represent conditions, tokens, and transitions. Instead of just showing the overview of the process. \n", + "\n", + "Important Symbols: \n", + "\n", + "- Circle with black center dot: Marks the start of the process.\n", + "- Circle with black square: Marks the end of the process.\n", + "- Empty circles: State or conditions in the process.\n", + "- Black boxes: Transitions that may be considered special. Example: Silent steps that don't correspond to events but may be needed for logical execution of the process." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def generate_petri_net(csv_path, output_dir):\n", + " event_log = pandas.read_csv(csv_path)\n", + " event_log['issue_number'] = event_log['issue_number'].astype(str)\n", + " event_log['created_at'] = pandas.to_datetime(event_log['created_at'], errors='coerce')\n", + "\n", + " # Create folder if it doesn't exist\n", + " output_dir = os.path.expanduser(output_dir)\n", + " os.makedirs(output_dir, exist_ok=True)\n", + "\n", + " # Set up path and name of .png\n", + " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + " file_name = f\"petri_net_{timestamp}.png\"\n", + " output_path = os.path.join(output_dir, file_name)\n", + "\n", + " # Create the Petri net with Inductive Miner\n", + " net, im, fm = pm4py.discover_petri_net_inductive(\n", + " event_log, \n", + " case_id_key='issue_number', \n", + " activity_key='event', \n", + " timestamp_key='created_at'\n", + " )\n", + "\n", + " # Save Petri net \n", + " pm4py.save_vis_petri_net(net, im, fm, output_path, format=\"png\")\n", + " print(\"Graph generated and saved\")\n", + " \n", + "generate_petri_net(csv_path, output_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Examples\n", + "\n", + "To show the functionality of each model we will make it easy by working with only one issue with multiple events. We will use the following issue 2 from Kaiaulu:\n", + "\n", + "![Starting Data](images/starting_data.png)\n", + "\n", + "### Process Tree\n", + "\n", + "![Process Tree](images/process_tree.png)\n", + "\n", + "We see we have generated a simple process tree with sequences and xor actions.\n", + "\n", + "### Process Graph (BPMN)\n", + "\n", + "![Process Graph](images/process_graph.png)\n", + "\n", + "The process graph shows up the simpliest visual. We can start at the green circle. From there the issue was labeld and then was either assigned-milestoned-closed. Or it was unlabled aftering being labeled then referenced-closed. From the closed state the process either ended or the issue was reopened and repeated.\n", + "\n", + "### Performance Graph (Time Weighted)\n", + "\n", + "![Time Weighted Graph](images/performance_dfg.png)\n", + "\n", + "The time weighted graph starts with the circle with the center dot. From there it goes through the process above but each edge has a weight based on the total time between events. We can see the time from the issue being referenced-closed was 9 months. Suggesting maybe someone forgot to close the event. This indicates a inefficiency within this Github issue process.\n", + "\n", + "### Performance Graph (Occurrence Weighted)\n", + "\n", + "![Occurrence Weighted](images/occurrence_dfg.png)\n", + "\n", + "With the occurrence weighted graph we see different colors for nodes annotated with multiple occurrences. To be exact the \"closed\" and \"labled\" event happen twice. Showing us the important points in the issue process.\n", + "\n", + "### Petri Net Graph\n", + "\n", + "![Petri Net](images/petri_net.png)\n", + "\n", + "Finally, the Petri Net is similar to the process graph. Except we can see states in the process represented by circles. As well as the special transitions represented by the black boxes.\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { From af5a5c5cf393dee56a67b853780200ee62303591 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Sun, 20 Apr 2025 15:29:13 -1000 Subject: [PATCH 07/13] Separated Notebook from API folder & added pdoc support This version includes the following: - A separate API folder with process mining functions and helper functions - Function comments added to support pdoc format Signed-off-by: Connor Narowetz --- api/csv_generator.py | 78 +++++++++ api/io_helpers.py | 45 ++++++ api/process_visual_generation.py | 245 ++++++++++++++++++++++++++++ issue_event_processing.ipynb | 270 +++++++++++-------------------- 4 files changed, 463 insertions(+), 175 deletions(-) create mode 100644 api/csv_generator.py create mode 100644 api/io_helpers.py create mode 100644 api/process_visual_generation.py diff --git a/api/csv_generator.py b/api/csv_generator.py new file mode 100644 index 0000000..74d2405 --- /dev/null +++ b/api/csv_generator.py @@ -0,0 +1,78 @@ +import random +import pandas as pd +from faker import Faker +from datetime import datetime, timedelta + +# Initialize faker +fake = Faker() + +# Function to generate fake data +def generate_csv_file(num_issues=1, num_events_per_issue=7, output_csv="generated_csv", seed=2): + """ + Generates fake event log data and saves it to a CSV file. + + Args: + num_issues (int): Number of unique issues to generate. + num_events_per_issue (int): Number of events per issue + output_csv (str): The path where the CSV will be saved. + seed (int): Seed to get same results + + Returns: + str: The path to the saved CSV file + """ + # Set seed given as parameter + random.seed(seed) + fake = Faker() + Faker.seed(seed) + # Set base time for all times to be based off of + base_time = datetime(2020, 1, 1, 12, 0, 0) + + all_events = ['labeled', 'assigned', 'milestoned', 'closed', 'unlabeled', 'referenced', 'mentioned', 'subscribed'] + event_data = [] + + for issue_num in range(1, num_issues + 1): + # Always start with 'assigned' and end with 'closed' + issue_events = ['assigned'] + + # Choose (num_events_per_issue - 2) random events from the rest, excluding 'assigned' and 'closed' + middle_candidates = [e for e in all_events if e not in ['assigned', 'closed']] + middle_events = random.sample(middle_candidates, k=num_events_per_issue - 2) + issue_events += middle_events + issue_events.append('closed') + + for event_num, event in enumerate(issue_events): + unique_id = fake.uuid4() + created_at = base_time + timedelta(minutes=event_num * 5 + issue_num * 60) + created_at_str = created_at.strftime('%Y-%m-%dT%H:%M:%SZ') + event_data.append([unique_id, created_at_str, event, issue_num]) + + event_log_df = pd.DataFrame(event_data, columns=['id', 'created_at', 'event', 'issue_number']) + event_log_df.to_csv(output_csv, index=False) + print(f"Fake event log data saved to {output_csv}") + return output_csv + +def modify_event_in_csv(csv_path, row_index, new_event, output_csv=None): + """ + Modifies the 'event' value in a specific row of a CSV file. + + Args: + csv_path (str): Path to the original CSV file. + row_index (int): Zero-based index of the row to modify. + new_event (str): The new event value to assign. + output_csv (str, optional): Path to save the modified CSV. Otherwise overwrites the original + + Returns: + pd.DataFrame: The modified DataFrame. + """ + df = pd.read_csv(csv_path) + + if row_index < 0 or row_index >= len(df): + raise IndexError(f"Row index {row_index} is out of bounds.") + + df.loc[row_index, 'event'] = new_event + + save_path = output_csv if output_csv else csv_path + df.to_csv(save_path, index=False) + print(f"Modified CSV saved to {save_path}") + + diff --git a/api/io_helpers.py b/api/io_helpers.py new file mode 100644 index 0000000..74e1470 --- /dev/null +++ b/api/io_helpers.py @@ -0,0 +1,45 @@ +from datetime import datetime +import pandas +import pm4py + + +def generate_filename(prefix, extension="png"): + """ + Generates a unique file name with a given prefix and file extension. + + Args: + prefix (str): The prefix to be added to the file name. + extension (str): The extension of the file (default is "png"). + + Returns: + str: The generated file name with the current timestamp. + """ + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + return f"{prefix}_{timestamp}.{extension}" + +def load_event_log(csv_path): + """ + Loads and formats an event log CSV for use with PM4Py. + + Args: + csv_path (str): Path to the event log CSV file. + + Returns: + pd.DataFrame: A formatted DataFrame ready for process mining. + + Raises: + FileNotFoundError: If the CSV file does not exist. + ValueError: If required columns are missing. + """ + event_log = pandas.read_csv(csv_path) + + if not {'issue_number', 'event', 'created_at'}.issubset(event_log.columns): + raise ValueError("CSV must contain 'issue_number', 'event', and 'created_at' columns.") + + event_log['issue_number'] = event_log['issue_number'].astype(str) + event_log['created_at'] = pandas.to_datetime(event_log['created_at'], errors='coerce') + + # PM4PY format + formatted_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at') + + return formatted_log \ No newline at end of file diff --git a/api/process_visual_generation.py b/api/process_visual_generation.py new file mode 100644 index 0000000..4e4bac9 --- /dev/null +++ b/api/process_visual_generation.py @@ -0,0 +1,245 @@ +""" +# 📊 Process Visualization Module + +Module for visualizing process event logs using **PM4Py**. + +--- + +## Features + +This module provides functions to: + +- Extract **start** and **end** activities from a CSV log. +- Generate and save various visualizations: + - **Process tree** + - **Process graph (with filtering)** + - **Performance-based DFG** (Directed Flow Graph) + - **Occurrence-based DFG** (Directed Flow Graph) + - **Petri net** + +--- + +## Dependencies + +- `pandas` +- `pm4py` + +--- + +## Example + +```python +from process_visual_generation import start_end_activities, generate_tree_inductive + +start_acts, end_acts = start_end_activities("data/log.csv") +generate_tree_inductive("data/log.csv", "~/Downloads") +``` +""" + +import os +from api.io_helpers import generate_filename, load_event_log +import pandas +import pm4py + + +def start_end_activities(csv_path): + """ + Reads an event log from a CSV file and returns its start and end activities. + + Assumes the CSV has the following columns: + - id': Unique case identifier. + - 'event': Activity name or label. + - 'created_at': Timestamp of the event. + + Args: + csv_path (str): Path to the event log CSV file. + + Returns: + tuple[dict, dict]: A tuple containing: + - dict: Start activities and their counts. + - dict: End activities and their counts. + + Raises: + FileNotFoundError: If the CSV path is invalid + ValueError: If required columns are missing. + """ + event_log = load_event_log(csv_path) + + start_activities = pm4py.get_start_activities(event_log) + end_activities = pm4py.get_end_activities(event_log) + return start_activities, end_activities + + +def generate_tree_inductive(csv_path, output_dir): + """ + Generates and saves a process tree visualization from an event log. Uses the Inductive Miner algorithm. + + Assumes the CSV has the following columns: + - 'issue_number': Unique case identifier. + - 'event': Activity name or label. + - 'created_at': Timestamp of the event. + + Args: + csv_path (str): Path to the event log CSV file. + output_dir (str): Directory where the PNG image will be saved. + + Returns: + None + + Side Effects: + Saves a PNG file of the process tree to the specified output directory. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing. + """ + event_log = load_event_log(csv_path) + + file_name = generate_filename("process_tree") + output_path = os.path.join(output_dir, file_name) + + # Run Inductive Miner to generate tree. + process_tree = pm4py.discover_process_tree_inductive(event_log) + pm4py.save_vis_process_tree(process_tree, output_path) + print(f"Tree generated and saved to {output_path}") + + +def generate_graph_inductive(csv_path, output_dir, noise_threshold=0.0): + """ + Generates and saves a filtered process graph visualization from an event log, + using a noise threshold to remove less relevant activities. Uses the Inductive Miner algorithm. + + Assumes the CSV has the following columns: + - 'issue_number': Unique case identifier. + - 'event': Activity name or label. + - 'created_at': Timestamp of the event. + + Args: + csv_path (str): Path to the event log CSV file. + output_dir (str): Directory where the PNG image will be saved. + noise_threshold (float): Threshold for filtering noise in the process graph (default is 0.0). + + Returns: + None + + Side Effects: + Saves a PNG file of the filtered process graph to the specified output directory. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing or the noise threshold is invalid. + """ + event_log = load_event_log(csv_path) + + file_name = generate_filename("process_graph_filtered") + output_path = os.path.join(output_dir, file_name) + + # Run the BPMN model with a noise threshold. + bpmn_filtered = pm4py.discover_bpmn_inductive(event_log, noise_threshold) + pm4py.save_vis_bpmn(bpmn_filtered, output_path, format="png") + print(f"Graph generated and saved to {output_path}") + + +def generate_performance_graph_dfg(csv_path, output_dir): + """ + Generates and saves a performance-related Directed Flow Graph (DFG) visualization. + + Assumes the CSV has the following columns: + - 'issue_number': Unique case identifier. + - 'event': Activity name or label. + - 'created_at': Timestamp of the event. + + Args: + csv_path (str): Path to the event log CSV file. + output_dir (str): Directory where the PNG image will be saved. + + Returns: + None + + Side Effects: + Saves a PNG file of the performance DFG to the specified output directory. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing. + """ + event_log = load_event_log(csv_path) + + + file_name = generate_filename("performance_dfg") + output_path = os.path.join(output_dir, file_name) + + # Run DFG and generate performance graph. + performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') + pm4py.save_vis_performance_dfg(performance_dfg, start_activities, end_activities, output_path) + print(f"Graph generated and saved to {output_path}") + + +def generate_count_graph_dfg(csv_path, output_dir): + """ + Generates and saves an occurrence-based Directed Flow Graph (DFG) visualization, + which shows the frequency of activity transitions. + + Assumes the CSV has the following columns: + - 'issue_number': Unique case identifier. + - 'event': Activity name or label. + - 'created_at': Timestamp of the event. + + Args: + csv_path (str): Path to the event log CSV file. + output_dir (str): Directory where the PNG image will be saved. + + Returns: + None + + Side Effects: + Saves a PNG file of the occurrence DFG to the specified output directory. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing. + """ + event_log = load_event_log(csv_path) + + file_name = generate_filename("occurrence_dfg") + output_path = os.path.join(output_dir, file_name) + + # Run DFG and generate graph. + performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') + dfg, start_activities, end_activities = pm4py.discover_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') + pm4py.save_vis_dfg(dfg, start_activities, end_activities, output_path) + print(f"Graph generated and saved to {output_path}") + + +def generate_petri_net_inductive(csv_path, output_dir): + """ + Generates and saves a Petri net visualization from an event log using the Inductive Miner. + + Assumes the CSV has the following columns: + - 'issue_number': Unique case identifier. + - 'event': Activity name or label. + - 'created_at': Timestamp of the event. + + Args: + csv_path (str): Path to the event log CSV file. + output_dir (str): Directory where the PNG image will be saved. + + Returns: + None + + Side Effects: + Saves a PNG file of the Petri net to the specified output directory. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing. + """ + event_log = load_event_log(csv_path) + + file_name = generate_filename("petri_net") + output_path = os.path.join(output_dir, file_name) + + # Run Inductive Miner and generate Petri Net. + net, im, fm = pm4py.discover_petri_net_inductive(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') + pm4py.save_vis_petri_net(net, im, fm, output_path, format="png") + print(f"Graph generated and saved to {output_path}") diff --git a/issue_event_processing.ipynb b/issue_event_processing.ipynb index 35596c8..240c131 100644 --- a/issue_event_processing.ipynb +++ b/issue_event_processing.ipynb @@ -18,7 +18,8 @@ "\n", "- Gihub Access Token \n", "- [Kaiaulu](https://github.com/sailuh/kaiaulu) R package to download data via CLI\n", - "- Python environment with [pm4py](https://github.com/process-intelligence-solutions/pm4py) installed\n" + "- Python environment with [pm4py](https://github.com/process-intelligence-solutions/pm4py) installed\n", + "- Faker installed for CSV data generation\n" ] }, { @@ -30,18 +31,17 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas\n", "import os\n", - "from datetime import datetime\n", "import pm4py\n", "import subprocess\n", "\n", - "from pm4py.algo.discovery.dfg import algorithm as dfg_discovery\n", - "from pm4py.algo.discovery.heuristics import algorithm as heuristics_miner" + "from api.csv_generator import *\n", + "from api.process_visual_generation import *" ] }, { @@ -59,11 +59,11 @@ "metadata": {}, "outputs": [], "source": [ - "# Save and set the current working directory to Kaiaulu\n", + "# Save and set the current working directory to Kaiaulu.\n", "cwd = os.getcwd()\n", "os.chdir(os.path.expanduser(\"~/Desktop/Kaiaulu/Working_issues/kaiaulu/\"))\n", "\n", - "# To download use the download command specifing the \n", + "# To download use the download command specifing the .\n", "\n", "command = f\"Rscript exec/ghevents.R download conf/kaiaulu.yml --token_path=~/.ssh/github_token\"\n", "subprocess.run(command, shell=True, check=True)\n" @@ -86,7 +86,7 @@ "metadata": {}, "outputs": [], "source": [ - "# To Parse use the parse command and specify the \n", + "# To Parse use the parse command and specify the .\n", "\n", "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml ../rawdata/issue_output.csv ../rawdata/commit_output.csv\"\n", "subprocess.run(command, shell=True, check=True)" @@ -96,45 +96,79 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Get Start and End Activies From Event Logs\n", - "\n", - "The start and end activies are the first and last recorded events in the process workflow. Marking the entry and exit points where no prior or further events occur. These activies are useful for reasoning through process grpahs and finding inefficencies in a non-graphical manner." + "### Generate CSV data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To start using process mining it is recommnend you generate a \"fake\" .csv event log to see how events change process maps. This is setup below, just generate the csv with the seed set to 2 to start. This function can be used to further explore how different events and number of issues change the graphs generated." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "({'renamed': 2, 'assigned': 1, 'milestoned': 1, 'referenced': 2, 'labeled': 2, 'closed': 1}, {'renamed': 2, 'assigned': 1, 'milestoned': 1, 'referenced': 2, 'labeled': 2, 'closed': 1})\n" + "Fake event log data saved to ../created_csv.csv\n" ] + }, + { + "data": { + "text/plain": [ + "'../created_csv.csv'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Specify the csv file path \n", - "csv_path = \"../rawdata/issue_output.csv\"\n", - "\n", - "def start_end_activities(csv_path): \n", - " event_log = pandas.read_csv(csv_path)\n", - " event_log = pm4py.format_dataframe(event_log, case_id='id', activity_key='event', timestamp_key='created_at')\n", - " start_activities = pm4py.get_start_activities(event_log)\n", - " end_activities = pm4py.get_end_activities(event_log)\n", - " return start_activities, end_activities\n", - "\n", - "print(start_end_activities(csv_path))\n" + "# Example usage \n", + "# Note: Set the output path\n", + "output_csv = \"../created_csv.csv\"\n", + "generate_csv_file(num_issues=1, num_events_per_issue=7, output_csv=output_csv, seed=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Generate Tree from Event Logs\n", + "To compare graphs generated we can modify the generated csv with the following function. So there will be two .csv files the original and a modified one with one event changed. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Modified CSV saved to ../modified_csv.csv\n" + ] + } + ], + "source": [ + "# Example usage\n", + "# Note: Set the output_csv\n", + "modify_event_in_csv(\"../created_csv.csv\", row_index=5, new_event=\"assigned\", output_csv=\"../modified_csv.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get Start and End Activies From Event Logs\n", "\n", - "The process tree generated from event logs is our first visual we will generate. It uses the Inductive Miner Algorithm to generate a hierarchical visualization of the workflow. Capturing the sequences and dependecies of events. The algorithm is based on process discovery, and will highligh decision points and parallel activities. It is important for understanding the overall flow and structure of events and identifiying transitions and potential ineffcientices in the process. " + "The start and end activies are the first and last recorded events in the process workflow. Marking the entry and exit points where no prior or further events occur. These activies are useful for reasoning through process grpahs and finding inefficencies in a non-graphical manner." ] }, { @@ -143,37 +177,35 @@ "metadata": {}, "outputs": [], "source": [ - "# Specify a output_dir where the images will be sent, if it doesnt exist it will be created\n", - "output_dir = \"../rawdata/images/\"\n", - "\n", - "def generate_tree(csv_path, output_dir):\n", - " event_log = pandas.read_csv(csv_path)\n", - " event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at')\n", - "\n", - " # Create if folder doesn't exist\n", - " output_dir = os.path.expanduser(output_dir)\n", - " os.makedirs(output_dir, exist_ok=True)\n", + "# Specify the csv file path .\n", + "csv_path = \"../rawdata/issue_output.csv\"\n", "\n", - " # Set up path and name of .png\n", - " output_dir = os.path.expanduser(output_dir)\n", - " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", - " file_name = f\"process_tree_{timestamp}.png\"\n", - " output_path = os.path.join(output_dir, file_name)\n", + "# Call start_end_activities.\n", + "start_end_activities(csv_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate Tree from Event Logs\n", "\n", - " process_tree = pm4py.discover_process_tree_inductive(event_log)\n", - " pm4py.save_vis_process_tree(process_tree, output_path)\n", - " print(\"Tree generated and saved\")\n", + "The process tree generated from event logs is our first visual we will generate. It uses the Inductive Miner Algorithm to generate a hierarchical visualization of the workflow. Capturing the sequences and dependecies of events. The algorithm is based on process discovery, and will highligh decision points and parallel activities. It is important for understanding the overall flow and structure of events and identifiying transitions and potential ineffcientices in the process. \n", "\n", - "generate_tree(csv_path, output_dir)" + "We will need a directory to save the images for methods from here on. Specify the output_dir if it does not already exist it will create it. " ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 9, "metadata": {}, + "outputs": [], "source": [ - "### Generate Graph from Event Logs\n", + "# Specify the directory to save images.\n", + "output_dir = \"../rawdata/images/\"\n", "\n", - "Next we will generate a graph from the tree we just generated. In case you skipped the last part we will regenerate the tree then convert the tree to a BPMN (Business Process Model and Notation) visual. The BPMN model is a standard graphical representation of the process, it is the simpilest graph we will generate. It highlights the sequences of activies, decision points, and possible parallel paths in the process model. Compared to the tree it is easier to identify ineffcienceies and deviation the process flow from the simplistic nature. " + "output_dir = os.path.expanduser(output_dir)\n", + "os.makedirs(output_dir, exist_ok=True)" ] }, { @@ -182,37 +214,20 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "def generate_graph(csv_path, output_dir):\n", - " event_log = pandas.read_csv(csv_path)\n", - " event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at')\n", - " \n", - " # Create folder if it doesn't exist\n", - " output_dir = os.path.expanduser(output_dir)\n", - " os.makedirs(output_dir, exist_ok=True)\n", - "\n", - " # Set up path and name of .png\n", - " output_dir = os.path.expanduser(output_dir)\n", - " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", - " file_name = f\"process_graph_{timestamp}.png\"\n", - " output_path = os.path.join(output_dir, file_name)\n", - "\n", - " # Run process tree and convert to BPMN\n", - " process_tree = pm4py.discover_process_tree_inductive(event_log)\n", - " bpmn_model = pm4py.convert_to_bpmn(process_tree)\n", - " pm4py.save_vis_bpmn(bpmn_model, output_path, format=\"png\")\n", - " print(\"Graph generated and saved\")\n", - "\n", - "generate_graph(csv_path, output_dir)" + "# Call generate_tree.\n", + "generate_tree_inductive(csv_path, output_dir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Generate Graph with Filtering\n", + "### Generate Graph with or without filtering\n", + "\n", + "We will create a BPMN (Buiness Process Model and Notation) with the same inductive miner from the last part creating the tree.\n", + "The BPMN model is a standard graphical representation of the process, it is the simpilest graph we will generate. It highlights the sequences of activies, decision points, and possible parallel paths in the process model. Compared to the tree it is easier to identify ineffcienceies and deviation the process flow from the simplistic nature. \n", "\n", - "Filtering can also be applied to the process. By applying filtering we refine the model to focus on the most signifcant part of the process. It does this by reducing the noise and making the key patterns more apparent. This noise could be events that are not required to complete the process or that stray away from the main process for example. You can set the noise threshold at the top of the code block, note the default is 0.0 for the inductive miner but this notebook sets it to 0.8. For this we directly create the bpmn model without any convertions opposed to converting the process tree in the last code block." + "Filtering can also be applied to the process. By applying filtering we refine the model to focus on the most signifcant part of the process. It does this by reducing the noise and making the key patterns more apparent. This noise could be events that are not required to complete the process or that stray away from the main process for example. You can set the noise threshold as a parameter, note the default is 0.0. " ] }, { @@ -221,31 +236,8 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "def generate_graph(csv_path, output_dir):\n", - " # Set threshold here\n", - " noise_threshold = 0.8\n", - "\n", - " event_log = pandas.read_csv(csv_path)\n", - " event_log = pm4py.format_dataframe(event_log, case_id='issue_number', activity_key='event', timestamp_key='created_at')\n", - " \n", - " # Create if folder doesn't exist\n", - " output_dir = os.path.expanduser(output_dir)\n", - " os.makedirs(output_dir, exist_ok=True)\n", - "\n", - " # Set up path and name of .png\n", - " output_dir = os.path.expanduser(output_dir)\n", - " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", - " file_name = f\"process_graph_filtered_{timestamp}.png\"\n", - " output_path = os.path.join(output_dir, file_name)\n", - " \n", - " # Run the inductive miner \n", - " bpmn_filtered = pm4py.discover_bpmn_inductive(event_log, noise_threshold)\n", - " pm4py.view_bpmn(bpmn_filtered)\n", - " pm4py.save_vis_bpmn(bpmn_filtered, output_path, format=\"png\")\n", - " print(\"Graph generated and saved\")\n", - "\n", - "generate_graph(csv_path, output_dir)" + "# Call generate_graph_filtered and specify a noise threshold. \n", + "generate_graph_inductive(csv_path, output_dir, 0.5)" ] }, { @@ -264,28 +256,8 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "def generate_performance_graph(csv_path, output_dir):\n", - " event_log = pandas.read_csv(csv_path)\n", - " event_log['issue_number'] = event_log['issue_number'].astype(str)\n", - " event_log['created_at'] = pandas.to_datetime(event_log['created_at'], errors='coerce')\n", - "\n", - " # Create folder if it doesn't exist\n", - " output_dir = os.path.expanduser(output_dir)\n", - " os.makedirs(output_dir, exist_ok=True)\n", - " \n", - " # Set up path and name of .png\n", - " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", - " file_name = f\"performance_dfg_{timestamp}.png\"\n", - " output_path = os.path.join(output_dir, file_name)\n", - " \n", - " # Run DFG and save visual\n", - " performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at')\n", - " pm4py.save_vis_performance_dfg(performance_dfg, start_activities, end_activities, output_path)\n", - " print(\"Graph generated and saved\")\n", - "\n", - "\n", - "generate_performance_graph(csv_path, output_dir)" + "# Call generate_performance_graph.\n", + "generate_performance_graph_dfg(csv_path, output_dir)" ] }, { @@ -303,29 +275,8 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "def generate_count_graph(csv_path, output_dir):\n", - " event_log = pandas.read_csv(csv_path)\n", - " event_log['issue_number'] = event_log['issue_number'].astype(str)\n", - " event_log['created_at'] = pandas.to_datetime(event_log['created_at'], errors='coerce')\n", - "\n", - " # Create folder if it doesn't exist\n", - " output_dir = os.path.expanduser(output_dir)\n", - " os.makedirs(output_dir, exist_ok=True)\n", - "\n", - " # Set up path and name of .png\n", - " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", - " file_name = f\"occurrence_dfg_{timestamp}.png\"\n", - " output_path = os.path.join(output_dir, file_name)\n", - " \n", - " # Run DFG and save visual\n", - " performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at')\n", - " dfg, start_activities, end_activities = pm4py.discover_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at')\n", - " pm4py.save_vis_dfg(dfg, start_activities, end_activities, output_path)\n", - " print(\"Graph generated and saved\")\n", - "\n", - "\n", - "generate_count_graph(csv_path, output_dir)" + "# Call generate_count_graph.\n", + "generate_count_graph_dfg(csv_path, output_dir)" ] }, { @@ -350,34 +301,8 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "def generate_petri_net(csv_path, output_dir):\n", - " event_log = pandas.read_csv(csv_path)\n", - " event_log['issue_number'] = event_log['issue_number'].astype(str)\n", - " event_log['created_at'] = pandas.to_datetime(event_log['created_at'], errors='coerce')\n", - "\n", - " # Create folder if it doesn't exist\n", - " output_dir = os.path.expanduser(output_dir)\n", - " os.makedirs(output_dir, exist_ok=True)\n", - "\n", - " # Set up path and name of .png\n", - " timestamp = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", - " file_name = f\"petri_net_{timestamp}.png\"\n", - " output_path = os.path.join(output_dir, file_name)\n", - "\n", - " # Create the Petri net with Inductive Miner\n", - " net, im, fm = pm4py.discover_petri_net_inductive(\n", - " event_log, \n", - " case_id_key='issue_number', \n", - " activity_key='event', \n", - " timestamp_key='created_at'\n", - " )\n", - "\n", - " # Save Petri net \n", - " pm4py.save_vis_petri_net(net, im, fm, output_path, format=\"png\")\n", - " print(\"Graph generated and saved\")\n", - " \n", - "generate_petri_net(csv_path, output_dir)" + "# Call generate_petri_net.\n", + "generate_petri_net_inductive(csv_path, output_dir)" ] }, { @@ -427,11 +352,6 @@ "\n", "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] } ], "metadata": { From 9946ff55541278e2fab920de33a0f7d8c1b60ca6 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Sun, 20 Apr 2025 15:34:01 -1000 Subject: [PATCH 08/13] i #1 Changed comment - Changed modify_event_in_csv function comment Signed-off-by: Connor Narowetz --- api/csv_generator.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/csv_generator.py b/api/csv_generator.py index 74d2405..e9a1dda 100644 --- a/api/csv_generator.py +++ b/api/csv_generator.py @@ -60,9 +60,6 @@ def modify_event_in_csv(csv_path, row_index, new_event, output_csv=None): row_index (int): Zero-based index of the row to modify. new_event (str): The new event value to assign. output_csv (str, optional): Path to save the modified CSV. Otherwise overwrites the original - - Returns: - pd.DataFrame: The modified DataFrame. """ df = pd.read_csv(csv_path) From 8aa59b80e5e37ea473d03b56908c2f79d5d3344b Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Thu, 1 May 2025 16:15:43 -1000 Subject: [PATCH 09/13] i #1 Revised Notebook and Refactored API - Notebook now starts the user from the beginning - Uses relative paths - Includes three "experiements" - API now asks user action 'view' 'save' or 'both' - Renamed API functions - Includes env.yml --- __init__.py | 0 api/__init__.py | 14 + api/csv_generator.py | 53 +- api/{io_helpers.py => io.py} | 14 +- api/process_discovery.py | 298 + api/process_visual_generation.py | 245 - env.yml | 548 ++ images/occurrence_dfg.png | Bin 37495 -> 0 bytes images/performance_dfg.png | Bin 39761 -> 0 bytes images/petri_net.png | Bin 37916 -> 0 bytes images/process_graph.png | Bin 25428 -> 0 bytes images/process_tree.png | Bin 50956 -> 0 bytes images/starting_data.png | Bin 63006 -> 0 bytes issue_event_processing.html | 7968 ------------------------ issue_event_processing.ipynb | 378 -- notebooks/issue_event_processing.ipynb | 389 ++ 16 files changed, 1280 insertions(+), 8627 deletions(-) create mode 100644 __init__.py create mode 100644 api/__init__.py rename api/{io_helpers.py => io.py} (72%) create mode 100644 api/process_discovery.py delete mode 100644 api/process_visual_generation.py create mode 100644 env.yml delete mode 100644 images/occurrence_dfg.png delete mode 100644 images/performance_dfg.png delete mode 100644 images/petri_net.png delete mode 100644 images/process_graph.png delete mode 100644 images/process_tree.png delete mode 100644 images/starting_data.png delete mode 100644 issue_event_processing.html delete mode 100644 issue_event_processing.ipynb create mode 100644 notebooks/issue_event_processing.ipynb diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..542d6ce --- /dev/null +++ b/api/__init__.py @@ -0,0 +1,14 @@ +""" +The `process_mining.api` module provides tools for generating and manipulating event logs. These event logs can then be used for process mining. +It uses [PM4Py](https://github.com/process-intelligence-solutions/pm4py) library for process mining models and algorithms and uses `pandas` for data handling and manipulating. + +--- + +## Overview + +- `csv_generator.py` : Allows fake event logs to be created to run process mining. +- `io.py` : Provides event log loader and file naming convention. +- `process_visaul_generation` : Contains functions to create process visualizations from PM4PY. + +""" + diff --git a/api/csv_generator.py b/api/csv_generator.py index e9a1dda..207a941 100644 --- a/api/csv_generator.py +++ b/api/csv_generator.py @@ -1,29 +1,26 @@ import random import pandas as pd -from faker import Faker +import uuid from datetime import datetime, timedelta -# Initialize faker -fake = Faker() # Function to generate fake data -def generate_csv_file(num_issues=1, num_events_per_issue=7, output_csv="generated_csv", seed=2): +def generate_fake_event_log(num_issues=1, num_events_per_issue=7, output_csv="generated_csv.csv", seed=42): """ - Generates fake event log data and saves it to a CSV file. + Generates fake event log data and saves it to a CSV file. The event log always startes with event 'assigned' and ends + with event 'closed'. Events generated in between are randomly picked with options {'labeled', 'assigned', 'milestoned', 'closed', 'unlabeled', 'referenced', 'mentioned', 'subscribed'}. Args: - num_issues (int): Number of unique issues to generate. - num_events_per_issue (int): Number of events per issue - output_csv (str): The path where the CSV will be saved. - seed (int): Seed to get same results + - num_issues (int): Number of unique issues to generate. + - num_events_per_issue (int): Number of events per issue + - output_csv (str): The path where the CSV will be saved. + - seed (int): Seed to get same results Returns: - str: The path to the saved CSV file + - str: The path to the saved CSV file """ # Set seed given as parameter random.seed(seed) - fake = Faker() - Faker.seed(seed) # Set base time for all times to be based off of base_time = datetime(2020, 1, 1, 12, 0, 0) @@ -36,12 +33,12 @@ def generate_csv_file(num_issues=1, num_events_per_issue=7, output_csv="generate # Choose (num_events_per_issue - 2) random events from the rest, excluding 'assigned' and 'closed' middle_candidates = [e for e in all_events if e not in ['assigned', 'closed']] - middle_events = random.sample(middle_candidates, k=num_events_per_issue - 2) + middle_events = random.choices(middle_candidates, k=num_events_per_issue - 2) issue_events += middle_events issue_events.append('closed') for event_num, event in enumerate(issue_events): - unique_id = fake.uuid4() + unique_id = str(uuid.uuid4()) created_at = base_time + timedelta(minutes=event_num * 5 + issue_num * 60) created_at_str = created_at.strftime('%Y-%m-%dT%H:%M:%SZ') event_data.append([unique_id, created_at_str, event, issue_num]) @@ -51,25 +48,23 @@ def generate_csv_file(num_issues=1, num_events_per_issue=7, output_csv="generate print(f"Fake event log data saved to {output_csv}") return output_csv -def modify_event_in_csv(csv_path, row_index, new_event, output_csv=None): +def modify_event(event_log_df, row_index, new_event): """ - Modifies the 'event' value in a specific row of a CSV file. + Modify events in the given event log dataframe. Args: - csv_path (str): Path to the original CSV file. - row_index (int): Zero-based index of the row to modify. - new_event (str): The new event value to assign. - output_csv (str, optional): Path to save the modified CSV. Otherwise overwrites the original - """ - df = pd.read_csv(csv_path) + - event_log_df (pd.DataFrame): The event log data frame. + - row_index (int): The index of the row to modify. + - new_event (str): The new event value to assign. - if row_index < 0 or row_index >= len(df): + Returns: + - pd.DataFrame: The modified event log dataframe. + """ + # Ensure row_index is within the bounds of the dataframe + if row_index < 0 or row_index >= len(event_log_df): raise IndexError(f"Row index {row_index} is out of bounds.") - - df.loc[row_index, 'event'] = new_event - - save_path = output_csv if output_csv else csv_path - df.to_csv(save_path, index=False) - print(f"Modified CSV saved to {save_path}") + + event_log_df.loc[row_index, 'event'] = new_event + return event_log_df diff --git a/api/io_helpers.py b/api/io.py similarity index 72% rename from api/io_helpers.py rename to api/io.py index 74e1470..00beb69 100644 --- a/api/io_helpers.py +++ b/api/io.py @@ -3,29 +3,29 @@ import pm4py -def generate_filename(prefix, extension="png"): +def generate_timestamped_filename(prefix, extension="png"): """ Generates a unique file name with a given prefix and file extension. Args: - prefix (str): The prefix to be added to the file name. - extension (str): The extension of the file (default is "png"). + - prefix (str): The prefix to be added to the file name. + - extension (str): The extension of the file (default is "png"). Returns: - str: The generated file name with the current timestamp. + - str: The generated file name with the current timestamp. """ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") return f"{prefix}_{timestamp}.{extension}" -def load_event_log(csv_path): +def read_event_log(csv_path): """ Loads and formats an event log CSV for use with PM4Py. Args: - csv_path (str): Path to the event log CSV file. + - csv_path (str): Path to the event log CSV file. Returns: - pd.DataFrame: A formatted DataFrame ready for process mining. + - pd.DataFrame: A formatted DataFrame ready for process mining. Raises: FileNotFoundError: If the CSV file does not exist. diff --git a/api/process_discovery.py b/api/process_discovery.py new file mode 100644 index 0000000..9a181e3 --- /dev/null +++ b/api/process_discovery.py @@ -0,0 +1,298 @@ +""" +# 📊 Process Discovery Module + +Module for visualizing process event logs using **PM4Py**. + +--- + +## Features + +This module provides functions to: + +- Extract **start** and **end** activities from a CSV log. +- Generate and save various visualizations: + - **Process tree** + - **Process graph (with filtering)** + - **Performance-based DFG** (Directed Flow Graph) + - **Occurrence-based DFG** (Directed Flow Graph) + - **Petri net** + +All functions assume the CSV argument has the following columns [`io.read_event_log`](io.html#read_event_log): +- 'issue_number': Unique case identifier. +- 'event': Activity name or label. +- 'created_at': Timestamp of the event. + +--- + +## Dependencies + +- `pandas` +- `pm4py` + +--- + +## Example + +```python +from process_discovery import start_end_activities, generate_tree_inductive + +start_acts, end_acts = start_end_activities("data/log.csv") + +generate_tree_inductive("data/log.csv") +``` +""" + +import os +from .io import generate_timestamped_filename, read_event_log +import pm4py + + +def start_end_activities(csv_path): + """ + Reads an event log from a CSV file and returns its start and end activities. + + Assumes the CSV has required columns, see here: [`io.read_event_log`](io.html#read_event_log) + + + Args: + - csv_path (str): Path to the event log CSV file. + + Returns: + tuple[dict, dict]: A tuple containing: + - dict: Start activities and their counts. + - dict: End activities and their counts. + + Raises: + FileNotFoundError: If the CSV path is invalid + ValueError: If required columns are missing. + """ + event_log = read_event_log(csv_path) + + start_activities = pm4py.get_start_activities(event_log) + end_activities = pm4py.get_end_activities(event_log) + return start_activities, end_activities + + +def generate_tree_inductive(csv_path, output_dir=None, action="view"): + """ + Generates and saves a process tree visualization from an event log. Uses the Inductive Miner algorithm. + + Assumes the CSV has required columns, see here: [`io.read_event_log`](io.html#read_event_log) + + Args: + - csv_path (str): Path to the event log CSV file. + - output_dir (str, optional): Directory where the PNG image will be saved. Required if action is 'save' or 'both'. + - action (str): One of {'view', 'save', 'both'}. + - 'view': Display the graph in the current environment. (Default action) + - 'save': Save the graph to the specified output_dir. + - 'both': Display and save the graph. + + Returns: + None + + Side Effects: + Saves a PNG file of the performance DFG to the specified output directory if action is 'save' or 'both'. + Displays the visualization if action is 'view' or 'both'. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing, or output_dir is not provided when action is 'save' or 'both'. + """ + event_log = read_event_log(csv_path) + + process_tree = pm4py.discover_process_tree_inductive(event_log) + + if action == "view" or action == "both": + pm4py.view_process_tree(process_tree) + + if action == "save" or action == "both": + if output_dir is not None: + if not os.path.exists(output_dir): + raise FileNotFoundError(f"The specified directory does not exist: {output_dir}") + file_name = generate_timestamped_filename("process_tree") + output_path = os.path.join(output_dir, file_name) + pm4py.save_vis_process_tree(process_tree, output_path) + print(f"Tree generated and saved to {output_path}") + else: + raise ValueError("Output directory must be specified for saving.") + + +def generate_graph_inductive(csv_path, output_dir=None, action="view", noise_threshold=0.0): + """ + Generates and saves a filtered process graph visualization from an event log, + using a noise threshold to remove less relevant activities. Uses the Inductive Miner algorithm. + + Assumes the CSV has required columns, see here: [`io.read_event_log`](io.html#read_event_log) + + Args: + - csv_path (str): Path to the event log CSV file. + - output_dir (str, optional): Directory where the PNG image will be saved. Required if action is 'save' or 'both'. + - noise_threshold (float): Threshold for filtering noise in the process graph (default is 0.0). + - action (str): One of {'view', 'save', 'both'}. + - 'view': Display the graph in the current environment. (Default action) + - 'save': Save the graph to the specified output_dir. + - 'both': Display and save the graph. + + Returns: + None + + Side Effects: + Saves a PNG file of the filtered process graph to the specified output directory if action is 'save' or 'both'. + Displays the visualization if action is 'view' or 'both'. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing, output_dir is not provided when needed, or noise_threshold is invalid. + """ + if not (0.0 <= noise_threshold <= 1.0): + raise ValueError("Noise threshold must be between 0.0 and 1.0.") + + event_log = read_event_log(csv_path) + + bpmn_filtered = pm4py.discover_bpmn_inductive(event_log, noise_threshold) + + if action == "view" or action == "both": + pm4py.view_bpmn(bpmn_filtered) + + if action == "save" or action == "both": + if output_dir is not None: + if not os.path.exists(output_dir): + raise FileNotFoundError(f"The specified directory does not exist: {output_dir}") + file_name = generate_timestamped_filename("process_graph_inductive") + output_path = os.path.join(output_dir, file_name) + pm4py.save_vis_bpmn(bpmn_filtered, output_path, format="png") + print(f"Graph generated and saved to {output_path}") + else: + raise ValueError("Output directory must be specified for saving.") + + +def generate_performance_graph_dfg(csv_path, output_dir=None, action="view"): + """ + Generates and saves a performance-related Directed Flow Graph (DFG) visualization. + + Assumes the CSV has required columns, see here: [`io.read_event_log`](io.html#read_event_log) + + Args: + - csv_path (str): Path to the event log CSV file. + - output_dir (str, optional): Directory where the PNG image will be saved. Required if action is 'save' or 'both'. + - action (str): One of {'view', 'save', 'both'}. + - 'view': Display the graph in the current environment. (Default action) + - 'save': Save the graph to the specified output_dir. + - 'both': Display and save the graph. + + Returns: + None + + Side Effects: + Saves a PNG file of the performance DFG to the specified output directory if action is 'save' or 'both'. + Displays the visualization if action is 'view' or 'both'. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing, or output_dir is not provided when action is 'save' or 'both'. + """ + event_log = read_event_log(csv_path) + + performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') + + if action == "view" or action == "both": + pm4py.view_performance_dfg(performance_dfg, start_activities, end_activities) + if action == "save" or action == "both": + if output_dir is not None: + if not os.path.exists(output_dir): + raise FileNotFoundError(f"The specified directory does not exist: {output_dir}") + file_name = generate_timestamped_filename("performance_dfg") + output_path = os.path.join(output_dir, file_name) + pm4py.save_vis_performance_dfg(performance_dfg, start_activities, end_activities) + print(f"Graph generated and saved to {output_path}") + else: + raise ValueError("Output directory must be specified for saving.") + + +def generate_count_graph_dfg(csv_path, output_dir=None, action="view"): + """ + Generates and saves an occurrence-based Directed Flow Graph (DFG) visualization, + which shows the frequency of activity transitions. + + Assumes the CSV has required columns, see here: [`io.read_event_log`](io.html#read_event_log) + + Args: + - csv_path (str): Path to the event log CSV file. + - output_dir (str): Directory where the PNG image will be saved. + - action (str): One of {'view', 'save', 'both}. + - 'view': Display the graph in the current enviroment. (Default action) + - 'save': Save the graph to the specified output_dir. + - 'both': Display and save the graph. + + Returns: + None + + Side Effects: + Saves a PNG file of the occurrence DFG to the specified output directory if action is 'save' or 'both'. + Displays the visualization if action is 'view' or 'both'. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing, or output_dir is not provided when action is 'save' or 'both'. + """ + event_log = read_event_log(csv_path) + + # Run DFG and generate graph. + dfg, start_activities, end_activities = pm4py.discover_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') + + if action == "view" or action == "both": + pm4py.view_dfg(dfg, start_activities, end_activities) + if action == "save" or action == "both": + if output_dir is not None: + if not os.path.exists(output_dir): + raise FileNotFoundError(f"The specified directory does not exist: {output_dir}") + + file_name = generate_timestamped_filename("occurrence_dfg") + output_path = os.path.join(output_dir, file_name) + pm4py.save_vis_dfg(dfg, start_activities, end_activities, output_path) + print(f"Graph generated and saved to {output_path}") + else: + raise ValueError("Output directory must be specified for saving.") + + +def generate_petri_net_inductive(csv_path, output_dir=None, action="view"): + """ + Generates and saves a Petri net visualization from an event log using the Inductive Miner. + + Assumes the CSV has required columns, see here: [`io.read_event_log`](io.html#read_event_log) + + Args: + - csv_path (str): Path to the event log CSV file. + - output_dir (str): Directory where the PNG image will be saved. + - action (str): One of {'view', 'save', 'both}. + - 'view': Display the graph in the current enviroment. (Default action) + - 'save': Save the graph to the specified output_dir. + - 'both': Display and save the graph. + + Returns: + None + + Side Effects: + Saves a PNG file of the occurrence DFG to the specified output directory if action is 'save' or 'both'. Displays the visualization if action is 'view' or 'both'. + + Raises: + FileNotFoundError: If the CSV path is invalid. + ValueError: If required columns are missing, or output_dir is not provided when action is 'save' or 'both'. + """ + event_log = read_event_log(csv_path) + + net, im, fm = pm4py.discover_petri_net_inductive(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') + + if action == "view" or action == "both": + pm4py.view_petri_net(net, im, fm) + if action == "save" or action == "both": + if output_dir is not None: + if not os.path.exists(output_dir): + raise FileNotFoundError(f"The specified directory does not exist: {output_dir}") + + file_name = generate_timestamped_filename("petri_net") + output_path = os.path.join(output_dir, file_name) + pm4py.save_vis_petri_net(net, im, fm, output_path, format="png") + print(f"Graph generated and saved to {output_path}") + else: + raise ValueError("Output directory must be specified for saving.") \ No newline at end of file diff --git a/api/process_visual_generation.py b/api/process_visual_generation.py deleted file mode 100644 index 4e4bac9..0000000 --- a/api/process_visual_generation.py +++ /dev/null @@ -1,245 +0,0 @@ -""" -# 📊 Process Visualization Module - -Module for visualizing process event logs using **PM4Py**. - ---- - -## Features - -This module provides functions to: - -- Extract **start** and **end** activities from a CSV log. -- Generate and save various visualizations: - - **Process tree** - - **Process graph (with filtering)** - - **Performance-based DFG** (Directed Flow Graph) - - **Occurrence-based DFG** (Directed Flow Graph) - - **Petri net** - ---- - -## Dependencies - -- `pandas` -- `pm4py` - ---- - -## Example - -```python -from process_visual_generation import start_end_activities, generate_tree_inductive - -start_acts, end_acts = start_end_activities("data/log.csv") -generate_tree_inductive("data/log.csv", "~/Downloads") -``` -""" - -import os -from api.io_helpers import generate_filename, load_event_log -import pandas -import pm4py - - -def start_end_activities(csv_path): - """ - Reads an event log from a CSV file and returns its start and end activities. - - Assumes the CSV has the following columns: - - id': Unique case identifier. - - 'event': Activity name or label. - - 'created_at': Timestamp of the event. - - Args: - csv_path (str): Path to the event log CSV file. - - Returns: - tuple[dict, dict]: A tuple containing: - - dict: Start activities and their counts. - - dict: End activities and their counts. - - Raises: - FileNotFoundError: If the CSV path is invalid - ValueError: If required columns are missing. - """ - event_log = load_event_log(csv_path) - - start_activities = pm4py.get_start_activities(event_log) - end_activities = pm4py.get_end_activities(event_log) - return start_activities, end_activities - - -def generate_tree_inductive(csv_path, output_dir): - """ - Generates and saves a process tree visualization from an event log. Uses the Inductive Miner algorithm. - - Assumes the CSV has the following columns: - - 'issue_number': Unique case identifier. - - 'event': Activity name or label. - - 'created_at': Timestamp of the event. - - Args: - csv_path (str): Path to the event log CSV file. - output_dir (str): Directory where the PNG image will be saved. - - Returns: - None - - Side Effects: - Saves a PNG file of the process tree to the specified output directory. - - Raises: - FileNotFoundError: If the CSV path is invalid. - ValueError: If required columns are missing. - """ - event_log = load_event_log(csv_path) - - file_name = generate_filename("process_tree") - output_path = os.path.join(output_dir, file_name) - - # Run Inductive Miner to generate tree. - process_tree = pm4py.discover_process_tree_inductive(event_log) - pm4py.save_vis_process_tree(process_tree, output_path) - print(f"Tree generated and saved to {output_path}") - - -def generate_graph_inductive(csv_path, output_dir, noise_threshold=0.0): - """ - Generates and saves a filtered process graph visualization from an event log, - using a noise threshold to remove less relevant activities. Uses the Inductive Miner algorithm. - - Assumes the CSV has the following columns: - - 'issue_number': Unique case identifier. - - 'event': Activity name or label. - - 'created_at': Timestamp of the event. - - Args: - csv_path (str): Path to the event log CSV file. - output_dir (str): Directory where the PNG image will be saved. - noise_threshold (float): Threshold for filtering noise in the process graph (default is 0.0). - - Returns: - None - - Side Effects: - Saves a PNG file of the filtered process graph to the specified output directory. - - Raises: - FileNotFoundError: If the CSV path is invalid. - ValueError: If required columns are missing or the noise threshold is invalid. - """ - event_log = load_event_log(csv_path) - - file_name = generate_filename("process_graph_filtered") - output_path = os.path.join(output_dir, file_name) - - # Run the BPMN model with a noise threshold. - bpmn_filtered = pm4py.discover_bpmn_inductive(event_log, noise_threshold) - pm4py.save_vis_bpmn(bpmn_filtered, output_path, format="png") - print(f"Graph generated and saved to {output_path}") - - -def generate_performance_graph_dfg(csv_path, output_dir): - """ - Generates and saves a performance-related Directed Flow Graph (DFG) visualization. - - Assumes the CSV has the following columns: - - 'issue_number': Unique case identifier. - - 'event': Activity name or label. - - 'created_at': Timestamp of the event. - - Args: - csv_path (str): Path to the event log CSV file. - output_dir (str): Directory where the PNG image will be saved. - - Returns: - None - - Side Effects: - Saves a PNG file of the performance DFG to the specified output directory. - - Raises: - FileNotFoundError: If the CSV path is invalid. - ValueError: If required columns are missing. - """ - event_log = load_event_log(csv_path) - - - file_name = generate_filename("performance_dfg") - output_path = os.path.join(output_dir, file_name) - - # Run DFG and generate performance graph. - performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') - pm4py.save_vis_performance_dfg(performance_dfg, start_activities, end_activities, output_path) - print(f"Graph generated and saved to {output_path}") - - -def generate_count_graph_dfg(csv_path, output_dir): - """ - Generates and saves an occurrence-based Directed Flow Graph (DFG) visualization, - which shows the frequency of activity transitions. - - Assumes the CSV has the following columns: - - 'issue_number': Unique case identifier. - - 'event': Activity name or label. - - 'created_at': Timestamp of the event. - - Args: - csv_path (str): Path to the event log CSV file. - output_dir (str): Directory where the PNG image will be saved. - - Returns: - None - - Side Effects: - Saves a PNG file of the occurrence DFG to the specified output directory. - - Raises: - FileNotFoundError: If the CSV path is invalid. - ValueError: If required columns are missing. - """ - event_log = load_event_log(csv_path) - - file_name = generate_filename("occurrence_dfg") - output_path = os.path.join(output_dir, file_name) - - # Run DFG and generate graph. - performance_dfg, start_activities, end_activities = pm4py.discover_performance_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') - dfg, start_activities, end_activities = pm4py.discover_dfg(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') - pm4py.save_vis_dfg(dfg, start_activities, end_activities, output_path) - print(f"Graph generated and saved to {output_path}") - - -def generate_petri_net_inductive(csv_path, output_dir): - """ - Generates and saves a Petri net visualization from an event log using the Inductive Miner. - - Assumes the CSV has the following columns: - - 'issue_number': Unique case identifier. - - 'event': Activity name or label. - - 'created_at': Timestamp of the event. - - Args: - csv_path (str): Path to the event log CSV file. - output_dir (str): Directory where the PNG image will be saved. - - Returns: - None - - Side Effects: - Saves a PNG file of the Petri net to the specified output directory. - - Raises: - FileNotFoundError: If the CSV path is invalid. - ValueError: If required columns are missing. - """ - event_log = load_event_log(csv_path) - - file_name = generate_filename("petri_net") - output_path = os.path.join(output_dir, file_name) - - # Run Inductive Miner and generate Petri Net. - net, im, fm = pm4py.discover_petri_net_inductive(event_log, case_id_key='issue_number', activity_key='event', timestamp_key='created_at') - pm4py.save_vis_petri_net(net, im, fm, output_path, format="png") - print(f"Graph generated and saved to {output_path}") diff --git a/env.yml b/env.yml new file mode 100644 index 0000000..e67660c --- /dev/null +++ b/env.yml @@ -0,0 +1,548 @@ +name: base +channels: + - defaults +dependencies: + - _anaconda_depends=2024.06=py312_openblas_2 + - abseil-cpp=20230802.0=h313beb8_2 + - aext-assistant=4.0.15=py312hca03da5_jl4_0 + - aext-assistant-server=4.0.15=py312hca03da5_0 + - aext-core=4.0.15=py312hca03da5_jl4_0 + - aext-core-server=4.0.15=py312hca03da5_1 + - aext-panels=4.0.15=py312hca03da5_0 + - aext-panels-server=4.0.15=py312hca03da5_0 + - aext-share-notebook=4.0.15=py312hca03da5_0 + - aext-share-notebook-server=4.0.15=py312hca03da5_0 + - aext-shared=4.0.15=py312hca03da5_0 + - aiobotocore=2.12.3=py312hca03da5_0 + - aiohttp=3.9.5=py312h80987f9_0 + - aioitertools=0.7.1=pyhd3eb1b0_0 + - aiosignal=1.2.0=pyhd3eb1b0_0 + - alabaster=0.7.16=py312hca03da5_0 + - altair=5.0.1=py312hca03da5_0 + - anaconda-anon-usage=0.4.4=py312hd6b623d_100 + - anaconda-catalogs=0.2.0=py312hca03da5_1 + - anaconda-client=1.12.3=py312hca03da5_0 + - anaconda-cloud-auth=0.5.1=py312hca03da5_0 + - anaconda-navigator=2.6.0=py312hca03da5_0 + - anaconda-project=0.11.1=py312hca03da5_0 + - anaconda-toolbox=4.0.15=py312hca03da5_0 + - annotated-types=0.6.0=py312hca03da5_0 + - anyio=4.2.0=py312hca03da5_0 + - aom=3.6.0=h313beb8_0 + - appdirs=1.4.4=pyhd3eb1b0_0 + - applaunchservices=0.3.0=py312hca03da5_0 + - appnope=0.1.3=py312hca03da5_1001 + - appscript=1.1.2=py312h80987f9_0 + - archspec=0.2.3=pyhd3eb1b0_0 + - argon2-cffi=21.3.0=pyhd3eb1b0_0 + - argon2-cffi-bindings=21.2.0=py312h80987f9_0 + - arrow=1.2.3=py312hca03da5_1 + - arrow-cpp=14.0.2=hc7aafb3_1 + - astroid=2.14.2=py312hca03da5_0 + - astropy=6.1.0=py312ha86b861_0 + - astropy-iers-data=0.2024.6.3.0.31.14=py312hca03da5_0 + - asttokens=2.0.5=pyhd3eb1b0_0 + - async-lru=2.0.4=py312hca03da5_0 + - atomicwrites=1.4.0=py_0 + - attrs=23.1.0=py312hca03da5_0 + - automat=20.2.0=py_0 + - autopep8=2.0.4=pyhd3eb1b0_0 + - aws-c-auth=0.6.19=h80987f9_0 + - aws-c-cal=0.5.20=h80987f9_0 + - aws-c-common=0.8.5=h80987f9_0 + - aws-c-compression=0.2.16=h80987f9_0 + - aws-c-event-stream=0.2.15=h313beb8_0 + - aws-c-http=0.6.25=h80987f9_0 + - aws-c-io=0.13.10=h80987f9_0 + - aws-c-mqtt=0.7.13=h80987f9_0 + - aws-c-s3=0.1.51=h80987f9_0 + - aws-c-sdkutils=0.1.6=h80987f9_0 + - aws-checksums=0.1.13=h80987f9_0 + - aws-crt-cpp=0.18.16=h313beb8_0 + - aws-sdk-cpp=1.10.55=h313beb8_0 + - babel=2.11.0=py312hca03da5_0 + - bcrypt=3.2.0=py312h80987f9_1 + - beautifulsoup4=4.12.3=py312hca03da5_0 + - binaryornot=0.4.4=pyhd3eb1b0_1 + - black=24.4.2=py312hca03da5_0 + - blas=1.0=openblas + - bleach=4.1.0=pyhd3eb1b0_0 + - blinker=1.6.2=py312hca03da5_0 + - blosc=1.21.3=h313beb8_0 + - bokeh=3.4.1=py312h989b03a_0 + - boltons=23.0.0=py312hca03da5_0 + - boost-cpp=1.82.0=h48ca7d4_2 + - botocore=1.34.69=py312hca03da5_0 + - bottleneck=1.3.7=py312ha86b861_0 + - brotli=1.0.9=h80987f9_8 + - brotli-bin=1.0.9=h80987f9_8 + - brotli-python=1.0.9=py312h313beb8_8 + - brunsli=0.1=hc377ac9_1 + - bzip2=1.0.8=h80987f9_6 + - c-ares=1.19.1=h80987f9_0 + - c-blosc2=2.12.0=h7df6c2f_0 + - ca-certificates=2024.7.2=hca03da5_0 + - cachetools=5.3.3=py312hca03da5_0 + - cctools=949.0.1=hc179dcd_25 + - cctools_osx-arm64=949.0.1=h332cad3_25 + - certifi=2024.7.4=py312hca03da5_0 + - cffi=1.16.0=py312h80987f9_1 + - cfitsio=3.470=h7f6438f_7 + - chardet=4.0.0=py312hca03da5_1003 + - charls=2.2.0=hc377ac9_0 + - charset-normalizer=2.0.4=pyhd3eb1b0_0 + - click=8.1.7=py312hca03da5_0 + - cloudpickle=2.2.1=py312hca03da5_0 + - colorama=0.4.6=py312hca03da5_0 + - colorcet=3.1.0=py312hca03da5_0 + - comm=0.2.1=py312hca03da5_0 + - conda=24.7.1=py312hca03da5_0 + - conda-build=24.5.1=py312hca03da5_0 + - conda-content-trust=0.2.0=py312hca03da5_1 + - conda-index=0.5.0=py312hca03da5_0 + - conda-libmamba-solver=24.1.0=pyhd3eb1b0_0 + - conda-pack=0.7.1=py312hca03da5_0 + - conda-package-handling=2.3.0=py312hca03da5_0 + - conda-package-streaming=0.10.0=py312hca03da5_0 + - conda-repo-cli=1.0.88=py312hca03da5_0 + - conda-token=0.5.0=pyhd3eb1b0_0 + - constantly=23.10.4=py312hca03da5_0 + - contourpy=1.2.0=py312h48ca7d4_0 + - cookiecutter=2.6.0=py312hca03da5_0 + - cryptography=42.0.5=py312hd4332d6_1 + - cssselect=1.2.0=py312hca03da5_0 + - curl=8.7.1=h02f6b3c_0 + - cycler=0.11.0=pyhd3eb1b0_0 + - cyrus-sasl=2.1.28=h9131b1a_1 + - cytoolz=0.12.2=py312h80987f9_0 + - dask=2024.5.0=py312hca03da5_0 + - dask-core=2024.5.0=py312hca03da5_0 + - dask-expr=1.1.0=py312hca03da5_0 + - datashader=0.16.2=py312hca03da5_0 + - dav1d=1.2.1=h80987f9_0 + - debugpy=1.6.7=py312h313beb8_0 + - decorator=5.1.1=pyhd3eb1b0_0 + - defusedxml=0.7.1=pyhd3eb1b0_0 + - diff-match-patch=20200713=pyhd3eb1b0_0 + - dill=0.3.8=py312hca03da5_0 + - distributed=2024.5.0=py312hca03da5_0 + - distro=1.9.0=py312hca03da5_0 + - docstring-to-markdown=0.11=py312hca03da5_0 + - docutils=0.18.1=py312hca03da5_3 + - entrypoints=0.4=py312hca03da5_0 + - et_xmlfile=1.1.0=py312hca03da5_1 + - executing=0.8.3=pyhd3eb1b0_0 + - expat=2.6.2=h313beb8_0 + - filelock=3.13.1=py312hca03da5_0 + - flake8=7.0.0=py312hca03da5_0 + - flask=3.0.3=py312hca03da5_0 + - fmt=9.1.0=h48ca7d4_1 + - fonttools=4.51.0=py312h80987f9_0 + - freetype=2.12.1=h1192e45_0 + - frozendict=2.4.2=py312hca03da5_0 + - frozenlist=1.4.0=py312h80987f9_0 + - fsspec=2024.3.1=py312hca03da5_0 + - gettext=0.21.0=h13f89a0_1 + - gflags=2.2.2=h313beb8_1 + - giflib=5.2.1=h80987f9_3 + - gitdb=4.0.7=pyhd3eb1b0_0 + - gitpython=3.1.37=py312hca03da5_0 + - glib=2.78.4=h313beb8_0 + - glib-tools=2.78.4=h313beb8_0 + - glog=0.5.0=h313beb8_1 + - greenlet=3.0.1=py312h313beb8_0 + - grpc-cpp=1.48.2=hc60591f_4 + - gst-plugins-base=1.14.1=h313beb8_1 + - gstreamer=1.14.1=h80987f9_1 + - gtest=1.14.0=h48ca7d4_1 + - h11=0.14.0=py312hca03da5_0 + - h5py=3.11.0=py312haac6407_0 + - hdf5=1.12.1=h05c076b_3 + - heapdict=1.0.1=pyhd3eb1b0_0 + - holoviews=1.19.0=py312hca03da5_0 + - httpcore=1.0.2=py312hca03da5_0 + - httpx=0.27.0=py312hca03da5_0 + - hvplot=0.10.0=py312hca03da5_0 + - hyperlink=21.0.0=pyhd3eb1b0_0 + - icu=73.1=h313beb8_0 + - idna=3.7=py312hca03da5_0 + - imagecodecs=2023.1.23=py312h75b721f_1 + - imageio=2.33.1=py312hca03da5_0 + - imagesize=1.4.1=py312hca03da5_0 + - imbalanced-learn=0.12.3=py312hca03da5_1 + - importlib-metadata=7.0.1=py312hca03da5_0 + - incremental=22.10.0=pyhd3eb1b0_0 + - inflection=0.5.1=py312hca03da5_1 + - iniconfig=1.1.1=pyhd3eb1b0_0 + - intake=0.7.0=py312hca03da5_0 + - intervaltree=3.1.0=pyhd3eb1b0_0 + - ipykernel=6.28.0=py312hca03da5_0 + - ipython=8.25.0=py312hca03da5_0 + - ipython_genutils=0.2.0=pyhd3eb1b0_1 + - ipywidgets=7.8.1=py312hca03da5_0 + - isort=5.13.2=py312hca03da5_0 + - itemadapter=0.3.0=pyhd3eb1b0_0 + - itemloaders=1.1.0=py312hca03da5_0 + - itsdangerous=2.2.0=py312hca03da5_0 + - jaraco.classes=3.2.1=pyhd3eb1b0_0 + - jedi=0.18.1=py312hca03da5_1 + - jellyfish=1.0.1=py312h15d1925_0 + - jinja2=3.1.4=py312hca03da5_0 + - jmespath=1.0.1=py312hca03da5_0 + - joblib=1.4.2=py312hca03da5_0 + - jpeg=9e=h80987f9_1 + - jq=1.6=h1a28f6b_1 + - json5=0.9.6=pyhd3eb1b0_0 + - jsonpatch=1.33=py312hca03da5_1 + - jsonpointer=2.1=pyhd3eb1b0_0 + - jsonschema=4.19.2=py312hca03da5_0 + - jsonschema-specifications=2023.7.1=py312hca03da5_0 + - jupyter=1.0.0=py312hca03da5_9 + - jupyter-lsp=2.2.0=py312hca03da5_0 + - jupyter_client=8.6.0=py312hca03da5_0 + - jupyter_console=6.6.3=py312hca03da5_1 + - jupyter_core=5.7.2=py312hca03da5_0 + - jupyter_events=0.10.0=py312hca03da5_0 + - jupyter_server=2.14.1=py312hca03da5_0 + - jupyter_server_terminals=0.4.4=py312hca03da5_1 + - jupyterlab=4.0.11=py312hca03da5_0 + - jupyterlab-variableinspector=3.1.0=py312hca03da5_0 + - jupyterlab_pygments=0.1.2=py_0 + - jupyterlab_server=2.25.1=py312hca03da5_0 + - jupyterlab_widgets=1.0.0=pyhd3eb1b0_1 + - jxrlib=1.1=h1a28f6b_2 + - keyring=24.3.1=py312hca03da5_0 + - kiwisolver=1.4.4=py312h313beb8_0 + - krb5=1.20.1=hf3e1bf2_1 + - lazy-object-proxy=1.10.0=py312h80987f9_0 + - lazy_loader=0.4=py312hca03da5_0 + - lcms2=2.12=hba8e193_0 + - ld64=530=hb29bf3f_25 + - ld64_osx-arm64=530=h001ce53_25 + - ldid=2.1.5=h20b2a84_3 + - lerc=3.0=hc377ac9_0 + - libaec=1.0.4=hc377ac9_1 + - libarchive=3.6.2=h62fee54_3 + - libavif=0.11.1=h80987f9_0 + - libboost=1.82.0=h0bc93f9_2 + - libbrotlicommon=1.0.9=h80987f9_8 + - libbrotlidec=1.0.9=h80987f9_8 + - libbrotlienc=1.0.9=h80987f9_8 + - libclang=14.0.6=default_h1b80db6_1 + - libclang13=14.0.6=default_h24352ff_1 + - libcurl=8.7.1=h3e2b118_0 + - libcxx=14.0.6=h848a8c0_0 + - libdeflate=1.17=h80987f9_1 + - libedit=3.1.20230828=h80987f9_0 + - libev=4.33=h1a28f6b_1 + - libevent=2.1.12=h02f6b3c_1 + - libffi=3.4.4=hca03da5_1 + - libgfortran=5.0.0=11_3_0_hca03da5_28 + - libgfortran5=11.3.0=h009349e_28 + - libglib=2.78.4=h0a96307_0 + - libiconv=1.16=h80987f9_3 + - liblief=0.12.3=h313beb8_0 + - libllvm14=14.0.6=h7ec7a93_3 + - libmamba=1.5.8=haeffa04_2 + - libmambapy=1.5.8=py312h1c5506f_2 + - libnghttp2=1.57.0=h62f6fdd_0 + - libopenblas=0.3.21=h269037a_0 + - libpng=1.6.39=h80987f9_0 + - libpq=12.17=h02f6b3c_0 + - libprotobuf=3.20.3=h514c7bf_0 + - libsodium=1.0.18=h1a28f6b_0 + - libsolv=0.7.24=h514c7bf_1 + - libspatialindex=1.9.3=hc377ac9_0 + - libssh2=1.11.0=h3e2b118_0 + - libthrift=0.15.0=h73c2103_2 + - libtiff=4.5.1=h313beb8_0 + - libwebp-base=1.3.2=h80987f9_0 + - libxml2=2.10.4=h0b34f26_2 + - libxslt=1.1.37=h80987f9_1 + - libzopfli=1.0.3=hc377ac9_0 + - linkify-it-py=2.0.0=py312hca03da5_0 + - llvm-openmp=14.0.6=hc6e5704_0 + - llvmlite=0.42.0=py312h313beb8_0 + - locket=1.0.0=py312hca03da5_0 + - lxml=5.2.1=py312h50ffb84_0 + - lz4=4.3.2=py312h80987f9_0 + - lz4-c=1.9.4=h313beb8_1 + - lzo=2.10=h1a28f6b_2 + - markdown=3.4.1=py312hca03da5_0 + - markdown-it-py=2.2.0=py312hca03da5_1 + - markupsafe=2.1.3=py312h80987f9_0 + - matplotlib=3.8.4=py312hca03da5_0 + - matplotlib-base=3.8.4=py312hd77ebd4_0 + - matplotlib-inline=0.1.6=py312hca03da5_0 + - mccabe=0.7.0=pyhd3eb1b0_0 + - mdit-py-plugins=0.3.0=py312hca03da5_0 + - mdurl=0.1.0=py312hca03da5_0 + - menuinst=2.1.1=py312hca03da5_0 + - mistune=2.0.4=py312hca03da5_0 + - more-itertools=10.1.0=py312hca03da5_0 + - mpmath=1.3.0=py312hca03da5_0 + - msgpack-python=1.0.3=py312h48ca7d4_0 + - multidict=6.0.4=py312h80987f9_0 + - multipledispatch=0.6.0=py312hca03da5_0 + - mypy=1.10.0=py312h80987f9_0 + - mypy_extensions=1.0.0=py312hca03da5_0 + - mysql=5.7.24=ha71a6ea_2 + - navigator-updater=0.5.1=py312hca03da5_0 + - nbclient=0.8.0=py312hca03da5_0 + - nbconvert=7.10.0=py312hca03da5_0 + - nbformat=5.9.2=py312hca03da5_0 + - ncurses=6.4=h313beb8_0 + - nest-asyncio=1.6.0=py312hca03da5_0 + - networkx=3.2.1=py312hca03da5_0 + - nltk=3.8.1=py312hca03da5_0 + - notebook=7.0.8=py312hca03da5_0 + - notebook-shim=0.2.3=py312hca03da5_0 + - numba=0.59.1=py312hd77ebd4_0 + - numexpr=2.8.7=py312h0f3ea24_0 + - numpy=1.26.4=py312h7f4fdc5_0 + - numpy-base=1.26.4=py312he047099_0 + - numpydoc=1.7.0=py312hca03da5_0 + - oniguruma=6.9.7.1=h1a28f6b_0 + - openjpeg=2.3.0=h7a6adac_2 + - openpyxl=3.1.2=py312h80987f9_0 + - openssl=3.0.14=h80987f9_0 + - orc=1.7.4=hdca1487_1 + - overrides=7.4.0=py312hca03da5_0 + - packaging=23.2=py312hca03da5_0 + - pandas=2.2.2=py312hd77ebd4_0 + - pandocfilters=1.5.0=pyhd3eb1b0_0 + - panel=1.4.4=py312hca03da5_0 + - param=2.1.0=py312hca03da5_0 + - parsel=1.8.1=py312hca03da5_0 + - parso=0.8.3=pyhd3eb1b0_0 + - partd=1.4.1=py312hca03da5_0 + - patch=2.7.6=h1a28f6b_1001 + - pathspec=0.10.3=py312hca03da5_0 + - patsy=0.5.6=py312hca03da5_0 + - pcre2=10.42=hb066dcc_1 + - pexpect=4.8.0=pyhd3eb1b0_3 + - pickleshare=0.7.5=pyhd3eb1b0_1003 + - pillow=10.3.0=py312h80987f9_0 + - pip=24.0=py312hca03da5_0 + - pkce=1.0.3=py312hca03da5_0 + - pkginfo=1.10.0=py312hca03da5_0 + - platformdirs=3.10.0=py312hca03da5_0 + - plotly=5.22.0=py312h989b03a_0 + - pluggy=1.0.0=py312hca03da5_1 + - ply=3.11=py312hca03da5_1 + - prometheus_client=0.14.1=py312hca03da5_0 + - prompt-toolkit=3.0.43=py312hca03da5_0 + - prompt_toolkit=3.0.43=hd3eb1b0_0 + - protego=0.1.16=py_0 + - protobuf=3.20.3=py312h313beb8_0 + - psutil=5.9.0=py312h80987f9_0 + - ptyprocess=0.7.0=pyhd3eb1b0_2 + - pure_eval=0.2.2=pyhd3eb1b0_0 + - py-cpuinfo=9.0.0=py312hca03da5_0 + - py-lief=0.12.3=py312h313beb8_0 + - pyarrow=14.0.2=py312h8604a13_0 + - pyasn1=0.4.8=pyhd3eb1b0_0 + - pyasn1-modules=0.2.8=py_0 + - pybind11-abi=5=hd3eb1b0_0 + - pycodestyle=2.11.1=py312hca03da5_0 + - pycosat=0.6.6=py312h80987f9_1 + - pycparser=2.21=pyhd3eb1b0_0 + - pyct=0.5.0=py312hca03da5_0 + - pycurl=7.45.2=py312h02f6b3c_1 + - pydeck=0.8.0=py312hca03da5_2 + - pydispatcher=2.0.5=py312hca03da5_3 + - pydocstyle=6.3.0=py312hca03da5_0 + - pyerfa=2.0.1.4=py312ha86b861_0 + - pyflakes=3.2.0=py312hca03da5_0 + - pygments=2.15.1=py312hca03da5_1 + - pyjwt=2.8.0=py312hca03da5_0 + - pylint=2.16.2=py312hca03da5_0 + - pylint-venv=3.0.3=py312hca03da5_0 + - pyls-spyder=0.4.0=pyhd3eb1b0_0 + - pyobjc-core=10.1=py312h80987f9_0 + - pyobjc-framework-cocoa=10.1=py312hb094c41_0 + - pyobjc-framework-coreservices=10.1=py312hdd8dd1f_0 + - pyobjc-framework-fsevents=10.1=py312hca03da5_0 + - pyodbc=5.0.1=py312h313beb8_0 + - pyopenssl=24.0.0=py312hca03da5_0 + - pyparsing=3.0.9=py312hca03da5_0 + - pyqt=5.15.10=py312h313beb8_0 + - pyqt5-sip=12.13.0=py312h80987f9_0 + - pyqtwebengine=5.15.10=py312h313beb8_0 + - pysocks=1.7.1=py312hca03da5_0 + - pytables=3.9.2=py312h905a39b_0 + - pytest=7.4.4=py312hca03da5_0 + - python=3.12.4=h99e199e_1 + - python-dateutil=2.9.0post0=py312hca03da5_2 + - python-dotenv=0.21.0=py312hca03da5_0 + - python-fastjsonschema=2.16.2=py312hca03da5_0 + - python-json-logger=2.0.7=py312hca03da5_0 + - python-libarchive-c=2.9=pyhd3eb1b0_1 + - python-lmdb=1.4.1=py312h313beb8_0 + - python-lsp-black=2.0.0=py312hca03da5_0 + - python-lsp-jsonrpc=1.1.2=pyhd3eb1b0_0 + - python-lsp-server=1.10.0=py312hca03da5_0 + - python-slugify=5.0.2=pyhd3eb1b0_0 + - python-snappy=0.6.1=py312h313beb8_0 + - python-tzdata=2023.3=pyhd3eb1b0_0 + - python.app=3=py312h80987f9_0 + - pytoolconfig=1.2.6=py312hca03da5_0 + - pytz=2024.1=py312hca03da5_0 + - pyviz_comms=3.0.2=py312hca03da5_0 + - pywavelets=1.5.0=py312ha86b861_0 + - pyyaml=6.0.1=py312h80987f9_0 + - pyzmq=25.1.2=py312h313beb8_0 + - qdarkstyle=3.2.3=pyhd3eb1b0_0 + - qstylizer=0.2.2=py312hca03da5_0 + - qt-main=5.15.2=h0917680_10 + - qt-webengine=5.15.9=h2903aaf_7 + - qtawesome=1.2.2=py312hca03da5_0 + - qtconsole=5.5.1=py312hca03da5_0 + - qtpy=2.4.1=py312hca03da5_0 + - queuelib=1.6.2=py312hca03da5_0 + - re2=2022.04.01=hc377ac9_0 + - readline=8.2=h1a28f6b_0 + - referencing=0.30.2=py312hca03da5_0 + - regex=2023.10.3=py312h80987f9_0 + - reproc=14.2.4=h313beb8_2 + - reproc-cpp=14.2.4=h313beb8_2 + - requests=2.32.2=py312hca03da5_0 + - requests-file=1.5.1=pyhd3eb1b0_0 + - requests-toolbelt=1.0.0=py312hca03da5_0 + - rfc3339-validator=0.1.4=py312hca03da5_0 + - rfc3986-validator=0.1.1=py312hca03da5_0 + - rich=13.3.5=py312hca03da5_1 + - rope=1.12.0=py312hca03da5_0 + - rpds-py=0.10.6=py312hf0e4da2_0 + - rtree=1.0.1=py312hca03da5_0 + - ruamel.yaml=0.17.21=py312h80987f9_0 + - ruamel_yaml=0.17.21=py312h80987f9_0 + - s3fs=2024.3.1=py312hca03da5_0 + - scikit-image=0.23.2=py312hd77ebd4_0 + - scikit-learn=1.4.2=py312hd77ebd4_1 + - scipy=1.13.1=py312ha409365_0 + - scrapy=2.11.1=py312hca03da5_0 + - seaborn=0.13.2=py312hca03da5_0 + - semver=3.0.2=py312hca03da5_0 + - send2trash=1.8.2=py312hca03da5_0 + - service_identity=18.1.0=pyhd3eb1b0_1 + - setuptools=69.5.1=py312hca03da5_0 + - sip=6.7.12=py312h313beb8_0 + - six=1.16.0=pyhd3eb1b0_1 + - smart_open=5.2.1=py312hca03da5_0 + - smmap=4.0.0=pyhd3eb1b0_0 + - snappy=1.1.10=h313beb8_1 + - sniffio=1.3.0=py312hca03da5_0 + - snowballstemmer=2.2.0=pyhd3eb1b0_0 + - sortedcontainers=2.4.0=pyhd3eb1b0_0 + - soupsieve=2.5=py312hca03da5_0 + - sphinx=7.3.7=py312hca03da5_0 + - sphinxcontrib-applehelp=1.0.2=pyhd3eb1b0_0 + - sphinxcontrib-devhelp=1.0.2=pyhd3eb1b0_0 + - sphinxcontrib-htmlhelp=2.0.0=pyhd3eb1b0_0 + - sphinxcontrib-jsmath=1.0.1=pyhd3eb1b0_0 + - sphinxcontrib-qthelp=1.0.3=pyhd3eb1b0_0 + - sphinxcontrib-serializinghtml=1.1.10=py312hca03da5_0 + - spyder=5.5.1=py312hca03da5_0 + - spyder-kernels=2.5.0=py312hca03da5_0 + - sqlalchemy=2.0.30=py312h80987f9_0 + - sqlite=3.45.3=h80987f9_0 + - stack_data=0.2.0=pyhd3eb1b0_0 + - statsmodels=0.14.2=py312ha86b861_0 + - streamlit=1.32.0=py312hca03da5_0 + - tabulate=0.9.0=py312hca03da5_0 + - tapi=1100.0.11=h8754e6a_1 + - tbb=2021.8.0=h48ca7d4_0 + - tblib=1.7.0=pyhd3eb1b0_0 + - tenacity=8.2.2=py312hca03da5_1 + - terminado=0.17.1=py312hca03da5_0 + - text-unidecode=1.3=pyhd3eb1b0_0 + - textdistance=4.2.1=pyhd3eb1b0_0 + - threadpoolctl=2.2.0=pyh0d69192_0 + - three-merge=0.1.1=pyhd3eb1b0_0 + - tifffile=2023.4.12=py312hca03da5_0 + - tinycss2=1.2.1=py312hca03da5_0 + - tk=8.6.14=h6ba3021_0 + - tldextract=3.2.0=pyhd3eb1b0_0 + - toml=0.10.2=pyhd3eb1b0_0 + - tomli=2.0.1=py312hca03da5_1 + - tomlkit=0.11.1=py312hca03da5_0 + - toolz=0.12.0=py312hca03da5_0 + - tornado=6.4.1=py312h80987f9_0 + - tqdm=4.66.4=py312h989b03a_0 + - traitlets=5.14.3=py312hca03da5_0 + - truststore=0.8.0=py312hca03da5_0 + - twisted=23.10.0=py312hca03da5_0 + - tzdata=2024a=h04d1e81_0 + - uc-micro-py=1.0.1=py312hca03da5_0 + - ujson=5.10.0=py312h313beb8_0 + - unicodedata2=15.1.0=py312h80987f9_0 + - unidecode=1.2.0=pyhd3eb1b0_0 + - unixodbc=2.3.11=h1a28f6b_0 + - urllib3=2.2.2=py312hca03da5_0 + - utf8proc=2.6.1=h80987f9_1 + - w3lib=2.1.2=py312hca03da5_0 + - watchdog=4.0.1=py312h80987f9_0 + - wcwidth=0.2.5=pyhd3eb1b0_0 + - webencodings=0.5.1=py312hca03da5_2 + - websocket-client=1.8.0=py312hca03da5_0 + - werkzeug=3.0.3=py312hca03da5_0 + - whatthepatch=1.0.2=py312hca03da5_0 + - wheel=0.43.0=py312hca03da5_0 + - widgetsnbextension=3.6.6=py312hca03da5_0 + - wrapt=1.14.1=py312h80987f9_0 + - wurlitzer=3.0.2=py312hca03da5_0 + - xarray=2023.6.0=py312hca03da5_0 + - xlwings=0.31.4=py312hca03da5_0 + - xyzservices=2022.9.0=py312hca03da5_1 + - xz=5.4.6=h80987f9_1 + - yaml=0.2.5=h1a28f6b_0 + - yaml-cpp=0.8.0=h313beb8_1 + - yapf=0.40.2=py312hca03da5_0 + - yarl=1.9.3=py312h80987f9_0 + - zeromq=4.3.5=h313beb8_0 + - zfp=1.0.0=h313beb8_0 + - zict=3.0.0=py312hca03da5_0 + - zipp=3.17.0=py312hca03da5_0 + - zlib=1.2.13=h18a0788_1 + - zlib-ng=2.0.7=h80987f9_0 + - zope=1.0=py312hca03da5_1 + - zope.interface=5.4.0=py312h80987f9_0 + - zstandard=0.22.0=py312h1a4646a_0 + - zstd=1.5.5=hd90d995_2 + - pip: + - cvxopt==1.3.2 + - dataclasses-json==0.6.7 + - deprecation==2.1.0 + - faiss-cpu==1.9.0.post1 + - fasttext==0.9.3 + - gensim==4.3.3 + - httpx-sse==0.4.0 + - huggingface-hub==0.30.2 + - jiter==0.8.0 + - langchain==0.3.9 + - langchain-community==0.3.9 + - langchain-core==0.3.21 + - langchain-openai==0.2.11 + - langchain-text-splitters==0.3.2 + - langsmith==0.1.147 + - marshmallow==3.23.1 + - openai==1.56.1 + - orjson==3.10.12 + - pdoc==15.0.1 + - pm4py==2.7.13.1 + - pybind11==2.13.6 + - pydantic==2.10.3 + - pydantic-core==2.27.1 + - pydantic-settings==2.6.1 + - pydotplus==2.0.2 + - python-graphviz==0.20.3 + - safetensors==0.5.3 + - sympy==1.13.1 + - tiktoken==0.8.0 + - tokenizers==0.21.1 + - torch==2.6.0 + - transformers==4.51.3 + - typing-extensions==4.12.2 + - typing-inspect==0.9.0 +prefix: /opt/anaconda3 diff --git a/images/occurrence_dfg.png b/images/occurrence_dfg.png deleted file mode 100644 index e9465f5cb6511984822cdbdc49133b2fe18aaa9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37495 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

vO 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 UsYTY5E8_1{CfJORw{i&jU%Sy-1poj5 diff --git a/images/petri_net.png b/images/petri_net.png deleted file mode 100644 index 3271b11b6f55dcb3d809d5c91cbc39a20de148a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37916 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 diff --git a/images/process_tree.png b/images/process_tree.png deleted file mode 100644 index eea983ecdda5b7ecf7b88c019a6f765ffaba7967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50956 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 z 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%0Drzx+H_mo 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 diff --git a/images/starting_data.png b/images/starting_data.png deleted file mode 100644 index b2bf1b12b7901fa7a975dc85f47888e01f12f471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63006 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 diff --git a/issue_event_processing.html b/issue_event_processing.html deleted file mode 100644 index ea12256..0000000 --- a/issue_event_processing.html +++ /dev/null @@ -1,7968 +0,0 @@ - - - - - -issue_event_processing - - - - - - - - - - - - -

- - - - - - - - - -
- - diff --git a/issue_event_processing.ipynb b/issue_event_processing.ipynb deleted file mode 100644 index 240c131..0000000 --- a/issue_event_processing.ipynb +++ /dev/null @@ -1,378 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Introduction\n", - "Process mining helps uncover insights from data that represent different events in a process. It is valuable for understanding workflows, finding inefficiencies, and optimizing development processes. Using Kaiaulu for process mining enables this discovery for Github Events (e.g. creating issues, push events, deleting branches, etc). Allowing users to visualize and analyze event data effectively. This notebook demonstrates how to use Kaiaulu to download and parse Github Event data. As well how to interact with the data to leverage process discovery for deeper analysis. This [video](https://www.youtube.com/watch?v=XLHtvt36g6U&t=1181s) provides an overview of process mining concepts and its applications and can be used as a reference point to begin. This notebook heavily relies on the python package [pm4py](https://github.com/process-intelligence-solutions/pm4py) to create event mappings.\n", - "\n", - "This notebook walks through multiple different models and algorithms for modeling the process. It is reccomended you start with a small number of event issues and gradually build multiple versions to have a deeper understanding of what events are changed the process model. At the bottom of the notebook is an examples section that shows what the models can generate. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Requirements\n", - "\n", - "- Gihub Access Token \n", - "- [Kaiaulu](https://github.com/sailuh/kaiaulu) R package to download data via CLI\n", - "- Python environment with [pm4py](https://github.com/process-intelligence-solutions/pm4py) installed\n", - "- Faker installed for CSV data generation\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Python Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas\n", - "import os\n", - "import pm4py\n", - "import subprocess\n", - "\n", - "from api.csv_generator import *\n", - "from api.process_visual_generation import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Download and Parse data with Kaiaulu ghevents.R (CLI)\n", - "\n", - "#### Set Up and Execute Download Command\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Save and set the current working directory to Kaiaulu.\n", - "cwd = os.getcwd()\n", - "os.chdir(os.path.expanduser(\"~/Desktop/Kaiaulu/Working_issues/kaiaulu/\"))\n", - "\n", - "# To download use the download command specifing the .\n", - "\n", - "command = f\"Rscript exec/ghevents.R download conf/kaiaulu.yml --token_path=~/.ssh/github_token\"\n", - "subprocess.run(command, shell=True, check=True)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Execute Parse Command\n", - "\n", - "As stated above it is reccomended you start with only a few event issues. To do this you can open the created issue_output.csv with Excel or Google Sheets and modify the table to only include a few. \n", - "\n", - "Note: commit_output.csv has been implemented for furture development and is note currently used for any process modeling. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# To Parse use the parse command and specify the .\n", - "\n", - "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml ../rawdata/issue_output.csv ../rawdata/commit_output.csv\"\n", - "subprocess.run(command, shell=True, check=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate CSV data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To start using process mining it is recommnend you generate a \"fake\" .csv event log to see how events change process maps. This is setup below, just generate the csv with the seed set to 2 to start. This function can be used to further explore how different events and number of issues change the graphs generated." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fake event log data saved to ../created_csv.csv\n" - ] - }, - { - "data": { - "text/plain": [ - "'../created_csv.csv'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Example usage \n", - "# Note: Set the output path\n", - "output_csv = \"../created_csv.csv\"\n", - "generate_csv_file(num_issues=1, num_events_per_issue=7, output_csv=output_csv, seed=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To compare graphs generated we can modify the generated csv with the following function. So there will be two .csv files the original and a modified one with one event changed. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Modified CSV saved to ../modified_csv.csv\n" - ] - } - ], - "source": [ - "# Example usage\n", - "# Note: Set the output_csv\n", - "modify_event_in_csv(\"../created_csv.csv\", row_index=5, new_event=\"assigned\", output_csv=\"../modified_csv.csv\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get Start and End Activies From Event Logs\n", - "\n", - "The start and end activies are the first and last recorded events in the process workflow. Marking the entry and exit points where no prior or further events occur. These activies are useful for reasoning through process grpahs and finding inefficencies in a non-graphical manner." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Specify the csv file path .\n", - "csv_path = \"../rawdata/issue_output.csv\"\n", - "\n", - "# Call start_end_activities.\n", - "start_end_activities(csv_path)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Tree from Event Logs\n", - "\n", - "The process tree generated from event logs is our first visual we will generate. It uses the Inductive Miner Algorithm to generate a hierarchical visualization of the workflow. Capturing the sequences and dependecies of events. The algorithm is based on process discovery, and will highligh decision points and parallel activities. It is important for understanding the overall flow and structure of events and identifiying transitions and potential ineffcientices in the process. \n", - "\n", - "We will need a directory to save the images for methods from here on. Specify the output_dir if it does not already exist it will create it. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Specify the directory to save images.\n", - "output_dir = \"../rawdata/images/\"\n", - "\n", - "output_dir = os.path.expanduser(output_dir)\n", - "os.makedirs(output_dir, exist_ok=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Call generate_tree.\n", - "generate_tree_inductive(csv_path, output_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Graph with or without filtering\n", - "\n", - "We will create a BPMN (Buiness Process Model and Notation) with the same inductive miner from the last part creating the tree.\n", - "The BPMN model is a standard graphical representation of the process, it is the simpilest graph we will generate. It highlights the sequences of activies, decision points, and possible parallel paths in the process model. Compared to the tree it is easier to identify ineffcienceies and deviation the process flow from the simplistic nature. \n", - "\n", - "Filtering can also be applied to the process. By applying filtering we refine the model to focus on the most signifcant part of the process. It does this by reducing the noise and making the key patterns more apparent. This noise could be events that are not required to complete the process or that stray away from the main process for example. You can set the noise threshold as a parameter, note the default is 0.0. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Call generate_graph_filtered and specify a noise threshold. \n", - "generate_graph_inductive(csv_path, output_dir, 0.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generate Performance Graph: Time or Occurrence Edge Weights\n", - "\n", - "### Time Edge Weight Graph\n", - "The time edge weight graph visualizes the process flow with a focus on the time spent between activities. It uses the Performance DFG (Directly-Follows Graph). Every edge has a value which represents the interval between consecutive events. These time-based relations are useful to show where the process may need to be optimized to reduce the overall cycle time in the process. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Call generate_performance_graph.\n", - "generate_performance_graph_dfg(csv_path, output_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Occurrence Edge Weight Graph\n", - "\n", - "The DFG (Directly-Follows Graph) generates the graph with occurrence edges. The weight is based on the frequency of transitions between nodes. This model highlights the most common paths, allowing for a better understanding of the domnant workflow patterns. It can help identify redudent steps in the process. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Call generate_count_graph.\n", - "generate_count_graph_dfg(csv_path, output_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Petri Net\n", - "\n", - "A Petri Net is a commonly used formal model used to represent workflows in automation and process mining. Unlike simplier models such as BPMN, Petri Nets represent conditions, tokens, and transitions. Instead of just showing the overview of the process. \n", - "\n", - "Important Symbols: \n", - "\n", - "- Circle with black center dot: Marks the start of the process.\n", - "- Circle with black square: Marks the end of the process.\n", - "- Empty circles: State or conditions in the process.\n", - "- Black boxes: Transitions that may be considered special. Example: Silent steps that don't correspond to events but may be needed for logical execution of the process." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Call generate_petri_net.\n", - "generate_petri_net_inductive(csv_path, output_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Examples\n", - "\n", - "To show the functionality of each model we will make it easy by working with only one issue with multiple events. We will use the following issue 2 from Kaiaulu:\n", - "\n", - "![Starting Data](images/starting_data.png)\n", - "\n", - "### Process Tree\n", - "\n", - "![Process Tree](images/process_tree.png)\n", - "\n", - "We see we have generated a simple process tree with sequences and xor actions.\n", - "\n", - "### Process Graph (BPMN)\n", - "\n", - "![Process Graph](images/process_graph.png)\n", - "\n", - "The process graph shows up the simpliest visual. We can start at the green circle. From there the issue was labeld and then was either assigned-milestoned-closed. Or it was unlabled aftering being labeled then referenced-closed. From the closed state the process either ended or the issue was reopened and repeated.\n", - "\n", - "### Performance Graph (Time Weighted)\n", - "\n", - "![Time Weighted Graph](images/performance_dfg.png)\n", - "\n", - "The time weighted graph starts with the circle with the center dot. From there it goes through the process above but each edge has a weight based on the total time between events. We can see the time from the issue being referenced-closed was 9 months. Suggesting maybe someone forgot to close the event. This indicates a inefficiency within this Github issue process.\n", - "\n", - "### Performance Graph (Occurrence Weighted)\n", - "\n", - "![Occurrence Weighted](images/occurrence_dfg.png)\n", - "\n", - "With the occurrence weighted graph we see different colors for nodes annotated with multiple occurrences. To be exact the \"closed\" and \"labled\" event happen twice. Showing us the important points in the issue process.\n", - "\n", - "### Petri Net Graph\n", - "\n", - "![Petri Net](images/petri_net.png)\n", - "\n", - "Finally, the Petri Net is similar to the process graph. Except we can see states in the process represented by circles. As well as the special transitions represented by the black boxes.\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "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.12.4" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/issue_event_processing.ipynb b/notebooks/issue_event_processing.ipynb new file mode 100644 index 0000000..23b6c96 --- /dev/null +++ b/notebooks/issue_event_processing.ipynb @@ -0,0 +1,389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "Event logs are the foundation of process mining. They capture records of activities within a system, providing information about when actions occur and what those actions are. For example, in GitHub Issue Events, actions such as assigning users, labeling issues, and closing issues are recorded. Together, these events tell the full story of the process from start to finish. Event logs can be transformed into differnt process graphs, which visually represent the flow of activities and how they connect. These graphs make it easier to identify inefficiencies, bottlenecks, and deviations from expected workflows. They provide valuable insights for process improvement and optimization. \n", + "\n", + "In this notebook, we demonstrate how to create process graphs using GitHub Issue Event Logs. Specifically, we use [Kaiaulu R package](https://github.com/sailuh/kaiaulu) to download and parse GitHub Issue Events. Capturing the lifecycle of an issue from creation, through assignment, discussion, and to closure.\n", + "Although these example's will focus on GitHub data, the techniques shown here can be applied to any event log that follows a similar format. This notebook serves as a demonstration of how event data can be prepared and explored for process mining. \n", + "\n", + "Note: For more information on process mining it is reccommeneded you refer to this [video](https://www.youtube.com/watch?v=XLHtvt36g6U&t=1181s). Sailuh/process mining relies heavily on the python package [pm4py](https://github.com/process-intelligence-solutions/pm4py), refer to the documentation for more detailed information regarding algorithms and models. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Requirements\n", + "\n", + "- Gihub Access Token \n", + "- [Kaiaulu](https://github.com/sailuh/kaiaulu) R package to download data via CLI\n", + "- Python environment with [pm4py](https://github.com/process-intelligence-solutions/pm4py) installed\n", + "- Faker installed for CSV data generation\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Python Imports\n", + "\n", + "import sys\n", + "import os\n", + "sys.path.append(os.path.abspath(os.path.join(os.getcwd(), '..')))\n", + "import pandas\n", + "import pm4py\n", + "import subprocess\n", + "\n", + "from api import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Overview\n", + "\n", + "To begin process mining, we first need the data in a properly formatted .csv file. This is where [Kaiaulu](https://github.com/sailuh/kaiaulu) comes in. Kaiaulu is a R package for software repository mining that provides a set of functions organized as an API. These functions allow us to downlaod and parse GitHub issue event data in our case. **In our examples we'll download and analysis issue event data from the Kaiaulu GitHub repository itself**. Rather than calling these functions from the project we will use an executable command-line interface (CLI) that is provided by kaiaulu to keep the processes indepenedent. Because this notebook and Kaiaulu are self contained, we assume the following folder organization: \n", + "\n", + "- ```kaiaulu/kaiaulu/exec/ghevents.R```\n", + "- ```kaiaulu/rawdata/```\n", + "- ```process_mining/notebooks/issue_event_processing.ipynb```\n", + "\n", + "Note: In this structure, the outer kaiaulu/ folder represents the project scope, while the inner kaiaulu/ contains the actural R package with functions. It is assumed the process_mining/ folder and the outer kaiaulu/ folder are together in the same folder.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### GitHub Events\n", + "\n", + "The executable CLI requires a project configuration file to define the scope of the data we want to collect. Because we want to download Kaiaulu GitHub data we will be using the correponding **kaiaulu.yml** config file. \n", + "We are interested in the three fields from the config: \n", + "- ```repo``` : the name of the GitHub repo\n", + "- ```owner``` : the GitHub user/organization\n", + "- ```issue_event``` : the save path for the raw issue event data (also default process graph save folder)\n", + "\n", + "By default the issue_event path points to a directory called rawdata, located outside both the process_mining and Kaiaulu folders. The path structure is project dependent, hence the relative path is : **../rawdata/kaiaulu/sailuh_kaiaulu/issue_event/**\n", + "\n", + "Finally, the CLI requires a [GitHub API token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) to increase the request rate limite during data downloads. This token should be saved by default to the expected path **~/.ssh/github_token**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cwd = os.getcwd()\n", + "\n", + "kaiaulu_path = os.path.abspath(os.path.join(\"..\", \"..\", \"kaiaulu\", \"kaiaulu\"))\n", + "token_path = \"~/.ssh/github_token\"\n", + "\n", + "os.chdir(kaiaulu_path)\n", + "# To download use the parse command and specify the .\n", + "command = f\"Rscript exec/ghevents.R download conf/kaiaulu.yml --token_path={token_path}\"\n", + "subprocess.run(command, shell=True, check=True)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once we have the GitHub issue event rawdata (JSON) we may now parse it into a event log in .csv format. By default the .csv is saved to the folder where this package was downloaded. For example if it was downloaded to /Desktop/process_mining/... the .csv will have the following path /Desktop/issue_output.csv" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "csv_folder = os.path.abspath(os.path.join(cwd, \"..\",\"..\"))\n", + "\n", + "# To parse use the parse command and specify the .\n", + "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml {csv_folder}/issue_output.csv\"\n", + "subprocess.run(command, shell=True, check=True)\n", + "\n", + "os.chdir(cwd)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have a parsed event log in CSV format, we can load it using pandas and preview the first five rows to get a sense of the data structure." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "csv_path = os.path.join(csv_folder, \"issue_output.csv\")\n", + "\n", + "df_issues = pd.read_csv(csv_path)\n", + "print(df_issues.head(5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, the parsed event log conatins all the right data to see the entire process. However, just by reading each event induviually we can see it doens't give us good picture of the entire process. Process mining will solve this by stitching the events together into a visual. It provides a overview of how processes actualy unfold. \n", + "\n", + "It is important to note for process mining we will only be interested in the ```created_at```, ```event```, and ```issue_number``` columns. The others are not needed to generate graphs. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Process Mining GitHub Events\n", + "\n", + "Now we will generate the visualizations in practice using the data we dowloaded and parsed from the Kaiaulu Github issues. \n", + "\n", + "The process tree is our first visual we will generate. It uses the Inductive Miner Algorithm to generate a hierarchical visualization of the workflow. Capturing the sequences and dependecies of events. The algorithm is based on process discovery, and will highligh decision points and parallel activities. It is important for understanding the overall flow and structure of events and identifiying transitions and potential ineffcientices in the process. \n", + "\n", + "Note: You specifiy action as **view**, **save**, or **both** to determine what happens to the visualization. By default the generate functions will only view the graph. For our example we specify output_dir as the folder where process_mining was downloaded. This means for actions **save** and **both**, the images will be saved to the folder where process_mining was downloaded unless otherwise specified. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Specify the directory to save images\n", + "output_dir = \"../../\"\n", + "\n", + "generate_tree_inductive(csv_path, output_dir, action=\"both\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The visual is generated in the notebook and we can find the file located outside of process_mining.\n", + "\n", + "We will create a BPMN (Buiness Process Model and Notation) with the same inductive miner from the last part creating the tree.\n", + "The BPMN model is a standard graphical representation of the process, it is the simpilest graph we will generate. It highlights the sequences of activies, decision points, and possible parallel paths in the process model. Compared to the tree it is easier to identify ineffcienceies and deviation the process flow from the simplistic nature. \n", + "\n", + "Filtering can also be applied to the process. By applying filtering we refine the model to focus on the most signifcant part of the process. It does this by reducing the noise and making the key patterns more apparent. This noise could be events that are not required to complete the process or that stray away from the main process for example. You can set the ```noise_threshold``` as a parameter, note the default is 0.0. We will set a 0.8 ```noise_threshold``` to reduce the graph size.\n", + "\n", + "From here on we will only view the visuals to not create unncecesary files, but as stated above this parameter can be changed to **save** or **both**. You may need to expand the visual to see events." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "generate_graph_inductive(csv_path, noise_threshold=0.8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next the time edge weight graph visualizes the process flow with a focus on the time spent between activities. It uses the Performance DFG (Directly-Follows Graph). Every edge has a value which represents the interval between consecutive events. These time-based relations are useful to show where the process may need to be optimized to reduce the overall cycle time in the process. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "generate_performance_graph_dfg(csv_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are starting to get some complex grahps. This is because the overall process we are looking at (Kaiaulu Github Issue Events) is very large. It contains 300+ GitHub issues and a total 3600+ events at the creation of this notebook. At the end of this notebook provides graphs with minimal processes to understand the graphs better.\n", + "\n", + "Another DFG (Directly-Follows Graph) generates the graph with occurrence edges. The weight is based on the frequency of transitions between nodes. This model highlights the most common paths, allowing for a better understanding of the domnant workflow patterns. It can help identify redudent steps in the process. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "generate_count_graph_dfg(csv_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, the Petri Net is a commonly used formal model used to represent workflows in automation and process mining. Unlike simplier models such as BPMN, Petri Nets represent conditions, tokens, and transitions. Instead of just showing the overview of the process. \n", + "\n", + "Important Symbols: \n", + "\n", + "- Circle with black center dot: Marks the start of the process.\n", + "- Circle with black square: Marks the end of the process.\n", + "- Empty circles: State or conditions in the process.\n", + "- Black boxes: Transitions that may be considered special. Example: Silent steps that don't correspond to events but may be needed for logical execution of the process." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "generate_petri_net_inductive(csv_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A useful function to call in conjunction when generating graphs is **start_end_activities(csv_path)**. It finds the start and end activites for the process. \n", + "The start and end activies are the first and last recorded events in the process workflow. Marking the entry and exit points where no prior or further events occur. These activies are useful for reasoning through process grpahs and finding inefficencies in a non-graphical manner." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "start_end_activities(csv_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Understanding Process Graphs\n", + "\n", + "Now that we have seen all the process mining functionally we can scale the process down to better understand what is happening. There will be three \"experiements\" we run.\n", + "\n", + "For these we will need small event logs. These are artificially generated with functiuons from ```api/csv_generator.py```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "generated_csv_path = f\"{csv_folder}/generated_csv.csv\"\n", + "\n", + "generate_fake_event_log(num_issues=1, num_events_per_issue=7, output_csv=generated_csv_path, seed=42)\n", + "\n", + "event_log_df = pandas.read_csv(generated_csv_path)\n", + "print(event_log_df.head(7))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The event log is very straight forward with each event appearing in order of ```created_at```. We will first generate a BPMN graph with no filtering to get a baseline." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "generate_graph_inductive(generated_csv_path, noise_threshold=0.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will re-run the function to generate the graph. Notice that the resulting graph remains unchanged, demonstrating that the Inductive Miner algorithm produces consistent and reproducible results when applied to the same event log." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "generate_graph_inductive(generated_csv_path, noise_threshold=0.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we will change one event from the event log demonstrating the change to the process graph created. We are changing the event on row 4 to be mentioned instead of milestoned. This will shift the cycle in the process to the right changing it to \"mentioned\". \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "modify_event(event_log_df, row_index=4, new_event=\"mentioned\")\n", + "print(event_log_df.head(7))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "event_log_df.to_csv(\"../../modified_csv.csv\")\n", + "\n", + "generate_graph_inductive(\"../../modified_csv.csv\", noise_threshold=0.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Conclusion\n", + "\n", + "Analyzing long and complex event logs can quickly become overwhelming, especially when trying to understand the underlying process structure. To manage this complexity, it is recommended to start with a smaller subset of data and gradually build up. A practical approach is to begin with only a few issues and examine how they translate into the process graph. This allows for clearer insights and easier debugging as the process grows.\n", + "\n", + "This can be done by reading the csv into a pandas DataFrame and manipulating the data with Python. Alternatively the CSV can be modified with Excel or Google Sheets. The process graph generation functions remain flexible by requiring a CSV input, allowing them to be called from outside Python and integrated with other tools or systems.\n", + "\n", + "By incrementally expanding the event log and re-generating the visualization, users can develop a deeper, more manageable understanding of the overall process behavior." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 9a57d654beca814fb095ec90158759ddd28055f6 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Thu, 1 May 2025 16:29:03 -1000 Subject: [PATCH 10/13] i #1 corrected paths and imports - Corrected relative path and api import --- notebooks/issue_event_processing.ipynb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/notebooks/issue_event_processing.ipynb b/notebooks/issue_event_processing.ipynb index 23b6c96..c9a8598 100644 --- a/notebooks/issue_event_processing.ipynb +++ b/notebooks/issue_event_processing.ipynb @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -36,11 +36,12 @@ "import sys\n", "import os\n", "sys.path.append(os.path.abspath(os.path.join(os.getcwd(), '..')))\n", - "import pandas\n", - "import pm4py\n", + "import pandas as pd\n", "import subprocess\n", "\n", - "from api import *" + "from api.csv_generator import *\n", + "from api.process_discovery import *\n", + "from api.io import *\n" ] }, { @@ -106,7 +107,8 @@ "metadata": {}, "outputs": [], "source": [ - "csv_folder = os.path.abspath(os.path.join(cwd, \"..\",\"..\"))\n", + "csv_folder = os.path.abspath(os.path.join(cwd, \"..\",\"..\", \"..\"))\n", + "\n", "\n", "# To parse use the parse command and specify the .\n", "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml {csv_folder}/issue_output.csv\"\n", @@ -286,7 +288,7 @@ "\n", "generate_fake_event_log(num_issues=1, num_events_per_issue=7, output_csv=generated_csv_path, seed=42)\n", "\n", - "event_log_df = pandas.read_csv(generated_csv_path)\n", + "event_log_df = pd.read_csv(generated_csv_path)\n", "print(event_log_df.head(7))" ] }, From bd4dd92de3cb6088a1715914b1bd8761525dc477 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Tue, 6 May 2025 15:33:40 -1000 Subject: [PATCH 11/13] i #1 Updated env and finalized file paths - env.yml changed - file paths in notebook changed --- env.yml | 552 +------------------------ notebooks/issue_event_processing.ipynb | 16 +- 2 files changed, 13 insertions(+), 555 deletions(-) diff --git a/env.yml b/env.yml index e67660c..d67530c 100644 --- a/env.yml +++ b/env.yml @@ -1,548 +1,8 @@ -name: base -channels: - - defaults +name: process_mining dependencies: - - _anaconda_depends=2024.06=py312_openblas_2 - - abseil-cpp=20230802.0=h313beb8_2 - - aext-assistant=4.0.15=py312hca03da5_jl4_0 - - aext-assistant-server=4.0.15=py312hca03da5_0 - - aext-core=4.0.15=py312hca03da5_jl4_0 - - aext-core-server=4.0.15=py312hca03da5_1 - - aext-panels=4.0.15=py312hca03da5_0 - - aext-panels-server=4.0.15=py312hca03da5_0 - - aext-share-notebook=4.0.15=py312hca03da5_0 - - aext-share-notebook-server=4.0.15=py312hca03da5_0 - - aext-shared=4.0.15=py312hca03da5_0 - - aiobotocore=2.12.3=py312hca03da5_0 - - aiohttp=3.9.5=py312h80987f9_0 - - aioitertools=0.7.1=pyhd3eb1b0_0 - - aiosignal=1.2.0=pyhd3eb1b0_0 - - alabaster=0.7.16=py312hca03da5_0 - - altair=5.0.1=py312hca03da5_0 - - anaconda-anon-usage=0.4.4=py312hd6b623d_100 - - anaconda-catalogs=0.2.0=py312hca03da5_1 - - anaconda-client=1.12.3=py312hca03da5_0 - - anaconda-cloud-auth=0.5.1=py312hca03da5_0 - - anaconda-navigator=2.6.0=py312hca03da5_0 - - anaconda-project=0.11.1=py312hca03da5_0 - - anaconda-toolbox=4.0.15=py312hca03da5_0 - - annotated-types=0.6.0=py312hca03da5_0 - - anyio=4.2.0=py312hca03da5_0 - - aom=3.6.0=h313beb8_0 - - appdirs=1.4.4=pyhd3eb1b0_0 - - applaunchservices=0.3.0=py312hca03da5_0 - - appnope=0.1.3=py312hca03da5_1001 - - appscript=1.1.2=py312h80987f9_0 - - archspec=0.2.3=pyhd3eb1b0_0 - - argon2-cffi=21.3.0=pyhd3eb1b0_0 - - argon2-cffi-bindings=21.2.0=py312h80987f9_0 - - arrow=1.2.3=py312hca03da5_1 - - arrow-cpp=14.0.2=hc7aafb3_1 - - astroid=2.14.2=py312hca03da5_0 - - astropy=6.1.0=py312ha86b861_0 - - astropy-iers-data=0.2024.6.3.0.31.14=py312hca03da5_0 - - asttokens=2.0.5=pyhd3eb1b0_0 - - async-lru=2.0.4=py312hca03da5_0 - - atomicwrites=1.4.0=py_0 - - attrs=23.1.0=py312hca03da5_0 - - automat=20.2.0=py_0 - - autopep8=2.0.4=pyhd3eb1b0_0 - - aws-c-auth=0.6.19=h80987f9_0 - - aws-c-cal=0.5.20=h80987f9_0 - - aws-c-common=0.8.5=h80987f9_0 - - aws-c-compression=0.2.16=h80987f9_0 - - aws-c-event-stream=0.2.15=h313beb8_0 - - aws-c-http=0.6.25=h80987f9_0 - - aws-c-io=0.13.10=h80987f9_0 - - aws-c-mqtt=0.7.13=h80987f9_0 - - aws-c-s3=0.1.51=h80987f9_0 - - aws-c-sdkutils=0.1.6=h80987f9_0 - - aws-checksums=0.1.13=h80987f9_0 - - aws-crt-cpp=0.18.16=h313beb8_0 - - aws-sdk-cpp=1.10.55=h313beb8_0 - - babel=2.11.0=py312hca03da5_0 - - bcrypt=3.2.0=py312h80987f9_1 - - beautifulsoup4=4.12.3=py312hca03da5_0 - - binaryornot=0.4.4=pyhd3eb1b0_1 - - black=24.4.2=py312hca03da5_0 - - blas=1.0=openblas - - bleach=4.1.0=pyhd3eb1b0_0 - - blinker=1.6.2=py312hca03da5_0 - - blosc=1.21.3=h313beb8_0 - - bokeh=3.4.1=py312h989b03a_0 - - boltons=23.0.0=py312hca03da5_0 - - boost-cpp=1.82.0=h48ca7d4_2 - - botocore=1.34.69=py312hca03da5_0 - - bottleneck=1.3.7=py312ha86b861_0 - - brotli=1.0.9=h80987f9_8 - - brotli-bin=1.0.9=h80987f9_8 - - brotli-python=1.0.9=py312h313beb8_8 - - brunsli=0.1=hc377ac9_1 - - bzip2=1.0.8=h80987f9_6 - - c-ares=1.19.1=h80987f9_0 - - c-blosc2=2.12.0=h7df6c2f_0 - - ca-certificates=2024.7.2=hca03da5_0 - - cachetools=5.3.3=py312hca03da5_0 - - cctools=949.0.1=hc179dcd_25 - - cctools_osx-arm64=949.0.1=h332cad3_25 - - certifi=2024.7.4=py312hca03da5_0 - - cffi=1.16.0=py312h80987f9_1 - - cfitsio=3.470=h7f6438f_7 - - chardet=4.0.0=py312hca03da5_1003 - - charls=2.2.0=hc377ac9_0 - - charset-normalizer=2.0.4=pyhd3eb1b0_0 - - click=8.1.7=py312hca03da5_0 - - cloudpickle=2.2.1=py312hca03da5_0 - - colorama=0.4.6=py312hca03da5_0 - - colorcet=3.1.0=py312hca03da5_0 - - comm=0.2.1=py312hca03da5_0 - - conda=24.7.1=py312hca03da5_0 - - conda-build=24.5.1=py312hca03da5_0 - - conda-content-trust=0.2.0=py312hca03da5_1 - - conda-index=0.5.0=py312hca03da5_0 - - conda-libmamba-solver=24.1.0=pyhd3eb1b0_0 - - conda-pack=0.7.1=py312hca03da5_0 - - conda-package-handling=2.3.0=py312hca03da5_0 - - conda-package-streaming=0.10.0=py312hca03da5_0 - - conda-repo-cli=1.0.88=py312hca03da5_0 - - conda-token=0.5.0=pyhd3eb1b0_0 - - constantly=23.10.4=py312hca03da5_0 - - contourpy=1.2.0=py312h48ca7d4_0 - - cookiecutter=2.6.0=py312hca03da5_0 - - cryptography=42.0.5=py312hd4332d6_1 - - cssselect=1.2.0=py312hca03da5_0 - - curl=8.7.1=h02f6b3c_0 - - cycler=0.11.0=pyhd3eb1b0_0 - - cyrus-sasl=2.1.28=h9131b1a_1 - - cytoolz=0.12.2=py312h80987f9_0 - - dask=2024.5.0=py312hca03da5_0 - - dask-core=2024.5.0=py312hca03da5_0 - - dask-expr=1.1.0=py312hca03da5_0 - - datashader=0.16.2=py312hca03da5_0 - - dav1d=1.2.1=h80987f9_0 - - debugpy=1.6.7=py312h313beb8_0 - - decorator=5.1.1=pyhd3eb1b0_0 - - defusedxml=0.7.1=pyhd3eb1b0_0 - - diff-match-patch=20200713=pyhd3eb1b0_0 - - dill=0.3.8=py312hca03da5_0 - - distributed=2024.5.0=py312hca03da5_0 - - distro=1.9.0=py312hca03da5_0 - - docstring-to-markdown=0.11=py312hca03da5_0 - - docutils=0.18.1=py312hca03da5_3 - - entrypoints=0.4=py312hca03da5_0 - - et_xmlfile=1.1.0=py312hca03da5_1 - - executing=0.8.3=pyhd3eb1b0_0 - - expat=2.6.2=h313beb8_0 - - filelock=3.13.1=py312hca03da5_0 - - flake8=7.0.0=py312hca03da5_0 - - flask=3.0.3=py312hca03da5_0 - - fmt=9.1.0=h48ca7d4_1 - - fonttools=4.51.0=py312h80987f9_0 - - freetype=2.12.1=h1192e45_0 - - frozendict=2.4.2=py312hca03da5_0 - - frozenlist=1.4.0=py312h80987f9_0 - - fsspec=2024.3.1=py312hca03da5_0 - - gettext=0.21.0=h13f89a0_1 - - gflags=2.2.2=h313beb8_1 - - giflib=5.2.1=h80987f9_3 - - gitdb=4.0.7=pyhd3eb1b0_0 - - gitpython=3.1.37=py312hca03da5_0 - - glib=2.78.4=h313beb8_0 - - glib-tools=2.78.4=h313beb8_0 - - glog=0.5.0=h313beb8_1 - - greenlet=3.0.1=py312h313beb8_0 - - grpc-cpp=1.48.2=hc60591f_4 - - gst-plugins-base=1.14.1=h313beb8_1 - - gstreamer=1.14.1=h80987f9_1 - - gtest=1.14.0=h48ca7d4_1 - - h11=0.14.0=py312hca03da5_0 - - h5py=3.11.0=py312haac6407_0 - - hdf5=1.12.1=h05c076b_3 - - heapdict=1.0.1=pyhd3eb1b0_0 - - holoviews=1.19.0=py312hca03da5_0 - - httpcore=1.0.2=py312hca03da5_0 - - httpx=0.27.0=py312hca03da5_0 - - hvplot=0.10.0=py312hca03da5_0 - - hyperlink=21.0.0=pyhd3eb1b0_0 - - icu=73.1=h313beb8_0 - - idna=3.7=py312hca03da5_0 - - imagecodecs=2023.1.23=py312h75b721f_1 - - imageio=2.33.1=py312hca03da5_0 - - imagesize=1.4.1=py312hca03da5_0 - - imbalanced-learn=0.12.3=py312hca03da5_1 - - importlib-metadata=7.0.1=py312hca03da5_0 - - incremental=22.10.0=pyhd3eb1b0_0 - - inflection=0.5.1=py312hca03da5_1 - - iniconfig=1.1.1=pyhd3eb1b0_0 - - intake=0.7.0=py312hca03da5_0 - - intervaltree=3.1.0=pyhd3eb1b0_0 - - ipykernel=6.28.0=py312hca03da5_0 - - ipython=8.25.0=py312hca03da5_0 - - ipython_genutils=0.2.0=pyhd3eb1b0_1 - - ipywidgets=7.8.1=py312hca03da5_0 - - isort=5.13.2=py312hca03da5_0 - - itemadapter=0.3.0=pyhd3eb1b0_0 - - itemloaders=1.1.0=py312hca03da5_0 - - itsdangerous=2.2.0=py312hca03da5_0 - - jaraco.classes=3.2.1=pyhd3eb1b0_0 - - jedi=0.18.1=py312hca03da5_1 - - jellyfish=1.0.1=py312h15d1925_0 - - jinja2=3.1.4=py312hca03da5_0 - - jmespath=1.0.1=py312hca03da5_0 - - joblib=1.4.2=py312hca03da5_0 - - jpeg=9e=h80987f9_1 - - jq=1.6=h1a28f6b_1 - - json5=0.9.6=pyhd3eb1b0_0 - - jsonpatch=1.33=py312hca03da5_1 - - jsonpointer=2.1=pyhd3eb1b0_0 - - jsonschema=4.19.2=py312hca03da5_0 - - jsonschema-specifications=2023.7.1=py312hca03da5_0 - - jupyter=1.0.0=py312hca03da5_9 - - jupyter-lsp=2.2.0=py312hca03da5_0 - - jupyter_client=8.6.0=py312hca03da5_0 - - jupyter_console=6.6.3=py312hca03da5_1 - - jupyter_core=5.7.2=py312hca03da5_0 - - jupyter_events=0.10.0=py312hca03da5_0 - - jupyter_server=2.14.1=py312hca03da5_0 - - jupyter_server_terminals=0.4.4=py312hca03da5_1 - - jupyterlab=4.0.11=py312hca03da5_0 - - jupyterlab-variableinspector=3.1.0=py312hca03da5_0 - - jupyterlab_pygments=0.1.2=py_0 - - jupyterlab_server=2.25.1=py312hca03da5_0 - - jupyterlab_widgets=1.0.0=pyhd3eb1b0_1 - - jxrlib=1.1=h1a28f6b_2 - - keyring=24.3.1=py312hca03da5_0 - - kiwisolver=1.4.4=py312h313beb8_0 - - krb5=1.20.1=hf3e1bf2_1 - - lazy-object-proxy=1.10.0=py312h80987f9_0 - - lazy_loader=0.4=py312hca03da5_0 - - lcms2=2.12=hba8e193_0 - - ld64=530=hb29bf3f_25 - - ld64_osx-arm64=530=h001ce53_25 - - ldid=2.1.5=h20b2a84_3 - - lerc=3.0=hc377ac9_0 - - libaec=1.0.4=hc377ac9_1 - - libarchive=3.6.2=h62fee54_3 - - libavif=0.11.1=h80987f9_0 - - libboost=1.82.0=h0bc93f9_2 - - libbrotlicommon=1.0.9=h80987f9_8 - - libbrotlidec=1.0.9=h80987f9_8 - - libbrotlienc=1.0.9=h80987f9_8 - - libclang=14.0.6=default_h1b80db6_1 - - libclang13=14.0.6=default_h24352ff_1 - - libcurl=8.7.1=h3e2b118_0 - - libcxx=14.0.6=h848a8c0_0 - - libdeflate=1.17=h80987f9_1 - - libedit=3.1.20230828=h80987f9_0 - - libev=4.33=h1a28f6b_1 - - libevent=2.1.12=h02f6b3c_1 - - libffi=3.4.4=hca03da5_1 - - libgfortran=5.0.0=11_3_0_hca03da5_28 - - libgfortran5=11.3.0=h009349e_28 - - libglib=2.78.4=h0a96307_0 - - libiconv=1.16=h80987f9_3 - - liblief=0.12.3=h313beb8_0 - - libllvm14=14.0.6=h7ec7a93_3 - - libmamba=1.5.8=haeffa04_2 - - libmambapy=1.5.8=py312h1c5506f_2 - - libnghttp2=1.57.0=h62f6fdd_0 - - libopenblas=0.3.21=h269037a_0 - - libpng=1.6.39=h80987f9_0 - - libpq=12.17=h02f6b3c_0 - - libprotobuf=3.20.3=h514c7bf_0 - - libsodium=1.0.18=h1a28f6b_0 - - libsolv=0.7.24=h514c7bf_1 - - libspatialindex=1.9.3=hc377ac9_0 - - libssh2=1.11.0=h3e2b118_0 - - libthrift=0.15.0=h73c2103_2 - - libtiff=4.5.1=h313beb8_0 - - libwebp-base=1.3.2=h80987f9_0 - - libxml2=2.10.4=h0b34f26_2 - - libxslt=1.1.37=h80987f9_1 - - libzopfli=1.0.3=hc377ac9_0 - - linkify-it-py=2.0.0=py312hca03da5_0 - - llvm-openmp=14.0.6=hc6e5704_0 - - llvmlite=0.42.0=py312h313beb8_0 - - locket=1.0.0=py312hca03da5_0 - - lxml=5.2.1=py312h50ffb84_0 - - lz4=4.3.2=py312h80987f9_0 - - lz4-c=1.9.4=h313beb8_1 - - lzo=2.10=h1a28f6b_2 - - markdown=3.4.1=py312hca03da5_0 - - markdown-it-py=2.2.0=py312hca03da5_1 - - markupsafe=2.1.3=py312h80987f9_0 - - matplotlib=3.8.4=py312hca03da5_0 - - matplotlib-base=3.8.4=py312hd77ebd4_0 - - matplotlib-inline=0.1.6=py312hca03da5_0 - - mccabe=0.7.0=pyhd3eb1b0_0 - - mdit-py-plugins=0.3.0=py312hca03da5_0 - - mdurl=0.1.0=py312hca03da5_0 - - menuinst=2.1.1=py312hca03da5_0 - - mistune=2.0.4=py312hca03da5_0 - - more-itertools=10.1.0=py312hca03da5_0 - - mpmath=1.3.0=py312hca03da5_0 - - msgpack-python=1.0.3=py312h48ca7d4_0 - - multidict=6.0.4=py312h80987f9_0 - - multipledispatch=0.6.0=py312hca03da5_0 - - mypy=1.10.0=py312h80987f9_0 - - mypy_extensions=1.0.0=py312hca03da5_0 - - mysql=5.7.24=ha71a6ea_2 - - navigator-updater=0.5.1=py312hca03da5_0 - - nbclient=0.8.0=py312hca03da5_0 - - nbconvert=7.10.0=py312hca03da5_0 - - nbformat=5.9.2=py312hca03da5_0 - - ncurses=6.4=h313beb8_0 - - nest-asyncio=1.6.0=py312hca03da5_0 - - networkx=3.2.1=py312hca03da5_0 - - nltk=3.8.1=py312hca03da5_0 - - notebook=7.0.8=py312hca03da5_0 - - notebook-shim=0.2.3=py312hca03da5_0 - - numba=0.59.1=py312hd77ebd4_0 - - numexpr=2.8.7=py312h0f3ea24_0 - - numpy=1.26.4=py312h7f4fdc5_0 - - numpy-base=1.26.4=py312he047099_0 - - numpydoc=1.7.0=py312hca03da5_0 - - oniguruma=6.9.7.1=h1a28f6b_0 - - openjpeg=2.3.0=h7a6adac_2 - - openpyxl=3.1.2=py312h80987f9_0 - - openssl=3.0.14=h80987f9_0 - - orc=1.7.4=hdca1487_1 - - overrides=7.4.0=py312hca03da5_0 - - packaging=23.2=py312hca03da5_0 - - pandas=2.2.2=py312hd77ebd4_0 - - pandocfilters=1.5.0=pyhd3eb1b0_0 - - panel=1.4.4=py312hca03da5_0 - - param=2.1.0=py312hca03da5_0 - - parsel=1.8.1=py312hca03da5_0 - - parso=0.8.3=pyhd3eb1b0_0 - - partd=1.4.1=py312hca03da5_0 - - patch=2.7.6=h1a28f6b_1001 - - pathspec=0.10.3=py312hca03da5_0 - - patsy=0.5.6=py312hca03da5_0 - - pcre2=10.42=hb066dcc_1 - - pexpect=4.8.0=pyhd3eb1b0_3 - - pickleshare=0.7.5=pyhd3eb1b0_1003 - - pillow=10.3.0=py312h80987f9_0 - - pip=24.0=py312hca03da5_0 - - pkce=1.0.3=py312hca03da5_0 - - pkginfo=1.10.0=py312hca03da5_0 - - platformdirs=3.10.0=py312hca03da5_0 - - plotly=5.22.0=py312h989b03a_0 - - pluggy=1.0.0=py312hca03da5_1 - - ply=3.11=py312hca03da5_1 - - prometheus_client=0.14.1=py312hca03da5_0 - - prompt-toolkit=3.0.43=py312hca03da5_0 - - prompt_toolkit=3.0.43=hd3eb1b0_0 - - protego=0.1.16=py_0 - - protobuf=3.20.3=py312h313beb8_0 - - psutil=5.9.0=py312h80987f9_0 - - ptyprocess=0.7.0=pyhd3eb1b0_2 - - pure_eval=0.2.2=pyhd3eb1b0_0 - - py-cpuinfo=9.0.0=py312hca03da5_0 - - py-lief=0.12.3=py312h313beb8_0 - - pyarrow=14.0.2=py312h8604a13_0 - - pyasn1=0.4.8=pyhd3eb1b0_0 - - pyasn1-modules=0.2.8=py_0 - - pybind11-abi=5=hd3eb1b0_0 - - pycodestyle=2.11.1=py312hca03da5_0 - - pycosat=0.6.6=py312h80987f9_1 - - pycparser=2.21=pyhd3eb1b0_0 - - pyct=0.5.0=py312hca03da5_0 - - pycurl=7.45.2=py312h02f6b3c_1 - - pydeck=0.8.0=py312hca03da5_2 - - pydispatcher=2.0.5=py312hca03da5_3 - - pydocstyle=6.3.0=py312hca03da5_0 - - pyerfa=2.0.1.4=py312ha86b861_0 - - pyflakes=3.2.0=py312hca03da5_0 - - pygments=2.15.1=py312hca03da5_1 - - pyjwt=2.8.0=py312hca03da5_0 - - pylint=2.16.2=py312hca03da5_0 - - pylint-venv=3.0.3=py312hca03da5_0 - - pyls-spyder=0.4.0=pyhd3eb1b0_0 - - pyobjc-core=10.1=py312h80987f9_0 - - pyobjc-framework-cocoa=10.1=py312hb094c41_0 - - pyobjc-framework-coreservices=10.1=py312hdd8dd1f_0 - - pyobjc-framework-fsevents=10.1=py312hca03da5_0 - - pyodbc=5.0.1=py312h313beb8_0 - - pyopenssl=24.0.0=py312hca03da5_0 - - pyparsing=3.0.9=py312hca03da5_0 - - pyqt=5.15.10=py312h313beb8_0 - - pyqt5-sip=12.13.0=py312h80987f9_0 - - pyqtwebengine=5.15.10=py312h313beb8_0 - - pysocks=1.7.1=py312hca03da5_0 - - pytables=3.9.2=py312h905a39b_0 - - pytest=7.4.4=py312hca03da5_0 - - python=3.12.4=h99e199e_1 - - python-dateutil=2.9.0post0=py312hca03da5_2 - - python-dotenv=0.21.0=py312hca03da5_0 - - python-fastjsonschema=2.16.2=py312hca03da5_0 - - python-json-logger=2.0.7=py312hca03da5_0 - - python-libarchive-c=2.9=pyhd3eb1b0_1 - - python-lmdb=1.4.1=py312h313beb8_0 - - python-lsp-black=2.0.0=py312hca03da5_0 - - python-lsp-jsonrpc=1.1.2=pyhd3eb1b0_0 - - python-lsp-server=1.10.0=py312hca03da5_0 - - python-slugify=5.0.2=pyhd3eb1b0_0 - - python-snappy=0.6.1=py312h313beb8_0 - - python-tzdata=2023.3=pyhd3eb1b0_0 - - python.app=3=py312h80987f9_0 - - pytoolconfig=1.2.6=py312hca03da5_0 - - pytz=2024.1=py312hca03da5_0 - - pyviz_comms=3.0.2=py312hca03da5_0 - - pywavelets=1.5.0=py312ha86b861_0 - - pyyaml=6.0.1=py312h80987f9_0 - - pyzmq=25.1.2=py312h313beb8_0 - - qdarkstyle=3.2.3=pyhd3eb1b0_0 - - qstylizer=0.2.2=py312hca03da5_0 - - qt-main=5.15.2=h0917680_10 - - qt-webengine=5.15.9=h2903aaf_7 - - qtawesome=1.2.2=py312hca03da5_0 - - qtconsole=5.5.1=py312hca03da5_0 - - qtpy=2.4.1=py312hca03da5_0 - - queuelib=1.6.2=py312hca03da5_0 - - re2=2022.04.01=hc377ac9_0 - - readline=8.2=h1a28f6b_0 - - referencing=0.30.2=py312hca03da5_0 - - regex=2023.10.3=py312h80987f9_0 - - reproc=14.2.4=h313beb8_2 - - reproc-cpp=14.2.4=h313beb8_2 - - requests=2.32.2=py312hca03da5_0 - - requests-file=1.5.1=pyhd3eb1b0_0 - - requests-toolbelt=1.0.0=py312hca03da5_0 - - rfc3339-validator=0.1.4=py312hca03da5_0 - - rfc3986-validator=0.1.1=py312hca03da5_0 - - rich=13.3.5=py312hca03da5_1 - - rope=1.12.0=py312hca03da5_0 - - rpds-py=0.10.6=py312hf0e4da2_0 - - rtree=1.0.1=py312hca03da5_0 - - ruamel.yaml=0.17.21=py312h80987f9_0 - - ruamel_yaml=0.17.21=py312h80987f9_0 - - s3fs=2024.3.1=py312hca03da5_0 - - scikit-image=0.23.2=py312hd77ebd4_0 - - scikit-learn=1.4.2=py312hd77ebd4_1 - - scipy=1.13.1=py312ha409365_0 - - scrapy=2.11.1=py312hca03da5_0 - - seaborn=0.13.2=py312hca03da5_0 - - semver=3.0.2=py312hca03da5_0 - - send2trash=1.8.2=py312hca03da5_0 - - service_identity=18.1.0=pyhd3eb1b0_1 - - setuptools=69.5.1=py312hca03da5_0 - - sip=6.7.12=py312h313beb8_0 - - six=1.16.0=pyhd3eb1b0_1 - - smart_open=5.2.1=py312hca03da5_0 - - smmap=4.0.0=pyhd3eb1b0_0 - - snappy=1.1.10=h313beb8_1 - - sniffio=1.3.0=py312hca03da5_0 - - snowballstemmer=2.2.0=pyhd3eb1b0_0 - - sortedcontainers=2.4.0=pyhd3eb1b0_0 - - soupsieve=2.5=py312hca03da5_0 - - sphinx=7.3.7=py312hca03da5_0 - - sphinxcontrib-applehelp=1.0.2=pyhd3eb1b0_0 - - sphinxcontrib-devhelp=1.0.2=pyhd3eb1b0_0 - - sphinxcontrib-htmlhelp=2.0.0=pyhd3eb1b0_0 - - sphinxcontrib-jsmath=1.0.1=pyhd3eb1b0_0 - - sphinxcontrib-qthelp=1.0.3=pyhd3eb1b0_0 - - sphinxcontrib-serializinghtml=1.1.10=py312hca03da5_0 - - spyder=5.5.1=py312hca03da5_0 - - spyder-kernels=2.5.0=py312hca03da5_0 - - sqlalchemy=2.0.30=py312h80987f9_0 - - sqlite=3.45.3=h80987f9_0 - - stack_data=0.2.0=pyhd3eb1b0_0 - - statsmodels=0.14.2=py312ha86b861_0 - - streamlit=1.32.0=py312hca03da5_0 - - tabulate=0.9.0=py312hca03da5_0 - - tapi=1100.0.11=h8754e6a_1 - - tbb=2021.8.0=h48ca7d4_0 - - tblib=1.7.0=pyhd3eb1b0_0 - - tenacity=8.2.2=py312hca03da5_1 - - terminado=0.17.1=py312hca03da5_0 - - text-unidecode=1.3=pyhd3eb1b0_0 - - textdistance=4.2.1=pyhd3eb1b0_0 - - threadpoolctl=2.2.0=pyh0d69192_0 - - three-merge=0.1.1=pyhd3eb1b0_0 - - tifffile=2023.4.12=py312hca03da5_0 - - tinycss2=1.2.1=py312hca03da5_0 - - tk=8.6.14=h6ba3021_0 - - tldextract=3.2.0=pyhd3eb1b0_0 - - toml=0.10.2=pyhd3eb1b0_0 - - tomli=2.0.1=py312hca03da5_1 - - tomlkit=0.11.1=py312hca03da5_0 - - toolz=0.12.0=py312hca03da5_0 - - tornado=6.4.1=py312h80987f9_0 - - tqdm=4.66.4=py312h989b03a_0 - - traitlets=5.14.3=py312hca03da5_0 - - truststore=0.8.0=py312hca03da5_0 - - twisted=23.10.0=py312hca03da5_0 - - tzdata=2024a=h04d1e81_0 - - uc-micro-py=1.0.1=py312hca03da5_0 - - ujson=5.10.0=py312h313beb8_0 - - unicodedata2=15.1.0=py312h80987f9_0 - - unidecode=1.2.0=pyhd3eb1b0_0 - - unixodbc=2.3.11=h1a28f6b_0 - - urllib3=2.2.2=py312hca03da5_0 - - utf8proc=2.6.1=h80987f9_1 - - w3lib=2.1.2=py312hca03da5_0 - - watchdog=4.0.1=py312h80987f9_0 - - wcwidth=0.2.5=pyhd3eb1b0_0 - - webencodings=0.5.1=py312hca03da5_2 - - websocket-client=1.8.0=py312hca03da5_0 - - werkzeug=3.0.3=py312hca03da5_0 - - whatthepatch=1.0.2=py312hca03da5_0 - - wheel=0.43.0=py312hca03da5_0 - - widgetsnbextension=3.6.6=py312hca03da5_0 - - wrapt=1.14.1=py312h80987f9_0 - - wurlitzer=3.0.2=py312hca03da5_0 - - xarray=2023.6.0=py312hca03da5_0 - - xlwings=0.31.4=py312hca03da5_0 - - xyzservices=2022.9.0=py312hca03da5_1 - - xz=5.4.6=h80987f9_1 - - yaml=0.2.5=h1a28f6b_0 - - yaml-cpp=0.8.0=h313beb8_1 - - yapf=0.40.2=py312hca03da5_0 - - yarl=1.9.3=py312h80987f9_0 - - zeromq=4.3.5=h313beb8_0 - - zfp=1.0.0=h313beb8_0 - - zict=3.0.0=py312hca03da5_0 - - zipp=3.17.0=py312hca03da5_0 - - zlib=1.2.13=h18a0788_1 - - zlib-ng=2.0.7=h80987f9_0 - - zope=1.0=py312hca03da5_1 - - zope.interface=5.4.0=py312h80987f9_0 - - zstandard=0.22.0=py312h1a4646a_0 - - zstd=1.5.5=hd90d995_2 + - python + - pandas + - pip - pip: - - cvxopt==1.3.2 - - dataclasses-json==0.6.7 - - deprecation==2.1.0 - - faiss-cpu==1.9.0.post1 - - fasttext==0.9.3 - - gensim==4.3.3 - - httpx-sse==0.4.0 - - huggingface-hub==0.30.2 - - jiter==0.8.0 - - langchain==0.3.9 - - langchain-community==0.3.9 - - langchain-core==0.3.21 - - langchain-openai==0.2.11 - - langchain-text-splitters==0.3.2 - - langsmith==0.1.147 - - marshmallow==3.23.1 - - openai==1.56.1 - - orjson==3.10.12 - - pdoc==15.0.1 - - pm4py==2.7.13.1 - - pybind11==2.13.6 - - pydantic==2.10.3 - - pydantic-core==2.27.1 - - pydantic-settings==2.6.1 - - pydotplus==2.0.2 - - python-graphviz==0.20.3 - - safetensors==0.5.3 - - sympy==1.13.1 - - tiktoken==0.8.0 - - tokenizers==0.21.1 - - torch==2.6.0 - - transformers==4.51.3 - - typing-extensions==4.12.2 - - typing-inspect==0.9.0 -prefix: /opt/anaconda3 + - pm4py + diff --git a/notebooks/issue_event_processing.ipynb b/notebooks/issue_event_processing.ipynb index c9a8598..5020022 100644 --- a/notebooks/issue_event_processing.ipynb +++ b/notebooks/issue_event_processing.ipynb @@ -107,11 +107,11 @@ "metadata": {}, "outputs": [], "source": [ - "csv_folder = os.path.abspath(os.path.join(cwd, \"..\",\"..\", \"..\"))\n", + "output_dir = os.path.abspath(os.path.join(cwd, \"..\",\"..\"))\n", "\n", "\n", "# To parse use the parse command and specify the .\n", - "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml {csv_folder}/issue_output.csv\"\n", + "command = f\"Rscript exec/ghevents.R parse conf/kaiaulu.yml {output_dir}/issue_output.csv\"\n", "subprocess.run(command, shell=True, check=True)\n", "\n", "os.chdir(cwd)" @@ -130,7 +130,7 @@ "metadata": {}, "outputs": [], "source": [ - "csv_path = os.path.join(csv_folder, \"issue_output.csv\")\n", + "csv_path = os.path.join(output_dir, \"issue_output.csv\")\n", "\n", "df_issues = pd.read_csv(csv_path)\n", "print(df_issues.head(5))" @@ -155,7 +155,7 @@ "\n", "The process tree is our first visual we will generate. It uses the Inductive Miner Algorithm to generate a hierarchical visualization of the workflow. Capturing the sequences and dependecies of events. The algorithm is based on process discovery, and will highligh decision points and parallel activities. It is important for understanding the overall flow and structure of events and identifiying transitions and potential ineffcientices in the process. \n", "\n", - "Note: You specifiy action as **view**, **save**, or **both** to determine what happens to the visualization. By default the generate functions will only view the graph. For our example we specify output_dir as the folder where process_mining was downloaded. This means for actions **save** and **both**, the images will be saved to the folder where process_mining was downloaded unless otherwise specified. " + "Note: You specifiy action as **view**, **save**, or **both** to determine what happens to the visualization. By default the generate functions will only view the graph. For our example we specify output_dir as the folder where process_mining was downloaded. This means for actions **save** and **both**, the images will be saved to the folder where process_mining was downloaded unless otherwise specified. This is the same location where the CSV was parsed." ] }, { @@ -164,8 +164,6 @@ "metadata": {}, "outputs": [], "source": [ - "# Specify the directory to save images\n", - "output_dir = \"../../\"\n", "\n", "generate_tree_inductive(csv_path, output_dir, action=\"both\")" ] @@ -284,7 +282,7 @@ "metadata": {}, "outputs": [], "source": [ - "generated_csv_path = f\"{csv_folder}/generated_csv.csv\"\n", + "generated_csv_path = f\"{output_dir}/generated_csv.csv\"\n", "\n", "generate_fake_event_log(num_issues=1, num_events_per_issue=7, output_csv=generated_csv_path, seed=42)\n", "\n", @@ -348,9 +346,9 @@ "metadata": {}, "outputs": [], "source": [ - "event_log_df.to_csv(\"../../modified_csv.csv\")\n", + "event_log_df.to_csv(f\"{output_dir}/modified_csv.csv\")\n", "\n", - "generate_graph_inductive(\"../../modified_csv.csv\", noise_threshold=0.0)" + "generate_graph_inductive(f\"{output_dir}/modified_csv.csv\", noise_threshold=0.0)" ] }, { From ffa4da1f06c99fd2a4b861f900334e0b207f2680 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Tue, 6 May 2025 16:24:27 -1000 Subject: [PATCH 12/13] i #1 full env added - Added full env with versions --- env.yml | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/env.yml b/env.yml index d67530c..9f27fc2 100644 --- a/env.yml +++ b/env.yml @@ -1,8 +1,89 @@ name: process_mining +channels: + - conda-forge + - defaults dependencies: - - python - - pandas - - pip + - appnope=0.1.4=pyhd8ed1ab_1 + - asttokens=3.0.0=pyhd8ed1ab_1 + - blas=1.0=openblas + - bottleneck=1.4.2=py310hbda83bc_0 + - bzip2=1.0.8=h80987f9_6 + - ca-certificates=2025.4.26=hbd8a1cb_0 + - comm=0.2.2=pyhd8ed1ab_1 + - debugpy=1.8.11=py310h313beb8_0 + - decorator=5.2.1=pyhd8ed1ab_0 + - exceptiongroup=1.2.2=pyhd8ed1ab_1 + - executing=2.2.0=pyhd8ed1ab_0 + - importlib-metadata=8.6.1=pyha770c72_0 + - ipykernel=6.29.5=pyh57ce528_0 + - ipython=8.36.0=pyh907856f_0 + - jedi=0.19.2=pyhd8ed1ab_1 + - jupyter_client=8.6.3=pyhd8ed1ab_1 + - jupyter_core=5.7.2=pyh31011fe_1 + - libcxx=14.0.6=h848a8c0_0 + - libffi=3.4.4=hca03da5_1 + - libgfortran=5.0.0=11_3_0_hca03da5_28 + - libgfortran5=11.3.0=h009349e_28 + - libopenblas=0.3.21=h269037a_0 + - libsodium=1.0.18=h27ca646_1 + - llvm-openmp=14.0.6=hc6e5704_0 + - matplotlib-inline=0.1.7=pyhd8ed1ab_1 + - ncurses=6.4=h313beb8_0 + - nest-asyncio=1.6.0=pyhd8ed1ab_1 + - numexpr=2.10.1=py310h5d9532f_0 + - numpy=2.0.1=py310h3b2db8e_1 + - numpy-base=2.0.1=py310ha9811e2_1 + - openssl=3.5.0=h81ee809_1 + - packaging=25.0=pyh29332c3_1 + - pandas=2.2.3=py310hcf29cfe_0 + - parso=0.8.4=pyhd8ed1ab_1 + - pexpect=4.9.0=pyhd8ed1ab_1 + - pickleshare=0.7.5=pyhd8ed1ab_1004 + - pip=25.1=pyhc872135_2 + - platformdirs=4.3.7=pyh29332c3_0 + - prompt-toolkit=3.0.51=pyha770c72_0 + - psutil=5.9.0=py310h80987f9_1 + - ptyprocess=0.7.0=pyhd8ed1ab_1 + - pure_eval=0.2.3=pyhd8ed1ab_1 + - pygments=2.19.1=pyhd8ed1ab_0 + - python=3.10.16=hb885b13_1 + - python-dateutil=2.9.0post0=py310hca03da5_2 + - python-tzdata=2025.2=pyhd3eb1b0_0 + - pytz=2024.1=py310hca03da5_0 + - pyzmq=26.2.0=py310h313beb8_0 + - readline=8.2=h1a28f6b_0 + - setuptools=78.1.1=py310hca03da5_0 + - six=1.17.0=py310hca03da5_0 + - sqlite=3.45.3=h80987f9_0 + - stack_data=0.6.3=pyhd8ed1ab_1 + - tk=8.6.14=h6ba3021_0 + - tornado=6.4.2=py310h80987f9_0 + - traitlets=5.14.3=pyhd8ed1ab_1 + - typing_extensions=4.13.2=pyh29332c3_0 + - tzdata=2025b=h04d1e81_0 + - wcwidth=0.2.13=pyhd8ed1ab_1 + - wheel=0.45.1=py310hca03da5_0 + - xz=5.6.4=h80987f9_1 + - zeromq=4.3.5=h313beb8_0 + - zipp=3.21.0=pyhd8ed1ab_1 + - zlib=1.2.13=h18a0788_1 - pip: - - pm4py - + - contourpy==1.3.2 + - cvxopt==1.3.2 + - cycler==0.12.1 + - deprecation==2.1.0 + - fonttools==4.57.0 + - graphviz==0.20.3 + - intervaltree==3.1.0 + - kiwisolver==1.4.8 + - lxml==5.4.0 + - matplotlib==3.10.1 + - networkx==3.4.2 + - pillow==11.2.1 + - pm4py==2.7.15.1 + - pydotplus==2.0.2 + - pyparsing==3.2.3 + - scipy==1.15.2 + - sortedcontainers==2.4.0 + - tqdm==4.67.1 +prefix: /opt/anaconda3/envs/process_mining From 312b32797f3fb736657b3c3e3c5ba3f2b944bf77 Mon Sep 17 00:00:00 2001 From: Connor Narowetz Date: Thu, 8 May 2025 22:08:41 -1000 Subject: [PATCH 13/13] i #1 Finalized working env, fixed typo Signed-off-by: Connor Narowetz --- env.yml | 89 ++------------------------ notebooks/issue_event_processing.ipynb | 6 +- 2 files changed, 9 insertions(+), 86 deletions(-) diff --git a/env.yml b/env.yml index 9f27fc2..9391834 100644 --- a/env.yml +++ b/env.yml @@ -3,87 +3,10 @@ channels: - conda-forge - defaults dependencies: - - appnope=0.1.4=pyhd8ed1ab_1 - - asttokens=3.0.0=pyhd8ed1ab_1 - - blas=1.0=openblas - - bottleneck=1.4.2=py310hbda83bc_0 - - bzip2=1.0.8=h80987f9_6 - - ca-certificates=2025.4.26=hbd8a1cb_0 - - comm=0.2.2=pyhd8ed1ab_1 - - debugpy=1.8.11=py310h313beb8_0 - - decorator=5.2.1=pyhd8ed1ab_0 - - exceptiongroup=1.2.2=pyhd8ed1ab_1 - - executing=2.2.0=pyhd8ed1ab_0 - - importlib-metadata=8.6.1=pyha770c72_0 - - ipykernel=6.29.5=pyh57ce528_0 - - ipython=8.36.0=pyh907856f_0 - - jedi=0.19.2=pyhd8ed1ab_1 - - jupyter_client=8.6.3=pyhd8ed1ab_1 - - jupyter_core=5.7.2=pyh31011fe_1 - - libcxx=14.0.6=h848a8c0_0 - - libffi=3.4.4=hca03da5_1 - - libgfortran=5.0.0=11_3_0_hca03da5_28 - - libgfortran5=11.3.0=h009349e_28 - - libopenblas=0.3.21=h269037a_0 - - libsodium=1.0.18=h27ca646_1 - - llvm-openmp=14.0.6=hc6e5704_0 - - matplotlib-inline=0.1.7=pyhd8ed1ab_1 - - ncurses=6.4=h313beb8_0 - - nest-asyncio=1.6.0=pyhd8ed1ab_1 - - numexpr=2.10.1=py310h5d9532f_0 - - numpy=2.0.1=py310h3b2db8e_1 - - numpy-base=2.0.1=py310ha9811e2_1 - - openssl=3.5.0=h81ee809_1 - - packaging=25.0=pyh29332c3_1 - - pandas=2.2.3=py310hcf29cfe_0 - - parso=0.8.4=pyhd8ed1ab_1 - - pexpect=4.9.0=pyhd8ed1ab_1 - - pickleshare=0.7.5=pyhd8ed1ab_1004 - - pip=25.1=pyhc872135_2 - - platformdirs=4.3.7=pyh29332c3_0 - - prompt-toolkit=3.0.51=pyha770c72_0 - - psutil=5.9.0=py310h80987f9_1 - - ptyprocess=0.7.0=pyhd8ed1ab_1 - - pure_eval=0.2.3=pyhd8ed1ab_1 - - pygments=2.19.1=pyhd8ed1ab_0 - - python=3.10.16=hb885b13_1 - - python-dateutil=2.9.0post0=py310hca03da5_2 - - python-tzdata=2025.2=pyhd3eb1b0_0 - - pytz=2024.1=py310hca03da5_0 - - pyzmq=26.2.0=py310h313beb8_0 - - readline=8.2=h1a28f6b_0 - - setuptools=78.1.1=py310hca03da5_0 - - six=1.17.0=py310hca03da5_0 - - sqlite=3.45.3=h80987f9_0 - - stack_data=0.6.3=pyhd8ed1ab_1 - - tk=8.6.14=h6ba3021_0 - - tornado=6.4.2=py310h80987f9_0 - - traitlets=5.14.3=pyhd8ed1ab_1 - - typing_extensions=4.13.2=pyh29332c3_0 - - tzdata=2025b=h04d1e81_0 - - wcwidth=0.2.13=pyhd8ed1ab_1 - - wheel=0.45.1=py310hca03da5_0 - - xz=5.6.4=h80987f9_1 - - zeromq=4.3.5=h313beb8_0 - - zipp=3.21.0=pyhd8ed1ab_1 - - zlib=1.2.13=h18a0788_1 + - python=3.10.16 + - pandas + - pip + - ipykernel - pip: - - contourpy==1.3.2 - - cvxopt==1.3.2 - - cycler==0.12.1 - - deprecation==2.1.0 - - fonttools==4.57.0 - - graphviz==0.20.3 - - intervaltree==3.1.0 - - kiwisolver==1.4.8 - - lxml==5.4.0 - - matplotlib==3.10.1 - - networkx==3.4.2 - - pillow==11.2.1 - - pm4py==2.7.15.1 - - pydotplus==2.0.2 - - pyparsing==3.2.3 - - scipy==1.15.2 - - sortedcontainers==2.4.0 - - tqdm==4.67.1 -prefix: /opt/anaconda3/envs/process_mining + - pm4py +prefix: /opt/anaconda3/envs/process_mining \ No newline at end of file diff --git a/notebooks/issue_event_processing.ipynb b/notebooks/issue_event_processing.ipynb index 5020022..b1a3e9f 100644 --- a/notebooks/issue_event_processing.ipynb +++ b/notebooks/issue_event_processing.ipynb @@ -89,7 +89,7 @@ "token_path = \"~/.ssh/github_token\"\n", "\n", "os.chdir(kaiaulu_path)\n", - "# To download use the parse command and specify the .\n", + "# To download use the download command and specify the .\n", "command = f\"Rscript exec/ghevents.R download conf/kaiaulu.yml --token_path={token_path}\"\n", "subprocess.run(command, shell=True, check=True)\n" ] @@ -367,7 +367,7 @@ ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "process_mining", "language": "python", "name": "python3" }, @@ -381,7 +381,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.10.16" } }, "nbformat": 4,