Skip to content

Filtering

synamine provides three filtering functions to subset an event log. All filters return a new EventLog -- the original is never modified.

Filter by activity

Keep (or exclude) cases that contain specific activities:

import synamine

log = synamine.read_xes("events.xes")

# Keep only cases containing "Approve"
filtered = synamine.filter_by_activity(log, activities=["Approve"])

# Exclude cases containing "Cancel"
filtered = synamine.filter_by_activity(log, activities=["Cancel"], exclude=True)

Filter by timeframe

Keep cases that fall within a time range:

from datetime import datetime

filtered = synamine.filter_by_timeframe(
    log,
    start=datetime(2024, 1, 1),
    end=datetime(2024, 6, 30),
)

# Only start bound
filtered = synamine.filter_by_timeframe(log, start=datetime(2024, 1, 1))

# Only end bound
filtered = synamine.filter_by_timeframe(log, end=datetime(2024, 6, 30))

Filter by variant

Keep cases that match the most common variants:

# Keep the top 5 most frequent variants
filtered = synamine.filter_by_variant(log, top_k=5)

# Keep specific variants
filtered = synamine.filter_by_variant(
    log,
    variants=[("Register", "Approve", "Close")],
)

Chaining filters

Since each filter returns a new EventLog, you can chain them:

result = synamine.filter_by_activity(log, activities=["Approve"])
result = synamine.filter_by_timeframe(result, start=datetime(2024, 1, 1))
result = synamine.filter_by_variant(result, top_k=10)

print(f"Filtered: {result.num_cases} cases ({result.num_events} events)")