Skip to content

Instantly share code, notes, and snippets.

@TaylorOshan
Created September 14, 2016 15:48
Show Gist options
  • Save TaylorOshan/a718df685298bbd6638e503545babc05 to your computer and use it in GitHub Desktop.
Save TaylorOshan/a718df685298bbd6638e503545babc05 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 409,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from pysal.contrib.spint.gravity import BaseGravity, Gravity, Production, Attraction, Doubly\n",
"import numpy as np\n",
"import pysal as ps\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 410,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Unnamed: 0</th>\n",
" <th>index</th>\n",
" <th>count</th>\n",
" <th>d_cap</th>\n",
" <th>d_tract</th>\n",
" <th>distance</th>\n",
" <th>end station latitude</th>\n",
" <th>end station longitude</th>\n",
" <th>o_cap</th>\n",
" <th>o_tract</th>\n",
" <th>...</th>\n",
" <th>weighted</th>\n",
" <th>total_out</th>\n",
" <th>total_in</th>\n",
" <th>o_hub</th>\n",
" <th>d_hub</th>\n",
" <th>od_hub</th>\n",
" <th>SX</th>\n",
" <th>SY</th>\n",
" <th>EX</th>\n",
" <th>EY</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>5709</td>\n",
" <td>255.0</td>\n",
" <td>600</td>\n",
" <td>NaN</td>\n",
" <td>40.712899</td>\n",
" <td>-73.989865</td>\n",
" <td>162.0</td>\n",
" <td>202</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>56352</td>\n",
" <td>69165</td>\n",
" <td>hub</td>\n",
" <td>hub</td>\n",
" <td>hub</td>\n",
" <td>585995.353038</td>\n",
" <td>4.507417e+06</td>\n",
" <td>585322.159723</td>\n",
" <td>4.507378e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>4010</td>\n",
" <td>595.0</td>\n",
" <td>600</td>\n",
" <td>NaN</td>\n",
" <td>40.712899</td>\n",
" <td>-73.989865</td>\n",
" <td>774.0</td>\n",
" <td>700</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>160040</td>\n",
" <td>69165</td>\n",
" <td>hub</td>\n",
" <td>hub</td>\n",
" <td>hub</td>\n",
" <td>583785.918305</td>\n",
" <td>4.506573e+06</td>\n",
" <td>585322.159723</td>\n",
" <td>4.507378e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1906</td>\n",
" <td>170.0</td>\n",
" <td>600</td>\n",
" <td>NaN</td>\n",
" <td>40.712899</td>\n",
" <td>-73.989865</td>\n",
" <td>141.0</td>\n",
" <td>800</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>34254</td>\n",
" <td>69165</td>\n",
" <td>hub</td>\n",
" <td>hub</td>\n",
" <td>non_hub</td>\n",
" <td>585018.109713</td>\n",
" <td>4.507320e+06</td>\n",
" <td>585322.159723</td>\n",
" <td>4.507378e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>1192</td>\n",
" <td>255.0</td>\n",
" <td>600</td>\n",
" <td>NaN</td>\n",
" <td>40.712899</td>\n",
" <td>-73.989865</td>\n",
" <td>291.0</td>\n",
" <td>900</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>46446</td>\n",
" <td>69165</td>\n",
" <td>hub</td>\n",
" <td>hub</td>\n",
" <td>non_hub</td>\n",
" <td>583444.520998</td>\n",
" <td>4.506199e+06</td>\n",
" <td>585322.159723</td>\n",
" <td>4.507378e+06</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>484</td>\n",
" <td>85.0</td>\n",
" <td>600</td>\n",
" <td>NaN</td>\n",
" <td>40.712899</td>\n",
" <td>-73.989865</td>\n",
" <td>57.0</td>\n",
" <td>1002</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>15916</td>\n",
" <td>69165</td>\n",
" <td>hub</td>\n",
" <td>hub</td>\n",
" <td>non_hub</td>\n",
" <td>586462.456350</td>\n",
" <td>4.507937e+06</td>\n",
" <td>585322.159723</td>\n",
" <td>4.507378e+06</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 35 columns</p>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0 index count d_cap d_tract distance end station latitude \\\n",
"0 0 0 5709 255.0 600 NaN 40.712899 \n",
"1 1 1 4010 595.0 600 NaN 40.712899 \n",
"2 2 2 1906 170.0 600 NaN 40.712899 \n",
"3 3 3 1192 255.0 600 NaN 40.712899 \n",
"4 4 4 484 85.0 600 NaN 40.712899 \n",
"\n",
" end station longitude o_cap o_tract ... weighted total_out \\\n",
"0 -73.989865 162.0 202 ... 0.0 56352 \n",
"1 -73.989865 774.0 700 ... 0.0 160040 \n",
"2 -73.989865 141.0 800 ... 0.0 34254 \n",
"3 -73.989865 291.0 900 ... 0.0 46446 \n",
"4 -73.989865 57.0 1002 ... 0.0 15916 \n",
"\n",
" total_in o_hub d_hub od_hub SX SY \\\n",
"0 69165 hub hub hub 585995.353038 4.507417e+06 \n",
"1 69165 hub hub hub 583785.918305 4.506573e+06 \n",
"2 69165 hub hub non_hub 585018.109713 4.507320e+06 \n",
"3 69165 hub hub non_hub 583444.520998 4.506199e+06 \n",
"4 69165 hub hub non_hub 586462.456350 4.507937e+06 \n",
"\n",
" EX EY \n",
"0 585322.159723 4.507378e+06 \n",
"1 585322.159723 4.507378e+06 \n",
"2 585322.159723 4.507378e+06 \n",
"3 585322.159723 4.507378e+06 \n",
"4 585322.159723 4.507378e+06 \n",
"\n",
"[5 rows x 35 columns]"
]
},
"execution_count": 410,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Load NYC bike data - trips between census tract centroids\n",
"bikes = pd.read_csv(ps.examples.get_path('nyc_bikes_ct.csv'))\n",
"bikes.head()"
]
},
{
"cell_type": "code",
"execution_count": 411,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"14042 OD pairs between census tracts after filtering out intrazonal flows\n"
]
}
],
"source": [
"#Process data\n",
"\n",
"#Remove intrazonal flows\n",
"bikes = bikes[bikes['o_tract'] != bikes['d_tract']]\n",
"\n",
"#Set zero attirbute values to a small constant\n",
"bikes.ix[bikes.o_sq_foot == 0, 'o_sq_foot'] = 1\n",
"bikes.ix[bikes.d_sq_foot == 0, 'd_sq_foot'] = 1\n",
"bikes.ix[bikes.o_cap == 0, 'o_cap'] = 1\n",
"bikes.ix[bikes.d_cap == 0, 'd_cap'] = 1\n",
"bikes.ix[bikes.o_housing == 0, 'o_housing'] = 1\n",
"bikes.ix[bikes.d_housing == 0, 'd_housing'] = 1\n",
"\n",
"#Flows between tracts\n",
"flows = bikes['count'].values.reshape((-1,1))\n",
"\n",
"#Origin variables: square footage of buildings, housing units, total station capacity\n",
"o_vars = np.hstack([bikes['o_sq_foot'].values.reshape((-1,1)),\n",
" bikes['o_housing'].values.reshape((-1,1)),\n",
" bikes['o_cap'].values.reshape((-1,1))])\n",
"\n",
"#Destination variables: square footage of buildings, housing units, total station capacity\n",
"d_vars = np.hstack([bikes['d_sq_foot'].values.reshape((-1,1)),\n",
" bikes['d_housing'].values.reshape((-1,1)),\n",
" bikes['d_cap'].values.reshape((-1,1))])\n",
"\n",
"#Trip \"cost\" in time (seconds)\n",
"cost = bikes['tripduration'].values.reshape((-1,1))\n",
"\n",
"#Origin ids\n",
"o = bikes['o_tract'].astype(str).values.reshape((-1,1))\n",
"\n",
"#destination ids\n",
"d = bikes['d_tract'].astype(str).values.reshape((-1,1))\n",
"\n",
"print len(bikes), ' OD pairs between census tracts after filtering out intrazonal flows'"
]
},
{
"cell_type": "code",
"execution_count": 412,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.09898099 0.05748786 0.50319944 0.06920194 0.06408526 0.39371417\n",
" -0.00226671]\n"
]
}
],
"source": [
"#Estimate gravity model using exponential function of distance-decay\n",
"\n",
"grav= Gravity(flows, o_vars, d_vars, cost, 'exp')\n",
"\n",
"print grav.params"
]
},
{
"cell_type": "code",
"execution_count": 413,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#predicted response values using covariates\n",
"yhat = (0.09898099*np.log(o_vars[:,0])) + (0.05748786*np.log(o_vars[:,1])) + (0.50319944*np.log(o_vars[:,2])) + (0.06920194*np.log(d_vars[:,0])) + (0.06408526 *np.log(d_vars[:,1])) + (0.39371417*np.log(d_vars[:,2])) + (-0.00226671*cost[:,0]) "
]
},
{
"cell_type": "code",
"execution_count": 414,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#predicted response values using covariates and adding +1 to distance\n",
"yhat2 = (0.09898099*np.log(o_vars[:,0])) + (0.05748786*np.log(o_vars[:,1])) + (0.50319944*np.log(o_vars[:,2])) + (0.06920194*np.log(d_vars[:,0])) + (0.06408526 *np.log(d_vars[:,1])) + (0.39371417*np.log(d_vars[:,2])) + (-0.00226671*(cost[:,0]+1.0)) "
]
},
{
"cell_type": "code",
"execution_count": 415,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.63611161081\n",
"2071.67266526\n"
]
}
],
"source": [
"#predicted response variable before exponential transofrmation to satisfy log link\n",
"print yhat[0]\n",
"print np.exp(yhat[0])"
]
},
{
"cell_type": "code",
"execution_count": 416,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.63384490081\n",
"2066.9821022\n"
]
}
],
"source": [
"#predicted response variable for 1 unit increase in distance before exponential transofrmation to satisfy log link\n",
"print yhat2[0]\n",
"print np.exp(yhat2[0])"
]
},
{
"cell_type": "code",
"execution_count": 417,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The difference in responses, 0.00226671 , times 100 is the percentage (relative) change\n",
"The difference in responses, 4.69056306565 , is the absolute change\n"
]
}
],
"source": [
"#Difference in predicted response variables (+1 distance) before and after exponenetiation\n",
"print 'The difference in responses,', yhat[0] - yhat2[0], ', times 100 is the percentage (relative) change'\n",
"print 'The difference in responses,', np.exp(yhat[0]) - np.exp(yhat2[0]), ', is the absolute change'"
]
},
{
"cell_type": "code",
"execution_count": 418,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.226414295284\n",
"4.69056306565\n"
]
}
],
"source": [
"#Similarly, we can look at the % change from a 1 unit increase in distance\n",
"print ((np.exp(yhat[0]) - np.exp(yhat2[0]))/ np.exp(yhat[0]))*100\n",
"print np.exp(yhat[0])*0.00226414295284"
]
},
{
"cell_type": "code",
"execution_count": 419,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.226414295284\n"
]
}
],
"source": [
"#Here the % change is the same as (1 - np.exp(beta))*100\n",
"print (1.0 - np.exp(-0.00226671))*100"
]
},
{
"cell_type": "code",
"execution_count": 420,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2066.98210219\n",
"2071.67266526 - 2066.98210219 = 4.69056307\n",
"4.69056306564 absolute difference, which is the same .2264% difference\n"
]
}
],
"source": [
"#Which is why we can compute the effect of increasing distance +1\n",
"#w/o using the entire linear predictor\n",
"print 2071.67266526*np.exp(-0.00226671)\n",
"print '2071.67266526 - 2066.98210219 = ', 2071.67266526 - 2066.98210219\n",
"print 2071.67266526 - 2066.9821021943644, 'absolute difference, which is the same .2264% difference'"
]
},
{
"cell_type": "code",
"execution_count": 421,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.00226671 0.00226671 0.00226671 ..., 0.00226671 0.00226671\n",
" 0.00226671]\n"
]
}
],
"source": [
"#This relative change is the same for all observations\n",
"print yhat-yhat2"
]
},
{
"cell_type": "code",
"execution_count": 422,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 4.69056307 9.74483347 4.58169324 ..., 0.42161474 0.74276242\n",
" 3.88429576]\n"
]
}
],
"source": [
"#Though the absolute difference is unique for each observation\n",
"print np.exp(yhat)-np.exp(yhat2)"
]
},
{
"cell_type": "code",
"execution_count": 423,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.28859837 0.15098447 0.46334398 0.26708303 0.1638457 0.36553998\n",
" -1.54771364]\n"
]
}
],
"source": [
"#Estimate gravity model using power function of distance-decay\n",
"\n",
"grav= Gravity(flows, o_vars, d_vars, cost, 'pow')\n",
"\n",
"print grav.params"
]
},
{
"cell_type": "code",
"execution_count": 424,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#predicted response values using covariates\n",
"yhat = (0.28859837*np.log(o_vars[:,0])) + (0.15098447*np.log(o_vars[:,1])) + (0.46334398*np.log(o_vars[:,2])) + (0.26708303*np.log(d_vars[:,0])) + (0.1638457 *np.log(d_vars[:,1])) + (0.36553998*np.log(d_vars[:,2])) + (-1.54771364*np.log(cost[:,0])) "
]
},
{
"cell_type": "code",
"execution_count": 425,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#predicted response values using covariates and adding +1 to distance\n",
"yhat2 = (0.28859837*np.log(o_vars[:,0])) + (0.15098447*np.log(o_vars[:,1])) + (0.46334398*np.log(o_vars[:,2])) + (0.26708303*np.log(d_vars[:,0])) + (0.1638457 *np.log(d_vars[:,1])) + (0.36553998*np.log(d_vars[:,2])) + (-1.54771364*np.log(cost[:,0]+1.0)) "
]
},
{
"cell_type": "code",
"execution_count": 426,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.26071186285\n",
"1423.26934924\n"
]
}
],
"source": [
"#predicted response variable before exponential transofrmation to satisfy log link\n",
"print yhat[0]\n",
"print np.exp(yhat[0])"
]
},
{
"cell_type": "code",
"execution_count": 427,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.25745127664\n",
"1418.6362143\n"
]
}
],
"source": [
"#predicted response variable for 1 unit increase in distance before exponential transofrmation to satisfy log link\n",
"print yhat2[0]\n",
"print np.exp(yhat2[0])"
]
},
{
"cell_type": "code",
"execution_count": 428,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The difference in responses, 0.00326058621352 , times 100 is the (relative) percentage change\n",
"The difference in responses, 4.63313494557 , is the absolute change\n"
]
}
],
"source": [
"#Difference in predicted response variables (+1 distance) before and after exponenetiation\n",
"print 'The difference in responses,', yhat[0] - yhat2[0], ', times 100 is the (relative) percentage change'\n",
"print 'The difference in responses,', np.exp(yhat[0]) - np.exp(yhat2[0]), ', is the absolute change'"
]
},
{
"cell_type": "code",
"execution_count": 429,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.325527627503\n",
"4.63313494557\n"
]
}
],
"source": [
"#Similarly, we can look at the % change from a 1 unit increase in distance\n",
"print ((np.exp(yhat[0]) - np.exp(yhat2[0]))/ np.exp(yhat[0]))*100\n",
"print np.exp(yhat[0])*0.00325527627503"
]
},
{
"cell_type": "code",
"execution_count": 430,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"78.7266195716\n",
"The reason for this is because the coefficient represents a 1 unit change in log(distance) and not distance itself\n"
]
}
],
"source": [
"#DIFFERENCE #1\n",
"#Here the % change is NOT the same as (1 - np.exp(beta))*100 !!!!!\n",
"print (1.0 - np.exp(-1.54771364))*100\n",
"print 'The reason for this is because the coefficient represents a 1 unit change in log(distance) and not distance itself'"
]
},
{
"cell_type": "code",
"execution_count": 431,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"302.777503185\n",
"1423.26934924 - 302.777503185 = 1120.49184606\n",
"1120.49184606 != 4.63313494\n",
"1120.49184606 absolute difference, which is 78.7% difference and not the same as .325% differemce\n"
]
}
],
"source": [
"#Which is why we CANNOT compute the effect of increasing distance +1\n",
"#w/o using the entire linear predictor in the same manner\n",
"print 1423.26934924*np.exp(-1.54771364)\n",
"print '1423.26934924 - 302.777503185 = ', 1423.26934924 - 302.777503185\n",
"print '1120.49184606 != 4.63313494'\n",
"print '1120.49184606 absolute difference, which is 78.7% difference and not the same as .325% differemce'"
]
},
{
"cell_type": "code",
"execution_count": 432,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.16157350994\n",
"6.16157350994 + 1 = 7.16157350994\n",
"exp(7.16157350994) = 1288.93749404\n",
"If we plug in 7.16157350994 instead of log(474.17360501) into our linear predictor we get 302.77750318869766\n"
]
}
],
"source": [
"#What we are actually computing is the effect of increasing distance from 474.17360501 to 1288.9374940336004 (+814.7638890236003)\n",
"print np.log(474.17360501)\n",
"print '6.16157350994 + 1 =', np.log(474.17360501) + 1\n",
"print 'exp(7.16157350994) = ', np.exp(7.16157350994)\n",
"print 'If we plug in 7.16157350994 instead of log(474.17360501) into our linear predictor we get 302.77750318869766'"
]
},
{
"cell_type": "code",
"execution_count": 433,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.00326059 0.0020194 0.003905 ..., 0.0010131 0.00111467\n",
" 0.00264439]\n"
]
}
],
"source": [
"#Which leads to DIFFERENCE #2\n",
"#The relative change is NOT the same for all observations\n",
"print yhat-yhat2"
]
},
{
"cell_type": "code",
"execution_count": 434,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 4.63313495 8.44571954 6.42875335 ..., 0.32398569 0.44679361\n",
" 2.8630947 ]\n"
]
}
],
"source": [
"#And the absolute difference is still unique for each observation\n",
"print np.exp(yhat)-np.exp(yhat2)"
]
},
{
"cell_type": "code",
"execution_count": 435,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"In this case log(475.17360501) - log(474.17360501) = 0.00210671155779\n",
"Then 1423.26934924 * exp(-1.5477*0.00210671155779) = 1418.63625506\n",
"Which is the same change we predict for a 1 unit change using our linear predictor\n",
"The original predicted response (1423.26934924) and the delta (0.00210671155779) can be substituted\n",
"for vectors in order to obtain results for every observation, which is needed due to difference #2\n"
]
}
],
"source": [
"#Instead, if we want to compute the change from 1 absolute unit without the linear predictor\n",
"#we need to normalize the coefficient to represent the change associated with 1 distance unit (not 1 log(distance))\n",
"#Due to difference #2, this normaliation will be unique for each observation\n",
"#And is computed as delta_unit = log(cost+1) - log(cost) \n",
"\n",
"print 'In this case log(475.17360501) - log(474.17360501) =', np.log(475.17360501) - np.log(474.17360501)\n",
"\n",
"#Then we multiply this delta by the distance coefficient in order to make the formula work for a single unit\n",
"print 'Then 1423.26934924 * exp(-1.5477*0.00210671155779) =', 1423.26934924 * np.exp(-1.5477*0.00210671155779)\n",
"print 'Which is the same change we predict for a 1 unit change using our linear predictor'\n",
"print 'The original predicted response (1423.26934924) and the delta (0.00210671155779) can be substituted'\n",
"print 'for vectors in order to obtain results for every observation, which is needed due to difference #2'"
]
},
{
"cell_type": "code",
"execution_count": 436,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#A final note, is that if you want to interpret any of your other covariates pertaining to origins or destinations\n",
"#in either the exponential or power distance decay specifications in their actual units and not log(units) then you\n",
"#need to apply this same normalization as all of the origin/destination covariates are automaticallt logged in\n",
"#order to obtain the correct Poisson GLM spatial interaction model specification"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (spint)",
"language": "python",
"name": "spint"
},
"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": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment