<jupyter_start><jupyter_text>Contributors:- *<NAME>* <EMAIL>- *<NAME>* <EMAIL>- *<NAME>* <EMAIL>- *<NAME>* <EMAIL> ProFIT автоматически строит модели бизнес-процессов по данным. Входные данные — журнал событий, содержащий записи об идентификаторах случаев и выполненных действиях, упорядоченные по времени регистрации в системе. Модель процесса представлена в виде ориентированного графа, где зелёная вершина — начало процесса, а красная — конец.   Package location *Для запуска демо из репозитория в jupyter-notebook.* Ссылка на проект: https://github.com/Siella/ProFIT.<jupyter_code>import os
import configparser

PATH = os.getcwd()[:os.getcwd().rfind('\\')] # путь до директории ProFIT
config = configparser.ConfigParser()
config.add_section("packageLocation")
config.set("packageLocation", "workingDir", PATH)
config.set("packageLocation", "packageDir", PATH+'\\profit')<jupyter_output><empty_output><jupyter_text>Import<jupyter_code>import sys
sys.path.append(config["packageLocation"]["workingDir"])
sys.path.append(config["packageLocation"]["packageDir"])
from profit import ProcessMap<jupyter_output><empty_output><jupyter_text>How to use Чтобы начать использовать ProFIT, достаточно объявить и присвоить переменной экземпляр класса ProcessMap, а затем передать путь к логу в формате CSV/TXT/XES (либо сами данные в виде pandas.DataFrame) через метод set_log.<jupyter_code>monitoring = PATH + "/demo/log_examples/remote_monitoring.csv"
declarations = PATH + "/demo/log_examples/DomesticDeclarations.xes"
import pandas as pd

# log demo
df_monitoring = pd.read_csv(monitoring, encoding='cp1251')
df_monitoring.head()
pm = ProcessMap()
pm.set_log(FILE_PATH = monitoring, 
#            data = df_monitoring,
           encoding = 'cp1251')

pm.update()<jupyter_output><empty_output><jupyter_text>После каждой настройки необходимо вызвать метод update! Метод render возвращает модель процесса в виде ориентированного графа на DOT языке (поддерживается и визуализируется пакетом утилит Graphviz). Чтобы показать и сохранить модель в формате, поддерживаемом Graphviz, нужно вызвать данный метод и указать путь к директории, где будет сохранён результат.<jupyter_code># without saving
pm.render()<jupyter_output><empty_output><jupyter_text>С помощью методов set_rates и set_params пользователь может настроить несколько входных параметров: - уровни отображения событий и переходов, регулирующие детализацию модели процесса; - опцию построения оптимальной модели процесса, основанной на комбинированной оценке сложности и точности модели;- параметр оптимизации, регулирующий простоту восприятия и полноту модели;- опцию выделения мета-состояний путём агрегации циклов в модели; - способы агрегации и проч. (см. документацию)По умолчанию (без настроек) ищется оптимальная модель процесса, поэтому при изменении уровней отображений необходимо выставить optimize=False, чтобы отключить их автонастройку. Задача оптимизации выглядит следующим образом: $$\mathcal{Q}(p, X^l) = (1-\lambda)\cdot F + \lambda\cdot C_{\mathcal{J}} \longrightarrow \min_{\theta},$$ где $\mathcal{Q}$ — функционал качества, $p$ — алгоритм извлечения модели процесса из данных, $X^l$ — подвыборка лога, $\lambda$ — коэффициент регуляризации, $F$ — фитнес-функция, $C_\mathcal{J}$ — функция сложности, $\theta$ — уровни отображений.<jupyter_code>pm2 = ProcessMap()
pm2.set_log(FILE_PATH=declarations)
pm2.update()
pm2.render()
pm.set_rates(activity_rate=80, path_rate=15)
pm.set_params(optimize=False, aggregate=False)

pm.update()
pm.render()<jupyter_output><empty_output><jupyter_text>Meta-states discovering Под мета-состояниями понимаем значимые циклы, то есть которые часто встречаются в логе.  Пример перестроения модели процесса (a) изначальная модель; (b) свёртка циклов типа outer joining; (c) свёртка циклов типа inner joining и эвристикой all; (d) свёртка циклов типа inner joining и эвристикой frequent<jupyter_code>pm.set_rates(activity_rate=80, path_rate=5)
pm.set_params(optimize=False, 
              aggregate=True,
              heuristic='all',
              agg_type='inner')

pm.update()
pm.render()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0987864077669903, 'fraction_numerical': 0.0048543689320388345, 'mean_word_length': 6.385304659498208, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 0, '>': 33, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '27114', 'license': 'MIT', 'n_tokens_mistral': 1556, 'n_tokens_neox': 1785, 'n_words': 375, 'path': 'demo/profit_examples_rus.ipynb', 'repo_name': 'iterater/ProFIT', 'size': '4215'}