diff --git a/capstone_project.ipynb b/capstone_project.ipynb
index a1a556e..f2fc59e 100644
--- a/capstone_project.ipynb
+++ b/capstone_project.ipynb
@@ -18,6 +18,7 @@
"outputs": [],
"source": [
"import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
"import seaborn as sns"
]
},
@@ -712,7 +713,7 @@
"source": [
"# Shall we rename or discard any columns from this dataset?\n",
"\n",
- "# BBL could be eliminated. However, there are only 11 columns total, and since df.head() is easily readable on my monitor without scrolling horizontally (as you're doing now), I see no harm in keeping it."
+ "# BBL and Tax Class could be eliminated. However, there are only 11 columns total, and since df.head() is easily readable on my monitor without scrolling horizontally (as you're doing now), I see no harm in keeping them."
]
},
{
@@ -995,8 +996,8 @@
},
{
"cell_type": "code",
- "execution_count": 28,
- "id": "3b5525b0",
+ "execution_count": 27,
+ "id": "632701c5",
"metadata": {},
"outputs": [
{
@@ -1005,7 +1006,7 @@
"0"
]
},
- "execution_count": 28,
+ "execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
@@ -1013,15 +1014,15 @@
"source": [
"# Search for unexpected data\n",
"\n",
- "# df['Energy_Score'].min() # looks good\n",
- "# df['Energy_Score'].max() # looks good\n",
- "# df['Sq_Footage'].max() # looks good\n",
+ "# df['Energy_Score'].min() # looks good\n",
+ "# df['Energy_Score'].max() # looks good\n",
+ "# df['Sq_Footage'].max() # looks good\n",
"df['Sq_Footage'].min()"
]
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": 28,
"id": "c1f3edc4",
"metadata": {},
"outputs": [
@@ -1159,7 +1160,7 @@
"F 14 14 14 14 "
]
},
- "execution_count": 29,
+ "execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
@@ -1173,7 +1174,7 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": 29,
"id": "e27467ce",
"metadata": {},
"outputs": [],
@@ -1190,7 +1191,7 @@
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 30,
"id": "b73e15d9",
"metadata": {},
"outputs": [
@@ -1313,7 +1314,7 @@
"D 6 6 6 6 "
]
},
- "execution_count": 35,
+ "execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
@@ -1326,8 +1327,8 @@
},
{
"cell_type": "code",
- "execution_count": 53,
- "id": "2d9bea8f",
+ "execution_count": 31,
+ "id": "47145374",
"metadata": {},
"outputs": [],
"source": [
@@ -1339,8 +1340,8 @@
},
{
"cell_type": "code",
- "execution_count": 67,
- "id": "6eb73792",
+ "execution_count": 32,
+ "id": "2d643fd6",
"metadata": {},
"outputs": [
{
@@ -1401,7 +1402,7 @@
"D 108170.778312"
]
},
- "execution_count": 67,
+ "execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
@@ -1416,8 +1417,8 @@
},
{
"cell_type": "code",
- "execution_count": 77,
- "id": "8666f836",
+ "execution_count": 33,
+ "id": "87c2ba5e",
"metadata": {},
"outputs": [],
"source": [
@@ -1431,8 +1432,8 @@
},
{
"cell_type": "code",
- "execution_count": 79,
- "id": "73900853",
+ "execution_count": 34,
+ "id": "27912675",
"metadata": {},
"outputs": [],
"source": [
@@ -1446,8 +1447,8 @@
},
{
"cell_type": "code",
- "execution_count": 81,
- "id": "37eb13ea",
+ "execution_count": 35,
+ "id": "8124743f",
"metadata": {
"scrolled": true
},
@@ -1526,7 +1527,7 @@
"F 14 14 14 14 "
]
},
- "execution_count": 81,
+ "execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
@@ -1539,42 +1540,8 @@
},
{
"cell_type": "code",
- "execution_count": 82,
- "id": "913b2ae6",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Block int64\n",
- "Lot int64\n",
- "Bldg_Class object\n",
- "Tax_Class int64\n",
- "Bldg_Count int64\n",
- "Sq_Footage int64\n",
- "Address object\n",
- "Borough object\n",
- "BBL int64\n",
- "Energy_Score int64\n",
- "Letter_Score object\n",
- "dtype: object"
- ]
- },
- "execution_count": 82,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# delete this cell\n",
- "\n",
- "df.dtypes"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 92,
- "id": "007f1189",
+ "execution_count": 36,
+ "id": "b83622b1",
"metadata": {},
"outputs": [
{
@@ -1726,7 +1693,7 @@
"15726 0 F "
]
},
- "execution_count": 92,
+ "execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
@@ -1739,8 +1706,8 @@
},
{
"cell_type": "code",
- "execution_count": 93,
- "id": "3479152f",
+ "execution_count": 37,
+ "id": "01c231f3",
"metadata": {},
"outputs": [
{
@@ -1820,7 +1787,7 @@
"14570 23 OCEAN PARKWAY BROOKLYN -2147483648 100 A "
]
},
- "execution_count": 93,
+ "execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
@@ -1834,36 +1801,592 @@
},
{
"cell_type": "code",
- "execution_count": 94,
- "id": "6adfd92a",
+ "execution_count": 38,
+ "id": "2bc61602",
"metadata": {},
"outputs": [],
"source": [
"# Have a peek at the Department of Finance Tax Map: http://gis.nyc.gov/taxmap/map.htm\n",
"\n",
- "# Looks like Bldg_Count = 1 for both. However, I'm not comfortable with imputing data\n",
- "# by eyeballing it."
+ "# Looks like Bldg_Count = 1 for both. However, rather than eyeballing it, let's just drop them."
]
},
{
"cell_type": "code",
- "execution_count": 95,
- "id": "7503be1f",
+ "execution_count": 39,
+ "id": "396a0fdd",
"metadata": {},
"outputs": [],
"source": [
- "# Let's just drop them\n",
+ "# Drop two rows\n",
"\n",
"df.drop([11611, 14570], inplace = True)"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "id": "ab6ecc85",
+ "execution_count": 40,
+ "id": "4e874379",
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "# Finish cleaning\n",
+ "\n",
+ "# df['Tax_Class'].value_counts() # looks good\n",
+ "# df['Bldg_Class'].value_counts() # looks good"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d22ba85a",
+ "metadata": {},
+ "source": [
+ "## Part 3: Analysis"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1e5fdc73",
+ "metadata": {},
+ "source": [
+ "### What is the relationship between a building's size and its energy rating?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "1f4d8878",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Compare apples to apples\n",
+ "\n",
+ "# df.groupby(['Bldg_Class'])['Energy_Score'].describe().sort_values(by = 'mean', ascending = False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "b0bba53f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# df.groupby(['Bldg_Class'])['Energy_Score'].plot()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "9ae68067",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Too many building types. Select major ones.\n",
+ "\n",
+ "# df['Bldg_Class'].value_counts().head(10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "951c61d8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Look up D1 through W1\n",
+ "# see https://www1.nyc.gov/assets/finance/jump/hlpbldgcode.html\n",
+ "\n",
+ "# D1 ELEVATOR APARTMENTS: ELEVATOR APT; SEMI-FIREPROOF WITHOUT STORES\n",
+ "# D4 ELEVATOR APARTMENTS: ELEVATOR COOPERATIVE\n",
+ "# R0 CONDOMINIUMS: SPECIAL CONDOMINIUM BILLING LOT\n",
+ "# C1 WALK UP APARTMENTS: OVER SIX FAMILIES WITHOUT STORES\n",
+ "# D7 ELEVATOR APARTMENTS: ELEVATOR APT; SEMI-FIREPROOF WITH STORES\n",
+ "# W1 EDUCATIONAL FACILITIES: PUBLIC ELEMENTARY, JUNIOR OR SENIOR HIGH"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "376dadae",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# df[(df['Block'] == 702) & (df['Lot'] == 10)] # 10 Hudson Yards"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "e6d23093",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# df[(df['Block'] == ) & (df['Lot'] == )] # 30 Hudson Yards: 500 W 33rd St"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "169570ed",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# df[df['Address'].dropna().str.contains('WEST 33')].head()\n",
+ "\n",
+ "# temp = df.dropna()\n",
+ "# temp[temp['Address'].str.contains('WEST 33')]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "73f50d5c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['Y4', 'T2', 'R0', 'O4', 'W1', 'O6', 'D5', 'D9', 'D0', 'O3', 'H3',\n",
+ " 'H2', 'D7', 'V1', 'D6', 'K6', 'D8', 'W8', 'O2', 'H1', 'D3', 'K4',\n",
+ " 'H9', 'K3', 'HB', 'RM', 'H5', 'O5', 'D4', 'HS', 'E9', 'D2', 'O7',\n",
+ " 'W5', 'U7', 'M1', 'I1', 'K2', 'Z1', 'W6', 'K9', 'Z3', 'H8', 'S4',\n",
+ " 'E1', 'C7', 'W2', 'C9', 'D1', 'C1', 'HR', 'O9', 'I9', 'K1', 'I6',\n",
+ " 'G1', 'N2', 'Y2', 'I7', 'M9', 'G2', 'I5', 'C4', 'E7', 'P9', 'W9',\n",
+ " 'P5', 'N9', 'S3', 'W3', 'J4', 'C6', 'M2', 'P7', 'W7', 'J3', 'H6',\n",
+ " 'P8', 'F9', 'G9', 'Y8', 'J8', 'F5', 'C5', 'N4', 'I3', 'P3', 'J6',\n",
+ " 'P2', 'W4', 'RC', 'I2', 'K5', 'J5', 'I4', 'M4', 'G8', 'J7', 'HH',\n",
+ " 'O8', 'M3', 'U0', 'O1', 'F1', 'F2', 'F4', 'H4', 'E2', 'Y1', 'Y6',\n",
+ " 'Z9', 'R2', 'Q6', 'K7', 'U6', 'RD', 'Y9', 'Q1', 'T9', 'V9', 'U9',\n",
+ " 'K8', 'U5', 'R4', 'G7', 'F8', 'J9', 'N3', 'P6', 'J2', 'GW', 'T1',\n",
+ " 'R3', 'C8', 'RS', 'Q2', 'V7', 'Q4', 'Y7'], dtype=object)"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# There are many types of building\n",
+ "\n",
+ "df['Bldg_Class'].unique()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5449a9dd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# It wouldn't make sense to compare, say, residential with commercial buildings.\n",
+ "# For an apple to apples comparison, let's look at office buildings.\n",
+ "\n",
+ "# O1\tOFFICE ONLY - 1 STORY\n",
+ "# O2\tOFFICE ONLY 2 - 6 STORIES\n",
+ "# O3\tOFFICE ONLY 7 - 19 STORIES\n",
+ "# O4\tOFFICE ONLY WITH OR WITHOUT COMM - 20 STORIES OR MORE\n",
+ "# O5\tOFFICE WITH COMM - 1 TO 6 STORIES\n",
+ "# O6\tOFFICE WITH COMM 7 - 19 STORIES\n",
+ "# O7\tPROFESSIONAL BUILDINGS/STAND ALONE FUNERAL HOMES\n",
+ "# O8\tOFFICE WITH APARTMENTS ONLY (NO COMM)\n",
+ "# O9\tMISCELLANEOUS AND OLD STYLE BANK BLDGS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "id": "bc229011",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Block | \n",
+ " Lot | \n",
+ " Bldg_Class | \n",
+ " Tax_Class | \n",
+ " Bldg_Count | \n",
+ " Sq_Footage | \n",
+ " Address | \n",
+ " Borough | \n",
+ " BBL | \n",
+ " Energy_Score | \n",
+ " Letter_Score | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 1473 | \n",
+ " 702 | \n",
+ " 10 | \n",
+ " O4 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 1835464 | \n",
+ " 501 WEST 30 STREET | \n",
+ " MANHATTAN | \n",
+ " 1007020010 | \n",
+ " 58 | \n",
+ " C | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Block Lot Bldg_Class Tax_Class Bldg_Count Sq_Footage \\\n",
+ "1473 702 10 O4 4 1 1835464 \n",
+ "\n",
+ " Address Borough BBL Energy_Score Letter_Score \n",
+ "1473 501 WEST 30 STREET MANHATTAN 1007020010 58 C "
+ ]
+ },
+ "execution_count": 61,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Context: 10 Hudson Yards. A new building with a poor energy rating.\n",
+ "\n",
+ "# It's one of the large glass and steel buildings that have recently cropped up in Manhattan (2016).\n",
+ "# Unfortunately, the dataset does not contain the newest behemoths to arise since then,\n",
+ "# like 30 Hudson Yards.\n",
+ "\n",
+ "df[(df['Block'] == 702) & (df['Lot'] == 10)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "id": "a344e1a3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "