Skip to content

Instantly share code, notes, and snippets.

@d-wasserman
Last active March 27, 2018 19:35
Show Gist options
  • Save d-wasserman/ead87a0a33af4def670e789522d054f5 to your computer and use it in GitHub Desktop.
Save d-wasserman/ead87a0a33af4def670e789522d054f5 to your computer and use it in GitHub Desktop.
Project: Summarize 1 Month of 2017 Citibike OD Data into a a format accepted by Spatial Sankey (geojson for ODs, and flow csv). Uses Google Datalab.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project: Summarize 1 Month of 2017 Citibike OD Data into a format accepted by Spatial Sankey\n",
"\n",
"Description: Utilizes Geopandas and Pandas to collapse OD pairs and tabulate associated counts based on trip demographics. \n",
"\n",
"Libraries: Geopandas, Pandas"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import geopandas as gpd\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.style as mstyle\n",
"from shapely.geometry import Point\n",
"import datetime\n",
"import os\n",
"import google.datalab.storage as storage\n",
"from google.datalab import Context\n",
"from cStringIO import StringIO\n",
"from io import BytesIO\n",
"mstyle.use(\"ggplot\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Set Up Data\n",
"1. Get data from GCloud Storage\n",
"2. Generate and describe resulting dataframe"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%gcs read --object gs://dataanalysisengine/data/201706-citibike-tripdata.csv --variable citibikecsv"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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>tripduration</th>\n",
" <th>start station id</th>\n",
" <th>start station latitude</th>\n",
" <th>start station longitude</th>\n",
" <th>end station id</th>\n",
" <th>end station latitude</th>\n",
" <th>end station longitude</th>\n",
" <th>bikeid</th>\n",
" <th>birth year</th>\n",
" <th>gender</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>1.731594e+06</td>\n",
" <td>1.731594e+06</td>\n",
" <td>1.731594e+06</td>\n",
" <td>1.731594e+06</td>\n",
" <td>1.731594e+06</td>\n",
" <td>1.731594e+06</td>\n",
" <td>1.731594e+06</td>\n",
" <td>1.731594e+06</td>\n",
" <td>1.539162e+06</td>\n",
" <td>1.731594e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>1.072827e+03</td>\n",
" <td>1.337900e+03</td>\n",
" <td>4.073594e+01</td>\n",
" <td>-7.398515e+01</td>\n",
" <td>1.333843e+03</td>\n",
" <td>4.073566e+01</td>\n",
" <td>-7.398523e+01</td>\n",
" <td>2.289554e+04</td>\n",
" <td>1.978886e+03</td>\n",
" <td>1.117142e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>1.494990e+04</td>\n",
" <td>1.337752e+03</td>\n",
" <td>5.204005e-02</td>\n",
" <td>8.134120e-02</td>\n",
" <td>1.336874e+03</td>\n",
" <td>6.051320e-02</td>\n",
" <td>9.888581e-02</td>\n",
" <td>4.916619e+03</td>\n",
" <td>1.164359e+01</td>\n",
" <td>5.767023e-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>6.100000e+01</td>\n",
" <td>7.200000e+01</td>\n",
" <td>0.000000e+00</td>\n",
" <td>-7.401713e+01</td>\n",
" <td>7.200000e+01</td>\n",
" <td>0.000000e+00</td>\n",
" <td>-7.404773e+01</td>\n",
" <td>1.452900e+04</td>\n",
" <td>1.885000e+03</td>\n",
" <td>0.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>3.910000e+02</td>\n",
" <td>3.580000e+02</td>\n",
" <td>4.071755e+01</td>\n",
" <td>-7.399724e+01</td>\n",
" <td>3.580000e+02</td>\n",
" <td>4.071755e+01</td>\n",
" <td>-7.399725e+01</td>\n",
" <td>1.822800e+04</td>\n",
" <td>1.971000e+03</td>\n",
" <td>1.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>6.610000e+02</td>\n",
" <td>4.840000e+02</td>\n",
" <td>4.073705e+01</td>\n",
" <td>-7.398771e+01</td>\n",
" <td>4.830000e+02</td>\n",
" <td>4.073650e+01</td>\n",
" <td>-7.398783e+01</td>\n",
" <td>2.497000e+04</td>\n",
" <td>1.982000e+03</td>\n",
" <td>1.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>1.146000e+03</td>\n",
" <td>3.137000e+03</td>\n",
" <td>4.075514e+01</td>\n",
" <td>-7.397621e+01</td>\n",
" <td>3.137000e+03</td>\n",
" <td>4.075510e+01</td>\n",
" <td>-7.397621e+01</td>\n",
" <td>2.755400e+04</td>\n",
" <td>1.988000e+03</td>\n",
" <td>1.000000e+00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>4.182314e+06</td>\n",
" <td>3.474000e+03</td>\n",
" <td>4.088092e+01</td>\n",
" <td>0.000000e+00</td>\n",
" <td>3.474000e+03</td>\n",
" <td>4.088092e+01</td>\n",
" <td>0.000000e+00</td>\n",
" <td>2.983400e+04</td>\n",
" <td>2.001000e+03</td>\n",
" <td>2.000000e+00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" tripduration start station id start station latitude \\\n",
"count 1.731594e+06 1.731594e+06 1.731594e+06 \n",
"mean 1.072827e+03 1.337900e+03 4.073594e+01 \n",
"std 1.494990e+04 1.337752e+03 5.204005e-02 \n",
"min 6.100000e+01 7.200000e+01 0.000000e+00 \n",
"25% 3.910000e+02 3.580000e+02 4.071755e+01 \n",
"50% 6.610000e+02 4.840000e+02 4.073705e+01 \n",
"75% 1.146000e+03 3.137000e+03 4.075514e+01 \n",
"max 4.182314e+06 3.474000e+03 4.088092e+01 \n",
"\n",
" start station longitude end station id end station latitude \\\n",
"count 1.731594e+06 1.731594e+06 1.731594e+06 \n",
"mean -7.398515e+01 1.333843e+03 4.073566e+01 \n",
"std 8.134120e-02 1.336874e+03 6.051320e-02 \n",
"min -7.401713e+01 7.200000e+01 0.000000e+00 \n",
"25% -7.399724e+01 3.580000e+02 4.071755e+01 \n",
"50% -7.398771e+01 4.830000e+02 4.073650e+01 \n",
"75% -7.397621e+01 3.137000e+03 4.075510e+01 \n",
"max 0.000000e+00 3.474000e+03 4.088092e+01 \n",
"\n",
" end station longitude bikeid birth year gender \n",
"count 1.731594e+06 1.731594e+06 1.539162e+06 1.731594e+06 \n",
"mean -7.398523e+01 2.289554e+04 1.978886e+03 1.117142e+00 \n",
"std 9.888581e-02 4.916619e+03 1.164359e+01 5.767023e-01 \n",
"min -7.404773e+01 1.452900e+04 1.885000e+03 0.000000e+00 \n",
"25% -7.399725e+01 1.822800e+04 1.971000e+03 1.000000e+00 \n",
"50% -7.398783e+01 2.497000e+04 1.982000e+03 1.000000e+00 \n",
"75% -7.397621e+01 2.755400e+04 1.988000e+03 1.000000e+00 \n",
"max 0.000000e+00 2.983400e+04 2.001000e+03 2.000000e+00 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"top_level_out_dir= r\"/content/datalab/data/Output\"\n",
"data_dir= r\"/content/datalab/data\"\n",
"output_dir = os.path.join(top_level_out_dir,\"SpatialSankey\")\n",
"if not os.path.exists(output_dir):\n",
" os.makedirs(output_dir)\n",
"now = datetime.datetime.now()\n",
"citibike_csv= StringIO(citibikecsv)\n",
"df = pd.read_csv(citibike_csv,parse_dates=[\"starttime\",\"stoptime\"])\n",
"display(df.describe())\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Worker Functions\n",
"def get_time_period(Hour,period_dictionary={\"6 AM to 9 AM\":(6,9),\"9 AM to 2 PM\":(9,14),\"2 PM to 4 PM\":(14,16),\"4 PM to 7 PM\":(16,19),\"7 PM to 10 PM\":(19,22),\"10 PM to 1 AM\":(22,1),\"1 AM to 6 AM\":(1,6)}):\n",
" Hour = int(Hour)\n",
" time_period=None\n",
" for period in period_dictionary:\n",
" time_tuple=period_dictionary[period]\n",
" if time_tuple[0]>time_tuple[1]: #Maxes at 24 hours, if first number is greater reset\n",
" if Hour>= time_tuple[0] or Hour < time_tuple[1]:\n",
" time_period=period\n",
" else:\n",
" if Hour>= time_tuple[0] and Hour < time_tuple[1]:\n",
" time_period=period\n",
" return time_period"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Prepare OD Data for Summary"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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>0 to 5 Minutes</th>\n",
" <th>5 to 10 Minutes</th>\n",
" <th>10 to 15 Minutes</th>\n",
" <th>15 to 20 Minutes</th>\n",
" <th>Greater than 20 Minutes</th>\n",
" <th>Female</th>\n",
" <th>Male</th>\n",
" <th>1 AM to 6 AM</th>\n",
" <th>10 PM to 1 AM</th>\n",
" <th>2 PM to 4 PM</th>\n",
" <th>...</th>\n",
" <th>9 AM to 2 PM</th>\n",
" <th>0 to 10 Years Old</th>\n",
" <th>10 to 20 Years Old</th>\n",
" <th>20 to 30 Years Old</th>\n",
" <th>30 to 40 Years Old</th>\n",
" <th>40 to 50 Years Old</th>\n",
" <th>50 to 60 Years Old</th>\n",
" <th>60 to 70 Years Old</th>\n",
" <th>70 to 80 Years Old</th>\n",
" <th>Greater than 80 Years Old</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>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</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>1</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>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</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>1</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>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</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>1</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>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</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>1</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>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</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>1</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 × 23 columns</p>\n",
"</div>"
],
"text/plain": [
" 0 to 5 Minutes 5 to 10 Minutes 10 to 15 Minutes 15 to 20 Minutes \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 1 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Greater than 20 Minutes Female Male 1 AM to 6 AM 10 PM to 1 AM \\\n",
"0 1 0 1 0 1 \n",
"1 0 0 1 0 1 \n",
"2 1 0 1 0 1 \n",
"3 1 1 0 0 1 \n",
"4 1 0 1 0 1 \n",
"\n",
" 2 PM to 4 PM ... 9 AM to 2 PM 0 to 10 Years Old \\\n",
"0 0 ... 0 0 \n",
"1 0 ... 0 0 \n",
"2 0 ... 0 0 \n",
"3 0 ... 0 0 \n",
"4 0 ... 0 0 \n",
"\n",
" 10 to 20 Years Old 20 to 30 Years Old 30 to 40 Years Old \\\n",
"0 0 0 0 \n",
"1 0 0 1 \n",
"2 0 0 1 \n",
"3 0 0 0 \n",
"4 0 0 1 \n",
"\n",
" 40 to 50 Years Old 50 to 60 Years Old 60 to 70 Years Old \\\n",
"0 1 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 1 0 0 \n",
"4 0 0 0 \n",
"\n",
" 70 to 80 Years Old Greater than 80 Years Old \n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
"\n",
"[5 rows x 23 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df[\"Start Hour\"]=df[\"starttime\"].dt.hour\n",
"df[\"T Period\"]=df[\"Start Hour\"].apply(lambda x: get_time_period(x))\n",
"df[\"Age\"]= now.year- df[\"birth year\"]\n",
"df[\"Age Group\"]= pd.cut(df[\"Age\"],range(0,90,10)+[200],labels=[\"{0} to {1} Years Old\".format(i,j) for i,j in zip(range(0,80,10),range(10,90,10))]+[\"Greater than 80 Years Old\"])\n",
"df[\"Duration Group\"] = pd.cut(df[\"tripduration\"],range(0,1500,300)+[1000000],labels=[\"{0} to {1} Minutes\".format(i,j) for i,j in zip(range(0,20,5),range(5,25,5))]+[\"Greater than 20 Minutes\"])\n",
"df[\"gender class\"]= df[\"gender\"].apply(lambda x: \"Male\" if x==1 else \"Female\")\n",
"df[\"flow\"]=1\n",
"df_dummy=pd.get_dummies(df[[\"Duration Group\", \"gender class\",\"T Period\",\"Age Group\"]],prefix=\"\",prefix_sep=\"\")\n",
"df_dummy_cols=df_dummy.columns\n",
"display(df_dummy.head())\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"('There are ', 4.142857142857143, ' weeks in the dataset.')\n"
]
}
],
"source": [
"week_range = (df[\"starttime\"].max()-df[\"starttime\"].min()).days/7.0\n",
"print(\"There are \",week_range,\" weeks in the dataset.\")"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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>flow</th>\n",
" <th>0 to 5 Minutes</th>\n",
" <th>5 to 10 Minutes</th>\n",
" <th>10 to 15 Minutes</th>\n",
" <th>15 to 20 Minutes</th>\n",
" <th>Greater than 20 Minutes</th>\n",
" <th>Female</th>\n",
" <th>Male</th>\n",
" <th>1 AM to 6 AM</th>\n",
" <th>10 PM to 1 AM</th>\n",
" <th>...</th>\n",
" <th>9 AM to 2 PM</th>\n",
" <th>0 to 10 Years Old</th>\n",
" <th>10 to 20 Years Old</th>\n",
" <th>20 to 30 Years Old</th>\n",
" <th>30 to 40 Years Old</th>\n",
" <th>40 to 50 Years Old</th>\n",
" <th>50 to 60 Years Old</th>\n",
" <th>60 to 70 Years Old</th>\n",
" <th>70 to 80 Years Old</th>\n",
" <th>Greater than 80 Years Old</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>...</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.0</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" <td>159088.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>2.505286</td>\n",
" <td>0.393197</td>\n",
" <td>0.759466</td>\n",
" <td>0.453937</td>\n",
" <td>0.244921</td>\n",
" <td>0.461518</td>\n",
" <td>0.804002</td>\n",
" <td>1.598134</td>\n",
" <td>0.021956</td>\n",
" <td>0.081282</td>\n",
" <td>...</td>\n",
" <td>0.579440</td>\n",
" <td>0.0</td>\n",
" <td>0.013320</td>\n",
" <td>0.602629</td>\n",
" <td>0.645712</td>\n",
" <td>0.366690</td>\n",
" <td>0.227534</td>\n",
" <td>0.055510</td>\n",
" <td>0.003960</td>\n",
" <td>0.000666</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>5.251572</td>\n",
" <td>2.298957</td>\n",
" <td>2.635154</td>\n",
" <td>1.278561</td>\n",
" <td>0.795284</td>\n",
" <td>1.693296</td>\n",
" <td>2.337181</td>\n",
" <td>3.531003</td>\n",
" <td>0.212212</td>\n",
" <td>0.372497</td>\n",
" <td>...</td>\n",
" <td>1.624712</td>\n",
" <td>0.0</td>\n",
" <td>0.151943</td>\n",
" <td>1.530073</td>\n",
" <td>1.637176</td>\n",
" <td>1.125984</td>\n",
" <td>0.812428</td>\n",
" <td>0.334166</td>\n",
" <td>0.082756</td>\n",
" <td>0.035450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>3.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>2.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>1.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>191.000000</td>\n",
" <td>154.000000</td>\n",
" <td>100.000000</td>\n",
" <td>55.000000</td>\n",
" <td>56.000000</td>\n",
" <td>146.000000</td>\n",
" <td>152.000000</td>\n",
" <td>131.000000</td>\n",
" <td>16.000000</td>\n",
" <td>18.000000</td>\n",
" <td>...</td>\n",
" <td>93.000000</td>\n",
" <td>0.0</td>\n",
" <td>13.000000</td>\n",
" <td>91.000000</td>\n",
" <td>54.000000</td>\n",
" <td>31.000000</td>\n",
" <td>33.000000</td>\n",
" <td>13.000000</td>\n",
" <td>5.000000</td>\n",
" <td>5.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>8 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" flow 0 to 5 Minutes 5 to 10 Minutes 10 to 15 Minutes \\\n",
"count 159088.000000 159088.000000 159088.000000 159088.000000 \n",
"mean 2.505286 0.393197 0.759466 0.453937 \n",
"std 5.251572 2.298957 2.635154 1.278561 \n",
"min 0.000000 0.000000 0.000000 0.000000 \n",
"25% 0.000000 0.000000 0.000000 0.000000 \n",
"50% 1.000000 0.000000 0.000000 0.000000 \n",
"75% 3.000000 0.000000 0.000000 0.000000 \n",
"max 191.000000 154.000000 100.000000 55.000000 \n",
"\n",
" 15 to 20 Minutes Greater than 20 Minutes Female \\\n",
"count 159088.000000 159088.000000 159088.000000 \n",
"mean 0.244921 0.461518 0.804002 \n",
"std 0.795284 1.693296 2.337181 \n",
"min 0.000000 0.000000 0.000000 \n",
"25% 0.000000 0.000000 0.000000 \n",
"50% 0.000000 0.000000 0.000000 \n",
"75% 0.000000 1.000000 1.000000 \n",
"max 56.000000 146.000000 152.000000 \n",
"\n",
" Male 1 AM to 6 AM 10 PM to 1 AM ... \\\n",
"count 159088.000000 159088.000000 159088.000000 ... \n",
"mean 1.598134 0.021956 0.081282 ... \n",
"std 3.531003 0.212212 0.372497 ... \n",
"min 0.000000 0.000000 0.000000 ... \n",
"25% 0.000000 0.000000 0.000000 ... \n",
"50% 0.000000 0.000000 0.000000 ... \n",
"75% 2.000000 0.000000 0.000000 ... \n",
"max 131.000000 16.000000 18.000000 ... \n",
"\n",
" 9 AM to 2 PM 0 to 10 Years Old 10 to 20 Years Old \\\n",
"count 159088.000000 159088.0 159088.000000 \n",
"mean 0.579440 0.0 0.013320 \n",
"std 1.624712 0.0 0.151943 \n",
"min 0.000000 0.0 0.000000 \n",
"25% 0.000000 0.0 0.000000 \n",
"50% 0.000000 0.0 0.000000 \n",
"75% 1.000000 0.0 0.000000 \n",
"max 93.000000 0.0 13.000000 \n",
"\n",
" 20 to 30 Years Old 30 to 40 Years Old 40 to 50 Years Old \\\n",
"count 159088.000000 159088.000000 159088.000000 \n",
"mean 0.602629 0.645712 0.366690 \n",
"std 1.530073 1.637176 1.125984 \n",
"min 0.000000 0.000000 0.000000 \n",
"25% 0.000000 0.000000 0.000000 \n",
"50% 0.000000 0.000000 0.000000 \n",
"75% 1.000000 1.000000 0.000000 \n",
"max 91.000000 54.000000 31.000000 \n",
"\n",
" 50 to 60 Years Old 60 to 70 Years Old 70 to 80 Years Old \\\n",
"count 159088.000000 159088.000000 159088.000000 \n",
"mean 0.227534 0.055510 0.003960 \n",
"std 0.812428 0.334166 0.082756 \n",
"min 0.000000 0.000000 0.000000 \n",
"25% 0.000000 0.000000 0.000000 \n",
"50% 0.000000 0.000000 0.000000 \n",
"75% 0.000000 0.000000 0.000000 \n",
"max 33.000000 13.000000 5.000000 \n",
"\n",
" Greater than 80 Years Old \n",
"count 159088.000000 \n",
"mean 0.000666 \n",
"std 0.035450 \n",
"min 0.000000 \n",
"25% 0.000000 \n",
"50% 0.000000 \n",
"75% 0.000000 \n",
"max 5.000000 \n",
"\n",
"[8 rows x 24 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df_agg= pd.merge(df, df_dummy,right_index=True,left_index=True)\n",
"odgroups=df_agg.groupby(by=[\"start station id\",\"end station id\",\"start station latitude\",\"start station longitude\",\"end station latitude\",\"end station longitude\"])\n",
"odgroupstats=odgroups[[\"flow\"]+list(df_dummy_cols)].agg(\"sum\")\n",
"odgroupstats=(odgroupstats/week_range).round(0) #Get Trips Per Week\n",
"display(odgroupstats.describe())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generate Outputs\n",
"Generate outputs looked for by spatial sankey- OD Table with flows and geojson file. \n",
"An additional version of the OD table with the summarized data is also created. "
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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>source</th>\n",
" <th>target</th>\n",
" <th>start station latitude</th>\n",
" <th>start station longitude</th>\n",
" <th>end station latitude</th>\n",
" <th>end station longitude</th>\n",
" <th>flow</th>\n",
" <th>0 to 5 Minutes</th>\n",
" <th>5 to 10 Minutes</th>\n",
" <th>10 to 15 Minutes</th>\n",
" <th>...</th>\n",
" <th>9 AM to 2 PM</th>\n",
" <th>0 to 10 Years Old</th>\n",
" <th>10 to 20 Years Old</th>\n",
" <th>20 to 30 Years Old</th>\n",
" <th>30 to 40 Years Old</th>\n",
" <th>40 to 50 Years Old</th>\n",
" <th>50 to 60 Years Old</th>\n",
" <th>60 to 70 Years Old</th>\n",
" <th>70 to 80 Years Old</th>\n",
" <th>Greater than 80 Years Old</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>40.767272</td>\n",
" <td>-73.993929</td>\n",
" <td>40.767272</td>\n",
" <td>-73.993929</td>\n",
" <td>31.0</td>\n",
" <td>8.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>...</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>7.0</td>\n",
" <td>5.0</td>\n",
" <td>3.0</td>\n",
" <td>4.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>72</td>\n",
" <td>79</td>\n",
" <td>40.767272</td>\n",
" <td>-73.993929</td>\n",
" <td>40.719116</td>\n",
" <td>-74.006667</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>72</td>\n",
" <td>116</td>\n",
" <td>40.767272</td>\n",
" <td>-73.993929</td>\n",
" <td>40.741776</td>\n",
" <td>-74.001497</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>72</td>\n",
" <td>127</td>\n",
" <td>40.767272</td>\n",
" <td>-73.993929</td>\n",
" <td>40.731724</td>\n",
" <td>-74.006744</td>\n",
" <td>7.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1.0</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>72</td>\n",
" <td>128</td>\n",
" <td>40.767272</td>\n",
" <td>-73.993929</td>\n",
" <td>40.727103</td>\n",
" <td>-74.002971</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 30 columns</p>\n",
"</div>"
],
"text/plain": [
" source target start station latitude start station longitude \\\n",
"0 72 72 40.767272 -73.993929 \n",
"1 72 79 40.767272 -73.993929 \n",
"2 72 116 40.767272 -73.993929 \n",
"3 72 127 40.767272 -73.993929 \n",
"4 72 128 40.767272 -73.993929 \n",
"\n",
" end station latitude end station longitude flow 0 to 5 Minutes \\\n",
"0 40.767272 -73.993929 31.0 8.0 \n",
"1 40.719116 -74.006667 1.0 0.0 \n",
"2 40.741776 -74.001497 2.0 0.0 \n",
"3 40.731724 -74.006744 7.0 0.0 \n",
"4 40.727103 -74.002971 1.0 0.0 \n",
"\n",
" 5 to 10 Minutes 10 to 15 Minutes ... 9 AM to 2 PM \\\n",
"0 4.0 2.0 ... 7.0 \n",
"1 0.0 0.0 ... 0.0 \n",
"2 0.0 0.0 ... 0.0 \n",
"3 0.0 0.0 ... 2.0 \n",
"4 0.0 0.0 ... 0.0 \n",
"\n",
" 0 to 10 Years Old 10 to 20 Years Old 20 to 30 Years Old \\\n",
"0 0.0 0.0 7.0 \n",
"1 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 \n",
"3 0.0 0.0 1.0 \n",
"4 0.0 0.0 0.0 \n",
"\n",
" 30 to 40 Years Old 40 to 50 Years Old 50 to 60 Years Old \\\n",
"0 5.0 3.0 4.0 \n",
"1 1.0 0.0 0.0 \n",
"2 1.0 0.0 0.0 \n",
"3 2.0 2.0 0.0 \n",
"4 0.0 0.0 0.0 \n",
"\n",
" 60 to 70 Years Old 70 to 80 Years Old Greater than 80 Years Old \n",
"0 3.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",
"[5 rows x 30 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"odgroupstats.reset_index(level=odgroupstats.index.names, inplace=True)\n",
"odgroupstats=odgroupstats.rename(index=str,columns={\"start station id\":\"source\",\"end station id\":\"target\"})\n",
"display(odgroupstats.head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generate OD Flow Tables"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"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>source</th>\n",
" <th>flow</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>72</td>\n",
" <td>72</td>\n",
" <td>31.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>79</td>\n",
" <td>72</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>116</td>\n",
" <td>72</td>\n",
" <td>2.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>127</td>\n",
" <td>72</td>\n",
" <td>7.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>128</td>\n",
" <td>72</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" target source flow\n",
"0 72 72 31.0\n",
"1 79 72 1.0\n",
"2 116 72 2.0\n",
"3 127 72 7.0\n",
"4 128 72 1.0"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"links_out = os.path.join(output_dir,\"links.csv\")\n",
"links_out_long = os.path.join(output_dir,\"links_long.csv\")\n",
"odgroupstats[[\"target\",\"source\",\"flow\"]].to_csv(links_out,index=False)\n",
"field_names=odgroupstats.columns\n",
"long_name_fields=[str(i) for i in field_names if i not in ['source', 'target', 'start station latitude', 'start station longitude', 'end station latitude', 'end station longitude', 'flow']]\n",
"odgroupstats[[\"target\",\"source\",\"flow\"]+long_name_fields].to_csv(links_out_long,index=False)\n",
"display(odgroupstats[[\"target\",\"source\",\"flow\"]].head())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generate Geojson OD File\n",
"Get unique origins and reduce to geojson file with respective ID"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python2.7/dist-packages/matplotlib/font_manager.py:1320: UserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to DejaVu Sans\n",
" (prop.get_family(), self.defaultFamily[fontext]))\n"
]
},
{
"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>id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>POINT (-73.99392888 40.76727216)</td>\n",
" <td>72</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>POINT (-74.00666661 40.71911552)</td>\n",
" <td>79</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>POINT (-74.00016545 40.71117416)</td>\n",
" <td>82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>POINT (-73.97632328 40.68382604)</td>\n",
" <td>83</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>POINT (-74.00149746 40.74177603)</td>\n",
" <td>116</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry id\n",
"0 POINT (-73.99392888 40.76727216) 72\n",
"1 POINT (-74.00666661 40.71911552) 79\n",
"2 POINT (-74.00016545 40.71117416) 82\n",
"3 POINT (-73.97632328 40.68382604) 83\n",
"4 POINT (-74.00149746 40.74177603) 116"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f65984e78d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"odgroupgeo= odgroupstats[[\"source\",\"start station latitude\", \"start station longitude\"]].drop_duplicates()\n",
"odgroupgeo= odgroupgeo[(odgroupgeo[\"start station latitude\"]!=0) & (odgroupgeo[\"start station longitude\"]!=0)]\n",
"geometry = [Point(xy) for xy in zip(odgroupgeo[\"start station longitude\"],odgroupgeo[\"start station latitude\"])]\n",
"\n",
"crs = {'init': 'epsg:4326'}\n",
"citi_gdf = gpd.GeoDataFrame(odgroupgeo, crs=crs, geometry=geometry)\n",
"citi_gdf = citi_gdf[[\"geometry\",\"source\"]].reset_index(drop=True)\n",
"citi_gdf = citi_gdf.rename(index=str,columns={\"source\":\"id\"})\n",
"citi_gdf.plot()\n",
"display(citi_gdf.head())"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script src=\"/static/components/requirejs/require.js\"></script>\n",
" <script>\n",
" requirejs.config({\n",
" paths: {\n",
" base: '/static/base',\n",
" },\n",
" });\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saved Geojson File\n"
]
}
],
"source": [
"out_geojson= os.path.join(output_dir,\"nodes.geojson\")\n",
"if os.path.exists(out_geojson):\n",
" os.remove(out_geojson)\n",
"citi_gdf.to_file(out_geojson, driver=\"GeoJSON\")\n",
"print(\"Saved Geojson File\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment