From 18fb738b2799d59c96a0c20d763442b962ad74f4 Mon Sep 17 00:00:00 2001 From: lucasmbrown-usds Date: Mon, 11 Jul 2022 18:37:21 -0400 Subject: [PATCH] notebook working --- .../ipython/eAMLIS_and_lat_long.ipynb | 1078 ++--------------- 1 file changed, 82 insertions(+), 996 deletions(-) diff --git a/data/data-pipeline/data_pipeline/ipython/eAMLIS_and_lat_long.ipynb b/data/data-pipeline/data_pipeline/ipython/eAMLIS_and_lat_long.ipynb index d48fe464..26b4768d 100644 --- a/data/data-pipeline/data_pipeline/ipython/eAMLIS_and_lat_long.ipynb +++ b/data/data-pipeline/data_pipeline/ipython/eAMLIS_and_lat_long.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 160, + "execution_count": 9, "id": "840279e3", "metadata": {}, "outputs": [ @@ -26,9 +26,11 @@ "import warnings\n", "from pandarallel import pandarallel\n", "\n", - "pandarallel.initialize(progress_bar=True, \n", - " # If nb_workers is not set, it defaults to available cores.\n", - " nb_workers=8)\n", + "pandarallel.initialize(\n", + " progress_bar=True,\n", + " # If nb_workers is not set, it defaults to available cores.\n", + " nb_workers=8,\n", + ")\n", "\n", "from tqdm.notebook import tqdm_notebook\n", "\n", @@ -37,7 +39,8 @@ " sys.path.append(module_path)\n", "\n", "# from data_pipeline.utils import remove_all_from_dir, get_excel_column_name\n", - "# from data_pipeline.etl.base import ExtractTransformLoad\n", + "from data_pipeline.etl.base import ExtractTransformLoad\n", + "\n", "# from data_pipeline.etl.sources.census.etl_utils import get_state_information\n", "# from data_pipeline.etl.sources.ejscreen_areas_of_concern.etl import (\n", "# EJSCREENAreasOfConcernETL,\n", @@ -55,17 +58,17 @@ }, { "cell_type": "code", - "execution_count": 136, - "id": "515875d4", + "execution_count": 10, + "id": "3ba71db3", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2022-07-11 17:59:18,012 [data_pipeline.etl.sources.census.etl_utils] INFO Downloading fips from S3 repository\n", - "2022-07-11 17:59:18,020 [data_pipeline.utils] INFO Downloading https://justice40-data.s3.amazonaws.com/data-sources/fips_states_2010.zip\n", - "2022-07-11 17:59:18,504 [data_pipeline.utils] INFO Extracting /Users/lucas/Documents/usds/repos/justice40-tool/data/data-pipeline/data_pipeline/data/tmp/downloaded-a16d79e8-76b5-4cc9-8ba8-edead13aaaaf.zip\n" + "2022-07-11 18:35:35,284 [data_pipeline.etl.sources.census.etl_utils] INFO Downloading fips from S3 repository\n", + "2022-07-11 18:35:35,291 [data_pipeline.utils] INFO Downloading https://justice40-data.s3.amazonaws.com/data-sources/fips_states_2010.zip\n", + "2022-07-11 18:35:35,780 [data_pipeline.utils] INFO Extracting /Users/lucas/Documents/usds/repos/justice40-tool/data/data-pipeline/data_pipeline/data/tmp/downloaded-4eec1600-71bb-48c7-825b-32f5830316e4.zip\n" ] } ], @@ -77,64 +80,17 @@ "\n", "\n", "# TODO: switch to whole US\n", - "# GEOJSON_PATH = CensusETL().GEOJSON_PATH / \"us.json\"\n", - "GEOJSON_PATH = CensusETL().GEOJSON_PATH / \"02.json\"\n", + "GEOJSON_PATH = CensusETL().GEOJSON_PATH / \"us.json\"\n", + "# GEOJSON_PATH = CensusETL().GEOJSON_PATH / \"02.json\"\n", "GEOJSON_TRACT_ID_FIELD = \"GEOID10\"" ] }, { "cell_type": "code", - "execution_count": 137, - "id": "7b98bdcc", + "execution_count": null, + "id": "94f7726a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " STATEFP10 COUNTYFP10 TRACTCE10 GEOID10 NAME10 NAMELSAD10 \\\n", - "0 02 013 000100 02013000100 1 Census Tract 1 \n", - "1 02 016 000200 02016000200 2 Census Tract 2 \n", - "2 02 016 000100 02016000100 1 Census Tract 1 \n", - "3 02 240 000100 02240000100 1 Census Tract 1 \n", - "4 02 240 000400 02240000400 4 Census Tract 4 \n", - ".. ... ... ... ... ... ... \n", - "162 02 020 002813 02020002813 28.13 Census Tract 28.13 \n", - "163 02 020 002821 02020002821 28.21 Census Tract 28.21 \n", - "164 02 020 002822 02020002822 28.22 Census Tract 28.22 \n", - "165 02 020 002823 02020002823 28.23 Census Tract 28.23 \n", - "166 02 020 002900 02020002900 29 Census Tract 29 \n", - "\n", - " MTFCC10 FUNCSTAT10 ALAND10 AWATER10 INTPTLAT10 INTPTLON10 \\\n", - "0 G5020 S 18083148800 20792209033 +55.2437223 -161.9507485 \n", - "1 G5020 S 2823450385 3101987499 +53.6212015 -166.7712414 \n", - "2 G5020 S 8547312240 22088656025 +51.9594469 +178.3388130 \n", - "3 G5020 S 46844168733 375928532 +63.8450778 -142.6414889 \n", - "4 G5020 S 17306746551 376866714 +63.9373904 -145.4203250 \n", - ".. ... ... ... ... ... ... \n", - "162 G5020 S 86139769 60591 +61.1151498 -149.6162214 \n", - "163 G5020 S 3579532 0 +61.1015718 -149.8225005 \n", - "164 G5020 S 10861578 0 +61.0948196 -149.7823099 \n", - "165 G5020 S 85721950 11963943 +61.0532891 -149.7028074 \n", - "166 G5020 S 1403573838 154280567 +60.9724750 -149.0854386 \n", - "\n", - " geometry \n", - "0 MULTIPOLYGON (((-163.03943 55.45072, -163.0331... \n", - "1 POLYGON ((-167.78148 53.37779, -167.77670 53.3... \n", - "2 MULTIPOLYGON (((173.40338 52.77756, 173.40573 ... \n", - "3 POLYGON ((-141.27597 65.73931, -141.27506 65.7... \n", - "4 POLYGON ((-145.03421 63.33270, -145.03152 63.3... \n", - ".. ... \n", - "162 POLYGON ((-149.73061 61.10862, -149.73165 61.1... \n", - "163 POLYGON ((-149.82916 61.09421, -149.82980 61.0... \n", - "164 POLYGON ((-149.83233 61.09423, -149.83169 61.0... \n", - "165 POLYGON ((-149.73704 61.10862, -149.73575 61.1... \n", - "166 POLYGON ((-148.87921 60.73381, -148.89103 60.7... \n", - "\n", - "[167 rows x 13 columns]\n" - ] - } - ], + "outputs": [], "source": [ "# Load geojson\n", "import geopandas\n", @@ -146,236 +102,18 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": null, "id": "99df4efd", "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/509584448.py:2: DtypeWarning: Columns (14) have mixed types. Specify dtype option on import or set low_memory=False.\n", - " eamlis_source_df = pd.read_csv(\n" - ] - }, - { - "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", - "
AMLIS KeyState/TribeCountyCongressional DistrictQuadrangle NameWatershedHUC CodeFIPS CodeLatitudeLongitude...Unfunded Metric UnitsFunded Standard UnitsFunded CostsFunded GPRA AcresFunded Metric UnitsCompleted Standard UnitsCompleted CostsCompleted GPRA AcresCompleted Metric UnitsUnnamed: 40
0AK000001AKMATANUSKA-SUSITNA1.0ANCHORAGE C-8NaNNaN0217061.6-149.8...0.00.00.00.00.02.010000.00.202.0NaN
1AK000001AKMATANUSKA-SUSITNA1.0ANCHORAGE C-8NaNNaN0217061.6-149.8...0.00.00.00.00.04.020000.00.404.0NaN
2AK000001AKMATANUSKA-SUSITNA1.0ANCHORAGE C-8NaNNaN0217061.6-149.8...0.00.00.00.00.0900.033200.012.86274.3NaN
3AK000002AKFAIRBANKS NORTH STAR1.0Fairbanks D-319030004NaN0209064.8-148.0...0.00.00.00.00.08.035324.00.808.0NaN
4AK000002AKFAIRBANKS NORTH STAR1.0Fairbanks D-319030004NaN0209064.8-148.0...0.00.00.00.00.01.04416.00.101.0NaN
\n", - "

5 rows × 41 columns

\n", - "
" - ], - "text/plain": [ - " AMLIS Key State/Tribe County Congressional District \\\n", - "0 AK000001 AK MATANUSKA-SUSITNA 1.0 \n", - "1 AK000001 AK MATANUSKA-SUSITNA 1.0 \n", - "2 AK000001 AK MATANUSKA-SUSITNA 1.0 \n", - "3 AK000002 AK FAIRBANKS NORTH STAR 1.0 \n", - "4 AK000002 AK FAIRBANKS NORTH STAR 1.0 \n", - "\n", - " Quadrangle Name Watershed HUC Code FIPS Code Latitude Longitude ... \\\n", - "0 ANCHORAGE C-8 NaN NaN 02170 61.6 -149.8 ... \n", - "1 ANCHORAGE C-8 NaN NaN 02170 61.6 -149.8 ... \n", - "2 ANCHORAGE C-8 NaN NaN 02170 61.6 -149.8 ... \n", - "3 Fairbanks D-3 19030004 NaN 02090 64.8 -148.0 ... \n", - "4 Fairbanks D-3 19030004 NaN 02090 64.8 -148.0 ... \n", - "\n", - " Unfunded Metric Units Funded Standard Units Funded Costs Funded GPRA Acres \\\n", - "0 0.0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 0.0 \n", - "2 0.0 0.0 0.0 0.0 \n", - "3 0.0 0.0 0.0 0.0 \n", - "4 0.0 0.0 0.0 0.0 \n", - "\n", - " Funded Metric Units Completed Standard Units Completed Costs \\\n", - "0 0.0 2.0 10000.0 \n", - "1 0.0 4.0 20000.0 \n", - "2 0.0 900.0 33200.0 \n", - "3 0.0 8.0 35324.0 \n", - "4 0.0 1.0 4416.0 \n", - "\n", - " Completed GPRA Acres Completed Metric Units Unnamed: 40 \n", - "0 0.20 2.0 NaN \n", - "1 0.40 4.0 NaN \n", - "2 12.86 274.3 NaN \n", - "3 0.80 8.0 NaN \n", - "4 0.10 1.0 NaN \n", - "\n", - "[5 rows x 41 columns]" - ] - }, - "execution_count": 138, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ + "# TODO: change to `eAMLIS export of all data.tsv.zip`\n", + "\n", "eamlis_path = \"/Users/lucas/Downloads/eAMLIS export of all data.tsv\"\n", + "\n", + "\n", "eamlis_source_df = pd.read_csv(\n", " filepath_or_buffer=eamlis_path,\n", " sep=\"\\t\",\n", @@ -386,107 +124,12 @@ }, { "cell_type": "code", - "execution_count": 139, - "id": "00c05bdf", + "execution_count": null, + "id": "cb593cf1", "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Index(['AMLIS Key', 'State/Tribe', 'County', 'Congressional District',\n", - " 'Quadrangle Name', 'Watershed', 'HUC Code', 'FIPS Code', 'Latitude',\n", - " 'Longitude', 'Funding Source / Program', 'Problem Area Name',\n", - " 'Problem Area Number', 'Planning Unit Name', 'Planning Unit Number',\n", - " 'Problem Priority', 'Problem Type', 'Mining Type', 'Ore Types',\n", - " 'Date Prepared', 'Date Revised', 'Private Owner %', 'State Owner %',\n", - " 'Other Federal Owner %', 'Park Service Owner %',\n", - " 'Forest Service Owner %', 'Indian Owner %', 'BLM Owner %',\n", - " 'Unfunded Standard Units', 'Unfunded Costs', 'Unfunded GPRA Acres',\n", - " 'Unfunded Metric Units', 'Funded Standard Units', 'Funded Costs',\n", - " 'Funded GPRA Acres', 'Funded Metric Units', 'Completed Standard Units',\n", - " 'Completed Costs', 'Completed GPRA Acres', 'Completed Metric Units',\n", - " 'Unnamed: 40'],\n", - " dtype='object')\n" - ] - }, - { - "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", - "
AMLIS KeyLatitudeLongitude
2AK00000161.6-149.8
6AK00000361.6-144.0
12AK00000661.7-149.0
25AK00001261.6-148.9
30AK00001561.7-148.2
\n", - "
" - ], - "text/plain": [ - " AMLIS Key Latitude Longitude\n", - "2 AK000001 61.6 -149.8\n", - "6 AK000003 61.6 -144.0\n", - "12 AK000006 61.7 -149.0\n", - "25 AK000012 61.6 -148.9\n", - "30 AK000015 61.7 -148.2" - ] - }, - "execution_count": 139, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "mines_df = eamlis_source_df\n", "\n", @@ -499,214 +142,32 @@ "# TODO: investigate whether other columns (such as mine problem severity) are needed.\n", "mines_unique_df = mines_unique_df[[KEY_FIELD, LAT_FIELD, LONG_FIELD]]\n", "\n", - "mines_unique_df = mines_unique_df.head(100)\n", + "# mines_unique_df = mines_unique_df.head(100)\n", "mines_unique_df.head()" ] }, { "cell_type": "code", - "execution_count": 140, - "id": "9d93ca30", + "execution_count": null, + "id": "81b07f8a", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/lucas/.virtualenvs/scoring2/lib/python3.9/site-packages/geopandas/array.py:275: ShapelyDeprecationWarning: The array interface is deprecated and will no longer work in Shapely 2.0. Convert the '.coords' to a numpy array instead.\n", - " return GeometryArray(vectorized.points_from_xy(x, y, z), crs=crs)\n" - ] - }, - { - "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", - "
AMLIS KeyLatitudeLongitudegeometry
2AK00000161.6-149.8POINT (-149.80000 61.60000)
6AK00000361.6-144.0POINT (-144.00000 61.60000)
12AK00000661.7-149.0POINT (-149.00000 61.70000)
25AK00001261.6-148.9POINT (-148.90000 61.60000)
30AK00001561.7-148.2POINT (-148.20000 61.70000)
...............
2501AL00070934.4-85.6POINT (-85.60000 34.40000)
2510AL00071133.2-87.2POINT (-87.20000 33.20000)
2515AL00071434.5-85.7POINT (-85.70000 34.50000)
2524AL00071833.3-87.3POINT (-87.30000 33.30000)
2544AL00072633.0-87.1POINT (-87.10000 33.00000)
\n", - "

100 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " AMLIS Key Latitude Longitude geometry\n", - "2 AK000001 61.6 -149.8 POINT (-149.80000 61.60000)\n", - "6 AK000003 61.6 -144.0 POINT (-144.00000 61.60000)\n", - "12 AK000006 61.7 -149.0 POINT (-149.00000 61.70000)\n", - "25 AK000012 61.6 -148.9 POINT (-148.90000 61.60000)\n", - "30 AK000015 61.7 -148.2 POINT (-148.20000 61.70000)\n", - "... ... ... ... ...\n", - "2501 AL000709 34.4 -85.6 POINT (-85.60000 34.40000)\n", - "2510 AL000711 33.2 -87.2 POINT (-87.20000 33.20000)\n", - "2515 AL000714 34.5 -85.7 POINT (-85.70000 34.50000)\n", - "2524 AL000718 33.3 -87.3 POINT (-87.30000 33.30000)\n", - "2544 AL000726 33.0 -87.1 POINT (-87.10000 33.00000)\n", - "\n", - "[100 rows x 4 columns]" - ] - }, - "execution_count": 140, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "mines_unique_df\n", + "# # Can be deleted from production code\n", + "# # Printing for inspection\n", + "# # We restrict to South America.\n", + "# world = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n", "\n", - "mines_gdf = geopandas.GeoDataFrame(\n", - " mines_unique_df,\n", - " geometry=geopandas.points_from_xy(\n", - " x=mines_unique_df[LONG_FIELD], y=mines_unique_df[LAT_FIELD]\n", - " ),\n", - ")\n", + "# ax = world[world.continent == \"North America\"].plot(color=\"white\", edgecolor=\"black\")\n", "\n", - "mines_gdf" + "# # We can now plot our ``GeoDataFrame``.\n", + "# mines_gdf.plot(ax=ax, color=\"red\")" ] }, { "cell_type": "code", - "execution_count": 141, - "id": "88d241ad", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 141, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Can be deleted from production code\n", - "# Printing for inspection\n", - "# We restrict to South America.\n", - "world = geopandas.read_file(geopandas.datasets.get_path(\"naturalearth_lowres\"))\n", - "\n", - "ax = world[world.continent == \"North America\"].plot(color=\"white\", edgecolor=\"black\")\n", - "\n", - "# We can now plot our ``GeoDataFrame``.\n", - "mines_gdf.plot(ax=ax, color=\"red\")" - ] - }, - { - "cell_type": "code", - "execution_count": 153, - "id": "d6cc915b", + "execution_count": null, + "id": "e2dbec9e", "metadata": {}, "outputs": [], "source": [ @@ -772,6 +233,42 @@ " return result_gdf\n", "\n", "\n", + "def get_census_tracts_for_dataframe_with_lat_long(\n", + " coordinates_df: pd.DataFrame,\n", + " latitude_column: str = LAT_FIELD,\n", + " longitude_column: str = LONG_FIELD,\n", + " census_tract_gdf: geopandas.geodataframe.GeoDataFrame = census_tract_gdf,\n", + "):\n", + " # Avoid these side-effects by creating a duplicate.\n", + " coordinates_df_duplicate = coordinates_df\n", + " \n", + " \n", + " # First, convert the plain DataFrame into a geopandas data frame with lat/long geometry points.\n", + " coordinates_geopandas_gdf = geopandas.GeoDataFrame(\n", + " coordinates_df_duplicate,\n", + " geometry=geopandas.points_from_xy(\n", + " x=coordinates_df_duplicate[longitude_column], y=coordinates_df_duplicate[latitude_column]\n", + " ),\n", + " )\n", + "\n", + " # Find the tract IDs for each point.\n", + " tract_results = get_census_tracts_for_geom_points(\n", + " points_gdf=coordinates_geopandas_gdf, census_tract_gdf=census_tract_gdf\n", + " )\n", + " \n", + " # Join the tract IDs back on the original dataframe\n", + " coordinates_with_tracts_df = coordinates_df\n", + " coordinates_with_tracts_df[\n", + " ExtractTransformLoad.GEOID_TRACT_FIELD_NAME\n", + " ] = tract_results\n", + "\n", + " # Remove unnecessary `geometry` column\n", + " # For unclear reasons, the initial `GeoDataFrame` creates a `geometry` column on the input dataframe that we don't want.\n", + " coordinates_with_tracts_df = coordinates_with_tracts_df.drop(\"geometry\", axis=1)\n", + " \n", + " return coordinates_with_tracts_df\n", + "\n", + "\n", "# get_census_tract_for_one_coordinate(geom_point=)\n", "\n", "# example_point = geopandas.points_from_xy(x=[long], y=[lat])[0]\n", @@ -781,432 +278,21 @@ "# )" ] }, - { - "cell_type": "code", - "execution_count": 161, - "id": "7172c50c", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/lucas/.virtualenvs/scoring2/lib/python3.9/site-packages/geopandas/array.py:275: ShapelyDeprecationWarning: The array interface is deprecated and will no longer work in Shapely 2.0. Convert the '.coords' to a numpy array instead.\n", - " return GeometryArray(vectorized.points_from_xy(x, y, z), crs=crs)\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b43b9a69293040ab9c1987bd1c677263", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(HBox(children=(IntProgress(value=0, description='0.00%', max=13), Label(value='0 / 13'))), HBox…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-130 55.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.6 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.1 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.1 33.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.6 34.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.1 33.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.2 33.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.4 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.8 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.5 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.5 34.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.5 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.4 33.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87 33.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 33.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.7 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.9 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.8 34.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.6 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.5 34.3)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.6)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.7 34.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87 33)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.3 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-88 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 33.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.5 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.7 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87 33.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.8 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.8 34.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.4 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.2 33.6)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.6 34.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.7 34.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.3 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.2 33.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.8 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.7 34.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.6 33.3)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.4 33.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.3 33.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.3 33.3)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.2 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.1 33)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.4 33.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " AMLIS Key Latitude Longitude geometry\n", - "2 AK000001 61.6 -149.8 POINT (-149.80000 61.60000)\n", - "6 AK000003 61.6 -144.0 POINT (-144.00000 61.60000)\n", - "12 AK000006 61.7 -149.0 POINT (-149.00000 61.70000)\n", - "25 AK000012 61.6 -148.9 POINT (-148.90000 61.60000)\n", - "30 AK000015 61.7 -148.2 POINT (-148.20000 61.70000)\n", - "... ... ... ... ...\n", - "2501 AL000709 34.4 -85.6 POINT (-85.60000 34.40000)\n", - "2510 AL000711 33.2 -87.2 POINT (-87.20000 33.20000)\n", - "2515 AL000714 34.5 -85.7 POINT (-85.70000 34.50000)\n", - "2524 AL000718 33.3 -87.3 POINT (-87.30000 33.30000)\n", - "2544 AL000726 33.0 -87.1 POINT (-87.10000 33.00000)\n", - "\n", - "[100 rows x 4 columns]\n", - "2 02170000401\n", - "6 02261000100\n", - "12 02170000200\n", - "25 02170001300\n", - "30 02170000200\n", - " ... \n", - "2501 None\n", - "2510 None\n", - "2515 None\n", - "2524 None\n", - "2544 None\n", - "Length: 100, dtype: object\n" - ] - } - ], - "source": [ - "def get_census_tracts_for_dataframe_with_lat_long(\n", - " coordinate_df: pd.DataFrame,\n", - " latitude_column: str = LAT_FIELD,\n", - " longitude_column: str = LONG_FIELD,\n", - " census_tract_gdf: geopandas.geodataframe.GeoDataFrame = census_tract_gdf,\n", - "):\n", - " # First, convert the plain DataFrame into a geopandas data frame with lat/long geometry points.\n", - " coordinate_geopandas_gdf = geopandas.GeoDataFrame(\n", - " coordinate_df,\n", - " geometry=geopandas.points_from_xy(\n", - " x=coordinate_df[longitude_column], y=coordinate_df[latitude_column]\n", - " ),\n", - " )\n", - "\n", - " # Find the tract IDs for each point. \n", - " tract_results = get_census_tracts_for_geom_points(\n", - " points_gdf=coordinate_geopandas_gdf, census_tract_gdf=census_tract_gdf\n", - " )\n", - "\n", - " # Join the tract IDs back on the original dataframe \n", - " # Join using the index \n", - " print(coordinate_df)\n", - " \n", - " return tract_results\n", - "\n", - "\n", - "x = get_census_tracts_for_dataframe_with_lat_long(coordinate_df=mines_unique_df)\n", - "\n", - "print(x)\n", - "# print(coordinate_df)" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "id": "61c24c7d", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "15289d6c40b144b1b163317e5f4abbb0", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(HBox(children=(IntProgress(value=0, description='0.00%', max=25), Label(value='0 / 25'))), HBox…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-130 55.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.4 33.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.2 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.6 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.1 33.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.6 34.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.2 33.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.4 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.5 34.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.5 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87 33.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.4 33.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.8 34.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.7 34.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87 33)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-88 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 33.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.7 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87 33.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.8 34.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.4 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.7 34.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.3 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.4 33.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.1 33.7)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.3 33.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.8 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.1 33.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.5 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 33.8)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.7 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.9 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.6 34.1)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.5 34.3)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.6 33.6)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.3 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.5 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.9 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.8 34)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.2 33.6)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.6 34.4)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.8 33.9)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.2 33.2)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-85.7 34.5)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-86.6 33.3)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.3 33.3)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n", - "/var/folders/lx/xmq8p65j71v9xq2bhsd2j5w40000gp/T/ipykernel_13151/544546657.py:51: DeprecationWarning: Warning: no tract matches for POINT (-87.1 33)\n", - " lambda frame: get_census_tract_for_one_coordinate(\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2 02170000401\n", - "6 02261000100\n", - "12 02170000200\n", - "25 02170001300\n", - "30 02170000200\n", - " ... \n", - "2501 None\n", - "2510 None\n", - "2515 None\n", - "2524 None\n", - "2544 None\n", - "Length: 100, dtype: object\n" - ] - } - ], - "source": [ - "result_gdf = get_census_tracts_for_geom_points(\n", - " points_gdf=mines_gdf, census_tract_gdf=census_tract_gdf\n", - ")\n", - "\n", - "print(result_gdf)" - ] - }, { "cell_type": "code", "execution_count": null, - "id": "836b73e3", + "id": "d234631e", "metadata": {}, "outputs": [], "source": [ - "# # TODO: add this to requirements txt / poetry install\n", - "# # import censusgeocode as cg\n", + "print(mines_unique_df)\n", "\n", - "# from censusgeocode import CensusGeocode\n", + "mines_unique_df2 = mines_unique_df\n", "\n", - "# # Make sure to use 2010 Census tracts\n", - "# cg = CensusGeocode(benchmark=\"Public_AR_Current\", vintage=\"Census2010_Current\")\n", - "# # cg.onelineaddress(foobar)\n", + "x = get_census_tracts_for_dataframe_with_lat_long(coordinates_df=mines_unique_df2)\n", "\n", - "# long = -149.8\n", - "# lat = 61.6\n", - "\n", - "\n", - "# def get_census_tract_for_one_coordinate(lat: float, long: float) -> str:\n", - "# \"\"\"Returns the 2010 census tract ID for a single lat/long coordinate.\"\"\"\n", - "# census_tracts_field_in_api_response = \"Census Tracts\"\n", - "\n", - "# print(f\"Attempting for {lat} and {long}.\")\n", - "# result = cg.coordinates(x=long, y=lat)\n", - "\n", - "# if census_tracts_field_in_api_response not in result:\n", - "# raise ValueError(\n", - "# f\"Geocoding error: no tracts returned for {lat} and {long}. \\n\"\n", - "# f\"Full response is: {result}\"\n", - "# )\n", - "\n", - "# tract_results = result[census_tracts_field_in_api_response]\n", - "\n", - "# if len(tract_results) > 1:\n", - "# raise ValueError(\n", - "# f\"Geocoding error: too many tracts returned for {lat} and {long}.\"\n", - "# )\n", - "# elif len(tract_results) == 0:\n", - "# raise ValueError(f\"Geocoding error: no tracts returned for {lat} and {long}.\")\n", - "# else:\n", - "# return str(tract_results[0][\"GEOID\"])\n", - "\n", - "\n", - "# get_census_tract_for_one_coordinate(lat=lat, long=long)\n", - "\n", - "\n", - "# def get_census_tracts_for_coordinate_dataframe(\n", - "# coordinate_df: pd.DataFrame,\n", - "# latitude_column: str = LAT_FIELD,\n", - "# longitude_column: str = LONG_FIELD,\n", - "# ):\n", - "# result_df = coordinate_df.progress_apply(lambda frame: get_census_tract_for_one_coordinate(lat=frame[LAT_FIELD], long=frame[LONG_FIELD]), axis=1)\n", - "# return result_df\n", - "\n", - "# print(get_census_tracts_for_coordinate_dataframe(coordinate_df=mines_unique_df))" + "print(x)\n", + "# print(coordinate_df)" ] } ],