{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "8d2dd0fc-5bd6-4d28-9ef3-f7cf7403f0be", "metadata": {}, "outputs": [], "source": [ "import geopandas as gpd\n", "import pandas as pd\n", "import numpy as np\n", "import os\n", "import sys\n", "\n", "module_path = os.path.abspath(os.path.join(\"../..\"))\n", "if module_path not in sys.path:\n", " sys.path.append(module_path)\n", "\n", "from data_pipeline.config import settings\n", "from data_pipeline.etl.sources.geo_utils import (\n", " add_tracts_for_geometries,\n", " get_tract_geojson,\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "id": "207209d1-f95a-4b84-bc34-d37235a6dab4", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-08-17 11:45:46,587 [data_pipeline.etl.sources.geo_utils] INFO Loading tract geometry data from census ETL\n", "2022-08-17 11:45:46,588 [data_pipeline.etl.sources.geo_utils] DEBUG Loading existing tract geojson\n" ] } ], "source": [ "df = get_tract_geojson()" ] }, { "cell_type": "code", "execution_count": 4, "id": "a6cd76db-9dff-4e18-aa26-bab9a841ce1f", "metadata": {}, "outputs": [], "source": [ "center = \"6030.04\"\n", "center_GEOID10_TRACT = \"24027603004\"" ] }, { "cell_type": "code", "execution_count": 5, "id": "ce9487d8-5e27-4d07-8f9e-467ac7cdf7e0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STATEFP10COUNTYFP10TRACTCE10GEOID10_TRACTNAME10NAMELSAD10MTFCC10FUNCSTAT10ALAND10AWATER10INTPTLAT10INTPTLON10geometry
5341524027602100240276021006021Census Tract 6021G5020S137699343674+39.3076905-076.8349752POLYGON ((-76.86305 39.31484, -76.86308 39.315...
5341624027602303240276023036023.03Census Tract 6023.03G5020S1174075626901+39.2600506-076.8754102POLYGON ((-76.86750 39.25170, -76.86754 39.251...
5342424027605503240276055036055.03Census Tract 6055.03G5020S31586458444+39.2274469-076.8803625POLYGON ((-76.88405 39.23543, -76.88398 39.235...
5342924027605502240276055026055.02Census Tract 6055.02G5020S526098416405+39.2257617-076.9054701POLYGON ((-76.90881 39.21739, -76.90882 39.217...
5345224027603004240276030046030.04Census Tract 6030.04G5020S4442509799882+39.2817022-076.9188315POLYGON ((-76.98539 39.26610, -76.98557 39.266...
5345324027605104240276051046051.04Census Tract 6051.04G5020S399695261553493+39.2369323-076.9735549POLYGON ((-76.97979 39.23322, -76.98018 39.233...
5345424027603003240276030036030.03Census Tract 6030.03G5020S45161338174904+39.3192333-076.9680454POLYGON ((-76.93350 39.35760, -76.93341 39.357...
5345524027603001240276030016030.01Census Tract 6030.01G5020S2472630357708+39.3279761-076.8942412POLYGON ((-76.86308 39.31501, -76.86305 39.314...
5346424027602201240276022016022.01Census Tract 6022.01G5020S46115496125+39.2900228-076.8721238POLYGON ((-76.87750 39.30290, -76.87747 39.302...
\n", "
" ], "text/plain": [ " STATEFP10 COUNTYFP10 TRACTCE10 GEOID10_TRACT NAME10 \\\n", "53415 24 027 602100 24027602100 6021 \n", "53416 24 027 602303 24027602303 6023.03 \n", "53424 24 027 605503 24027605503 6055.03 \n", "53429 24 027 605502 24027605502 6055.02 \n", "53452 24 027 603004 24027603004 6030.04 \n", "53453 24 027 605104 24027605104 6051.04 \n", "53454 24 027 603003 24027603003 6030.03 \n", "53455 24 027 603001 24027603001 6030.01 \n", "53464 24 027 602201 24027602201 6022.01 \n", "\n", " NAMELSAD10 MTFCC10 FUNCSTAT10 ALAND10 AWATER10 \\\n", "53415 Census Tract 6021 G5020 S 13769934 3674 \n", "53416 Census Tract 6023.03 G5020 S 11740756 26901 \n", "53424 Census Tract 6055.03 G5020 S 3158645 8444 \n", "53429 Census Tract 6055.02 G5020 S 5260984 16405 \n", "53452 Census Tract 6030.04 G5020 S 44425097 99882 \n", "53453 Census Tract 6051.04 G5020 S 39969526 1553493 \n", "53454 Census Tract 6030.03 G5020 S 45161338 174904 \n", "53455 Census Tract 6030.01 G5020 S 24726303 57708 \n", "53464 Census Tract 6022.01 G5020 S 4611549 6125 \n", "\n", " INTPTLAT10 INTPTLON10 \\\n", "53415 +39.3076905 -076.8349752 \n", "53416 +39.2600506 -076.8754102 \n", "53424 +39.2274469 -076.8803625 \n", "53429 +39.2257617 -076.9054701 \n", "53452 +39.2817022 -076.9188315 \n", "53453 +39.2369323 -076.9735549 \n", "53454 +39.3192333 -076.9680454 \n", "53455 +39.3279761 -076.8942412 \n", "53464 +39.2900228 -076.8721238 \n", "\n", " geometry \n", "53415 POLYGON ((-76.86305 39.31484, -76.86308 39.315... \n", "53416 POLYGON ((-76.86750 39.25170, -76.86754 39.251... \n", "53424 POLYGON ((-76.88405 39.23543, -76.88398 39.235... \n", "53429 POLYGON ((-76.90881 39.21739, -76.90882 39.217... \n", "53452 POLYGON ((-76.98539 39.26610, -76.98557 39.266... \n", "53453 POLYGON ((-76.97979 39.23322, -76.98018 39.233... \n", "53454 POLYGON ((-76.93350 39.35760, -76.93341 39.357... \n", "53455 POLYGON ((-76.86308 39.31501, -76.86305 39.314... \n", "53464 POLYGON ((-76.87750 39.30290, -76.87747 39.302... " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_subset = df.query(\n", " 'STATEFP10==\"24\" and COUNTYFP10==\"027\" and NAME10 in [\"6030.03\", \"6051.04\", \"6055.02\", \"6055.03\", \"6023.03\", \"6022.01\", \"6030.01\", \"6022.01\", \"6021\", \"6030.04\"]'\n", ")\n", "df_subset" ] }, { "cell_type": "code", "execution_count": 6, "id": "64e8c34d-df3a-4011-afad-c8a04af71d39", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df_subset.plot()" ] }, { "cell_type": "code", "execution_count": 7, "id": "44c0c3d9-fa1e-405c-9887-29a0a69801ba", "metadata": {}, "outputs": [], "source": [ "tract_subset = df_subset.copy()" ] }, { "cell_type": "code", "execution_count": 8, "id": "1d7645f9-22b2-4fec-9514-d777dae32b29", "metadata": {}, "outputs": [], "source": [ "df_subset = df_subset[[\"GEOID10_TRACT\", \"geometry\"]].copy()" ] }, { "cell_type": "code", "execution_count": 9, "id": "cfff1e45-3b3f-453b-a33b-8cf20f0152b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([False, False, True, True, False, False, False, True, True])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.choice([True, False], len(df_subset))" ] }, { "cell_type": "code", "execution_count": 10, "id": "4f01f4fa-69cf-4c9a-8acc-fddf3d8ab39d", "metadata": {}, "outputs": [], "source": [ "df_subset_scores = df_subset.copy()\n", "# df_subset_scores[\"included\"] = np.random.choice([True, False], len(df_subset))\n", "df_subset_scores[\"included\"] = True\n", "df_subset_scores.loc[df.GEOID10_TRACT == \"24027603004\", \"included\"] = False" ] }, { "cell_type": "code", "execution_count": 11, "id": "8cdda9e3-9c73-405e-8c35-e40e8ff2d29b", "metadata": {}, "outputs": [], "source": [ "tract_data = df_subset.rename(columns={\"GEOID10_TRACT\": \"ORIGINAL_TRACT\"})" ] }, { "cell_type": "code", "execution_count": 12, "id": "f43ffa4a-3503-4497-a247-8cc02b264f7d", "metadata": {}, "outputs": [], "source": [ "df = df_subset_scores" ] }, { "cell_type": "code", "execution_count": 13, "id": "8e1797ed-4838-4139-943c-809e4df0ab70", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GEOID10_TRACTgeometryincluded
5341524027602100POLYGON ((-76.86305 39.31484, -76.86308 39.315...True
5341624027602303POLYGON ((-76.86750 39.25170, -76.86754 39.251...True
5342424027605503POLYGON ((-76.88405 39.23543, -76.88398 39.235...True
5342924027605502POLYGON ((-76.90881 39.21739, -76.90882 39.217...True
5345224027603004POLYGON ((-76.98539 39.26610, -76.98557 39.266...False
5345324027605104POLYGON ((-76.97979 39.23322, -76.98018 39.233...True
5345424027603003POLYGON ((-76.93350 39.35760, -76.93341 39.357...True
5345524027603001POLYGON ((-76.86308 39.31501, -76.86305 39.314...True
5346424027602201POLYGON ((-76.87750 39.30290, -76.87747 39.302...True
\n", "
" ], "text/plain": [ " GEOID10_TRACT geometry \\\n", "53415 24027602100 POLYGON ((-76.86305 39.31484, -76.86308 39.315... \n", "53416 24027602303 POLYGON ((-76.86750 39.25170, -76.86754 39.251... \n", "53424 24027605503 POLYGON ((-76.88405 39.23543, -76.88398 39.235... \n", "53429 24027605502 POLYGON ((-76.90881 39.21739, -76.90882 39.217... \n", "53452 24027603004 POLYGON ((-76.98539 39.26610, -76.98557 39.266... \n", "53453 24027605104 POLYGON ((-76.97979 39.23322, -76.98018 39.233... \n", "53454 24027603003 POLYGON ((-76.93350 39.35760, -76.93341 39.357... \n", "53455 24027603001 POLYGON ((-76.86308 39.31501, -76.86305 39.314... \n", "53464 24027602201 POLYGON ((-76.87750 39.30290, -76.87747 39.302... \n", "\n", " included \n", "53415 True \n", "53416 True \n", "53424 True \n", "53429 True \n", "53452 False \n", "53453 True \n", "53454 True \n", "53455 True \n", "53464 True " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 14, "id": "799b883e-1f45-4f79-9b3f-65361aec881c", "metadata": {}, "outputs": [], "source": [ "adjacent_tracts: gpd.GeoDataFrame = df.sjoin(\n", " tract_data, how=\"left\", predicate=\"touches\"\n", ")" ] }, { "cell_type": "code", "execution_count": 15, "id": "21672763-02e0-4608-82b2-3e256591c567", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GEOID10_TRACTincluded
0240276021000.666667
1240276022010.666667
2240276023030.666667
3240276030010.666667
4240276030030.666667
5240276030041.000000
6240276051040.666667
7240276055020.666667
8240276055030.666667
\n", "
" ], "text/plain": [ " GEOID10_TRACT included\n", "0 24027602100 0.666667\n", "1 24027602201 0.666667\n", "2 24027602303 0.666667\n", "3 24027603001 0.666667\n", "4 24027603003 0.666667\n", "5 24027603004 1.000000\n", "6 24027605104 0.666667\n", "7 24027605502 0.666667\n", "8 24027605503 0.666667" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adjacent_tracts.groupby(\"ORIGINAL_TRACT\")[\n", " [\"included\"]\n", "].mean().reset_index().rename(columns={\"ORIGINAL_TRACT\": \"GEOID10_TRACT\"})" ] }, { "cell_type": "markdown", "id": "e6f4289b-944c-489e-955a-a7a177ec6dd5", "metadata": {}, "source": [ "# Make test data" ] }, { "cell_type": "code", "execution_count": 18, "id": "78772a00-3185-4d28-9755-7ba72c170282", "metadata": {}, "outputs": [], "source": [ "tract_subset.to_file(\"../tests/score/test_utils/data/us.geojson\", index=False)" ] }, { "cell_type": "code", "execution_count": 21, "id": "425a5cd3-5929-4560-89e7-2dd9233bf303", "metadata": {}, "outputs": [], "source": [ "df[[\"GEOID10_TRACT\", \"included\"]].to_csv(\n", " \"../tests/score/test_utils/data/scores.csv\", index=False\n", ")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9" } }, "nbformat": 4, "nbformat_minor": 5 }