diff --git a/naturf/config.py b/naturf/config.py index 8bfc854bae..c53feb9d26 100644 --- a/naturf/config.py +++ b/naturf/config.py @@ -34,7 +34,7 @@ class Settings: ZXCV_FACTOR = 3.5 data_id_field_name = "OBJECTID" - data_height_field_name = "Max_HOUSE_" + data_height_field_name = "HEIGHT" data_geometry_field_name = "geometry" id_field = "building_id" diff --git a/naturf/nodes.py b/naturf/nodes.py index 44e9aa6abe..79f3d451f2 100644 --- a/naturf/nodes.py +++ b/naturf/nodes.py @@ -315,6 +315,13 @@ def _plan_area_dict(building_id: pd.Series, building_area_neighbor: pd.Series) -> dict: """Calculate the total area of all buildings within the plan area. + :param building_id: Building ID field. + :type building_id: pd.Series + + :param building_area_neighbor: Building area neighbor field. + :type building_area_neighbor: pd.Series + + :return: Dictionary of building id to the neighboring building areas """ @@ -343,3 +350,114 @@ def _building_height_dict(building_id: pd.Series, return df.groupby(Settings.id_field)[Settings.height_field].max().to_dict() + +def _footprint_building_areas(_building_height_dict: dict, + _plan_area_dict: dict) -> dict: + """Create a dictionary of the height and plan_area to a dictionary where the key is the + target building ID. + + :param _building_height_dict: Dictionary of building id to building height + :type _building_height_dict: dict + + :param _plan_area_dict: Dictionary of building id to the neighboring building areas. + :type _plan_area_dict: dict + + :return: Dictionary of building id to the height and plan area. + + """ + + return {i: [_building_height_dict[i], _plan_area_dict[i]] for i in _plan_area_dict.keys()} + + +def average_building_heights(building_id: pd.Series, + building_height_neighbor: pd.Series) -> pd.Series: + """Average building heights for each target building when considering themselves + and those that are within their buffered area. + + :param building_id: Building ID field. + :type building_id: pd.Series + + :param building_height_neighbor: Building height field for neighbors + :type building_height_neighbor: pd.Series + + :return: Series of building heights for each target building in the buffered area + + """ + + df = pd.DataFrame({Settings.id_field: building_id, + Settings.neighbor_height_field: building_height_neighbor}) + + return df.groupby(Settings.id_field)[Settings.neighbor_height_field].mean().fillna(0) + + +def standard_deviation_building_heights(building_id: pd.Series, + building_height_neighbor: pd.Series) -> pd.Series: + """Standard deviation of building heights for each target building when considering themselves + and those that are within their buffered area. + + :param building_id: Building ID field. + :type building_id: pd.Series + + :param building_height_neighbor: Building height field for neighbors + :type building_height_neighbor: pd.Series + + :return: Series of building heights for each target building in the buffered area + + """ + + df = pd.DataFrame({Settings.id_field: building_id, + Settings.neighbor_height_field: building_height_neighbor}) + + return df.groupby(Settings.id_field)[Settings.neighbor_height_field].std().fillna(0) + + +def average_direction_distance(building_id: pd.Series, + orientation_to_neighbor: pd.Series, + distance_to_neighbor_by_centroid: pd.Series) -> pd.Series: + """Calculate the average directional distances for each target building to its neighbors + + :param building_id: Building ID field. + :type building_id: pd.Series + + :param orientation_to_neighbor: Either the east-west or north-south orientation of the target building + to its neighbors. + :type orientation_to_neighbor: pd.Series + + :param distance_to_neighbor_by_centroid: Distance to neighbor from the target building using centroids. + :type distance_to_neighbor_by_centroid: pd.Series + + :return: Series of average directional distances for each target building to its + neighbors. + + """ + + df = pd.DataFrame({Settings.id_field: building_id, + "orientation": orientation_to_neighbor, + "distance": distance_to_neighbor_by_centroid}) + + df = df.groupby([Settings.id_field, "orientation"])["distance"].mean().reset_index() + + # exclude the target building to target building distance and direction (would be == 0) + df = df.loc[df["distance"] > 0] + + return df + + +def _average_north_south_building_distances(building_id: pd.Series) -> dict: + """Create a dictionary with an initialization value of 0 present for each building id. + + :param building_id: Building ID field. + :type building_id: pd.Series + + :return: Dictionary of with an initialization value of 0 present for each + building id. + + """ + + return {i: 0 for i in building_id.unique()} + + + + + + diff --git a/notebooks/naturf_quickstarter.ipynb b/notebooks/naturf_quickstarter.ipynb index 3ef3adcab2..5bfb170212 100644 --- a/notebooks/naturf_quickstarter.ipynb +++ b/notebooks/naturf_quickstarter.ipynb @@ -20,26 +20,33 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "id": "93c617b4-f1bb-490d-a950-a40ea679543d", "metadata": {}, "outputs": [], "source": [ "data_dir = \"/Users/d3y010/projects/naturf/data\"\n", "\n", - "input_shapefile = os.path.join(data_dir, \"inputs\", \"C-5.shp\")\n", + "input_shapefile = os.path.join(data_dir, \"inputs\", \"AA-10.shp\")\n", "\n", "\n", "# inputs dictionary to feed the model\n", "driver_inputs = {\"input_shapefile\": input_shapefile}\n", "\n", "# desired outputs\n", - "driver_outputs = [\"building_id\", \"building_height\", \"angle_in_degrees_to_neighbor\"]\n" + "driver_outputs = [\"building_id\", \n", + " \"building_height\", \n", + " \"angle_in_degrees_to_neighbor\",\n", + " \"orientation_to_neighbor\"]\n", + "\n", + "driver_outputs = [\"average_building_heights\"]\n", + "\n", + "# driver_outputs = [\"_building_height_dict\"]\n" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "84ef1638-f05f-485f-a961-49602ca76649", "metadata": {}, "outputs": [], @@ -51,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "9475208b-d08c-4d8a-ad10-ce48e2d24746", "metadata": {}, "outputs": [], @@ -62,40 +69,58 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "8dacca0e-1414-4155-af6e-b7cf09b6e2db", "metadata": {}, - "outputs": [], - "source": [ - "# execute the driver\n", - "gxf = model.execute()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "8ea9ad65-3dad-4ceb-95a3-fe4baf03b137", - "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "(9324, 3)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/d3y010/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/hamilton/base.py:52: FutureWarning: reindexing with a non-unique Index is deprecated and will raise in a future version.\n", + " return pd.DataFrame(outputs)\n", + "-------------------------------------------------------------------\n", + "Oh no an error! Need help with Hamilton?\n", + "Join our slack and ask for help! https://join.slack.com/t/hamilton-opensource/shared_invite/zt-1bjs72asx-wcUTgH7q7QX1igiQ5bbdcg\n", + "-------------------------------------------------------------------\n", + "\n" + ] + }, + { + "ename": "ValueError", + "evalue": "cannot reindex on an axis with duplicate labels", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [10]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# execute the driver\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m gxf \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/repos/github/naturf/naturf/driver.py:29\u001b[0m, in \u001b[0;36mModel.execute\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[38;5;124;03m\"\"\"Run the driver.\"\"\"\u001b[39;00m\n\u001b[1;32m 28\u001b[0m \u001b[38;5;66;03m# generate initial data frame\u001b[39;00m\n\u001b[0;32m---> 29\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m df\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/hamilton/driver.py:125\u001b[0m, in \u001b[0;36mDriver.execute\u001b[0;34m(self, final_vars, overrides, display_graph, inputs)\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 124\u001b[0m logger\u001b[38;5;241m.\u001b[39merror(SLACK_ERROR_MESSAGE)\n\u001b[0;32m--> 125\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/hamilton/driver.py:122\u001b[0m, in \u001b[0;36mDriver.execute\u001b[0;34m(self, final_vars, overrides, display_graph, inputs)\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 121\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mraw_execute(final_vars, overrides, display_graph, inputs\u001b[38;5;241m=\u001b[39minputs)\n\u001b[0;32m--> 122\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madapter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbuild_result\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moutputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 124\u001b[0m logger\u001b[38;5;241m.\u001b[39merror(SLACK_ERROR_MESSAGE)\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/hamilton/base.py:52\u001b[0m, in \u001b[0;36mPandasDataFrameResult.build_result\u001b[0;34m(**outputs)\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pd\u001b[38;5;241m.\u001b[39mDataFrame(outputs)\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCannot build result. Cannot handle type \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 52\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mDataFrame\u001b[49m\u001b[43m(\u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/frame.py:636\u001b[0m, in \u001b[0;36mDataFrame.__init__\u001b[0;34m(self, data, index, columns, dtype, copy)\u001b[0m\n\u001b[1;32m 630\u001b[0m mgr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_init_mgr(\n\u001b[1;32m 631\u001b[0m data, axes\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m\"\u001b[39m: index, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcolumns\u001b[39m\u001b[38;5;124m\"\u001b[39m: columns}, dtype\u001b[38;5;241m=\u001b[39mdtype, copy\u001b[38;5;241m=\u001b[39mcopy\n\u001b[1;32m 632\u001b[0m )\n\u001b[1;32m 634\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data, \u001b[38;5;28mdict\u001b[39m):\n\u001b[1;32m 635\u001b[0m \u001b[38;5;66;03m# GH#38939 de facto copy defaults to False only in non-dict cases\u001b[39;00m\n\u001b[0;32m--> 636\u001b[0m mgr \u001b[38;5;241m=\u001b[39m \u001b[43mdict_to_mgr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolumns\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtyp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmanager\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 637\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data, ma\u001b[38;5;241m.\u001b[39mMaskedArray):\n\u001b[1;32m 638\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mma\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmrecords\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mmrecords\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/internals/construction.py:502\u001b[0m, in \u001b[0;36mdict_to_mgr\u001b[0;34m(data, index, columns, dtype, typ, copy)\u001b[0m\n\u001b[1;32m 494\u001b[0m arrays \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 495\u001b[0m x\n\u001b[1;32m 496\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(x, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdtype\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(x\u001b[38;5;241m.\u001b[39mdtype, ExtensionDtype)\n\u001b[1;32m 497\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m x\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m 498\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m arrays\n\u001b[1;32m 499\u001b[0m ]\n\u001b[1;32m 500\u001b[0m \u001b[38;5;66;03m# TODO: can we get rid of the dt64tz special case above?\u001b[39;00m\n\u001b[0;32m--> 502\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43marrays_to_mgr\u001b[49m\u001b[43m(\u001b[49m\u001b[43marrays\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolumns\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtyp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtyp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconsolidate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/internals/construction.py:125\u001b[0m, in \u001b[0;36marrays_to_mgr\u001b[0;34m(arrays, columns, index, dtype, verify_integrity, typ, consolidate)\u001b[0m\n\u001b[1;32m 122\u001b[0m index \u001b[38;5;241m=\u001b[39m ensure_index(index)\n\u001b[1;32m 124\u001b[0m \u001b[38;5;66;03m# don't force copy because getting jammed in an ndarray anyway\u001b[39;00m\n\u001b[0;32m--> 125\u001b[0m arrays \u001b[38;5;241m=\u001b[39m \u001b[43m_homogenize\u001b[49m\u001b[43m(\u001b[49m\u001b[43marrays\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 126\u001b[0m \u001b[38;5;66;03m# _homogenize ensures\u001b[39;00m\n\u001b[1;32m 127\u001b[0m \u001b[38;5;66;03m# - all(len(x) == len(index) for x in arrays)\u001b[39;00m\n\u001b[1;32m 128\u001b[0m \u001b[38;5;66;03m# - all(x.ndim == 1 for x in arrays)\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 131\u001b[0m \n\u001b[1;32m 132\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 133\u001b[0m index \u001b[38;5;241m=\u001b[39m ensure_index(index)\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/internals/construction.py:607\u001b[0m, in \u001b[0;36m_homogenize\u001b[0;34m(data, index, dtype)\u001b[0m\n\u001b[1;32m 603\u001b[0m val \u001b[38;5;241m=\u001b[39m val\u001b[38;5;241m.\u001b[39mastype(dtype, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 604\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m val\u001b[38;5;241m.\u001b[39mindex \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m index:\n\u001b[1;32m 605\u001b[0m \u001b[38;5;66;03m# Forces alignment. No need to copy data since we\u001b[39;00m\n\u001b[1;32m 606\u001b[0m \u001b[38;5;66;03m# are putting it into an ndarray later\u001b[39;00m\n\u001b[0;32m--> 607\u001b[0m val \u001b[38;5;241m=\u001b[39m \u001b[43mval\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreindex\u001b[49m\u001b[43m(\u001b[49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 609\u001b[0m val \u001b[38;5;241m=\u001b[39m val\u001b[38;5;241m.\u001b[39m_values\n\u001b[1;32m 610\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/series.py:4672\u001b[0m, in \u001b[0;36mSeries.reindex\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 4668\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 4669\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m passed as both positional and keyword argument\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 4670\u001b[0m )\n\u001b[1;32m 4671\u001b[0m kwargs\u001b[38;5;241m.\u001b[39mupdate({\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m\"\u001b[39m: index})\n\u001b[0;32m-> 4672\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreindex\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/generic.py:4966\u001b[0m, in \u001b[0;36mNDFrame.reindex\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 4963\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reindex_multi(axes, copy, fill_value)\n\u001b[1;32m 4965\u001b[0m \u001b[38;5;66;03m# perform the reindex on the axes\u001b[39;00m\n\u001b[0;32m-> 4966\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_reindex_axes\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 4967\u001b[0m \u001b[43m \u001b[49m\u001b[43maxes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlimit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\n\u001b[1;32m 4968\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreindex\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/generic.py:4986\u001b[0m, in \u001b[0;36mNDFrame._reindex_axes\u001b[0;34m(self, axes, level, limit, tolerance, method, fill_value, copy)\u001b[0m\n\u001b[1;32m 4981\u001b[0m new_index, indexer \u001b[38;5;241m=\u001b[39m ax\u001b[38;5;241m.\u001b[39mreindex(\n\u001b[1;32m 4982\u001b[0m labels, level\u001b[38;5;241m=\u001b[39mlevel, limit\u001b[38;5;241m=\u001b[39mlimit, tolerance\u001b[38;5;241m=\u001b[39mtolerance, method\u001b[38;5;241m=\u001b[39mmethod\n\u001b[1;32m 4983\u001b[0m )\n\u001b[1;32m 4985\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis_number(a)\n\u001b[0;32m-> 4986\u001b[0m obj \u001b[38;5;241m=\u001b[39m \u001b[43mobj\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_reindex_with_indexers\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 4987\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mnew_index\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mindexer\u001b[49m\u001b[43m]\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4988\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4989\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4990\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_dups\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 4991\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4992\u001b[0m \u001b[38;5;66;03m# If we've made a copy once, no need to make another one\u001b[39;00m\n\u001b[1;32m 4993\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/generic.py:5032\u001b[0m, in \u001b[0;36mNDFrame._reindex_with_indexers\u001b[0;34m(self, reindexers, fill_value, copy, allow_dups)\u001b[0m\n\u001b[1;32m 5029\u001b[0m indexer \u001b[38;5;241m=\u001b[39m ensure_platform_int(indexer)\n\u001b[1;32m 5031\u001b[0m \u001b[38;5;66;03m# TODO: speed up on homogeneous DataFrame objects (see _reindex_multi)\u001b[39;00m\n\u001b[0;32m-> 5032\u001b[0m new_data \u001b[38;5;241m=\u001b[39m \u001b[43mnew_data\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreindex_indexer\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 5033\u001b[0m \u001b[43m \u001b[49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5034\u001b[0m \u001b[43m \u001b[49m\u001b[43mindexer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5035\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbaxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5036\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5037\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_dups\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mallow_dups\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5038\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5039\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5040\u001b[0m \u001b[38;5;66;03m# If we've made a copy once, no need to make another one\u001b[39;00m\n\u001b[1;32m 5041\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/internals/managers.py:679\u001b[0m, in \u001b[0;36mBaseBlockManager.reindex_indexer\u001b[0;34m(self, new_axis, indexer, axis, fill_value, allow_dups, copy, consolidate, only_slice, use_na_proxy)\u001b[0m\n\u001b[1;32m 677\u001b[0m \u001b[38;5;66;03m# some axes don't allow reindexing with dups\u001b[39;00m\n\u001b[1;32m 678\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m allow_dups:\n\u001b[0;32m--> 679\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maxes\u001b[49m\u001b[43m[\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_can_reindex\u001b[49m\u001b[43m(\u001b[49m\u001b[43mindexer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m axis \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mndim:\n\u001b[1;32m 682\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mIndexError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRequested axis not found in manager\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/.pyenv/versions/3.9.4/envs/py3.9.4_naturf/lib/python3.9/site-packages/pandas/core/indexes/base.py:4107\u001b[0m, in \u001b[0;36mIndex._validate_can_reindex\u001b[0;34m(self, indexer)\u001b[0m\n\u001b[1;32m 4105\u001b[0m \u001b[38;5;66;03m# trying to reindex on an axis with duplicates\u001b[39;00m\n\u001b[1;32m 4106\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_index_as_unique \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(indexer):\n\u001b[0;32m-> 4107\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot reindex on an axis with duplicate labels\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mValueError\u001b[0m: cannot reindex on an axis with duplicate labels" + ] } ], "source": [ - "gxf.shape" + "# execute the driver\n", + "gxf = model.execute()\n" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "d7ff49da-40b9-4e75-a9b3-9b2d4d2f36ef", + "execution_count": 6, + "id": "2785cadd-b6a8-4711-a5e6-837917eeec6e", "metadata": {}, "outputs": [ { @@ -119,56 +144,49 @@ " \n", " \n", " \n", + " average_building_heights\n", + " \n", + " \n", " building_id\n", - " building_height\n", - " angle_in_degrees_to_neighbor\n", + " \n", " \n", " \n", " \n", " \n", - " 0\n", - " 132230\n", - " 2.66\n", - " 0.000000\n", + " 3062815.0\n", + " 15.40000\n", " \n", " \n", - " 0\n", - " 132230\n", - " 2.66\n", - " 90.630695\n", + " 3062816.0\n", + " 13.45125\n", " \n", " \n", - " 1\n", - " 132237\n", - " 2.66\n", - " 270.630695\n", + " 3062817.0\n", + " 15.17600\n", " \n", " \n", - " 1\n", - " 132237\n", - " 2.66\n", - " 0.000000\n", + " 3062818.0\n", + " 10.55400\n", " \n", " \n", - " 2\n", - " 132338\n", - " 25.41\n", - " 0.000000\n", + " 3062841.0\n", + " 15.66250\n", " \n", " \n", "\n", "" ], "text/plain": [ - " building_id building_height angle_in_degrees_to_neighbor\n", - "0 132230 2.66 0.000000\n", - "0 132230 2.66 90.630695\n", - "1 132237 2.66 270.630695\n", - "1 132237 2.66 0.000000\n", - "2 132338 25.41 0.000000" + " average_building_heights\n", + "building_id \n", + "3062815.0 15.40000\n", + "3062816.0 13.45125\n", + "3062817.0 15.17600\n", + "3062818.0 10.55400\n", + "3062841.0 15.66250" ] }, - "execution_count": 13, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -179,35 +197,12 @@ }, { "cell_type": "code", - "execution_count": 23, - "id": "9ce9fd39-b32b-477f-9893-04b81f569c0e", + "execution_count": 9, + "id": "f56b76cc-68ab-40b9-b83b-72f75abc35e4", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "gxf.set_index(\"building_id\")[\"distance_to_neighbor_by_centroid\"].plot(kind=\"bar\")" + "model.list_parameters()\n" ] }, {