{
"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",
" 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": 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",
" Timestamp | \n",
" Low | \n",
" High | \n",
" Open | \n",
" Close | \n",
"
\n",
" \n",
" \n",
" \n",
" | 5078 | \n",
" 2025-11-26 | \n",
" 86304.0 | \n",
" 90646.0 | \n",
" 87331.0 | \n",
" 90477.0 | \n",
"
\n",
" \n",
" | 5079 | \n",
" 2025-11-27 | \n",
" 90091.0 | \n",
" 91926.0 | \n",
" 90476.0 | \n",
" 91325.0 | \n",
"
\n",
" \n",
" | 5080 | \n",
" 2025-11-28 | \n",
" 90233.0 | \n",
" 93091.0 | \n",
" 91326.0 | \n",
" 90913.0 | \n",
"
\n",
" \n",
" | 5081 | \n",
" 2025-11-29 | \n",
" 90216.0 | \n",
" 91179.0 | \n",
" 90913.0 | \n",
" 90832.0 | \n",
"
\n",
" \n",
" | 5082 | \n",
" 2025-11-30 | \n",
" 90362.0 | \n",
" 91969.0 | \n",
" 90832.0 | \n",
" 90382.0 | \n",
"
\n",
" \n",
"
\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",
" Timestamp | \n",
" Low | \n",
" High | \n",
" Open | \n",
" Close | \n",
" Avg | \n",
"
\n",
" \n",
" \n",
" \n",
" | 5078 | \n",
" 2025-11-26 | \n",
" 86304.0 | \n",
" 90646.0 | \n",
" 87331.0 | \n",
" 90477.0 | \n",
" 88475.0 | \n",
"
\n",
" \n",
" | 5079 | \n",
" 2025-11-27 | \n",
" 90091.0 | \n",
" 91926.0 | \n",
" 90476.0 | \n",
" 91325.0 | \n",
" 91008.5 | \n",
"
\n",
" \n",
" | 5080 | \n",
" 2025-11-28 | \n",
" 90233.0 | \n",
" 93091.0 | \n",
" 91326.0 | \n",
" 90913.0 | \n",
" 91662.0 | \n",
"
\n",
" \n",
" | 5081 | \n",
" 2025-11-29 | \n",
" 90216.0 | \n",
" 91179.0 | \n",
" 90913.0 | \n",
" 90832.0 | \n",
" 90697.5 | \n",
"
\n",
" \n",
" | 5082 | \n",
" 2025-11-30 | \n",
" 90362.0 | \n",
" 91969.0 | \n",
" 90832.0 | \n",
" 90382.0 | \n",
" 91165.5 | \n",
"
\n",
" \n",
"
\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",
" start_date | \n",
" end_date | \n",
" min_open | \n",
" max_close | \n",
" start_avg | \n",
" end_avg | \n",
" change | \n",
"
\n",
" \n",
" \n",
" \n",
" | 335 | \n",
" 2025-02-27 | \n",
" 2025-04-23 | \n",
" 76252.0 | \n",
" 94273.0 | \n",
" 84801.5 | \n",
" 93335.0 | \n",
" 0.100629 | \n",
"
\n",
" \n",
" | 336 | \n",
" 2025-04-24 | \n",
" 2025-05-09 | \n",
" 93730.0 | \n",
" 103261.0 | \n",
" 92867.5 | \n",
" 103341.0 | \n",
" 0.112779 | \n",
"
\n",
" \n",
" | 337 | \n",
" 2025-05-10 | \n",
" 2025-07-11 | \n",
" 100990.0 | \n",
" 117579.0 | \n",
" 103915.0 | \n",
" 117032.5 | \n",
" 0.126233 | \n",
"
\n",
" \n",
" | 338 | \n",
" 2025-07-12 | \n",
" 2025-11-04 | \n",
" 106470.0 | \n",
" 124728.0 | \n",
" 117599.0 | \n",
" 103079.0 | \n",
" 0.123470 | \n",
"
\n",
" \n",
" | 339 | \n",
" 2025-11-05 | \n",
" 2025-11-18 | \n",
" 92112.0 | \n",
" 105972.0 | \n",
" 101737.5 | \n",
" 91471.0 | \n",
" 0.100912 | \n",
"
\n",
" \n",
"
\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
}