Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/hotfixes' into release
Browse files Browse the repository at this point in the history
  • Loading branch information
fit-alessandro-berti committed Apr 11, 2024
2 parents 66979d1 + d580fed commit 2416f8c
Show file tree
Hide file tree
Showing 20 changed files with 223 additions and 206 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM python:3.12.2
FROM python:3.12.3

RUN apt-get update
RUN apt-get -y upgrade
Expand Down
6 changes: 3 additions & 3 deletions pm4py/algo/filtering/pandas/cases/case_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ def filter_on_case_size(df0: pd.DataFrame, case_id_glue: str = "case:concept:nam
Filtered dataframe
"""
df = df0.copy()
element_group_size = df[case_id_glue].groupby(df[case_id_glue]).transform('size')
element_group_size = df[[case_id_glue]].groupby(case_id_glue).transform('size')
df = df[element_group_size >= min_case_size]
if max_case_size is not None:
df = df[element_group_size <= max_case_size]
Expand Down Expand Up @@ -114,7 +114,7 @@ def filter_on_case_performance(df: pd.DataFrame, case_id_glue: str = constants.C
df
Filtered dataframe
"""
grouped_df = df[[case_id_glue, timestamp_key]].groupby(df[case_id_glue])
grouped_df = df[[case_id_glue, timestamp_key]].groupby(case_id_glue)
start_events = grouped_df.first()
end_events = grouped_df.last()
end_events.columns = [str(col) + '_2' for col in end_events.columns]
Expand All @@ -128,7 +128,7 @@ def filter_on_case_performance(df: pd.DataFrame, case_id_glue: str = constants.C
stacked_df = stacked_df[stacked_df['caseDuration'] <= max_case_performance]
stacked_df = stacked_df[stacked_df['caseDuration'] >= min_case_performance]
i1 = df.set_index(case_id_glue).index
i2 = stacked_df.set_index(case_id_glue).index
i2 = stacked_df.index
ret = df[i1.isin(i2)]
ret.attrs = copy(df.attrs) if hasattr(df, 'attrs') else {}
return ret
Expand Down
8 changes: 4 additions & 4 deletions pm4py/algo/filtering/pandas/timestamp/timestamp_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ def filter_traces_contained(df: pd.DataFrame, dt1: Union[str, datetime.datetime]
dt1 = get_dt_from_string(dt1)
dt2 = get_dt_from_string(dt2)

grouped_df = df[[case_id_glue, timestamp_key]].groupby(df[case_id_glue])
grouped_df = df[[case_id_glue, timestamp_key]].groupby(case_id_glue)
first = grouped_df.first()
last = grouped_df.last()
last.columns = [str(col) + '_2' for col in last.columns]
stacked = pandas_utils.concat([first, last], axis=1)
stacked = stacked[stacked[timestamp_key] >= dt1]
stacked = stacked[stacked[timestamp_key + "_2"] <= dt2]
i1 = df.set_index(case_id_glue).index
i2 = stacked.set_index(case_id_glue).index
i2 = stacked.index
ret = df[i1.isin(i2)]

ret.attrs = copy(df.attrs) if hasattr(df, 'attrs') else {}
Expand Down Expand Up @@ -103,7 +103,7 @@ def filter_traces_intersecting(df: pd.DataFrame, dt1: Union[str, datetime.dateti
case_id_glue = exec_utils.get_param_value(Parameters.CASE_ID_KEY, parameters, CASE_CONCEPT_NAME)
dt1 = get_dt_from_string(dt1)
dt2 = get_dt_from_string(dt2)
grouped_df = df[[case_id_glue, timestamp_key]].groupby(df[case_id_glue])
grouped_df = df[[case_id_glue, timestamp_key]].groupby(case_id_glue)
first = grouped_df.first()
last = grouped_df.last()
last.columns = [str(col) + '_2' for col in last.columns]
Expand All @@ -116,7 +116,7 @@ def filter_traces_intersecting(df: pd.DataFrame, dt1: Union[str, datetime.dateti
stacked3 = stacked3[stacked3[timestamp_key + "_2"] > dt2]
stacked = pandas_utils.concat([stacked1, stacked2, stacked3], axis=0)
i1 = df.set_index(case_id_glue).index
i2 = stacked.set_index(case_id_glue).index
i2 = stacked.index
ret = df[i1.isin(i2)]

ret.attrs = copy(df.attrs) if hasattr(df, 'attrs') else {}
Expand Down
2 changes: 1 addition & 1 deletion pm4py/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
'''

__name__ = 'pm4py'
VERSION = '2.7.11.5'
VERSION = '2.7.11.6'
__version__ = VERSION
__doc__ = 'Process mining for Python'
__author__ = 'Fraunhofer Institute for Applied Information Technology FIT'
Expand Down
18 changes: 11 additions & 7 deletions pm4py/statistics/traces/generic/pandas/case_statistics.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,17 +172,19 @@ def get_cases_description(df: pd.DataFrame, parameters: Optional[Dict[Union[str,
business_hours_slots = exec_utils.get_param_value(Parameters.BUSINESS_HOUR_SLOTS, parameters, constants.DEFAULT_BUSINESS_HOUR_SLOTS)
workcalendar = exec_utils.get_param_value(Parameters.WORKCALENDAR, parameters, constants.DEFAULT_BUSINESS_HOURS_WORKCALENDAR)

grouped_df = df[[case_id_glue, timestamp_key]].groupby(df[case_id_glue])
# grouped_df = df[[case_id_glue, timestamp_key]].groupby(df[case_id_glue])
grouped_df = df[[case_id_glue, timestamp_key]].groupby(case_id_glue)
# grouped_df = df[[case_id_glue, timestamp_key]].groupby(case_id_glue)
first_eve_df = grouped_df.first()
last_eve_df = grouped_df.last()
del grouped_df
last_eve_df.columns = [str(col) + '_2' for col in first_eve_df.columns]
stacked_df = pandas_utils.concat([first_eve_df, last_eve_df], axis=1)
del first_eve_df
del last_eve_df
del stacked_df[case_id_glue]
del stacked_df[case_id_glue + "_2"]
if case_id_glue in stacked_df.columns:
del stacked_df[case_id_glue]
if case_id_glue + "_2" in stacked_df.columns:
del stacked_df[case_id_glue + "_2"]

if business_hours:
stacked_df['caseDuration'] = stacked_df.apply(
Expand Down Expand Up @@ -266,7 +268,7 @@ def get_variants_df_with_case_duration(df, parameters=None):

workcalendar = exec_utils.get_param_value(Parameters.WORKCALENDAR, parameters, constants.DEFAULT_BUSINESS_HOURS_WORKCALENDAR)

grouped_df = df[[case_id_glue, timestamp_key, activity_key]].groupby(df[case_id_glue])
grouped_df = df[[case_id_glue, timestamp_key, activity_key]].groupby(case_id_glue)

df1 = grouped_df[activity_key].agg(tuple).to_frame()
new_cols = list(df1.columns)
Expand All @@ -279,8 +281,10 @@ def get_variants_df_with_case_duration(df, parameters=None):
stacked_df = pandas_utils.concat([first_eve_df, last_eve_df], axis=1)
del first_eve_df
del last_eve_df
del stacked_df[case_id_glue]
del stacked_df[case_id_glue + "_2"]
if case_id_glue in stacked_df.columns:
del stacked_df[case_id_glue]
if case_id_glue + "_2" in stacked_df.columns:
del stacked_df[case_id_glue + "_2"]
stacked_df['caseDuration'] = stacked_df[timestamp_key + "_2"] - stacked_df[timestamp_key]
stacked_df['caseDuration'] = pandas_utils.get_total_seconds(stacked_df['caseDuration'])
if business_hours:
Expand Down
1 change: 1 addition & 0 deletions pm4py/util/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ def get_default_is_aware_enabled():

OPENAI_EXEC_RESULT = True if get_param_from_env("PM4PY_OPENAI_EXEC_RESULT", "False").lower() == "true" else False
DEFAULT_GVIZ_VIEW = get_param_from_env("PM4PY_DEFAULT_GVIZ_VIEW", None)
DEFAULT_ENABLE_VISUALIZATIONS_VIEW = get_param_from_env("PM4PY_DEFAULT_ENABLE_VISUALIZATIONS_VIEW", True)

JQUERY_LINK = "https://code.jquery.com/jquery-3.6.3.min.js"
GRAPHVIZJS_LINK = "https://github.com/mdaines/viz-js/releases/download/v1.8.2/viz.js"
Expand Down
7 changes: 4 additions & 3 deletions pm4py/visualization/bpmn/variants/classic.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ def view(gviz: graphviz.Digraph, parameters=None):
gviz
GraphViz diagram
"""
return gview.view(gviz, parameters=parameters)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
return gview.view(gviz, parameters=parameters)


def matplotlib_view(gviz: graphviz.Digraph, parameters=None):
Expand All @@ -162,5 +163,5 @@ def matplotlib_view(gviz: graphviz.Digraph, parameters=None):
gviz
Graphviz
"""

return gview.matplotlib_view(gviz, parameters=parameters)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
return gview.matplotlib_view(gviz, parameters=parameters)
25 changes: 13 additions & 12 deletions pm4py/visualization/bpmn/variants/dagrejs.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,18 +88,19 @@ def view(temp_file_name, parameters=None):
if parameters is None:
parameters = {}

iframe_width = exec_utils.get_param_value(Parameters.IFRAME_WIDTH, parameters, 900)
iframe_height = exec_utils.get_param_value(Parameters.IFRAME_HEIGHT, parameters, 600)
local_jupyter_file_name = exec_utils.get_param_value(Parameters.LOCAL_JUPYTER_FILE_NAME, parameters, "jupyter_bpmn_vis.html")

if vis_utils.check_visualization_inside_jupyter():
from IPython.display import IFrame
shutil.copyfile(temp_file_name, local_jupyter_file_name)
iframe = IFrame(local_jupyter_file_name, width=iframe_width, height=iframe_height)
from IPython.display import display
return display(iframe)
else:
vis_utils.open_opsystem_image_viewer(temp_file_name)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
iframe_width = exec_utils.get_param_value(Parameters.IFRAME_WIDTH, parameters, 900)
iframe_height = exec_utils.get_param_value(Parameters.IFRAME_HEIGHT, parameters, 600)
local_jupyter_file_name = exec_utils.get_param_value(Parameters.LOCAL_JUPYTER_FILE_NAME, parameters, "jupyter_bpmn_vis.html")

if vis_utils.check_visualization_inside_jupyter():
from IPython.display import IFrame
shutil.copyfile(temp_file_name, local_jupyter_file_name)
iframe = IFrame(local_jupyter_file_name, width=iframe_width, height=iframe_height)
from IPython.display import display
return display(iframe)
else:
vis_utils.open_opsystem_image_viewer(temp_file_name)


def save(temp_file_name, dest_file, parameters=None):
Expand Down
48 changes: 25 additions & 23 deletions pm4py/visualization/common/gview.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,20 @@ def view(gviz, parameters=None):
gviz
GraphViz diagram
"""
if constants.DEFAULT_GVIZ_VIEW == "matplotlib_view":
return matplotlib_view(gviz, parameters=parameters)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
if constants.DEFAULT_GVIZ_VIEW == "matplotlib_view":
return matplotlib_view(gviz, parameters=parameters)

format = str(gviz.format).lower().replace("plain-ext", "html")
format = str(gviz.format).lower().replace("plain-ext", "html")

is_dot_installed = dot_util.check_dot_installed()
is_dot_installed = dot_util.check_dot_installed()

if format.startswith("html"):
html.view(gviz, parameters=parameters)
elif vis_utils.check_visualization_inside_jupyter():
vis_utils.view_image_in_jupyter(gviz.render())
else:
return gviz.view(cleanup=True)
if format.startswith("html"):
html.view(gviz, parameters=parameters)
elif vis_utils.check_visualization_inside_jupyter():
vis_utils.view_image_in_jupyter(gviz.render())
else:
return gviz.view(cleanup=True)


def matplotlib_view(gviz, parameters=None):
Expand All @@ -55,23 +56,24 @@ def matplotlib_view(gviz, parameters=None):
gviz
Graphviz
"""
format = str(gviz.format).lower()
is_dot_installed = dot_util.check_dot_installed()
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
format = str(gviz.format).lower()
is_dot_installed = dot_util.check_dot_installed()

from pm4py.visualization.common import save
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from pm4py.visualization.common import save
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

file_name = tempfile.NamedTemporaryFile(suffix='.'+format)
file_name.close()
file_name = tempfile.NamedTemporaryFile(suffix='.'+format)
file_name.close()

save.save(gviz, file_name.name)
save.save(gviz, file_name.name)

img = mpimg.imread(file_name.name)
plt.axis('off')
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.imshow(img)
plt.show()
img = mpimg.imread(file_name.name)
plt.axis('off')
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.imshow(img)
plt.show()


def serialize_dot(gviz: Digraph, parameters=None) -> bytes:
Expand Down
40 changes: 21 additions & 19 deletions pm4py/visualization/dotted_chart/visualizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,20 +72,21 @@ def view(figure: str):
figure
Path to the dotted chart
"""
if constants.DEFAULT_GVIZ_VIEW == "matplotlib_view":
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread(figure)
plt.axis('off')
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.imshow(img)
plt.show()
return

if vis_utils.check_visualization_inside_jupyter():
vis_utils.view_image_in_jupyter(figure)
else:
vis_utils.open_opsystem_image_viewer(figure)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
if constants.DEFAULT_GVIZ_VIEW == "matplotlib_view":
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread(figure)
plt.axis('off')
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.imshow(img)
plt.show()
return

if vis_utils.check_visualization_inside_jupyter():
vis_utils.view_image_in_jupyter(figure)
else:
vis_utils.open_opsystem_image_viewer(figure)


def save(figure: str, output_file_path: str):
Expand Down Expand Up @@ -125,9 +126,10 @@ def matplotlib_view(figure: str):
figure
Path to the dotted chart
"""
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread(figure)
plt.imshow(img)
plt.show()
img = mpimg.imread(figure)
plt.imshow(img)
plt.show()
9 changes: 5 additions & 4 deletions pm4py/visualization/footprints/visualizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
'''
from pm4py.visualization.footprints.variants import comparison, single, comparison_symmetric
from enum import Enum
from pm4py.util import exec_utils
from pm4py.util import exec_utils, constants
from pm4py.visualization.common import gview
from pm4py.visualization.common import save as gsave
from pm4py.visualization.common.gview import serialize, serialize_dot
Expand Down Expand Up @@ -90,7 +90,8 @@ def view(gviz, parameters=None):
gviz
GraphViz diagram
"""
return gview.view(gviz, parameters=parameters)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
return gview.view(gviz, parameters=parameters)


def matplotlib_view(gviz, parameters=None):
Expand All @@ -102,5 +103,5 @@ def matplotlib_view(gviz, parameters=None):
gviz
Graphviz
"""

return gview.matplotlib_view(gviz, parameters=parameters)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
return gview.matplotlib_view(gviz, parameters=parameters)
38 changes: 20 additions & 18 deletions pm4py/visualization/graphs/util/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,20 @@ def view(temp_file_name):
temp_file_name
Path to the temporary file hosting the graph
"""
if constants.DEFAULT_GVIZ_VIEW == "matplotlib_view":
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread(temp_file_name)
plt.axis('off')
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.imshow(img)
plt.show()
return
if vis_utils.check_visualization_inside_jupyter():
vis_utils.view_image_in_jupyter(temp_file_name)
else:
vis_utils.open_opsystem_image_viewer(temp_file_name)
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
if constants.DEFAULT_GVIZ_VIEW == "matplotlib_view":
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread(temp_file_name)
plt.axis('off')
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.imshow(img)
plt.show()
return
if vis_utils.check_visualization_inside_jupyter():
vis_utils.view_image_in_jupyter(temp_file_name)
else:
vis_utils.open_opsystem_image_viewer(temp_file_name)


def matplotlib_view(temp_file_name):
Expand All @@ -86,12 +87,13 @@ def matplotlib_view(temp_file_name):
temp_file_name
Path to the temporary file hosting the graph
"""
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
if constants.DEFAULT_ENABLE_VISUALIZATIONS_VIEW:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread(temp_file_name)
plt.imshow(img)
plt.show()
img = mpimg.imread(temp_file_name)
plt.imshow(img)
plt.show()


def serialize(temp_file_name: str) -> bytes:
Expand Down
Loading

0 comments on commit 2416f8c

Please sign in to comment.