From 2ef02b7be555a4ef2e7d953b135d3bd5beac3faa Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Thu, 26 Sep 2019 11:23:24 -0500 Subject: [PATCH 1/5] Dates initial commit --- Dates/.gitignore | 1 + Dates/1900s.ods | Bin 0 -> 17680 bytes Dates/Dates.ipynb | 708 +++++++++++++++++++++++++++++++++++ Dates/Exploration.ods | Bin 0 -> 14123 bytes Dates/Flashcards.ipynb | 229 +++++++++++ Dates/Flashcards_1.ipynb | 250 +++++++++++++ Dates/Personal Trainer.ipynb | 117 ++++++ 7 files changed, 1305 insertions(+) create mode 100644 Dates/.gitignore create mode 100644 Dates/1900s.ods create mode 100644 Dates/Dates.ipynb create mode 100644 Dates/Exploration.ods create mode 100644 Dates/Flashcards.ipynb create mode 100644 Dates/Flashcards_1.ipynb create mode 100644 Dates/Personal Trainer.ipynb diff --git a/Dates/.gitignore b/Dates/.gitignore new file mode 100644 index 0000000..f7fd723 --- /dev/null +++ b/Dates/.gitignore @@ -0,0 +1 @@ +*.apgk diff --git a/Dates/1900s.ods b/Dates/1900s.ods new file mode 100644 index 0000000000000000000000000000000000000000..01d0de92c0d72d4a90623d54dca4fc0a6e4cd53e GIT binary patch literal 17680 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 literal 0 HcmV?d00001 diff --git a/Dates/Dates.ipynb b/Dates/Dates.ipynb new file mode 100644 index 0000000..b4d02a1 --- /dev/null +++ b/Dates/Dates.ipynb @@ -0,0 +1,708 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "from datetime import datetime, date, timedelta\n", + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def rand_date(start=date(1400, 1, 1), end=date(2400, 1, 1)):\n", + " diff = end - start\n", + " return start + random.random() * diff" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def convert_to_vector(xdate):\n", + " yr1 = xdate.year // 1000\n", + " yr2 = (xdate.year // 100) % 10\n", + " yr3 = (xdate.year // 10) % 10\n", + " yr4 = (xdate.year) % 10\n", + " \n", + " month = xdate.month\n", + " \n", + " day1 = xdate.day // 10\n", + " day2 = xdate.day % 10\n", + " \n", + " weekday = xdate.weekday()\n", + " \n", + " to_encode = [\n", + " (yr1, 10),\n", + " (yr2, 10),\n", + " (yr3, 10),\n", + " (yr4, 10),\n", + " (month, 12),\n", + " (day1, 10),\n", + " (day2, 10)\n", + " ]\n", + " \n", + " xs = []\n", + " for val, num_vals in to_encode:\n", + " one_hot = np.zeros(num_vals)\n", + " one_hot[val-1] = 1\n", + " xs.append(one_hot)\n", + " \n", + " x = np.concatenate(xs)\n", + " \n", + " y = np.zeros(7)\n", + " y[weekday] = 1\n", + " return x, y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Encoding: One-hot, separate integers\n", + "\n", + "Training: Month, year, other years, other decades\n", + "\n", + "Raw\n", + "\n", + "Start small, build up\n", + "\n", + "One month, same month plus another, keep adding months until a year, then add new years\n", + "One month, add a month, add a year, add several month, add several years, add decades\n", + "Start without leap years, then include leap years\n", + "\n", + "Whole idea is to go simple and complex\n", + "Introduce new concepts before past concepts are solidified\n", + "Don't want to confuse things - easily possible\n", + "\n", + "Simplest would be a single month in non leap-year\n", + "When introducing leap years, do half leap years and half non-leap years\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "from keras.models import Sequential\n", + "from keras.layers import Dense\n", + "from keras.callbacks import Callback\n", + "from keras import backend as K" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "model = Sequential()\n", + "model.add(Dense(100, input_shape=(10*6 + 12,), activation='tanh'))\n", + "model.add(Dense(100, activation='tanh'))\n", + "model.add(Dense(100, activation='tanh'))\n", + "model.add(Dense(7, activation='softmax'))\n", + "\n", + "model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])\n", + "\n", + "def reset_model():\n", + " global model\n", + " session = K.get_session()\n", + " for layer in model.layers: \n", + " if hasattr(layer, 'kernel_initializer'):\n", + " layer.kernel.initializer.run(session=session)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_random(batch_size):\n", + " dates = []\n", + " xs = []\n", + " ys = []\n", + " for i in range(batch_size):\n", + " rdate = rand_date()\n", + " x, y = convert_to_vector(rdate)\n", + " dates.append(rdate)\n", + " xs.append(x)\n", + " ys.append(y)\n", + "\n", + " xs = np.array(xs)\n", + " ys = np.array(ys)\n", + " return xs, ys\n", + "\n", + "\n", + "def get_range_gen(start_date, end_date):\n", + " def generate_range(batch_size):\n", + " dates = []\n", + " xs = []\n", + " ys = []\n", + " for i in range(batch_size):\n", + " rdate = rand_date(start_date, end_date)\n", + " x, y = convert_to_vector(rdate)\n", + " dates.append(rdate)\n", + " xs.append(x)\n", + " ys.append(y)\n", + "\n", + " xs = np.array(xs)\n", + " ys = np.array(ys)\n", + " return xs, ys\n", + " return generate_range\n", + "\n", + "\n", + "def get_month_gen(year, month):\n", + " start = date(year, month, 1)\n", + " if month == 12:\n", + " end = date(year + 1, 1, 1)\n", + " else:\n", + " end = date(year, month + 1, 1)\n", + " return get_range_generator(start, end)\n", + "\n", + "\n", + "def combine_gens(generators, p=None):\n", + " if p is None:\n", + " p = [1/len(generators)] * len(generators)\n", + " \n", + " def generate(batch_size):\n", + " generator = np.random.choice(generators, p=p)\n", + " return generator(batch_size)\n", + " \n", + " return generate\n", + "\n", + "\n", + "def get_months_gen(year, months, p=None):\n", + " gens = []\n", + " for month in months:\n", + " gens.append(get_month_generator(year, month))\n", + " return combine_generators(gens, p)\n", + "\n", + "\n", + "def get_year_gen(year):\n", + " return get_range_generator(date(year, 1, 1), date(year+1, 1, 1))\n", + "\n", + "\n", + "def get_years_gen(start_year, end_year):\n", + " return get_range_generator(date(start_year, 1, 1), date(end_year + 1, 1, 1))\n", + "\n", + "\n", + "def get_years_gen_p(years, p=None):\n", + " gens = []\n", + " for year in years:\n", + " gens.append(get_year_generator(year))\n", + " return combine_generators(years, p)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from collections import deque" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def train_until_acc(model, data_gen, desired_acc, output=True, limit=1000000):\n", + " running_acc = 0\n", + " num_samples = 0\n", + " batch_size = 32\n", + " accs = deque(maxlen=10)\n", + " accs.append(desired_acc-0.01) # so we don't get the divide by zero error\n", + " \n", + " batch_num = 0\n", + " while sum(accs)/len(accs) < desired_acc:\n", + " xs, ys = data_gen(batch_size)\n", + " loss, acc = model.train_on_batch(xs, ys)\n", + " accs.append(acc)\n", + " num_samples += batch_size\n", + " batch_num += 1\n", + " if batch_num % 100 == 0:\n", + " print(\"Minibatch\", batch_num, sum(accs)/len(accs))\n", + " if num_samples > limit: # 1 mil by default\n", + " break\n", + " return num_samples\n", + "\n", + "\n", + "def run_schedule(schedule):\n", + " reset_model()\n", + " \n", + " total_samples = 0\n", + " for name, data_gen, accuracy in schedule:\n", + " num_samples = train_until_acc(model, data_gen, accuracy)\n", + " total_samples += num_samples\n", + " print('Trained {} in {} samples'.format(name, num_samples))\n", + " print('Training complete after {} samples'.format(total_samples))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.special import softmax\n", + "\n", + "def get_schedule_generator(x):\n", + " class P:\n", + " def __init__(self, x):\n", + " self.x = x\n", + " def __getitem__(self, key):\n", + " x.add_constraints()\n", + " return softmax(x[key])\n", + " \n", + " x = X(x)\n", + " p = P(x)\n", + " \n", + " schedule = [\n", + " ('Aug', get_month_generator(2019, 8), 0.99)\n", + " ]\n", + " class StagedValue:\n", + " def __init__(self, num):\n", + " self.num = num\n", + " class Stager:\n", + " def __init__(self):\n", + " self.total = 0\n", + " self.constraints = []\n", + " def __getitem__(self, key):\n", + " self.total += key\n", + " new_constraints = None # TODO Implement new constraints\n", + " self.constraints.append(new_constraints)\n", + " return StagedValue(key)\n", + " \n", + " # TODO How do I get this for multiple situations\n", + " schedule = [ # Have a schedule generator. Maybe iterate through after staging to activate\n", + " ('Aug', get_month_generator(2019, 8), 0.99),\n", + " ('Sep', get_months_generator(2019, [8, 9], p=p[2]), 0.99),\n", + " ('All', get_month_generator(2019, [8, 9]), 0.99)\n", + " ]\n", + " \n", + " # need to create function that accepts the right number of parameters and stuff\n", + " # use sparse matrix to represent constraints\n", + " class X:\n", + " def __init__(self, x):\n", + " self.x = x\n", + " self.current = 0\n", + " def __getitem__(self, key):\n", + " values = self.x[self.current: self.current+key]\n", + " self.current += key\n", + " return values\n", + " def __len__(self):\n", + " return self.current\n", + " \n", + " def get_schedule(x):\n", + " x = X(x)\n", + " processed_schedule = []\n", + " for name, func, params, probability in schedule:\n", + " # process into actual schedule\n", + " new_params = []\n", + " for param in params:\n", + " if type(param) is StagedValue:\n", + " new_params.append(x[param.num])\n", + " else:\n", + " new_params.append(param)\n", + " schedule_item = (name, func(*params), probability)\n", + " processed_schedule.append(schedule_item)\n", + " return processed_schedule\n", + " \n", + " return get_schedule, constraints, x0\n", + " \n", + " \n", + " \n", + " schedule = [ # Have a schedule generator. Maybe iterate through after staging to activate\n", + " ('Aug', get_month_generator(2019, 8), 0.99),\n", + " ('Sep', get_months_generator(2019, [8, 9], p=p[2]), x[1]),\n", + " ('Oct', get_month_generator(2019, [8, 9, 10], p=p[3]), x[1]),\n", + " ('Oct', get_month_generator(2019, [8, 9, 10]), 0.99)\n", + " ]\n", + " \n", + " schedule = [\n", + " ('2019-1', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-2', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-3', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-4', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-5', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-6', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-7', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-8', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-9', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-10', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-11', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019-12', get_months_gen(2019, range(1, 13), p=x[12]), x[1]),\n", + " ('2019', get_year_generator(2019), 0.99),\n", + "# ('2020', get_years_gen(2019, 2020), x[1]),\n", + "# ('2020s', get_years_gen(2019, 2029), x[1]),\n", + "# ('2000-2100', get_years_gen(2000, 2100), x[1]),\n", + "# ('1900-2100', get_years_gen(1900, 2100), x[1]),\n", + "# ('1-2100', get_years_gen(1, 2100), x[1]),\n", + " ]\n", + " \n", + " \n", + " return schedule, len(x)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Optimize the last two, so the new one and the most recent before that. That way, there's a lag time, but most of it is set. We can also save the progresss of the model to make the running occur faster" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'get_years_gen' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m'Jun'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mget_months_gen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2019\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m6\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0.85\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m'2019'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mget_year_generator\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2019\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0.85\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 15\u001b[1;33m \u001b[1;33m(\u001b[0m\u001b[1;34m'2020'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mget_years_gen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2019\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2020\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0.85\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 16\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m'2020s'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mget_years_gen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2019\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2029\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0.85\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m'2000-2100'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mget_years_gen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2100\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0.85\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'get_years_gen' is not defined" + ] + } + ], + "source": [ + "schedule = [\n", + " ('Jul', get_months_gen(2019, [7]), 0.99),\n", + " ('Aug', get_months_gen(2019, [8]), 0.85),\n", + " ('Sep', get_months_gen(2019, [9]), 0.85),\n", + " ('Oct', get_months_gen(2019, [10]), 0.85),\n", + " ('Nov', get_months_gen(2019, [11]), 0.85),\n", + " ('Dec', get_months_gen(2019, [12]), 0.85),\n", + " ('Jan', get_months_gen(2019, [1]), 0.85),\n", + " ('Feb', get_months_gen(2019, [2]), 0.85),\n", + " ('Mar', get_months_gen(2019, [3]), 0.85),\n", + " ('Apr', get_months_gen(2019, [4]), 0.85),\n", + " ('May', get_months_gen(2019, [5]), 0.85),\n", + " ('Jun', get_months_gen(2019, [6]), 0.85),\n", + " ('2019', get_year_generator(2019), 0.85),\n", + " ('2020', get_years_gen(2019, 2020), 0.85),\n", + " ('2020s', get_years_gen(2019, 2029), 0.85),\n", + " ('2000-2100', get_years_gen(2000, 2100), 0.85),\n", + " ('1900-2100', get_years_gen(1900, 2100), 0.85),\n", + " ('1-2100', get_years_gen(1, 2100), 0.85),\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "run_schedule(schedule)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Minibatch 100 0.5375\n", + "Trained July in 6208 samples\n", + "Trained Aug in 3072 samples\n", + "Trained Sep in 32 samples\n", + "Minibatch 100 0.571875\n", + "Trained Oct in 6016 samples\n", + "Trained Nov in 32 samples\n", + "Trained Dec in 64 samples\n", + "Trained Jan in 32 samples\n", + "Minibatch 100 0.79375\n", + "Trained Feb in 3328 samples\n", + "Trained Mar in 64 samples\n", + "Trained Apr in 32 samples\n", + "Trained May in 32 samples\n", + "Trained Jun in 1568 samples\n", + "Trained Jul-Dec in 32 samples\n", + "Trained 2019 in 3008 samples\n", + "Minibatch 100 0.75\n", + "Trained 2020 in 5312 samples\n", + "Minibatch 100 0.584375\n", + "Minibatch 200 0.778125\n", + "Minibatch 300 0.79375\n", + "Trained 2020s in 9856 samples\n", + "Minibatch 100 0.509375\n", + "Minibatch 200 0.6625\n", + "Minibatch 300 0.6875\n", + "Minibatch 400 0.75625\n", + "Minibatch 500 0.796875\n", + "Minibatch 600 0.7875\n", + "Trained 2000-2100 in 19904 samples\n", + "Trained 1900-2100 in 2944 samples\n", + "Minibatch 100 0.45625\n", + "Minibatch 200 0.5125\n", + "Minibatch 300 0.6125\n", + "Minibatch 400 0.65\n", + "Minibatch 500 0.65625\n", + "Minibatch 600 0.68125\n", + "Minibatch 700 0.696875\n", + "Minibatch 800 0.721875\n", + "Minibatch 900 0.734375\n", + "Minibatch 1000 0.746875\n", + "Minibatch 1100 0.778125\n", + "Minibatch 1200 0.80625\n", + "Minibatch 1300 0.825\n", + "Trained 1-2100 in 42400 samples\n", + "Minibatch 100 0.815625\n", + "Minibatch 200 0.85625\n", + "Minibatch 300 0.85625\n", + "Minibatch 400 0.884375\n", + "Minibatch 500 0.853125\n", + "Minibatch 600 0.85\n", + "Minibatch 700 0.890625\n", + "Minibatch 800 0.9\n", + "Minibatch 900 0.90625\n", + "Minibatch 1000 0.90625\n", + "Minibatch 1100 0.884375\n", + "Minibatch 1200 0.925\n", + "Minibatch 1300 0.940625\n", + "Minibatch 1400 0.925\n", + "Minibatch 1500 0.946875\n", + "Minibatch 1600 0.9375\n", + "Minibatch 1700 0.94375\n", + "Minibatch 1800 0.965625\n", + "Minibatch 1900 0.95\n", + "Minibatch 2000 0.953125\n", + "Minibatch 2100 0.928125\n", + "Minibatch 2200 0.940625\n", + "Minibatch 2300 0.959375\n", + "Minibatch 2400 0.9625\n", + "Minibatch 2500 0.959375\n", + "Minibatch 2600 0.96875\n", + "Minibatch 2700 0.971875\n", + "Minibatch 2800 0.96875\n", + "Minibatch 2900 0.971875\n", + "Minibatch 3000 0.971875\n", + "Minibatch 3100 0.9625\n", + "Minibatch 3200 0.984375\n", + "Minibatch 3300 0.946875\n", + "Minibatch 3400 0.95\n", + "Minibatch 3500 0.978125\n", + "Minibatch 3600 0.975\n", + "Minibatch 3700 0.98125\n", + "Minibatch 3800 0.975\n", + "Minibatch 3900 0.98125\n", + "Minibatch 4000 0.98125\n", + "Minibatch 4100 0.990625\n", + "Minibatch 4200 0.990625\n", + "Minibatch 4300 0.978125\n", + "Trained 1-2100 in 138720 samples\n", + "Training complete after 242656 samples\n" + ] + } + ], + "source": [ + "from itertools import chain\n", + "\n", + "reset_model()\n", + "\n", + "schedule = [\n", + " ('July', get_month_generator(2019, 7), 0.85),\n", + " ('Aug', get_months_gen(2019, range(7, 9)), 0.85),\n", + " ('Sep', get_months_gen(2019, range(7, 10)), 0.85),\n", + " ('Oct', get_months_gen(2019, range(7, 11)), 0.85),\n", + " ('Nov', get_months_gen(2019, range(7, 12)), 0.85),\n", + " ('Dec', get_months_gen(2019, range(7, 13)), 0.85),\n", + " ('Jan', get_months_gen(2019, chain(range(1, 2), range(7, 13))), 0.85),\n", + " ('Feb', get_months_gen(2019, chain(range(1, 3), range(7, 13))), 0.85),\n", + " ('Mar', get_months_gen(2019, chain(range(1, 4), range(7, 13))), 0.85),\n", + " ('Apr', get_months_gen(2019, chain(range(1, 5), range(7, 13))), 0.85),\n", + " ('May', get_months_gen(2019, chain(range(1, 6), range(7, 13))), 0.85),\n", + " ('Jun', get_months_gen(2019, chain(range(1, 7), range(7, 13))), 0.85),\n", + " ('Jul-Dec', get_months_gen(2019, chain(range(1, 8), range(7, 13))), 0.85),\n", + " ('2019', get_year_generator(2019), 0.85),\n", + " ('2020', get_years_gen(2019, 2020), 0.85),\n", + " ('2020s', get_years_gen(2019, 2029), 0.85),\n", + " ('2000-2100', get_years_gen(2000, 2100), 0.85),\n", + " ('1900-2100', get_years_gen(1900, 2100), 0.85),\n", + " ('1-2100', get_years_gen(1, 2100), 0.85),\n", + " ('1-2100', get_years_gen(1, 2100), 0.999),\n", + "]\n", + "\n", + "bad_schedule = [\n", + " ('1-2100', get_years_gen(1, 2100), 0.85)\n", + "]\n", + "\n", + "schedule_2 = list(map(lambda item: (item[0], item[1], 0.5), schedule))\n", + "schedule_2[-1] = schedule[-1]\n", + "\n", + "schedule_3 = list(map(lambda item: (item[0], item[1], 0.2), schedule))\n", + "schedule_3[-1] = schedule[-1]\n", + "\n", + "run_schedule(schedule)\n", + "\n", + "# print('\\n\\n\\n')\n", + "# reset_model()\n", + "# run_schedule(model, schedule_2)\n", + "# print('\\n\\n\\n')\n", + "# reset_model()\n", + "# run_schedule(model, schedule_3)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0., 0., 0., 0., 0., 0., 1.])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "convert_to_vector(date(2019,7,28))[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[3.21856205e-04, 4.16064868e-04, 3.76252714e-03, 1.97594166e-02,\n", + " 8.88420641e-01, 7.28261918e-02, 1.44934375e-02]], dtype=float32)" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.predict(convert_to_vector(date(2035,5,18))[0].reshape((1, -1)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far, it seems that a model with 0.85 threshold trains with 160k samples and a model with 0.5 threshold trains with 120k samples.\n", + "\n", + "I tested a model with no grading. It got 100k batches (3,200k samples) without having improved its' accuracy at all." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Can we train some type of model that takes in training histories and outputs the ideal training history?" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/1\n", + "100000/100000 [==============================] - 19s 190us/step - loss: 0.4153 - acc: 0.8324\n" + ] + } + ], + "source": [ + "stuff = model.fit(xs, ys)\n", + "\n", + "stuff\n", + "print(stuff.history['acc'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next steps:\n", + "\n", + "- Overfit on a single sample of say 1000, then as soon as its' prediction is better than chance, move along to another set. \n", + " - Compare to pure random\n", + "- Overfit on a sample of just a few, and then start throwing in new ones? - This was the whole strategy from before\n", + " - This would work, but we want our sample to be better than just chance, how do we determine the sample?\n", + "\n", + "1. Just do in order with random distributions up until a certain threshold\n", + " - Test different thresholds for progression, 50% accuracy, 90%, etc\n", + "2. Change distribution to reflect the learning that needs to happen\n", + " - If you get a certain month right 90% of the time, only show it 10% of the time or something like that - determine this distrubtion\n", + "3. Learn the distribution using some kind of statistics or model\n", + "4. Create an ml model that perfects this situation\n", + "\n", + "Also, should be considering taking a month where we know the date and asking for another date. So if we know that today is the 18th and a Thursday, we can infer that tomorrow is the 19th and a Friday." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Dates/Exploration.ods b/Dates/Exploration.ods new file mode 100644 index 0000000000000000000000000000000000000000..577c0724bf86ff3d3d8c444fd2cedd058439c7f7 GIT binary patch literal 14123 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 Date: Thu, 26 Sep 2019 14:37:49 -0500 Subject: [PATCH 2/5] Added double days --- Dates/Double Day Flashcards.ipynb | 237 ++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 Dates/Double Day Flashcards.ipynb diff --git a/Dates/Double Day Flashcards.ipynb b/Dates/Double Day Flashcards.ipynb new file mode 100644 index 0000000..9fb8a46 --- /dev/null +++ b/Dates/Double Day Flashcards.ipynb @@ -0,0 +1,237 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate date flashcards for Anki\n", + "https://github.com/kerrickstaley/genanki" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from datetime import date" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1237276931" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import random\n", + "\n", + "def get_id():\n", + " return random.randrange(1<<32)\n", + "get_id()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import genanki\n", + "\n", + "# Show any date from month with day\n", + "# Show other date from month with blank day\n", + "\n", + "dday = genanki.Model(\n", + " get_id(),\n", + " 'Double Day',\n", + " fields=[\n", + " {'name': 'Date1'},\n", + " {'name': 'Day1'},\n", + " {'name': 'Date2'},\n", + " {'name': 'Day2'},\n", + " ],\n", + " templates=[\n", + " {\n", + " 'name': 'Double Day Card',\n", + " 'qfmt': '{{Date1}} - {{Day1}}\\n\\n{{Date2}}',\n", + " 'afmt': '{{Date1}} - {{Day1}}\\n\\n{{Date2}} - {{Day2}}',\n", + " },\n", + " ]\n", + ")\n", + "\n", + "def make_deck(cards, name):\n", + " # Cards is a list of fields\n", + " deck = genanki.Deck(get_id(), name)\n", + " \n", + " for card in cards:\n", + " note = genanki.Note(\n", + " model=dday,\n", + " fields=card\n", + " )\n", + " deck.add_note(note)\n", + " \n", + " return deck\n", + "\n", + "def write_decks(decks, name='dates'):\n", + " genanki.Package(decks).write_to_file(f'{name}.apkg')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "date(2019, 8, 28).weekday()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import random\n", + "from datetime import datetime, timedelta\n", + "from calendar import monthrange\n", + "\n", + "def make_double_deck(n=11000):\n", + " year = 2019\n", + " month = random.choice(range(12)) + 1\n", + " max_day = monthrange(year, month)[1]\n", + " \n", + " for i in range(n):\n", + " day = random.choice(range(max_day)) + 1\n", + " reference_day = day\n", + " while day == reference_day:\n", + " reference_day = random.choice(range(max_day)) + 1\n", + " \n", + "\n", + "def make_double_deck(months, year=2019):\n", + " \n", + " name = ', '.join([date(year, month, 1).strftime('%B') for month in months]) + date(year, 1, 1).strftime(' - %Y')\n", + " \n", + " cards = []\n", + " for month in months:\n", + " for i in range(monthrange(2019, month)[1]):\n", + " day = date(2019, month, i+1)\n", + " date_string = day.strftime('%B %d, %Y')\n", + " day_string = day.strftime('%A')\n", + " cards.append([date_string, day_string])\n", + " \n", + " return make_deck(cards, name)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "write_decks([make_month_deck(9)], 'September')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "write_decks([make_double_deck([i + 1 for i in range (12)])])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "4\n", + "4\n", + "0\n", + "2\n", + "5\n", + "0\n", + "3\n", + "6\n", + "1\n", + "4\n", + "6\n" + ] + } + ], + "source": [ + "from datetime import date\n", + "for i in range(12):\n", + " a = date(2019, i + 1, 1)\n", + " print(a.weekday())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 099e3256f2317fe5521372f6a4c9bfefa3024d60 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Thu, 26 Sep 2019 20:33:50 -0500 Subject: [PATCH 3/5] Renamed files --- Dates/{Flashcards_1.ipynb => Date Flashcards.ipynb} | 0 Dates/{Dates.ipynb => Machine Learning.ipynb} | 0 Dates/{Flashcards.ipynb => Presidents.ipynb} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Dates/{Flashcards_1.ipynb => Date Flashcards.ipynb} (100%) rename Dates/{Dates.ipynb => Machine Learning.ipynb} (100%) rename Dates/{Flashcards.ipynb => Presidents.ipynb} (100%) diff --git a/Dates/Flashcards_1.ipynb b/Dates/Date Flashcards.ipynb similarity index 100% rename from Dates/Flashcards_1.ipynb rename to Dates/Date Flashcards.ipynb diff --git a/Dates/Dates.ipynb b/Dates/Machine Learning.ipynb similarity index 100% rename from Dates/Dates.ipynb rename to Dates/Machine Learning.ipynb diff --git a/Dates/Flashcards.ipynb b/Dates/Presidents.ipynb similarity index 100% rename from Dates/Flashcards.ipynb rename to Dates/Presidents.ipynb From 86934d811c50553990341dd2202fc42aaf79e765 Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Fri, 27 Sep 2019 01:04:20 -0500 Subject: [PATCH 4/5] Finished adding double day flashcards --- Dates/.gitignore | 2 +- Dates/Double Day Flashcards.ipynb | 125 +++++++++++++++++++++++------- 2 files changed, 97 insertions(+), 30 deletions(-) diff --git a/Dates/.gitignore b/Dates/.gitignore index f7fd723..b184dd6 100644 --- a/Dates/.gitignore +++ b/Dates/.gitignore @@ -1 +1 @@ -*.apgk +*.apkg diff --git a/Dates/Double Day Flashcards.ipynb b/Dates/Double Day Flashcards.ipynb index 9fb8a46..ed7cfe0 100644 --- a/Dates/Double Day Flashcards.ipynb +++ b/Dates/Double Day Flashcards.ipynb @@ -21,16 +21,16 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1237276931" + "2263097491" ] }, - "execution_count": 4, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -45,10 +45,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true - }, + "execution_count": 35, + "metadata": {}, "outputs": [], "source": [ "import genanki\n", @@ -68,8 +66,42 @@ " templates=[\n", " {\n", " 'name': 'Double Day Card',\n", - " 'qfmt': '{{Date1}} - {{Day1}}\\n\\n{{Date2}}',\n", - " 'afmt': '{{Date1}} - {{Day1}}\\n\\n{{Date2}} - {{Day2}}',\n", + " 'qfmt': \"\"\"\n", + "
\n", + "
\n", + "\n", + "
\n", + "
{{Date1}}
\n", + "
{{Day1}}
\n", + " \n", + "
\n", + "
\n", + "\n", + "
\n", + "
{{Date2}}
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\"\"\",\n", + " 'afmt': \"\"\"\n", + "
\n", + "
\n", + "\n", + "
\n", + "
{{Date1}}
\n", + "
{{Day1}}
\n", + " \n", + "
\n", + "
\n", + "\n", + "
\n", + "
{{Date2}}
\n", + "
{{Day2}}
\n", + "
\n", + "\n", + "
\n", + "
\"\"\"\n", " },\n", " ]\n", ")\n", @@ -93,7 +125,21 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def write_deck(deck):\n", + " genanki.Package([deck]).write_to_file(f'doubledates.apkg')\n", + "\n", + "write_deck(make_double_deck())" + ] + }, + { + "cell_type": "code", + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -102,7 +148,7 @@ "2" ] }, - "execution_count": 5, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -113,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "metadata": { "collapsed": true }, @@ -121,33 +167,54 @@ "source": [ "import random\n", "from datetime import datetime, timedelta\n", - "from calendar import monthrange\n", + "from calendar import monthrange, month_name\n", "\n", "def make_double_deck(n=11000):\n", " year = 2019\n", - " month = random.choice(range(12)) + 1\n", - " max_day = monthrange(year, month)[1]\n", + " \n", + " cards = []\n", " \n", " for i in range(n):\n", + " month = random.choice(range(12)) + 1\n", + " max_day = monthrange(year, month)[1]\n", " day = random.choice(range(max_day)) + 1\n", + " \n", " reference_day = day\n", " while day == reference_day:\n", " reference_day = random.choice(range(max_day)) + 1\n", - " \n", - "\n", - "def make_double_deck(months, year=2019):\n", - " \n", - " name = ', '.join([date(year, month, 1).strftime('%B') for month in months]) + date(year, 1, 1).strftime(' - %Y')\n", - " \n", - " cards = []\n", - " for month in months:\n", - " for i in range(monthrange(2019, month)[1]):\n", - " day = date(2019, month, i+1)\n", - " date_string = day.strftime('%B %d, %Y')\n", - " day_string = day.strftime('%A')\n", - " cards.append([date_string, day_string])\n", " \n", - " return make_deck(cards, name)" + " month_str = month_name[month]\n", + " reference_day_str = date(year, month, reference_day).strftime('%A')\n", + " day_str = date(year, month, day).strftime('%A')\n", + " cards.append((\n", + " f\"{month_str} {reference_day}, {year}\",\n", + " f\"{reference_day_str}\",\n", + " f\"{month_str} {day}, {year}\",\n", + " f\"{day_str}\",\n", + " \n", + " ))\n", + " \n", + " return make_deck(cards, \"Doubles\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Thursday'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "date(2019, 9, 26).strftime(\"%A\")" ] }, { From 29477030f6a93e87540be506fae157d2a0016d3a Mon Sep 17 00:00:00 2001 From: Ben Thayer Date: Fri, 25 Oct 2019 16:23:53 -0500 Subject: [PATCH 5/5] Start date exploration --- Dates/Date Flashcards.ipynb | 4 +- Dates/Exploration.ipynb | 334 ++++++++++++++++++++++++++++++++++++ 2 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 Dates/Exploration.ipynb diff --git a/Dates/Date Flashcards.ipynb b/Dates/Date Flashcards.ipynb index 185f2ec..6ab87c9 100644 --- a/Dates/Date Flashcards.ipynb +++ b/Dates/Date Flashcards.ipynb @@ -242,9 +242,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.6.2" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/Dates/Exploration.ipynb b/Dates/Exploration.ipynb new file mode 100644 index 0000000..24084a8 --- /dev/null +++ b/Dates/Exploration.ipynb @@ -0,0 +1,334 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime\n", + "from calendar import day_abbr" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "datetime(2099, 1, 4).weekday()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 28, 56, 84]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[i * 28 for i in range(4)]" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "73\n", + "15\n", + "76\n", + "71\n", + "26\n", + "5\n", + "41\n", + "17\n", + "13\n", + "75\n", + "92\n", + "91\n", + "9\n", + "52\n", + "57\n", + "67\n", + "32\n", + "47\n", + "82\n", + "89\n" + ] + } + ], + "source": [ + "import random\n", + "for i in range(20):\n", + " print(random.randint(0, 99))" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "5\n", + "5\n", + "5\n", + "5\n", + "0\n", + "3\n", + "1\n", + "3\n", + "3\n", + "4\n", + "2\n", + "5\n", + "3\n", + "2\n", + "0\n", + "6\n", + "3\n", + "5\n", + "0\n" + ] + } + ], + "source": [ + "x = [\n", + " 73,\n", + " 15,\n", + " 76,\n", + " 71,\n", + " 26,\n", + " 5,\n", + " 41,\n", + " 17,\n", + " 13,\n", + " 75,\n", + " 92,\n", + " 91,\n", + " 9,\n", + " 52,\n", + " 57,\n", + " 67,\n", + " 32,\n", + " 47,\n", + " 82,\n", + " 89\n", + "]\n", + "for y in x:\n", + " print(datetime(2000 + y, 7, 11).weekday())" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2000: Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2001: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2002: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2003: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2004: Thu Sun Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2005: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2006: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2007: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2008: Tue Fri Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2009: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2010: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2011: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2012: Sun Wed Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2013: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2014: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2015: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2016: Fri Mon Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2017: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2018: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2019: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2020: Wed Sat Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2021: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2022: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2023: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2024: Mon Thu Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2025: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2026: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2027: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2028: Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2029: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2030: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2031: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2032: Thu Sun Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2033: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2034: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2035: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2036: Tue Fri Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2037: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2038: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2039: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2040: Sun Wed Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2041: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2042: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2043: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2044: Fri Mon Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2045: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2046: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2047: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2048: Wed Sat Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2049: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2050: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2051: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2052: Mon Thu Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2053: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2054: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2055: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2056: Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2057: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2058: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2059: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2060: Thu Sun Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2061: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2062: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2063: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2064: Tue Fri Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2065: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2066: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2067: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2068: Sun Wed Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2069: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2070: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2071: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2072: Fri Mon Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2073: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2074: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2075: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2076: Wed Sat Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2077: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2078: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2079: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2080: Mon Thu Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2081: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2082: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2083: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2084: Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2085: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2086: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2087: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2088: Thu Sun Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2089: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2090: Sun Wed Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "2091: Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2092: Tue Fri Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2093: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n", + "2094: Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "2095: Sat Tue Tue Fri Sun Wed Fri Mon Thu Sat Tue Thu \n", + "2096: Sun Wed Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "2097: Tue Fri Fri Mon Wed Sat Mon Thu Sun Tue Fri Sun \n", + "2098: Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "2099: Thu Sun Sun Wed Fri Mon Wed Sat Tue Thu Sun Tue \n" + ] + } + ], + "source": [ + "for year in range(2000, 2100):\n", + " line = f\"{year}: \"\n", + " for month in range(1, 13):\n", + " line += day_abbr[datetime(year, month, 1).weekday()] + ' '\n", + " print(line)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n", + "Fri Mon Mon Thu Sat Tue Thu Sun Wed Fri Mon Wed \n", + "Wed Sat Sat Tue Thu Sun Tue Fri Mon Wed Sat Mon \n", + "Mon Thu Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat \n", + "Sat Tue Wed Sat Mon Thu Sat Tue Fri Sun Wed Fri \n" + ] + } + ], + "source": [ + "for year in range(1000, 2401, 100):\n", + " line = \"\"\n", + " for month in range(1, 13):\n", + " line += day_abbr[datetime(year, month, 1).weekday()] + ' '\n", + " print(line)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}