Skip to content

Releases: ShawnStrasser/atspm

v2.0.0

09 Dec 19:42

Choose a tag to compare

Version 2.0.0 (December 9, 2025)

Breaking Changes / Features:

  • Timeline now outputs EventClass/EventValue (bucketed TimeStamp removed) and retains IsValid; use maxtime=True to include MAXTIME-only events (Splits and Alarm event 175).
  • The IsValid column is true when the data appears complete, but if there are missing events then it is False.
  • Removed splits_only in favor of the maxtime flag for timeline.
  • Added ped_delay aggregation that averages pedestrian delay from timeline using EndTime buckets at the configured bin_size.
  • Documented the timeline dimension table in this README (previously available via SignalDataProcessor.timeline_description).

v1.9.4

25 Nov 01:58

Choose a tag to compare

Better housekeeping to keep memory low, added an optional context manager support.

Full Changelog: v1.9.3...v1.9.4

v1.9.3

16 Nov 00:22

Choose a tag to compare

Added unit test for detector health, bug fix with table name, and updated dependencies.

v1.9.2

15 Nov 23:12

Choose a tag to compare

Bug fix to work with new traffic-anomaly API.

v1.9.1

04 Mar 19:11

Choose a tag to compare

Version 1.9.1 (March 4, 2025)

Bug Fixes / Improvements:

Filling in missing time periods for detectors with zero actuations didn't work for incremental processing, this has been fixed by tracking a list of known detectors between each run, similar to the unmatched event tracking. So how it works is you provide a dataframe or file path of known detectors, it will filter out detectors last seen more than n days ago, and then will fill in missing time periods with zeros for the remaining detectors.

known_detectors_df='path/to/known_detectors.csv'
# or supply Pandas DataFrame directly

from src.atspm import SignalDataProcessor, sample_data

# Set up all parameters
params = {
    # Global Settings
    'raw_data': sample_data.data,
    'bin_size': 15, 
# Performance Measures
'aggregations': [
    {'name': 'actuations', 'params': {
            'fill_in_missing': True,
            'known_detectors_df_or_path': known_detectors_df,
            'known_detectors_max_days_old': 2
    }}
]
}

After you run the processor, here's how to query the known detectors table:

processor = SignalDataProcessor(**params)
processor.load()
processor.aggregate()
# get all table names from the database
known_detectors_df = processor.conn.query("SELECT * FROM known_detectors;").df()

Here's what the known detectors table could look like:

DeviceId Detector LastSeen
1 1 2025-03-04 00:00:00
1 2 2025-03-04 00:00:00
2 1 2025-03-04 00:00:00

v1.9.0

19 Feb 23:44

Choose a tag to compare

Version 1.9.0 (February 19, 2025)

New Features:

Added option to fill in missing time periods for detector actuations with zeros. This makes it clearer when there are no actuations for a detector vs no data due to comm loss. Having zero-value actuation time periods also allows detector health to consider them when identifying anomalies.

New timeline events:

  • Pedestrian Delay (from button bush to walk)
  • Overlap Events
  • Detector faults including stuck off and other
  • Phase Hold
  • Phase Omit
  • Ped Omit
  • Stop Time

Also updated tests to include these new features. This is a lot of new events to process, so be sure to test thoroughly before deploying to production.

v1.8.4

12 Sep 22:17

Choose a tag to compare

Version 1.8.4 (September 12, 2024)

Bug Fixes / Improvements:

Fixed a timestamp conversion issue when reading unmatched events from a csv file. Updated the unit tests to catch this issue in the future.

v1.8.3

05 Sep 15:48

Choose a tag to compare

Version 1.8.3 (September 5, 2024)

Bug Fixes / Improvements:

  • Fixed estimated volumes for full_ped. Previously, it was converting 15-minute ped data to hourly by applying a rolling sum, then applying the quadratic transform to get volumes, and then converted back to 15-minute by undoing the rolling sum. The bug had to do with the data not always being ordered correctly before undoing the rolling sum. However, this update removes the undo rolling sum altogether and replaces it with multiplying hourly volumes by the ratio of 15-minute data to hourly dat (more detail coming in the docs eventually). It seems to work much better now.

v1.8.2

30 Aug 00:13

Choose a tag to compare

Version 1.8.2 (August 28, 2024)

Bug Fixes / Improvements:

  • Fixed issue when passing unmatched events as a dataframe instead of a file path.
  • Added more tests for incremental runs when using dataframes. This is to mimic the ODOT production environment.

v1.8.0

28 Aug 17:45

Choose a tag to compare

Version 1.8.0 (August 28, 2024)

Bug Fixes / Improvements:

  • Removed unused code from yellow_red for efficiency, but it's still not passing tests for incremental processing.

New Features:

  • Added special functions and advance warning to timeline events.