{
"cells": [
{
"cell_type": "code",
"execution_count": 20,
"id": "2acce44b",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "5ba70af7",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Timestamp | \n",
" Open | \n",
" High | \n",
" Low | \n",
" Close | \n",
" Volume | \n",
"
\n",
" \n",
" \n",
" \n",
" | 7317754 | \n",
" 2025-11-30 23:55:00+00:00 | \n",
" 90405.0 | \n",
" 90452.0 | \n",
" 90403.0 | \n",
" 90452.0 | \n",
" 0.531700 | \n",
"
\n",
" \n",
" | 7317755 | \n",
" 2025-11-30 23:56:00+00:00 | \n",
" 90452.0 | \n",
" 90481.0 | \n",
" 90420.0 | \n",
" 90420.0 | \n",
" 0.055547 | \n",
"
\n",
" \n",
" | 7317756 | \n",
" 2025-11-30 23:57:00+00:00 | \n",
" 90412.0 | \n",
" 90458.0 | \n",
" 90396.0 | \n",
" 90435.0 | \n",
" 0.301931 | \n",
"
\n",
" \n",
" | 7317757 | \n",
" 2025-11-30 23:58:00+00:00 | \n",
" 90428.0 | \n",
" 90428.0 | \n",
" 90362.0 | \n",
" 90362.0 | \n",
" 4.591653 | \n",
"
\n",
" \n",
" | 7317758 | \n",
" 2025-11-30 23:59:00+00:00 | \n",
" 90363.0 | \n",
" 90386.0 | \n",
" 90362.0 | \n",
" 90382.0 | \n",
" 0.410369 | \n",
"
\n",
" \n",
"
\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": 21,
"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": 23,
"id": "3b320537",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Timestamp | \n",
" Open | \n",
" High | \n",
" Low | \n",
" Close | \n",
" Volume | \n",
" Avg | \n",
"
\n",
" \n",
" \n",
" \n",
" | 7317754 | \n",
" 2025-11-30 23:55:00+00:00 | \n",
" 90405.0 | \n",
" 90452.0 | \n",
" 90403.0 | \n",
" 90452.0 | \n",
" 0.531700 | \n",
" 90427.5 | \n",
"
\n",
" \n",
" | 7317755 | \n",
" 2025-11-30 23:56:00+00:00 | \n",
" 90452.0 | \n",
" 90481.0 | \n",
" 90420.0 | \n",
" 90420.0 | \n",
" 0.055547 | \n",
" 90450.5 | \n",
"
\n",
" \n",
" | 7317756 | \n",
" 2025-11-30 23:57:00+00:00 | \n",
" 90412.0 | \n",
" 90458.0 | \n",
" 90396.0 | \n",
" 90435.0 | \n",
" 0.301931 | \n",
" 90427.0 | \n",
"
\n",
" \n",
" | 7317757 | \n",
" 2025-11-30 23:58:00+00:00 | \n",
" 90428.0 | \n",
" 90428.0 | \n",
" 90362.0 | \n",
" 90362.0 | \n",
" 4.591653 | \n",
" 90395.0 | \n",
"
\n",
" \n",
" | 7317758 | \n",
" 2025-11-30 23:59:00+00:00 | \n",
" 90363.0 | \n",
" 90386.0 | \n",
" 90362.0 | \n",
" 90382.0 | \n",
" 0.410369 | \n",
" 90374.0 | \n",
"
\n",
" \n",
"
\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 Avg \n",
"7317754 0.531700 90427.5 \n",
"7317755 0.055547 90450.5 \n",
"7317756 0.301931 90427.0 \n",
"7317757 4.591653 90395.0 \n",
"7317758 0.410369 90374.0 "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['Avg'] = (df['Low'] + df['High']) / 2\n",
"df.tail()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "4b1cd63c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Timestamp | \n",
" Avg | \n",
" OpenMin | \n",
" OpenMax | \n",
" CloseMin | \n",
" CloseMax | \n",
"
\n",
" \n",
" \n",
" \n",
" | 5078 | \n",
" 2025-11-26 | \n",
" 88057.301736 | \n",
" 86312.0 | \n",
" 90574.0 | \n",
" 86323.0 | \n",
" 90574.0 | \n",
"
\n",
" \n",
" | 5079 | \n",
" 2025-11-27 | \n",
" 91245.092708 | \n",
" 90126.0 | \n",
" 91888.0 | \n",
" 90126.0 | \n",
" 91925.0 | \n",
"
\n",
" \n",
" | 5080 | \n",
" 2025-11-28 | \n",
" 91324.308681 | \n",
" 90255.0 | \n",
" 92970.0 | \n",
" 90283.0 | \n",
" 92966.0 | \n",
"
\n",
" \n",
" | 5081 | \n",
" 2025-11-29 | \n",
" 90746.479514 | \n",
" 90265.0 | \n",
" 91158.0 | \n",
" 90279.0 | \n",
" 91179.0 | \n",
"
\n",
" \n",
" | 5082 | \n",
" 2025-11-30 | \n",
" 91187.356250 | \n",
" 90363.0 | \n",
" 91940.0 | \n",
" 90362.0 | \n",
" 91940.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Timestamp Avg OpenMin OpenMax CloseMin CloseMax\n",
"5078 2025-11-26 88057.301736 86312.0 90574.0 86323.0 90574.0\n",
"5079 2025-11-27 91245.092708 90126.0 91888.0 90126.0 91925.0\n",
"5080 2025-11-28 91324.308681 90255.0 92970.0 90283.0 92966.0\n",
"5081 2025-11-29 90746.479514 90265.0 91158.0 90279.0 91179.0\n",
"5082 2025-11-30 91187.356250 90363.0 91940.0 90362.0 91940.0"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_days = (\n",
" df.groupby(df[\"Timestamp\"].dt.date)\n",
" .agg(\n",
" Avg=(\"Avg\", \"mean\"),\n",
" OpenMin=(\"Open\", \"min\"),\n",
" OpenMax=(\"Open\", \"max\"),\n",
" CloseMin=(\"Close\", \"min\"),\n",
" CloseMax=(\"Close\", \"max\"),\n",
" )\n",
" .reset_index()\n",
")\n",
"df_days.tail()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "9a7b3310",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" start_date | \n",
" end_date | \n",
" min_open | \n",
" max_open | \n",
" min_close | \n",
" max_close | \n",
" start_avg | \n",
" end_avg | \n",
" change | \n",
"
\n",
" \n",
" \n",
" \n",
" | 316 | \n",
" 2025-02-27 | \n",
" 2025-04-25 | \n",
" 74509.0 | \n",
" 95801.0 | \n",
" 74515.0 | \n",
" 95800.0 | \n",
" 85166.063889 | \n",
" 94303.907292 | \n",
" 0.107294 | \n",
"
\n",
" \n",
" | 317 | \n",
" 2025-04-26 | \n",
" 2025-05-11 | \n",
" 92877.0 | \n",
" 104971.0 | \n",
" 92872.0 | \n",
" 104965.0 | \n",
" 94500.950347 | \n",
" 104182.167708 | \n",
" 0.102446 | \n",
"
\n",
" \n",
" | 318 | \n",
" 2025-05-12 | \n",
" 2025-07-11 | \n",
" 98384.0 | \n",
" 118833.0 | \n",
" 98382.0 | \n",
" 118839.0 | \n",
" 103569.791319 | \n",
" 117463.666667 | \n",
" 0.134150 | \n",
"
\n",
" \n",
" | 319 | \n",
" 2025-07-12 | \n",
" 2025-11-04 | \n",
" 98944.0 | \n",
" 126202.0 | \n",
" 98943.0 | \n",
" 126202.0 | \n",
" 117640.026389 | \n",
" 103712.985764 | \n",
" 0.118387 | \n",
"
\n",
" \n",
" | 320 | \n",
" 2025-11-05 | \n",
" 2025-11-18 | \n",
" 89291.0 | \n",
" 107343.0 | \n",
" 89286.0 | \n",
" 107343.0 | \n",
" 102514.621181 | \n",
" 91705.833333 | \n",
" 0.105437 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" start_date end_date min_open max_open min_close max_close \\\n",
"316 2025-02-27 2025-04-25 74509.0 95801.0 74515.0 95800.0 \n",
"317 2025-04-26 2025-05-11 92877.0 104971.0 92872.0 104965.0 \n",
"318 2025-05-12 2025-07-11 98384.0 118833.0 98382.0 118839.0 \n",
"319 2025-07-12 2025-11-04 98944.0 126202.0 98943.0 126202.0 \n",
"320 2025-11-05 2025-11-18 89291.0 107343.0 89286.0 107343.0 \n",
"\n",
" start_avg end_avg change \n",
"316 85166.063889 94303.907292 0.107294 \n",
"317 94500.950347 104182.167708 0.102446 \n",
"318 103569.791319 117463.666667 0.134150 \n",
"319 117640.026389 103712.985764 0.118387 \n",
"320 102514.621181 91705.833333 0.105437 "
]
},
"execution_count": 26,
"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[\"OpenMin\"].min(),\n",
" \"max_open\": interval[\"OpenMax\"].max(),\n",
" \"min_close\": interval[\"CloseMin\"].min(),\n",
" \"max_close\": interval[\"CloseMax\"].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()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "07f1cd58",
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}