diff --git a/testing.ipynb b/testing.ipynb index 5cc2b73..b736eb3 100644 --- a/testing.ipynb +++ b/testing.ipynb @@ -2,38 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "id": "e1ecfa55", - "metadata": {}, + "execution_count": 2, + "id": "e40a5526-458a-4d11-8eaa-3b584f723738", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import fincal as fc" + "import fincal as fc\n", + "import datetime\n", + "from dateutil.relativedelta import relativedelta" ] }, { "cell_type": "code", "execution_count": 2, - "id": "ccac3896", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "fincal.fincal.TimeSeries" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fc.TimeSeries" - ] - }, - { - "cell_type": "code", - "execution_count": 3, "id": "a54bfbdf", "metadata": {}, "outputs": [], @@ -41,8 +24,8 @@ "data = [\n", " (\"2022-01-01\", 10),\n", " (\"2022-01-02\", 12),\n", - " (\"2022-01-03\", 14)\n", - " # (\"2022-01-04\", 16),\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", @@ -57,52 +40,70 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "fcc5f8f1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "TimeSeries([(datetime.datetime(2022, 1, 1, 0, 0), 10),\n", - "\t(datetime.datetime(2022, 1, 2, 0, 0), 12),\n", - "\t(datetime.datetime(2022, 1, 3, 0, 0), 14)], frequency='M')" + "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": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "ts = fc.TimeSeries(data, 'M')\n", + "ts = fc.TimeSeries(data, 'D')\n", + "ts2 = fc.TimeSeries(data, 'D')\n", "ts" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "c9e9cb1b", + "execution_count": 21, + "id": "c091da16-d3a2-4d5b-93da-099d67373932", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "TimeSeries([(datetime.datetime(2022, 1, 1, 0, 0), 10),\n", - "\t(datetime.datetime(2022, 1, 2, 0, 0), 12),\n", - "\t(datetime.datetime(2022, 1, 3, 0, 0), 14),\n", - "\t(datetime.datetime(2022, 1, 4, 0, 0), 15),\n", - "\t(datetime.datetime(2022, 1, 5, 0, 0), 16)], frequency='M')" + "Series([datetime.datetime(2021, 1, 1, 0, 0), datetime.datetime(2021, 1, 2, 0, 0)], data_type='datetime')" ] }, - "execution_count": 7, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "ts['2022-01-04'] = 15\n", - "ts" + "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])" ] }, { @@ -112,20 +113,16 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "TimeSeries([(datetime.datetime(2022, 1, 1, 0, 0), 10),\n", - "\t (datetime.datetime(2022, 1, 8, 0, 0), 20),\n", - "\t (datetime.datetime(2022, 1, 15, 0, 0), 28)\n", - "\t ...\n", - "\t (datetime.datetime(2022, 12, 17, 0, 0), 28),\n", - "\t (datetime.datetime(2022, 12, 24, 0, 0), 28),\n", - "\t (datetime.datetime(2022, 12, 31, 0, 0), 28)], frequency='W')" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" + "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": [ @@ -159,48 +156,72 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "36eefec7-7dbf-4a28-ac50-2e502d9d6864", + "execution_count": 2, + "id": "9431eb8c", "metadata": {}, "outputs": [], "source": [ - "weekly_data = [('2017-01-01', 67),\n", - "('2017-01-08', 79),\n", - "('2017-01-15', 73),\n", - "('2017-01-22', 63),\n", - "('2017-01-29', 85),\n", - "('2017-02-05', 66),\n", - "('2017-02-12', 78),\n", - "('2017-02-19', 75),\n", - "('2017-02-26', 76),\n", - "('2017-03-05', 82),\n", - "('2017-03-12', 85),\n", - "('2017-03-19', 63),\n", - "('2017-03-26', 78),\n", - "('2017-04-02', 65),\n", - "('2017-04-09', 85),\n", - "('2017-04-16', 86),\n", - "('2017-04-23', 67),\n", - "('2017-04-30', 65),\n", - "('2017-05-07', 82),\n", - "('2017-05-14', 73),\n", - "('2017-05-21', 78),\n", - "('2017-05-28', 74),\n", - "('2017-06-04', 62),\n", - "('2017-06-11', 84),\n", - "('2017-06-18', 83)]" + "from fincal.utils import _is_eomonth" ] }, { "cell_type": "code", - "execution_count": 15, - "id": "39bd8598-ab0f-4c81-8428-ad8248e686d3", + "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, @@ -277,8 +298,8 @@ "output_type": "stream", "text": [ "['date', 'nav']\n", - "CPU times: user 56.9 ms, sys: 3.3 ms, total: 60.2 ms\n", - "Wall time: 60.2 ms\n" + "CPU times: user 57.5 ms, sys: 3.38 ms, total: 60.8 ms\n", + "Wall time: 60.5 ms\n" ] } ], @@ -289,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "id": "b7c176d4-d89f-4bda-9d67-75463eb90468", "metadata": {}, "outputs": [ @@ -297,9 +318,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "(datetime.datetime(2022, 2, 9, 0, 0), 311.209991)\n", - "(datetime.datetime(2022, 2, 10, 0, 0), 302.380005)\n", "(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", @@ -315,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "69c57754-a6fb-4881-9359-ba17c7fb8be5", "metadata": {}, "outputs": [ @@ -323,19 +344,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.85 ms, sys: 143 µs, total: 1.99 ms\n", - "Wall time: 2 ms\n" + "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'] = 295" + "ts['2022-02-12'] = 296" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "id": "7aa02023-406e-4700-801c-c06390ddf914", "metadata": {}, "outputs": [ @@ -343,8 +364,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 3.7 ms, sys: 121 µs, total: 3.82 ms\n", - "Wall time: 3.84 ms\n" + "CPU times: user 3.61 ms, sys: 68 µs, total: 3.68 ms\n", + "Wall time: 3.7 ms\n" ] }, { @@ -355,7 +376,7 @@ " 'drawdown': -0.7456453305351521}" ] }, - "execution_count": 5, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -364,9 +385,321 @@ "%%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": 1, + "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": 2, + "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": 3, + "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": 6, + "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": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ts" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cd0eb38c", + "metadata": {}, + "outputs": [], + "source": [ + "dates = fc.create_date_series(ts.start_date, ts.end_date, 'M')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "69c48512", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Series([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": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prev_date = dates[0]\n", + "for i in dates[1:]:\n", + " cur_date = i\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "43fa2254", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Series([False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], data_type='bool')" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(ts.dates < '2017-01-31' and ts.dates > '2017-01-01')" + ] } ], "metadata": { + "interpreter": { + "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python",