{"id":20021773,"url":"https://github.com/ndleah/bitcoin-prices-analysis","last_synced_at":"2025-05-05T01:31:00.200Z","repository":{"id":105088988,"uuid":"374398283","full_name":"ndleah/bitcoin-prices-analysis","owner":"ndleah","description":"💸 Bitcoin trading analysis","archived":false,"fork":false,"pushed_at":"2021-09-14T17:52:23.000Z","size":1164,"stargazers_count":7,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-08T14:45:49.662Z","etag":null,"topics":["data-analysis","data-expl","data-science","sqlite","window-functions"],"latest_commit_sha":null,"homepage":"","language":"SQL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ndleah.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-06-06T15:39:22.000Z","updated_at":"2024-03-11T13:29:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"48a55264-f218-4ef3-9596-f237c8552786","html_url":"https://github.com/ndleah/bitcoin-prices-analysis","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndleah%2Fbitcoin-prices-analysis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndleah%2Fbitcoin-prices-analysis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndleah%2Fbitcoin-prices-analysis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ndleah%2Fbitcoin-prices-analysis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ndleah","download_url":"https://codeload.github.com/ndleah/bitcoin-prices-analysis/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252423013,"owners_count":21745531,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-analysis","data-expl","data-science","sqlite","window-functions"],"created_at":"2024-11-13T08:38:09.573Z","updated_at":"2025-05-05T01:31:00.190Z","avatar_url":"https://github.com/ndleah.png","language":"SQL","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Star Badge](https://img.shields.io/static/v1?label=%F0%9F%8C%9F\u0026message=If%20Useful\u0026style=style=flat\u0026color=BC4E99)\n![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)\n[![View My Profile](https://img.shields.io/badge/View-My_Profile-green?logo=GitHub)](https://github.com/ndleah)\n[![View Repositories](https://img.shields.io/badge/View-My_Repositories-blue?logo=GitHub)](https://github.com/ndleah?tab=repositories)\n\n# Bitcoin Prices Analysis \u003cimg src=\"https://i.pinimg.com/736x/8b/f4/cb/8bf4cba38bf9ce86c18183e62251d6f5.jpg\" align=\"right\" width=\"120\" /\u003e\n\u003e This case study is contained within the [Serious SQL](https://www.datawithdanny.com) by [Danny Ma](https://www.linkedin.com/in/datawithdanny/).\n\n \u003cbr /\u003e \n\n\n\n## 📕 Table of contents\n\u003c!--ts--\u003e\n   * 🛠️ [Overview](#️-overview)\n   * 🚀 [Solutions](#solution)\n     * [Data Exploration](#data-exploration)\n     * [Weekly Volume Comparison Analysis](#weekly-volume-comparison-analysis)\n     * [Statistical Analysis](#statistical-analysis)\n\n  \n## 🛠️ Overview\n\n---\n## 🚀 Solution\n### Data Exploration\n📍 **Identify Null Rows**\n```sql \nSELECT *\nFROM trading.daily_btc\nWHERE (\n  open_price + high_price + low_price + \n  close_price + adjusted_close_price + volume \n) IS NULL;\n```\n\n|market_date             |open_price  |high_price  |low_price   |close_price |adjusted_close_price|volume      |\n|------------------------|------------|------------|------------|------------|--------------------|------------|\n|2020-04-17T00:00:00.000Z|null        |null        |null        |null        |null                |null        |\n|2020-10-09T00:00:00.000Z|null        |null        |null        |null        |null                |null        |\n|2020-10-12T00:00:00.000Z|null        |null        |null        |null        |null                |null        |\n|2020-10-13T00:00:00.000Z|null        |null        |null        |null        |null                |null        |\n\n📍 **Filling \u0026 Update Null Values**\n```sql\nWITH april_17_data AS (\n  SELECT\n  market_date,\n  open_price,\n  LAG(open_price) OVER (ORDER BY market_date) AS lag_open_price\nFROM trading.daily_btc\nWHERE market_date BETWEEN ('2020-04-17'::DATE - 1) AND ('2020-04-17'::DATE + 1)\n)\nSELECT\n  market_date,\n  open_price,\n  lag_open_price,\n  COALESCE(open_price, lag_open_price) AS coalesce_open_price\nFROM april_17_data;\n```\n\n|market_date             |open_price  |lag_open_price|coalesce_open_price|\n|------------------------|------------|--------------|-------------------|\n|2020-04-16T00:00:00.000Z|6640.454102 |null          |6640.454102        |\n|2020-04-17T00:00:00.000Z|null        |6640.454102   |6640.454102        |\n|2020-04-18T00:00:00.000Z|7092.291504 |null          |7092.291504        |\n\n📍 **Update Tables**\n```sql\nDROP TABLE IF EXISTS updated_daily_btc;\nCREATE TEMP TABLE updated_daily_btc AS\nSELECT\n  market_date,\n  COALESCE(\n    open_price,\n      LAG(open_price, 1) OVER (ORDER BY market_date),\n      LAG(open_price, 2) OVER (ORDER BY market_date)\n  ) AS open_price,\n  COALESCE(\n    high_price,\n      LAG(high_price, 1) OVER (ORDER BY market_date),\n      LAG(high_price, 2) OVER (ORDER BY market_date)\n  ) AS high_price,\n  COALESCE(\n    low_price,\n      LAG(low_price, 1) OVER (ORDER BY market_date),\n      LAG(low_price, 2) OVER (ORDER BY market_date)\n  ) AS low_price,\n  COALESCE(\n    close_price,\n      LAG(close_price, 1) OVER (ORDER BY market_date),\n      LAG(close_price, 2) OVER (ORDER BY market_date)\n  ) AS close_price,\n  COALESCE(\n    adjusted_close_price,\n      LAG(adjusted_close_price, 1) OVER (ORDER BY market_date),\n      LAG(adjusted_close_price, 2) OVER (ORDER BY market_date)\n  ) AS adjusted_close_price,\n   COALESCE(\n    volume,\n      LAG(volume, 1) OVER (ORDER BY market_date),\n      LAG(volume, 2) OVER (ORDER BY market_date)\n  ) AS volume\nFROM trading.daily_btc;\n\nSELECT *\nFROM updated_daily_btc\nWHERE market_date IN (\n  '2020-04-17',\n  '2020-10-09',\n  '2020-10-12',\n  '2020-10-13'\n);\n```\n\n|market_date             |open_price  |high_price  |low_price   |close_price |adjusted_close_price|volume     |\n|------------------------|------------|------------|------------|------------|--------------------|-----------|\n|2020-04-17T00:00:00.000Z|6640.454102 |7134.450684 |6555.504395 |7116.804199 |7116.804199         |46783242377|\n|2020-10-09T00:00:00.000Z|10677.625000|10939.799805|10569.823242|10923.627930|10923.627930        |21962121001|\n|2020-10-12T00:00:00.000Z|11296.082031|11428.813477|11288.627930|11384.181641|11384.181641        |19968627060|\n|2020-10-13T00:00:00.000Z|11296.082031|11428.813477|11288.627930|11384.181641|11384.181641        |19968627060|\n\n### Weekly Volume Comparison Analysis\nThe following are a set of questions that i would use to practice using SQL window functions as well as discover insights in this case study:\n\n1. What is the average daily volume of Bitcoin for the last 7 days?\n2. Create a 1/0 flag if a specific day is higher than the last 7 days volume average\n3. What is the percentage of weeks (starting on a Monday) where there are 4 or more days with increased volume?\n4. How many high volume weeks are there broken down by year for the weeks with 5-7 days above the 7 day volume average excluding 2021?\n\n📍 **Average Volumes**\n\u003e This section contains solution for Question 1 and 2\n```sql\nWITH window_calculations AS (\nSELECT\n  market_date,\n  volume,\n  ROUND(\n    AVG(volume) OVER (\n    ORDER BY market_date\n    RANGE BETWEEN '7 DAYS' PRECEDING AND '1 DAY' PRECEDING)\n  ) AS past_weekly_avg_volume\nFROM updated_daily_btc\n)\nSELECT\n  market_date,\n  volume,\n  past_weekly_avg_volume,\n  CASE \n    WHEN volume \u003e past_weekly_avg_volume THEN 1\n    ELSE 0\n    END AS volume_flag\nFROM window_calculations\nORDER BY market_date DESC\nLIMIT 10;\n```\n\n|market_date             |volume      |past_weekly_avg_volume|volume_flag|\n|------------------------|------------|----------------------|-----------|\n|2021-02-24T00:00:00.000Z|88364793856 |73509817753           |1          |\n|2021-02-23T00:00:00.000Z|106102492824|69359402048           |1          |\n|2021-02-22T00:00:00.000Z|92052420332 |67219042453           |1          |\n|2021-02-21T00:00:00.000Z|51897585191 |69983483887           |0          |\n|2021-02-20T00:00:00.000Z|68145460026 |70284197619           |0          |\n|2021-02-19T00:00:00.000Z|63495496918 |72149846802           |0          |\n|2021-02-18T00:00:00.000Z|52054723579 |76340445121           |0          |\n|2021-02-17T00:00:00.000Z|80820545404 |77266237191           |1          |\n|2021-02-16T00:00:00.000Z|77049582886 |79374846334           |0          |\n|2021-02-15T00:00:00.000Z|77069903166 |82860177694           |0          |\n\n 📍 **High Volume Weeks**\n\u003e This section contains solution for Question 3 and 4\n1. **Break down by week**\n```sql\nWITH window_calculations AS (\nSELECT\n  market_date,\n  volume,\n  ROUND(\n    AVG(volume) OVER (\n    ORDER BY market_date\n    RANGE BETWEEN '7 DAYS' PRECEDING AND '1 DAY' PRECEDING)\n  ) AS past_weekly_avg_volume\nFROM updated_daily_btc\n),\n--generate the date\ndate_calculations AS (\nSELECT\n  market_date,\n  DATE_TRUNC('week', market_date)::DATE start_of_week,\n  volume,\n  CASE\n    WHEN volume \u003e past_weekly_avg_volume THEN 1\n    ELSE 0\n    END AS volume_flag\nFROM window_calculations\n),\n--aggregate the metrics\naggregated_weeks AS (\nSELECT\n  start_of_week,\n  SUM(volume_flag) AS weekly_high_volume_days\n  FROM date_calculations\n  GROUP BY start_of_week\n)\n--calculate the percentage\nSELECT\n  weekly_high_volume_days,\n  ROUND (\n    100 * COUNT(*)/SUM(COUNT(*)) OVER (), \n    1) AS percentage_of_weeks\nFROM aggregated_weeks\nGROUP BY weekly_high_volume_days\nORDER BY weekly_high_volume_days;\n```\n\n|weekly_high_volume_days |percentage_of_weeks|\n|------------------------|-------------------|\n|0                       |6.23               |\n|1                       |13.65              |\n|2                       |20.47              |\n|3                       |20.47              |\n|4                       |18.99              |\n|5                       |11.87              |\n|6                       |6.23               |\n|7                       |2.08               |\n\n**Break down by year**\n\n```sql\nWITH window_calculations AS (\nSELECT\n  market_date,\n  volume,\n  ROUND(\n    AVG(volume) OVER (\n    ORDER BY market_date\n    RANGE BETWEEN '7 DAYS' PRECEDING AND '1 DAY' PRECEDING)\n  ) AS past_weekly_avg_volume\nFROM updated_daily_btc\n),\n--generate the date\ndate_calculations AS (\nSELECT\n  market_date,\n  DATE_TRUNC('week', market_date)::DATE start_of_week,\n  volume,\n  CASE\n    WHEN volume \u003e past_weekly_avg_volume THEN 1\n    ELSE 0\n    END AS volume_flag\nFROM window_calculations\n),\n--aggregate the metrics\naggregated_weeks AS (\nSELECT\n  start_of_week,\n  SUM(volume_flag) AS weekly_high_volume_days\n  FROM date_calculations\n  GROUP BY start_of_week\n)\n--calculate the percentage (by year)\nSELECT\n  EXTRACT(YEAR FROM start_of_week) AS market_year,\n  COUNT(*) AS high_volume_weeks,\n  ROUND(100 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) AS percentage_of_total\nFROM aggregated_weeks\nWHERE weekly_high_volume_days \u003e= 5\nAND start_of_week \u003c '2021-01-01'::DATE\nGROUP BY 1\nORDER BY 1;\n```\n\n|market_year             |high_volume_weeks|percentage_of_total|\n|------------------------|-----------------|-------------------|\n|2014                    |2                |2.99               |\n|2015                    |3                |4.48               |\n|2016                    |13               |19.40              |\n|2017                    |17               |25.37              |\n|2018                    |8                |11.94              |\n|2019                    |11               |16.42              |\n|2020                    |13               |19.40              |\n\n### Statistical Analysis\n📍 **Simple moving average**\n\nFor the next exercise - we will be calculating metrics not just a single window function but multiple in the same query.\n\nFor the following time windows: **14, 28, 60, 150 days** - calculate the following metrics for the close_price column:\n\n* Moving average\n* Moving standard deviation\n* The maximum and minimum values\n\n```sql\nWITH base_data AS (\n  SELECT\n    market_date,\n    close_price,\n    -- averages\n    ROUND(AVG(close_price) OVER w_14) AS avg_14,\n    ROUND(AVG(close_price) OVER w_28) AS avg_28,\n    ROUND(AVG(close_price) OVER w_60) AS avg_60,\n    ROUND(AVG(close_price) OVER w_150) AS avg_150,\n    -- standard deviation\n    ROUND(STDDEV(close_price) OVER w_14) AS std_14,\n    ROUND(STDDEV(close_price) OVER w_28) AS std_28,\n    ROUND(STDDEV(close_price) OVER w_60) AS std_60,\n    ROUND(STDDEV(close_price) OVER w_150) AS std_150,\n    -- max\n    ROUND(MAX(close_price) OVER w_14) AS max_14,\n    ROUND(MAX(close_price) OVER w_28) AS max_28,\n    ROUND(MAX(close_price) OVER w_60) AS max_60,\n    ROUND(MAX(close_price) OVER w_150) AS max_150,\n    -- min\n    ROUND(MIN(close_price) OVER w_14) AS min_14,\n    ROUND(MIN(close_price) OVER w_28) AS min_28,\n    ROUND(MIN(close_price) OVER w_60) AS min_60,\n    ROUND(MIN(close_price) OVER w_150) AS min_150\n  FROM updated_daily_btc\n  WINDOW\n    w_14 AS (ORDER BY MARKET_DATE RANGE BETWEEN '14 DAYS' PRECEDING AND '1 DAY' PRECEDING),\n    w_28 AS (ORDER BY MARKET_DATE RANGE BETWEEN '28 DAYS' PRECEDING AND '1 DAY' PRECEDING),\n    w_60 AS (ORDER BY MARKET_DATE RANGE BETWEEN '60 DAYS' PRECEDING AND '1 DAY' PRECEDING),\n    w_150 AS (ORDER BY MARKET_DATE RANGE BETWEEN '150 DAYS' PRECEDING AND '1 DAY' PRECEDING)\n)\nSELECT\n  market_date,\n  close_price,\n  CASE\n    WHEN close_price BETWEEN\n      (avg_14 - 2 * std_14) AND (avg_14 + 2 * std_14)\n      THEN 0\n    ELSE 1\n    END AS outlier_14,\n  CASE\n    WHEN close_price BETWEEN\n      (avg_28 - 2 * std_28) AND (avg_28 + 2 * std_28)\n      THEN 0\n    ELSE 1\n    END AS outlier_28,\n  CASE\n    WHEN close_price BETWEEN\n      (avg_60 - 2 * std_60) AND (avg_60 + 2 * std_60)\n      THEN 0\n    ELSE 1\n    END AS outlier_60,\n  CASE\n    WHEN close_price BETWEEN\n      (avg_150 - 2 * std_150) AND (avg_150 + 2 * std_150)\n      THEN 0\n    ELSE 1\n    END AS outlier_150\nFROM base_data\nORDER BY market_date DESC\nLIMIT 10;\n;\n```\n\n|market_date             |close_price |outlier_14|outlier_28|outlier_60|outlier_150|\n|------------------------|------------|----------|----------|----------|-----------|\n|2021-02-24T00:00:00.000Z|50460.234375|0         |0         |0         |1          |\n|2021-02-23T00:00:00.000Z|48824.425781|0         |0         |0         |0          |\n|2021-02-22T00:00:00.000Z|54207.320313|0         |0         |1         |1          |\n|2021-02-21T00:00:00.000Z|57539.945313|1         |0         |1         |1          |\n|2021-02-20T00:00:00.000Z|56099.519531|0         |0         |1         |1          |\n|2021-02-19T00:00:00.000Z|55888.132813|1         |1         |1         |1          |\n|2021-02-18T00:00:00.000Z|51679.796875|0         |0         |1         |1          |\n|2021-02-17T00:00:00.000Z|52149.007813|0         |1         |1         |1          |\n|2021-02-16T00:00:00.000Z|49199.871094|0         |0         |1         |1          |\n|2021-02-15T00:00:00.000Z|47945.058594|0         |0         |1         |1          |\n\n**Finding**\n\nThere are 1 values for 60 and 150 day outliers for the majority of the rows or is it expected.\n\n**Illustration**\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"60%\" height=\"60%\" src=\"/IMG/SMA.png\"\u003e\n\u003c/p\u003e\n\n📍 **Weighted moving average**\n\nIn this section, we were tasked by a demanding Cryptocurrency trading client who required custom weights to be applied using the following combination of simple moving averages:\n    \n|Time Period|Weight Factor|\n|---------- |------------ |\n|1-14 days  |0.5          |\n|15-28 days |0.3          |\n|29-60 days |0.15         |\n|61-150 days|0.05         |\n\n```sql\nWITH base_data AS (\n  SELECT\n    market_date,\n    ROUND(close_price, 2) AS close_price,\n    ROUND(AVG(close_price) OVER w_1_to_14) AS avg_1_to_14,\n    ROUND(AVG(close_price) OVER w_15_28) AS avg_15_28,\n    ROUND(AVG(close_price) OVER w_29_60) AS avg_29_60,\n    ROUND(AVG(close_price) OVER w_61_150) AS avg_61_150\nFROM updated_daily_btc\nWINDOW\n  w_1_to_14 AS (ORDER BY MARKET_DATE RANGE BETWEEN\n    '14 DAYS' PRECEDING AND '1 DAY' PRECEDING),\n  w_15_28 AS (ORDER BY MARKET_DATE RANGE BETWEEN\n    '28 DAYS' PRECEDING AND '15 DAY' PRECEDING),\n  w_29_60 AS (ORDER BY MARKET_DATE RANGE BETWEEN\n    '60 DAYS' PRECEDING AND '29 DAY' PRECEDING),\n  w_61_150 AS (ORDER BY MARKET_DATE RANGE BETWEEN\n  '150 DAYS' PRECEDING AND '61 DAY' PRECEDING)\n)\nSELECT\n  market_date,\n  close_price,\n  0.5 * avg_1_to_14 + 0.3 * avg_15_28 + 0.15 * avg_29_60 + 0.05 * avg_61_150 AS custom_moving_avg\nFROM base_data\nORDER BY market_date DESC\nLIMIT 10;\n```\n\n|market_date             |close_price |custom_moving_avg|\n|------------------------|------------|-----------------|\n|2021-02-24T00:00:00.000Z|50460.23    |42249.35         |\n|2021-02-23T00:00:00.000Z|48824.43    |41822.85         |\n|2021-02-22T00:00:00.000Z|54207.32    |41192.25         |\n|2021-02-21T00:00:00.000Z|57539.95    |40335.75         |\n|2021-02-20T00:00:00.000Z|56099.52    |39534.15         |\n|2021-02-19T00:00:00.000Z|55888.13    |38735.40         |\n|2021-02-18T00:00:00.000Z|51679.80    |38036.50         |\n|2021-02-17T00:00:00.000Z|52149.01    |37408.70         |\n|2021-02-16T00:00:00.000Z|49199.87    |36864.40         |\n|2021-02-15T00:00:00.000Z|47945.06    |36344.80         |\n\n📍 **Exponential Weighted Moving Average (EWMA)**\n```sql\nDROP TABLE IF EXISTS base_table;\nCREATE TEMP TABLE base_table AS\nSELECT\n    market_date,\n    ROUND(close_price, 2) AS close_price,\n    ROUND(AVG(close_price) OVER w_1_to_14) AS sma_14,\n    ROW_NUMBER() OVER w_1_to_14 AS _row_number\nFROM updated_daily_btc\nWINDOW\n  w_1_to_14 AS (ORDER BY MARKET_DATE RANGE BETWEEN\n    '14 DAYS' PRECEDING AND '1 DAY' PRECEDING);\n\nDROP TABLE IF EXISTS ewma_output;\nCREATE TEMP TABLE ewma_output AS\nWITH RECURSIVE output_table\n(market_date, close_price, sma_14, ewma_14, _row_number)\nAS (\n\n-- The 1st query: we set initial output row using _row_number = 15\n  SELECT\n    market_date,\n    close_price,\n    sma_14,\n    sma_14 AS ewma_14,\n    _row_number\n  FROM base_table\n  WHERE _row_number = 15\n\n  UNION ALL\n\n  -- The 2nd query: we need to \"shift\" our output by 1 row\n  SELECT\n    base_table.market_date,\n    base_table.close_price,\n    base_table.sma_14,\n    -- Let's round out ewma_14 record to 2 decimal places\n    ROUND(\n      0.13 * base_table.sma_14 + (1 - 0.13) * output_table.ewma_14,\n      2\n    ) AS ewma_14,\n    base_table._row_number\n  FROM output_table\n  INNER JOIN base_table\n    ON output_table._row_number + 1 = base_table._row_number\n    AND base_table._row_number \u003e 15\n)\nSELECT * FROM output_table;\n\n-- Pivot data for visualisation\nSELECT\n  market_date,\n  'SMA' AS metric_name,\n  sma_14 AS metric_value\nFROM ewma_output\nUNION\nSELECT\n  market_date,\n  'EWMA' AS metric_name,\n  ewma_14 AS metric_value\nFROM ewma_output;\n\nSELECT\n  market_date,\n  'Price' AS metric_name,\n  close_price AS metric_value\nFROM ewma_output\nORDER BY market_date, metric_name;\n```  \n\n**Illustration**\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"60%\" height=\"60%\" src=\"IMG/EWMA.png\"\u003e\n\u003c/p\u003e\n\n## ✨ Contribution\n\nContributions, issues, and feature requests are welcome!\n\nTo contribute to this project, see the GitHub documentation on **[creating a pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request)**.\n\n\n## 👏 Support\n\nGive a ⭐️ if you like this project!\n\n\u003cp\u003e\u0026copy; 2021 Leah Nguyen\u003c/p\u003e\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fndleah%2Fbitcoin-prices-analysis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fndleah%2Fbitcoin-prices-analysis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fndleah%2Fbitcoin-prices-analysis/lists"}