MIF_E31211906/pythonpj/app.py

305 lines
11 KiB
Python

from flask import Flask, render_template, request
import mysql.connector
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt
app = Flask(__name__)
# Fungsi untuk terhubung ke database
def connect_to_database():
try:
connection = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="steven"
)
print("Connected to the database")
return connection
except mysql.connector.Error as e:
print("Error connecting to database:", e)
return None
#Arima demam berdarah
# Fungsi untuk mengambil data dari database
def fetch_data_from_database(connection):
try:
cursor = connection.cursor()
cursor.execute("SELECT januari, februari, maret, april, mei, juni, juli, agustus, september, oktober, november, desember FROM demam_berdarah ORDER BY id DESC LIMIT 1")
data = cursor.fetchone()
cursor.close()
return data
except mysql.connector.Error as e:
print("Error fetching data from database:", e)
return None
# Fungsi untuk mengambil hasil ringkasan model, p-value, dan forecast
def get_model_results(data, p, d, q):
if data:
data_series = list(data)
# Menyesuaikan model ARIMA ke data dengan order yang diberikan
model = ARIMA(data_series, order=(p, d, q))
model_fit = model.fit()
# Mendapatkan hasil ringkasan model
model_summary = model_fit.summary()
# Mendapatkan p-value
p_value = model_fit.pvalues
# Mendapatkan forecast values
forecast = model_fit.forecast(steps=12) # Adjust steps as needed
return model_summary, p_value, forecast
else:
return None, None, None
#arima curah_hujan
def fetch_data_from_database2(connection):
try:
cursor2 = connection.cursor()
cursor2.execute("SELECT januari, februari, maret, april, mei, juni, juli, agustus, september, oktober, november, desember FROM curah_hujan ORDER BY id DESC LIMIT 1")
data2 = cursor2.fetchone()
cursor2.close()
return data2
except mysql.connector.Error as e:
print("Error fetching data from database:", e)
return None
# Fungsi untuk mengambil hasil ringkasan model, p-value, dan forecast
def get_model_results2(data2,p, d, q):
if data2:
data_series2 = list(data2)
# Menyesuaikan model ARIMA ke data
model2 = ARIMA(data_series2, order=(p, d, q))
model_fit2 = model2.fit()
# Mendapatkan hasil ringkasan model
model_summary2 = model_fit2.summary()
# Mendapatkan p-value
p_value2 = model_fit2.pvalues
# Mendapatkan forecast values
forecast2 = model_fit2.forecast(steps=12) # Adjust steps as needed
return model_summary2, p_value2, forecast2
else:
return None, None, None
#route arima curah_hujan
@app.route('/curah_hujan', methods=['GET', 'POST'])
def curah_hujan():
connection = connect_to_database()
if request.method == 'POST':
p_order = int(request.form['p_order'])
d_order = int(request.form['d_order'])
q_order = int(request.form['q_order'])
if connection:
data2 = fetch_data_from_database2(connection)
if data2:
model_summary2, p_value2, forecast2 = get_model_results2(data2, p_order, d_order, q_order)
return render_template('curah.html', model_summary2=model_summary2, p_value2=p_value2, forecast2=forecast2, data_series2=data2, body='index.html')
else:
return "No data available from the database"
else:
return "Failed to connect to the database"
else:
data2 = fetch_data_from_database2(connection)
return render_template('curah.html', data_series2=data2)
#route arima demam_berdarah
@app.route('/', methods=['GET', 'POST'])
def index():
connection = connect_to_database()
if request.method == 'POST':
p_order = int(request.form['p_order'])
d_order = int(request.form['d_order'])
q_order = int(request.form['q_order'])
if connection:
data = fetch_data_from_database(connection)
if data:
model_summary, p_value, forecast = get_model_results(data, p_order, d_order, q_order)
return render_template('index.html', model_summary=model_summary, p_value=p_value, forecast=forecast, data_series=data, body='index.html')
else:
return "No data available from the database"
else:
return "Failed to connect to the database"
else:
data = fetch_data_from_database(connection)
return render_template('index.html', data_series=data)
#differensial demam_berdarah
def get_data_from_databasedifdb():
conn = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="steven"
)
cursor = conn.cursor()
cursor.execute("SELECT januari, februari, maret, april, mei, juni, juli, agustus, september, oktober, november, desember FROM demam_berdarah ORDER BY id DESC LIMIT 1")
rows = cursor.fetchall()
conn.close()
return rows
# Fungsi untuk melakukan diferensiasi pada data
def differentiate_datadb(data, d):
diff_data = []
for i in range(d, len(data)):
diff_data.append(data[i] - data[i-d])
return diff_data
#route differensial demam_berdarah
@app.route('/dif', methods=['GET', 'POST'])
def dif():
if request.method == 'POST':
d_value = int(request.form['d_value'])
# Mengambil data dari database
data_from_db = get_data_from_databasedifdb()
# Mengubah data menjadi DataFrame menggunakan pandas
df = pd.DataFrame(data_from_db, columns=['januari', 'februari', 'maret', 'april', 'mei', 'juni', 'juli', 'agustus', 'september', 'oktober', 'november', 'desember'])
# Mengambil data januari-desember sebagai data yang akan didiferensialkan
data_to_differentiate = df.iloc[-1].values
# Melakukan diferensiasi pada data
differentiated_data = differentiate_datadb(data_to_differentiate, d_value)
# Plot data asli dan data yang telah didiferensialkan
plt.figure(figsize=(10, 5))
plt.subplot(2, 1, 1)
plt.plot(df.columns, data_to_differentiate, marker='o')
plt.title('Data Asli')
plt.subplot(2, 1, 2)
plt.plot(df.columns[d_value:], differentiated_data, marker='o')
plt.title('Data yang Telah Didiferensialkan (d=' + str(d_value) + ')')
plt.tight_layout()
# Simpan plot sebagai file gambar
plt.savefig('static/plot.png')
return render_template('differensial.html')
def get_data_from_databasech():
conn = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="steven"
)
cursor = conn.cursor()
cursor.execute("SELECT januari, februari, maret, april, mei, juni, juli, agustus, september, oktober, november, desember FROM curah_hujan ORDER BY id DESC LIMIT 1")
rows = cursor.fetchall()
conn.close()
return rows
# Fungsi untuk melakukan diferensiasi pada data
def differentiate_datach(data, d):
diff_data = []
for i in range(d, len(data)):
diff_data.append(data[i] - data[i-d])
return diff_data
@app.route('/dif2', methods=['GET', 'POST'])
def dif2():
if request.method == 'POST':
d_value = int(request.form['d_value'])
# Mengambil data dari database
data_from_db = get_data_from_databasech()
# Mengubah data menjadi DataFrame menggunakan pandas
df = pd.DataFrame(data_from_db, columns=['januari', 'februari', 'maret', 'april', 'mei', 'juni', 'juli', 'agustus', 'september', 'oktober', 'november', 'desember'])
# Mengambil data januari-desember sebagai data yang akan didiferensialkan
data_to_differentiate = df.iloc[-1].values
# Melakukan diferensiasi pada data
differentiated_data = differentiate_datach(data_to_differentiate, d_value)
# Plot data asli dan data yang telah didiferensialkan
plt.figure(figsize=(10, 5))
plt.subplot(2, 1, 1)
plt.plot(df.columns, data_to_differentiate, marker='o')
plt.title('Data Asli')
plt.subplot(2, 1, 2)
plt.plot(df.columns[d_value:], differentiated_data, marker='o')
plt.title('Data yang Telah Didiferensialkan (d=' + str(d_value) + ')')
plt.tight_layout()
# Simpan plot sebagai file gambar
plt.savefig('static/plot2.png')
return render_template('differensial2.html')
# Tambahkan endpoint untuk menyimpan hasil peramalan
@app.route('/save_forecast', methods=['POST'])
def save_forecast():
connection = connect_to_database()
if request.method == 'POST':
forecast_values = request.form['forecast_values'].split(',')
if connection:
try:
cursor = connection.cursor()
# Simpan hasil peramalan ke dalam tabel database
query = "INSERT INTO demam_hasil (januari, februari, maret, april, mei, juni, juli, agustus, september, oktober, november, desember) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
cursor.execute(query, forecast_values)
connection.commit()
cursor.close()
connection.close()
return "Hasil peramalan berhasil disimpan."
except mysql.connector.Error as e:
connection.rollback()
return "Gagal menyimpan hasil peramalan:", e
else:
return "Gagal terhubung ke database."
# Tambahkan endpoint untuk menyimpan hasil peramalan
@app.route('/save_forecast2', methods=['POST'])
def save_forecast2():
connection = connect_to_database()
if request.method == 'POST':
forecast_values2 = request.form['forecast_values2'].split(',')
if connection:
try:
cursor = connection.cursor()
# Simpan hasil peramalan ke dalam tabel database
query = "INSERT INTO curah_hasil (januari, februari, maret, april, mei, juni, juli, agustus, september, oktober, november, desember) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
cursor.execute(query, forecast_values2)
connection.commit()
cursor.close()
connection.close()
return "Hasil peramalan berhasil disimpan."
except mysql.connector.Error as e:
connection.rollback()
return "Gagal menyimpan hasil peramalan:", e
else:
return "Gagal terhubung ke database."
if __name__ == '__main__':
app.run(debug=True)