{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "TvFpYETXy-H5" }, "source": [ "

Data Mining Assignment (Group 5)

\n", "
\n", "

Members:

\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "q88GtkqE1fHg" }, "source": [ "

Case : Memprediksi harga cryptocurrency menggunakan LSTM (Long Short Term Memory)

\n", "
\n", "

Objectives :

\n", "\n", "\n", "
\n", "\n", "

Attributes :

\n", "\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "tAkelue23B86" }, "source": [ "

Data Collection

" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cdTcjhxS2FYc", "outputId": "4b013a76-e6a7-4756-e9e3-036d1488b46a" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Cloning into 'cryptocurrency_prediction'...\n", "remote: Enumerating objects: 4725, done.\u001b[K\n", "remote: Counting objects: 100% (4556/4556), done.\u001b[K\n", "remote: Compressing objects: 100% (1411/1411), done.\u001b[K\n", "remote: Total 4725 (delta 3431), reused 4142 (delta 3120), pack-reused 169\u001b[K\n", "Receiving objects: 100% (4725/4725), 316.49 MiB | 11.64 MiB/s, done.\n", "Resolving deltas: 100% (3433/3433), done.\n", "Updating files: 100% (296/296), done.\n", "total 5420\n", "drwxr-xr-x 2 root root 4096 Jun 23 10:42 .\n", "drwxr-xr-x 1 root root 4096 Jun 23 10:42 ..\n", "-rw-r--r-- 1 root root 159656 Jun 23 10:42 ADA-USD.csv\n", "-rw-r--r-- 1 root root 41219 Jun 23 10:42 APT21794-USD.csv\n", "-rw-r--r-- 1 root root 30347 Jun 23 10:42 ARB11841-USD.csv\n", "-rw-r--r-- 1 root root 100157 Jun 23 10:42 AR-USD.csv\n", "-rw-r--r-- 1 root root 131290 Jun 23 10:42 ATOM-USD.csv\n", "-rw-r--r-- 1 root root 99663 Jun 23 10:42 AVAX-USD.csv\n", "-rw-r--r-- 1 root root 185947 Jun 23 10:42 BCH-USD.csv\n", "-rw-r--r-- 1 root root 177037 Jun 23 10:42 BNB-USD.csv\n", "-rw-r--r-- 1 root root 152142 Jun 23 10:42 BTCB-USD.csv\n", "-rw-r--r-- 1 root root 296387 Jun 23 10:42 BTC-USD.csv\n", "-rw-r--r-- 1 root root 130852 Jun 23 10:42 CRO-USD.csv\n", "-rw-r--r-- 1 root root 110120 Jun 23 10:42 DAI-USD.csv\n", "-rw-r--r-- 1 root root 159157 Jun 23 10:42 DOGE-USD.csv\n", "-rw-r--r-- 1 root root 95561 Jun 23 10:42 DOT-USD.csv\n", "-rw-r--r-- 1 root root 11152 Jun 23 10:42 EETH-USD.csv\n", "-rw-r--r-- 1 root root 168057 Jun 23 10:42 ETC-USD.csv\n", "-rw-r--r-- 1 root root 193875 Jun 23 10:42 ETH-USD.csv\n", "-rw-r--r-- 1 root root 9822 Jun 23 10:42 EZETH-USD.csv\n", "-rw-r--r-- 1 root root 159769 Jun 23 10:42 FIL-USD.csv\n", "-rw-r--r-- 1 root root 0 Jun 23 10:42 .gitkeep\n", "-rw-r--r-- 1 root root 113446 Jun 23 10:42 HBAR-USD.csv\n", "-rw-r--r-- 1 root root 77597 Jun 23 10:42 ICP-USD.csv\n", "-rw-r--r-- 1 root root 62639 Jun 23 10:42 IMX10603-USD.csv\n", "-rw-r--r-- 1 root root 48559 Jun 23 10:42 KAS-USD.csv\n", "-rw-r--r-- 1 root root 119270 Jun 23 10:42 LEO-USD.csv\n", "-rw-r--r-- 1 root root 163285 Jun 23 10:42 LINK-USD.csv\n", "-rw-r--r-- 1 root root 251825 Jun 23 10:42 LTC-USD.csv\n", "-rw-r--r-- 1 root root 123859 Jun 23 10:42 MATIC-USD.csv\n", "-rw-r--r-- 1 root root 22354 Jun 23 10:42 MNT27075-USD.csv\n", "-rw-r--r-- 1 root root 89375 Jun 23 10:42 NEAR-USD.csv\n", "-rw-r--r-- 1 root root 28585 Jun 23 10:42 PEPE24478-USD.csv\n", "-rw-r--r-- 1 root root 95368 Jun 23 10:42 RNDR-USD.csv\n", "-rw-r--r-- 1 root root 92698 Jun 23 10:42 SHIB-USD.csv\n", "-rw-r--r-- 1 root root 109405 Jun 23 10:42 SOL-USD.csv\n", "-rw-r--r-- 1 root root 101283 Jun 23 10:42 STETH-USD.csv\n", "-rw-r--r-- 1 root root 66723 Jun 23 10:42 TON11419-USD.csv\n", "-rw-r--r-- 1 root root 160279 Jun 23 10:42 TRX-USD.csv\n", "-rw-r--r-- 1 root root 92953 Jun 23 10:42 UNI7083-USD.csv\n", "-rw-r--r-- 1 root root 138757 Jun 23 10:42 USDC-USD.csv\n", "-rw-r--r-- 1 root root 8215 Jun 23 10:42 USDE29470-USD.csv\n", "-rw-r--r-- 1 root root 164142 Jun 23 10:42 USDT-USD.csv\n", "-rw-r--r-- 1 root root 33413 Jun 23 10:42 WBETH-USD.csv\n", "-rw-r--r-- 1 root root 164970 Jun 23 10:42 WBTC-USD.csv\n", "-rw-r--r-- 1 root root 15438 Jun 23 10:42 WEETH-USD.csv\n", "-rw-r--r-- 1 root root 183054 Jun 23 10:42 WETH-USD.csv\n", "-rw-r--r-- 1 root root 26057 Jun 23 10:42 WHBAR-USD.csv\n", "-rw-r--r-- 1 root root 12398 Jun 23 10:42 WIF-USD.csv\n", "-rw-r--r-- 1 root root 78410 Jun 23 10:42 WSTETH-USD.csv\n", "-rw-r--r-- 1 root root 53592 Jun 23 10:42 WTRX-USD.csv\n", "-rw-r--r-- 1 root root 159057 Jun 23 10:42 XLM-USD.csv\n", "-rw-r--r-- 1 root root 161425 Jun 23 10:42 XRP-USD.csv\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [] }, "metadata": {}, "execution_count": 1 } ], "source": [ "%%shell\n", "set -e\n", "\n", "REPO_URL=\"https://github.com/belajarqywok/cryptocurrency_prediction\"\n", "REPO_DIR=\"cryptocurrency_prediction\"\n", "DATASET_DIR=\"datasets\"\n", "\n", "if ! command -v git &> /dev/null\n", "then\n", " apt install -y git\n", "fi\n", "\n", "if [ -d \"$REPO_DIR\" ]; then\n", " rm -rf \"$REPO_DIR\"\n", "fi\n", "\n", "git clone \"$REPO_URL\"\n", "\n", "if [ -d \"$DATASET_DIR\" ]; then\n", " rm -rf \"$DATASET_DIR\"\n", "fi\n", "\n", "if [ -d \"$REPO_DIR/$DATASET_DIR\" ]; then\n", " mv \"$REPO_DIR/$DATASET_DIR\" .\n", "fi\n", "\n", "rm -rf \"$REPO_DIR\"\n", "ls -al \"$DATASET_DIR\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6Waj_50o7A5T", "outputId": "782f1eb0-6247-4f01-cbb1-41072b34d128" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Datasets:\n", " - ADA-USD.csv\n", " - APT21794-USD.csv\n", " - AR-USD.csv\n", " - ARB11841-USD.csv\n", " - ATOM-USD.csv\n", " - AVAX-USD.csv\n", " - BCH-USD.csv\n", " - BNB-USD.csv\n", " - BTC-USD.csv\n", " - BTCB-USD.csv\n", " - and other (... 40)\n" ] } ], "source": [ "import os\n", "from warnings import filterwarnings\n", "\n", "filterwarnings('ignore')\n", "\n", "DATASETS_PATH = './datasets'\n", "DATASETS = sorted(\n", " [\n", " item for item in os.listdir(DATASETS_PATH)\n", " if os.path.isfile(os.path.join(DATASETS_PATH, item)) and item.endswith('.csv')\n", " ]\n", ")\n", "\n", "print('Datasets:')\n", "for i in DATASETS[:10]: print(f' - {i}')\n", "print(f' - and other (... {len(DATASETS) - 10})')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5FFY-zfREV6N", "outputId": "335cff2d-0800-487b-9268-ffa311c8c276" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Head of ADA-USD.csv:\n", " Date Open High Low Close Adj Close Volume\n", "2414 2024-06-19 0.383565 0.397249 0.380962 0.383791 0.383791 295424813\n", "2415 2024-06-20 0.383791 0.396790 0.379014 0.384244 0.384244 286206619\n", "2416 2024-06-21 0.384248 0.390342 0.374608 0.376052 0.376052 272257203\n", "2417 2024-06-22 0.376051 0.389592 0.371937 0.384812 0.384812 241766850\n", "2418 2024-06-23 0.384794 0.390563 0.384018 0.390563 0.390563 228810128\n", "\n", "\n", "Head of APT21794-USD.csv:\n", " Date Open High Low Close Adj Close Volume\n", "609 2024-06-19 6.829489 7.109319 6.751914 6.891644 6.891644 153104339\n", "610 2024-06-20 6.891644 7.158962 6.729643 6.907999 6.907999 168130290\n", "611 2024-06-21 6.906493 7.029233 6.812755 6.937375 6.937375 144017997\n", "612 2024-06-22 6.937681 6.938184 6.816058 6.863215 6.863215 72928164\n", "613 2024-06-23 6.862212 6.980551 6.856907 6.966905 6.966905 67397728\n", "\n", "\n", "Head of AR-USD.csv:\n", " Date Open High Low Close Adj Close \\\n", "1484 2024-06-19 25.905121 28.720102 25.653254 27.214239 27.214239 \n", "1485 2024-06-20 27.214239 29.259483 25.848511 26.031660 26.031660 \n", "1486 2024-06-21 26.032036 28.137741 25.237125 27.950066 27.950066 \n", "1487 2024-06-22 27.947155 28.206366 27.162918 27.569958 27.569958 \n", "1488 2024-06-23 27.572495 27.938768 27.286060 27.455824 27.455824 \n", "\n", " Volume \n", "1484 93779407 \n", "1485 99510760 \n", "1486 72331851 \n", "1487 50006957 \n", "1488 37841332 \n", "\n", "\n", "Head of ARB11841-USD.csv:\n", " Date Open High Low Close Adj Close Volume\n", "454 2024-06-19 0.795205 0.833718 0.788190 0.812209 0.812209 233180885\n", "455 2024-06-20 0.812209 0.846925 0.800655 0.800927 0.800927 233003450\n", "456 2024-06-21 0.800919 0.808209 0.783914 0.800980 0.800980 223405761\n", "457 2024-06-22 0.801005 0.809611 0.792755 0.804520 0.804520 107189509\n", "458 2024-06-23 0.804471 0.814209 0.803329 0.813469 0.813469 97651768\n", "\n", "\n", "Head of ATOM-USD.csv:\n", " Date Open High Low Close Adj Close Volume\n", "1924 2024-06-19 6.696579 6.948950 6.645863 6.886108 6.886108 115990687\n", "1925 2024-06-20 6.886108 7.101937 6.825943 6.836057 6.836057 122051264\n", "1926 2024-06-21 6.835967 6.917904 6.761434 6.786554 6.786554 108532734\n", "1927 2024-06-22 6.785939 6.801940 6.716470 6.741094 6.741094 67174738\n", "1928 2024-06-23 6.741003 6.831733 6.740849 6.814218 6.814218 59929412\n", "\n", "\n", "Head of AVAX-USD.csv:\n", " Date Open High Low Close Adj Close \\\n", "1437 2024-06-19 26.617783 27.589130 26.420097 26.891941 26.891941 \n", "1438 2024-06-20 26.891941 28.845137 26.717438 27.544409 27.544409 \n", "1439 2024-06-21 27.543884 27.984089 26.976751 27.450439 27.450439 \n", "1440 2024-06-22 27.449894 27.468800 24.671511 25.617315 25.617315 \n", "1441 2024-06-23 25.616165 25.961617 25.594069 25.826704 25.826704 \n", "\n", " Volume \n", "1437 214897798.0 \n", "1438 295674926.0 \n", "1439 229113421.0 \n", "1440 568500434.0 \n", "1441 254679968.0 \n", "\n", "\n", "Head of BCH-USD.csv:\n", " Date Open High Low Close Adj Close \\\n", "2414 2024-06-19 389.297791 397.895386 385.556122 388.660278 388.660278 \n", "2415 2024-06-20 388.660278 400.227478 385.939758 389.861938 389.861938 \n", "2416 2024-06-21 389.827545 393.751251 377.373901 382.875336 382.875336 \n", "2417 2024-06-22 382.868744 396.144928 380.335052 392.161041 392.161041 \n", "2418 2024-06-23 392.153168 396.133057 389.011749 392.329559 392.329559 \n", "\n", " Volume \n", "2414 212059873 \n", "2415 227242865 \n", "2416 241770183 \n", "2417 177606883 \n", "2418 185443392 \n", "\n", "\n", "Head of BNB-USD.csv:\n", " Date Open High Low Close Adj Close \\\n", "2414 2024-06-19 588.584717 605.731689 587.014160 598.771729 598.771729 \n", "2415 2024-06-20 598.771729 607.400757 584.759949 587.107178 587.107178 \n", "2416 2024-06-21 587.112610 588.705444 578.015869 585.911926 585.911926 \n", "2417 2024-06-22 585.900940 590.939331 581.137634 590.763367 590.763367 \n", "2418 2024-06-23 590.671570 592.581238 587.399963 591.205078 591.205078 \n", "\n", " Volume \n", "2414 1788904109 \n", "2415 1817442036 \n", "2416 1672110625 \n", "2417 1387634576 \n", "2418 1372477440 \n", "\n", "\n", "Head of BTC-USD.csv:\n", " Date Open High Low Close \\\n", "3563 2024-06-19 65146.660156 65695.351563 64693.300781 64960.296875 \n", "3564 2024-06-20 64960.296875 66438.960938 64547.847656 64828.656250 \n", "3565 2024-06-21 64837.988281 65007.546875 63378.894531 64096.199219 \n", "3566 2024-06-22 64113.863281 64475.468750 63929.757813 64252.578125 \n", "3567 2024-06-23 64248.964844 64491.703125 64248.667969 64380.187500 \n", "\n", " Adj Close Volume \n", "3563 64960.296875 21103423504 \n", "3564 64828.656250 25641109124 \n", "3565 64096.199219 26188171739 \n", "3566 64252.578125 9858198793 \n", "3567 64380.187500 8030789632 \n", "\n", "\n", "Head of BTCB-USD.csv:\n", " Date Open High Low Close \\\n", "1828 2024-06-19 65101.085938 65581.906250 64787.019531 64865.839844 \n", "1829 2024-06-20 64865.839844 66308.250000 64619.820313 64922.941406 \n", "1830 2024-06-21 64914.968750 64945.152344 63503.847656 64129.816406 \n", "1831 2024-06-22 64122.351563 64394.425781 63935.769531 64318.062500 \n", "1832 2024-06-23 64319.468750 64494.671875 64314.351563 64377.347656 \n", "\n", " Adj Close Volume \n", "1828 64865.839844 26950021 \n", "1829 64922.941406 24110562 \n", "1830 64129.816406 18859219 \n", "1831 64318.062500 6413044 \n", "1832 64377.347656 4965773 \n", "\n", "\n" ] } ], "source": [ "import pandas as pd\n", "\n", "for i in DATASETS[:10]:\n", " df = pd.read_csv(f'{DATASETS_PATH}/{i}')\n", " print(f'Head of {i}:')\n", " print(df.tail())\n", " print('\\n')" ] }, { "cell_type": "markdown", "metadata": { "id": "0ScPGk5EGxwg" }, "source": [ "
\n", "

sampling (Ethereum)

" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 394 }, "id": "yqS2EZx6G4ha", "outputId": "03a82ecf-bcde-4037-ce46-7a3e92f755e9" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Open High Low Close Adj Close \\\n", "Date \n", "2024-06-14 3467.969971 3528.602295 3366.223877 3480.271973 3480.271973 \n", "2024-06-15 3479.785645 3589.887451 3473.452637 3565.549561 3565.549561 \n", "2024-06-16 3566.761963 3648.093018 3541.534424 3620.563477 3620.563477 \n", "2024-06-17 3622.383545 3634.285400 3468.148926 3511.378906 3511.378906 \n", "2024-06-18 3510.565186 3514.177246 3371.590332 3483.681396 3483.681396 \n", "2024-06-19 3482.350830 3583.320068 3466.480957 3559.347412 3559.347412 \n", "2024-06-20 3559.347412 3623.886475 3485.459961 3511.086914 3511.086914 \n", "2024-06-21 3511.268311 3542.957275 3447.935547 3516.075684 3516.075684 \n", "2024-06-22 3516.551270 3519.497559 3477.169922 3494.813477 3494.813477 \n", "2024-06-23 3494.953857 3518.871094 3494.098633 3504.028076 3504.028076 \n", "\n", " Volume \n", "Date \n", "2024-06-14 15793876596 \n", "2024-06-15 12733651076 \n", "2024-06-16 9878388158 \n", "2024-06-17 17838856988 \n", "2024-06-18 21022514455 \n", "2024-06-19 15275373778 \n", "2024-06-20 16115123753 \n", "2024-06-21 15933353456 \n", "2024-06-22 7423703673 \n", "2024-06-23 6673526784 " ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OpenHighLowCloseAdj CloseVolume
Date
2024-06-143467.9699713528.6022953366.2238773480.2719733480.27197315793876596
2024-06-153479.7856453589.8874513473.4526373565.5495613565.54956112733651076
2024-06-163566.7619633648.0930183541.5344243620.5634773620.5634779878388158
2024-06-173622.3835453634.2854003468.1489263511.3789063511.37890617838856988
2024-06-183510.5651863514.1772463371.5903323483.6813963483.68139621022514455
2024-06-193482.3508303583.3200683466.4809573559.3474123559.34741215275373778
2024-06-203559.3474123623.8864753485.4599613511.0869143511.08691416115123753
2024-06-213511.2683113542.9572753447.9355473516.0756843516.07568415933353456
2024-06-223516.5512703519.4975593477.1699223494.8134773494.8134777423703673
2024-06-233494.9538573518.8710943494.0986333504.0280763504.0280766673526784
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"dataframe\",\n \"rows\": 10,\n \"fields\": [\n {\n \"column\": \"Date\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"2024-06-22\",\n \"2024-06-15\",\n \"2024-06-19\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Open\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 48.01536575149276,\n \"min\": 3467.969971,\n \"max\": 3622.383545,\n \"num_unique_values\": 10,\n \"samples\": [\n 3516.55127,\n 3479.785645,\n 3482.35083\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"High\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 52.10295309560295,\n \"min\": 3514.177246,\n \"max\": 3648.093018,\n \"num_unique_values\": 10,\n \"samples\": [\n 3519.497559,\n 3589.887451,\n 3583.320068\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 53.5334882229941,\n \"min\": 3366.223877,\n \"max\": 3541.534424,\n \"num_unique_values\": 10,\n \"samples\": [\n 3477.169922,\n 3473.452637,\n 3466.480957\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 44.061808263651415,\n \"min\": 3480.271973,\n \"max\": 3620.563477,\n \"num_unique_values\": 10,\n \"samples\": [\n 3494.813477,\n 3565.549561,\n 3559.347412\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Adj Close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 44.061808263651415,\n \"min\": 3480.271973,\n \"max\": 3620.563477,\n \"num_unique_values\": 10,\n \"samples\": [\n 3494.813477,\n 3565.549561,\n 3559.347412\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4624246210,\n \"min\": 6673526784,\n \"max\": 21022514455,\n \"num_unique_values\": 10,\n \"samples\": [\n 7423703673,\n 12733651076,\n 15275373778\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 4 } ], "source": [ "#sample\n", "dataframe = pd.read_csv(f'{DATASETS_PATH}/ETH-USD.csv', index_col='Date')\n", "dataframe.tail(10)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 526 }, "id": "KjBBUiY4JP1W", "outputId": "540e9356-c20f-4b91-dd2a-f5cb978a52ed" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Index: 2419 entries, 2017-11-09 to 2024-06-23\n", "Data columns (total 6 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Open 2419 non-null float64\n", " 1 High 2419 non-null float64\n", " 2 Low 2419 non-null float64\n", " 3 Close 2419 non-null float64\n", " 4 Adj Close 2419 non-null float64\n", " 5 Volume 2419 non-null int64 \n", "dtypes: float64(5), int64(1)\n", "memory usage: 132.3+ KB\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ " Open High Low Close Adj Close \\\n", "count 2419.000000 2419.000000 2419.000000 2419.000000 2419.000000 \n", "mean 1374.367581 1412.706739 1332.386708 1375.499080 1375.499080 \n", "std 1191.807181 1224.351161 1155.337026 1192.059729 1192.059729 \n", "min 84.279694 85.342743 82.829887 84.308296 84.308296 \n", "25% 244.145607 248.187210 236.747917 244.160736 244.160736 \n", "50% 1218.079346 1257.770020 1185.702148 1218.426758 1218.426758 \n", "75% 2058.074462 2110.714478 1998.625488 2061.309570 2061.309570 \n", "max 4810.071289 4891.704590 4718.039063 4812.087402 4812.087402 \n", "\n", " Volume \n", "count 2.419000e+03 \n", "mean 1.230856e+10 \n", "std 1.003120e+10 \n", "min 6.217330e+08 \n", "25% 5.126564e+09 \n", "50% 9.908112e+09 \n", "75% 1.679948e+10 \n", "max 8.448291e+10 " ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OpenHighLowCloseAdj CloseVolume
count2419.0000002419.0000002419.0000002419.0000002419.0000002.419000e+03
mean1374.3675811412.7067391332.3867081375.4990801375.4990801.230856e+10
std1191.8071811224.3511611155.3370261192.0597291192.0597291.003120e+10
min84.27969485.34274382.82988784.30829684.3082966.217330e+08
25%244.145607248.187210236.747917244.160736244.1607365.126564e+09
50%1218.0793461257.7700201185.7021481218.4267581218.4267589.908112e+09
75%2058.0744622110.7144781998.6254882061.3095702061.3095701.679948e+10
max4810.0712894891.7045904718.0390634812.0874024812.0874028.448291e+10
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"dataframe\",\n \"rows\": 8,\n \"fields\": [\n {\n \"column\": \"Open\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1494.720281925156,\n \"min\": 84.279694,\n \"max\": 4810.071289,\n \"num_unique_values\": 8,\n \"samples\": [\n 1374.3675809355104,\n 1218.079346,\n 2419.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"High\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1516.1766236639855,\n \"min\": 85.342743,\n \"max\": 4891.70459,\n \"num_unique_values\": 8,\n \"samples\": [\n 1412.7067394162877,\n 1257.77002,\n 2419.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1470.6448616802188,\n \"min\": 82.829887,\n \"max\": 4718.039063,\n \"num_unique_values\": 8,\n \"samples\": [\n 1332.3867076374534,\n 1185.702148,\n 2419.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1495.3773967904688,\n \"min\": 84.308296,\n \"max\": 4812.087402,\n \"num_unique_values\": 8,\n \"samples\": [\n 1375.4990803455976,\n 1218.426758,\n 2419.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Adj Close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1495.3773967904688,\n \"min\": 84.308296,\n \"max\": 4812.087402,\n \"num_unique_values\": 8,\n \"samples\": [\n 1375.4990803455976,\n 1218.426758,\n 2419.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Volume\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 27701817495.35504,\n \"min\": 2419.0,\n \"max\": 84482912776.0,\n \"num_unique_values\": 8,\n \"samples\": [\n 12308557309.507235,\n 9908112156.0,\n 2419.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 5 } ], "source": [ "dataframe.info()\n", "dataframe.describe(include = 'all')" ] }, { "cell_type": "markdown", "metadata": { "id": "ABmHM_2iIbiD" }, "source": [ "
\n", "

Data Cleaning

" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 507 }, "id": "ZyQukOjYJ4w9", "outputId": "8f201eee-ad73-4150-edd6-7c5e04d6fb5f" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 6 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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AEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMAAEdEEwAAR0QTAABHRBMA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\n" }, "metadata": {} } ], "source": [ "import missingno as msno\n", "\n", "msno.matrix(\n", " dataframe,\n", " figsize = (5, 5),\n", " fontsize = 9,\n", " color = (0.2, 0.4, 0.6)\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "58wCGTtJKWSA", "outputId": "3c34b21f-206d-4eab-c43c-72dd31c06893" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Open 0\n", "High 0\n", "Low 0\n", "Close 0\n", "Adj Close 0\n", "Volume 0\n", "dtype: int64" ] }, "metadata": {}, "execution_count": 7 } ], "source": [ "dataframe.isna().sum()" ] }, { "cell_type": "code", "source": [ "for col in dataframe.columns:\n", " if dataframe[col].isnull().any():\n", " if dataframe[col].dtype == 'object':\n", " print(col)\n", " dataframe[col].fillna(dataframe[col].mode()[0], inplace = True)\n", " else:\n", " print(col)\n", " dataframe[col].fillna(dataframe[col].mean(), inplace = True)" ], "metadata": { "id": "et7xEcRVvxla" }, "execution_count": 8, "outputs": [] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-qTBTOEaKyJt", "outputId": "e7d43277-2abd-4482-fb34-8e49deb517cd" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Result: There are no missing values\n" ] } ], "source": [ "missing_col_names = [\n", " col for col, _ in dataframe.to_dict().items() \\\n", " if dataframe[col].isnull().sum() > 0\n", "]\n", "\n", "print(f\"Result: {'There are missing values' if len(missing_col_names) > 0 else 'There are no missing values'}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "8tX6L-gHQkOz" }, "source": [ "
\n", "

Data Standarization and Normalization

" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 394 }, "id": "TI_rGlzqQjnf", "outputId": "d0b2e66f-3fe5-4724-9cbf-6ac015def6c0" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Close\n", "Date \n", "2024-06-14 0.718300\n", "2024-06-15 0.736338\n", "2024-06-16 0.747974\n", "2024-06-17 0.724880\n", "2024-06-18 0.719021\n", "2024-06-19 0.735026\n", "2024-06-20 0.724818\n", "2024-06-21 0.725873\n", "2024-06-22 0.721376\n", "2024-06-23 0.723325" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Close
Date
2024-06-140.718300
2024-06-150.736338
2024-06-160.747974
2024-06-170.724880
2024-06-180.719021
2024-06-190.735026
2024-06-200.724818
2024-06-210.725873
2024-06-220.721376
2024-06-230.723325
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"dataframe\",\n \"rows\": 10,\n \"fields\": [\n {\n \"column\": \"Date\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"2024-06-22\",\n \"2024-06-15\",\n \"2024-06-19\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0.0093197688123231,\n \"min\": 0.7182999884005156,\n \"max\": 0.7479738587008342,\n \"num_unique_values\": 10,\n \"samples\": [\n 0.7213757463143202,\n 0.7363375460122438,\n 0.7350256934783281\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 10 } ], "source": [ "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n", "\n", "dataframe = dataframe[['Close']]\n", "\n", "# Standarization\n", "standard_scaler = StandardScaler()\n", "dataframe['Close'] = standard_scaler.fit_transform(dataframe[['Close']])\n", "\n", "# Normalization\n", "minmax_scaler = MinMaxScaler(feature_range=(0, 1))\n", "dataframe['Close'] = minmax_scaler.fit_transform(dataframe[['Close']])\n", "\n", "\n", "dataframe.tail(10)" ] }, { "cell_type": "markdown", "source": [ "
\n", "

Feature Engineering

" ], "metadata": { "id": "PAyJUmwUaqBF" } }, { "cell_type": "code", "source": [ "df.iloc[1:60+1].values" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sR8-NnvXGO2A", "outputId": "8f862c24-43e6-48a9-8000-53ce4b5f8969" }, "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([['2019-06-19', 9068.174805, 9277.677734, 9051.094727, 9271.459961,\n", " 9271.459961, 131077],\n", " ['2019-06-20', 9271.567383, 9573.689453, 9209.416992, 9519.200195,\n", " 9519.200195, 83052],\n", " ['2019-06-21', 9526.833984, 10130.935547, 9526.833984,\n", " 10127.998047, 10127.998047, 76227],\n", " ['2019-06-22', 10151.890625, 11171.013672, 10083.189453,\n", " 10719.981445, 10719.981445, 84485],\n", " ['2019-06-23', 10718.117188, 11293.773438, 10561.124023,\n", " 11246.518555, 11246.518555, 52072],\n", " ['2019-06-24', 11246.518555, 11251.15625, 10659.144531,\n", " 11010.517578, 11010.517578, 106205],\n", " ['2019-06-25', 10999.733398, 11676.888672, 10999.733398,\n", " 11666.96582, 11666.96582, 95820],\n", " ['2019-06-26', 11666.96582, 13739.329102, 11631.251953,\n", " 12827.663086, 12827.663086, 67574],\n", " ['2019-06-27', 12827.663086, 13022.981445, 10452.151367,\n", " 11136.211914, 11136.211914, 117404],\n", " ['2019-06-28', 11152.90332, 12430.348633, 10863.209961,\n", " 12398.671875, 12398.671875, 96399],\n", " ['2019-06-29', 12409.884766, 12409.884766, 11521.609375,\n", " 11915.464844, 11915.464844, 44215],\n", " ['2019-06-30', 11905.128906, 12138.600586, 10757.251953,\n", " 10757.251953, 10757.251953, 12704],\n", " ['2019-07-01', 10757.251953, 11199.141602, 10060.441406,\n", " 10538.941406, 10538.941406, 18800],\n", " ['2019-07-02', 10546.290039, 10895.975586, 9631.026367,\n", " 10840.748047, 10840.748047, 41470],\n", " ['2019-07-03', 10841.888672, 11951.766602, 10841.888672,\n", " 11940.806641, 11940.806641, 54592],\n", " ['2019-07-04', 11940.260742, 12001.268555, 11174.304688,\n", " 11199.027344, 11199.027344, 6803],\n", " ['2019-07-05', 11192.214844, 11417.396484, 10875.37793,\n", " 10985.602539, 10985.602539, 32516],\n", " ['2019-07-06', 10985.306641, 11614.435547, 10985.306641,\n", " 11230.970703, 11230.970703, 19273],\n", " ['2019-07-07', 11230.369141, 12058.25, 11162.37793, 11592.706055,\n", " 11592.706055, 38151],\n", " ['2019-07-08', 11593.509766, 12309.231445, 11368.134766,\n", " 12256.126953, 12256.126953, 60043],\n", " ['2019-07-09', 12259.253906, 12744.650391, 12235.339844,\n", " 12521.632813, 12521.632813, 59686],\n", " ['2019-07-10', 12519.288086, 13111.345703, 11714.165039,\n", " 12133.441406, 12133.441406, 56542],\n", " ['2019-07-11', 12134.422852, 12134.422852, 11194.456055,\n", " 11660.28418, 11660.28418, 206567],\n", " ['2019-07-12', 11663.8125, 12320.452148, 11339.581055,\n", " 11652.459961, 11652.459961, 437704],\n", " ['2019-07-13', 11651.46582, 12209.827148, 10979.837891,\n", " 11515.664063, 11515.664063, 842523],\n", " ['2019-07-14', 11447.645508, 11641.489258, 10241.913086,\n", " 10241.913086, 10241.913086, 414119],\n", " ['2019-07-15', 10143.97168, 11078.411133, 9725.791992,\n", " 10926.464844, 10926.464844, 431893],\n", " ['2019-07-16', 10987.557617, 12246.306641, 9673.839844,\n", " 9717.038086, 9717.038086, 485403],\n", " ['2019-07-17', 9833.953125, 10002.206055, 9138.09375, 9685.883789,\n", " 9685.883789, 444337],\n", " ['2019-07-18', 9689.371094, 10660.923828, 9239.602539,\n", " 10548.814453, 10548.814453, 321096],\n", " ['2019-07-19', 10548.814453, 10825.875, 10193.408203,\n", " 10572.655273, 10572.655273, 122121],\n", " ['2019-07-20', 10597.679688, 11314.213867, 10265.417969,\n", " 10913.607422, 10913.607422, 240565],\n", " ['2019-07-21', 10913.607422, 11229.353516, 10204.167969,\n", " 10792.991211, 10792.991211, 145889],\n", " ['2019-07-22', 10793.253906, 10975.225586, 10195.461914,\n", " 10556.007813, 10556.007813, 225410],\n", " ['2019-07-23', 10555.688477, 39504.628906, 8098.790039,\n", " 9900.445313, 9900.445313, 367821],\n", " ['2019-07-24', 9900.445313, 10894.75, 9115.704102, 9882.260742,\n", " 9882.260742, 81862],\n", " ['2019-07-25', 9856.210938, 10546.202148, 9635.571289,\n", " 9840.331055, 9840.331055, 10967],\n", " ['2019-07-26', 9812.708008, 10003.717773, 9641.316406,\n", " 9869.240234, 9869.240234, 11464],\n", " ['2019-07-27', 9869.240234, 10722.198242, 9854.723633,\n", " 10295.592773, 10295.592773, 43797],\n", " ['2019-07-28', 10295.592773, 10814.21582, 9866.942383,\n", " 10002.868164, 10002.868164, 209195],\n", " ['2019-07-29', 9998.833984, 10587.529297, 9647.981445,\n", " 9950.451172, 9950.451172, 362786],\n", " ['2019-07-30', 9825.239258, 10064.118164, 8893.631836,\n", " 9578.966797, 9578.966797, 204983],\n", " ['2019-07-31', 9567.248047, 10681.686523, 9548.852539,\n", " 10132.297852, 10132.297852, 100753],\n", " ['2019-08-01', 10214.501953, 10549.6875, 9411.796875,\n", " 10457.677734, 10457.677734, 112061],\n", " ['2019-08-02', 10519.310547, 13505.805664, 9548.776367,\n", " 10626.240234, 10626.240234, 186035],\n", " ['2019-08-03', 10625.523438, 14391.37207, 9896.265625,\n", " 10860.224609, 10860.224609, 99920],\n", " ['2019-08-04', 10781.024414, 11855.058594, 10075.219727,\n", " 10979.398438, 10979.398438, 56532],\n", " ['2019-08-05', 10976.354492, 14664.880859, 10792.6875,\n", " 11939.714844, 11939.714844, 193825],\n", " ['2019-08-06', 12116.700195, 12516.666016, 11311.829102,\n", " 11503.787109, 11503.787109, 114939],\n", " ['2019-08-07', 11503.538086, 17742.109375, 11415.768555,\n", " 15917.913086, 15917.913086, 84101],\n", " ['2019-08-08', 15917.913086, 21598.978516, 5282.191406,\n", " 11788.261719, 11788.261719, 122648],\n", " ['2019-08-09', 11787.677734, 14115.886719, 10901.922852,\n", " 12379.829102, 12379.829102, 84676],\n", " ['2019-08-10', 12379.829102, 12676.383789, 11068.366211,\n", " 11418.65332, 11418.65332, 104937],\n", " ['2019-08-11', 11414.408203, 11917.924805, 10714.913086,\n", " 11251.161133, 11251.161133, 75153],\n", " ['2019-08-12', 11062.529297, 13127.165039, 2389.728516,\n", " 12075.470703, 12075.470703, 102306],\n", " ['2019-08-13', 12156.397461, 13020.619141, 3998.595703,\n", " 10857.993164, 10857.993164, 99478],\n", " ['2019-08-14', 10882.438477, 11251.541016, 9841.882813,\n", " 9952.604492, 9952.604492, 122763],\n", " ['2019-08-15', 9952.604492, 11244.59375, 9609.75, 10247.99707,\n", " 10247.99707, 99753],\n", " ['2019-08-16', 10235.629883, 11305.080078, 9334.977539,\n", " 10775.947266, 10775.947266, 131836],\n", " ['2019-08-17', 10778.519531, 11390.839844, 9853.967773,\n", " 10009.873047, 10009.873047, 117695]], dtype=object)" ] }, "metadata": {}, "execution_count": 11 } ] }, { "cell_type": "code", "source": [ "df.iloc[1].values[0]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "id": "W0n-Wf_dGSyw", "outputId": "30f3e2b1-bc52-4b42-d9e9-4e98f0fecb04" }, "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'2019-06-19'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 12 } ] }, { "cell_type": "code", "source": [ "import numpy as np\n", "\n", "def create_sequences(df, seq_len) -> tuple:\n", " labels = []\n", " sequences = []\n", "\n", " for i in range(len(df) - seq_len):\n", " seq = df.iloc[i:(seq_len + i)].values\n", " label = df.iloc[seq_len + i].values[0]\n", "\n", " sequences.append(seq)\n", " labels.append(label)\n", "\n", " return np.array(sequences), np.array(labels)\n", "\n", "\n", "sequence_length = 60\n", "sequences, labels = create_sequences(df = dataframe, seq_len = sequence_length)\n", "print(f'Shapes: {(sequences.shape, labels.shape)}')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3rcbbn5WavFz", "outputId": "0502df53-a7ee-424d-bc5f-edbcaf203135" }, "execution_count": 28, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Shapes: ((2359, 60, 1), (2359,))\n" ] } ] }, { "cell_type": "markdown", "source": [ "
\n", "

Modeling and Training

" ], "metadata": { "id": "8zL70c-6bWPU" } }, { "cell_type": "code", "source": [ "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import LSTM, Dense, Dropout\n", "from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\n", "\n", "\n", "def build_model(input_shape):\n", " model = Sequential([\n", " LSTM(units = 50, return_sequences = True, input_shape = input_shape),\n", " Dropout(0.2),\n", "\n", " LSTM(units = 50, return_sequences = False),\n", " Dropout(0.2),\n", "\n", " Dense(units=1)\n", " ])\n", "\n", " model.compile(\n", " optimizer = 'adam',\n", " loss = 'mean_squared_error'\n", " )\n", "\n", " return model\n", "\n", "\n", "input_shape = (sequences.shape[1], sequences.shape[2])\n", "model = build_model(input_shape)\n", "model.summary()\n", "\n", "\n", "train_size = int(len(sequences) * 0.8)\n", "X_train, X_test = sequences[:train_size], sequences[train_size:]\n", "y_train, y_test = labels[:train_size], labels[train_size:]" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "olldmw1pbPYE", "outputId": "b538d231-3747-467b-a1b7-9c1fbd9939d9" }, "execution_count": 14, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", " Layer (type) Output Shape Param # \n", "=================================================================\n", " lstm (LSTM) (None, 60, 50) 10400 \n", " \n", " dropout (Dropout) (None, 60, 50) 0 \n", " \n", " lstm_1 (LSTM) (None, 50) 20200 \n", " \n", " dropout_1 (Dropout) (None, 50) 0 \n", " \n", " dense (Dense) (None, 1) 51 \n", " \n", "=================================================================\n", "Total params: 30651 (119.73 KB)\n", "Trainable params: 30651 (119.73 KB)\n", "Non-trainable params: 0 (0.00 Byte)\n", "_________________________________________________________________\n" ] } ] }, { "cell_type": "code", "source": [ "early_stopping = EarlyStopping(\n", " monitor = 'val_loss',\n", " patience = 5,\n", " mode = 'min'\n", ")\n", "\n", "model_checkpoint = ModelCheckpoint(\n", " filepath = 'ETH-USD.keras',\n", " save_best_only = True,\n", " monitor = 'val_loss',\n", " mode = 'min'\n", ")\n", "\n", "history = model.fit(\n", " X_train, y_train,\n", " epochs = 200,\n", " batch_size = 32,\n", " validation_data = (X_test, y_test),\n", " callbacks = [early_stopping, model_checkpoint]\n", ")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "kjkalCASbm5H", "outputId": "ef6a81cf-b23c-4807-bc74-b56324e87bc6" }, "execution_count": 15, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/200\n", "59/59 [==============================] - 12s 122ms/step - loss: 0.0107 - val_loss: 0.0017\n", "Epoch 2/200\n", "59/59 [==============================] - 4s 72ms/step - loss: 0.0028 - val_loss: 0.0012\n", "Epoch 3/200\n", "59/59 [==============================] - 5s 85ms/step - loss: 0.0025 - val_loss: 0.0010\n", "Epoch 4/200\n", "59/59 [==============================] - 5s 85ms/step - loss: 0.0023 - val_loss: 9.8405e-04\n", "Epoch 5/200\n", "59/59 [==============================] - 4s 72ms/step - loss: 0.0018 - val_loss: 0.0015\n", "Epoch 6/200\n", "59/59 [==============================] - 5s 91ms/step - loss: 0.0022 - val_loss: 8.3344e-04\n", "Epoch 7/200\n", "59/59 [==============================] - 5s 79ms/step - loss: 0.0019 - val_loss: 7.8464e-04\n", "Epoch 8/200\n", "59/59 [==============================] - 4s 70ms/step - loss: 0.0017 - val_loss: 7.6916e-04\n", "Epoch 9/200\n", "59/59 [==============================] - 5s 89ms/step - loss: 0.0015 - val_loss: 9.1782e-04\n", "Epoch 10/200\n", "59/59 [==============================] - 5s 81ms/step - loss: 0.0017 - val_loss: 6.4996e-04\n", "Epoch 11/200\n", "59/59 [==============================] - 4s 72ms/step - loss: 0.0016 - val_loss: 0.0024\n", "Epoch 12/200\n", "59/59 [==============================] - 6s 98ms/step - loss: 0.0015 - val_loss: 7.1000e-04\n", "Epoch 13/200\n", "59/59 [==============================] - 4s 70ms/step - loss: 0.0015 - val_loss: 8.1860e-04\n", "Epoch 14/200\n", "59/59 [==============================] - 4s 76ms/step - loss: 0.0017 - val_loss: 5.5193e-04\n", "Epoch 15/200\n", "59/59 [==============================] - 6s 97ms/step - loss: 0.0014 - val_loss: 0.0013\n", "Epoch 16/200\n", "59/59 [==============================] - 5s 84ms/step - loss: 0.0013 - val_loss: 0.0012\n", "Epoch 17/200\n", "59/59 [==============================] - 5s 83ms/step - loss: 0.0013 - val_loss: 7.6420e-04\n", "Epoch 18/200\n", "59/59 [==============================] - 5s 91ms/step - loss: 0.0017 - val_loss: 8.6200e-04\n", "Epoch 19/200\n", "59/59 [==============================] - 4s 74ms/step - loss: 0.0013 - val_loss: 5.0253e-04\n", "Epoch 20/200\n", "59/59 [==============================] - 5s 84ms/step - loss: 0.0012 - val_loss: 8.1612e-04\n", "Epoch 21/200\n", "59/59 [==============================] - 5s 88ms/step - loss: 0.0014 - val_loss: 4.7569e-04\n", "Epoch 22/200\n", "59/59 [==============================] - 4s 76ms/step - loss: 0.0014 - val_loss: 6.3227e-04\n", "Epoch 23/200\n", "59/59 [==============================] - 5s 89ms/step - loss: 0.0013 - val_loss: 0.0010\n", "Epoch 24/200\n", "59/59 [==============================] - 5s 79ms/step - loss: 0.0013 - val_loss: 5.3331e-04\n", "Epoch 25/200\n", "59/59 [==============================] - 4s 73ms/step - loss: 0.0012 - val_loss: 6.2773e-04\n", "Epoch 26/200\n", "59/59 [==============================] - 6s 95ms/step - loss: 0.0012 - val_loss: 5.2385e-04\n" ] } ] }, { "cell_type": "code", "source": [ "model.load_weights('ETH-USD.keras')\n", "loss = model.evaluate(X_test, y_test)\n", "predictions = model.predict(X_test)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "23nPU1PYg7nZ", "outputId": "2d8725c7-18df-4601-e1a6-97e6aa9eb6d5" }, "execution_count": 16, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "15/15 [==============================] - 0s 21ms/step - loss: 4.7569e-04\n", "15/15 [==============================] - 1s 20ms/step\n" ] } ] }, { "cell_type": "code", "source": [ "import joblib\n", "\n", "joblib.dump(minmax_scaler, 'minmax_scaler.pickle')\n", "joblib.dump(standard_scaler, 'standard_scaler.pickle')\n", "\n", "model.save('ETH-USD.keras')" ], "metadata": { "id": "8bnjl03gBK-c" }, "execution_count": 17, "outputs": [] }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.figure(\n", " figsize = (14, 5)\n", ")\n", "\n", "plt.plot(y_test, color = 'blue', label = 'actual')\n", "plt.plot(predictions, color = 'red', label = 'predicted')\n", "plt.legend()\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 430 }, "id": "GZdxZwfmr3aN", "outputId": "192b67c3-9f0a-4dae-9afd-6feaf6868f26" }, "execution_count": 18, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAABHAAAAGsCAYAAAC1slApAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADC10lEQVR4nOzdd3wU5drG8d+m0AkdQhWU3psgRRBFARUFVLArL1hQjgV7AyvosRcUC4h6VOyKgoiAoHQBQem9SW8JNQnJvH/cmS3JJiQhyaZc388nZ2ZnZneeDfHAXrmf+/E4juMgIiIiIiIiIiJ5VlioByAiIiIiIiIiIulTgCMiIiIiIiIikscpwBERERERERERyeMU4IiIiIiIiIiI5HEKcERERERERERE8jgFOCIiIiIiIiIieZwCHBERERERERGRPC4i1APIiKSkJHbs2EHp0qXxeDyhHo6IiIiIiIiISLZwHIfDhw9TrVo1wsLSrrPJFwHOjh07qFmzZqiHISIiIiIiIiKSI7Zt20aNGjXSPJ8vApzSpUsD9maioqJCPBoRERERERERkewRGxtLzZo1vdlHWvJFgONOm4qKilKAIyIiIiIiIiIFzqlaxqiJsYiIiIiIiIhIHqcAR0REREREREQkj1OAIyIiIiIiIiKSx+WLHjgZkZSURHx8fKiHIachMjKS8PDwUA9DREREREREJM8pEAFOfHw8mzZtIikpKdRDkdNUtmxZoqOjT9m8SURERERERKQwyfcBjuM47Ny5k/DwcGrWrElYmGaF5UeO43Ds2DH27NkDQNWqVUM8IhEREREREZG8I98HOCdPnuTYsWNUq1aNEiVKhHo4chqKFy8OwJ49e6hcubKmU4mIiIiIiIgky/flKomJiQAUKVIkxCOR7OCGcAkJCSEeiYiIiIiIiEjeke8DHJd6phQM+nMUERERERERSa3ABDgiIiIiIiIiIgWVAhwRERERERERkTxOAY6kcvPNN9OnT59QD0NEREREREREkinAyaeefPJJWrZsGephiIiIiIiIiEguUIAjIiIiIiKSzRwHVqyA+PhQj0RECooCF+A4Dhw9Gpovx8ncWKdMmULnzp0pW7YsFSpU4NJLL2XDhg3e89u3b+eaa66hfPnylCxZkrZt27JgwQLGjx/PU089xbJly/B4PHg8HsaPH8/mzZvxeDwsXbrU+xqHDh3C4/Ewc+ZMwJZdHzRoEHXq1KF48eI0aNCA119/PRu+8yIiIiIi4vruO2jaFB59NNQjEZGCIiLUA8hux45BqVKhufeRI1CyZMavP3r0KMOGDaN58+YcOXKE4cOH07dvX5YuXcqxY8fo2rUr1atXZ+LEiURHR7NkyRKSkpIYMGAAy5cvZ8qUKUybNg2AMmXKsHv37lPeMykpiRo1avDVV19RoUIF5s6dy6233krVqlXp379/Vt+6iIiIiIj4+ftv2/72W2jHISIFR4ELcPKTK664IuDxuHHjqFSpEitXrmTu3Lns3buXP//8k/LlywNQt25d77WlSpUiIiKC6OjoTN0zMjKSp556yvu4Tp06zJs3jy+//FIBjoiIiIhINtmzx7YrVsDJkxChT14icpoK3P+NlChhlTChundmrFu3juHDh7NgwQL27dtHUlISAFu3bmXp0qW0atXKG95kp9GjRzNu3Di2bt3K8ePHiY+PV0NkEREREZFs5AY4cXGwdi00bhza8YhI/lfgAhyPJ3PTmEKpd+/enHHGGbz//vtUq1aNpKQkmjZtSnx8PMWLF8/064WFWUsjx68ZT0JCQsA1EyZM4P777+fll1+mQ4cOlC5dmhdffJEFCxac3psREREREREvN8ABWLZMAY6InL4C18Q4v9i/fz9r1qzh8ccf54ILLqBRo0YcPHjQe7558+YsXbqUAwcOBH1+kSJFSExMDDhWqVIlAHbu3Ok95t/QGGDOnDl07NiRO+64g1atWlG3bt2AxskiIiIiInL6UgY4IiKnSwFOiJQrV44KFSrw3nvvsX79embMmMGwYcO856+55hqio6Pp06cPc+bMYePGjXzzzTfMmzcPgNq1a7Np0yaWLl3Kvn37iIuLo3jx4pxzzjk8//zzrFq1ilmzZvH4448H3LdevXosWrSIX375hbVr1/LEE0/w559/5up7FxEREREp6Pbu9e0rwBGR7KAAJ0TCwsKYMGECixcvpmnTptx77728+OKL3vNFihRh6tSpVK5cmYsvvphmzZrx/PPPEx4eDlgD5J49e9KtWzcqVarE559/Dlgj5JMnT9KmTRvuuecenn322YD73nbbbfTr148BAwbQvn179u/fzx133JF7b1xEREREpIBLSAD/Qno3wFm9GvyK7kVEMsXj+DdMyaNiY2MpU6YMMTExREVFBZw7ceIE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kEajHJG84cQJ6N0bXn451CMRkeyWkACHD9u+twInMdGX0txyi/fas8+2rTt9qkkT26aqwAEWL/FwxaJHqO9Zz9tF72USF7O200A2lmlFCY5T8sQBaNECFi2CCy8MOjaPx37XUa2a71hEhMIbERGR/EABjoTUyZO+f6R6p1B9/719um3QAFq3DrjeDXD27bN/IKdSvbr9WtFx0l1uNTscOADTpgW0IRDJsFmzbHbDk0/afwciUnAcOuTbL1s2eWfOHNi710pyunf3nncDHNd119k2WAXOd9/ZtuMVVVl/xytcyiRGtxnHVWcuphszWHbne/YLDDcFEhERkQIlSwHO6NGjqV27NsWKFaN9+/YsXLgwQ8+bMGECHo+HPu5qQVLorVtnzRRLlkxuvgi+31Bee22qXwlWqOCbUbVnTxovmkurUQ0ZYr/gnDw5R28jBdTWrbY9cgSWLQvtWEQke7n9b6KirLoFgG+/te1ll1nD/WRt2vieFxkJV1xh+2vXpg533QCnb19rRgy2ctWWrR5m0o2w227xrtooIiIiBU+mA5wvvviCYcOGMWLECJYsWUKLFi3o0aMHe9L8NG02b97M/fffz7nnnpvlwUrB406fatLEVudg924ra4FU06fArqlSxfbTnEZ1+eW2nT7dpmPlkL/+su2CBTl2CynA3AAHYPbs0I1DRLJfqv43juMLcPr1C7i2TBkrOAWrRK1b1xabSkiATZt8161ZYxWrkZFwySU2UwpsttT+/bZ/xhk5835EREQkb8h0gPPKK69wyy23MHDgQBo3bsyYMWMoUaIE48aNS/M5iYmJXHfddTz11FOceeaZp7xHXFwcsbGxAV9SMKVqYPzll9YnoF07+1dsEKfsg9OoEdSvD/Hxvl9XZrPERN+yrStW5MgtpIDLUICzbRtMmABvvw1jxsD27bkyNhE5PalWoFq82P57LlkyaG8adxpVq1b2iwo30PHvg+P+dXb++Rb6NGpkYc6xY3a8XDmr+BEREZGCK1MBTnx8PIsXL6a739ztsLAwunfvzrx589J83tNPP03lypUZNGhQhu4zatQoypQp4/2qWbNmZoYp+UiqAMd/+lQaThngeDxwww22P3786Q4xqO3bfT14Vq7MkVtIXuc4lt6NHg1jx1pgmAkpA5yAXkp798Ldd1uIec01cOedNmevVi3o1s2WIRaRPCtV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cdq3T/2eS5Z0nJ49Heehhxzngw8c5+uvHeecc+xcWJjj9O3rONOm2YvnJUlJjnP11TbOihXtB+bff+3chg2Oc+653vf4Drc5z9cf67wbdpsTH1bEjhcp4jjvv+84juPs3es45cvb4VdfTeee//uf4xQt6vtznzTJcU6edBzHce66yw4/fddex4mOtgf33OPs3es4jzziOKVK2aHSpR3nyy8z8T737HGc//zHccqU8f2ZnXWW/TklJmblOyciWdC4seP05gcnoUSU/Xc4ZUqohyQiIiJ5WEYzD4/j5P3lS2JjYylTpgwxMTFakSqP+fln69P73ntw0UV+J3bsgGeesaqXdetwkpLYeTSK6KQdhGE/comEsaD0hZwz7VnC2mWwMiaFp5+2WSQ33WQFCEEtX27LXHk8tt+4MQsWWI/j++6DQYOsaOGW644x4fjlnLlxml17223WIHbjRli7lqNL15Jw7CTHGrfljnebE18umkkr61C2QRViY20GVdOmaYxh40ZbrWjLFiupWLTISupD6M034a674J57rH+0x5N84vvv4corrZdLqVI411zLtE1nsa96Cwa83ZWwEsUCX+jECZtS9eGHvmOXXw7vvgvJlXkh9+qrVo0VEQEzZviWeHElJpI44mnCn3s69XO7doWXX7bGwsnefx9uvdX+CP/9N50/ykWL7Dfv/ktOnXsuXyw6i3lryjGs0c/UWjXVVpNavNj7G/odO+Dqq60wCOw/pcce8/szOpXjx61854knfMu1NWliS5536GD7/qVD8fE21j//tCVv9u61qp0SJaynzokTNj+je3fff0siEtyJE0woP4Srj4+3x2efDXPnnnJ6sIiIiBReGc48ciVOOk2qwMmbkpIcp3lz++Viy5bJRRdJSY7zySeOU7ZsmlUrfxbr5NwV9qZThZ3O9OmnN4avv7aXbdv2FBdedpld2LSp48TGeh+C44wY4ThnlT/gzOA8xwEnsWQpJ+XAjh1znGrVHMfj8VVPnHOOnXMLUD7//BRj2LLFcWrUsIuvvTbkVSq9evm+B8895zhvvuk4t9Wf4ZyMSK46uewyx9m+3Zk/33fdddc5Tnx8Gi+4fLnj3HGHVauA41SoYFU6yVUnIbNmjZMQbmNKeOWNNC9btsxxejLZmR1+rpPU/ULHGTIkzWqixETHqVPH3uZPP53i/nv3Os699zpO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Pj4eAwYMwNtvvw0PDw8rbRWR5QQEBGDhwoVYuXIlXFxcTLUC3NzckC9fPri5uaFPnz4YMmQIChcuDFdXVwwcOBC+vr545ZVXAADNmzdHtWrV8O6772LixIkIDg7GF198gYCAADg5OVlz84iy3YgRI9CyZUt4enoiMjISCxcuxPbt27FhwwbuP0QZ4OLiYqq7psmfPz/c3d1N87kfEWURaw+D9byYMWOG8vT0VI6Ojqpu3bpq//791m4SkU3Ytm2bApDi5u/vr5SSocRHjhypihcvrpycnFTTpk3VuXPnzF7j7t27qlu3bqpAgQLK1dVV9e7dW0VGRlpha4gsL7X9B4D6/fffTetER0er/v37q0KFCilnZ2fVsWNHdfv2bbPXuXr1qmrZsqXKly+fKlKkiBo6dKiKj4+38NYQWd57772nypYtqxwdHVXRokVV06ZN1caNG03Luf8QZV7SYcSV4n5ElFUMSillpdgRERERERERERFlAGvgEBERERERERHZOAZwiIiIiIiIiIhsHAM4REREREREREQ2jgEcIiIiIiIiIiIbxwAOEREREREREZGNYwCHiIiIiIiIiMjGMYBDRERERERERGTjGMAhIiIiIiIiIrJxDOAQEREREREREdk4BnCIiIiIiIiIiGwcAzhERERERERERDbu/wHDorP5y2O/hwAAAABJRU5ErkJggg==\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "
\n", "

Testing

" ], "metadata": { "id": "3AlPkjRVilUg" } }, { "cell_type": "code", "source": [ "from tensorflow.keras.models import load_model\n", "\n", "model = load_model('ETH-USD.keras')\n", "minmax_scaler = joblib.load('minmax_scaler.pickle')\n", "standard_scaler = joblib.load('standard_scaler.pickle')\n", "\n", "days = 7\n", "\n", "lst_seq = dataframe[-sequence_length:].values\n", "lst_seq = np.expand_dims(lst_seq, axis = 0)\n", "\n", "predicted_prices = {}\n", "last_date = pd.to_datetime(dataframe.index[-1])\n", "\n", "for _ in range(days):\n", " predicted_price = model.predict(lst_seq)\n", " last_date = last_date + pd.Timedelta(days = 1)\n", "\n", " predicted_prices[last_date] = minmax_scaler.inverse_transform(predicted_price)\n", " predicted_prices[last_date] = standard_scaler.inverse_transform(predicted_prices[last_date])\n", "\n", " lst_seq = np.append(lst_seq[:, 1:, :], [predicted_price], axis = 1)\n", "\n", "\n", "eth_prices = minmax_scaler.inverse_transform(dataframe[['Close']])\n", "eth_prices = standard_scaler.inverse_transform(eth_prices)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TyB5g_klixdP", "outputId": "f506b0b5-6751-463d-ffdd-27cb6336a82f" }, "execution_count": 19, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "1/1 [==============================] - 1s 946ms/step\n", "1/1 [==============================] - 0s 30ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 42ms/step\n" ] } ] }, { "cell_type": "code", "source": [ "print({\n", " 'Date': dataframe[-sequence_length:].index.tolist(),\n", " 'Close': [ _[0] for _ in eth_prices[-sequence_length:].tolist() ]\n", "})" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4E3gLDLPUhQ2", "outputId": "32223981-4086-4056-960a-96c7a8cb357f" }, "execution_count": 20, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "{'Date': ['2024-04-25', '2024-04-26', '2024-04-27', '2024-04-28', '2024-04-29', '2024-04-30', '2024-05-01', '2024-05-02', '2024-05-03', '2024-05-04', '2024-05-05', '2024-05-06', '2024-05-07', '2024-05-08', '2024-05-09', '2024-05-10', '2024-05-11', '2024-05-12', '2024-05-13', '2024-05-14', '2024-05-15', '2024-05-16', '2024-05-17', '2024-05-18', '2024-05-19', '2024-05-20', '2024-05-21', '2024-05-22', '2024-05-23', '2024-05-24', '2024-05-25', '2024-05-26', '2024-05-27', '2024-05-28', '2024-05-29', '2024-05-30', '2024-05-31', '2024-06-01', '2024-06-02', '2024-06-03', '2024-06-04', '2024-06-05', '2024-06-06', '2024-06-07', '2024-06-08', '2024-06-09', '2024-06-10', '2024-06-11', '2024-06-12', '2024-06-13', '2024-06-14', '2024-06-15', '2024-06-16', '2024-06-17', '2024-06-18', '2024-06-19', '2024-06-20', '2024-06-21', '2024-06-22', '2024-06-23'], 'Close': [3156.509521, 3130.164795, 3252.168213, 3262.7746579999994, 3215.4289549999994, 3012.286865, 2969.7846680000002, 2988.168457, 3103.5419919999995, 3117.576416, 3137.2490230000003, 3062.72876, 3006.577148, 2973.657227, 3036.0205079999996, 2909.79126, 2911.602051, 2928.7019039999996, 2949.359619, 2881.157959, 3037.056641, 2945.131104, 3094.118652, 3122.9489750000002, 3071.843018, 3663.855469, 3789.312744, 3737.217773, 3776.9272460000007, 3726.93457, 3749.2365720000007, 3825.8974610000005, 3892.0068360000005, 3840.256348, 3763.1965330000003, 3746.849609, 3760.0266110000002, 3813.1989750000002, 3780.895996000001, 3766.38916, 3812.5158689999994, 3864.2609860000002, 3811.605957, 3678.6291499999998, 3680.949951, 3705.9038090000004, 3666.717529, 3498.330566, 3559.617676, 3469.2812500000005, 3480.271973, 3565.549561, 3620.5634770000006, 3511.378906, 3483.681396, 3559.3474120000005, 3511.0869139999995, 3516.075684, 3494.8134769999997, 3504.0280759999996]}\n" ] } ] }, { "cell_type": "code", "source": [ "plt.figure(\n", " figsize = (14, 5)\n", ")\n", "\n", "plt.plot(\n", " pd.to_datetime(dataframe.index[-sequence_length:]),\n", " eth_prices[-sequence_length:],\n", " color = 'blue',\n", " label = 'last days prices'\n", ")\n", "\n", "plt.scatter(\n", " predicted_prices.keys(),\n", " predicted_prices.values(),\n", " color = 'red',\n", " label = f'predicted price for {days} days'\n", ")\n", "\n", "plt.title('ETH-USD')\n", "plt.legend()\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 445 }, "id": "Y9zYnSUakgPZ", "outputId": "69514f2d-8c6a-4490-d851-8d7a1923c0dc" }, "execution_count": 21, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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p55r//79qlu3rgoWLJjmcyX3c5w7d66OHTsWf9mxY4d8fX311J2y/V6EZBAAAMhULMus8nXhgvTII9KLLzr/nM8/L5UrJ505I739tvPPB8eIijLzns6ckR54IGHlsJTKl0+aP9/MGFq6NCEBCXi1uXNNBr5OHdM/W6eOuT13rtNOWbt2bfXq1Uu9evVSaGiocufOrSFDhsi6Ycm/okWL6q233lLHjh0VEhKi559/XpL022+/qUaNGgoMDFShQoXUp08fXbx4Mf55J0+eVLNmzRQYGKhixYppypQpt5z/5jaxf/75R23atFHOnDmVPXt2Va1aVRs2bNDEiRP15ptvatu2bfGVKvaKmHPnzqlbt27KkyePQkJCVLduXW3bti3ReUaNGqV8+fIpODhYXbt21ZUrV277vkRERMhms2nx4sWqUKGCsmbNqgcffFA7duyI32fixInKkSOHFixYoLJlyyogIECHDx++pU0sLi5O7733nkqUKKGAgAAVLlxY//vf/+IfP3LkiJ5++mnlyJFDOXPmVPPmzXUwmdUVDh48KJvNptOnT6tLly6J3odffvlF1apVU0BAgPLnz6+BAwfq+vXr8c+1/6z79u2r3Llzq1GjRkmeI2fOnAoLC4u/LF++XNmyZbtjMuhO7/GmTZvUoEED5c6dW6GhoapVq5Z+//33+Me7dOmixx57LNFzrl27prx582rcuHGSpNmzZ6t8+fIKDAxUrly5VL9+/US/cxmFZBAAAMhUJk2SfvrJtG6NG2eGPTubn580erTZ/vRTad8+558T6XP9ulk5LDJSuvvuhKROalWuLNm7G0aPlr77zpFRAh5m7lzpySelf/5JfP+//5r7nZgQmjRpkvz8/LRx40aNGTNGH374ob799ttE+4wePVoVK1bUH3/8oSFDhmj//v169NFH1apVK/3555+aMWOGfvvtN/Xq1Sv+OZ07d9aRI0e0atUqzZ49W1988YVOnjyZbBwXLlxQrVq19O+//2rBggXatm2b+vfvr7i4OD3zzDN69dVXVa5cufiKlWeeeUaS9NRTT+nkyZNasmSJtmzZosqVK6tevXo6c+aMJGnmzJkaPny43nnnHW3evFn58+fXF198kaL3pl+/fvrggw+0adMm5cmTR82aNdO1a9fiH7906ZLeffddffvtt9q5c6fy5s17yzEGDRqkUaNGaciQ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t27Vf//9p5iYGNWvX1/h4eFq0aKFfvrpJx08eFBr167VG2+8oc2bN0uSXnrpJY0fP14TJkzQnj17NGzYMO3cuTNF782IESO0YsUK7dixQ507d1bu3LkTrRR2J1mzZtWAAQPUv39/fffdd9q/f7/Wr18fvzpWu3btlDt3bjVv3ly//vqrDhw4oIiICPXp0ydRe9edvPjiizpy5Ih69+6tv/76Sz/88IOGDRumV155RT5pLLMdN26cWrRooVy5ct1x35S8x/fee68mT56syMhIbdiwQe3atUvy96Fbt26aNGmSIiMj1alTp/j7N2zYED+g+vDhw5o7d65OnTqVquSco5AMAgAAHu3KFWnAALM9YIBUoIBr45FMlVKhQmY8hn02TWZx7Zr09NNS+fLSmjWujiZlrl2TnnlG+usvs3LYDz84t32rdm1pzBizPXCgtHix884FuA1f34Rf/JsTQvbbH39s9nOCjh076vLly6pWrZp69uypl156KX75+ORUqFBBv/zyi/bs2aMaNWqoUqVKGjp0qArc8B+SCRMmqECBAqpVq5Zatmyp559/PsnVtuz8/f31008/KW/evGrSpInKly+vUaNGxVcotWrVSo8++qjq1KmjPHnyaNq0abLZbPrxxx9Vs2ZNPfvssypZsqRat26tQ4cOxa/Y9cwzz2jIkCHq37+/qlSpokOHDqlHjx4pem9GjRqll156SVWqVNHx48e1cOFC+fv7p+i5dkOGDNGrr76qoUOHqkyZMnrmmWfiV1XLli2bVq9ercKFC6tly5YqU6ZM/LLsISEhKT7H3XffrR9//FEbN25UxYoV1b17d3Xt2lWD01jGuXv3bv3222/q2rVrivZPyXs8btw4nT17VpUrV1aHDh3Up0+fJH8f6tevr/z586tRo0aJfp9CQkK0evVqNWnSRCVLltTgwYP1wQcfqHHjxml6jemSmmnTX3zxhVW+fHkrODjYCg4Oth588EHrxx9/jH/82LFjVvv27a18+fJZ2bJlsypVqmTNnj070TFOnz5ttW3b1goODrZCQ0OtLl26WOfPn0+0z7Zt26xHHnnECggIsAoWLJhoEndKsZoYAADe4d13zUI1d99tWRcuuDqaBJMnm7iCgy3r+HFXR+M4vXolLA7k62ve//9f5MUtXb9uWa1bO3blsJSIi7OsF14w5y1QwCkLKAEOl67V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\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "source": [ "
\n", "

Utility Development (to be consumed by REST API Service)

" ], "metadata": { "id": "ZmVTaqU1Ngwd" } }, { "cell_type": "code", "source": [ "import json\n", "\n", "dataframe_date = dataframe.index.tolist()\n", "dataframe_close = dataframe['Close'].tolist()\n", "dataframe_json = {\n", " 'Date': dataframe_date,\n", " 'Close': dataframe_close\n", "}\n", "\n", "with open('ETH-USD-posttrained.json', 'w') as f:\n", " json.dump(dataframe_json, f)" ], "metadata": { "id": "DQgzDWLXGOfp" }, "execution_count": 22, "outputs": [] }, { "cell_type": "code", "source": [ "for timestamp in list(predicted_prices.keys()):\n", " formatted_date = timestamp.strftime('%Y-%m-%d')\n", " dataframe_json['Date'].append(formatted_date)\n", "\n", "for value in list(predicted_prices.values()):\n", " prediction_value = float(value)\n", " dataframe_json['Close'].append(prediction_value)\n", "\n", "df_loaded = pd.DataFrame(dataframe_json)\n", "df_loaded.set_index('Date', inplace=True)\n", "df_loaded.tail(10)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 394 }, "id": "FyhjJbUTm1Cg", "outputId": "8e5d8045-546c-4e03-b95a-1f78d0521d68" }, "execution_count": 23, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Close\n", "Date \n", "2024-06-21 0.725873\n", "2024-06-22 0.721376\n", "2024-06-23 0.723325\n", "2024-06-24 3533.773682\n", "2024-06-25 3533.459717\n", "2024-06-26 3536.406738\n", "2024-06-27 3541.040527\n", "2024-06-28 3546.467773\n", "2024-06-29 3552.183594\n", "2024-06-30 3557.900879" ], "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Close
Date
2024-06-210.725873
2024-06-220.721376
2024-06-230.723325
2024-06-243533.773682
2024-06-253533.459717
2024-06-263536.406738
2024-06-273541.040527
2024-06-283546.467773
2024-06-293552.183594
2024-06-303557.900879
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "\n", "
\n", "
\n" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "dataframe", "summary": "{\n \"name\": \"df_loaded\",\n \"rows\": 10,\n \"fields\": [\n {\n \"column\": \"Date\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 10,\n \"samples\": [\n \"2024-06-29\",\n \"2024-06-22\",\n \"2024-06-26\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"Close\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1711.1157629141298,\n \"min\": 0.7213757463143202,\n \"max\": 3557.90087890625,\n \"num_unique_values\": 10,\n \"samples\": [\n 3552.18359375,\n 0.7213757463143202,\n 3536.40673828125\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" } }, "metadata": {}, "execution_count": 23 } ] }, { "cell_type": "code", "source": [ "dataframe[-10:].index.values.tolist()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "AzIQ5ATfT4Jm", "outputId": "d443056e-e79b-4471-dc01-f084dc4efa5b" }, "execution_count": 24, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['2024-06-14',\n", " '2024-06-15',\n", " '2024-06-16',\n", " '2024-06-17',\n", " '2024-06-18',\n", " '2024-06-19',\n", " '2024-06-20',\n", " '2024-06-21',\n", " '2024-06-22',\n", " '2024-06-23']" ] }, "metadata": {}, "execution_count": 24 } ] }, { "cell_type": "code", "source": [ "import numpy as np\n", "import pandas as pd\n", "from tensorflow.keras.models import load_model\n", "\n", "class Utilities:\n", " @staticmethod\n", " def cryptocurrency_prediction(days: int, sequence_length: int, model_name: str) -> dict:\n", " model_path = f'./{model_name}.keras'\n", " model = load_model(model_path)\n", "\n", " dataframe = pd.read_json(f'./{model_name}-posttrained.json')\n", " dataframe.set_index('Date', inplace=True)\n", "\n", " minmax_scaler = joblib.load('minmax_scaler.pickle')\n", " standard_scaler = joblib.load('standard_scaler.pickle')\n", "\n", " lst_seq = dataframe[-sequence_length:].values\n", " lst_seq = np.expand_dims(lst_seq, axis = 0)\n", "\n", " # Predicted\n", " predicted_prices = {}\n", " last_date = pd.to_datetime(dataframe.index[-1])\n", "\n", " for _ in range(days):\n", " predicted_price = model.predict(lst_seq)\n", " last_date = last_date + pd.Timedelta(days = 1)\n", "\n", " predicted_prices[last_date] = minmax_scaler.inverse_transform(predicted_price)\n", " predicted_prices[last_date] = standard_scaler.inverse_transform(predicted_prices[last_date])\n", "\n", " lst_seq = np.append(lst_seq[:, 1:, :], [predicted_price], axis = 1)\n", "\n", " predicted = [\n", " {'date': date.strftime('%Y-%m-%d'), 'price': float(price)} \\\n", " for date, price in predicted_prices.items()\n", " ]\n", "\n", " # Actual\n", " df_date = dataframe.index[-sequence_length:].values\n", " df_date = [pd.to_datetime(date) for date in df_date]\n", "\n", " dataframe[['Close']] = minmax_scaler.inverse_transform(dataframe)\n", " dataframe[['Close']] = standard_scaler.inverse_transform(dataframe)\n", " df_close = dataframe.iloc[-sequence_length:]['Close'].values\n", " actual = [\n", " {'date': date.strftime('%Y-%m-%d'), 'price': close} \\\n", " for date, close in zip(df_date, df_close)\n", " ]\n", "\n", " return actual, predicted" ], "metadata": { "id": "_xi20jtTGsTE" }, "execution_count": 25, "outputs": [] }, { "cell_type": "code", "source": [ "util = Utilities()\n", "actual, predicted = util.cryptocurrency_prediction(\n", " days = 7,\n", " model_name = 'ETH-USD',\n", " sequence_length = 60\n", ")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-A62yAAFl_aX", "outputId": "fe063e28-fceb-4b04-c8d7-d6e50d61961d" }, "execution_count": 26, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "1/1 [==============================] - 1s 1s/step\n", "1/1 [==============================] - 0s 39ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 38ms/step\n", "1/1 [==============================] - 0s 34ms/step\n" ] } ] }, { "cell_type": "code", "source": [ "print({ 'actual': actual, 'predicted': predicted })" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ytJxMi2xmHIi", "outputId": "41e13553-9dd7-42a9-f9bf-dd6b254329c2" }, "execution_count": 27, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "{'actual': [{'date': '2024-04-25', 'price': 3156.509520999997}, {'date': '2024-04-26', 'price': 3130.1647949999965}, {'date': '2024-04-27', 'price': 3252.1682129999995}, {'date': '2024-04-28', 'price': 3262.7746579999966}, {'date': '2024-04-29', 'price': 3215.4289549999985}, {'date': '2024-04-30', 'price': 3012.286864999999}, {'date': '2024-05-01', 'price': 2969.7846679999984}, {'date': '2024-05-02', 'price': 2988.168456999999}, {'date': '2024-05-03', 'price': 3103.541991999996}, {'date': '2024-05-04', 'price': 3117.576416}, {'date': '2024-05-05', 'price': 3137.2490229999994}, {'date': '2024-05-06', 'price': 3062.72876}, {'date': '2024-05-07', 'price': 3006.577148}, {'date': '2024-05-08', 'price': 2973.657227}, {'date': '2024-05-09', 'price': 3036.020507999998}, {'date': '2024-05-10', 'price': 2909.791259999998}, {'date': '2024-05-11', 'price': 2911.602051}, {'date': '2024-05-12', 'price': 2928.7019039999996}, {'date': '2024-05-13', 'price': 2949.359618999998}, {'date': '2024-05-14', 'price': 2881.1579589999983}, {'date': '2024-05-15', 'price': 3037.0566409999974}, {'date': '2024-05-16', 'price': 2945.1311039999973}, {'date': '2024-05-17', 'price': 3094.118652}, {'date': '2024-05-18', 'price': 3122.948974999998}, {'date': '2024-05-19', 'price': 3071.8430179999973}, {'date': '2024-05-20', 'price': 3663.855468999998}, {'date': '2024-05-21', 'price': 3789.3127439999985}, {'date': '2024-05-22', 'price': 3737.217772999996}, {'date': '2024-05-23', 'price': 3776.9272459999997}, {'date': '2024-05-24', 'price': 3726.93457}, {'date': '2024-05-25', 'price': 3749.2365719999984}, {'date': '2024-05-26', 'price': 3825.897460999999}, {'date': '2024-05-27', 'price': 3892.0068359999973}, {'date': '2024-05-28', 'price': 3840.256348}, {'date': '2024-05-29', 'price': 3763.196532999998}, {'date': '2024-05-30', 'price': 3746.8496089999953}, {'date': '2024-05-31', 'price': 3760.0266109999984}, {'date': '2024-06-01', 'price': 3813.1989749999993}, {'date': '2024-06-02', 'price': 3780.895996000001}, {'date': '2024-06-03', 'price': 3766.389159999998}, {'date': '2024-06-04', 'price': 3812.515868999996}, {'date': '2024-06-05', 'price': 3864.260985999997}, {'date': '2024-06-06', 'price': 3811.6059569999993}, {'date': '2024-06-07', 'price': 3678.6291499999984}, {'date': '2024-06-08', 'price': 3680.9499509999955}, {'date': '2024-06-09', 'price': 3705.903808999999}, {'date': '2024-06-10', 'price': 3666.7175289999973}, {'date': '2024-06-11', 'price': 3498.3305659999996}, {'date': '2024-06-12', 'price': 3559.6176759999985}, {'date': '2024-06-13', 'price': 3469.2812499999995}, {'date': '2024-06-14', 'price': 3480.271972999997}, {'date': '2024-06-15', 'price': 3565.5495609999966}, {'date': '2024-06-16', 'price': 3620.5634769999997}, {'date': '2024-06-17', 'price': 3511.378906}, {'date': '2024-06-18', 'price': 3483.6813959999986}, {'date': '2024-06-19', 'price': 3559.3474119999996}, {'date': '2024-06-20', 'price': 3511.086913999997}, {'date': '2024-06-21', 'price': 3516.075683999999}, {'date': '2024-06-22', 'price': 3494.8134769999992}, {'date': '2024-06-23', 'price': 3504.0280759999973}], 'predicted': [{'date': '2024-06-24', 'price': 3533.773681640625}, {'date': '2024-06-25', 'price': 3533.459716796875}, {'date': '2024-06-26', 'price': 3536.40673828125}, {'date': '2024-06-27', 'price': 3541.04052734375}, {'date': '2024-06-28', 'price': 3546.4677734375}, {'date': '2024-06-29', 'price': 3552.18359375}, {'date': '2024-06-30', 'price': 3557.90087890625}]}\n" ] } ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }