import requests
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout


key = '9868b3d065ca4448baaf699d7fb35fd4'
url = f'https://api.twelvedata.com/time_series?symbol=BTC/USD&start_date=2021-11-03&end_date=2021-11-20&interval=5min&order=asc&apikey={key}'
data = pd.DataFrame(requests.get(url).json()['values'])


scaler = MinMaxScaler()
prices = scaler.fit_transform(data[['close']])


n = 24
x, y = [], []

for i in range(n, len(prices) - 12):
    x.append(prices[i-n:i])
    y.append(prices[i+12])

x, y = np.array(x), np.array(y)


model = Sequential([
    LSTM(128, return_sequences=True, activation='relu', input_shape=(n, 1)),
    Dropout(0.4),
    LSTM(64, return_sequences=True, activation='relu'),
    Dropout(0.3),
    LSTM(32, activation='relu'),
    Dropout(0.2),
    Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])
model.fit(x, y, epochs=10, batch_size=64)


url = f'https://api.twelvedata.com/time_series?symbol=BTC/USD&start_date=2021-11-20&end_date=2021-11-24&interval=5min&order=asc&apikey={key}'
test = pd.DataFrame(requests.get(url).json()['values'])

actual = pd.to_numeric(test['close']).values.reshape(-1, 1)
test_scaled = scaler.transform(actual)


x_test = np.array([
    test_scaled[i-n:i, 0]
    for i in range(n, len(test_scaled))
]).reshape(-1, n, 1)


pred = scaler.inverse_transform(model.predict(x_test))


plt.figure(figsize=(12, 6))
plt.plot(actual[n:], label='Actual Bitcoin Prices', color='green')
plt.plot(pred, label='Predicted Prices', color='red')
plt.title('Bitcoin Price Prediction')
plt.xlabel('Time Interval')
plt.ylabel('Price')
plt.legend()
plt.show()