Files
pdfplumber/examples/notebooks/extract-table-ca-warn-report.ipynb
T

811 lines
158 KiB
Plaintext
Raw Normal View History

2017-02-25 13:23:51 -05:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
2017-02-25 13:23:51 -05:00
"source": [
"# Demonstration of `pdfplumber`'s `extract_table` method.\n",
"\n",
"This notebook uses `pdfplumber` to extract data from an [California Worker Adjustment and Retraining Notification (WARN) report](../pdfs/ca-warn-report.pdf)."
]
},
{
"cell_type": "markdown",
"metadata": {},
2017-02-25 13:23:51 -05:00
"source": [
"### Import `pdfplumber`"
]
},
{
"cell_type": "code",
"execution_count": 1,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.044463Z",
"iopub.status.busy": "2022-07-18T14:47:49.043937Z",
"iopub.status.idle": "2022-07-18T14:47:49.090608Z",
"shell.execute_reply": "2022-07-18T14:47:49.090181Z"
2022-05-31 15:50:50 -04:00
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2024-08-07 15:50:10 -04:00
"0.11.3\n"
]
}
],
2017-02-25 13:23:51 -05:00
"source": [
"import pdfplumber\n",
"print(pdfplumber.__version__)"
2017-02-25 13:23:51 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
2017-02-25 13:23:51 -05:00
"source": [
"### Load the PDF"
]
},
{
"cell_type": "code",
"execution_count": 2,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.093045Z",
"iopub.status.busy": "2022-07-18T14:47:49.092881Z",
"iopub.status.idle": "2022-07-18T14:47:49.115547Z",
"shell.execute_reply": "2022-07-18T14:47:49.115279Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [],
"source": [
"pdf = pdfplumber.open(\"../pdfs/ca-warn-report.pdf\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
2017-02-25 13:23:51 -05:00
"source": [
"### Get the first page"
]
},
{
"cell_type": "code",
"execution_count": 3,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.117150Z",
"iopub.status.busy": "2022-07-18T14:47:49.117042Z",
"iopub.status.idle": "2022-07-18T14:47:49.124602Z",
"shell.execute_reply": "2022-07-18T14:47:49.124365Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [],
"source": [
"p0 = pdf.pages[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Display the first page"
]
},
{
"cell_type": "code",
"execution_count": 4,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.126047Z",
"iopub.status.busy": "2022-07-18T14:47:49.125940Z",
"iopub.status.idle": "2022-07-18T14:47:49.353507Z",
"shell.execute_reply": "2022-07-18T14:47:49.353248Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [
{
"data": {
2024-08-07 15:50:10 -04:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxgAAAJkCAMAAAClNHdYAAADAFBMVEX5+fkAAADo6OgXFxe3y+N3d3fX19eXl5cmJiZnZ2eHh4empqZXV1fHx8e3t7c3NzdHR0cAYIjfmAD369GGlaZ6iJjnuVWxxdyqw9ZseIaUpbhSW2bW5OtcZ3NKUls1O0I7QkqitMkoeJlCSlOpvNIsMTfs8/WcrcHH2+MeISUnLDEaHSAVbZFXYWw4gqG50t0OEBKZtsjj7PBxfYwccZVEiqdlcH5OV2FhbHmItMZrobmOnbBSkq3gmwd1qL1inbUQaY4xfZ4MDhB8rcGdwdBal7GcwM/hoh315cL69elzgI/ms0fsyHrtzIT04bdOkKvrw27pvmH58N2/1uDy2aWBj6DO4OfipynkrTbx15/03rE1gJ+Ar8MCX4flsD2Ajp8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR0EkWAAAACXBIWXMAAAsTAAALEwEAmpwYAAC68UlEQVR4nO39CZ/kOJLeCeNIEiAAHtlbqcq6j+7qnr7PmemeHs0taUbS7kra872//7d47TED6XR3eoTTiQiPyKL9urM8eICAAUaAxMM/lNptt91222233Xbbbbfddtttt91222233Xbbbbfddtttt91222233Xbbbbfddtttt91222233Xbbbbfddtttt91222233Xbbbbfddtttt91222233Xb7nppzRqnWOfrZuZb+ja6T7WSxnTa3/K9SNW/vzJXJ19VTZHq33Z7avA5KDVpHpSz+MVpbbNdiDXZaCoOAn2Qx7+geTTn6WsVOm8eP3G23F2eNThwFDUKiVqrSHCS0qakqCpgWUZPmgWGrqrISPQ8aJWcQQo8fudtuL84cNdyOmq9Hk1foNqweFJp1y385BAb1D4fA8PQvnYFeJCXEUFO1Df9QrknU/6jQdKmiCEudocSuHXXtttsLspqaeKUb/jdxi2+556BgMKbDz4HDZtZjGGMahAd26EoZGVuFvMEb1aOf8NjZ6HDFoGu33V6e0ZOF112vY0+9g0rU/j219vEZY0BzD9TsT58xHEKkbmW8lGqKLIodGztPx/Xad51BaKlW7XGx26u0pKVRN+gdqDWHtsGYSuvecjdAgeEctf1DYKBDaPE04vGwEU0+sR1wSKC+pOfzuOPZbbdXao77hVaekkPuD6LKj901BwYPjg7PGLXVPR7btSeTwMDxHA94Uunz4/seGLu9Xmvl+UDzuyev+5SSp0hBYBgOAARGexQY6DYCPY7QrxCN0XIAPaT06ICGPTB2+xBMBkZDbt5ozNTua97IAYDAQPcwfyuVcCD1NAmP4uhycq/jPd5gSWBQVLl7lmu33TbZwK9pHZp6g3u+QpuuJEQQABwYtGkeGNyXtBQFfYvHCwqbHhPotMFSTEhgVGMs7bbb98wM5igoMOQHbzndu9tu31NDYOy2224nZry/dxZ222233Xbbbbfddtttt91222233XbbbbfddtvtNdr/8n//+x/M7d//l/9p6bC//+e/+/x029unz91uu93D/tsYFP/pv47h8K//83/6wf/3X8+OfPv+/e/Otj1+gc/34Nntldm//ieJiX+31EP8lx+cbOUG/oe/efu3f/v21+ov/vCntz+WbX/4hz8o9e0f1B/eY+9vv/0Fbf/Ht7+iLuYPv/iWdr/99ulLUthCqtZ9UheP+TehaZqqXUo4nG5pcKEaxx/k50tn7vZslqPif754wP/49//X/M+3v/gF/fMrCoZ/fot+4C/ecmD8w7fqV/zrD/jn/Vv19q361T8oCp6/od9/yYe9Mmt071n6ev0Zx5CPXvf94ocWQzrdgg9k8dGGP7B2ml08cj/7HxIV/+WRw37wXw+/uYG//Xtp/RQYv3v7ObZR2/9f3/IOHPI5B8bbf6Be4/UGBmRNQ1DBqboy0bmm6xqn2or+rRtqyG2V8KdrHP3h0Ak0tm1anKAqBFTPnyk59BBGKRPQe7ToG5yLckpdMbytaXNgRGVsT0emSrXWurx/t+e2/13iYvEhe27/9oN/P/0+CYwfv5ce49tfKBkxqUNg/A0fK4Hx/vUFRtB6oHbpB2rdbUL34XvdOfxrB10Z3Q+6i1p7R3d5/pyi4SOSVi33NL11oacew9LW1mBf7fRgB9UPfEqqKVFLqfd2Cgw1aDov6aqzupH9u71g+68/GH+9//X7H6v379V79Rf/kQLgL36FbfT/3/7qt9j9J/7z8/+o3tOf//FX/6zUr3+Lw9Wv/v5OWb/dugGfD42Boagxt2AdtDU1Y51UGxsdIhqzbiKTpRpt6De174bF5UzG6ShKqqgbRxESzeApbkw/yClBR/pfsurQYyi6kKGtgxqA4cH++zrhe2Zvj+1oy68+PzvoV++XkzkbIP3iCfP83EbjJmrbCAwKBmq91LRrBAb+VTbV1nNgUEQkm/iBAPFAHYKlv/EnDaXoCDqvH4ZQUdBQ52GHYUBg4AEG33wPQ9f3qj4ERm/pf43lwJD9d3XC983OAuNPR3//8/lBi03+89OA+ZenzvgzGqNwPDXTelgKDOorHAKjZvIav49qdOVoX5WfoPGM4dHBNF0fW96X6Ckk0VAK7DZHKUbX10G7JgdGg19G0zMHBYZtZf9dnfB9s7PA+MfjDd+eH/S/3jvPz20tjaR8C8jBYmAYeuZAeKDhenn31FivE3UMGUGLwGh1j0AZ6Hnc0vCr9vjQmwKD+iLDVIVGmUH3OTBo6NVgNGXp0QLQqWH/FPx57bh/wGzDSaS8/Qul/u5k0x/41Ld/+MPb354lSI/Xj9ivypfi3jZ9pt3afr456gd4/td/271/Bf78lvuAz7NNWz7//P2hExk3/fofp01K3krh/7+ms37H//vfKIje/gd64KBx1I/N//kxbUSav8bRGFr9Tn2Mp5Gz+fIPxuIx6L/hpQB2e42W2/xhw58OTf8/HAfG7Hj5if//Sb398bdv1du/oz/ffv633yIw3v6tevsvv35L59PhP377/l/eYsoP6fz67dsPWxJSHwWC2Z8KXq3NGrrYPx6eLMadP34gMN5TTFBg0P/+t8/f/h3a/3/gjb/49TS5hyPfvv076ijeqr98+xon+Hb7/tnRs8Pvpg3vZzvHR4z5Jv4pgkBIpLCd4odHYn+p6Mnj7V9SYPx6Hhhyxh4Yu70K+91RYGDLrOWPPYX8R6bljmMET+F/wf0LXuL+6u3bXyv64//99tu/oajAc/sYGOoPPCRDz6Le/sM9Srrbbivsbx4KjH8+Cgx5ZD4bel2yV6j8uM5iMKoLZC00Th2LYA10T21SbQUtVC1CWqibWj7u+GTVNZjD5pOxfB8dAgGIOTtZuWaf07uT/eKhwJCf/2G+6ddXB8afPtDA6K3VphHofx8q7XWH+QfIBYdae4slyHgNGV5qKQkU/ejkVoOLTic73dMxsqBAp5dO9npXnN/
2017-02-25 13:23:51 -05:00
"text/plain": [
2024-08-07 15:50:10 -04:00
"<pdfplumber.display.PageImage at 0x107a93a40>"
2017-02-25 13:23:51 -05:00
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"im = p0.to_image()\n",
"im"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Use `.extract_table` to get the data from the largest table on the page"
]
},
{
"cell_type": "code",
"execution_count": 5,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.355260Z",
"iopub.status.busy": "2022-07-18T14:47:49.355148Z",
"iopub.status.idle": "2022-07-18T14:47:49.541985Z",
"shell.execute_reply": "2022-07-18T14:47:49.541545Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [],
"source": [
"table = p0.extract_table()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`.extract_table` returns a list of lists, with each inner list representing a row in the table. Here are the first three rows:"
]
},
{
"cell_type": "code",
"execution_count": 6,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.543952Z",
"iopub.status.busy": "2022-07-18T14:47:49.543825Z",
"iopub.status.idle": "2022-07-18T14:47:49.546726Z",
"shell.execute_reply": "2022-07-18T14:47:49.546289Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [
{
"data": {
"text/plain": [
"[['Notice Date',\n",
" 'Effective',\n",
" 'Received',\n",
" 'Company',\n",
" 'City',\n",
" 'No. Of',\n",
" 'Layoff/Closure'],\n",
" ['06/22/2015',\n",
" '0 3 / 2 5 / 2 0 16',\n",
" '0 7 / 0 1 / 2 0 15',\n",
2017-02-25 13:23:51 -05:00
" 'Maxim Integrated Product',\n",
" 'San Jose',\n",
" '150',\n",
" 'Closure Permanent'],\n",
" ['06/30/2015',\n",
" '0 8 / 2 9 / 2 0 15',\n",
" '0 7 / 0 1 / 2 0 15',\n",
2017-02-25 13:23:51 -05:00
" 'McGraw-Hill Education',\n",
" 'Monterey',\n",
" '137',\n",
" 'Layoff Unknown at this time']]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table[:3]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic cleanup\n",
"\n",
"We can use `pandas` to render the list as a DataFrame, and to remove the extra spaces within some of the dates."
]
},
{
"cell_type": "code",
"execution_count": 7,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.548595Z",
"iopub.status.busy": "2022-07-18T14:47:49.548470Z",
"iopub.status.idle": "2022-07-18T14:47:49.829681Z",
"shell.execute_reply": "2022-07-18T14:47:49.829370Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 8,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.831501Z",
"iopub.status.busy": "2022-07-18T14:47:49.831343Z",
"iopub.status.idle": "2022-07-18T14:47:49.836849Z",
"shell.execute_reply": "2022-07-18T14:47:49.836593Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [],
"source": [
"df = pd.DataFrame(table[1:], columns=table[0])\n",
"for column in [\"Effective\", \"Received\"]:\n",
" df[column] = df[column].str.replace(\" \", \"\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.838270Z",
"iopub.status.busy": "2022-07-18T14:47:49.838160Z",
"iopub.status.idle": "2022-07-18T14:47:49.844983Z",
"shell.execute_reply": "2022-07-18T14:47:49.844735Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"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",
2017-02-25 13:23:51 -05:00
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Notice Date</th>\n",
" <th>Effective</th>\n",
" <th>Received</th>\n",
" <th>Company</th>\n",
" <th>City</th>\n",
" <th>No. Of</th>\n",
" <th>Layoff/Closure</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>06/22/2015</td>\n",
" <td>03/25/2016</td>\n",
" <td>07/01/2015</td>\n",
" <td>Maxim Integrated Product</td>\n",
" <td>San Jose</td>\n",
" <td>150</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>06/30/2015</td>\n",
" <td>08/29/2015</td>\n",
" <td>07/01/2015</td>\n",
" <td>McGraw-Hill Education</td>\n",
" <td>Monterey</td>\n",
" <td>137</td>\n",
" <td>Layoff Unknown at this time</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>06/30/2015</td>\n",
" <td>08/30/2015</td>\n",
" <td>07/01/2015</td>\n",
" <td>Long Beach Memorial Medical Center</td>\n",
" <td>Long Beach</td>\n",
" <td>90</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>07/01/2015</td>\n",
" <td>09/02/2015</td>\n",
" <td>07/01/2015</td>\n",
" <td>Leidos</td>\n",
" <td>El Segundo</td>\n",
" <td>72</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>07/01/2015</td>\n",
" <td>09/30/2016</td>\n",
" <td>07/01/2015</td>\n",
" <td>Bosch Healthcare Systems, Inc.</td>\n",
" <td>Palo Alto</td>\n",
" <td>55</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>06/29/2015</td>\n",
" <td>09/01/2015</td>\n",
" <td>07/02/2015</td>\n",
" <td>Encompass Digital Media, Inc.</td>\n",
" <td>Los Angeles</td>\n",
" <td>41</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>07/02/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>07/02/2015</td>\n",
" <td>Alphatec Spine</td>\n",
" <td>Carlsbad</td>\n",
" <td>99</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>06/30/2015</td>\n",
" <td>08/07/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>Symantec Corporation</td>\n",
" <td>Mountain View</td>\n",
" <td>60</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>06/30/2015</td>\n",
" <td>08/31/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>Fusion Contacts Centers, LLC</td>\n",
" <td>Santa Maria</td>\n",
" <td>50</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>06/30/2015</td>\n",
" <td>09/15/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>KLA-Tencor Corporation</td>\n",
" <td>Milpitas</td>\n",
" <td>213</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>07/01/2015</td>\n",
" <td>09/04/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>Southern California Edison Company</td>\n",
" <td>San Clemente</td>\n",
" <td>100</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>07/02/2015</td>\n",
" <td>09/01/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>State Fish Company, Inc.</td>\n",
" <td>Wilmington</td>\n",
" <td>76</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>07/02/2015</td>\n",
" <td>09/04/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>Boeing Company</td>\n",
" <td>Long Beach</td>\n",
" <td>56</td>\n",
" <td>Layoff Unknown at this time</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>07/06/2015</td>\n",
" <td>09/04/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>Bridgepoint Education, Inc.</td>\n",
" <td>San Diego</td>\n",
" <td>7</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>07/06/2015</td>\n",
" <td>09/04/2015</td>\n",
" <td>07/06/2015</td>\n",
" <td>Bridgepoint Education, Inc.</td>\n",
" <td>San Diego</td>\n",
" <td>15</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>07/01/2015</td>\n",
" <td>06/29/2015</td>\n",
" <td>07/07/2015</td>\n",
" <td>BAE Systems</td>\n",
" <td>San Francisco</td>\n",
" <td>4</td>\n",
" <td>Layoff Temporary</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>07/01/2015</td>\n",
" <td>06/29/2015</td>\n",
" <td>07/07/2015</td>\n",
" <td>BAE Systems</td>\n",
" <td>San Francisco</td>\n",
" <td>78</td>\n",
" <td>Layoff Temporary</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>07/01/2015</td>\n",
" <td>09/07/2015</td>\n",
" <td>07/07/2015</td>\n",
" <td>Bay Bread LLC dba Bakery Los Angeles</td>\n",
" <td>San Fernando</td>\n",
" <td>50</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>07/01/2015</td>\n",
" <td>09/25/2015</td>\n",
" <td>07/07/2015</td>\n",
" <td>Bay Bread LLC dba New French Bakery</td>\n",
" <td>South San</td>\n",
" <td>121</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>07/02/2015</td>\n",
" <td>06/12/2015</td>\n",
" <td>07/07/2015</td>\n",
" <td>Hewlett-Packard Company</td>\n",
" <td>Palo Alto</td>\n",
" <td>65</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>07/08/2015</td>\n",
" <td>09/06/2015</td>\n",
" <td>07/08/2015</td>\n",
" <td>Microsoft Corporation</td>\n",
" <td>San Diego</td>\n",
" <td>129</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>06/25/2015</td>\n",
" <td>10/09/2015</td>\n",
" <td>07/10/2015</td>\n",
" <td>Aramark Healthcare Support Services,</td>\n",
" <td>Culver City</td>\n",
" <td>53</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>07/01/2015</td>\n",
" <td>09/10/2015</td>\n",
" <td>07/10/2015</td>\n",
" <td>Maxim Integrated Product</td>\n",
" <td>San Jose</td>\n",
" <td>20</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>07/06/2015</td>\n",
" <td>09/04/2015</td>\n",
" <td>07/10/2015</td>\n",
" <td>ProCourier, Inc.</td>\n",
" <td>San Diego</td>\n",
" <td>22</td>\n",
" <td>Layoff Unknown at this time</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>07/06/2015</td>\n",
" <td>09/04/2015</td>\n",
" <td>07/10/2015</td>\n",
" <td>ProCourier, Inc.</td>\n",
" <td>Los Angeles</td>\n",
" <td>71</td>\n",
" <td>Layoff Unknown at this time</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>07/07/2015</td>\n",
" <td>09/04/2015</td>\n",
" <td>07/10/2015</td>\n",
" <td>ProCourier, Inc.</td>\n",
" <td>Irvine</td>\n",
" <td>22</td>\n",
" <td>Layoff Unknown at this time</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>07/09/2015</td>\n",
" <td>07/22/2015</td>\n",
" <td>07/10/2015</td>\n",
" <td>Berkeley Pyramid Alehouse</td>\n",
" <td>Berkeley</td>\n",
" <td>63</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>07/09/2015</td>\n",
" <td>09/14/2015</td>\n",
" <td>07/10/2015</td>\n",
" <td>Fireman's Fund Insurance Company</td>\n",
" <td>Novato</td>\n",
" <td>35</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>06/30/2015</td>\n",
" <td>08/31/2015</td>\n",
" <td>07/13/2015</td>\n",
" <td>First Transit</td>\n",
" <td>San Bernardino</td>\n",
" <td>127</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>06/30/2015</td>\n",
" <td>08/31/2015</td>\n",
" <td>07/13/2015</td>\n",
" <td>First Transit</td>\n",
" <td>Rancho</td>\n",
" <td>71</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>07/10/2015</td>\n",
" <td>07/14/2015</td>\n",
" <td>07/13/2015</td>\n",
" <td>11 Main LLC</td>\n",
" <td>San Mateo</td>\n",
" <td>35</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>07/10/2015</td>\n",
" <td>07/14/2015</td>\n",
" <td>07/13/2015</td>\n",
" <td>11 Main LLC</td>\n",
" <td>Chico</td>\n",
" <td>44</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>07/15/2015</td>\n",
" <td>07/15/2015</td>\n",
" <td>07/15/2015</td>\n",
" <td>TaylorMade Golf Company</td>\n",
" <td>Carlsbad</td>\n",
" <td>64</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>07/08/2015</td>\n",
" <td>09/06/2015</td>\n",
" <td>07/16/2015</td>\n",
" <td>Southern California Edison Company</td>\n",
" <td>Rosemead</td>\n",
" <td>38</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>07/14/2015</td>\n",
" <td>09/18/2015</td>\n",
" <td>07/20/2015</td>\n",
" <td>Actavis, Inc.</td>\n",
" <td>Corona</td>\n",
" <td>45</td>\n",
" <td>Layoff Permanent</td>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>07/17/2015</td>\n",
" <td>07/13/2015</td>\n",
" <td>07/21/2015</td>\n",
" <td>American Management Services LLC</td>\n",
" <td>Monterey</td>\n",
" <td>56</td>\n",
" <td>Closure Permanent</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Notice Date Effective Received Company \\\n",
"0 06/22/2015 03/25/2016 07/01/2015 Maxim Integrated Product \n",
"1 06/30/2015 08/29/2015 07/01/2015 McGraw-Hill Education \n",
"2 06/30/2015 08/30/2015 07/01/2015 Long Beach Memorial Medical Center \n",
"3 07/01/2015 09/02/2015 07/01/2015 Leidos \n",
"4 07/01/2015 09/30/2016 07/01/2015 Bosch Healthcare Systems, Inc. \n",
"5 06/29/2015 09/01/2015 07/02/2015 Encompass Digital Media, Inc. \n",
"6 07/02/2015 07/06/2015 07/02/2015 Alphatec Spine \n",
"7 06/30/2015 08/07/2015 07/06/2015 Symantec Corporation \n",
"8 06/30/2015 08/31/2015 07/06/2015 Fusion Contacts Centers, LLC \n",
"9 06/30/2015 09/15/2015 07/06/2015 KLA-Tencor Corporation \n",
"10 07/01/2015 09/04/2015 07/06/2015 Southern California Edison Company \n",
"11 07/02/2015 09/01/2015 07/06/2015 State Fish Company, Inc. \n",
"12 07/02/2015 09/04/2015 07/06/2015 Boeing Company \n",
"13 07/06/2015 09/04/2015 07/06/2015 Bridgepoint Education, Inc. \n",
"14 07/06/2015 09/04/2015 07/06/2015 Bridgepoint Education, Inc. \n",
"15 07/01/2015 06/29/2015 07/07/2015 BAE Systems \n",
"16 07/01/2015 06/29/2015 07/07/2015 BAE Systems \n",
"17 07/01/2015 09/07/2015 07/07/2015 Bay Bread LLC dba Bakery Los Angeles \n",
"18 07/01/2015 09/25/2015 07/07/2015 Bay Bread LLC dba New French Bakery \n",
"19 07/02/2015 06/12/2015 07/07/2015 Hewlett-Packard Company \n",
"20 07/08/2015 09/06/2015 07/08/2015 Microsoft Corporation \n",
"21 06/25/2015 10/09/2015 07/10/2015 Aramark Healthcare Support Services, \n",
"22 07/01/2015 09/10/2015 07/10/2015 Maxim Integrated Product \n",
"23 07/06/2015 09/04/2015 07/10/2015 ProCourier, Inc. \n",
"24 07/06/2015 09/04/2015 07/10/2015 ProCourier, Inc. \n",
"25 07/07/2015 09/04/2015 07/10/2015 ProCourier, Inc. \n",
"26 07/09/2015 07/22/2015 07/10/2015 Berkeley Pyramid Alehouse \n",
"27 07/09/2015 09/14/2015 07/10/2015 Fireman's Fund Insurance Company \n",
"28 06/30/2015 08/31/2015 07/13/2015 First Transit \n",
"29 06/30/2015 08/31/2015 07/13/2015 First Transit \n",
"30 07/10/2015 07/14/2015 07/13/2015 11 Main LLC \n",
"31 07/10/2015 07/14/2015 07/13/2015 11 Main LLC \n",
"32 07/15/2015 07/15/2015 07/15/2015 TaylorMade Golf Company \n",
"33 07/08/2015 09/06/2015 07/16/2015 Southern California Edison Company \n",
"34 07/14/2015 09/18/2015 07/20/2015 Actavis, Inc. \n",
"35 07/17/2015 07/13/2015 07/21/2015 American Management Services LLC \n",
"\n",
" City No. Of Layoff/Closure \n",
"0 San Jose 150 Closure Permanent \n",
"1 Monterey 137 Layoff Unknown at this time \n",
"2 Long Beach 90 Layoff Permanent \n",
"3 El Segundo 72 Layoff Permanent \n",
"4 Palo Alto 55 Closure Permanent \n",
"5 Los Angeles 41 Closure Permanent \n",
"6 Carlsbad 99 Layoff Permanent \n",
"7 Mountain View 60 Layoff Permanent \n",
"8 Santa Maria 50 Closure Permanent \n",
"9 Milpitas 213 Layoff Permanent \n",
"10 San Clemente 100 Closure Permanent \n",
"11 Wilmington 76 Closure Permanent \n",
"12 Long Beach 56 Layoff Unknown at this time \n",
"13 San Diego 7 Layoff Permanent \n",
"14 San Diego 15 Layoff Permanent \n",
"15 San Francisco 4 Layoff Temporary \n",
"16 San Francisco 78 Layoff Temporary \n",
"17 San Fernando 50 Closure Permanent \n",
"18 South San 121 Closure Permanent \n",
"19 Palo Alto 65 Layoff Permanent \n",
"20 San Diego 129 Layoff Permanent \n",
"21 Culver City 53 Closure Permanent \n",
"22 San Jose 20 Layoff Permanent \n",
"23 San Diego 22 Layoff Unknown at this time \n",
"24 Los Angeles 71 Layoff Unknown at this time \n",
"25 Irvine 22 Layoff Unknown at this time \n",
"26 Berkeley 63 Closure Permanent \n",
"27 Novato 35 Layoff Permanent \n",
"28 San Bernardino 127 Layoff Permanent \n",
"29 Rancho 71 Layoff Permanent \n",
"30 San Mateo 35 Closure Permanent \n",
"31 Chico 44 Layoff Permanent \n",
"32 Carlsbad 64 Layoff Permanent \n",
"33 Rosemead 38 Layoff Permanent \n",
"34 Corona 45 Layoff Permanent \n",
"35 Monterey 56 Closure Permanent "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## How did it work?\n",
"\n",
"We can use `pdfplumber`'s visual debugging to show how the table was extracted. The red lines represent the lines `pdfplumber` found on the page; the blue circles represent the intersections of those lines, and the light-blue shading indicates the cells derived from those intersections."
]
},
{
"cell_type": "code",
"execution_count": 10,
2022-05-31 15:50:50 -04:00
"metadata": {
"execution": {
2022-07-18 10:48:11 -04:00
"iopub.execute_input": "2022-07-18T14:47:49.846583Z",
"iopub.status.busy": "2022-07-18T14:47:49.846481Z",
"iopub.status.idle": "2022-07-18T14:47:49.897806Z",
"shell.execute_reply": "2022-07-18T14:47:49.896920Z"
2022-05-31 15:50:50 -04:00
}
},
2017-02-25 13:23:51 -05:00
"outputs": [
{
"data": {
2024-08-07 15:50:10 -04:00
"image/png": "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
2017-02-25 13:23:51 -05:00
"text/plain": [
2024-08-07 15:50:10 -04:00
"<pdfplumber.display.PageImage at 0x107a93a40>"
2017-02-25 13:23:51 -05:00
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"im.debug_tablefinder()"
]
},
{
"cell_type": "markdown",
"metadata": {},
2017-02-25 13:23:51 -05:00
"source": [
"---\n",
"\n",
"---\n",
"\n",
"---"
]
}
],
"metadata": {
"kernelspec": {
2022-05-31 15:50:50 -04:00
"display_name": "Python 3 (ipykernel)",
2017-02-25 13:23:51 -05:00
"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",
2024-08-07 15:50:10 -04:00
"version": "3.12.4"
2017-02-25 13:23:51 -05:00
}
},
"nbformat": 4,
2022-05-31 15:50:50 -04:00
"nbformat_minor": 4
2017-02-25 13:23:51 -05:00
}