diff --git a/data.ipynb b/data.ipynb new file mode 100644 index 0000000..9e0ca72 --- /dev/null +++ b/data.ipynb @@ -0,0 +1,496 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2acce44b", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5ba70af7", + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
TimestampOpenHighLowCloseVolume
73177542025-11-30 23:55:00+00:0090405.090452.090403.090452.00.531700
73177552025-11-30 23:56:00+00:0090452.090481.090420.090420.00.055547
73177562025-11-30 23:57:00+00:0090412.090458.090396.090435.00.301931
73177572025-11-30 23:58:00+00:0090428.090428.090362.090362.04.591653
73177582025-11-30 23:59:00+00:0090363.090386.090362.090382.00.410369
\n", + "
" + ], + "text/plain": [ + " Timestamp Open High Low Close \\\n", + "7317754 2025-11-30 23:55:00+00:00 90405.0 90452.0 90403.0 90452.0 \n", + "7317755 2025-11-30 23:56:00+00:00 90452.0 90481.0 90420.0 90420.0 \n", + "7317756 2025-11-30 23:57:00+00:00 90412.0 90458.0 90396.0 90435.0 \n", + "7317757 2025-11-30 23:58:00+00:00 90428.0 90428.0 90362.0 90362.0 \n", + "7317758 2025-11-30 23:59:00+00:00 90363.0 90386.0 90362.0 90382.0 \n", + "\n", + " Volume \n", + "7317754 0.531700 \n", + "7317755 0.055547 \n", + "7317756 0.301931 \n", + "7317757 4.591653 \n", + "7317758 0.410369 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv(\"data.csv\")\n", + "df['Timestamp'] = pd.to_datetime(df['Timestamp'], unit='s', utc=True)\n", + "df.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "d4b22f3b", + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
TimestampLowHighOpenClose
50782025-11-2686304.090646.087331.090477.0
50792025-11-2790091.091926.090476.091325.0
50802025-11-2890233.093091.091326.090913.0
50812025-11-2990216.091179.090913.090832.0
50822025-11-3090362.091969.090832.090382.0
\n", + "
" + ], + "text/plain": [ + " Timestamp Low High Open Close\n", + "5078 2025-11-26 86304.0 90646.0 87331.0 90477.0\n", + "5079 2025-11-27 90091.0 91926.0 90476.0 91325.0\n", + "5080 2025-11-28 90233.0 93091.0 91326.0 90913.0\n", + "5081 2025-11-29 90216.0 91179.0 90913.0 90832.0\n", + "5082 2025-11-30 90362.0 91969.0 90832.0 90382.0" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_days = (\n", + " df.groupby(df[\"Timestamp\"].dt.date)\n", + " .agg({\"Low\": \"min\", \"High\": \"max\", \"Open\": \"first\", \"Close\": \"last\"})\n", + " .reset_index()\n", + ")\n", + "df_days.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "91823496", + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
TimestampLowHighOpenCloseAvg
50782025-11-2686304.090646.087331.090477.088475.0
50792025-11-2790091.091926.090476.091325.091008.5
50802025-11-2890233.093091.091326.090913.091662.0
50812025-11-2990216.091179.090913.090832.090697.5
50822025-11-3090362.091969.090832.090382.091165.5
\n", + "
" + ], + "text/plain": [ + " Timestamp Low High Open Close Avg\n", + "5078 2025-11-26 86304.0 90646.0 87331.0 90477.0 88475.0\n", + "5079 2025-11-27 90091.0 91926.0 90476.0 91325.0 91008.5\n", + "5080 2025-11-28 90233.0 93091.0 91326.0 90913.0 91662.0\n", + "5081 2025-11-29 90216.0 91179.0 90913.0 90832.0 90697.5\n", + "5082 2025-11-30 90362.0 91969.0 90832.0 90382.0 91165.5" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_days[\"Avg\"] = (df_days[\"Low\"] + df_days[\"High\"]) / 2\n", + "df_days.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9a7b3310", + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
start_dateend_datemin_openmax_closestart_avgend_avgchange
3352025-02-272025-04-2376252.094273.084801.593335.00.100629
3362025-04-242025-05-0993730.0103261.092867.5103341.00.112779
3372025-05-102025-07-11100990.0117579.0103915.0117032.50.126233
3382025-07-122025-11-04106470.0124728.0117599.0103079.00.123470
3392025-11-052025-11-1892112.0105972.0101737.591471.00.100912
\n", + "
" + ], + "text/plain": [ + " start_date end_date min_open max_close start_avg end_avg \\\n", + "335 2025-02-27 2025-04-23 76252.0 94273.0 84801.5 93335.0 \n", + "336 2025-04-24 2025-05-09 93730.0 103261.0 92867.5 103341.0 \n", + "337 2025-05-10 2025-07-11 100990.0 117579.0 103915.0 117032.5 \n", + "338 2025-07-12 2025-11-04 106470.0 124728.0 117599.0 103079.0 \n", + "339 2025-11-05 2025-11-18 92112.0 105972.0 101737.5 91471.0 \n", + "\n", + " change \n", + "335 0.100629 \n", + "336 0.112779 \n", + "337 0.126233 \n", + "338 0.123470 \n", + "339 0.100912 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "intervals = []\n", + "start_idx = 0\n", + "price_base = df_days.loc[start_idx, \"Avg\"]\n", + "\n", + "for i in range(1, len(df_days)):\n", + " price_now = df_days.loc[i, \"Avg\"]\n", + " change = abs(price_now - price_base) / price_base\n", + "\n", + " if change >= 0.10:\n", + " interval = df_days.loc[start_idx:i]\n", + " \n", + " intervals.append({\n", + " \"start_date\": df_days.loc[start_idx, \"Timestamp\"],\n", + " \"end_date\": df_days.loc[i, \"Timestamp\"],\n", + " \"min_open\": interval[\"Open\"].min(),\n", + " \"max_close\": interval[\"Close\"].max(),\n", + " \"start_avg\": price_base,\n", + " \"end_avg\": price_now,\n", + " \"change\": change,\n", + " })\n", + "\n", + " start_idx = i + 1\n", + " if start_idx >= len(df_days):\n", + " break\n", + " price_base = df_days.loc[start_idx, \"Avg\"]\n", + "\n", + "df_intervals = pd.DataFrame(intervals)\n", + "df_intervals.tail()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}