Spaces:
Sleeping
Sleeping
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 | |
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) | |
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) |