diff --git a/Dockerfile b/Dockerfile index 221b535f7..120cf9e86 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get -y install libtool flex bison pkg-config g++ libssl-dev automake RUN apt-get -y install libjemalloc-dev libboost-dev libboost-filesystem-dev libboost-system-dev libboost-regex-dev python3-dev autoconf flex bison cmake RUN apt-get -y install libxml2-dev libxslt-dev libfreetype6-dev libsuitesparse-dev RUN pip install -U wheel six pytest -RUN pip install MarkupSafe==1.1.1 backcall==0.2.0 certifi==2020.12.5 colorama==0.4.3 decorator==4.4.2 ipython-genutils==0.2.0 joblib==1.0.0 more-itertools==8.6.0 mpmath==1.1.0 numpy==1.19.3 parso==0.7.1 pickleshare==0.7.5 Pillow==8.1.0 Pygments==2.7.3 pyparsing==2.4.7 pytz==2020.5 setuptools==51.1.1 six==1.15.0 sortedcontainers==2.3.0 threadpoolctl==2.1.0 wcwidth==0.2.5 cycler==0.10.0 jedi==0.18.0 jinja2==2.11.2 kiwisolver==1.3.1 networkx==2.5 packaging==20.8 prompt-toolkit==3.0.7 python-dateutil==2.8.1 scipy==1.6.0 traitlets==5.0.5 zipp==3.4.0 importlib-metadata==3.3.0 ipython==7.19.0 jsonpickle==1.4.2 deprecation==2.1.0 graphviz==0.16 intervaltree==3.1.0 lxml==4.6.1 matplotlib==3.3.3 pandas==1.2.0 pulp==2.1 pydotplus==2.0.2 pyvis==0.1.8.2 scikit-learn==0.24.0 StringDist==1.0.9 sympy==1.7.1 cython==0.29.21 tqdm==4.55.1 +RUN pip install MarkupSafe==1.1.1 backcall==0.2.0 certifi==2020.12.5 colorama==0.4.3 decorator==4.4.2 ipython-genutils==0.2.0 joblib==1.0.0 more-itertools==8.6.0 mpmath==1.1.0 numpy==1.19.3 parso==0.8.1 pickleshare==0.7.5 Pillow==8.1.0 Pygments==2.7.3 pyparsing==2.4.7 pytz==2020.5 setuptools==51.1.1 six==1.15.0 sortedcontainers==2.3.0 threadpoolctl==2.1.0 wcwidth==0.2.5 cycler==0.10.0 jedi==0.18.0 jinja2==2.11.2 kiwisolver==1.3.1 networkx==2.5 packaging==20.8 prompt-toolkit==3.0.9 python-dateutil==2.8.1 scipy==1.6.0 traitlets==5.0.5 zipp==3.4.0 importlib-metadata==3.3.0 ipython==7.19.0 jsonpickle==1.4.2 deprecation==2.1.0 graphviz==0.16 intervaltree==3.1.0 lxml==4.6.1 matplotlib==3.3.3 pandas==1.2.0 pulp==2.1 pydotplus==2.0.2 pyvis==0.1.8.2 scikit-learn==0.24.0 StringDist==1.0.9 sympy==1.7.1 cython==0.29.21 tqdm==4.55.1 COPY . /app RUN cd /app && cp tests/test_dockers/setups/setup_master.py setup.py && python setup.py install diff --git a/README.THIRD_PARTY.md b/README.THIRD_PARTY.md index e66c72b61..28192edb8 100644 --- a/README.THIRD_PARTY.md +++ b/README.THIRD_PARTY.md @@ -32,9 +32,9 @@ to change as libraries are added or removed. | numpy | https://pypi.org/project/numpy | BSD | 1.19.3 | | X | | packaging | https://pypi.org/project/packaging | Apache 2.0 | 20.8 | | | | pandas | https://pypi.org/project/pandas | BSD | 1.2.0 | X | X | -| parso | https://pypi.org/project/parso | MIT | 0.7.1 | | | +| parso | https://pypi.org/project/parso | MIT | 0.8.1 | | | | pickleshare | https://pypi.org/project/pickleshare | MIT | 0.7.5 | X | | -| prompt-toolkit | https://pypi.org/project/prompt-toolkit | BSD | 3.0.7 | | | +| prompt-toolkit | https://pypi.org/project/prompt-toolkit | BSD | 3.0.9 | | | | pulp | https://pypi.org/project/pulp | BSD | 2.1 | X | | | pydotplus | https://pypi.org/project/pydotplus | MIT | 2.0.2 | X | | | pygments | https://pypi.org/project/pygments | BSD | 2.7.3 | | | diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 151e5fe25..d64fb6223 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -1,3 +1,8 @@ +===== PM4Py 2.1.3.2 ===== +This is a *hotfix* release, consisting of the following changes: +1. commit b5cb7f0d, f1c0f037, 960d40e9 + fix naming consistency in the filtering interface of pm4py. + ===== PM4Py 2.1.3.1 ===== This is a *hotfix* release, consisting of the following changes: 1. commit f9f894ed diff --git a/examples/simplified_interface.py b/examples/simplified_interface.py index 747e71347..865d0d4cb 100644 --- a/examples/simplified_interface.py +++ b/examples/simplified_interface.py @@ -86,15 +86,15 @@ def execute_script(): print("end_activities len(filt_log) = ", len(pm4py.filter_end_activities(log2, ["pay compensation"]))) print("end_activities len(filt_df) = ", len(pm4py.filter_end_activities(df2, ["pay compensation"]))) print("attributes org:resource len(filt_log) (cases) cases = ", - len(pm4py.filter_attribute_values(log2, "org:resource", ["Ellen"], level="cases"))) + len(pm4py.filter_attribute_values(log2, "org:resource", ["Ellen"], level="case"))) print("attributes org:resource len(filt_log) (cases) events = ", - len(pm4py.filter_attribute_values(log2, "org:resource", ["Ellen"], level="events"))) + len(pm4py.filter_attribute_values(log2, "org:resource", ["Ellen"], level="event"))) print("attributes org:resource len(filt_df) (events) cases = ", - len(pm4py.filter_attribute_values(df2, "org:resource", ["Ellen"], level="cases"))) + len(pm4py.filter_attribute_values(df2, "org:resource", ["Ellen"], level="case"))) print("attributes org:resource len(filt_df) (events) events = ", - len(pm4py.filter_attribute_values(df2, "org:resource", ["Ellen"], level="events"))) + len(pm4py.filter_attribute_values(df2, "org:resource", ["Ellen"], level="event"))) print("attributes org:resource len(filt_df) (events) events notpositive = ", - len(pm4py.filter_attribute_values(df2, "org:resource", ["Ellen"], level="events", retain=False))) + len(pm4py.filter_attribute_values(df2, "org:resource", ["Ellen"], level="event", retain=False))) print("variants log = ", pm4py.get_variants(log2)) print("variants df = ", pm4py.get_variants(df2)) @@ -104,23 +104,25 @@ def execute_script(): print("variants filter df = ", len(pm4py.filter_variants(df2, [ ["register request", "examine thoroughly", "check ticket", "decide", "reject request"]]))) - print("variants filter percentage = ", len(pm4py.filter_variants_percentage(log2, percentage=0.8))) + print("variants filter percentage = ", len(pm4py.filter_variants_percentage(log2, threshold=0.8))) - print("paths filter log len = ", len(pm4py.filter_directly_follows_relation(log2, [("register request", "examine casually")]))) - print("paths filter dataframe len = ", len(pm4py.filter_directly_follows_relation(df2, [("register request", "examine casually")]))) + print("paths filter log len = ", + len(pm4py.filter_directly_follows_relation(log2, [("register request", "examine casually")]))) + print("paths filter dataframe len = ", + len(pm4py.filter_directly_follows_relation(df2, [("register request", "examine casually")]))) print("timeframe filter log events len = ", - len(pm4py.filter_timestamp(log2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="events"))) + len(pm4py.filter_time_range(log2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="events"))) print("timeframe filter log traces_contained len = ", - len(pm4py.filter_timestamp(log2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_contained"))) + len(pm4py.filter_time_range(log2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_contained"))) print("timeframe filter log traces_intersecting len = ", - len(pm4py.filter_timestamp(log2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_intersecting"))) + len(pm4py.filter_time_range(log2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_intersecting"))) print("timeframe filter df events len = ", - len(pm4py.filter_timestamp(df2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="events"))) + len(pm4py.filter_time_range(df2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="events"))) print("timeframe filter df traces_contained len = ", - len(pm4py.filter_timestamp(df2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_contained"))) + len(pm4py.filter_time_range(df2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_contained"))) print("timeframe filter df traces_intersecting len = ", - len(pm4py.filter_timestamp(df2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_intersecting"))) + len(pm4py.filter_time_range(df2, "2011-01-01 00:00:00", "2011-02-01 00:00:00", mode="traces_intersecting"))) # remove the temporary files os.remove("ru1.xes") diff --git a/pm4py/__init__.py b/pm4py/__init__.py index 8579e6401..38c1a1519 100644 --- a/pm4py/__init__.py +++ b/pm4py/__init__.py @@ -1,4 +1,4 @@ -VERSION = '2.1.3.1' +VERSION = '2.1.3.2' import logging import pkgutil @@ -79,8 +79,8 @@ save_vis_process_tree, \ view_heuristics_net, save_vis_heuristics_net, view_bpmn, save_vis_bpmn from pm4py.filtering import filter_start_activities, filter_end_activities, filter_attribute_values, filter_variants, \ - filter_variants_percentage, filter_directly_follows_relation, filter_timestamp, filter_trace_attribute, \ - filter_eventually_follows + filter_variants_percentage, filter_directly_follows_relation, filter_time_range, filter_trace_attribute, \ + filter_eventually_follows_relation, filter_event_attribute_values, filter_trace_attribute_values from pm4py.stats import get_start_activities, get_end_activities, get_attributes, get_attribute_values, get_variants, \ get_trace_attributes from pm4py.convert import convert_to_event_log, convert_to_event_stream, convert_to_dataframe, convert_to_bpmn, \ diff --git a/pm4py/filtering.py b/pm4py/filtering.py index 0d6b689a5..b60afdba5 100644 --- a/pm4py/filtering.py +++ b/pm4py/filtering.py @@ -65,9 +65,16 @@ def filter_end_activities(log, activities, retain=True): parameters={end_activities_filter.Parameters.POSITIVE: retain}) +@deprecation.deprecated(deprecated_in='2.1.4', removed_in='2.3.0', current_version=PM4PY_CURRENT_VERSION, + details='Filtering method will be removed due to fuzzy naming.\ + Use: filter_event_attribute_values') def filter_attribute_values(log, attribute_key, values, level="case", retain=True): + return filter_event_attribute_values(log, attribute_key, values, level=level, retain=retain) + + +def filter_event_attribute_values(log, attribute_key, values, level="case", retain=True): """ - Filter a log object on the values of some attribute + Filter a log object on the values of some event attribute Parameters -------------- @@ -97,19 +104,28 @@ def filter_attribute_values(log, attribute_key, values, level="case", retain=Tru attributes_filter.Parameters.POSITIVE: retain}) elif level == "case": return attributes_filter.apply(log, values, parameters={ - constants.PARAMETER_CONSTANT_ATTRIBUTE_KEY: attribute_key, attributes_filter.Parameters.POSITIVE: retain}) + constants.PARAMETER_CONSTANT_ATTRIBUTE_KEY: attribute_key, + attributes_filter.Parameters.POSITIVE: retain}) else: from pm4py.algo.filtering.log.attributes import attributes_filter if level == "event": return attributes_filter.apply_events(log, values, parameters={constants.PARAMETER_CONSTANT_ATTRIBUTE_KEY: attribute_key, attributes_filter.Parameters.POSITIVE: retain}) - else: + elif level == "case": return attributes_filter.apply(log, values, parameters={ - constants.PARAMETER_CONSTANT_ATTRIBUTE_KEY: attribute_key, attributes_filter.Parameters.POSITIVE: retain}) + constants.PARAMETER_CONSTANT_ATTRIBUTE_KEY: attribute_key, + attributes_filter.Parameters.POSITIVE: retain}) +@deprecation.deprecated(deprecated_in='2.1.4', removed_in='2.3.0', current_version=PM4PY_CURRENT_VERSION, + details='Filtering method will be removed due to fuzzy naming.\ + Use: filter_event_attribute_values') def filter_trace_attribute(log, attribute_key, values, retain=True): + return filter_trace_attribute_values(log, attribute_key, values, retain=retain) + + +def filter_trace_attribute_values(log, attribute_key, values, retain=True): """ Filter a log on the values of a trace attribute @@ -232,7 +248,7 @@ def filter_directly_follows_relation(log, relations, retain=True): return paths_filter.apply(log, relations, parameters={paths_filter.Parameters.POSITIVE: retain}) -def filter_eventually_follows(log, relations, retain=True): +def filter_eventually_follows_relation(log, relations, retain=True): """ Retain traces that contain any of the specified 'eventually follows' relations. For example, if relations == [('a','b'),('a','c')] and log [,,] @@ -291,7 +307,7 @@ def filter_eventually_follows(log, relations, retain=True): return filtered_log -def filter_timestamp(log, dt1, dt2, mode="events"): +def filter_time_range(log, dt1, dt2, mode="events"): """ Filter a log on a time interval diff --git a/requirements_stable.txt b/requirements_stable.txt index eec331db3..71abb6937 100644 --- a/requirements_stable.txt +++ b/requirements_stable.txt @@ -9,7 +9,7 @@ joblib==1.0.0 more-itertools==8.6.0 mpmath==1.1.0 numpy==1.19.3 -parso==0.7.1 +parso==0.8.1 pickleshare==0.7.5 Pillow==8.1.0 Pygments==2.7.3 @@ -26,7 +26,7 @@ jinja2==2.11.2 kiwisolver==1.3.1 networkx==2.5 packaging==20.8 -prompt-toolkit==3.0.8 +prompt-toolkit==3.0.9 python-dateutil==2.8.1 scipy==1.6.0 traitlets==5.0.5 diff --git a/scripts/script.py b/scripts/script.py deleted file mode 100644 index 7be14c328..000000000 --- a/scripts/script.py +++ /dev/null @@ -1,7 +0,0 @@ -import pm4py - - -if __name__ == "__main__": - log = pm4py.read_xes('../tests/input_data/running-example.xes') - allowed = {'a', 'b', 'c'} - filtered = pm4py.filter_log(lambda t: t[0] in allowed, log)