def plot_forecast(model_output, queue): """ Plots output from R forecast. Uses R functions extracted via rpy2 (see global vars above). Parameters ---------- model_output R object returned by leptoid.forecasting._forecast_utilization(). Contains forecast information (confidence intervals, etc.). queue leptoid.ServiceQueue with information about the service Returns nothing, but saves a plot to disk with a timestamp. """ forecast_method = get_forecast_attribute(model_output, attr='method') n = datetime.datetime.now() RBMP('%s%s-%s-%i-%i-%i-%i:%i.jpg' % (PLOT_DIRECTORY, queue.service, queue.instance_id, n.year, n.month, n.day, n.hour, n.minute), width=1400, height=800, units='px', type='jpeg') RPLOT(model_output, main="Util forecast for %s:%s (using %s)" % (queue.service, queue.instance_id, forecast_method), xlab="Minutes elapsed since %s" % queue.get_first_timestamp()) RDEVOFF()
def forecast(queue): """ Forecasting values using R's forecast package. Series reporting empty data over the last ${recent_data_window} minutes will return None. Parameters ---------- queue pandas.TimeSeries with utilization data. Data is extracted from the underlying buffer using np.frombuffer. service, instance_id information for instance, used when plotting TODO: Currently Leptoid uses R via rpy2. This will change since rpy2 is poorly maintained. """ LOG.info("Generating forecast for %s:%s" % (queue.service, queue.instance_id)) # Retrieving forecast from rpy2, then extracting the attributes # (forecasted utilization, one-step ahead forecast) we want. model_output = _forecast_utilization(np.frombuffer(queue.utilization.data)) # Handling case where output == None, indicating a dormant instance. if model_output == None: in_sample_forecast = None util_estimate = None else: in_sample_forecast = get_forecast_attribute(model_output, "fitted") util_estimate = get_forecast_attribute(model_output, "mean") # Let's avoid empty plots if np.max(util_estimate) > PLOT_SIGNIFICANCE_THRESHOLD: plot_forecast(model_output, queue) return (in_sample_forecast, util_estimate)