I’m trying to pass a dictionary from my Flask file to my ChartJS but the data doesn’t load on my chart. I think there’s a problem on passing my data. Here is the format of my dictionary. Basically, it’s a time series dataframe I converted as dict.
JavaScript
x
15
15
1
[{'dates': Timestamp('2021-12-31 00:00:00'), 'cases': 2},
2
{'dates': Timestamp('2022-01-01 00:00:00'), 'cases': 0},
3
{'dates': Timestamp('2022-01-02 00:00:00'), 'cases': 1},
4
{'dates': Timestamp('2022-01-03 00:00:00'), 'cases': 1},
5
{'dates': Timestamp('2022-01-04 00:00:00'), 'cases': 1},
6
{'dates': Timestamp('2022-01-05 00:00:00'), 'cases': 1},
7
{'dates': Timestamp('2022-01-06 00:00:00'), 'cases': 1},
8
{'dates': Timestamp('2022-01-07 00:00:00'), 'cases': 1},
9
{'dates': Timestamp('2022-01-08 00:00:00'), 'cases': 1},
10
{'dates': Timestamp('2022-01-09 00:00:00'), 'cases': 1},
11
{'dates': Timestamp('2022-01-10 00:00:00'), 'cases': 1},
12
{'dates': Timestamp('2022-01-11 00:00:00'), 'cases': 1},
13
{'dates': Timestamp('2022-01-12 00:00:00'), 'cases': 1},
14
{'dates': Timestamp('2022-01-13 00:00:00'), 'cases': 1}]
15
Here is my flask file:
JavaScript
1
14
14
1
@app.route("/forecast-calculation", methods=["POST"])
2
def get_result():
3
days_ahead = 13
4
time_steps = 30
5
if request.method == "POST":
6
file = request.files['file']
7
basepath = os.path.dirname(__file__)
8
path = os.path.join(basepath, "user-uploads", file.filename)
9
df = file.save(path)
10
model, scaler, df = forecast.load(path)
11
pred_values = forecast.forecast(df, days_ahead, model, time_steps, scaler)
12
dict = forecast.final_df(df, pred_values, days_ahead, scaler)
13
return render_template("forecast-calculation.html", dict = dict)
14
Here is my HTML file
JavaScript
1
34
34
1
<canvas id="forecastCalculationchart"></canvas>
2
<script>
3
var parsed = JSON.parse('{{dict | tojson}}');
4
labels = parsed.dates.map(function(elem){
5
return elem.labels;
6
})
7
cases = data.cases.map(function(elem){
8
return elem.cases;
9
})
10
const forecastCalculation = document.getElementById('forecastCalculationchart');
11
const forecastCalculationchart = new Chart(forecastCalculation, {
12
type: 'line',
13
data: {
14
labels: labels,
15
datasets: [{
16
data:cases,
17
backgroundColor: '#001F23',
18
borderColor: '#001F23',
19
borderWidth: 2,
20
tension: 0.2
21
22
}]
23
},
24
options: {
25
plugins: {
26
legend: {
27
display: false
28
}
29
}
30
}
31
32
});
33
</script>
34
Advertisement
Answer
I solved it, what I did was to converted my result to list intead of dataframe and created a list of tuples, then passed it on my jinja file.
Here’s my python file:
JavaScript
1
10
10
1
pred_dates = predict_dates(df, days_ahead)
2
dates_list = [t.strftime("%Y-%m-%d") for t in pred_dates]
3
4
forecasted_cases = np.asarray(pred_cases, dtype=np.int64)
5
forecasted_cases = forecasted_cases.tolist()
6
7
forecasted_tuple = [(dates_list[i], forecasted_cases[i])
8
for i in range(0, len(dates_list))]
9
return forecasted_tuple
10
And my controller:
JavaScript
1
7
1
pred_values = forecast.forecast(df, days_ahead, model, time_steps, scaler)
2
forecasted_tuple = forecast.get_result(df, pred_values, days_ahead, scaler)
3
4
labels = [row[0] for row in forecasted_tuple]
5
values = [row[1] for row in forecasted_tuple]
6
return render_template("forecast-calculation.html", labels=labels, values=values)
7