wchynto's picture
Upload 13 files
91bea57 verified
from flask import Flask, render_template, request, redirect, url_for
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import joblib
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import LocalOutlierFactor
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
import os
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score, mean_absolute_error
app = Flask(__name__)
history_data = pd.read_csv('./datasets/HistoricalCardano.csv')
history_data = history_data.reindex(index=history_data.index[::-1])
history_data = history_data.reset_index(drop=True)
history_data['Tanggal'] = pd.to_datetime(history_data['Tanggal'], dayfirst=True)
history_data['Perubahan%'] = history_data['Perubahan%'].str.replace('%', '').str.replace(',', '.').astype(float)
history_data['Perubahan%'] = history_data['Perubahan%'].astype(float)
history_data['Vol.'] = history_data['Vol.'].str.replace('M', 'e6').str.replace('B', 'e9').str.replace(',', '.').astype(float)
history_data['Terakhir'] = history_data['Terakhir'].str.replace(',', '.').astype(float)
history_data['Pembukaan'] = history_data['Pembukaan'].str.replace(',', '.').astype(float)
history_data['Tertinggi'] = history_data['Tertinggi'].str.replace(',', '.').astype(float)
history_data['Terendah'] = history_data['Terendah'].str.replace(',', '.').astype(float)
history_data = history_data.set_index('Tanggal')
# Calculate 30-day moving average
history_data['MA30'] = history_data['Terakhir'].rolling(window=30).mean()
plt.figure(figsize=(10, 6))
plt.plot(history_data['Pembukaan'], label='Harga Pembukaan')
plt.plot(history_data['Terakhir'], label='Harga Terakhir')
plt.plot(history_data['MA30'], label='MA 30', linestyle='--', color='red')
plt.xlabel('Tanggal')
plt.ylabel('Harga')
plt.title('Pergerakan Harga Pembukaan dan Terakhir dengan MA 30')
plt.legend()
plot_ma_a = os.path.join('static', 'ma_a.png')
plt.savefig(plot_ma_a)
plt.close()
# Calculate 30-day moving average
history_data['MA30'] = history_data['Terakhir'].rolling(window=30).mean()
plt.figure(figsize=(10, 6))
plt.plot(history_data['Tertinggi'], label='Harga Tertinggi')
plt.plot(history_data['Terendah'], label='Harga Terendah')
plt.plot(history_data['MA30'], label='MA 30', linestyle='--', color='red')
plt.xlabel('Tanggal')
plt.ylabel('Harga')
plt.title('Pergerakan Harga Tertinggi dan Terendah dengan MA 30')
plt.legend()
plot_ma_b = os.path.join('static', 'ma_b.png')
plt.savefig(plot_ma_b)
plt.close()
history_data = history_data.drop(columns=['MA30'])
def create_lagged_features(data, lags=3):
lagged_data = data.copy()
for lag in range(1, lags + 1):
lagged_data[[f"{col}_lag{lag}" for col in data.columns]] = data.shift(lag)
lagged_data.dropna(inplace=True)
return lagged_data
lags = 30 * 24
# Load the model
model = joblib.load('./models/random_forest_model.pkl')
lagged_data = create_lagged_features(history_data.drop(['Vol.', 'Perubahan%'], axis=1), lags)
X = lagged_data.drop(columns=['Pembukaan', 'Terakhir', 'Tertinggi', 'Terendah'])
y = lagged_data["Pembukaan"]
def multistep_forecast(model, data, n_steps):
forecast = []
last_observation = data.iloc[-1].values.reshape(1, -1)
for _ in range(n_steps):
next_step = model.predict(last_observation)
forecast.append(next_step[0])
# Update the last observation with the new prediction
last_observation = np.roll(last_observation, -1)
last_observation[0, -1] = next_step[0]
return forecast
@app.route('/')
def index():
table_html = history_data.to_html(classes='table table-striped', index=True)
return render_template('index.html', table_html=table_html, plot_ma_a=plot_ma_a, plot_ma_b=plot_ma_b)
@app.route('/predict', methods=['GET', 'POST'])
def predict():
n_steps = 0
if request.method == 'POST':
if request.form['waktu'] == '1 bulan':
n_steps = 30
elif request.form['waktu'] == '3 bulan':
n_steps = 30 * 3
elif request.form['waktu'] == '6 bulan':
n_steps = 30 * 6
elif request.form['waktu'] == '1 tahun':
n_steps = 30 * 12
elif request.form['waktu'] == '2 tahun':
n_steps = 30 * 24
# Perform the forecast
forecasted_values = multistep_forecast(model, X, n_steps)
# Combine past and forecasted values
combined_values = np.concatenate([y.values, forecasted_values])
# Create a time index for the combined values
time_index = pd.date_range(start=y.index[0], periods=len(combined_values), freq='D')
plt.figure(figsize=(12, 6))
plt.plot(history_data.index, history_data['Pembukaan'], label="Past Data", linestyle="-", color="blue")
plt.plot(time_index[len(y):], forecasted_values, label="Forecasted Values", linestyle="-", color="green")
plt.title("All Past Data and Forecasted Future Values")
plt.xlabel("Date")
plt.ylabel("Values")
plt.legend()
plt.grid()
result_img = os.path.join('static', 'result.png')
plt.savefig(result_img)
plt.close()
forecasted_df = pd.DataFrame({
'Tanggal': time_index[len(y):],
'Forecasted_Pembukaan': forecasted_values
})
forecasted_df.to_csv('./datasets/forecasted_values.csv', index=False)
return render_template('predict.html', result_img=result_img, forecasted_table=forecasted_df.to_html(classes='table table-striped', index=False))
else:
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)