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

# Load Google stock data
data = yf.download('GOOG', start='2015-01-01', end='2020-01-01')
close_prices = data['Close'].values.reshape(-1,1)

# Normalize data
scaler = MinMaxScaler(feature_range=(0,1))
scaled_data = scaler.fit_transform(close_prices)

# Prepare sequences
def create_dataset(dataset, time_step=60):
    X, Y = [], []
    for i in range(len(dataset)-time_step-1):
        X.append(dataset[i:(i+time_step),0])
        Y.append(dataset[i+time_step,0])
    return np.array(X), np.array(Y)

X, Y = create_dataset(scaled_data)
X = X.reshape(X.shape[0], X.shape[1], 1)

# Split train/test
train_size = int(len(X)*0.8)
X_train, Y_train = X[:train_size], Y[:train_size]
X_test, Y_test = X[train_size:], Y[train_size:]

# Build LSTM model
model = Sequential([
    LSTM(50, return_sequences=True, input_shape=(60,1)),
    LSTM(50),
    Dense(1)
])

# Compile & Train
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, Y_train, epochs=10, batch_size=64, validation_data=(X_test,Y_test))

# Predictions
train_pred = model.predict(X_train)
test_pred = model.predict(X_test)

# Inverse scaling
train_pred = scaler.inverse_transform(train_pred)
test_pred = scaler.inverse_transform(test_pred)

# Plot results
plt.figure(figsize=(12,6))
plt.plot(scaler.inverse_transform(scaled_data), label='Original')

# Training predictions
plt.plot(range(60, 60+len(train_pred)), train_pred, label='Train Predict')

# Testing predictions
plt.plot(range(60+len(train_pred), 60+len(train_pred)+len(test_pred)), test_pred, label='Test Predict')

plt.legend()
plt.show()