{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import the necessary libraries\nimport numpy as np\nimport pandas as pd\nfrom sklearn.preprocessing import LabelEncoder, MinMaxScaler\nfrom sklearn.model_selection import train_test_split\nfrom keras.models import Sequential\nfrom keras.layers import Dense, LSTM\nimport matplotlib.pyplot as plt\n\n# Load the dataset\ndata = pd.read_csv(\"/kaggle/input/tesla/TSLA.csv\")\ndata = data[['Date', 'Adj Close']] # only keep relevant columns\n\n# Encode the date column\nlabel_encoder = LabelEncoder()\ndata['Date'] = label_encoder.fit_transform(data['Date'])\n\n# Drop any null values\ndata = data.dropna()\n\n# Split the data into training and testing sets\nX_train, X_test, y_train, y_test = train_test_split(data['Date'], data['Adj Close'], test_size=0.2, random_state=0)\n\n# Scale the data\nscaler = MinMaxScaler()\ny_train = scaler.fit_transform(y_train.values.reshape(-1, 1))\ny_test = scaler.transform(y_test.values.reshape(-1, 1))\n\n# Reshape the data for LSTM model\nX_train = np.reshape(X_train.values, (X_train.shape[0], 1, 1))\nX_test = np.reshape(X_test.values, (X_test.shape[0], 1, 1))\n\n# Define the LSTM model\nmodel = Sequential()\nmodel.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))\nmodel.add(LSTM(units=50))\nmodel.add(Dense(1))\n\n# Compile the model\nmodel.compile(optimizer='adam', loss='mean_squared_error')\n\n# Train the model\nmodel.fit(X_train, y_train, epochs=100, batch_size=32)\n\n# Predictions\ntrain_predict = model.predict(X_train)\ntest_predict = model.predict(X_test)\n\n# Invert the scaling\ntrain_predict = scaler.inverse_transform(train_predict)\ny_train = scaler.inverse_transform(y_train)\ntest_predict = scaler.inverse_transform(test_predict)\ny_test = scaler.inverse_transform(y_test)\n\n# Evaluate the model\ntrain_rmse = np.sqrt(np.mean((train_predict - y_train)**2))\ntest_rmse = np.sqrt(np.mean((test_predict - y_test)**2))\nprint(\"Train RMSE: \", train_rmse)\nprint(\"Test RMSE: \", test_rmse)\n\n# Visualize the predictions\nplt.plot(y_test, color='blue', label='Actual')\nplt.plot(test_predict, color='red', label='Predicted')\nplt.title('Prediction')\nplt.xlabel('Time')\nplt.ylabel('Values')\nplt.legend()\nplt.show()\n\n# Reshape the output of 'data['Adj Close'].values' to have 2 dimensions\nactual_values = data['Adj Close'].values.reshape(-1, 1)\n\n# Concatenate the actual and predicted values\nall_values = np.concatenate([actual_values, test_predict])\n\n# Create a valid starting date\nstart_date = pd.Timestamp(data['Date'].iloc[-1])\n\n# Add 1 month to the starting date for each period\ndates = [start_date + pd.offsets.MonthBegin(n=1) for n in range(len(all_values))]\n\n# Convert the list of dates to a pandas DatetimeIndex\ndates = pd.DatetimeIndex(dates)\n\n# Visualize the predicted values\nplt.plot(data['Date'], data['Adj Close'], label='Actual')\nplt.plot(dates, all_values, label='Predicted')\nplt.title('Prediction for the next 1 year')\nplt.xlabel('Time')\nplt.ylabel('Values')\nplt.legend()\nplt.show()","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"[](http://)","metadata":{}}]}