Skip to content

Commit

Permalink
Merge pull request #2225 from LTMXcitrus/master
Browse files Browse the repository at this point in the history
Add seasonality parameter for holt-winters functions
  • Loading branch information
DanCech committed Feb 8, 2018
2 parents b8f9aed + 5abfd4c commit ba4b77d
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions webapp/graphite/render/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -3466,11 +3466,12 @@ def holtWintersDeviation(gamma,actual,prediction,last_seasonal_dev):
prediction = 0
return gamma * math.fabs(actual - prediction) + (1 - gamma) * last_seasonal_dev

def holtWintersAnalysis(series):
def holtWintersAnalysis(series, seasonality='1d'):
alpha = gamma = 0.1
beta = 0.0035
# season is currently one day
season_length = (24*60*60) // series.step
seasonality_time = parseTimeOffset(seasonality)
season_length = (seasonality_time.seconds + (seasonality_time.days * 86400)) // series.step
intercept = 0
slope = 0
intercepts = list()
Expand Down Expand Up @@ -3559,7 +3560,7 @@ def getLastDeviation(i):
}
return results

def holtWintersForecast(requestContext, seriesList, bootstrapInterval='7d'):
def holtWintersForecast(requestContext, seriesList, bootstrapInterval='7d', seasonality='1d'):
"""
Performs a Holt-Winters forecast using the series as input data. Data from
`bootstrapInterval` (one week by default) previous to the series is used to bootstrap the initial forecast.
Expand All @@ -3573,7 +3574,7 @@ def holtWintersForecast(requestContext, seriesList, bootstrapInterval='7d'):
previewList = evaluateTarget(newContext, requestContext['args'][0])
results = []
for series in previewList:
analysis = holtWintersAnalysis(series)
analysis = holtWintersAnalysis(series, seasonality)
predictions = analysis['predictions']
windowPoints = previewSeconds // predictions.step
series.tags['holtWintersForecast'] = 1
Expand All @@ -3588,9 +3589,10 @@ def holtWintersForecast(requestContext, seriesList, bootstrapInterval='7d'):
holtWintersForecast.params = [
Param('seriesList', ParamTypes.seriesList, required=True),
Param('bootstrapInterval', ParamTypes.interval, default='7d', suggestions=['7d', '30d']),
Param('seasonality', ParamTypes.interval, default='1d', suggestions=['1d', '7d']),
]

def holtWintersConfidenceBands(requestContext, seriesList, delta=3, bootstrapInterval='7d'):
def holtWintersConfidenceBands(requestContext, seriesList, delta=3, bootstrapInterval='7d', seasonality='1d'):
"""
Performs a Holt-Winters forecast using the series as input data and plots
upper and lower bands with the predicted forecast deviations.
Expand All @@ -3604,7 +3606,7 @@ def holtWintersConfidenceBands(requestContext, seriesList, delta=3, bootstrapInt
previewList = evaluateTarget(newContext, requestContext['args'][0])
results = []
for series in previewList:
analysis = holtWintersAnalysis(series)
analysis = holtWintersAnalysis(series, seasonality)

data = analysis['predictions']
windowPoints = previewSeconds // data.step
Expand Down Expand Up @@ -3655,16 +3657,17 @@ def holtWintersConfidenceBands(requestContext, seriesList, delta=3, bootstrapInt
Param('seriesList', ParamTypes.seriesList, required=True),
Param('delta', ParamTypes.integer, default=3),
Param('bootstrapInterval', ParamTypes.interval, default='7d', suggestions=['7d', '30d']),
Param('seasonality', ParamTypes.interval, default='1d', suggestions=['1d', '7d']),
]

def holtWintersAberration(requestContext, seriesList, delta=3, bootstrapInterval='7d'):
def holtWintersAberration(requestContext, seriesList, delta=3, bootstrapInterval='7d', seasonality='1d'):
"""
Performs a Holt-Winters forecast using the series as input data and plots the
positive or negative deviation of the series data from the forecast.
"""
results = []
for series in seriesList:
confidenceBands = holtWintersConfidenceBands(requestContext, [series], delta, bootstrapInterval)
confidenceBands = holtWintersConfidenceBands(requestContext, [series], delta, bootstrapInterval, seasonality)
lowerBand = confidenceBands[0]
upperBand = confidenceBands[1]
aberration = list()
Expand All @@ -3689,14 +3692,15 @@ def holtWintersAberration(requestContext, seriesList, delta=3, bootstrapInterval
Param('seriesList', ParamTypes.seriesList, required=True),
Param('delta', ParamTypes.integer, default=3),
Param('bootstrapInterval', ParamTypes.interval, default='7d', suggestions=['7d', '30d']),
Param('seasonality', ParamTypes.interval, default='1d', suggestions=['1d', '7d']),
]

def holtWintersConfidenceArea(requestContext, seriesList, delta=3, bootstrapInterval='7d'):
def holtWintersConfidenceArea(requestContext, seriesList, delta=3, bootstrapInterval='7d', seasonality='1d'):
"""
Performs a Holt-Winters forecast using the series as input data and plots the
area between the upper and lower bands of the predicted forecast deviations.
"""
bands = holtWintersConfidenceBands(requestContext, seriesList, delta, bootstrapInterval)
bands = holtWintersConfidenceBands(requestContext, seriesList, delta, bootstrapInterval, seasonality)
results = areaBetween(requestContext, bands)
for series in results:
if 'areaBetween' in series.tags:
Expand All @@ -3711,6 +3715,7 @@ def holtWintersConfidenceArea(requestContext, seriesList, delta=3, bootstrapInte
Param('seriesList', ParamTypes.seriesList, required=True),
Param('delta', ParamTypes.integer, default=3),
Param('bootstrapInterval', ParamTypes.interval, default='7d', suggestions=['7d', '30d']),
Param('seasonality', ParamTypes.interval, default='1d', suggestions=['1d', '7d']),
]

def linearRegressionAnalysis(series):
Expand Down

0 comments on commit ba4b77d

Please sign in to comment.