{ "cells": [ { "cell_type": "code", "execution_count": 2, "id": "e40a5526-458a-4d11-8eaa-3b584f723738", "metadata": { "tags": [] }, "outputs": [], "source": [ "import fincal as fc\n", "import datetime\n", "from dateutil.relativedelta import relativedelta" ] }, { "cell_type": "code", "execution_count": 2, "id": "a54bfbdf", "metadata": {}, "outputs": [], "source": [ "data = [\n", " (\"2022-01-01\", 10),\n", " (\"2022-01-02\", 12),\n", " (\"2022-01-03\", 14),\n", " (\"2022-01-04\", 16)\n", " # (\"2022-01-06\", 18),\n", " # (\"2022-01-07\", 20),\n", " # (\"2022-01-09\", 22),\n", " # (\"2022-01-10\", 24),\n", " # (\"2022-01-11\", 26),\n", " # (\"2022-01-12\", 28),\n", " # (\"2023-01-01\", 30),\n", " # (\"2023-01-02\", 32),\n", " # (\"2023-01-03\", 34),\n", "]" ] }, { "cell_type": "code", "execution_count": 3, "id": "fcc5f8f1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TimeSeries([(datetime.datetime(2022, 1, 1, 0, 0), 10.0),\n", "\t(datetime.datetime(2022, 1, 2, 0, 0), 12.0),\n", "\t(datetime.datetime(2022, 1, 3, 0, 0), 14.0),\n", "\t(datetime.datetime(2022, 1, 4, 0, 0), 16.0)], frequency='D')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = fc.TimeSeries(data, 'D')\n", "ts2 = fc.TimeSeries(data, 'D')\n", "ts" ] }, { "cell_type": "code", "execution_count": 21, "id": "c091da16-d3a2-4d5b-93da-099d67373932", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Series([datetime.datetime(2021, 1, 1, 0, 0), datetime.datetime(2021, 1, 2, 0, 0)], data_type='datetime')" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fc.Series(['2021-01-01', '2021-01-02'], data_type='date')" ] }, { "cell_type": "code", "execution_count": 15, "id": "77fc30d8-2843-40c4-9842-d943e6ef9813", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Series([11.0, 14.0, 17.0, 20.0], data_type='float')" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.values + fc.Series([1, 2, 3, 4])" ] }, { "cell_type": "code", "execution_count": 8, "id": "8e812756", "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "TimeSeries can be only expanded to a higher frequency", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Input \u001b[0;32mIn [8]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mts\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexpand\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mW\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mffill\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Documents/projects/fincal/fincal/fincal.py:624\u001b[0m, in \u001b[0;36mTimeSeries.expand\u001b[0;34m(self, to_frequency, method, skip_weekends, eomonth)\u001b[0m\n\u001b[1;32m 621\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid argument for to_frequency \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mto_frequency\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 623\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m to_frequency\u001b[38;5;241m.\u001b[39mdays \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfrequency\u001b[38;5;241m.\u001b[39mdays:\n\u001b[0;32m--> 624\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTimeSeries can be only expanded to a higher frequency\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 626\u001b[0m new_dates \u001b[38;5;241m=\u001b[39m create_date_series(\n\u001b[1;32m 627\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstart_date,\n\u001b[1;32m 628\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mend_date,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 632\u001b[0m ensure_coverage\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 633\u001b[0m )\n\u001b[1;32m 635\u001b[0m closest: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mprevious\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mffill\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnext\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", "\u001b[0;31mValueError\u001b[0m: TimeSeries can be only expanded to a higher frequency" ] } ], "source": [ "ts.expand('W', 'ffill')" ] }, { "cell_type": "code", "execution_count": 12, "id": "55918da9-2df6-4773-9ca0-e19b52c3ece2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TimeSeries([(datetime.datetime(2022, 1, 1, 0, 0), 10),\n", "\t(datetime.datetime(2022, 4, 1, 0, 0), 28),\n", "\t(datetime.datetime(2022, 7, 1, 0, 0), 28),\n", "\t(datetime.datetime(2022, 10, 1, 0, 0), 28),\n", "\t(datetime.datetime(2023, 1, 1, 0, 0), 30)], frequency='Q')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.shrink('Q', 'ffill')" ] }, { "cell_type": "code", "execution_count": 2, "id": "9431eb8c", "metadata": {}, "outputs": [], "source": [ "from fincal.utils import _is_eomonth" ] }, { "cell_type": "code", "execution_count": 5, "id": "36eefec7-7dbf-4a28-ac50-2e502d9d6864", "metadata": {}, "outputs": [], "source": [ "weekly_data = [\n", " ('2018-01-31', 26),\n", " ('2018-02-28', 44),\n", " ('2018-03-30', 40),\n", " ('2018-04-30', 36),\n", " ('2018-05-31', 31),\n", " ('2018-06-30', 45),\n", " ('2018-07-30', 31),\n", " ('2018-08-31', 42),\n", " ('2018-09-30', 40),\n", " ('2018-10-30', 30),\n", " ('2018-11-30', 35),\n", " ('2018-12-31', 37),\n", " ('2019-01-31', 31),\n", " ('2019-02-28', 44),\n", " ('2019-03-31', 31),\n", " ('2019-04-29', 32),\n", " ('2019-05-30', 39),\n", " ('2019-06-30', 27),\n", " ('2019-07-31', 35),\n", " ('2019-08-31', 33),\n", " ('2019-09-30', 29),\n", " ('2019-10-30', 26),\n", " ('2019-11-30', 39),\n", " ('2019-12-30', 30),\n", " ('2020-01-30', 29)\n", "]\n", "week_ts = fc.TimeSeries(weekly_data, 'W')" ] }, { "cell_type": "code", "execution_count": 6, "id": "e1071f90", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "_is_eomonth(week_ts.dates)" ] }, { "cell_type": "code", "execution_count": 22, "id": "d64dd3c6-4295-4301-90e4-5c74ea23c4af", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(datetime.datetime(2017, 1, 1, 0, 0), 67)\n", "(datetime.datetime(2017, 2, 1, 0, 0), 85)\n", "(datetime.datetime(2017, 3, 1, 0, 0), 76)\n", "(datetime.datetime(2017, 4, 1, 0, 0), 78)\n", "(datetime.datetime(2017, 5, 1, 0, 0), 65)\n", "(datetime.datetime(2017, 6, 1, 0, 0), 74)\n" ] } ], "source": [ "for i in week_ts.shrink('M', 'ffill', skip_weekends=True):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": null, "id": "a549c5c0-c89a-4cc3-b396-c4afa77a9879", "metadata": {}, "outputs": [], "source": [ "week_ts.sync(ts)" ] }, { "cell_type": "code", "execution_count": 1, "id": "4755aea3-3655-4651-91d2-8e54c24303bc", "metadata": {}, "outputs": [], "source": [ "import fincal as fc" ] }, { "cell_type": "code", "execution_count": 2, "id": "bd9887b3-d98a-4c80-8f95-ef7b7f19ded4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['date', 'nav']\n", "CPU times: user 57.5 ms, sys: 3.38 ms, total: 60.8 ms\n", "Wall time: 60.5 ms\n" ] } ], "source": [ "%%time\n", "ts = fc.read_csv('test_files/msft.csv', frequency='D')" ] }, { "cell_type": "code", "execution_count": 7, "id": "b7c176d4-d89f-4bda-9d67-75463eb90468", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(datetime.datetime(2022, 2, 11, 0, 0), 295.040009)\n", "(datetime.datetime(2022, 2, 12, 0, 0), 296.0)\n", "(datetime.datetime(2022, 2, 13, 0, 0), 296.0)\n", "(datetime.datetime(2022, 2, 14, 0, 0), 295.0)\n", "(datetime.datetime(2022, 2, 15, 0, 0), 300.470001)\n", "(datetime.datetime(2022, 2, 16, 0, 0), 299.5)\n", "(datetime.datetime(2022, 2, 17, 0, 0), 290.730011)\n", "(datetime.datetime(2022, 2, 18, 0, 0), 287.929993)\n" ] } ], "source": [ "for i in ts.tail(8):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 6, "id": "69c57754-a6fb-4881-9359-ba17c7fb8be5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1.76 ms, sys: 123 µs, total: 1.88 ms\n", "Wall time: 1.88 ms\n" ] } ], "source": [ "%%time\n", "ts['2022-02-12'] = 296" ] }, { "cell_type": "code", "execution_count": 8, "id": "7aa02023-406e-4700-801c-c06390ddf914", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 3.61 ms, sys: 68 µs, total: 3.68 ms\n", "Wall time: 3.7 ms\n" ] }, { "data": { "text/plain": [ "{'start_date': datetime.datetime(1999, 12, 27, 0, 0),\n", " 'end_date': datetime.datetime(2009, 3, 9, 0, 0),\n", " 'drawdown': -0.7456453305351521}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "ts.max_drawdown()" ] }, { "cell_type": "code", "execution_count": 9, "id": "72cb4da4-1318-4b9b-b563-adac46accfb3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from typing import Mapping\n", "isinstance(ts, Mapping)" ] }, { "cell_type": "code", "execution_count": 23, "id": "96bbecbf", "metadata": {}, "outputs": [], "source": [ "import fincal as fc" ] }, { "cell_type": "code", "execution_count": 24, "id": "19199c92", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['amfi_code', 'date', 'nav']\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/gourav/Documents/projects/fincal/fincal/core.py:308: UserWarning: The input data contains duplicate dates which have been ignored.\n", " warnings.warn(\"The input data contains duplicate dates which have been ignored.\")\n" ] }, { "data": { "text/plain": [ "TimeSeries([(datetime.datetime(2013, 1, 2, 0, 0), 18.972),\n", "\t (datetime.datetime(2013, 1, 3, 0, 0), 19.011),\n", "\t (datetime.datetime(2013, 1, 4, 0, 0), 19.008)\n", "\t ...\n", "\t (datetime.datetime(2022, 2, 10, 0, 0), 86.5),\n", "\t (datetime.datetime(2022, 2, 11, 0, 0), 85.226),\n", "\t (datetime.datetime(2022, 2, 14, 0, 0), 82.533)], frequency='D')" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = fc.read_csv('test_files/nav_history_daily - copy.csv', col_index=(1, 2), frequency='D', date_format='%d-%m-%y')\n", "ts" ] }, { "cell_type": "code", "execution_count": 28, "id": "51c9ae9a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.12031455056454916" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fc.sharpe_ratio(\n", " ts,\n", " risk_free_rate=0.06,\n", " from_date='2013-02-04',\n", " to_date='2022-02-14',\n", " return_period_unit='months',\n", " return_period_value=1\n", ")" ] }, { "cell_type": "markdown", "id": "b3fb7b59-eaa3-41a5-b1ab-89d63b69edb0", "metadata": {}, "source": [ "# Data generator" ] }, { "cell_type": "code", "execution_count": 2, "id": "aead3e77-2670-4541-846a-5537b01f3d2e", "metadata": {}, "outputs": [], "source": [ "import random\n", "import math\n", "import fincal as fc\n", "from typing import List\n", "import datetime\n", "from dateutil.relativedelta import relativedelta" ] }, { "cell_type": "code", "execution_count": 3, "id": "f287e05f", "metadata": {}, "outputs": [], "source": [ "def create_prices(s0: float, mu: float, sigma: float, num_prices: int) -> list:\n", " \"\"\"Generates a price following a geometric brownian motion process based on the input of the arguments.\n", "\n", " Since this function is used only to generate data for tests, the seed is fixed as 1234.\n", " Many of the tests rely on exact values generated using this seed.\n", " If the seed is changed, those tests will fail.\n", "\n", " Parameters:\n", " ------------\n", " s0: float\n", " Asset inital price.\n", "\n", " mu: float\n", " Interest rate expressed annual terms.\n", "\n", " sigma: float\n", " Volatility expressed annual terms.\n", "\n", " num_prices: int\n", " number of prices to generate\n", "\n", " Returns:\n", " --------\n", " Returns a list of values generated using GBM algorithm\n", " \"\"\"\n", "\n", " random.seed(1234) # WARNING! Changing the seed will cause most tests to fail\n", " all_values = []\n", " for _ in range(num_prices):\n", " s0 *= math.exp(\n", " (mu - 0.5 * sigma**2) * (1.0 / 365.0) + sigma * math.sqrt(1.0 / 365.0) * random.gauss(mu=0, sigma=1)\n", " )\n", " all_values.append(round(s0, 2))\n", "\n", " return all_values\n", "\n", "\n", "def sample_data_generator(\n", " frequency: fc.Frequency,\n", " num: int = 1000,\n", " skip_weekends: bool = False,\n", " mu: float = 0.1,\n", " sigma: float = 0.05,\n", " eomonth: bool = False,\n", ") -> List[tuple]:\n", " \"\"\"Creates TimeSeries data\n", "\n", " Parameters:\n", " -----------\n", " frequency: Frequency\n", " The frequency of the time series data to be generated.\n", "\n", " num: int\n", " Number of date: value pairs to be generated.\n", "\n", " skip_weekends: bool\n", " Whether weekends (saturday, sunday) should be skipped.\n", " Gets used only if the frequency is daily.\n", "\n", " mu: float\n", " Mean return for the values.\n", "\n", " sigma: float\n", " standard deviation of the values.\n", "\n", " Returns:\n", " --------\n", " Returns a TimeSeries object\n", " \"\"\"\n", "\n", " start_date = datetime.datetime(2017, 1, 1)\n", " timedelta_dict = {\n", " frequency.freq_type: int(\n", " frequency.value * num * (7 / 5 if frequency == fc.AllFrequencies.D and skip_weekends else 1)\n", " )\n", " }\n", " end_date = start_date + relativedelta(**timedelta_dict)\n", " dates = fc.create_date_series(start_date, end_date, frequency.symbol, skip_weekends=skip_weekends, eomonth=eomonth)\n", " values = create_prices(1000, mu, sigma, num)\n", " ts = list(zip(dates, values))\n", " return ts\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "c85b5dd9-9a88-4608-ac58-1a141295f63f", "metadata": {}, "outputs": [], "source": [ "data = sample_data_generator(num=261, frequency=fc.AllFrequencies.W, mu=0.6, sigma=0.7)\n", "ts = fc.TimeSeries(data, \"W\")" ] }, { "cell_type": "code", "execution_count": 5, "id": "0488a4d0-bca1-4341-9fae-1fd254adc0dc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TimeSeries([(datetime.datetime(2017, 1, 1, 0, 0), 1040.39),\n", "\t (datetime.datetime(2017, 1, 8, 0, 0), 1032.83),\n", "\t (datetime.datetime(2017, 1, 15, 0, 0), 1120.5)\n", "\t ...\n", "\t (datetime.datetime(2021, 12, 12, 0, 0), 2007.18),\n", "\t (datetime.datetime(2021, 12, 19, 0, 0), 1987.49),\n", "\t (datetime.datetime(2021, 12, 26, 0, 0), 1924.2)], frequency='W')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts" ] }, { "cell_type": "code", "execution_count": 6, "id": "cd0eb38c", "metadata": {}, "outputs": [], "source": [ "dates = fc.create_date_series(ts.start_date, ts.end_date, 'M')" ] }, { "cell_type": "code", "execution_count": 7, "id": "69c48512", "metadata": {}, "outputs": [], "source": [ "prev_date = dates[0]\n", "for i in dates[1:]:\n", " cur_date = i\n", " " ] }, { "cell_type": "code", "execution_count": 8, "id": "43fa2254", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "TimeSeries([(datetime.datetime(2017, 1, 8, 0, 0), 1032.83),\n", "\t(datetime.datetime(2017, 1, 15, 0, 0), 1120.5),\n", "\t(datetime.datetime(2017, 1, 22, 0, 0), 1125.86),\n", "\t(datetime.datetime(2017, 1, 29, 0, 0), 1178.74)], frequency='W')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts[(ts.dates < '2017-01-31') & (ts.dates > '2017-01-01')]" ] }, { "cell_type": "code", "execution_count": 9, "id": "32a82399-e056-45d6-86a3-b9f0855aed27", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Series([datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 2, 1, 0, 0), datetime.datetime(2017, 3, 1, 0, 0), datetime.datetime(2017, 4, 1, 0, 0), datetime.datetime(2017, 5, 1, 0, 0), datetime.datetime(2017, 6, 1, 0, 0), datetime.datetime(2017, 7, 1, 0, 0), datetime.datetime(2017, 8, 1, 0, 0), datetime.datetime(2017, 9, 1, 0, 0), datetime.datetime(2017, 10, 1, 0, 0), datetime.datetime(2017, 11, 1, 0, 0), datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2018, 1, 1, 0, 0), datetime.datetime(2018, 2, 1, 0, 0), datetime.datetime(2018, 3, 1, 0, 0), datetime.datetime(2018, 4, 1, 0, 0), datetime.datetime(2018, 5, 1, 0, 0), datetime.datetime(2018, 6, 1, 0, 0), datetime.datetime(2018, 7, 1, 0, 0), datetime.datetime(2018, 8, 1, 0, 0), datetime.datetime(2018, 9, 1, 0, 0), datetime.datetime(2018, 10, 1, 0, 0), datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 12, 1, 0, 0), datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 2, 1, 0, 0), datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 4, 1, 0, 0), datetime.datetime(2019, 5, 1, 0, 0), datetime.datetime(2019, 6, 1, 0, 0), datetime.datetime(2019, 7, 1, 0, 0), datetime.datetime(2019, 8, 1, 0, 0), datetime.datetime(2019, 9, 1, 0, 0), datetime.datetime(2019, 10, 1, 0, 0), datetime.datetime(2019, 11, 1, 0, 0), datetime.datetime(2019, 12, 1, 0, 0), datetime.datetime(2020, 1, 1, 0, 0), datetime.datetime(2020, 2, 1, 0, 0), datetime.datetime(2020, 3, 1, 0, 0), datetime.datetime(2020, 4, 1, 0, 0), datetime.datetime(2020, 5, 1, 0, 0), datetime.datetime(2020, 6, 1, 0, 0), datetime.datetime(2020, 7, 1, 0, 0), datetime.datetime(2020, 8, 1, 0, 0), datetime.datetime(2020, 9, 1, 0, 0), datetime.datetime(2020, 10, 1, 0, 0), datetime.datetime(2020, 11, 1, 0, 0), datetime.datetime(2020, 12, 1, 0, 0), datetime.datetime(2021, 1, 1, 0, 0), datetime.datetime(2021, 2, 1, 0, 0), datetime.datetime(2021, 3, 1, 0, 0), datetime.datetime(2021, 4, 1, 0, 0), datetime.datetime(2021, 5, 1, 0, 0), datetime.datetime(2021, 6, 1, 0, 0), datetime.datetime(2021, 7, 1, 0, 0), datetime.datetime(2021, 8, 1, 0, 0), datetime.datetime(2021, 9, 1, 0, 0), datetime.datetime(2021, 10, 1, 0, 0), datetime.datetime(2021, 11, 1, 0, 0), datetime.datetime(2021, 12, 1, 0, 0)], data_type='datetime')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates" ] }, { "cell_type": "code", "execution_count": 13, "id": "352a71a3-5469-4464-8a93-17f4660822fd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2017-01-01 00:00:00 1040.39\n", "2017-01-08 00:00:00 1032.83\n", "2017-01-15 00:00:00 1120.5\n", "2017-01-22 00:00:00 1125.86\n", "2017-01-29 00:00:00 1178.74\n", "2017-02-05 00:00:00 1158.8\n", "2017-02-12 00:00:00 1151.54\n", "2017-02-19 00:00:00 1137.19\n", "2017-02-26 00:00:00 1141.47\n", "2017-03-05 00:00:00 1112.37\n", "2017-03-12 00:00:00 1186.34\n", "2017-03-19 00:00:00 1202.35\n", "2017-03-26 00:00:00 1169.04\n", "2017-04-02 00:00:00 1220.55\n", "2017-04-09 00:00:00 1202.93\n", "2017-04-16 00:00:00 1187.57\n", "2017-04-23 00:00:00 1197.52\n", "2017-04-30 00:00:00 1218.61\n", "2017-05-07 00:00:00 1272.3\n", "2017-05-14 00:00:00 1278.49\n", "2017-05-21 00:00:00 1296.56\n", "2017-05-28 00:00:00 1294.03\n", "2017-06-04 00:00:00 1244.9\n", "2017-06-11 00:00:00 1233.13\n", "2017-06-18 00:00:00 1218.74\n", "2017-06-25 00:00:00 1208.5\n", "2017-07-02 00:00:00 1179.17\n", "2017-07-09 00:00:00 1164.11\n", "2017-07-16 00:00:00 1109.05\n", "2017-07-23 00:00:00 1090.0\n", "2017-07-30 00:00:00 1054.5\n", "2017-08-06 00:00:00 1059.84\n", "2017-08-13 00:00:00 1061.35\n", "2017-08-20 00:00:00 1157.0\n", "2017-08-27 00:00:00 1109.25\n", "2017-09-03 00:00:00 1124.86\n", "2017-09-10 00:00:00 1175.81\n", "2017-09-17 00:00:00 1183.18\n", "2017-09-24 00:00:00 1208.74\n", "2017-10-01 00:00:00 1210.82\n", "2017-10-08 00:00:00 1170.14\n", "2017-10-15 00:00:00 1178.4\n", "2017-10-22 00:00:00 1235.02\n", "2017-10-29 00:00:00 1256.52\n", "2017-11-05 00:00:00 1288.37\n", "2017-11-12 00:00:00 1342.41\n", "2017-11-19 00:00:00 1417.1\n", "2017-11-26 00:00:00 1518.11\n", "2017-12-03 00:00:00 1538.06\n", "2017-12-10 00:00:00 1405.51\n", "2017-12-17 00:00:00 1434.94\n", "2017-12-24 00:00:00 1471.6\n", "2017-12-31 00:00:00 1515.75\n", "2018-01-07 00:00:00 1528.28\n", "2018-01-14 00:00:00 1541.99\n", "2018-01-21 00:00:00 1510.71\n", "2018-01-28 00:00:00 1592.01\n", "2018-02-04 00:00:00 1718.11\n", "2018-02-11 00:00:00 1788.51\n", "2018-02-18 00:00:00 1895.84\n", "2018-02-25 00:00:00 1965.28\n", "2018-03-04 00:00:00 1985.45\n", "2018-03-11 00:00:00 1948.76\n", "2018-03-18 00:00:00 2004.36\n", "2018-03-25 00:00:00 2040.49\n", "2018-04-01 00:00:00 1966.17\n", "2018-04-08 00:00:00 1984.85\n", "2018-04-15 00:00:00 1908.0\n", "2018-04-22 00:00:00 1970.14\n", "2018-04-29 00:00:00 1840.56\n", "2018-05-06 00:00:00 1736.25\n", "2018-05-13 00:00:00 1779.54\n", "2018-05-20 00:00:00 1803.03\n", "2018-05-27 00:00:00 1754.64\n", "2018-06-03 00:00:00 1785.96\n", "2018-06-10 00:00:00 1817.42\n", "2018-06-17 00:00:00 1788.5\n", "2018-06-24 00:00:00 1803.23\n", "2018-07-01 00:00:00 1686.82\n", "2018-07-08 00:00:00 1666.94\n", "2018-07-15 00:00:00 1559.94\n", "2018-07-22 00:00:00 1571.29\n", "2018-07-29 00:00:00 1527.71\n", "2018-08-05 00:00:00 1463.91\n", "2018-08-12 00:00:00 1418.93\n", "2018-08-19 00:00:00 1488.85\n", "2018-08-26 00:00:00 1502.09\n", "2018-09-02 00:00:00 1473.89\n", "2018-09-09 00:00:00 1511.63\n", "2018-09-16 00:00:00 1489.29\n", "2018-09-23 00:00:00 1550.82\n", "2018-09-30 00:00:00 1645.07\n", "2018-10-07 00:00:00 1626.79\n", "2018-10-14 00:00:00 1527.51\n", "2018-10-21 00:00:00 1508.86\n", "2018-10-28 00:00:00 1517.32\n", "2018-11-04 00:00:00 1505.09\n", "2018-11-11 00:00:00 1517.15\n", "2018-11-18 00:00:00 1515.15\n", "2018-11-25 00:00:00 1531.76\n", "2018-12-02 00:00:00 1509.4\n", "2018-12-09 00:00:00 1509.87\n", "2018-12-16 00:00:00 1591.72\n", "2018-12-23 00:00:00 1556.62\n", "2018-12-30 00:00:00 1502.95\n", "2019-01-06 00:00:00 1630.62\n", "2019-01-13 00:00:00 1674.96\n", "2019-01-20 00:00:00 1695.86\n", "2019-01-27 00:00:00 1757.33\n", "2019-02-03 00:00:00 1789.38\n", "2019-02-10 00:00:00 1810.87\n", "2019-02-17 00:00:00 1877.5\n", "2019-02-24 00:00:00 1839.49\n", "2019-03-03 00:00:00 1710.78\n", "2019-03-10 00:00:00 1600.36\n", "2019-03-17 00:00:00 1601.57\n", "2019-03-24 00:00:00 1530.07\n", "2019-03-31 00:00:00 1618.94\n", "2019-04-07 00:00:00 1531.05\n", "2019-04-14 00:00:00 1524.31\n", "2019-04-21 00:00:00 1559.94\n", "2019-04-28 00:00:00 1630.43\n", "2019-05-05 00:00:00 1597.4\n", "2019-05-12 00:00:00 1703.88\n", "2019-05-19 00:00:00 1635.2\n", "2019-05-26 00:00:00 1621.76\n", "2019-06-02 00:00:00 1634.33\n", "2019-06-09 00:00:00 1562.77\n", "2019-06-16 00:00:00 1549.12\n", "2019-06-23 00:00:00 1576.87\n", "2019-06-30 00:00:00 1487.67\n", "2019-07-07 00:00:00 1404.03\n", "2019-07-14 00:00:00 1416.17\n", "2019-07-21 00:00:00 1401.12\n", "2019-07-28 00:00:00 1401.12\n", "2019-08-04 00:00:00 1405.16\n", "2019-08-11 00:00:00 1373.43\n", "2019-08-18 00:00:00 1312.29\n", "2019-08-25 00:00:00 1314.92\n", "2019-09-01 00:00:00 1289.19\n", "2019-09-08 00:00:00 1300.85\n", "2019-09-15 00:00:00 1352.79\n", "2019-09-22 00:00:00 1351.29\n", "2019-09-29 00:00:00 1319.38\n", "2019-10-06 00:00:00 1341.78\n", "2019-10-13 00:00:00 1300.52\n", "2019-10-20 00:00:00 1389.83\n", "2019-10-27 00:00:00 1302.28\n", "2019-11-03 00:00:00 1202.98\n", "2019-11-10 00:00:00 1181.17\n", "2019-11-17 00:00:00 1125.6\n", "2019-11-24 00:00:00 1156.62\n", "2019-12-01 00:00:00 1205.04\n", "2019-12-08 00:00:00 1138.9\n", "2019-12-15 00:00:00 1167.41\n", "2019-12-22 00:00:00 1187.0\n", "2019-12-29 00:00:00 1117.66\n", "2020-01-05 00:00:00 1162.87\n", "2020-01-12 00:00:00 1160.5\n", "2020-01-19 00:00:00 1182.43\n", "2020-01-26 00:00:00 1162.46\n", "2020-02-02 00:00:00 1184.64\n", "2020-02-09 00:00:00 1173.68\n", "2020-02-16 00:00:00 1120.14\n", "2020-02-23 00:00:00 1203.76\n", "2020-03-01 00:00:00 1234.59\n", "2020-03-08 00:00:00 1164.89\n", "2020-03-15 00:00:00 1193.34\n", "2020-03-22 00:00:00 1213.7\n", "2020-03-29 00:00:00 1248.24\n", "2020-04-05 00:00:00 1291.25\n", "2020-04-12 00:00:00 1313.79\n", "2020-04-19 00:00:00 1250.83\n", "2020-04-26 00:00:00 1282.44\n", "2020-05-03 00:00:00 1237.36\n", "2020-05-10 00:00:00 1244.45\n", "2020-05-17 00:00:00 1209.46\n", "2020-05-24 00:00:00 1215.62\n", "2020-05-31 00:00:00 1176.28\n", "2020-06-07 00:00:00 1220.93\n", "2020-06-14 00:00:00 1236.97\n", "2020-06-21 00:00:00 1292.12\n", "2020-06-28 00:00:00 1341.62\n", "2020-07-05 00:00:00 1319.86\n", "2020-07-12 00:00:00 1286.69\n", "2020-07-19 00:00:00 1228.97\n", "2020-07-26 00:00:00 1253.36\n", "2020-08-02 00:00:00 1186.4\n", "2020-08-09 00:00:00 1176.77\n", "2020-08-16 00:00:00 1160.93\n", "2020-08-23 00:00:00 1112.51\n", "2020-08-30 00:00:00 1168.84\n", "2020-09-06 00:00:00 1191.77\n", "2020-09-13 00:00:00 1202.53\n", "2020-09-20 00:00:00 1253.35\n", "2020-09-27 00:00:00 1220.74\n", "2020-10-04 00:00:00 1298.59\n", "2020-10-11 00:00:00 1289.99\n", "2020-10-18 00:00:00 1331.7\n", "2020-10-25 00:00:00 1331.88\n", "2020-11-01 00:00:00 1316.17\n", "2020-11-08 00:00:00 1278.24\n", "2020-11-15 00:00:00 1316.89\n", "2020-11-22 00:00:00 1304.82\n", "2020-11-29 00:00:00 1336.41\n", "2020-12-06 00:00:00 1424.98\n", "2020-12-13 00:00:00 1414.69\n", "2020-12-20 00:00:00 1480.55\n", "2020-12-27 00:00:00 1442.9\n", "2021-01-03 00:00:00 1415.72\n", "2021-01-10 00:00:00 1394.22\n", "2021-01-17 00:00:00 1434.96\n", "2021-01-24 00:00:00 1426.63\n", "2021-01-31 00:00:00 1518.6\n", "2021-02-07 00:00:00 1461.76\n", "2021-02-14 00:00:00 1427.69\n", "2021-02-21 00:00:00 1447.32\n", "2021-02-28 00:00:00 1412.62\n", "2021-03-07 00:00:00 1422.12\n", "2021-03-14 00:00:00 1433.03\n", "2021-03-21 00:00:00 1599.56\n", "2021-03-28 00:00:00 1643.38\n", "2021-04-04 00:00:00 1735.51\n", "2021-04-11 00:00:00 1721.82\n", "2021-04-18 00:00:00 1801.1\n", "2021-04-25 00:00:00 1798.19\n", "2021-05-02 00:00:00 1728.64\n", "2021-05-09 00:00:00 1761.09\n", "2021-05-16 00:00:00 1864.6\n", "2021-05-23 00:00:00 1915.55\n", "2021-05-30 00:00:00 1880.83\n", "2021-06-06 00:00:00 1985.8\n", "2021-06-13 00:00:00 2031.42\n", "2021-06-20 00:00:00 2005.34\n", "2021-06-27 00:00:00 1903.11\n", "2021-07-04 00:00:00 1902.17\n", "2021-07-11 00:00:00 1943.94\n", "2021-07-18 00:00:00 1848.16\n", "2021-07-25 00:00:00 1807.84\n", "2021-08-01 00:00:00 1885.75\n", "2021-08-08 00:00:00 1930.57\n", "2021-08-15 00:00:00 2004.8\n", "2021-08-22 00:00:00 2181.39\n", "2021-08-29 00:00:00 2112.61\n", "2021-09-05 00:00:00 2176.47\n", "2021-09-12 00:00:00 2255.73\n", "2021-09-19 00:00:00 2224.32\n", "2021-09-26 00:00:00 2195.41\n", "2021-10-03 00:00:00 2255.36\n", "2021-10-10 00:00:00 2238.18\n", "2021-10-17 00:00:00 2290.97\n", "2021-10-24 00:00:00 2380.52\n", "2021-10-31 00:00:00 2237.11\n", "2021-11-07 00:00:00 2234.85\n", "2021-11-14 00:00:00 2281.46\n", "2021-11-21 00:00:00 2225.14\n", "2021-11-28 00:00:00 2200.28\n", "2021-12-05 00:00:00 2104.56\n", "2021-12-12 00:00:00 2007.18\n", "2021-12-19 00:00:00 1987.49\n", "2021-12-26 00:00:00 1924.2\n" ] } ], "source": [ "for i, j in ts:\n", " print(i, j)" ] }, { "cell_type": "code", "execution_count": 11, "id": "14c72558-0500-44e4-a893-628a4102ff53", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2017-01-01 00:00:00 1099.664\n", "2017-02-01 00:00:00 1147.25\n", "2017-03-01 00:00:00 1167.5249999999999\n", "2017-04-01 00:00:00 1205.436\n", "2017-05-01 00:00:00 1285.345\n", "2017-06-01 00:00:00 1226.3175\n", "2017-07-01 00:00:00 1119.366\n", "2017-08-01 00:00:00 1096.86\n", "2017-09-01 00:00:00 1173.1475\n", "2017-10-01 00:00:00 1210.18\n", "2017-11-01 00:00:00 1391.4975\n", "2017-12-01 00:00:00 1473.172\n", "2018-01-01 00:00:00 1543.2475\n", "2018-02-01 00:00:00 1841.935\n", "2018-03-01 00:00:00 1994.7649999999999\n", "2018-04-01 00:00:00 1933.944\n", "2018-05-01 00:00:00 1768.365\n", "2018-06-01 00:00:00 1798.7775000000001\n", "2018-07-01 00:00:00 1602.54\n", "2018-08-01 00:00:00 1468.445\n", "2018-09-01 00:00:00 1534.14\n", "2018-10-01 00:00:00 1545.12\n", "2018-11-01 00:00:00 1517.2875\n", "2018-12-01 00:00:00 1534.112\n", "2019-01-01 00:00:00 1689.6924999999999\n", "2019-02-01 00:00:00 1829.31\n", "2019-03-01 00:00:00 1612.344\n", "2019-04-01 00:00:00 1561.4325\n", "2019-05-01 00:00:00 1639.56\n", "2019-06-01 00:00:00 1562.152\n", "2019-07-01 00:00:00 1405.61\n", "2019-08-01 00:00:00 1351.45\n", "2019-09-01 00:00:00 1322.7\n", "2019-10-01 00:00:00 1333.6025\n", "2019-11-01 00:00:00 1166.5925\n", "2019-12-01 00:00:00 1163.202\n", "2020-01-01 00:00:00 1167.065\n", "2020-02-01 00:00:00 1170.555\n", "2020-03-01 00:00:00 1210.952\n", "2020-04-01 00:00:00 1284.5774999999999\n", "2020-05-01 00:00:00 1216.634\n", "2020-06-01 00:00:00 1272.9099999999999\n", "2020-07-01 00:00:00 1272.22\n", "2020-08-01 00:00:00 1161.09\n", "2020-09-01 00:00:00 1217.0974999999999\n", "2020-10-01 00:00:00 1313.04\n", "2020-11-01 00:00:00 1310.506\n", "2020-12-01 00:00:00 1440.78\n", "2021-01-01 00:00:00 1438.026\n", "2021-02-01 00:00:00 1437.3474999999999\n", "2021-03-01 00:00:00 1524.5225\n", "2021-04-01 00:00:00 1764.155\n", "2021-05-01 00:00:00 1830.142\n", "2021-06-01 00:00:00 1981.4175\n", "2021-07-01 00:00:00 1875.5275000000001\n", "2021-08-01 00:00:00 2023.024\n", "2021-09-01 00:00:00 2212.9825\n", "2021-10-01 00:00:00 2280.428\n", "2021-11-01 00:00:00 2235.4325\n" ] } ], "source": [ "prev_date = dates[0]\n", "for date in dates[1:]:\n", " cur_ts = ts[(ts.dates < date) & (ts.dates >= prev_date)]\n", " print(prev_date, cur_ts.mean())\n", " prev_date = date" ] } ], "metadata": { "interpreter": { "hash": "71e6a8e087576f7c2a714460e6ef0339bac111b70cc81e9aa980fde63219ab06" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.4" } }, "nbformat": 4, "nbformat_minor": 5 }