Persistence Extension for time periods

Hello,
is there a way to have something like

<item>.maximumSince(AbstractInstant)

for a time period other than between now and e.g. now.minusDays(1)?

For example I would like to get the maximum value of an item for a time period of 24 hours but 1 week ago.

Best regards

For maximumSince and minimumSince, there is no way to do what you are asking, unless you use the persistence data directly from your database, or by accessing it through the REST API. There are some examples of this in the forum, like this one…

The averageSince can be gotten using the following:

The average of the data from the last 24 hours:

day1_average = averageSince(now.minusDays(1))

The average of the data between the last 2*24 hours and 24 hours:

day2_average = 2 * averageSince(now.minusDays(2)) - day1_average

The average of the data between the last 3*24 hours and 2*24 hours:

day3_average = 3 * averageSince(now.minusDays(3)) - day2_average - day1_average
day3_average = 3 * averageSince(now.minusDays(3)) - (2 * averageSince(now.minusDays(2)) - day1_average) - day1_average
day3_average = 3 * averageSince(now.minusDays(3)) - 2 * averageSince(now.minusDays(2)) + day1_average - day1_average
day3_average = 3 * averageSince(now.minusDays(3)) - 2 * averageSince(now.minusDays(2))

The average of the data between the last 4*24 hours and 3*24 hours:

day4_average = 4 * averageSince(now.minusDays(4)) - (3 * averageSince(now.minusDays(3)) - day2_average - day1_average) - day2_average - day1_average
day4_average = 4 * averageSince(now.minusDays(4)) - 3 * averageSince(now.minusDays(3)) + day2_average + day1_average - day2_average - day1_average
day4_average = 4 * averageSince(now.minusDays(4)) - 3 * averageSince(now.minusDays(3))

So, this all just reduces down to…

dayX_average = X * averageSince(now.minusDays(X)) - (X - 1)(averageSince(now.minusDays(X - 1)))

Here is a function that you can use in Jython…

from core.log import logging, LOG_PREFIX, log_traceback
LOG = logging.getLogger("{}.TEST".format(LOG_PREFIX))

@log_traceback
def daily_average(item_name, days_ago):
    from org.joda.time.DateTime import now
    from core.actions import PersistenceExtensions
    
    item = itemRegistry.getItem(item_name)
    
    if days_ago == 1:
        return PersistenceExtensions.averageSince(item, now().minusDays(1)).doubleValue()
    else:
        return days_ago * PersistenceExtensions.averageSince(item, now().minusDays(days_ago)).doubleValue() - (days_ago - 1) * PersistenceExtensions.averageSince(item, now().minusDays(days_ago - 1)).doubleValue()

If you look into your persistence database to verify this formula, keep in mind that averageSince is a time-weighted average.

2 Likes