Skip to content

Instantly share code, notes, and snippets.

@renanxcortes
Created May 16, 2019 23:29
Show Gist options
  • Save renanxcortes/004714e4e783b699f0e7dc6cb530aa1b to your computer and use it in GitHub Desktop.
Save renanxcortes/004714e4e783b699f0e7dc6cb530aa1b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Auxiliary function:"
]
},
{
"cell_type": "code",
"execution_count": 117,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 118,
"metadata": {},
"outputs": [],
"source": [
"def _check_presence_of_crs(geoinput):\n",
" \"\"\"check if there is crs in the polygon/geodataframe\"\"\"\n",
" if (geoinput.crs is None):\n",
" raise KeyError('The polygon/geodataframe does not have a Coordinate Reference System (CRS). This must be set before using this function.')\n",
" \n",
" # Since the CRS can be an empty dictionary:\n",
" if (len(geoinput.crs) == 0):\n",
" raise KeyError('The polygon/geodataframe does not have a Coordinate Reference System (CRS). This must be set before using this function.')"
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [],
"source": [
"def _check_crs(source_df, target_df):\n",
" \"\"\"check if crs is identical\"\"\"\n",
" if not (source_df.crs == target_df.crs):\n",
" print(\"Source and target dataframes have different crs. Please correct.\")\n",
" return False\n",
" return True"
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {},
"outputs": [],
"source": [
"#df = pd.read_csv('C:/Users/renan/Desktop/scan_line_JAVA/data_US.csv')\n",
"df = pd.read_csv('C:/Users/renan/Desktop/scan_line_JAVA/data_US.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# First Scanline: count pixel types on source geometries"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import tempfile\n",
"import pandas as pd\n",
"import geopandas as gpd\n",
"from subprocess import run\n",
"from shapely import wkt\n",
"import rasterio\n",
"\n",
"# Function that will return all count of all pixel types\n",
"def scanlines_count_pixels(source_gdf, raster_path):\n",
" \n",
" t0_aux = time.time()\n",
" \n",
" _check_presence_of_crs(source_gdf)\n",
" \n",
" print('Opening raster metadata...')\n",
" raster = rasterio.open(raster_path)\n",
" \n",
" print('Matching both crs\\'s (reprojecting source_gdf to raster)...')\n",
" source_gdf = source_gdf.to_crs(crs = raster.crs.data)\n",
" \n",
" # Check if Operational System is Windows\n",
" if os.name == 'nt':\n",
" sep_cmd = ';'\n",
" sep_dir = '\\\\'\n",
" else:\n",
" sep_cmd = ':'\n",
" sep_dir = '/'\n",
"\n",
" if ('geometry' not in source_gdf.columns):\n",
" source_gdf['geometry'] = source_gdf[source_gdf._geometry_column_name]\n",
" source_gdf = source_gdf.drop([source_gdf._geometry_column_name], axis = 1)\n",
" source_gdf = source_gdf.set_geometry('geometry')\n",
" \n",
" # Create Temporary Directory\n",
" source_gdf_temp_dir = tempfile.mkdtemp()\n",
" \n",
" # parquet like internal file\n",
" print('Starting to create well-known text (wkt) of geometries...')\n",
" source_gdf['geometry_wkt'] = source_gdf['geometry'].apply(lambda x: x.wkt) # Create well-know text (raw text) for the geometry column\n",
" source_gdf = source_gdf.drop(['geometry'], axis = 1)\n",
" source_gdf_temp_file_name = source_gdf_temp_dir + '{}source_gdf_temp.parquet'.format(sep_dir)\n",
" \n",
" # Just extract the useful column for optimization\n",
" source_gdf = source_gdf[['geometry_wkt']]\n",
" \n",
" print('Starting to convert the GeoDataFrame to a temporary file...')\n",
" source_gdf.to_parquet(source_gdf_temp_file_name)\n",
" \n",
" t1_aux = time.time()\n",
" \n",
" print('Time of preparation before scanline (in seconds): {}'.format(t1_aux - t0_aux))\n",
" \n",
" cmd = \"java -client -cp dependency{}*{}ucrspatial-4.0-SNAPSHOT.jar histogram {} {}\".format(sep_dir,\n",
" sep_cmd, \n",
" raster_path, \n",
" source_gdf_temp_file_name)\n",
" \n",
" print('Starting to perform the scanline...')\n",
" t0_aux = time.time()\n",
" run(cmd, shell = True, check = True) # Will generate an parquet for output: histogram.parquet\n",
" t1_aux = time.time()\n",
" print('Scanline: Done.')\n",
" print('Time of scanline itself (in seconds): {}'.format(t1_aux - t0_aux))\n",
" \n",
" #os.remove(source_gdf_temp_file_name)\n",
" #os.rmdir(source_gdf_temp_dir)\n",
" \n",
" profile_df = pd.read_parquet(\"histogram.parquet\")\n",
" \n",
" os.remove(\"histogram.parquet\")\n",
" \n",
" return profile_df"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"16.666666666666668"
]
},
"execution_count": 133,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"1000/60"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {},
"outputs": [],
"source": [
"#source_gdf[['geometry_wkt']]"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [],
"source": [
"import pickle\n",
"tracts_usa = pickle.load(open('tracts_US.pkl', 'rb'))"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [],
"source": [
"#tracts_usa.to_parquet('test.parquet')"
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'AeronavFAA': 'r',\n",
" 'ARCGEN': 'r',\n",
" 'BNA': 'raw',\n",
" 'DXF': 'raw',\n",
" 'CSV': 'raw',\n",
" 'OpenFileGDB': 'r',\n",
" 'ESRI Shapefile': 'raw',\n",
" 'GeoJSON': 'rw',\n",
" 'GPKG': 'rw',\n",
" 'GML': 'raw',\n",
" 'GPX': 'raw',\n",
" 'GPSTrackMaker': 'raw',\n",
" 'Idrisi': 'r',\n",
" 'MapInfo File': 'raw',\n",
" 'DGN': 'raw',\n",
" 'PCIDSK': 'r',\n",
" 'S57': 'r',\n",
" 'SEGY': 'r',\n",
" 'SUA': 'r'}"
]
},
"execution_count": 125,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import fiona\n",
"fiona.supported_drivers"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [],
"source": [
"raster_us_path = 'C:\\\\Users\\\\renan\\\\Desktop\\\\scan_line_JAVA\\\\nlcd_compressedto.tif'"
]
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening raster metadata...\n",
"Matching both crs's (reprojecting source_gdf to raster)...\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-139-f4f2be4a233a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m#t0 = time.time()\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mscanline_result\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mscanlines_count_pixels\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtracts_usa\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mraster_us_path\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[1;31m#t1 = time.time()\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;31m#print('Time (in seconds): {}'.format(t1 - t0))\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m<ipython-input-138-dab84cbcbcee>\u001b[0m in \u001b[0;36mscanlines_count_pixels\u001b[1;34m(source_gdf, raster_path)\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 19\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Matching both crs\\'s (reprojecting source_gdf to raster)...'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 20\u001b[1;33m \u001b[0msource_gdf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msource_gdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_crs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcrs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mraster\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcrs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 21\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[1;31m# Check if Operational System is Windows\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\geopandas\\geodataframe.py\u001b[0m in \u001b[0;36mto_crs\u001b[1;34m(self, crs, epsg, inplace)\u001b[0m\n\u001b[0;32m 441\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 442\u001b[0m \u001b[0mdf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 443\u001b[1;33m \u001b[0mgeom\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgeometry\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_crs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcrs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcrs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mepsg\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mepsg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 444\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgeometry\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgeom\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 445\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcrs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgeom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcrs\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\geopandas\\geoseries.py\u001b[0m in \u001b[0;36mto_crs\u001b[1;34m(self, crs, epsg)\u001b[0m\n\u001b[0;32m 306\u001b[0m \u001b[0mproj_out\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpyproj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mProj\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcrs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpreserve_units\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 307\u001b[0m \u001b[0mproject\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpartial\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpyproj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mproj_in\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mproj_out\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 308\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mgeom\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mtransform\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mproject\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgeom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 309\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__class__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mGeoSeries\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 310\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcrs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcrs\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\core\\series.py\u001b[0m in \u001b[0;36mapply\u001b[1;34m(self, func, convert_dtype, args, **kwds)\u001b[0m\n\u001b[0;32m 3192\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3193\u001b[0m \u001b[0mvalues\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3194\u001b[1;33m \u001b[0mmapped\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmap_infer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconvert\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mconvert_dtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3195\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3196\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmapped\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmapped\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mSeries\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mpandas/_libs/src\\inference.pyx\u001b[0m in \u001b[0;36mpandas._libs.lib.map_infer\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\geopandas\\geoseries.py\u001b[0m in \u001b[0;36m<lambda>\u001b[1;34m(geom)\u001b[0m\n\u001b[0;32m 306\u001b[0m \u001b[0mproj_out\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpyproj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mProj\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcrs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpreserve_units\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 307\u001b[0m \u001b[0mproject\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpartial\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpyproj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mproj_in\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mproj_out\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 308\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;32mlambda\u001b[0m \u001b[0mgeom\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mtransform\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mproject\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgeom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 309\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__class__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mGeoSeries\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 310\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcrs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcrs\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\shapely\\ops.py\u001b[0m in \u001b[0;36mtransform\u001b[1;34m(func, geom)\u001b[0m\n\u001b[0;32m 232\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mgeom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'Polygon'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 233\u001b[0m shell = type(geom.exterior)(\n\u001b[1;32m--> 234\u001b[1;33m zip(*func(*izip(*geom.exterior.coords))))\n\u001b[0m\u001b[0;32m 235\u001b[0m holes = list(type(ring)(zip(*func(*izip(*ring.coords))))\n\u001b[0;32m 236\u001b[0m for ring in geom.interiors)\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\shapely\\speedups\\_speedups.pyx\u001b[0m in \u001b[0;36mcoordseq_iter\u001b[1;34m()\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\shapely\\coords.py\u001b[0m in \u001b[0;36m__len__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 47\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 48\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 49\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_update\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 50\u001b[0m \u001b[0mcs_len\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mc_uint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 51\u001b[0m \u001b[0mlgeos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mGEOSCoordSeq_getSize\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_cseq\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbyref\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcs_len\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\shapely\\coords.py\u001b[0m in \u001b[0;36m_update\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 44\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_update\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_ndim\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__p__\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_ndim\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 46\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_cseq\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlgeos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mGEOSGeom_getCoordSeq\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__p__\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_geom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 47\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 48\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"#t0 = time.time()\n",
"scanline_result = scanlines_count_pixels(tracts_usa, raster_us_path)\n",
"#t1 = time.time()\n",
"#print('Time (in seconds): {}'.format(t1 - t0))"
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening raster metadata...\n",
"Matching both crs's (reprojecting source_gdf to raster)...\n",
"Starting to create well-known text (wkt) of geometries...\n",
"Starting to convert the GeoDataFrame to a temporary file...\n",
"Time of preparation before scanline (in seconds): 2.7382736206054688\n",
"Starting to perform the scanline...\n",
"Scanline: Done.\n",
"Time of just scanline (in seconds): 38.35337805747986\n",
"Time (in seconds): 41.14784550666809\n"
]
}
],
"source": [
"t0 = time.time()\n",
"scanline_result = scanlines_count_pixels(pa_usa, raster_pa_path)\n",
"t1 = time.time()\n",
"print('Time (in seconds): {}'.format(t1 - t0))"
]
},
{
"cell_type": "code",
"execution_count": 132,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening raster metadata...\n",
"Matching both crs's (reprojecting source_gdf to raster)...\n",
"Starting to create well-known text (wkt) of geometries...\n",
"Starting to convert the GeoDataFrame to a temporary file...\n",
"Starting to perform the scanline...\n",
"Scanline: Done.\n",
"Time (in seconds): 41.715901613235474\n"
]
}
],
"source": [
"t0 = time.time()\n",
"scanline_result = scanlines_count_pixels(pa_usa, raster_pa_path)\n",
"t1 = time.time()\n",
"print('Time (in seconds): {}'.format(t1 - t0))"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"46.0"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"2760/60"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [],
"source": [
"# tracts_usa.to_file(\"test.parquet\", driver=\"parquet\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'epsg:4326'"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tracts_usa.crs['init']"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'init': 'epsg:4326'}"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tracts_usa.crs"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"shapely.geometry.point.Point"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(tracts_usa.centroid[0])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array('d', [-86.52600009283715]), array('d', [32.41334215316989]))"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tracts_usa.centroid[0].coords.xy"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"#tracts_usa.centroid.x"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"raster_path = 'C:\\\\Users\\\\renan\\\\Desktop\\\\scan_line_JAVA\\\\NLCD2011_LC_Pennsylvania.tif'"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"raster_path = 'C:\\\\Users\\\\renan\\\\Desktop\\\\scan_line_JAVA\\\\nlcd_compressedto.tif'"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>STATEFP10</th>\n",
" <th>COUNTYFP10</th>\n",
" <th>TRACTCE10</th>\n",
" <th>GEOID10</th>\n",
" <th>NAME10</th>\n",
" <th>COUNTY_ID</th>\n",
" <th>county_id2</th>\n",
" <th>COUNTYNS10</th>\n",
" <th>NAME10_COU</th>\n",
" <th>GEOID_MSA</th>\n",
" <th>NAME_MSA</th>\n",
" <th>STATES_MSA</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>01</td>\n",
" <td>001</td>\n",
" <td>020801</td>\n",
" <td>01001020801</td>\n",
" <td>208.01</td>\n",
" <td>01001</td>\n",
" <td>1001</td>\n",
" <td>161526</td>\n",
" <td>Autauga</td>\n",
" <td>33860</td>\n",
" <td>Montgomery</td>\n",
" <td>AL</td>\n",
" <td>POLYGON ((-86.456273 32.405837, -86.4570349999...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>01</td>\n",
" <td>001</td>\n",
" <td>020802</td>\n",
" <td>01001020802</td>\n",
" <td>208.02</td>\n",
" <td>01001</td>\n",
" <td>1001</td>\n",
" <td>161526</td>\n",
" <td>Autauga</td>\n",
" <td>33860</td>\n",
" <td>Montgomery</td>\n",
" <td>AL</td>\n",
" <td>POLYGON ((-86.412497 32.589422, -86.412442 32....</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>01</td>\n",
" <td>001</td>\n",
" <td>020200</td>\n",
" <td>01001020200</td>\n",
" <td>202</td>\n",
" <td>01001</td>\n",
" <td>1001</td>\n",
" <td>161526</td>\n",
" <td>Autauga</td>\n",
" <td>33860</td>\n",
" <td>Montgomery</td>\n",
" <td>AL</td>\n",
" <td>POLYGON ((-86.467354 32.459308, -86.46764 32.4...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>01</td>\n",
" <td>001</td>\n",
" <td>020700</td>\n",
" <td>01001020700</td>\n",
" <td>207</td>\n",
" <td>01001</td>\n",
" <td>1001</td>\n",
" <td>161526</td>\n",
" <td>Autauga</td>\n",
" <td>33860</td>\n",
" <td>Montgomery</td>\n",
" <td>AL</td>\n",
" <td>POLYGON ((-86.46106999999999 32.42709, -86.461...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>01</td>\n",
" <td>001</td>\n",
" <td>020600</td>\n",
" <td>01001020600</td>\n",
" <td>206</td>\n",
" <td>01001</td>\n",
" <td>1001</td>\n",
" <td>161526</td>\n",
" <td>Autauga</td>\n",
" <td>33860</td>\n",
" <td>Montgomery</td>\n",
" <td>AL</td>\n",
" <td>POLYGON ((-86.470524 32.456117, -86.4700469999...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" STATEFP10 COUNTYFP10 TRACTCE10 GEOID10 NAME10 COUNTY_ID county_id2 \\\n",
"0 01 001 020801 01001020801 208.01 01001 1001 \n",
"1 01 001 020802 01001020802 208.02 01001 1001 \n",
"2 01 001 020200 01001020200 202 01001 1001 \n",
"3 01 001 020700 01001020700 207 01001 1001 \n",
"4 01 001 020600 01001020600 206 01001 1001 \n",
"\n",
" COUNTYNS10 NAME10_COU GEOID_MSA NAME_MSA STATES_MSA \\\n",
"0 161526 Autauga 33860 Montgomery AL \n",
"1 161526 Autauga 33860 Montgomery AL \n",
"2 161526 Autauga 33860 Montgomery AL \n",
"3 161526 Autauga 33860 Montgomery AL \n",
"4 161526 Autauga 33860 Montgomery AL \n",
"\n",
" geometry \n",
"0 POLYGON ((-86.456273 32.405837, -86.4570349999... \n",
"1 POLYGON ((-86.412497 32.589422, -86.412442 32.... \n",
"2 POLYGON ((-86.467354 32.459308, -86.46764 32.4... \n",
"3 POLYGON ((-86.46106999999999 32.42709, -86.461... \n",
"4 POLYGON ((-86.470524 32.456117, -86.4700469999... "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tracts_usa.head()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"pa_usa = tracts_usa[tracts_usa['STATEFP10'] == '42']"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x24117ec0160>"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"pa_usa.plot()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3218"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(pa_usa)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"raster_pa_path = 'C:\\\\Users\\\\renan\\\\Desktop\\\\scan_line_JAVA\\\\NLCD2011_LC_Pennsylvania.tif'"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"import time"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening raster metadata...\n",
"Matching both crs's (reprojecting source_gdf to raster)...\n",
"Starting to create well-known text (wkt) of geometries...\n",
"Starting to convert the GeoDataFrame to a temporary file...\n",
"Starting to perform the scanline...\n",
"Scanline: Done.\n",
"Time (in seconds): 53.62997364997864\n"
]
}
],
"source": [
"t0 = time.time()\n",
"scanline_result = scanlines_count_pixels(pa_usa, raster_pa_path)\n",
"t1 = time.time()\n",
"print('Time (in seconds): {}'.format(t1 - t0))"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Type_0</th>\n",
" <th>Type_1</th>\n",
" <th>Type_2</th>\n",
" <th>Type_3</th>\n",
" <th>Type_4</th>\n",
" <th>Type_5</th>\n",
" <th>Type_6</th>\n",
" <th>Type_7</th>\n",
" <th>Type_8</th>\n",
" <th>Type_9</th>\n",
" <th>...</th>\n",
" <th>Type_246</th>\n",
" <th>Type_247</th>\n",
" <th>Type_248</th>\n",
" <th>Type_249</th>\n",
" <th>Type_250</th>\n",
" <th>Type_251</th>\n",
" <th>Type_252</th>\n",
" <th>Type_253</th>\n",
" <th>Type_254</th>\n",
" <th>Type_255</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 256 columns</p>\n",
"</div>"
],
"text/plain": [
" Type_0 Type_1 Type_2 Type_3 Type_4 Type_5 Type_6 Type_7 Type_8 \\\n",
"0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 0 \n",
"\n",
" Type_9 ... Type_246 Type_247 Type_248 Type_249 Type_250 \\\n",
"0 0 ... 0 0 0 0 0 \n",
"1 0 ... 0 0 0 0 0 \n",
"2 0 ... 0 0 0 0 0 \n",
"3 0 ... 0 0 0 0 0 \n",
"4 0 ... 0 0 0 0 0 \n",
"\n",
" Type_251 Type_252 Type_253 Type_254 Type_255 \n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
"[5 rows x 256 columns]"
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scanline_result.head()"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>index</th>\n",
" <th>STATEFP10</th>\n",
" <th>COUNTYFP10</th>\n",
" <th>TRACTCE10</th>\n",
" <th>GEOID10</th>\n",
" <th>NAME10</th>\n",
" <th>COUNTY_ID</th>\n",
" <th>county_id2</th>\n",
" <th>COUNTYNS10</th>\n",
" <th>NAME10_COU</th>\n",
" <th>...</th>\n",
" <th>Type_248</th>\n",
" <th>Type_249</th>\n",
" <th>Type_250</th>\n",
" <th>Type_251</th>\n",
" <th>Type_252</th>\n",
" <th>Type_253</th>\n",
" <th>Type_254</th>\n",
" <th>Type_255</th>\n",
" <th>fake_population</th>\n",
" <th>fake_population2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>55346</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030800</td>\n",
" <td>42001030800</td>\n",
" <td>308</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>16</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>55347</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030400</td>\n",
" <td>42001030400</td>\n",
" <td>304</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>11</td>\n",
" <td>27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>55348</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030300</td>\n",
" <td>42001030300</td>\n",
" <td>303</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>27</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>55349</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030500</td>\n",
" <td>42001030500</td>\n",
" <td>305</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>28</td>\n",
" <td>29</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>55350</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030700</td>\n",
" <td>42001030700</td>\n",
" <td>307</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>22</td>\n",
" <td>31</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 272 columns</p>\n",
"</div>"
],
"text/plain": [
" index STATEFP10 COUNTYFP10 TRACTCE10 GEOID10 NAME10 COUNTY_ID \\\n",
"0 55346 42 001 030800 42001030800 308 42001 \n",
"1 55347 42 001 030400 42001030400 304 42001 \n",
"2 55348 42 001 030300 42001030300 303 42001 \n",
"3 55349 42 001 030500 42001030500 305 42001 \n",
"4 55350 42 001 030700 42001030700 307 42001 \n",
"\n",
" county_id2 COUNTYNS10 NAME10_COU ... Type_248 Type_249 \\\n",
"0 42001 1213656 Adams ... 0 0 \n",
"1 42001 1213656 Adams ... 0 0 \n",
"2 42001 1213656 Adams ... 0 0 \n",
"3 42001 1213656 Adams ... 0 0 \n",
"4 42001 1213656 Adams ... 0 0 \n",
"\n",
" Type_250 Type_251 Type_252 Type_253 Type_254 Type_255 fake_population \\\n",
"0 0 0 0 0 0 0 16 \n",
"1 0 0 0 0 0 0 11 \n",
"2 0 0 0 0 0 0 27 \n",
"3 0 0 0 0 0 0 28 \n",
"4 0 0 0 0 0 0 22 \n",
"\n",
" fake_population2 \n",
"0 28 \n",
"1 27 \n",
"2 24 \n",
"3 29 \n",
"4 31 \n",
"\n",
"[5 rows x 272 columns]"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"profiled_df = pd.concat([pa_usa.reset_index(), \n",
" scanline_result], \n",
" axis = 1)\n",
"\n",
"profiled_df['fake_population'] = np.round(np.random.chisquare(df = 30, size = len(profiled_df)),0).astype(int)\n",
"profiled_df['fake_population2'] = np.round(np.random.chisquare(df = 30, size = len(profiled_df)),0).astype(int)\n",
"profiled_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Type_21 0.000090\n",
"Type_22 0.000361\n",
"Type_23 0.001544\n",
"Type_24 -0.000853\n",
"dtype: float64"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import statsmodels.formula.api as smf\n",
"from statsmodels.genmod.families import Poisson, Gaussian\n",
"\n",
"pop_string = 'fake_population' #1'\n",
"codes = [21, 22, 23, 24]\n",
"codes.sort()\n",
"\n",
"str_codes = [str(i) for i in codes] \n",
"formula_string = pop_string + ' ~ -1 + ' + \" + \".join(['Type_' + s for s in str_codes])\n",
"\n",
"results = smf.glm(formula_string, data = profiled_df, family = Poisson()).fit()\n",
"results.params"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 9.03258334e-05, 3.60764942e-04, 1.54417327e-03, -8.52747883e-04])"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array(results.params)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>geometry</th>\n",
" <th>CT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>POLYGON ((-76.998583 39.831385, -77.001172 39....</td>\n",
" <td>4.704783</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.41122 39.9...</td>\n",
" <td>3.863297</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.4037879999...</td>\n",
" <td>12.201578</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>POLYGON ((-77.22819199999999 39.890231, -77.24...</td>\n",
" <td>12.863560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>POLYGON ((-77.049916 39.82896, -77.04902199999...</td>\n",
" <td>8.857106</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry CT\n",
"0 POLYGON ((-76.998583 39.831385, -77.001172 39.... 4.704783\n",
"1 POLYGON ((-77.421362 39.981294, -77.41122 39.9... 3.863297\n",
"2 POLYGON ((-77.421362 39.981294, -77.4037879999... 12.201578\n",
"3 POLYGON ((-77.22819199999999 39.890231, -77.24... 12.863560\n",
"4 POLYGON ((-77.049916 39.82896, -77.04902199999... 8.857106"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Multiplying the pixel count with the respective weights from the regression\n",
"ReLU_weights = np.where(np.array(results.params) < 0, 0, np.array(results.params))\n",
"\n",
"# Correction Term (CT)\n",
"profiled_df['denominator'] = (np.array(profiled_df[['Type_' + s for s in str_codes]]) * ReLU_weights).sum(axis = 1)\n",
"profiled_df['CT'] = profiled_df['fake_population'] / profiled_df['denominator']\n",
"#profiled_df['CT2'] = profiled_df['fake_population2'] / profiled_df['denominator']\n",
"scan_line_input_CT = profiled_df[['geometry', 'CT']] #, 'CT2']]\n",
"scan_line_input_CT.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"n_pixels_option_values = 256\n",
"long_weights = np.zeros(n_pixels_option_values)\n",
"long_weights[codes] = results.params\n",
"long_ReLU_weights = np.where(long_weights < 0, 0, long_weights)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 9.03258334e-05, 3.60764942e-04, 1.54417327e-03,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00])"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"long_ReLU_weights[0:30]"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [],
"source": [
"np.savetxt(\"input_weights.csv\", long_ReLU_weights, delimiter=\",\")"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x24155fb1b70>"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"merged_gdf = profiled_df\n",
"from shapely.ops import cascaded_union\n",
"boundary = gpd.GeoSeries(cascaded_union(merged_gdf.geometry)).buffer(0.001) # The 'buffer' method prevents some unusual points inside the state\n",
"pa_region_pre = gpd.GeoDataFrame(gpd.GeoSeries(boundary))\n",
"pa_region = pa_region_pre.rename(columns={0:'geometry'}).set_geometry('geometry')\n",
"pa_region.plot(edgecolor = 'black')"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x2415624f438>"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from shapely.geometry import Polygon\n",
"\n",
"low_left = -81\n",
"low_right = -74\n",
"up_left = 38\n",
"up_right = 43\n",
"\n",
"thickness = 60\n",
"\n",
"# This snippet was inspired in https://github.com/pysal/libpysal/blob/aa7882e7877b962f4269ea86a612dfc58152e5c6/libpysal/weights/user.py#L95\n",
"aux = list()\n",
"for i in np.linspace(low_left, low_right, num = thickness):\n",
" for j in np.linspace(up_left, up_right, num = thickness):\n",
" \n",
" # Each width 'jump' must be at the same order of the grid constructed\n",
" ll = i, j\n",
" ul = i, j + np.diff(np.linspace(up_left, up_right, num = thickness))[0]\n",
" ur = i + np.diff(np.linspace(low_left, low_right, num = thickness))[0], j + np.diff(np.linspace(up_left, up_right, num = thickness))[0]\n",
" lr = i + np.diff(np.linspace(low_left, low_right, num = thickness))[0], j\n",
" aux.append(Polygon([ll, ul, ur, lr, ll]))\n",
" \n",
"polys2 = gpd.GeoSeries(aux)\n",
"\n",
"envgdf = gpd.GeoDataFrame(polys2)\n",
"envgdf_final = envgdf.rename(columns={0:'geometry'}).set_geometry('geometry')\n",
"envgdf_final.plot(edgecolor = 'black')"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x24156c365c0>"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"res_union = gpd.overlay(pa_region, envgdf_final, how='intersection')\n",
"res_union.plot(edgecolor = 'black')"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'init': 'epsg:4326'}"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res_union.crs = merged_gdf.crs\n",
"res_union.crs"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>geometry</th>\n",
" <th>CT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>POLYGON ((-76.998583 39.831385, -77.001172 39....</td>\n",
" <td>4.704783</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.41122 39.9...</td>\n",
" <td>3.863297</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.4037879999...</td>\n",
" <td>12.201578</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>POLYGON ((-77.22819199999999 39.890231, -77.24...</td>\n",
" <td>12.863560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>POLYGON ((-77.049916 39.82896, -77.04902199999...</td>\n",
" <td>8.857106</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry CT\n",
"0 POLYGON ((-76.998583 39.831385, -77.001172 39.... 4.704783\n",
"1 POLYGON ((-77.421362 39.981294, -77.41122 39.9... 3.863297\n",
"2 POLYGON ((-77.421362 39.981294, -77.4037879999... 12.201578\n",
"3 POLYGON ((-77.22819199999999 39.890231, -77.24... 12.863560\n",
"4 POLYGON ((-77.049916 39.82896, -77.04902199999... 8.857106"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scan_line_input_CT.head()"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [],
"source": [
"filter_col = [col for col in scan_line_input_CT if (col.startswith('foo') or col == 'geometry')]"
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 9.03258334e-05, 3.60764942e-04, 1.54417327e-03,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
" 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00])"
]
},
"execution_count": 110,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"long_ReLU_weights"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['geometry']"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"filter_col"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([False, True])"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scan_line_input_CT.columns.str.startswith('CT')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"scan_line_input_CT.head()"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>geometry</th>\n",
" <th>CT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>POLYGON ((-76.998583 39.831385, -77.001172 39....</td>\n",
" <td>4.704783</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.41122 39.9...</td>\n",
" <td>3.863297</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.4037879999...</td>\n",
" <td>12.201578</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>POLYGON ((-77.22819199999999 39.890231, -77.24...</td>\n",
" <td>12.863560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>POLYGON ((-77.049916 39.82896, -77.04902199999...</td>\n",
" <td>8.857106</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry CT\n",
"0 POLYGON ((-76.998583 39.831385, -77.001172 39.... 4.704783\n",
"1 POLYGON ((-77.421362 39.981294, -77.41122 39.9... 3.863297\n",
"2 POLYGON ((-77.421362 39.981294, -77.4037879999... 12.201578\n",
"3 POLYGON ((-77.22819199999999 39.890231, -77.24... 12.863560\n",
"4 POLYGON ((-77.049916 39.82896, -77.04902199999... 8.857106"
]
},
"execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scan_line_input_CT.head()"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Opening raster metadata...\n",
"Matching both crs's (reprojecting source_CTs to raster)...\n",
"...reprojecting target_gdf to raster)...\n",
"Starting to create well-known text (wkt) of geometries...\n",
"Starting to convert the GeoDataFrame to a temporary file...\n",
"Source CT: Starting to create well-known text (wkt) of geometries...\n",
"Starting to convert the GeoDataFrame to a temporary file...\n",
"Starting to perform the scanline...\n",
"Scanline: Done.\n"
]
}
],
"source": [
"interpolate = scanlines_interpolate(target_gdf = res_union, \n",
" source_CTs = scan_line_input_CT, \n",
" weights_long = long_ReLU_weights, \n",
" raster_path = raster_pa_path)"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>target</th>\n",
" <th>Attribute</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>4.664149e+25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>1.367635e+32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>1.266411e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>7.262722e+01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>5.107726e+11</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" target Attribute\n",
"0 0 4.664149e+25\n",
"1 1 1.367635e+32\n",
"2 2 1.266411e+00\n",
"3 3 7.262722e+01\n",
"4 4 5.107726e+11"
]
},
"execution_count": 116,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"interpolate.head()"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1349"
]
},
"execution_count": 101,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(interpolate)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [],
"source": [
"interpolate_df = pd.concat([res_union.reset_index(), \n",
" interpolate], \n",
" axis = 1)"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"inf"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scan_line_input_CT['CT'].max()"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 4.664149e+25\n",
"1 1.367635e+32\n",
"2 1.266411e+00\n",
"3 7.262722e+01\n",
"4 5.107726e+11\n",
"5 9.477029e+12\n",
"6 6.583710e+10\n",
"7 1.981627e+04\n",
"8 2.797599e+12\n",
"9 6.738664e-01\n",
"10 1.261287e-01\n",
"11 5.138152e+08\n",
"12 2.994617e+07\n",
"13 4.030094e+02\n",
"14 1.387449e+01\n",
"15 2.323558e+13\n",
"16 2.273110e+07\n",
"17 1.000730e+13\n",
"18 1.488625e+07\n",
"19 2.249241e+05\n",
"20 1.422512e+08\n",
"21 9.545340e+08\n",
"22 3.299955e-01\n",
"23 4.721575e+03\n",
"24 1.803238e+06\n",
"25 9.380497e+01\n",
"26 3.890175e+04\n",
"27 5.752812e+06\n",
"28 4.257493e+06\n",
"29 2.468262e+01\n",
" ... \n",
"1319 6.326918e+02\n",
"1320 NaN\n",
"1321 6.992988e+03\n",
"1322 3.216074e+04\n",
"1323 2.736273e+02\n",
"1324 inf\n",
"1325 2.709456e+07\n",
"1326 NaN\n",
"1327 1.028837e+04\n",
"1328 NaN\n",
"1329 NaN\n",
"1330 inf\n",
"1331 NaN\n",
"1332 NaN\n",
"1333 4.554464e+19\n",
"1334 NaN\n",
"1335 NaN\n",
"1336 NaN\n",
"1337 NaN\n",
"1338 NaN\n",
"1339 NaN\n",
"1340 NaN\n",
"1341 NaN\n",
"1342 NaN\n",
"1343 NaN\n",
"1344 NaN\n",
"1345 NaN\n",
"1346 NaN\n",
"1347 NaN\n",
"1348 NaN\n",
"Name: Attribute, Length: 1349, dtype: float64"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"interpolate_df['`Attribute']"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 4.704783\n",
"1 3.863297\n",
"2 12.201578\n",
"3 12.863560\n",
"4 8.857106\n",
"5 4.294194\n",
"6 9.270937\n",
"7 24.241210\n",
"8 13.753307\n",
"9 35.655362\n",
"10 10.681084\n",
"11 8.899464\n",
"12 14.872320\n",
"13 22.881969\n",
"14 16.837632\n",
"15 22.018855\n",
"16 7.963812\n",
"17 17.803985\n",
"18 20.860698\n",
"19 20.522917\n",
"20 35.138789\n",
"21 7.272067\n",
"22 20.428285\n",
"23 47.547018\n",
"24 81.028910\n",
"25 19.753350\n",
"26 27.457254\n",
"27 41.860047\n",
"28 40.544464\n",
"29 100.046063\n",
" ... \n",
"3188 29.796428\n",
"3189 24.214293\n",
"3190 40.801791\n",
"3191 11.742359\n",
"3192 36.060756\n",
"3193 9.982313\n",
"3194 45.895819\n",
"3195 12.304427\n",
"3196 13.654009\n",
"3197 13.808026\n",
"3198 14.259722\n",
"3199 31.696062\n",
"3200 8.102365\n",
"3201 16.712482\n",
"3202 13.559273\n",
"3203 12.783622\n",
"3204 6.873707\n",
"3205 11.934963\n",
"3206 9.433359\n",
"3207 5.966483\n",
"3208 19.257031\n",
"3209 27.322761\n",
"3210 8.214597\n",
"3211 18.360264\n",
"3212 23.008470\n",
"3213 8.898578\n",
"3214 14.448326\n",
"3215 22.274277\n",
"3216 34.685914\n",
"3217 18.969940\n",
"Name: CT, Length: 3218, dtype: float64"
]
},
"execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scan_line_input_CT['CT']"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'plot' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-94-070566a6e677>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0misnan\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minterpolate_df\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mAttribute\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'plot' is not defined"
]
}
],
"source": [
"plot(np.isnan(np.array(interpolate_df.Attribute)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\renan\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\matplotlib\\colors.py:504: RuntimeWarning: invalid value encountered in less\n",
" xa[xa < 0] = -1\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x24156c30978>"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"interpolate_df.plot(column = 'Attribute', legend = True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9"
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"3*3"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Type_0</th>\n",
" <th>Type_1</th>\n",
" <th>Type_2</th>\n",
" <th>Type_3</th>\n",
" <th>Type_4</th>\n",
" <th>Type_5</th>\n",
" <th>Type_6</th>\n",
" <th>Type_7</th>\n",
" <th>Type_8</th>\n",
" <th>Type_9</th>\n",
" <th>...</th>\n",
" <th>Type_246</th>\n",
" <th>Type_247</th>\n",
" <th>Type_248</th>\n",
" <th>Type_249</th>\n",
" <th>Type_250</th>\n",
" <th>Type_251</th>\n",
" <th>Type_252</th>\n",
" <th>Type_253</th>\n",
" <th>Type_254</th>\n",
" <th>Type_255</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 256 columns</p>\n",
"</div>"
],
"text/plain": [
" Type_0 Type_1 Type_2 Type_3 Type_4 Type_5 Type_6 Type_7 Type_8 \\\n",
"0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 0 \n",
"\n",
" Type_9 ... Type_246 Type_247 Type_248 Type_249 Type_250 \\\n",
"0 0 ... 0 0 0 0 0 \n",
"1 0 ... 0 0 0 0 0 \n",
"2 0 ... 0 0 0 0 0 \n",
"3 0 ... 0 0 0 0 0 \n",
"4 0 ... 0 0 0 0 0 \n",
"\n",
" Type_251 Type_252 Type_253 Type_254 Type_255 \n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
"[5 rows x 256 columns]"
]
},
"execution_count": 105,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test.head()"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3218"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(test)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x24d47806390>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"test.iloc[[0]].sum().plot()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'nt'"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"os.name"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>STATEFP10</th>\n",
" <th>COUNTYFP10</th>\n",
" <th>TRACTCE10</th>\n",
" <th>GEOID10</th>\n",
" <th>NAME10</th>\n",
" <th>COUNTY_ID</th>\n",
" <th>county_id2</th>\n",
" <th>COUNTYNS10</th>\n",
" <th>NAME10_COU</th>\n",
" <th>GEOID_MSA</th>\n",
" <th>NAME_MSA</th>\n",
" <th>STATES_MSA</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>55346</th>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030800</td>\n",
" <td>42001030800</td>\n",
" <td>308</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>23900</td>\n",
" <td>Gettysburg</td>\n",
" <td>PA</td>\n",
" <td>POLYGON ((-76.998583 39.831385, -77.001172 39....</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55347</th>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030400</td>\n",
" <td>42001030400</td>\n",
" <td>304</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>23900</td>\n",
" <td>Gettysburg</td>\n",
" <td>PA</td>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.41122 39.9...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55348</th>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030300</td>\n",
" <td>42001030300</td>\n",
" <td>303</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>23900</td>\n",
" <td>Gettysburg</td>\n",
" <td>PA</td>\n",
" <td>POLYGON ((-77.421362 39.981294, -77.4037879999...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55349</th>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030500</td>\n",
" <td>42001030500</td>\n",
" <td>305</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>23900</td>\n",
" <td>Gettysburg</td>\n",
" <td>PA</td>\n",
" <td>POLYGON ((-77.22819199999999 39.890231, -77.24...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>55350</th>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030700</td>\n",
" <td>42001030700</td>\n",
" <td>307</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>23900</td>\n",
" <td>Gettysburg</td>\n",
" <td>PA</td>\n",
" <td>POLYGON ((-77.049916 39.82896, -77.04902199999...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" STATEFP10 COUNTYFP10 TRACTCE10 GEOID10 NAME10 COUNTY_ID \\\n",
"55346 42 001 030800 42001030800 308 42001 \n",
"55347 42 001 030400 42001030400 304 42001 \n",
"55348 42 001 030300 42001030300 303 42001 \n",
"55349 42 001 030500 42001030500 305 42001 \n",
"55350 42 001 030700 42001030700 307 42001 \n",
"\n",
" county_id2 COUNTYNS10 NAME10_COU GEOID_MSA NAME_MSA STATES_MSA \\\n",
"55346 42001 1213656 Adams 23900 Gettysburg PA \n",
"55347 42001 1213656 Adams 23900 Gettysburg PA \n",
"55348 42001 1213656 Adams 23900 Gettysburg PA \n",
"55349 42001 1213656 Adams 23900 Gettysburg PA \n",
"55350 42001 1213656 Adams 23900 Gettysburg PA \n",
"\n",
" geometry \n",
"55346 POLYGON ((-76.998583 39.831385, -77.001172 39.... \n",
"55347 POLYGON ((-77.421362 39.981294, -77.41122 39.9... \n",
"55348 POLYGON ((-77.421362 39.981294, -77.4037879999... \n",
"55349 POLYGON ((-77.22819199999999 39.890231, -77.24... \n",
"55350 POLYGON ((-77.049916 39.82896, -77.04902199999... "
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pa_usa.head()"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {},
"outputs": [
{
"ename": "OSError",
"evalue": "Passed non-file path: C:\\Users\\renan\\AppData\\Local\\Temp\\tmpxcd_gyx2\\source_gdf_temp.parquet",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mOSError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-91-4f2454811b04>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprofile_df\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread_parquet\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"C:\\\\Users\\\\renan\\\\AppData\\\\Local\\\\Temp\\\\tmpxcd_gyx2\\\\source_gdf_temp.parquet\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\io\\parquet.py\u001b[0m in \u001b[0;36mread_parquet\u001b[1;34m(path, engine, columns, **kwargs)\u001b[0m\n\u001b[0;32m 286\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 287\u001b[0m \u001b[0mimpl\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mget_engine\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mengine\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 288\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mimpl\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\io\\parquet.py\u001b[0m in \u001b[0;36mread\u001b[1;34m(self, path, columns, **kwargs)\u001b[0m\n\u001b[0;32m 129\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'use_pandas_metadata'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 130\u001b[0m result = self.api.parquet.read_table(path, columns=columns,\n\u001b[1;32m--> 131\u001b[1;33m **kwargs).to_pandas()\n\u001b[0m\u001b[0;32m 132\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mshould_close\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 133\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pyarrow\\parquet.py\u001b[0m in \u001b[0;36mread_table\u001b[1;34m(source, columns, use_threads, metadata, use_pandas_metadata, nthreads)\u001b[0m\n\u001b[0;32m 1072\u001b[0m return fs.read_parquet(source, columns=columns,\n\u001b[0;32m 1073\u001b[0m \u001b[0muse_threads\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0muse_threads\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmetadata\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1074\u001b[1;33m use_pandas_metadata=use_pandas_metadata)\n\u001b[0m\u001b[0;32m 1075\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1076\u001b[0m \u001b[0mpf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mParquetFile\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msource\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmetadata\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmetadata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pyarrow\\filesystem.py\u001b[0m in \u001b[0;36mread_parquet\u001b[1;34m(self, path, columns, metadata, schema, use_threads, nthreads, use_pandas_metadata)\u001b[0m\n\u001b[0;32m 180\u001b[0m \u001b[0muse_threads\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_deprecate_nthreads\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muse_threads\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnthreads\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 181\u001b[0m dataset = ParquetDataset(path, schema=schema, metadata=metadata,\n\u001b[1;32m--> 182\u001b[1;33m filesystem=self)\n\u001b[0m\u001b[0;32m 183\u001b[0m return dataset.read(columns=columns, use_threads=use_threads,\n\u001b[0;32m 184\u001b[0m use_pandas_metadata=use_pandas_metadata)\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pyarrow\\parquet.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, path_or_paths, filesystem, schema, metadata, split_row_groups, validate_schema, filters, metadata_nthreads)\u001b[0m\n\u001b[0;32m 858\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommon_metadata_path\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 859\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmetadata_path\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_make_manifest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 860\u001b[1;33m path_or_paths, self.fs, metadata_nthreads=metadata_nthreads)\n\u001b[0m\u001b[0;32m 861\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 862\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcommon_metadata_path\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pyarrow\\parquet.py\u001b[0m in \u001b[0;36m_make_manifest\u001b[1;34m(path_or_paths, fs, pathsep, metadata_nthreads)\u001b[0m\n\u001b[0;32m 1033\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mfs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0misfile\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1034\u001b[0m raise IOError('Passed non-file path: {0}'\n\u001b[1;32m-> 1035\u001b[1;33m .format(path))\n\u001b[0m\u001b[0;32m 1036\u001b[0m \u001b[0mpiece\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mParquetDatasetPiece\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1037\u001b[0m \u001b[0mpieces\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpiece\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mOSError\u001b[0m: Passed non-file path: C:\\Users\\renan\\AppData\\Local\\Temp\\tmpxcd_gyx2\\source_gdf_temp.parquet"
]
}
],
"source": [
"profile_df = pd.read_parquet(\"C:\\\\Users\\\\renan\\\\AppData\\\\Local\\\\Temp\\\\tmpxcd_gyx2\\\\source_gdf_temp.parquet\")"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'DataFrame' object has no attribute 'geometry_wkt'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-68-3df5d4a783bd>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprofile_df\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgeometry_wkt\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 4374\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4375\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 4376\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4377\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4378\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'geometry_wkt'"
]
}
],
"source": [
"profile_df.geometry_wkt[0]"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x24d5fea0da0>"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"pa_tracts = tracts_usa[tracts_usa.STATES_MSA == 'PA']\n",
"%matplotlib inline\n",
"pa_tracts.plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# The expected .jar file will have the dependencies\n",
"# expect parquet as input and output\n",
"# where does the output will live?\n",
"# can we make all the types??? (not only 21, 22, 23 and 24)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [],
"source": [
"# second scanline will use \n",
"## the population variable name (names?)?\n",
"## the corrections terms of original polygons\n",
"## the weights from the regression\n",
"## the new set of polygons\n",
"## the raster again\n",
"\n",
"\n",
"# Questions\n",
"# How to give the weights?\n",
"# Is there a way to give 'Type_' with uppercase T\n",
"\n",
"\n",
"## Important\n",
"## The method require different corrections terms and different weights depending on the variable you're interpolating\n",
"# Let's make it simple in this beggining with only one variable"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>pop10</th>\n",
" <th>type_21</th>\n",
" <th>type_22</th>\n",
" <th>type_23</th>\n",
" <th>type_24</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>3081.0</td>\n",
" <td>5294.0</td>\n",
" <td>1520.0</td>\n",
" <td>768.0</td>\n",
" <td>373.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10435.0</td>\n",
" <td>11934.0</td>\n",
" <td>3748.0</td>\n",
" <td>802.0</td>\n",
" <td>80.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2170.0</td>\n",
" <td>1253.0</td>\n",
" <td>648.0</td>\n",
" <td>331.0</td>\n",
" <td>115.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2891.0</td>\n",
" <td>2575.0</td>\n",
" <td>1602.0</td>\n",
" <td>831.0</td>\n",
" <td>286.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>3668.0</td>\n",
" <td>2657.0</td>\n",
" <td>1501.0</td>\n",
" <td>508.0</td>\n",
" <td>102.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" pop10 type_21 type_22 type_23 type_24\n",
"0 3081.0 5294.0 1520.0 768.0 373.0\n",
"1 10435.0 11934.0 3748.0 802.0 80.0\n",
"2 2170.0 1253.0 648.0 331.0 115.0\n",
"3 2891.0 2575.0 1602.0 831.0 286.0\n",
"4 3668.0 2657.0 1501.0 508.0 102.0"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# From scan_line it is only needed the pixel count\n",
"# Which variable and which land types to use will be handled in the Python side\n",
"profile_df = pd.read_csv('C:\\\\Users\\\\renan\\\\Desktop\\\\scan_line_JAVA\\\\profiled_df.csv')\n",
"profile_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Type_0</th>\n",
" <th>Type_1</th>\n",
" <th>Type_2</th>\n",
" <th>Type_3</th>\n",
" <th>Type_4</th>\n",
" <th>Type_5</th>\n",
" <th>Type_6</th>\n",
" <th>Type_7</th>\n",
" <th>Type_8</th>\n",
" <th>Type_9</th>\n",
" <th>...</th>\n",
" <th>Type_246</th>\n",
" <th>Type_247</th>\n",
" <th>Type_248</th>\n",
" <th>Type_249</th>\n",
" <th>Type_250</th>\n",
" <th>Type_251</th>\n",
" <th>Type_252</th>\n",
" <th>Type_253</th>\n",
" <th>Type_254</th>\n",
" <th>Type_255</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 256 columns</p>\n",
"</div>"
],
"text/plain": [
" Type_0 Type_1 Type_2 Type_3 Type_4 Type_5 Type_6 Type_7 Type_8 \\\n",
"0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 0 \n",
"\n",
" Type_9 ... Type_246 Type_247 Type_248 Type_249 Type_250 \\\n",
"0 0 ... 0 0 0 0 0 \n",
"1 0 ... 0 0 0 0 0 \n",
"2 0 ... 0 0 0 0 0 \n",
"3 0 ... 0 0 0 0 0 \n",
"4 0 ... 0 0 0 0 0 \n",
"\n",
" Type_251 Type_252 Type_253 Type_254 Type_255 \n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
"[5 rows x 256 columns]"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"profile_df = test\n",
"profile_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [],
"source": [
"#profile_df[profile_df.columns[profile_df.columns.str.startswith('type_')]].head()"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [],
"source": [
"#len(profile_df)"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3218"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(pa_usa)"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Type_0</th>\n",
" <th>Type_1</th>\n",
" <th>Type_2</th>\n",
" <th>Type_3</th>\n",
" <th>Type_4</th>\n",
" <th>Type_5</th>\n",
" <th>Type_6</th>\n",
" <th>Type_7</th>\n",
" <th>Type_8</th>\n",
" <th>Type_9</th>\n",
" <th>...</th>\n",
" <th>Type_246</th>\n",
" <th>Type_247</th>\n",
" <th>Type_248</th>\n",
" <th>Type_249</th>\n",
" <th>Type_250</th>\n",
" <th>Type_251</th>\n",
" <th>Type_252</th>\n",
" <th>Type_253</th>\n",
" <th>Type_254</th>\n",
" <th>Type_255</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 256 columns</p>\n",
"</div>"
],
"text/plain": [
" Type_0 Type_1 Type_2 Type_3 Type_4 Type_5 Type_6 Type_7 Type_8 \\\n",
"0 0 0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 0 0 \n",
"\n",
" Type_9 ... Type_246 Type_247 Type_248 Type_249 Type_250 \\\n",
"0 0 ... 0 0 0 0 0 \n",
"1 0 ... 0 0 0 0 0 \n",
"2 0 ... 0 0 0 0 0 \n",
"3 0 ... 0 0 0 0 0 \n",
"4 0 ... 0 0 0 0 0 \n",
"\n",
" Type_251 Type_252 Type_253 Type_254 Type_255 \n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
"[5 rows x 256 columns]"
]
},
"execution_count": 111,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"profile_df[profile_df.columns[profile_df.columns.str.startswith('Type_')]].head()"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>index</th>\n",
" <th>STATEFP10</th>\n",
" <th>COUNTYFP10</th>\n",
" <th>TRACTCE10</th>\n",
" <th>GEOID10</th>\n",
" <th>NAME10</th>\n",
" <th>COUNTY_ID</th>\n",
" <th>county_id2</th>\n",
" <th>COUNTYNS10</th>\n",
" <th>NAME10_COU</th>\n",
" <th>...</th>\n",
" <th>Type_246</th>\n",
" <th>Type_247</th>\n",
" <th>Type_248</th>\n",
" <th>Type_249</th>\n",
" <th>Type_250</th>\n",
" <th>Type_251</th>\n",
" <th>Type_252</th>\n",
" <th>Type_253</th>\n",
" <th>Type_254</th>\n",
" <th>Type_255</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>55346</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030800</td>\n",
" <td>42001030800</td>\n",
" <td>308</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>55347</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030400</td>\n",
" <td>42001030400</td>\n",
" <td>304</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>55348</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030300</td>\n",
" <td>42001030300</td>\n",
" <td>303</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>55349</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030500</td>\n",
" <td>42001030500</td>\n",
" <td>305</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>55350</td>\n",
" <td>42</td>\n",
" <td>001</td>\n",
" <td>030700</td>\n",
" <td>42001030700</td>\n",
" <td>307</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 270 columns</p>\n",
"</div>"
],
"text/plain": [
" index STATEFP10 COUNTYFP10 TRACTCE10 GEOID10 NAME10 COUNTY_ID \\\n",
"0 55346 42 001 030800 42001030800 308 42001 \n",
"1 55347 42 001 030400 42001030400 304 42001 \n",
"2 55348 42 001 030300 42001030300 303 42001 \n",
"3 55349 42 001 030500 42001030500 305 42001 \n",
"4 55350 42 001 030700 42001030700 307 42001 \n",
"\n",
" county_id2 COUNTYNS10 NAME10_COU ... Type_246 Type_247 Type_248 \\\n",
"0 42001 1213656 Adams ... 0 0 0 \n",
"1 42001 1213656 Adams ... 0 0 0 \n",
"2 42001 1213656 Adams ... 0 0 0 \n",
"3 42001 1213656 Adams ... 0 0 0 \n",
"4 42001 1213656 Adams ... 0 0 0 \n",
"\n",
" Type_249 Type_250 Type_251 Type_252 Type_253 Type_254 Type_255 \n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 270 columns]"
]
},
"execution_count": 115,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"profiled_df = pd.concat([pa_usa.reset_index(), \n",
" profile_df[profile_df.columns[profile_df.columns.str.startswith('Type_')]]], \n",
" ignore_index=False, \n",
" axis = 1)\n",
"profiled_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['index',\n",
" 'STATEFP10',\n",
" 'COUNTYFP10',\n",
" 'TRACTCE10',\n",
" 'GEOID10',\n",
" 'NAME10',\n",
" 'COUNTY_ID',\n",
" 'county_id2',\n",
" 'COUNTYNS10',\n",
" 'NAME10_COU',\n",
" 'GEOID_MSA',\n",
" 'NAME_MSA',\n",
" 'STATES_MSA',\n",
" 'geometry',\n",
" 'Type_0',\n",
" 'Type_1',\n",
" 'Type_2',\n",
" 'Type_3',\n",
" 'Type_4',\n",
" 'Type_5',\n",
" 'Type_6',\n",
" 'Type_7',\n",
" 'Type_8',\n",
" 'Type_9',\n",
" 'Type_10',\n",
" 'Type_11',\n",
" 'Type_12',\n",
" 'Type_13',\n",
" 'Type_14',\n",
" 'Type_15',\n",
" 'Type_16',\n",
" 'Type_17',\n",
" 'Type_18',\n",
" 'Type_19',\n",
" 'Type_20',\n",
" 'Type_21',\n",
" 'Type_22',\n",
" 'Type_23',\n",
" 'Type_24',\n",
" 'Type_25',\n",
" 'Type_26',\n",
" 'Type_27',\n",
" 'Type_28',\n",
" 'Type_29',\n",
" 'Type_30',\n",
" 'Type_31',\n",
" 'Type_32',\n",
" 'Type_33',\n",
" 'Type_34',\n",
" 'Type_35',\n",
" 'Type_36',\n",
" 'Type_37',\n",
" 'Type_38',\n",
" 'Type_39',\n",
" 'Type_40',\n",
" 'Type_41',\n",
" 'Type_42',\n",
" 'Type_43',\n",
" 'Type_44',\n",
" 'Type_45',\n",
" 'Type_46',\n",
" 'Type_47',\n",
" 'Type_48',\n",
" 'Type_49',\n",
" 'Type_50',\n",
" 'Type_51',\n",
" 'Type_52',\n",
" 'Type_53',\n",
" 'Type_54',\n",
" 'Type_55',\n",
" 'Type_56',\n",
" 'Type_57',\n",
" 'Type_58',\n",
" 'Type_59',\n",
" 'Type_60',\n",
" 'Type_61',\n",
" 'Type_62',\n",
" 'Type_63',\n",
" 'Type_64',\n",
" 'Type_65',\n",
" 'Type_66',\n",
" 'Type_67',\n",
" 'Type_68',\n",
" 'Type_69',\n",
" 'Type_70',\n",
" 'Type_71',\n",
" 'Type_72',\n",
" 'Type_73',\n",
" 'Type_74',\n",
" 'Type_75',\n",
" 'Type_76',\n",
" 'Type_77',\n",
" 'Type_78',\n",
" 'Type_79',\n",
" 'Type_80',\n",
" 'Type_81',\n",
" 'Type_82',\n",
" 'Type_83',\n",
" 'Type_84',\n",
" 'Type_85',\n",
" 'Type_86',\n",
" 'Type_87',\n",
" 'Type_88',\n",
" 'Type_89',\n",
" 'Type_90',\n",
" 'Type_91',\n",
" 'Type_92',\n",
" 'Type_93',\n",
" 'Type_94',\n",
" 'Type_95',\n",
" 'Type_96',\n",
" 'Type_97',\n",
" 'Type_98',\n",
" 'Type_99',\n",
" 'Type_100',\n",
" 'Type_101',\n",
" 'Type_102',\n",
" 'Type_103',\n",
" 'Type_104',\n",
" 'Type_105',\n",
" 'Type_106',\n",
" 'Type_107',\n",
" 'Type_108',\n",
" 'Type_109',\n",
" 'Type_110',\n",
" 'Type_111',\n",
" 'Type_112',\n",
" 'Type_113',\n",
" 'Type_114',\n",
" 'Type_115',\n",
" 'Type_116',\n",
" 'Type_117',\n",
" 'Type_118',\n",
" 'Type_119',\n",
" 'Type_120',\n",
" 'Type_121',\n",
" 'Type_122',\n",
" 'Type_123',\n",
" 'Type_124',\n",
" 'Type_125',\n",
" 'Type_126',\n",
" 'Type_127',\n",
" 'Type_128',\n",
" 'Type_129',\n",
" 'Type_130',\n",
" 'Type_131',\n",
" 'Type_132',\n",
" 'Type_133',\n",
" 'Type_134',\n",
" 'Type_135',\n",
" 'Type_136',\n",
" 'Type_137',\n",
" 'Type_138',\n",
" 'Type_139',\n",
" 'Type_140',\n",
" 'Type_141',\n",
" 'Type_142',\n",
" 'Type_143',\n",
" 'Type_144',\n",
" 'Type_145',\n",
" 'Type_146',\n",
" 'Type_147',\n",
" 'Type_148',\n",
" 'Type_149',\n",
" 'Type_150',\n",
" 'Type_151',\n",
" 'Type_152',\n",
" 'Type_153',\n",
" 'Type_154',\n",
" 'Type_155',\n",
" 'Type_156',\n",
" 'Type_157',\n",
" 'Type_158',\n",
" 'Type_159',\n",
" 'Type_160',\n",
" 'Type_161',\n",
" 'Type_162',\n",
" 'Type_163',\n",
" 'Type_164',\n",
" 'Type_165',\n",
" 'Type_166',\n",
" 'Type_167',\n",
" 'Type_168',\n",
" 'Type_169',\n",
" 'Type_170',\n",
" 'Type_171',\n",
" 'Type_172',\n",
" 'Type_173',\n",
" 'Type_174',\n",
" 'Type_175',\n",
" 'Type_176',\n",
" 'Type_177',\n",
" 'Type_178',\n",
" 'Type_179',\n",
" 'Type_180',\n",
" 'Type_181',\n",
" 'Type_182',\n",
" 'Type_183',\n",
" 'Type_184',\n",
" 'Type_185',\n",
" 'Type_186',\n",
" 'Type_187',\n",
" 'Type_188',\n",
" 'Type_189',\n",
" 'Type_190',\n",
" 'Type_191',\n",
" 'Type_192',\n",
" 'Type_193',\n",
" 'Type_194',\n",
" 'Type_195',\n",
" 'Type_196',\n",
" 'Type_197',\n",
" 'Type_198',\n",
" 'Type_199',\n",
" 'Type_200',\n",
" 'Type_201',\n",
" 'Type_202',\n",
" 'Type_203',\n",
" 'Type_204',\n",
" 'Type_205',\n",
" 'Type_206',\n",
" 'Type_207',\n",
" 'Type_208',\n",
" 'Type_209',\n",
" 'Type_210',\n",
" 'Type_211',\n",
" 'Type_212',\n",
" 'Type_213',\n",
" 'Type_214',\n",
" 'Type_215',\n",
" 'Type_216',\n",
" 'Type_217',\n",
" 'Type_218',\n",
" 'Type_219',\n",
" 'Type_220',\n",
" 'Type_221',\n",
" 'Type_222',\n",
" 'Type_223',\n",
" 'Type_224',\n",
" 'Type_225',\n",
" 'Type_226',\n",
" 'Type_227',\n",
" 'Type_228',\n",
" 'Type_229',\n",
" 'Type_230',\n",
" 'Type_231',\n",
" 'Type_232',\n",
" 'Type_233',\n",
" 'Type_234',\n",
" 'Type_235',\n",
" 'Type_236',\n",
" 'Type_237',\n",
" 'Type_238',\n",
" 'Type_239',\n",
" 'Type_240',\n",
" 'Type_241',\n",
" 'Type_242',\n",
" 'Type_243',\n",
" 'Type_244',\n",
" 'Type_245',\n",
" 'Type_246',\n",
" 'Type_247',\n",
" 'Type_248',\n",
" 'Type_249',\n",
" 'Type_250',\n",
" 'Type_251',\n",
" 'Type_252',\n",
" 'Type_253',\n",
" 'Type_254',\n",
" 'Type_255']"
]
},
"execution_count": 123,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(profiled_df.columns)"
]
},
{
"cell_type": "code",
"execution_count": 118,
"metadata": {},
"outputs": [],
"source": [
"pop_string = 'pop10'\n",
"codes = [21, 22, 23, 24]\n",
"codes.sort()\n",
"\n",
"str_codes = [str(i) for i in codes] \n",
"formula_string = pop_string + ' ~ -1 + ' + \" + \".join(['Type_' + s for s in str_codes])"
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'pop10 ~ -1 + Type_21 + Type_22 + Type_23 + Type_24'"
]
},
"execution_count": 119,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"formula_string"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {},
"outputs": [
{
"ename": "PatsyError",
"evalue": "Error evaluating factor: NameError: name 'pop10' is not defined\n pop10 ~ -1 + Type_21 + Type_22 + Type_23 + Type_24\n ^^^^^",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\compat.py\u001b[0m in \u001b[0;36mcall_and_wrap_exc\u001b[1;34m(msg, origin, f, *args, **kwargs)\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 36\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 37\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\eval.py\u001b[0m in \u001b[0;36meval\u001b[1;34m(self, expr, source_name, inner_namespace)\u001b[0m\n\u001b[0;32m 165\u001b[0m return eval(code, {}, VarLookupDict([inner_namespace]\n\u001b[1;32m--> 166\u001b[1;33m + self._namespaces))\n\u001b[0m\u001b[0;32m 167\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m<string>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'pop10' is not defined",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[1;31mPatsyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-121-84f2dcfc13f3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mstatsmodels\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgenmod\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfamilies\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mPoisson\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mGaussian\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msmf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mglm\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mformula_string\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprofiled_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfamily\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPoisson\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mresults\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparams\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\statsmodels\\base\\model.py\u001b[0m in \u001b[0;36mfrom_formula\u001b[1;34m(cls, formula, data, subset, drop_cols, *args, **kwargs)\u001b[0m\n\u001b[0;32m 153\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 154\u001b[0m tmp = handle_formula_data(data, None, formula, depth=eval_env,\n\u001b[1;32m--> 155\u001b[1;33m missing=missing)\n\u001b[0m\u001b[0;32m 156\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mendog\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexog\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmissing_idx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdesign_info\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtmp\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 157\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\statsmodels\\formula\\formulatools.py\u001b[0m in \u001b[0;36mhandle_formula_data\u001b[1;34m(Y, X, formula, depth, missing)\u001b[0m\n\u001b[0;32m 63\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mdata_util\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_is_using_pandas\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mY\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 64\u001b[0m result = dmatrices(formula, Y, depth, return_type='dataframe',\n\u001b[1;32m---> 65\u001b[1;33m NA_action=na_action)\n\u001b[0m\u001b[0;32m 66\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 67\u001b[0m result = dmatrices(formula, Y, depth, return_type='dataframe',\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\highlevel.py\u001b[0m in \u001b[0;36mdmatrices\u001b[1;34m(formula_like, data, eval_env, NA_action, return_type)\u001b[0m\n\u001b[0;32m 308\u001b[0m \u001b[0meval_env\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mEvalEnvironment\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcapture\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0meval_env\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mreference\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 309\u001b[0m (lhs, rhs) = _do_highlevel_design(formula_like, data, eval_env,\n\u001b[1;32m--> 310\u001b[1;33m NA_action, return_type)\n\u001b[0m\u001b[0;32m 311\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlhs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 312\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mPatsyError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"model is missing required outcome variables\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\highlevel.py\u001b[0m in \u001b[0;36m_do_highlevel_design\u001b[1;34m(formula_like, data, eval_env, NA_action, return_type)\u001b[0m\n\u001b[0;32m 163\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0miter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 164\u001b[0m design_infos = _try_incr_builders(formula_like, data_iter_maker, eval_env,\n\u001b[1;32m--> 165\u001b[1;33m NA_action)\n\u001b[0m\u001b[0;32m 166\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mdesign_infos\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 167\u001b[0m return build_design_matrices(design_infos, data,\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\highlevel.py\u001b[0m in \u001b[0;36m_try_incr_builders\u001b[1;34m(formula_like, data_iter_maker, eval_env, NA_action)\u001b[0m\n\u001b[0;32m 68\u001b[0m \u001b[0mdata_iter_maker\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[0meval_env\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 70\u001b[1;33m NA_action)\n\u001b[0m\u001b[0;32m 71\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 72\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\build.py\u001b[0m in \u001b[0;36mdesign_matrix_builders\u001b[1;34m(termlists, data_iter_maker, eval_env, NA_action)\u001b[0m\n\u001b[0;32m 694\u001b[0m \u001b[0mfactor_states\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 695\u001b[0m \u001b[0mdata_iter_maker\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 696\u001b[1;33m NA_action)\n\u001b[0m\u001b[0;32m 697\u001b[0m \u001b[1;31m# Now we need the factor infos, which encapsulate the knowledge of\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 698\u001b[0m \u001b[1;31m# how to turn any given factor into a chunk of data:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\build.py\u001b[0m in \u001b[0;36m_examine_factor_types\u001b[1;34m(factors, factor_states, data_iter_maker, NA_action)\u001b[0m\n\u001b[0;32m 441\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mdata\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mdata_iter_maker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 442\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mfactor\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mlist\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexamine_needed\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 443\u001b[1;33m \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfactor\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0meval\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfactor_states\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mfactor\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 444\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mfactor\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mcat_sniffers\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mguess_categorical\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 445\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mfactor\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mcat_sniffers\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\eval.py\u001b[0m in \u001b[0;36meval\u001b[1;34m(self, memorize_state, data)\u001b[0m\n\u001b[0;32m 564\u001b[0m return self._eval(memorize_state[\"eval_code\"],\n\u001b[0;32m 565\u001b[0m \u001b[0mmemorize_state\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 566\u001b[1;33m data)\n\u001b[0m\u001b[0;32m 567\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 568\u001b[0m \u001b[0m__getstate__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mno_pickling\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\eval.py\u001b[0m in \u001b[0;36m_eval\u001b[1;34m(self, code, memorize_state, data)\u001b[0m\n\u001b[0;32m 549\u001b[0m \u001b[0mmemorize_state\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"eval_env\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0meval\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 550\u001b[0m \u001b[0mcode\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 551\u001b[1;33m inner_namespace=inner_namespace)\n\u001b[0m\u001b[0;32m 552\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 553\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mmemorize_chunk\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstate\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mwhich_pass\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\compat.py\u001b[0m in \u001b[0;36mcall_and_wrap_exc\u001b[1;34m(msg, origin, f, *args, **kwargs)\u001b[0m\n\u001b[0;32m 41\u001b[0m origin)\n\u001b[0;32m 42\u001b[0m \u001b[1;31m# Use 'exec' to hide this syntax from the Python 2 parser:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 43\u001b[1;33m \u001b[0mexec\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"raise new_exc from e\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 44\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[1;31m# In python 2, we just let the original exception escape -- better\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\patsy\\compat.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n",
"\u001b[1;31mPatsyError\u001b[0m: Error evaluating factor: NameError: name 'pop10' is not defined\n pop10 ~ -1 + Type_21 + Type_22 + Type_23 + Type_24\n ^^^^^"
]
}
],
"source": [
"import statsmodels.formula.api as smf\n",
"from statsmodels.genmod.families import Poisson, Gaussian\n",
"\n",
"results = smf.glm(formula_string, data = profiled_df, family = Poisson()).fit()\n",
"results.params"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'profiled_df' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-77-941c3b85f8b8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msmf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mglm\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mformula_string\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprofiled_df\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfamily\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mGaussian\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mresults\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparams\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'profiled_df' is not defined"
]
}
],
"source": [
"results = smf.glm(formula_string, data = profiled_df, family = Gaussian()).fit()\n",
"results.params"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns; sns.set(style = \"ticks\", color_codes = True)\n",
"sub_df = profiled_df[['pop10', 'type_21', 'type_22', 'type_23', 'type_24']]\n",
"resulting_plot = sns.pairplot(sub_df)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"len(sub_df)"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"n_pixels_option_values = 256\n",
"long_weights = np.zeros(n_pixels_option_values)\n",
"long_weights[codes] = results.params\n",
"long_ReLU_weights = np.where(long_weights < 0, 0, long_weights)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The weights applying the Rectified Linear Units function prevents negative value for populations:"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0. , 0.00054866, 0. , 0.00169563])"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ReLU_weights = np.where(results.params < 0, 0, results.params)\n",
"ReLU_weights # https://www.kaggle.com/dansbecker/rectified-linear-units-relu-in-deep-learning"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [],
"source": [
"profiled_df = profile_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"pandas.core.frame.DataFrame"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(profiled_df)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\renan\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \n"
]
}
],
"source": [
"# Multiplying the pixel count with the respective weights from the regression\n",
"profiled_df['denominator'] = (np.array(profiled_df[['type_' + s for s in str_codes]]) * ReLU_weights).sum(axis = 1)"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\renan\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
" \n"
]
}
],
"source": [
"# Correction Term (CT)\n",
"profiled_df['CT'] = profiled_df['pop10'] / profiled_df['denominator']\n",
"scan_line_input_CT = profiled_df[['geometry', 'CT']]\n",
"scan_line_input_CT.head()"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [
{
"ename": "KeyError",
"evalue": "\"['geometry'] not in index\"",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-89-cacc562c45c8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mscan_line_input_CT\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprofiled_df\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'geometry'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'CT'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mscan_line_input_CT\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 2680\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mSeries\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mIndex\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2681\u001b[0m \u001b[1;31m# either boolean or fancy integer index\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2682\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_array\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2683\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2684\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_frame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m_getitem_array\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 2724\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2725\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2726\u001b[1;33m \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_convert_to_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2727\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2728\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\pandas\\core\\indexing.py\u001b[0m in \u001b[0;36m_convert_to_indexer\u001b[1;34m(self, obj, axis, is_setter)\u001b[0m\n\u001b[0;32m 1325\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmask\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0many\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1326\u001b[0m raise KeyError('{mask} not in index'\n\u001b[1;32m-> 1327\u001b[1;33m .format(mask=objarr[mask]))\n\u001b[0m\u001b[0;32m 1328\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1329\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mcom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_values_from_object\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mKeyError\u001b[0m: \"['geometry'] not in index\""
]
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"ReLU_weights = np.array([0.02715453, 0.16959454, 3.24846874, 0. ])"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"long_ReLU_weights = np.where(ReLU_weights < 0, 0, ReLU_weights)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"from quilt.data.spatialucr import census\n",
"from shapely.wkb import loads\n",
"\n",
"df = census.tracts_2000()\n",
"df['geometry'] = df.wkb.apply(lambda x: loads(x, hex=True))\n",
"gdf_2000 = gpd.GeoDataFrame(df)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"target_gdf = gdf_2000.copy()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'long_weights' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-39-ec8edea7830d>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mweights\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlong_weights\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'long_weights' is not defined"
]
}
],
"source": [
"weights = long_weights"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"source_CTs = scan_line_input_CT"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 180,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'source_CTs' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-180-b75175d6eca7>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0msource_CTs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'source_CTs' is not defined"
]
}
],
"source": [
"source_CTs.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Second Scanline: interpolate variable on target geometries"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Please note that it is not even necessary to pass a pop_string variable as all the information of population is \"contained\" in the weights and in the correction term."
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {},
"outputs": [],
"source": [
"def scanlines_interpolate(target_gdf, source_CTs, weights_long, raster_path):\n",
" \n",
" _check_presence_of_crs(target_gdf)\n",
" _check_presence_of_crs(source_CTs)\n",
" \n",
" if _check_crs(source_CTs, target_gdf):\n",
" pass\n",
" else:\n",
" return None\n",
"\n",
" print('Opening raster metadata...')\n",
" raster = rasterio.open(raster_path)\n",
" \n",
" print('Matching both crs\\'s (reprojecting source_CTs to raster)...')\n",
" source_CTs = source_CTs.to_crs(crs = raster.crs.data)\n",
" print('...reprojecting target_gdf to raster)...')\n",
" target_gdf = target_gdf.to_crs(crs = raster.crs.data)\n",
" \n",
" \n",
" # Check if Operational System is Windows\n",
" if os.name == 'nt':\n",
" sep_cmd = ';'\n",
" sep_dir = '\\\\'\n",
" else:\n",
" sep_cmd = ':'\n",
" sep_dir = '/'\n",
" \n",
" if ('geometry' not in target_gdf.columns):\n",
" target_gdf['geometry'] = target_gdf[target_gdf._geometry_column_name]\n",
" target_gdf = target_gdf.drop([target_gdf._geometry_column_name], axis = 1)\n",
" target_gdf = target_gdf.set_geometry('geometry')\n",
" \n",
" if ('geometry' not in source_CTs.columns):\n",
" source_CTs['geometry'] = source_CTs[source_CTs._geometry_column_name]\n",
" source_CTs = source_CTs.drop([source_CTs._geometry_column_name], axis = 1)\n",
" source_CTs = source_CTs.set_geometry('geometry')\n",
" \n",
" \n",
" # Create a temporary directory for ALL files of input\n",
" temp_dir = tempfile.mkdtemp()\n",
" \n",
" # parquet like internal file\n",
" print('Starting to create well-known text (wkt) of geometries...')\n",
" target_gdf['geometry_wkt'] = target_gdf['geometry'].apply(lambda x: x.wkt) # Create well-know text (raw text) for the geometry column\n",
" target_gdf = target_gdf.drop(['geometry'], axis = 1)\n",
" target_gdf_temp_file_name = temp_dir + '{}target_gdf_temp.parquet'.format(sep_dir)\n",
" \n",
" # Just extract the useful column for optimization\n",
" target_gdf = target_gdf[['geometry_wkt']]\n",
" \n",
" print('Starting to convert the GeoDataFrame to a temporary file...')\n",
" target_gdf.to_parquet(target_gdf_temp_file_name)\n",
" \n",
" # parquet like internal file\n",
" print('Source CT: Starting to create well-known text (wkt) of geometries...')\n",
" source_CTs['geometry_wkt'] = source_CTs['geometry'].apply(lambda x: x.wkt) # Create well-know text (raw text) for the geometry column\n",
" source_CTs = source_CTs.drop(['geometry'], axis = 1)\n",
" source_CTs_temp_file_name = temp_dir + '{}source_CTs_temp.parquet'.format(sep_dir)\n",
" \n",
" # Just extract the useful column for optimization\n",
" # For source we need also the Correction Terms!\n",
" source_CTs = source_CTs[['geometry_wkt', 'CT']]\n",
" \n",
" print('Starting to convert the GeoDataFrame to a temporary file...')\n",
" source_CTs.to_parquet(source_CTs_temp_file_name)\n",
" \n",
" \n",
" weights_temp_file_name = temp_dir + '{}input_weights.csv'.format(sep_dir)\n",
" np.savetxt(weights_temp_file_name, weights_long, delimiter=\",\", header = 'weights', comments='')\n",
" \n",
" cmd = \"java -cp dependency/*{}ucrspatial-5.0-SNAPSHOT.jar interpolate {} {} {} {}\".format(sep_cmd, \n",
" raster_path,\n",
" source_CTs_temp_file_name,\n",
" target_gdf_temp_file_name,\n",
" weights_temp_file_name)\n",
" \n",
" print('Starting to perform the scanline...')\n",
" run(cmd, shell=True, check=True) # Will generate an parquet for output: interpolate.parquet\n",
" print('Scanline: Done.')\n",
" \n",
" os.remove(target_gdf_temp_file_name)\n",
" os.remove(source_CTs_temp_file_name)\n",
" os.remove(weights_temp_file_name)\n",
" \n",
" os.rmdir(temp_dir)\n",
" \n",
" interpolated_df = pd.read_parquet(\"interpolated.parquet\")\n",
" \n",
" return interpolated_df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {},
"outputs": [],
"source": [
"df_pa = pd.read_csv('merged_df_only_Pennsyl.csv')"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Unnamed: 0</th>\n",
" <th>STATEFP10</th>\n",
" <th>COUNTYFP10</th>\n",
" <th>TRACTCE10</th>\n",
" <th>GEOID10</th>\n",
" <th>NAME10</th>\n",
" <th>COUNTY_ID</th>\n",
" <th>county_id2</th>\n",
" <th>COUNTYNS10</th>\n",
" <th>NAME10_COU</th>\n",
" <th>...</th>\n",
" <th>a15hsp10</th>\n",
" <th>a60hsp10</th>\n",
" <th>ageasn10</th>\n",
" <th>a15asn10</th>\n",
" <th>a60asn10</th>\n",
" <th>agentv10</th>\n",
" <th>a15ntv10</th>\n",
" <th>a60ntv10</th>\n",
" <th>globd10</th>\n",
" <th>globg10</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>42</td>\n",
" <td>1</td>\n",
" <td>30800</td>\n",
" <td>42001030800</td>\n",
" <td>308.0</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>132</td>\n",
" <td>14</td>\n",
" <td>60</td>\n",
" <td>14</td>\n",
" <td>5</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>w</td>\n",
" <td>White</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>42</td>\n",
" <td>1</td>\n",
" <td>30400</td>\n",
" <td>42001030400</td>\n",
" <td>304.0</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>164</td>\n",
" <td>24</td>\n",
" <td>23</td>\n",
" <td>7</td>\n",
" <td>0</td>\n",
" <td>11</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>wh</td>\n",
" <td>Single immig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>42</td>\n",
" <td>1</td>\n",
" <td>30300</td>\n",
" <td>42001030300</td>\n",
" <td>303.0</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>204</td>\n",
" <td>15</td>\n",
" <td>11</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>15</td>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>wh</td>\n",
" <td>Single immig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>42</td>\n",
" <td>1</td>\n",
" <td>30500</td>\n",
" <td>42001030500</td>\n",
" <td>305.0</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>155</td>\n",
" <td>18</td>\n",
" <td>8</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>wh</td>\n",
" <td>Single immig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>42</td>\n",
" <td>1</td>\n",
" <td>30700</td>\n",
" <td>42001030700</td>\n",
" <td>307.0</td>\n",
" <td>42001</td>\n",
" <td>42001</td>\n",
" <td>1213656</td>\n",
" <td>Adams</td>\n",
" <td>...</td>\n",
" <td>167</td>\n",
" <td>19</td>\n",
" <td>42</td>\n",
" <td>6</td>\n",
" <td>7</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>w</td>\n",
" <td>White</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 62 columns</p>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0 STATEFP10 COUNTYFP10 TRACTCE10 GEOID10 NAME10 \\\n",
"0 0 42 1 30800 42001030800 308.0 \n",
"1 1 42 1 30400 42001030400 304.0 \n",
"2 2 42 1 30300 42001030300 303.0 \n",
"3 3 42 1 30500 42001030500 305.0 \n",
"4 4 42 1 30700 42001030700 307.0 \n",
"\n",
" COUNTY_ID county_id2 COUNTYNS10 NAME10_COU ... a15hsp10 \\\n",
"0 42001 42001 1213656 Adams ... 132 \n",
"1 42001 42001 1213656 Adams ... 164 \n",
"2 42001 42001 1213656 Adams ... 204 \n",
"3 42001 42001 1213656 Adams ... 155 \n",
"4 42001 42001 1213656 Adams ... 167 \n",
"\n",
" a60hsp10 ageasn10 a15asn10 a60asn10 agentv10 a15ntv10 a60ntv10 globd10 \\\n",
"0 14 60 14 5 6 1 2 w \n",
"1 24 23 7 0 11 1 2 wh \n",
"2 15 11 4 1 15 5 2 wh \n",
"3 18 8 1 2 4 0 2 wh \n",
"4 19 42 6 7 3 0 1 w \n",
"\n",
" globg10 \n",
"0 White \n",
"1 Single immig \n",
"2 Single immig \n",
"3 Single immig \n",
"4 White \n",
"\n",
"[5 rows x 62 columns]"
]
},
"execution_count": 160,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_pa.head()"
]
},
{
"cell_type": "code",
"execution_count": 162,
"metadata": {},
"outputs": [],
"source": [
"df_pa.to_parquet('merged_df_only_Pennsyl.parquet')"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'df_pa' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-116-c60e56b4c682>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdf_pa\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mNameError\u001b[0m: name 'df_pa' is not defined"
]
}
],
"source": [
"df_pa.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment