Skip to content

Instantly share code, notes, and snippets.

@shibanovp
Last active May 19, 2023 14:44
Show Gist options
  • Save shibanovp/1b347933d07cf1fa6b04e9f263aa36f1 to your computer and use it in GitHub Desktop.
Save shibanovp/1b347933d07cf1fa6b04e9f263aa36f1 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"MIT License\n",
"\n",
"Copyright (c) 2023 Pavel Shibanov https://blog.experienced.dev/how-to-calculate-basic-eps-earnings-per-share-from-edgar-api-with-pandas/\n",
"\n",
"Permission is hereby granted, free of charge, to any person obtaining a copy\n",
"of this software and associated documentation files (the \"Software\"), to deal\n",
"in the Software without restriction, including without limitation the rights\n",
"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n",
"copies of the Software, and to permit persons to whom the Software is\n",
"furnished to do so, subject to the following conditions:\n",
"\n",
"The above copyright notice and this permission notice shall be included in all\n",
"copies or substantial portions of the Software.\n",
"\n",
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n",
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n",
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n",
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n",
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n",
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n",
"SOFTWARE."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Calculate EPS (Earnings Per Share)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"$EPS = \\frac{Net Income - Preferred Dividends}{Average Common Shares Outstanding}$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%pip install httpx pandas matplotlib python-dotenv"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from dotenv import load_dotenv, find_dotenv\n",
"\n",
"_ = load_dotenv(find_dotenv())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import httpx\n",
"import os\n",
"import numpy as np\n",
"import pandas as pd\n",
"import json\n",
"from datetime import date"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_company_facts(email, cik):\n",
" facts = httpx.get(\n",
" f\"https://data.sec.gov/api/xbrl/companyfacts/CIK{str(cik).zfill(10)}.json\",\n",
" headers={\"User-Agent\": f\"{email}\"},\n",
" )\n",
" return facts.json()\n",
"\n",
"\n",
"email = os.getenv(\"EMAIL\", \"your email\")\n",
"facts = get_company_facts(email, \"1652044\")\n",
"facts.keys()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"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>start</th>\n",
" <th>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" <td>16002000000</td>\n",
" <td>0001652044-22-000071</td>\n",
" <td>2022</td>\n",
" <td>Q2</td>\n",
" <td>10-Q</td>\n",
" <td>2022-07-27</td>\n",
" <td>CY2022Q2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>46348000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>101</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>13910000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>CY2022Q3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>102</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" <td>59972000000</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>CY2022</td>\n",
" </tr>\n",
" <tr>\n",
" <th>103</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end val accn fy fp form \\\n",
"99 2022-04-01 2022-06-30 16002000000 0001652044-22-000071 2022 Q2 10-Q \n",
"100 2022-01-01 2022-09-30 46348000000 0001652044-22-000090 2022 Q3 10-Q \n",
"101 2022-07-01 2022-09-30 13910000000 0001652044-22-000090 2022 Q3 10-Q \n",
"102 2022-01-01 2022-12-31 59972000000 0001652044-23-000016 2022 FY 10-K \n",
"103 2023-01-01 2023-03-31 15051000000 0001652044-23-000045 2023 Q1 10-Q \n",
"\n",
" filed frame \n",
"99 2022-07-27 CY2022Q2 \n",
"100 2022-10-26 NaN \n",
"101 2022-10-26 CY2022Q3 \n",
"102 2023-02-03 CY2022 \n",
"103 2023-04-26 CY2023Q1 "
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def get_fact(facts, field, unit=\"USD\"):\n",
" fact = facts[\"facts\"][\"us-gaap\"][field]\n",
" label = fact[\"label\"]\n",
" description = fact[\"description\"]\n",
" fact_history = pd.DataFrame.from_dict(fact[\"units\"][unit])\n",
" fact_history[\"end\"] = pd.to_datetime(fact_history[\"end\"])\n",
" return fact_history, label, description\n",
"\n",
"\n",
"net_income_loss, *_ = get_fact(facts, \"NetIncomeLoss\")\n",
"shares_outstanding, *_ = get_fact(facts, \"CommonStockSharesOutstanding\", \"shares\")\n",
"net_income_loss.tail()"
]
},
{
"cell_type": "code",
"execution_count": 49,
"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>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>2022-06-30</td>\n",
" <td>13078000000</td>\n",
" <td>0001652044-22-000071</td>\n",
" <td>2022</td>\n",
" <td>Q2</td>\n",
" <td>10-Q</td>\n",
" <td>2022-07-27</td>\n",
" <td>CY2022Q2I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>2022-09-30</td>\n",
" <td>12971000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>CY2022Q3I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59</th>\n",
" <td>2022-12-31</td>\n",
" <td>12849000000</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>60</th>\n",
" <td>2022-12-31</td>\n",
" <td>12849000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2022Q4I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>61</th>\n",
" <td>2023-03-31</td>\n",
" <td>12722000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1I</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" end val accn fy fp form filed \\\n",
"57 2022-06-30 13078000000 0001652044-22-000071 2022 Q2 10-Q 2022-07-27 \n",
"58 2022-09-30 12971000000 0001652044-22-000090 2022 Q3 10-Q 2022-10-26 \n",
"59 2022-12-31 12849000000 0001652044-23-000016 2022 FY 10-K 2023-02-03 \n",
"60 2022-12-31 12849000000 0001652044-23-000045 2023 Q1 10-Q 2023-04-26 \n",
"61 2023-03-31 12722000000 0001652044-23-000045 2023 Q1 10-Q 2023-04-26 \n",
"\n",
" frame \n",
"57 CY2022Q2I \n",
"58 CY2022Q3I \n",
"59 NaN \n",
"60 CY2022Q4I \n",
"61 CY2023Q1I "
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shares_outstanding.tail()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(62, 104)"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(shares_outstanding), len(net_income_loss)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array(['10-K', '8-K', '10-Q'], dtype=object),\n",
" array(['10-K', '8-K', '10-Q'], dtype=object))"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"net_income_loss[\"form\"].unique(), shares_outstanding[\"form\"].unique()"
]
},
{
"cell_type": "code",
"execution_count": 54,
"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>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>56</th>\n",
" <td>2022-03-31</td>\n",
" <td>658763000</td>\n",
" <td>0001652044-22-000029</td>\n",
" <td>2022</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2022-04-27</td>\n",
" <td>CY2022Q1I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>2022-06-30</td>\n",
" <td>13078000000</td>\n",
" <td>0001652044-22-000071</td>\n",
" <td>2022</td>\n",
" <td>Q2</td>\n",
" <td>10-Q</td>\n",
" <td>2022-07-27</td>\n",
" <td>CY2022Q2I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>2022-09-30</td>\n",
" <td>12971000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>CY2022Q3I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59</th>\n",
" <td>2022-12-31</td>\n",
" <td>12849000000</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>61</th>\n",
" <td>2023-03-31</td>\n",
" <td>12722000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1I</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" end val accn fy fp form filed \\\n",
"56 2022-03-31 658763000 0001652044-22-000029 2022 Q1 10-Q 2022-04-27 \n",
"57 2022-06-30 13078000000 0001652044-22-000071 2022 Q2 10-Q 2022-07-27 \n",
"58 2022-09-30 12971000000 0001652044-22-000090 2022 Q3 10-Q 2022-10-26 \n",
"59 2022-12-31 12849000000 0001652044-23-000016 2022 FY 10-K 2023-02-03 \n",
"61 2023-03-31 12722000000 0001652044-23-000045 2023 Q1 10-Q 2023-04-26 \n",
"\n",
" frame \n",
"56 CY2022Q1I \n",
"57 CY2022Q2I \n",
"58 CY2022Q3I \n",
"59 NaN \n",
"61 CY2023Q1I "
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def filter_facts(df, start_period=None, accn=None):\n",
" df = df.copy()\n",
" if not start_period:\n",
" start_period = df[\"end\"].min()\n",
" df = df[df[\"end\"].dt.year == df[\"fy\"]]\n",
" expr = \"form in ('10-K', '10-Q') and end >= @start_period\"\n",
" if accn:\n",
" expr += \" and accn == @accn\"\n",
" return df.query(expr)\n",
"\n",
"\n",
"start_period = date(2016, 1, 1)\n",
"shares = filter_facts(shares_outstanding, start_period)\n",
"shares.tail()"
]
},
{
"cell_type": "code",
"execution_count": 59,
"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>start</th>\n",
" <th>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>103</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end val accn fy fp form \\\n",
"103 2023-01-01 2023-03-31 15051000000 0001652044-23-000045 2023 Q1 10-Q \n",
"\n",
" filed frame \n",
"103 2023-04-26 CY2023Q1 "
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# How to filter by accession number\n",
"accn = \"0001652044-23-000045\"\n",
"filter_facts(net_income_loss, accn=accn)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"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>start</th>\n",
" <th>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" <td>16002000000</td>\n",
" <td>0001652044-22-000071</td>\n",
" <td>2022</td>\n",
" <td>Q2</td>\n",
" <td>10-Q</td>\n",
" <td>2022-07-27</td>\n",
" <td>CY2022Q2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>46348000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>101</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>13910000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>CY2022Q3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>102</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" <td>59972000000</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>CY2022</td>\n",
" </tr>\n",
" <tr>\n",
" <th>103</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end val accn fy fp form \\\n",
"99 2022-04-01 2022-06-30 16002000000 0001652044-22-000071 2022 Q2 10-Q \n",
"100 2022-01-01 2022-09-30 46348000000 0001652044-22-000090 2022 Q3 10-Q \n",
"101 2022-07-01 2022-09-30 13910000000 0001652044-22-000090 2022 Q3 10-Q \n",
"102 2022-01-01 2022-12-31 59972000000 0001652044-23-000016 2022 FY 10-K \n",
"103 2023-01-01 2023-03-31 15051000000 0001652044-23-000045 2023 Q1 10-Q \n",
"\n",
" filed frame \n",
"99 2022-07-27 CY2022Q2 \n",
"100 2022-10-26 NaN \n",
"101 2022-10-26 CY2022Q3 \n",
"102 2023-02-03 CY2022 \n",
"103 2023-04-26 CY2023Q1 "
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"income = filter_facts(net_income_loss)\n",
"income.tail()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"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>start</th>\n",
" <th>end</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-03-31</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end\n",
"24 2022-01-01 2022-03-31\n",
"25 2022-04-01 2022-06-30\n",
"26 2022-07-01 2022-09-30\n",
"27 2022-01-01 2022-12-31\n",
"28 2023-01-01 2023-03-31"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def get_periods(start_period, end_period=None):\n",
" if not end_period:\n",
" end_period = date.today()\n",
" periods = pd.DataFrame({\"end\": pd.date_range(start_period, end_period, freq=\"Q\")})\n",
" periods[\"start\"] = periods[\"end\"].dt.to_period(\"Q\").dt.start_time\n",
" # adjust 10-K start period\n",
" periods.loc[periods[\"end\"].dt.month == 12, \"start\"] = (\n",
" periods[\"end\"].dt.to_period(\"Y\").dt.start_time\n",
" )\n",
" return periods[[\"start\", \"end\"]]\n",
"\n",
"\n",
"get_periods(start_period).tail()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"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>start</th>\n",
" <th>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" <th>prev_3_val_sum</th>\n",
" <th>net_income_loss</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-03-31</td>\n",
" <td>16436000000</td>\n",
" <td>0001652044-22-000029</td>\n",
" <td>2022</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2022-04-27</td>\n",
" <td>NaN</td>\n",
" <td>1.134940e+11</td>\n",
" <td>16436000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" <td>16002000000</td>\n",
" <td>0001652044-22-000071</td>\n",
" <td>2022</td>\n",
" <td>Q2</td>\n",
" <td>10-Q</td>\n",
" <td>2022-07-27</td>\n",
" <td>CY2022Q2</td>\n",
" <td>1.114050e+11</td>\n",
" <td>16002000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>13910000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>CY2022Q3</td>\n",
" <td>1.084710e+11</td>\n",
" <td>13910000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" <td>59972000000</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>CY2022</td>\n",
" <td>4.634800e+10</td>\n",
" <td>13624000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1</td>\n",
" <td>8.988400e+10</td>\n",
" <td>15051000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end val accn fy fp form \\\n",
"24 2022-01-01 2022-03-31 16436000000 0001652044-22-000029 2022 Q1 10-Q \n",
"25 2022-04-01 2022-06-30 16002000000 0001652044-22-000071 2022 Q2 10-Q \n",
"26 2022-07-01 2022-09-30 13910000000 0001652044-22-000090 2022 Q3 10-Q \n",
"27 2022-01-01 2022-12-31 59972000000 0001652044-23-000016 2022 FY 10-K \n",
"28 2023-01-01 2023-03-31 15051000000 0001652044-23-000045 2023 Q1 10-Q \n",
"\n",
" filed frame prev_3_val_sum net_income_loss \n",
"24 2022-04-27 NaN 1.134940e+11 16436000000 \n",
"25 2022-07-27 CY2022Q2 1.114050e+11 16002000000 \n",
"26 2022-10-26 CY2022Q3 1.084710e+11 13910000000 \n",
"27 2023-02-03 CY2022 4.634800e+10 13624000000 \n",
"28 2023-04-26 CY2023Q1 8.988400e+10 15051000000 "
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def get_quarterly_net_income_loss(income, start_period):\n",
" income[\"start\"] = pd.to_datetime(income[\"start\"])\n",
" periods = get_periods(start_period)\n",
" # merge on end and start period to get only one value\n",
" income = pd.merge(periods, income, on=[\"end\", \"start\"], how=\"left\")\n",
" # sum of previous 3 quarters to compute Q4\n",
" income[\"prev_3_val_sum\"] = income[\"val\"].rolling(3).sum().shift(1)\n",
" income[\"net_income_loss\"] = income[\"val\"]\n",
" # if full year subtract 3 quarters sum to get Q4\n",
" income.loc[income[\"fp\"] == \"FY\", \"net_income_loss\"] -= income[\"prev_3_val_sum\"]\n",
" return income\n",
"\n",
"\n",
"income = get_quarterly_net_income_loss(income, start_period)\n",
"income.tail()"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(29, 29)"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(shares), len(income)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"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>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>56</th>\n",
" <td>2022-03-31</td>\n",
" <td>658763000</td>\n",
" <td>0001652044-22-000029</td>\n",
" <td>2022</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2022-04-27</td>\n",
" <td>CY2022Q1I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>2022-06-30</td>\n",
" <td>13078000000</td>\n",
" <td>0001652044-22-000071</td>\n",
" <td>2022</td>\n",
" <td>Q2</td>\n",
" <td>10-Q</td>\n",
" <td>2022-07-27</td>\n",
" <td>CY2022Q2I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>58</th>\n",
" <td>2022-09-30</td>\n",
" <td>12971000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>CY2022Q3I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59</th>\n",
" <td>2022-12-31</td>\n",
" <td>12849000000</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>61</th>\n",
" <td>2023-03-31</td>\n",
" <td>12722000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1I</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" end val accn fy fp form filed \\\n",
"56 2022-03-31 658763000 0001652044-22-000029 2022 Q1 10-Q 2022-04-27 \n",
"57 2022-06-30 13078000000 0001652044-22-000071 2022 Q2 10-Q 2022-07-27 \n",
"58 2022-09-30 12971000000 0001652044-22-000090 2022 Q3 10-Q 2022-10-26 \n",
"59 2022-12-31 12849000000 0001652044-23-000016 2022 FY 10-K 2023-02-03 \n",
"61 2023-03-31 12722000000 0001652044-23-000045 2023 Q1 10-Q 2023-04-26 \n",
"\n",
" frame \n",
"56 CY2022Q1I \n",
"57 CY2022Q2I \n",
"58 CY2022Q3I \n",
"59 NaN \n",
"61 CY2023Q1I "
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shares.tail()"
]
},
{
"cell_type": "code",
"execution_count": 65,
"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>start</th>\n",
" <th>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" <th>prev_3_val_sum</th>\n",
" <th>net_income_loss</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-03-31</td>\n",
" <td>16436000000</td>\n",
" <td>0001652044-22-000029</td>\n",
" <td>2022</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2022-04-27</td>\n",
" <td>NaN</td>\n",
" <td>1.134940e+11</td>\n",
" <td>16436000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" <td>16002000000</td>\n",
" <td>0001652044-22-000071</td>\n",
" <td>2022</td>\n",
" <td>Q2</td>\n",
" <td>10-Q</td>\n",
" <td>2022-07-27</td>\n",
" <td>CY2022Q2</td>\n",
" <td>1.114050e+11</td>\n",
" <td>16002000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>13910000000</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>CY2022Q3</td>\n",
" <td>1.084710e+11</td>\n",
" <td>13910000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" <td>59972000000</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>CY2022</td>\n",
" <td>4.634800e+10</td>\n",
" <td>13624000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2023Q1</td>\n",
" <td>8.988400e+10</td>\n",
" <td>15051000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end val accn fy fp form \\\n",
"24 2022-01-01 2022-03-31 16436000000 0001652044-22-000029 2022 Q1 10-Q \n",
"25 2022-04-01 2022-06-30 16002000000 0001652044-22-000071 2022 Q2 10-Q \n",
"26 2022-07-01 2022-09-30 13910000000 0001652044-22-000090 2022 Q3 10-Q \n",
"27 2022-01-01 2022-12-31 59972000000 0001652044-23-000016 2022 FY 10-K \n",
"28 2023-01-01 2023-03-31 15051000000 0001652044-23-000045 2023 Q1 10-Q \n",
"\n",
" filed frame prev_3_val_sum net_income_loss \n",
"24 2022-04-27 NaN 1.134940e+11 16436000000 \n",
"25 2022-07-27 CY2022Q2 1.114050e+11 16002000000 \n",
"26 2022-10-26 CY2022Q3 1.084710e+11 13910000000 \n",
"27 2023-02-03 CY2022 4.634800e+10 13624000000 \n",
"28 2023-04-26 CY2023Q1 8.988400e+10 15051000000 "
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"income.tail()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"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>start</th>\n",
" <th>end</th>\n",
" <th>net_income_loss</th>\n",
" <th>shares_outstanding</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-03-31</td>\n",
" <td>16436000000</td>\n",
" <td>658763000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" <td>16002000000</td>\n",
" <td>13078000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>13910000000</td>\n",
" <td>12971000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" <td>13624000000</td>\n",
" <td>12849000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>12722000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end net_income_loss shares_outstanding\n",
"24 2022-01-01 2022-03-31 16436000000 658763000\n",
"25 2022-04-01 2022-06-30 16002000000 13078000000\n",
"26 2022-07-01 2022-09-30 13910000000 12971000000\n",
"27 2022-01-01 2022-12-31 13624000000 12849000000\n",
"28 2023-01-01 2023-03-31 15051000000 12722000000"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shares[\"shares_outstanding\"] = shares[\"val\"]\n",
"eps = pd.merge(income, shares[[\"end\", \"shares_outstanding\"]], on=[\"end\"], how=\"left\")\n",
"eps = eps[[\"start\", \"end\", \"net_income_loss\", \"shares_outstanding\"]]\n",
"eps.tail()"
]
},
{
"cell_type": "code",
"execution_count": 67,
"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>start</th>\n",
" <th>end</th>\n",
" <th>net_income_loss</th>\n",
" <th>shares_outstanding</th>\n",
" <th>basic_eps</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-03-31</td>\n",
" <td>16436000000</td>\n",
" <td>658763000</td>\n",
" <td>24.949792</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" <td>16002000000</td>\n",
" <td>13078000000</td>\n",
" <td>1.223582</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>13910000000</td>\n",
" <td>12971000000</td>\n",
" <td>1.072392</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" <td>13624000000</td>\n",
" <td>12849000000</td>\n",
" <td>1.060316</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>12722000000</td>\n",
" <td>1.183069</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end net_income_loss shares_outstanding basic_eps\n",
"24 2022-01-01 2022-03-31 16436000000 658763000 24.949792\n",
"25 2022-04-01 2022-06-30 16002000000 13078000000 1.223582\n",
"26 2022-07-01 2022-09-30 13910000000 12971000000 1.072392\n",
"27 2022-01-01 2022-12-31 13624000000 12849000000 1.060316\n",
"28 2023-01-01 2023-03-31 15051000000 12722000000 1.183069"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eps[\"basic_eps\"] = eps[\"net_income_loss\"] / eps[\"shares_outstanding\"]\n",
"eps.tail()"
]
},
{
"cell_type": "code",
"execution_count": 68,
"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>start</th>\n",
" <th>end</th>\n",
" <th>net_income_loss</th>\n",
" <th>shares_outstanding</th>\n",
" <th>basic_eps</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-03-31</td>\n",
" <td>16436000000</td>\n",
" <td>658763000</td>\n",
" <td>1.247490</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>2022-04-01</td>\n",
" <td>2022-06-30</td>\n",
" <td>16002000000</td>\n",
" <td>13078000000</td>\n",
" <td>1.223582</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>2022-07-01</td>\n",
" <td>2022-09-30</td>\n",
" <td>13910000000</td>\n",
" <td>12971000000</td>\n",
" <td>1.072392</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2022-01-01</td>\n",
" <td>2022-12-31</td>\n",
" <td>13624000000</td>\n",
" <td>12849000000</td>\n",
" <td>1.060316</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2023-01-01</td>\n",
" <td>2023-03-31</td>\n",
" <td>15051000000</td>\n",
" <td>12722000000</td>\n",
" <td>1.183069</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" start end net_income_loss shares_outstanding basic_eps\n",
"24 2022-01-01 2022-03-31 16436000000 658763000 1.247490\n",
"25 2022-04-01 2022-06-30 16002000000 13078000000 1.223582\n",
"26 2022-07-01 2022-09-30 13910000000 12971000000 1.072392\n",
"27 2022-01-01 2022-12-31 13624000000 12849000000 1.060316\n",
"28 2023-01-01 2023-03-31 15051000000 12722000000 1.183069"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# stock split\n",
"eps.loc[eps[\"end\"] <= \"2022-03-31\", \"basic_eps\"] /= 20\n",
"eps.tail()"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: xlabel='end'>"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"eps.tail(12).plot(x=\"end\", y=[\"basic_eps\"])"
]
},
{
"cell_type": "code",
"execution_count": 70,
"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>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2022-02-01</td>\n",
" <td>20</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2022-02-01</td>\n",
" <td>20</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>CY2021Q4I</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2022-07-15</td>\n",
" <td>20</td>\n",
" <td>0001652044-22-000090</td>\n",
" <td>2022</td>\n",
" <td>Q3</td>\n",
" <td>10-Q</td>\n",
" <td>2022-10-26</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>2022-07-15</td>\n",
" <td>20</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>2022-07-15</td>\n",
" <td>20</td>\n",
" <td>0001652044-23-000045</td>\n",
" <td>2023</td>\n",
" <td>Q1</td>\n",
" <td>10-Q</td>\n",
" <td>2023-04-26</td>\n",
" <td>CY2022Q2I</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" end val accn fy fp form filed frame\n",
"4 2022-02-01 20 0001652044-22-000090 2022 Q3 10-Q 2022-10-26 NaN\n",
"5 2022-02-01 20 0001652044-23-000016 2022 FY 10-K 2023-02-03 CY2021Q4I\n",
"6 2022-07-15 20 0001652044-22-000090 2022 Q3 10-Q 2022-10-26 NaN\n",
"7 2022-07-15 20 0001652044-23-000016 2022 FY 10-K 2023-02-03 NaN\n",
"8 2022-07-15 20 0001652044-23-000045 2023 Q1 10-Q 2023-04-26 CY2022Q2I"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"splits, *_ = get_fact(\n",
" facts, \"StockholdersEquityNoteStockSplitConversionRatio1\", unit=\"pure\"\n",
")\n",
"splits.tail()"
]
},
{
"cell_type": "code",
"execution_count": 71,
"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>end</th>\n",
" <th>val</th>\n",
" <th>accn</th>\n",
" <th>fy</th>\n",
" <th>fp</th>\n",
" <th>form</th>\n",
" <th>filed</th>\n",
" <th>frame</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2014-04-02</td>\n",
" <td>2</td>\n",
" <td>0001652044-16-000012</td>\n",
" <td>2015</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2016-02-11</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>2022-07-15</td>\n",
" <td>20</td>\n",
" <td>0001652044-23-000016</td>\n",
" <td>2022</td>\n",
" <td>FY</td>\n",
" <td>10-K</td>\n",
" <td>2023-02-03</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" end val accn fy fp form filed frame\n",
"0 2014-04-02 2 0001652044-16-000012 2015 FY 10-K 2016-02-11 NaN\n",
"7 2022-07-15 20 0001652044-23-000016 2022 FY 10-K 2023-02-03 NaN"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"splits[(splits[\"fp\"] == \"FY\") & (splits[\"form\"] == \"10-K\")].drop_duplicates(\n",
" \"accn\", keep=\"last\"\n",
")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "langchain-tutorial",
"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.10"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment