Skip to content

Instantly share code, notes, and snippets.

@Noleli
Created December 9, 2018 17:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Noleli/c13f277506b3e1278e4bc541412b3d2b to your computer and use it in GitHub Desktop.
Save Noleli/c13f277506b3e1278e4bc541412b3d2b to your computer and use it in GitHub Desktop.
How often is Shabbos Khanuka Rosh Khodesh?
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import subprocess\n",
"import re\n",
"import datetime\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To run this you need [Hebcal](https://www.hebcal.com/) installed. I didn’t bother putting it on my `$PATH`, so need to specify the path to it."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"hebcal_path = '../hebcal-master/'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define a couple convenience methods"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def to_date(s):\n",
" return datetime.datetime.strptime(s, '%m/%d/%Y').date()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def to_day_of_khanuka(d, hebcal_str):\n",
" day_groups = re.search(d + r' Chanukah: ([0-9])(th)? (.*)', hebcal_str)\n",
" if day_groups == None: return None\n",
" day_groups = day_groups.group(1, 3)\n",
" if day_groups[1] == 'Day': return int(day_groups[0])\n",
" else: return int(day_groups[0]) - 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## This method actually runs Hebcal and pulls out the relevant data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using the `-H` flag and Hebrew years in case any R”Kh Tevets happen in January. Turns out they occasionally do, especially in the future thanks to the long-term forward drift."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def get_data(y):\n",
" hebcal_str = subprocess.run(hebcal_path + './hebcal -H ' + str(y + 3760), shell=True, stdout=subprocess.PIPE, encoding='utf8').stdout\n",
" \n",
" looking_for = 'Rosh Chodesh Tevet'\n",
" rosh_khodesh_dates = re.findall(r'([0-9]{1,2}/[0-9]{1,2}/[0-9]{4}) ' + looking_for, hebcal_str)\n",
" rosh_khodesh_dates = [\n",
" {\n",
" 'date': to_date(d),\n",
" 'day_of_rosh_khodesh': i + 1,\n",
" 'day_of_khanuka': to_day_of_khanuka(d, hebcal_str)\n",
" }\n",
" for i, d in enumerate(rosh_khodesh_dates)]\n",
" return rosh_khodesh_dates"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get data from a lot of years"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`range()` is exclusive of the last year, so the number of years is, in fact, equal to `end_year - start_year`. `end_year` just isn’t in the data."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"start_year = 1584\n",
"end_year = 2400\n",
"num_years = end_year - start_year"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"data = []\n",
"for y in range(start_year, end_year):\n",
" data.extend(get_data(y))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Make a dataframe and get the days of the week."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"df = pd.DataFrame(data)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"df['weekday'] = df['date'].apply(lambda d: d.strftime('%A'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The data looks like this:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>day_of_khanuka</th>\n",
" <th>day_of_rosh_khodesh</th>\n",
" <th>weekday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1583-12-15</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>Thursday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1583-12-16</td>\n",
" <td>7</td>\n",
" <td>2</td>\n",
" <td>Friday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1584-12-03</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>Monday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1585-12-21</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>Saturday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1585-12-22</td>\n",
" <td>7</td>\n",
" <td>2</td>\n",
" <td>Sunday</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date day_of_khanuka day_of_rosh_khodesh weekday\n",
"0 1583-12-15 6 1 Thursday\n",
"1 1583-12-16 7 2 Friday\n",
"2 1584-12-03 6 1 Monday\n",
"3 1585-12-21 6 1 Saturday\n",
"4 1585-12-22 7 2 Sunday"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I wouldn’t expect otherwise, but just in case, make sure that Rosh Khodesh Tevet is always actually *during* Khanuka."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>day_of_khanuka</th>\n",
" <th>day_of_rosh_khodesh</th>\n",
" <th>weekday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [date, day_of_khanuka, day_of_rosh_khodesh, weekday]\n",
"Index: []"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[df['day_of_khanuka'].isna()]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Aggregate by weekday\n",
"And reindex so they’re in human order."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"by_weekday = df.groupby(['weekday']).size()\n",
"by_weekday = by_weekday.reindex(['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here’s the number of times Rosh Khodesh Tevet happens on each of the days of the week.\n",
"\n",
"Because it’s usually a 2-day Rosh Khodesh, it’s more than the number of years."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"weekday\n",
"Sunday 229\n",
"Monday 180\n",
"Tuesday 227\n",
"Wednesday 161\n",
"Thursday 152\n",
"Friday 246\n",
"Saturday 229\n",
"dtype: int64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"by_weekday"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x10ef97fd0>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10ef97940>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"by_weekday.plot.bar()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It’s clearly not uniformly distributed, but when you divide the number of times it’s on Saturday by the number of years…"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.28063725490196079"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"by_weekday['Saturday']/num_years"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 28.1%"
]
}
],
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment