Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| import datetime | |
| from sklearn.model_selection import train_test_split | |
| from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score, mean_absolute_error | |
| from sklearn.linear_model import LinearRegression | |
| import os | |
| app = Flask(__name__) | |
| def create_lagged_features(data, lags): | |
| features = pd.DataFrame() | |
| for lag in range(1, lags + 1): | |
| features[f'Lag_{lag}'] = data.shift(lag) | |
| return features | |
| df = pd.read_csv('./dataset/BBCA-History.csv') | |
| df = df = df.reindex(index=df.index[::-1]) | |
| df_display = df | |
| df['Tanggal'] = pd.to_datetime(df['Tanggal'], dayfirst=True) | |
| df['Perubahan%'] = df['Perubahan%'].str.replace('%', '').str.replace(',', '.').astype(float) | |
| df['Perubahan%'] = df['Perubahan%'].astype(float) | |
| df['Vol.'] = df['Vol.'].str.replace('M', 'e6').str.replace('B', 'e9').str.replace(',', '.').astype(float) | |
| # Calculate 30-day moving average | |
| df['MA30'] = df['Terakhir'].rolling(window=30).mean() | |
| # Generate the plot | |
| plt.figure(figsize=(10, 6)) | |
| plt.plot(df['Tanggal'], df['Pembukaan'], label='Harga Pembukaan') | |
| plt.plot(df['Tanggal'], df['Terakhir'], label='Harga Terakhir') | |
| plt.plot(df['Tanggal'], df['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() | |
| # Save the plot to a static file | |
| plot_path = os.path.join('static', 'plot.png') | |
| plt.savefig(plot_path) | |
| plt.close() | |
| selected_features = ['Tanggal', 'Pembukaan'] | |
| df = df[selected_features] | |
| df.set_index('Tanggal', inplace=True) | |
| lags = 90 | |
| lagged_features = create_lagged_features(df['Pembukaan'], lags) | |
| df_with_lags = pd.concat([df, lagged_features], axis=1).dropna() | |
| X = df_with_lags[[f'Lag_{i}' for i in range(1, lags + 1)]] | |
| y = df_with_lags['Pembukaan'] | |
| X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False) | |
| model = LinearRegression() | |
| model.fit(X_train, y_train) | |
| y_pred = model.predict(X_test) | |
| plt.figure(figsize=(10, 6)) | |
| plt.plot(y_test.index, y_test, label='Actual Values') | |
| plt.plot(y_test.index, y_pred, label='Predicted Values', linestyle='--') | |
| plt.xlabel('Tanggal') | |
| plt.ylabel('Harga Pembukaan') | |
| plt.title('Actual vs Predicted Values') | |
| plt.legend() | |
| # Save the plot to a static file | |
| plot_training_path = os.path.join('static', 'plot_training.png') | |
| plt.savefig(plot_training_path) | |
| plt.close() | |
| mse = mean_squared_error(y_test, y_pred) | |
| mae = mean_absolute_error(y_test, y_pred) | |
| mape = mean_absolute_percentage_error(y_test, y_pred) | |
| r2 = r2_score(y_test, y_pred) | |
| last_date = y_test.index[-1] | |
| next_date = last_date + datetime.timedelta(days=1) | |
| latest_lags = X.iloc[-1].values.reshape(1, -1) | |
| next_value = model.predict(latest_lags) | |
| def index(): | |
| table_html = df_display.to_html(classes='table table-striped', index=False) | |
| return render_template('index.html', table=table_html, plot_url=plot_path) | |
| def predict(): | |
| return render_template('predict.html', plot_training_url=plot_training_path, next_date=next_date.date(), next_value=next_value[0], mse=mse, mae=mae, mape=mape, r2=r2) | |
| if __name__ == '__main__': | |
| app.run(debug=True) |