{ "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 }