import pandas as pd
import matplotlib
import numpy as np
from functions.sql_functions import execute_sql_statement
import pmdarima as pm
import io
import base64
matplotlib.use('Agg')
import matplotlib.pyplot as plt
def render_plot(dates, city_id):
sql_stmt = "select date, city_id, cast(avg_temperature as real) as temp from temperature where date is not null and temp is not null and city_id = " + str(city_id)
result = execute_sql_statement(sql_stmt)
data = pd.DataFrame(result, columns=["date", "city_id", "temp"])
data.set_index(["date", "city_id"], inplace=True)
ts_model = pm.auto_arima(data.temp, start_p=1, start_q=1,
test='adf',
max_p=3, max_q=3,
m=5,
d=None,
seasonal=False,
start_P=0,
D=0,
trace=True,
error_action='ignore',
suppress_warnings=True,
stepwise=True)
n_periods = len(dates)
n_years = dates
city_ids = np.repeat(city_id, n_periods)
fc, confint = ts_model.predict(
n_periods=n_periods, return_conf_int=True)
fc_ind = pd.Series(n_years, city_ids)
fc_series = pd.Series(fc, index=fc_ind)
lower_series = pd.Series(confint[:, 0], index=fc_ind)
upper_series = pd.Series(confint[:, 1], index=fc_ind)
plt.figure(figsize=(12, 5))
plt.plot(fc_series, color="darkred")
plt.fill_between(lower_series.index,
lower_series,
upper_series,
color="k", alpha=.35)
plt.title("Temperature Forecast")
plt.xlabel("Date")
plt.ylabel("Temperature (°C)")
plt.xticks(rotation=45)
plt.tight_layout()
ax = plt.gca()
line = ax.lines[0]
x_data = line.get_xdata().tolist()
y_data = line.get_ydata().tolist()
upper_bound = upper_series.tolist()
lower_bound = lower_series.tolist()
# Convert x_data, y_data, upper_bound, lower_bound to dict
data = {
"x_data": x_data,
"y_data": y_data,
"upper_bound": upper_bound,
"lower_bound": lower_bound
}
return data