diff --git a/.gitignore b/.gitignore
index 83915e9..924c1c0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
.cache
.eggs
.ipynb_checkpoints
+.~lock.*
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..a7a722b
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+recursive-include infrastructure_planning *.csv
+prune datasets
diff --git a/TODO.goals b/TODO.goals
index e343aae..178ed61 100644
--- a/TODO.goals
+++ b/TODO.goals
@@ -1,6 +1,4 @@
-Get electricity consumption by population curve
- Prototype tool to get population-consumption curve points by world, region, income group
-
+Prototype tool to get population-consumption curve points by world, region, income group
Estimate electricity consumption from curve
+ Make forecast_population use new spline fitting model
diff --git a/cc.ini b/cc.ini
index 0cd3312..6357edb 100644
--- a/cc.ini
+++ b/cc.ini
@@ -61,3 +61,5 @@ command_template = python forecast_electricity_consumption.py
--target_year {target_year}
target_year = 2020
+
+show_standard_error = True
diff --git a/datasets/world-country-name.csv b/datasets/world-country-name.csv
index fa223c1..ed1f0e9 100644
--- a/datasets/world-country-name.csv
+++ b/datasets/world-country-name.csv
@@ -1,216 +1,216 @@
-Afghanistan,,
-Albania,,
-Algeria,,
-American Samoa,,
-Andorra,,
-Angola,,
-Antarctica,,
-Antigua and Barbuda,,
-Argentina,,
-Armenia,,
-Aruba,,
-Australia,,
-Austria,,
-Azerbaijan,,
-"Bahamas, The",Bahamas,
-Bahrain,,
-Bangladesh,,
-Barbados,,
-Belarus,,
-Belgium,,
-Belize,,
-Benin,,
-Bermuda,,
-Bhutan,,
-Bolivia,Bolivia (Plurinational State of),
-Bosnia and Herzegovina,,
-Botswana,,
-Brazil,,
-Brunei Darussalam,,
-Bulgaria,,
-Burkina Faso,,
-Burundi,,
-Cabo Verde,Cape Verde,
-Cambodia,,
-Cameroon,,
-Canada,,
-Cayman Islands,,
-Central African Republic,,
-Chad,,
-Chile,,
-China,,
-Colombia,,
-Comoros,,
-"Congo, Dem. Rep.",Democratic Republic of the Congo,
-"Congo, Rep.",Congo,
-Costa Rica,,
-Côte d'Ivoire,Cote d'Ivoire,
-Croatia,,
-Cuba,,
-Curaçao,,
-Cyprus,,
-Czech Republic,,
-Denmark,,
-Djibouti,,
-Dominica,,
-Dominican Republic,,
-Ecuador,,
-"Egypt, Arab Rep.",Egypt,
-El Salvador,,
-Equatorial Guinea,,
-Eritrea,,
-Estonia,,
-Ethiopia,,
-Faeroe Islands,,
-Fiji,,
-Finland,,
-France,,
-French Polynesia,,
-Gabon,,
-"Gambia, The",Gambia,
-Georgia,,
-Germany,,
-Ghana,,
-Greece,,
-Greenland,,
-Grenada,,
-Guam,,
-Guatemala,,
-Guinea,,
-Guinea-Bissau,,
-Guyana,,
-Haiti,,
-Honduras,,
-"Hong Kong SAR, China","China, Hong Kong SAR",
-Hungary,,
-Iceland,,
-India,,
-Indonesia,,
-"Iran, Islamic Rep.",Iran (Islamic Republic of),
-Iraq,,
-Ireland,,
-Isle of Man,,
-Israel,,
-Italy,,
-Jamaica,,
-Japan,,
-Jordan,,
-Kazakhstan,,
-Kenya,,
-Kiribati,,
-"Korea, Dem. Rep.",Dem. People's Republic of Korea,
-"Korea, Rep.",Republic of Korea,
-Kosovo,,
-Kuwait,,
-Kyrgyz Republic,Kyrgyzstan,
-Lao PDR,Lao People's Democratic Republic,
-Latvia,,
-Lebanon,,
-Lesotho,,
-Liberia,,
-Libya,,
-Liechtenstein,,
-Lithuania,,
-Luxembourg,,
-"Macao SAR, China","China, Macao SAR",
-"Macedonia, FYR",TFYR Macedonia,
-Madagascar,,
-Malawi,,
-Malaysia,,
-Maldives,,
-Mali,,
-Malta,,
-Marshall Islands,,
-Mauritania,,
-Mauritius,,
-Mexico,,
-"Micronesia, Fed. Sts.",Micronesia (Fed. States of),
-Moldova,Republic of Moldova,
-Monaco,,
-Mongolia,,
-Montenegro,,
-Morocco,,
-Mozambique,,
-Myanmar,,
-Nauru,,
-Namibia,,
-Nepal,,
-Netherlands,,
-New Caledonia,,
-New Zealand,,
-Nicaragua,,
-Niger,,
-Nigeria,,
-Northern Mariana Islands,,
-Norway,,
-Oman,,
-Pakistan,,
-Palau,,
-Panama,,
-Papua New Guinea,,
-Paraguay,,
-Peru,,
-Philippines,,
-Poland,,
-Portugal,,
-Puerto Rico,,
-Qatar,,
-Romania,,
-Russian Federation,,
-Rwanda,,
-Samoa,,
-San Marino,,
-São Tomé and Principe,Sao Tome and Principe,
-Saudi Arabia,,
-Senegal,,
-Serbia,,
-Seychelles,,Yemen
-Sierra Leone,,Zambia
-Singapore,,Zimbabwe
-Sint Maarten (Dutch part),,
-Slovak Republic,Slovakia,
-Slovenia,,
-Solomon Islands,,
-Somalia,,
-South Africa,,
-South Sudan,,
-Spain,,
-Sri Lanka,,
-St. Kitts and Nevis,Saint Kitts and Nevis,
-St. Lucia,Saint Lucia,
-St. Martin (French part),,
-St. Vincent and the Grenadines,Saint Vincent and the Grenadines,
-Sudan,,
-Suriname,,
-Swaziland,,
-Sweden,,
-Switzerland,,
-Syrian Arab Republic,,
-Taiwan,,
-Tajikistan,,
-Tanzania,United Republic of Tanzania,
-Thailand,,
-Timor-Leste,,
-Togo,,
-Tonga,,
-Trinidad and Tobago,,
-Tunisia,,
-Turkey,,
-Turkmenistan,,
-Turks and Caicos Islands,,
-Tuvalu,,
-Uganda,,
-Ukraine,,
-United Arab Emirates,,
-United Kingdom,,
-United States,United States of America,
-Uruguay,,
-Uzbekistan,,
-Vanuatu,,
-"Venezuela, RB",Venezuela (Bolivarian Republic of),
-Vietnam,Viet Nam,
-Virgin Islands (U.S.),United States Virgin Islands,
-West Bank and Gaza,State of Palestine,
-"Yemen, Rep.",Yemen,
-Zambia,,
-Zimbabwe,,
+Afghanistan,
+Albania,
+Algeria,
+American Samoa,
+Andorra,
+Angola,
+Antarctica,
+Antigua and Barbuda,
+Argentina,
+Armenia,
+Aruba,
+Australia,
+Austria,
+Azerbaijan,
+"Bahamas, The",Bahamas
+Bahrain,
+Bangladesh,
+Barbados,
+Belarus,
+Belgium,
+Belize,
+Benin,
+Bermuda,
+Bhutan,
+Bolivia,Bolivia (Plurinational State of)
+Bosnia and Herzegovina,
+Botswana,
+Brazil,
+Brunei Darussalam,
+Bulgaria,
+Burkina Faso,
+Burundi,
+Cabo Verde,Cape Verde
+Cambodia,
+Cameroon,
+Canada,
+Cayman Islands,
+Central African Republic,
+Chad,
+Chile,
+China,
+Colombia,
+Comoros,
+"Congo, Dem. Rep.",Democratic Republic of the Congo
+"Congo, Rep.",Congo
+Costa Rica,
+Côte d'Ivoire,Cote d'Ivoire
+Croatia,
+Cuba,
+Curaçao,Curacao
+Cyprus,
+Czech Republic,
+Denmark,
+Djibouti,
+Dominica,
+Dominican Republic,
+Ecuador,
+"Egypt, Arab Rep.",Egypt
+El Salvador,
+Equatorial Guinea,
+Eritrea,
+Estonia,
+Ethiopia,
+Faeroe Islands,
+Fiji,
+Finland,
+France,
+French Polynesia,
+Gabon,
+"Gambia, The",Gambia
+Georgia,
+Germany,
+Ghana,
+Greece,
+Greenland,
+Grenada,
+Guam,
+Guatemala,
+Guinea,
+Guinea-Bissau,
+Guyana,
+Haiti,
+Honduras,
+"Hong Kong SAR, China","China, Hong Kong SAR"
+Hungary,
+Iceland,
+India,
+Indonesia,
+"Iran, Islamic Rep.",Iran (Islamic Republic of)
+Iraq,
+Ireland,
+Isle of Man,
+Israel,
+Italy,
+Jamaica,
+Japan,
+Jordan,
+Kazakhstan,
+Kenya,
+Kiribati,
+"Korea, Dem. Rep.",Dem. People's Republic of Korea
+"Korea, Rep.",Republic of Korea
+Kosovo,
+Kuwait,
+Kyrgyz Republic,Kyrgyzstan
+Lao PDR,Lao People's Democratic Republic
+Latvia,
+Lebanon,
+Lesotho,
+Liberia,
+Libya,
+Liechtenstein,
+Lithuania,
+Luxembourg,
+"Macao SAR, China","China, Macao SAR"
+"Macedonia, FYR",TFYR Macedonia
+Madagascar,
+Malawi,
+Malaysia,
+Maldives,
+Mali,
+Malta,
+Marshall Islands,
+Mauritania,
+Mauritius,
+Mexico,
+"Micronesia, Fed. Sts.",Micronesia (Fed. States of)
+Moldova,Republic of Moldova
+Monaco,
+Mongolia,
+Montenegro,
+Morocco,
+Mozambique,
+Myanmar,
+Nauru,
+Namibia,
+Nepal,
+Netherlands,
+New Caledonia,
+New Zealand,
+Nicaragua,
+Niger,
+Nigeria,
+Northern Mariana Islands,
+Norway,
+Oman,
+Pakistan,
+Palau,
+Panama,
+Papua New Guinea,
+Paraguay,
+Peru,
+Philippines,
+Poland,
+Portugal,
+Puerto Rico,
+Qatar,
+Romania,
+Russian Federation,
+Rwanda,
+Samoa,
+San Marino,
+São Tomé and Principe,Sao Tome and Principe
+Saudi Arabia,
+Senegal,
+Serbia,
+Seychelles,
+Sierra Leone,
+Singapore,
+Sint Maarten (Dutch part),
+Slovak Republic,Slovakia
+Slovenia,
+Solomon Islands,
+Somalia,
+South Africa,
+South Sudan,
+Spain,
+Sri Lanka,
+St. Kitts and Nevis,Saint Kitts and Nevis
+St. Lucia,Saint Lucia
+St. Martin (French part),
+St. Vincent and the Grenadines,Saint Vincent and the Grenadines
+Sudan,
+Suriname,
+Swaziland,
+Sweden,
+Switzerland,
+Syrian Arab Republic,
+Taiwan,
+Tajikistan,
+Tanzania,United Republic of Tanzania
+Thailand,
+Timor-Leste,
+Togo,
+Tonga,
+Trinidad and Tobago,
+Tunisia,
+Turkey,
+Turkmenistan,
+Turks and Caicos Islands,
+Tuvalu,
+Uganda,
+Ukraine,
+United Arab Emirates,
+United Kingdom,
+United States,United States of America
+Uruguay,
+Uzbekistan,
+Vanuatu,
+"Venezuela, RB",Venezuela (Bolivarian Republic of)
+Vietnam,Viet Nam
+Virgin Islands (U.S.),United States Virgin Islands
+West Bank and Gaza,State of Palestine
+"Yemen, Rep.",Yemen
+Zambia,
+Zimbabwe,
diff --git a/experiments/estimate-electricity-consumption-from-curve.ipynb b/experiments/estimate-electricity-consumption-from-curve.ipynb
deleted file mode 100644
index 198ed44..0000000
--- a/experiments/estimate-electricity-consumption-from-curve.ipynb
+++ /dev/null
@@ -1,236 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "from os.path import expanduser\n",
- "from pandas import read_csv\n",
- "\n",
- "demographic_by_year_table_path = expanduser('~/Projects/infrastructure-planning/datasets/usa-population-by-year-three-cities.csv')\n",
- "demographic_by_year_table = read_csv(demographic_by_year_table_path)\n",
- "demographic_by_year_table"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "demographic_by_year_table_name_column = 'City'\n",
- "demographic_by_year_table_year_column = 'Year'\n",
- "demographic_by_year_table_population_column = 'Population'"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# For the default consumption by population curve, I think we should get an average across all cities and countries\n",
- "# Another option is to get different consumption curves for different countries, regions and/or income groups\n",
- "# There should be an option to choose different consumption curves or define your own, perhaps graphically\n",
- "# This is a plot data type, which should plot directly\n",
- "\n",
- "# world\n",
- "# by country\n",
- "# by region\n",
- "# by income group"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Get consumption curve points across world by year\n",
- "# Get consumption curve points for each country by year\n",
- "# Get consumption curve points for each region by year\n",
- "# Get consumption curve points for each income group by year\n",
- "# This could be a tool...\n",
- "# Consider being able to combine multiple countries or multiple regions (maybe)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# We could also turn the population forecasting into a more close ended tool...\n",
- "# We might also be able to turn the consumption into a more close ended tool (if the user specifies the country profile) ..."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from pandas import DataFrame\n",
- "consumption_by_population_table = DataFrame([\n",
- " (100, 1000),\n",
- " (1000, 5000),\n",
- " (10000, 10000),\n",
- "], columns=['Population', 'Consumption'])\n",
- "consumption_by_population_table_population_column = 'Population'\n",
- "consumption_by_population_table_consumption_column = 'Consumption'"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " 0\n",
- "0 1"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "t = DataFrame([1])\n",
- "t.copy()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\nTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "consumption_by_population_table.plot(x='Population', y='Consumption');"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def estimate_consumption_from_curve(\n",
- " demographic_by_year_table,\n",
- " demographic_by_year_table_name_column,\n",
- " demographic_by_year_table_year_column,\n",
- " demographic_by_year_table_population_column,\n",
- " consumption_by_population_table,\n",
- " consumption_by_population_table_population_column,\n",
- " consumption_by_population_table_consumption_column):\n",
- " return consumption_by_year_table"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Define consumption_by_population_table"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Fit curve to consumption_by_population_table"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# For each row of population, interpolate to get consumption"
- ]
- }
- ],
- "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.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/experiments/get-alternate-country-name.ipynb b/experiments/get-alternate-country-name.ipynb
deleted file mode 100644
index 6087b1f..0000000
--- a/experiments/get-alternate-country-name.ipynb
+++ /dev/null
@@ -1,516 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from os.path import expanduser, join\n",
- "source_folder = expanduser('~/Projects/infrastructure-planning/datasets')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " 0 | \n",
- " 1 | \n",
- " 2 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " Afghanistan | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " Albania | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " Algeria | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " American Samoa | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " Andorra | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 5 | \n",
- " Angola | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 6 | \n",
- " Antarctica | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 7 | \n",
- " Antigua and Barbuda | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 8 | \n",
- " Argentina | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 9 | \n",
- " Armenia | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 10 | \n",
- " Aruba | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 11 | \n",
- " Australia | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 12 | \n",
- " Austria | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 13 | \n",
- " Azerbaijan | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 14 | \n",
- " Bahamas, The | \n",
- " Bahamas | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 15 | \n",
- " Bahrain | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 16 | \n",
- " Bangladesh | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 17 | \n",
- " Barbados | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 18 | \n",
- " Belarus | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 19 | \n",
- " Belgium | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 20 | \n",
- " Belize | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 21 | \n",
- " Benin | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 22 | \n",
- " Bermuda | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 23 | \n",
- " Bhutan | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 24 | \n",
- " Bolivia | \n",
- " Bolivia (Plurinational State of) | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 25 | \n",
- " Bosnia and Herzegovina | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 26 | \n",
- " Botswana | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 27 | \n",
- " Brazil | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 28 | \n",
- " Brunei Darussalam | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 29 | \n",
- " Bulgaria | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- " ... | \n",
- "
\n",
- " \n",
- " 186 | \n",
- " Switzerland | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 187 | \n",
- " Syrian Arab Republic | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 188 | \n",
- " Taiwan | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 189 | \n",
- " Tajikistan | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 190 | \n",
- " Tanzania | \n",
- " United Republic of Tanzania | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 191 | \n",
- " Thailand | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 192 | \n",
- " Timor-Leste | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 193 | \n",
- " Togo | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 194 | \n",
- " Tonga | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 195 | \n",
- " Trinidad and Tobago | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 196 | \n",
- " Tunisia | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 197 | \n",
- " Turkey | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 198 | \n",
- " Turkmenistan | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 199 | \n",
- " Turks and Caicos Islands | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 200 | \n",
- " Tuvalu | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 201 | \n",
- " Uganda | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 202 | \n",
- " Ukraine | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 203 | \n",
- " United Arab Emirates | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 204 | \n",
- " United Kingdom | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 205 | \n",
- " United States | \n",
- " United States of America | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 206 | \n",
- " Uruguay | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 207 | \n",
- " Uzbekistan | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 208 | \n",
- " Vanuatu | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 209 | \n",
- " Venezuela, RB | \n",
- " Venezuela (Bolivarian Republic of) | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 210 | \n",
- " Vietnam | \n",
- " Viet Nam | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 211 | \n",
- " Virgin Islands (U.S.) | \n",
- " United States Virgin Islands | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 212 | \n",
- " West Bank and Gaza | \n",
- " State of Palestine | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 213 | \n",
- " Yemen, Rep. | \n",
- " Yemen | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 214 | \n",
- " Zambia | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 215 | \n",
- " Zimbabwe | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- "
\n",
- "
216 rows × 3 columns
\n",
- "
"
- ],
- "text/plain": [
- " 0 1 2\n",
- "0 Afghanistan NaN NaN\n",
- "1 Albania NaN NaN\n",
- "2 Algeria NaN NaN\n",
- "3 American Samoa NaN NaN\n",
- "4 Andorra NaN NaN\n",
- "5 Angola NaN NaN\n",
- "6 Antarctica NaN NaN\n",
- "7 Antigua and Barbuda NaN NaN\n",
- "8 Argentina NaN NaN\n",
- "9 Armenia NaN NaN\n",
- "10 Aruba NaN NaN\n",
- "11 Australia NaN NaN\n",
- "12 Austria NaN NaN\n",
- "13 Azerbaijan NaN NaN\n",
- "14 Bahamas, The Bahamas NaN\n",
- "15 Bahrain NaN NaN\n",
- "16 Bangladesh NaN NaN\n",
- "17 Barbados NaN NaN\n",
- "18 Belarus NaN NaN\n",
- "19 Belgium NaN NaN\n",
- "20 Belize NaN NaN\n",
- "21 Benin NaN NaN\n",
- "22 Bermuda NaN NaN\n",
- "23 Bhutan NaN NaN\n",
- "24 Bolivia Bolivia (Plurinational State of) NaN\n",
- "25 Bosnia and Herzegovina NaN NaN\n",
- "26 Botswana NaN NaN\n",
- "27 Brazil NaN NaN\n",
- "28 Brunei Darussalam NaN NaN\n",
- "29 Bulgaria NaN NaN\n",
- ".. ... ... ...\n",
- "186 Switzerland NaN NaN\n",
- "187 Syrian Arab Republic NaN NaN\n",
- "188 Taiwan NaN NaN\n",
- "189 Tajikistan NaN NaN\n",
- "190 Tanzania United Republic of Tanzania NaN\n",
- "191 Thailand NaN NaN\n",
- "192 Timor-Leste NaN NaN\n",
- "193 Togo NaN NaN\n",
- "194 Tonga NaN NaN\n",
- "195 Trinidad and Tobago NaN NaN\n",
- "196 Tunisia NaN NaN\n",
- "197 Turkey NaN NaN\n",
- "198 Turkmenistan NaN NaN\n",
- "199 Turks and Caicos Islands NaN NaN\n",
- "200 Tuvalu NaN NaN\n",
- "201 Uganda NaN NaN\n",
- "202 Ukraine NaN NaN\n",
- "203 United Arab Emirates NaN NaN\n",
- "204 United Kingdom NaN NaN\n",
- "205 United States United States of America NaN\n",
- "206 Uruguay NaN NaN\n",
- "207 Uzbekistan NaN NaN\n",
- "208 Vanuatu NaN NaN\n",
- "209 Venezuela, RB Venezuela (Bolivarian Republic of) NaN\n",
- "210 Vietnam Viet Nam NaN\n",
- "211 Virgin Islands (U.S.) United States Virgin Islands NaN\n",
- "212 West Bank and Gaza State of Palestine NaN\n",
- "213 Yemen, Rep. Yemen NaN\n",
- "214 Zambia NaN NaN\n",
- "215 Zimbabwe NaN NaN\n",
- "\n",
- "[216 rows x 3 columns]"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from pandas import read_csv\n",
- "world_country_name_table_path = join(source_folder, 'world-country-name.csv')\n",
- "read_csv(world_country_name_table_path, header=None)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "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.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/experiments/get-population-consumption-curve-points.ipynb b/experiments/get-population-consumption-curve-points.ipynb
deleted file mode 100644
index ae8ab68..0000000
--- a/experiments/get-population-consumption-curve-points.ipynb
+++ /dev/null
@@ -1,2648 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Prototype tool to get population-consumption curve points by country, region, income group\n",
- "# Cite \"City population by sex, city and city type\" http://data.un.org/Data.aspx?d=POP&f=tableCode:240\n",
- "# Cite \"Electric power consumption (kWh per capita)\" http://data.worldbank.org/indicator/EG.USE.ELEC.KH.PC"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "from os.path import expanduser, join\n",
- "from pandas import read_csv\n",
- "source_folder = expanduser('~/Documents/infrastructure-planning')\n",
- "country_region_income_table_path = join(source_folder, 'country-region-income.csv')\n",
- "demographic_by_year_by_city_table_path = join(source_folder, 'demographic-by-year-by-city.csv')\n",
- "demographic_by_year_by_country_table_path = join(source_folder, 'demographic-by-year-by-country.csv')\n",
- "electricity_consumption_by_year_table_path = join(source_folder, 'electricity-consumption-by-year.csv')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "# country_region_income_table = read_csv(country_region_income_table_path, encoding='utf-8-sig')\n",
- "# country_region_income_table[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country Name | \n",
- " Country Code | \n",
- " Region | \n",
- " IncomeGroup | \n",
- " SpecialNotes | \n",
- " Unnamed: 5 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " Aruba | \n",
- " ABW | \n",
- " Latin America & Caribbean | \n",
- " High income: nonOECD | \n",
- " SNA data for 2000-2011 are updated from offici... | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " Afghanistan | \n",
- " AFG | \n",
- " South Asia | \n",
- " Low income | \n",
- " Fiscal year end: March 20; reporting period fo... | \n",
- " NaN | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country Name Country Code Region IncomeGroup \\\n",
- "0 Aruba ABW Latin America & Caribbean High income: nonOECD \n",
- "1 Afghanistan AFG South Asia Low income \n",
- "\n",
- " SpecialNotes Unnamed: 5 \n",
- "0 SNA data for 2000-2011 are updated from offici... NaN \n",
- "1 Fiscal year end: March 20; reporting period fo... NaN "
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from StringIO import StringIO # Note that cStringIO cannot handle unicode\n",
- "country_region_income_table = read_csv(StringIO(open(country_region_income_table_path, 'r').read().decode('utf-8-sig')))\n",
- "country_region_income_table[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country or Area | \n",
- " Year(s) | \n",
- " Variant | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Const. mortality (Medium) | \n",
- " 40190.280 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Constant-fertility scenario | \n",
- " 845843.367 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country or Area Year(s) Variant Value\n",
- "0 Afghanistan 2100 Const. mortality (Medium) 40190.280\n",
- "1 Afghanistan 2100 Constant-fertility scenario 845843.367"
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "demographic_by_year_by_country_table = read_csv(demographic_by_year_by_country_table_path)\n",
- "demographic_by_year_by_country_table[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country Name | \n",
- " Country Code | \n",
- " Indicator Name | \n",
- " Indicator Code | \n",
- " 1960 | \n",
- " 1961 | \n",
- " 1962 | \n",
- " 1963 | \n",
- " 1964 | \n",
- " 1965 | \n",
- " ... | \n",
- " 2007 | \n",
- " 2008 | \n",
- " 2009 | \n",
- " 2010 | \n",
- " 2011 | \n",
- " 2012 | \n",
- " 2013 | \n",
- " 2014 | \n",
- " 2015 | \n",
- " Unnamed: 60 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 232 | \n",
- " Uruguay | \n",
- " URY | \n",
- " Electric power consumption (kWh per capita) | \n",
- " EG.USE.ELEC.KH.PC | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " ... | \n",
- " 2413.354293 | \n",
- " 2586.223362 | \n",
- " 2659.719201 | \n",
- " 2803.153377 | \n",
- " 2808.356544 | \n",
- " 2931.917628 | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 233 | \n",
- " United States | \n",
- " USA | \n",
- " Electric power consumption (kWh per capita) | \n",
- " EG.USE.ELEC.KH.PC | \n",
- " 4049.786629 | \n",
- " 4182.175501 | \n",
- " 4433.606021 | \n",
- " 4690.486256 | \n",
- " 4970.446456 | \n",
- " 5234.685002 | \n",
- " ... | \n",
- " 13657.449509 | \n",
- " 13663.424680 | \n",
- " 12913.711429 | \n",
- " 13394.014607 | \n",
- " 13240.357987 | \n",
- " 12954.153262 | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- "
\n",
- "
2 rows × 61 columns
\n",
- "
"
- ],
- "text/plain": [
- " Country Name Country Code Indicator Name \\\n",
- "232 Uruguay URY Electric power consumption (kWh per capita) \n",
- "233 United States USA Electric power consumption (kWh per capita) \n",
- "\n",
- " Indicator Code 1960 1961 1962 1963 \\\n",
- "232 EG.USE.ELEC.KH.PC NaN NaN NaN NaN \n",
- "233 EG.USE.ELEC.KH.PC 4049.786629 4182.175501 4433.606021 4690.486256 \n",
- "\n",
- " 1964 1965 ... 2007 2008 \\\n",
- "232 NaN NaN ... 2413.354293 2586.223362 \n",
- "233 4970.446456 5234.685002 ... 13657.449509 13663.424680 \n",
- "\n",
- " 2009 2010 2011 2012 2013 2014 2015 \\\n",
- "232 2659.719201 2803.153377 2808.356544 2931.917628 NaN NaN NaN \n",
- "233 12913.711429 13394.014607 13240.357987 12954.153262 NaN NaN NaN \n",
- "\n",
- " Unnamed: 60 \n",
- "232 NaN \n",
- "233 NaN \n",
- "\n",
- "[2 rows x 61 columns]"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "electricity_consumption_by_year_table = read_csv(electricity_consumption_by_year_table_path, skiprows=3)\n",
- "electricity_consumption_by_year_table[232:234]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "target_year = 2015"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# World"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "247\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "0 Aruba\n",
- "1 Afghanistan\n",
- "2 Angola\n",
- "Name: Country Name, dtype: object"
- ]
- },
- "execution_count": 9,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Get countries\n",
- "print len(country_region_income_table['Country Name'])\n",
- "country_region_income_table['Country Name'][:3]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array(['Aruba', 'Afghanistan', 'Angola'], dtype=object)"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "country_region_income_table['Country Name'][:3].values"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array(['Aruba', 'Afghanistan', 'Angola', 'Albania', 'Andorra'], dtype=object)"
- ]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "country_names = country_region_income_table['Country Name'].values\n",
- "country_names[:5]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# For each country, get projected population"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_population_by_year(country_name):\n",
- " pass\n",
- "\n",
- "get_population_by_year('United States')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_population_by_year_by_country_for_region(region_name):\n",
- " pass"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_population_by_year_by_country_for_income_group(income_group_name):\n",
- " pass"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_population_by_year_model(population_by_year):\n",
- " pass"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country or Area | \n",
- " Year(s) | \n",
- " Variant | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Const. mortality (Medium) | \n",
- " 40190.280 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Constant-fertility scenario | \n",
- " 845843.367 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " High variant | \n",
- " 92331.174 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Instant replacement | \n",
- " 52174.837 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Low variant | \n",
- " 35950.480 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country or Area Year(s) Variant Value\n",
- "0 Afghanistan 2100 Const. mortality (Medium) 40190.280\n",
- "1 Afghanistan 2100 Constant-fertility scenario 845843.367\n",
- "2 Afghanistan 2100 High variant 92331.174\n",
- "3 Afghanistan 2100 Instant replacement 52174.837\n",
- "4 Afghanistan 2100 Low variant 35950.480"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "local_table = demographic_by_year_by_country_table[demographic_by_year_by_country_table['Country or Area'] == 'Afghanistan']\n",
- "local_table[:5]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Year(s) | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 152 | \n",
- " 2005 | \n",
- " 24860.855 | \n",
- "
\n",
- " \n",
- " 153 | \n",
- " 2000 | \n",
- " 20595.360 | \n",
- "
\n",
- " \n",
- " 154 | \n",
- " 1995 | \n",
- " 17586.073 | \n",
- "
\n",
- " \n",
- " 155 | \n",
- " 1990 | \n",
- " 11731.193 | \n",
- "
\n",
- " \n",
- " 156 | \n",
- " 1985 | \n",
- " 11528.977 | \n",
- "
\n",
- " \n",
- " 157 | \n",
- " 1980 | \n",
- " 13180.431 | \n",
- "
\n",
- " \n",
- " 158 | \n",
- " 1975 | \n",
- " 12551.790 | \n",
- "
\n",
- " \n",
- " 159 | \n",
- " 1970 | \n",
- " 11015.621 | \n",
- "
\n",
- " \n",
- " 160 | \n",
- " 1965 | \n",
- " 9765.015 | \n",
- "
\n",
- " \n",
- " 161 | \n",
- " 1960 | \n",
- " 8774.440 | \n",
- "
\n",
- " \n",
- " 162 | \n",
- " 1955 | \n",
- " 8009.614 | \n",
- "
\n",
- " \n",
- " 163 | \n",
- " 1950 | \n",
- " 7450.738 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Year(s) Value\n",
- "152 2005 24860.855\n",
- "153 2000 20595.360\n",
- "154 1995 17586.073\n",
- "155 1990 11731.193\n",
- "156 1985 11528.977\n",
- "157 1980 13180.431\n",
- "158 1975 12551.790\n",
- "159 1970 11015.621\n",
- "160 1965 9765.015\n",
- "161 1960 8774.440\n",
- "162 1955 8009.614\n",
- "163 1950 7450.738"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "local_table = demographic_by_year_by_country_table[demographic_by_year_by_country_table['Country or Area'] == 'Afghanistan']\n",
- "min(local_table[local_table['Variant'] == 'Low variant']['Year(s)'])\n",
- "local_table[local_table['Year(s)'] < 2010]\n",
- "local_table[local_table['Year(s)'] < 2010][['Year(s)', 'Value']]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "2010"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "min(local_table[local_table['Variant'] == 'Low variant']['Year(s)'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country or Area | \n",
- " Year(s) | \n",
- " Variant | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 152 | \n",
- " Afghanistan | \n",
- " 2005 | \n",
- " Medium variant | \n",
- " 24860.855 | \n",
- "
\n",
- " \n",
- " 153 | \n",
- " Afghanistan | \n",
- " 2000 | \n",
- " Medium variant | \n",
- " 20595.360 | \n",
- "
\n",
- " \n",
- " 154 | \n",
- " Afghanistan | \n",
- " 1995 | \n",
- " Medium variant | \n",
- " 17586.073 | \n",
- "
\n",
- " \n",
- " 155 | \n",
- " Afghanistan | \n",
- " 1990 | \n",
- " Medium variant | \n",
- " 11731.193 | \n",
- "
\n",
- " \n",
- " 156 | \n",
- " Afghanistan | \n",
- " 1985 | \n",
- " Medium variant | \n",
- " 11528.977 | \n",
- "
\n",
- " \n",
- " 157 | \n",
- " Afghanistan | \n",
- " 1980 | \n",
- " Medium variant | \n",
- " 13180.431 | \n",
- "
\n",
- " \n",
- " 158 | \n",
- " Afghanistan | \n",
- " 1975 | \n",
- " Medium variant | \n",
- " 12551.790 | \n",
- "
\n",
- " \n",
- " 159 | \n",
- " Afghanistan | \n",
- " 1970 | \n",
- " Medium variant | \n",
- " 11015.621 | \n",
- "
\n",
- " \n",
- " 160 | \n",
- " Afghanistan | \n",
- " 1965 | \n",
- " Medium variant | \n",
- " 9765.015 | \n",
- "
\n",
- " \n",
- " 161 | \n",
- " Afghanistan | \n",
- " 1960 | \n",
- " Medium variant | \n",
- " 8774.440 | \n",
- "
\n",
- " \n",
- " 162 | \n",
- " Afghanistan | \n",
- " 1955 | \n",
- " Medium variant | \n",
- " 8009.614 | \n",
- "
\n",
- " \n",
- " 163 | \n",
- " Afghanistan | \n",
- " 1950 | \n",
- " Medium variant | \n",
- " 7450.738 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country or Area Year(s) Variant Value\n",
- "152 Afghanistan 2005 Medium variant 24860.855\n",
- "153 Afghanistan 2000 Medium variant 20595.360\n",
- "154 Afghanistan 1995 Medium variant 17586.073\n",
- "155 Afghanistan 1990 Medium variant 11731.193\n",
- "156 Afghanistan 1985 Medium variant 11528.977\n",
- "157 Afghanistan 1980 Medium variant 13180.431\n",
- "158 Afghanistan 1975 Medium variant 12551.790\n",
- "159 Afghanistan 1970 Medium variant 11015.621\n",
- "160 Afghanistan 1965 Medium variant 9765.015\n",
- "161 Afghanistan 1960 Medium variant 8774.440\n",
- "162 Afghanistan 1955 Medium variant 8009.614\n",
- "163 Afghanistan 1950 Medium variant 7450.738"
- ]
- },
- "execution_count": 21,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "local_table[local_table['Year(s)'] < 2010]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Year(s) | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 152 | \n",
- " 2005 | \n",
- " 24860.855 | \n",
- "
\n",
- " \n",
- " 153 | \n",
- " 2000 | \n",
- " 20595.360 | \n",
- "
\n",
- " \n",
- " 154 | \n",
- " 1995 | \n",
- " 17586.073 | \n",
- "
\n",
- " \n",
- " 155 | \n",
- " 1990 | \n",
- " 11731.193 | \n",
- "
\n",
- " \n",
- " 156 | \n",
- " 1985 | \n",
- " 11528.977 | \n",
- "
\n",
- " \n",
- " 157 | \n",
- " 1980 | \n",
- " 13180.431 | \n",
- "
\n",
- " \n",
- " 158 | \n",
- " 1975 | \n",
- " 12551.790 | \n",
- "
\n",
- " \n",
- " 159 | \n",
- " 1970 | \n",
- " 11015.621 | \n",
- "
\n",
- " \n",
- " 160 | \n",
- " 1965 | \n",
- " 9765.015 | \n",
- "
\n",
- " \n",
- " 161 | \n",
- " 1960 | \n",
- " 8774.440 | \n",
- "
\n",
- " \n",
- " 162 | \n",
- " 1955 | \n",
- " 8009.614 | \n",
- "
\n",
- " \n",
- " 163 | \n",
- " 1950 | \n",
- " 7450.738 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Year(s) Value\n",
- "152 2005 24860.855\n",
- "153 2000 20595.360\n",
- "154 1995 17586.073\n",
- "155 1990 11731.193\n",
- "156 1985 11528.977\n",
- "157 1980 13180.431\n",
- "158 1975 12551.790\n",
- "159 1970 11015.621\n",
- "160 1965 9765.015\n",
- "161 1960 8774.440\n",
- "162 1955 8009.614\n",
- "163 1950 7450.738"
- ]
- },
- "execution_count": 22,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "local_table[local_table['Year(s)'] < 2010][['Year(s)', 'Value']]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 80,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Index([u'Country or Area', u'Year(s)', u'Variant', u'Value'], dtype='object')"
- ]
- },
- "execution_count": 80,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "local_table.columns"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 83,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([2100, 2095, 2090, 2085, 2080, 2075, 2070, 2065, 2060, 2055, 2050,\n",
- " 2045, 2040, 2035, 2030, 2025, 2020, 2015, 2010, 2005, 2000, 1995,\n",
- " 1990, 1985, 1980, 1975, 1970, 1965, 1960, 1955, 1950])"
- ]
- },
- "execution_count": 83,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "xs = local_table['Year(s)'].values\n",
- "xs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 84,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 59248.866, 60449.323, 61525.463, 62421.696, 63028.228,\n",
- " 63218.469, 62895.237, 62024.42 , 60633.923, 58792.265,\n",
- " 56551.242, 53910.84 , 50833.609, 47318.793, 43499.632,\n",
- " 39571.1 , 35666.904, 32006.788, 28397.812, 24860.855,\n",
- " 20595.36 , 17586.073, 11731.193, 11528.977, 13180.431,\n",
- " 12551.79 , 11015.621, 9765.015, 8774.44 , 8009.614,\n",
- " 7450.738])"
- ]
- },
- "execution_count": 84,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "ys = local_table['Value'].values\n",
- "ys"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Scatter plot value vs year"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 74,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\nv0KhUEww/g+uoK0VVPxCiAAAAABJRU5ErkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "N = 50\n",
- "x = np.random.rand(N)\n",
- "y = np.random.rand(N)\n",
- "colors = np.random.rand(N)\n",
- "area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses\n",
- "\n",
- "plt.scatter(x, y, s=area, c=colors, alpha=0.5)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 85,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 85,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.scatter(xs, ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Get the lowest year for which we have only estimates\n",
- "# Exclude all estimates"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# I think we should connect the dots in the middle, but extrapolate using at least two and at most five points on each side\n",
- "# What if we have fewer than two points?\n",
- "# Then duplicate data point at a fixed interval (unit 1) or use slope (default assumes slope of 0) if we have one\n",
- "# Also it should have an option for truncating negative outputs to zero"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from scipy.interpolate import interp1d"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "interp1d?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 31,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\nAAAASUVORK5CYII=\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "import numpy as np\n",
- "from scipy.interpolate import interp1d\n",
- "\n",
- "x = np.linspace(0, 10, num=11, endpoint=True)\n",
- "y = np.cos(-x**2/9.0)\n",
- "f = interp1d(x, y)\n",
- "f2 = interp1d(x, y, kind='quadratic')\n",
- "f3 = interp1d(x, y, kind='cubic')\n",
- "\n",
- "xnew = np.linspace(0, 10, num=41, endpoint=True)\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--', xnew, f3(xnew), 'x')\n",
- "plt.legend(['data', 'linear', 'quadratic', 'cubic'], loc='best')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 92,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "ename": "ValueError",
- "evalue": "A value in x_new is above the interpolation range.",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m11\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[1;32m/usr/lib64/python2.7/site-packages/scipy/interpolate/polyint.pyc\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, x)\u001b[0m\n\u001b[0;32m 77\u001b[0m \"\"\"\n\u001b[0;32m 78\u001b[0m \u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_shape\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_prepare_x\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 79\u001b[1;33m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_evaluate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 80\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_finish_y\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_shape\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 81\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
- "\u001b[1;32m/usr/lib64/python2.7/site-packages/scipy/interpolate/interpolate.pyc\u001b[0m in \u001b[0;36m_evaluate\u001b[1;34m(self, x_new)\u001b[0m\n\u001b[0;32m 475\u001b[0m \u001b[1;31m# The behavior is set by the bounds_error variable.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 476\u001b[0m \u001b[0mx_new\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0masarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_new\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 477\u001b[1;33m \u001b[0mout_of_bounds\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_check_bounds\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_new\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 478\u001b[0m \u001b[0my_new\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_new\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 479\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my_new\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[1;32m/usr/lib64/python2.7/site-packages/scipy/interpolate/interpolate.pyc\u001b[0m in \u001b[0;36m_check_bounds\u001b[1;34m(self, x_new)\u001b[0m\n\u001b[0;32m 505\u001b[0m \"range.\")\n\u001b[0;32m 506\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbounds_error\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mabove_bounds\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[1;32m--> 507\u001b[1;33m raise ValueError(\"A value in x_new is above the interpolation \"\n\u001b[0m\u001b[0;32m 508\u001b[0m \"range.\")\n\u001b[0;32m 509\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
- "\u001b[1;31mValueError\u001b[0m: A value in x_new is above the interpolation range."
- ]
- }
- ],
- "source": [
- "f(11)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_population(2015, 'United States')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_consumption_per_capita(2015, 'United States')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def forecast_consumption(target_year, country_name):\n",
- " pass"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_population_electricity_consumption_packs\n",
- "def get_population_electricity_consumption_packs_for_region\n",
- "def get_population_electricity_consumption_packs_for_income_group"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Europe & Central Asia 57\n",
- "Sub-Saharan Africa 48\n",
- "Latin America & Caribbean 41\n",
- "East Asia & Pacific 36\n",
- "Middle East & North Africa 21\n",
- "South Asia 8\n",
- "North America 3\n",
- "dtype: int64"
- ]
- },
- "execution_count": 32,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "country_region_income_table['Region'].value_counts()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Upper middle income 53\n",
- "Lower middle income 51\n",
- "High income: nonOECD 47\n",
- "High income: OECD 32\n",
- "Low income 31\n",
- "dtype: int64"
- ]
- },
- "execution_count": 31,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "country_region_income_table['IncomeGroup'].value_counts()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 38,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "x = True\n",
- "x &= True"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 39,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "True"
- ]
- },
- "execution_count": 39,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 40,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "False"
- ]
- },
- "execution_count": 40,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x &= False\n",
- "x"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "ename": "ValueError",
- "evalue": "Item wrong length 1 instead of 247.",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mconditions\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 2\u001b[0m \u001b[0mconditions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcountry_region_income_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'Region'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m'North America'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mcountry_region_income_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mconditions\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[1;32m/usr/lib64/python2.7/site-packages/pandas/core/frame.pyc\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 1789\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 1790\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-> 1791\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 1792\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 1793\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/usr/lib64/python2.7/site-packages/pandas/core/frame.pyc\u001b[0m in \u001b[0;36m_getitem_array\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 1826\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1827\u001b[0m raise ValueError('Item wrong length %d instead of %d.' %\n\u001b[1;32m-> 1828\u001b[1;33m (len(key), len(self.index)))\n\u001b[0m\u001b[0;32m 1829\u001b[0m \u001b[1;31m# check_bool_indexer will throw exception if Series key cannot\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1830\u001b[0m \u001b[1;31m# be reindexed to match DataFrame rows\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
- "\u001b[1;31mValueError\u001b[0m: Item wrong length 1 instead of 247."
- ]
- }
- ],
- "source": [
- "conditions = []\n",
- "conditions.append(country_region_income_table['Region'] == 'North America')\n",
- "country_region_income_table[conditions]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "country_region_income_table.filter?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country Name | \n",
- " Country Code | \n",
- " Region | \n",
- " IncomeGroup | \n",
- " SpecialNotes | \n",
- " Unnamed: 5 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 25 | \n",
- " Bermuda | \n",
- " BMU | \n",
- " North America | \n",
- " High income: nonOECD | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 33 | \n",
- " Canada | \n",
- " CAN | \n",
- " North America | \n",
- " High income: OECD | \n",
- " Fiscal year end: March 31; reporting period fo... | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 234 | \n",
- " United States | \n",
- " USA | \n",
- " North America | \n",
- " High income: OECD | \n",
- " Fiscal year end: September 30; reporting perio... | \n",
- " NaN | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country Name Country Code Region IncomeGroup \\\n",
- "25 Bermuda BMU North America High income: nonOECD \n",
- "33 Canada CAN North America High income: OECD \n",
- "234 United States USA North America High income: OECD \n",
- "\n",
- " SpecialNotes Unnamed: 5 \n",
- "25 NaN NaN \n",
- "33 Fiscal year end: March 31; reporting period fo... NaN \n",
- "234 Fiscal year end: September 30; reporting perio... NaN "
- ]
- },
- "execution_count": 36,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "country_region_income_table[country_region_income_table['Region'] == 'North America']"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 46,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "['Bermuda' 'Canada' 'United States']\n",
- "['Australia' 'Austria' 'Belgium' 'Canada' 'Switzerland' 'Chile'\n",
- " 'Czech Republic' 'Germany' 'Denmark' 'Spain' 'Estonia' 'Finland' 'France'\n",
- " 'United Kingdom' 'Greece' 'Hungary' 'Ireland' 'Iceland' 'Israel' 'Italy'\n",
- " 'Japan' 'Korea, Rep.' 'Luxembourg' 'Netherlands' 'Norway' 'New Zealand'\n",
- " 'Poland' 'Portugal' 'Slovak Republic' 'Slovenia' 'Sweden' 'United States']\n"
- ]
- }
- ],
- "source": [
- "def get_country_names(region_name=None, income_group_name=None):\n",
- " t = country_region_income_table\n",
- " if region_name:\n",
- " t = t[t['Region'] == region_name]\n",
- " if income_group_name:\n",
- " t = t[t['IncomeGroup'] == income_group_name]\n",
- " return t['Country Name'].values\n",
- "\n",
- "print(get_country_names(region_name='North America'))\n",
- "print(get_country_names(income_group_name='High income: OECD'))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 71,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "from os.path import expanduser\n",
- "t = country_region_income_table['Country Name']\n",
- "t.to_csv(expanduser('~/Experiments/infrastructure/country_region_income_table_country_names.csv'), index=False)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "from os.path import expanduser, join\n",
- "target_folder = expanduser('~/Experiments/infrastructure')\n",
- "\n",
- "country_region_income_table_country_names = country_region_income_table['Country Name'].unique()\n",
- "demographic_by_year_by_country_table_country_names = demographic_by_year_by_country_table['Country or Area'].unique()\n",
- "\n",
- "open(join(target_folder, 'country_region_income_table_country_names.txt'), 'w').write(\n",
- " '\\n'.join(country_region_income_table_country_names))\n",
- "open(join(target_folder, 'demographic_by_year_by_country_table_country_names.txt'), 'w').write(\n",
- " '\\n'.join(demographic_by_year_by_country_table_country_names))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from nltk.metrics.distance import edit_distance"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 39,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "1"
- ]
- },
- "execution_count": 39,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "edit_distance('ab', 'ba', transpositions=True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 41,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'Aruba'"
- ]
- },
- "execution_count": 41,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "country_region_income_table_country_names[0]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 50,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[(0, 'United States Virgin Islands'),\n",
- " (0, 'United States of America'),\n",
- " (7, 'United Kingdom'),\n",
- " (9, 'United Arab Emirates'),\n",
- " (9, 'Uzbekistan')]"
- ]
- },
- "execution_count": 50,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from nltk.metrics.distance import edit_distance\n",
- "target_country_name = 'United States'\n",
- "source_country_names = demographic_by_year_by_country_table_country_names\n",
- "distance_packs = []\n",
- "for source_country_name in source_country_names:\n",
- " if target_country_name in source_country_name:\n",
- " distance_packs.append((0, source_country_name))\n",
- " distance_packs.append((edit_distance(source_country_name, target_country_name, transpositions=False), source_country_name))\n",
- "sorted(distance_packs, reverse=False)[:5]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[('a', 'b'), (1, 2)]"
- ]
- },
- "execution_count": 53,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "zip(*[('a', 1), ('b', 2)])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 72,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['one', ' two']"
- ]
- },
- "execution_count": 72,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "'one, two'.split(',')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 75,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'one'"
- ]
- },
- "execution_count": 75,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "'one, two'.split()[0].rstrip(',')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 76,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "target_country_names = country_region_income_table_country_names\n",
- "source_country_names = demographic_by_year_by_country_table_country_names\n",
- "\n",
- "import csv\n",
- "from os.path import expanduser, join\n",
- "target_folder = expanduser('~/Experiments/infrastructure')\n",
- "target_path = join(target_folder, 'matches.csv')\n",
- "csv_writer = csv.writer(open(target_path, 'w'))\n",
- "for target_country_name in target_country_names:\n",
- " distance_packs = []\n",
- " if target_country_name in source_country_names:\n",
- " continue\n",
- " for source_country_name in source_country_names:\n",
- " if (target_country_name.split()[0].rstrip(',') in source_country_name) or (target_country_name in source_country_name) or (source_country_name in target_country_name):\n",
- " distance_packs.append((0, source_country_name))\n",
- " else:\n",
- " distance_packs.append((edit_distance(source_country_name, target_country_name), source_country_name))\n",
- " ranked_country_names = list(zip(*sorted(distance_packs))[1])[:10]\n",
- " csv_writer.writerow([target_country_name] + ranked_country_names)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 83,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "open(join(target_folder, 'country_region_income_table_country_names.diff'), 'w').write(\n",
- " '\\n'.join(set(country_region_income_table_country_names).difference(demographic_by_year_by_country_table_country_names)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 84,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "open(join(target_folder, 'demographic_by_year_by_country_table_country_names.diff'), 'w').write(\n",
- " '\\n'.join(set(demographic_by_year_by_country_table_country_names).difference(country_region_income_table_country_names)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 59,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_demographic_by_year_by_country_table_country_name(\n",
- " country_region_income_table_country_name):\n",
- " try:\n",
- " except KeyError:\n",
- " pass\n",
- " return\n",
- "\n",
- "get_demographic_by_year_by_country_table_country_name('United States')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 52,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country or Area | \n",
- " Year(s) | \n",
- " Variant | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "Empty DataFrame\n",
- "Columns: [Country or Area, Year(s), Variant, Value]\n",
- "Index: []"
- ]
- },
- "execution_count": 52,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "t = demographic_by_year_by_country_table[\n",
- " demographic_by_year_by_country_table['Country or Area'] == country_name]\n",
- "t"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 79,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from os.path import expanduser\n",
- "from pandas import read_csv\n",
- "\n",
- "world_bank_united_nations_country_name_table_path = expanduser(\n",
- " '~/Projects/infrastructure-planning/datasets/world-bank-united-nations-country-name.csv')\n",
- "world_bank_united_nations_country_name_table = read_csv(\n",
- " world_bank_united_nations_country_name_table_path)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 84,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'United States of America'"
- ]
- },
- "execution_count": 84,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "world_bank_country_names = country_region_income_table_country_names\n",
- "united_nations_country_names = demographic_by_year_by_country_table_country_names\n",
- "united_nations_country_name_by_world_bank_country_name = dict(world_bank_united_nations_country_name_table.values)\n",
- "\n",
- "def get_united_nations_country_name(world_bank_country_name):\n",
- " if world_bank_country_name in united_nations_country_names:\n",
- " return world_bank_country_name\n",
- " return united_nations_country_name_by_world_bank_country_name[world_bank_country_name]\n",
- "\n",
- "get_united_nations_country_name('United States')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 85,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'Canada'"
- ]
- },
- "execution_count": 85,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "get_united_nations_country_name('Canada')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 87,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Year(s) | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 41183 | \n",
- " 2005 | \n",
- " 298165.797 | \n",
- "
\n",
- " \n",
- " 41184 | \n",
- " 2000 | \n",
- " 284594.395 | \n",
- "
\n",
- " \n",
- " 41185 | \n",
- " 1995 | \n",
- " 268039.654 | \n",
- "
\n",
- " \n",
- " 41186 | \n",
- " 1990 | \n",
- " 254506.647 | \n",
- "
\n",
- " \n",
- " 41187 | \n",
- " 1985 | \n",
- " 241870.002 | \n",
- "
\n",
- " \n",
- " 41188 | \n",
- " 1980 | \n",
- " 230176.361 | \n",
- "
\n",
- " \n",
- " 41189 | \n",
- " 1975 | \n",
- " 219439.031 | \n",
- "
\n",
- " \n",
- " 41190 | \n",
- " 1970 | \n",
- " 209891.345 | \n",
- "
\n",
- " \n",
- " 41191 | \n",
- " 1965 | \n",
- " 199686.185 | \n",
- "
\n",
- " \n",
- " 41192 | \n",
- " 1960 | \n",
- " 186361.893 | \n",
- "
\n",
- " \n",
- " 41193 | \n",
- " 1955 | \n",
- " 170939.332 | \n",
- "
\n",
- " \n",
- " 41194 | \n",
- " 1950 | \n",
- " 157813.040 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Year(s) Value\n",
- "41183 2005 298165.797\n",
- "41184 2000 284594.395\n",
- "41185 1995 268039.654\n",
- "41186 1990 254506.647\n",
- "41187 1985 241870.002\n",
- "41188 1980 230176.361\n",
- "41189 1975 219439.031\n",
- "41190 1970 209891.345\n",
- "41191 1965 199686.185\n",
- "41192 1960 186361.893\n",
- "41193 1955 170939.332\n",
- "41194 1950 157813.040"
- ]
- },
- "execution_count": 87,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "def get_year_population_packs(world_bank_country_name):\n",
- " united_nations_country_name = get_united_nations_country_name(world_bank_country_name)\n",
- " t = demographic_by_year_by_country_table[\n",
- " demographic_by_year_by_country_table['Country or Area'] == united_nations_country_name]\n",
- " fake_year = min(t[t['Variant'] == 'Low variant']['Year(s)'])\n",
- " t = t[t['Year(s)'] < fake_year]\n",
- " return t[['Year(s)', 'Value']]\n",
- " \n",
- "country_name = 'United States'\n",
- "get_year_population_packs(country_name)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "xys = [\n",
- " (1, 1),\n",
- " (2, 2),\n",
- " (3, 1),\n",
- " (4, 2),\n",
- "]\n",
- "\n",
- "def get_spline_interpolated_regression_extrapolated_function(xys, default_slope):\n",
- " xs, ys = zip(*xys)\n",
- " x_min, x_max = min(xs), max(xs)\n",
- " \n",
- " def f(x):\n",
- " pass\n",
- " \n",
- " return f\n",
- "\n",
- "get_spline_interpolated_regression_extrapolated_function(xys, default_slope=1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(1, 2, 3, 4)\n",
- "(1, 2, 1, 2)\n"
- ]
- }
- ],
- "source": [
- "xs, ys = zip(*xys)\n",
- "print xs\n",
- "print ys"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "m = interp1d(*zip(*xys))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array(1.5)"
- ]
- },
- "execution_count": 18,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m(3.5)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array(1.1)"
- ]
- },
- "execution_count": 37,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m(1.1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from sklearn.linear_model import LinearRegression"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[1],\n",
- " [2],\n",
- " [3],\n",
- " [4]])"
- ]
- },
- "execution_count": 26,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "np.array(xs).reshape(-1, 1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
- ]
- },
- "execution_count": 27,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model = LinearRegression()\n",
- "model.fit(np.array(xs).reshape(-1, 1), ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 1.2])"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.predict(1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 0.2])"
- ]
- },
- "execution_count": 29,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.coef_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "1.0"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.intercept_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 1.])"
- ]
- },
- "execution_count": 31,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.predict(0)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "1"
- ]
- },
- "execution_count": 34,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.rank_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\nmoF1B3LkyhH2juwDkyfLKkZ2Tnt50WdIMTrWcLyplLMSVCGIiv+bCx9+aHQUuyNFX1jN3bP9t6/P\nhwYN4PffjY4kMnH41kl2++WjeonqRkexuqblm7LU+wJpmzcZHcXuSNEXVvVi3ReJio1i4yevQ9++\nRscRmbh7F25eGap5v8Iehbleuypp27fJaLKHSNEXVnX3bH/C1k9lnLSdyyt34T5OneqtiSvqBQcP\nGh3FrkjRF1b3Yp0XOX7tOOtPyYIW9up20m02ndlE28ptjY6SawL9AtlTwQO2yN3i95OiL6zO3dWd\ncS3HyZw8dizi2Coalm1IYY/CRkfJNYF+gfxeOpa0K1eMjmJXpOiLXNG/dn9OXj9J5KlIo6OIh2lN\ns9b9eda7udFJcpVPIR/CW5bl4EtdjY5iV6Toi1zh7urOuKBxTIyYCNOmQUSE0ZFEOn3gALdTEwhq\nlveXFQyqEJRnuxnDwiLp2HGc2ftJ0Re5pn+d/sTExXA46Zxp3L6wC5eXzGd9QD5qlapldJRcF+gb\nyIaYvDcPT1hYJKNGrWDlqklm7ytFX+QaNxc3xrccz/AiG+HYMdi61ehIAri1fBE3AxvlyaGaD8ur\nZ/rTpq3k+Kn3GdqqtNn7StEXuapf7X6cunOeo4N6wCefGB1HpKRQasdhyvZ4wegkNlGlWBUSUxM5\nHXfa6ChWlZjoRqmAWXyw6YbZ+0rRF7nq7tn+6z470X/9BYcOGR3JqSVEHWF7GU1Q42eNjmITSimC\nyrfgxPf/ylPrOHt4pFDa/2eOu/iZva8UfZHrnq/1PKeSL3O8f1dYvdroOE4twi2G8eOaUcSziNFR\nbKaFXyB1J38Lp04ZHcVqXhjagP21d9EsebfZ+0rRF7nOzcWNCa0mMLDGEfTw4UbHcWrhUeF5YgF0\ncwRVbMl2P9c8dZPWpdLHaVO2NR3bmt9lKkVf2ETfmn25FH+ZNSfWGB3FqS2PWp6np17ISN0ydYks\nk0jChgijo1jN7L2zGdPlXcLDzR8VZ3HRV0qFKKUOK6WOKaXee8w209Lf36OUqmfpMYXjcXVxZULL\nCYRGhKLzUN+qIzl+7ThxCXHULVPX6Cg25ebixq36NYnPI0V/78W9xN6JpVXFVjna36Kir5RyBf4D\nhAA1gL5KqeoPbdMZCNBaVwEGA/+z5JjCcT1X8zmu3rnK6uPSr2+EuxOsuSjn+wO/eFBHCh6KhqQk\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "import numpy as np\n",
- "from scipy.interpolate import interp1d\n",
- "x = np.linspace(0, 10, num=11, endpoint=True)\n",
- "y = np.cos(-x**2/9.0)\n",
- "f = interp1d(x, y)\n",
- "f2 = interp1d(x, y, kind='cubic')\n",
- "xnew = np.linspace(0, 10, num=41, endpoint=True)\n",
- "import matplotlib.pyplot as plt\n",
- "plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')\n",
- "plt.legend(['data', 'linear', 'cubic'], loc='best')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def forecast_population(target_year, country_name):\n",
- " year_population_packs = get_year_population_packs(country_name)\n",
- " model = get_spline_interpolation_regression_extrapolation_model(\n",
- " year_population_packs)\n",
- " return model.predict(target_year)\n",
- "\n",
- "print forecast_population(2010, country_name)\n",
- "print forecast_population(2015, country_name)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def forecast_consumption(target_year, country_name):\n",
- " year_consumption_packs = get_year_consumption_packs(country_name)\n",
- " model = get_spline_interpolation_regression_extrapolation_model(\n",
- " year_consumption_packs)\n",
- " return model.predict(target_year)\n",
- "\n",
- "print forecast_consumption(2010, country_name)\n",
- "print forecast_consumption(2015, country_name)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_country_population_consumption_packs(target_year, region_name=None, income_group_name=None):\n",
- " country_population_consumption_packs = []\n",
- " country_names = get_country_names(region_name, income_group_name)\n",
- " for country_name in country_names:\n",
- " population = forecast_population(target_year, country_name)\n",
- " consumption = forecast_consumption(target_year, country_name)\n",
- " country_population_consumption_packs.append(\n",
- " country_name, population, consumption)\n",
- " return country_population_consumption_packs\n",
- "\n",
- "region_name = 'North America'\n",
- "income_group_name = 'High income: OECD'\n",
- "print get_country_names(region_name, income_group_name)\n",
- "print get_country_population_consumption_packs(2015, region_name, income_group_name)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# For each country, get projected consumption per capita"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# For each country, get projected consumption by multiplying projected population by projected consumption per capita"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Plot consumption vs population for the selected target_year"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Save table"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Region\n",
- "# Given target_year and region, generate population consumption points for each country in that region"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Generate plots and tables for each region"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Given a region, we can get the countries in the region\n",
- "# For each country, we can forecast the population of the country for the target_year\n",
- "# Then we can plot consumption vs population to see the relationship"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Income\n",
- "# Given target_year and income, generate population consumption points for each country in that income group"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Given an income group, we can get countries in the income group\n",
- "# For each country, we can forecast or interpolate the population of the country in the target_year\n",
- "# Then we can plot consumption vs population to see the relationship"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Generate plots and tables for each income group"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from pandas import DataFrame"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " x | \n",
- " y | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " a | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " a | \n",
- " 2 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " b | \n",
- " 3 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " c | \n",
- " 4 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " x y\n",
- "0 a 1\n",
- "1 a 2\n",
- "2 b 3\n",
- "3 c 4"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "t = DataFrame([['a', 1], ['a', 2], ['b', 3], ['c', 4]], columns=['x', 'y'])\n",
- "t"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "a\n",
- " x y\n",
- "0 a 1\n",
- "1 a 2\n",
- "***\n",
- "b\n",
- " x y\n",
- "2 b 3\n",
- "***\n",
- "c\n",
- " x y\n",
- "3 c 4\n",
- "***\n"
- ]
- }
- ],
- "source": [
- "for x, table in t.groupby('x'):\n",
- " print x\n",
- " print table\n",
- " print '***'"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "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.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/experiments/get-population-electricity-consumption-table.ipynb b/experiments/get-population-electricity-consumption-table.ipynb
deleted file mode 100644
index 1230823..0000000
--- a/experiments/get-population-electricity-consumption-table.ipynb
+++ /dev/null
@@ -1,762 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "Empty DataFrame\n",
- "Columns: []\n",
- "Index: []"
- ]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from pandas import DataFrame\n",
- "\n",
- "def get_population_electricity_consumption_table(target_year):\n",
- " return DataFrame()\n",
- "\n",
- "target_year = 2020\n",
- "population_electricity_consumption_table = get_population_electricity_consumption_table(target_year)\n",
- "population_electricity_consumption_table[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from os.path import expanduser, join\n",
- "from pandas import read_csv\n",
- "source_folder = expanduser('~/Projects/infrastructure-planning/datasets')\n",
- "country_name_variation_table_path = join(\n",
- " source_folder, 'world-country-name-variation.csv')\n",
- "country_region_income_table_path = join(\n",
- " source_folder, 'world-country-region-income.csv')\n",
- "electricity_consumption_per_capita_by_year_table_path = join(\n",
- " source_folder, 'world-electricity-consumption-per-capita-by-year.csv')\n",
- "population_by_year_by_country_table_path = join(\n",
- " source_folder, 'world-population-by-year-by-country.csv')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " World Bank | \n",
- " United Nations | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " Bahamas, The | \n",
- " Bahamas | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " Bolivia | \n",
- " Bolivia (Plurinational State of) | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " World Bank United Nations\n",
- "0 Bahamas, The Bahamas\n",
- "1 Bolivia Bolivia (Plurinational State of)"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "country_name_variation_table = read_csv(country_name_variation_table_path)\n",
- "country_name_variation_table[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country Name | \n",
- " Country Code | \n",
- " Region | \n",
- " IncomeGroup | \n",
- " SpecialNotes | \n",
- " Unnamed: 5 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " Aruba | \n",
- " ABW | \n",
- " Latin America & Caribbean | \n",
- " High income: nonOECD | \n",
- " SNA data for 2000-2011 are updated from offici... | \n",
- " NaN | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " Afghanistan | \n",
- " AFG | \n",
- " South Asia | \n",
- " Low income | \n",
- " Fiscal year end: March 20; reporting period fo... | \n",
- " NaN | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country Name Country Code Region IncomeGroup \\\n",
- "0 Aruba ABW Latin America & Caribbean High income: nonOECD \n",
- "1 Afghanistan AFG South Asia Low income \n",
- "\n",
- " SpecialNotes Unnamed: 5 \n",
- "0 SNA data for 2000-2011 are updated from offici... NaN \n",
- "1 Fiscal year end: March 20; reporting period fo... NaN "
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from StringIO import StringIO\n",
- "country_region_income_table = read_csv(StringIO(open(country_region_income_table_path, 'r').read().decode('utf-8-sig')))\n",
- "country_region_income_table[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country or Area | \n",
- " Year(s) | \n",
- " Variant | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Const. mortality (Medium) | \n",
- " 40190.280 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " Afghanistan | \n",
- " 2100 | \n",
- " Constant-fertility scenario | \n",
- " 845843.367 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country or Area Year(s) Variant Value\n",
- "0 Afghanistan 2100 Const. mortality (Medium) 40190.280\n",
- "1 Afghanistan 2100 Constant-fertility scenario 845843.367"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "population_by_year_by_country_table = read_csv(population_by_year_by_country_table_path)\n",
- "population_by_year_by_country_table[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country Name | \n",
- " 2000 | \n",
- " 2005 | \n",
- " 2010 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 232 | \n",
- " Uruguay | \n",
- " 2030.264582 | \n",
- " 1999.634353 | \n",
- " 2803.153377 | \n",
- "
\n",
- " \n",
- " 233 | \n",
- " United States | \n",
- " 13671.052024 | \n",
- " 13704.577048 | \n",
- " 13394.014607 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country Name 2000 2005 2010\n",
- "232 Uruguay 2030.264582 1999.634353 2803.153377\n",
- "233 United States 13671.052024 13704.577048 13394.014607"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "electricity_consumption_per_capita_by_year_table = read_csv(\n",
- " electricity_consumption_per_capita_by_year_table_path, skiprows=3)\n",
- "electricity_consumption_per_capita_by_year_table[232:234][['Country Name', '2000', '2005', '2010']]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# List output table columns\n",
- "# Country, Region, Income Group, Year, Population, Electricity Consumption Per Capita, Electricity Consumption"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 55,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Bahamas, The\n",
- "Angola\n",
- "Bahamas\n"
- ]
- }
- ],
- "source": [
- "united_nations_country_names = population_by_year_by_country_table['Country or Area'].unique()\n",
- "world_bank_country_names = country_region_income_table['Country Name'].unique()\n",
- "\n",
- "def get_united_nations_country_name(world_bank_country_name):\n",
- " t = country_name_variation_table\n",
- " try:\n",
- " return t[t['World Bank'] == world_bank_country_name]['United Nations'].values[0]\n",
- " except IndexError:\n",
- " pass\n",
- " if world_bank_country_name not in united_nations_country_names:\n",
- " raise ValueError\n",
- " return world_bank_country_name\n",
- "\n",
- "def get_world_bank_country_name(united_nations_country_name):\n",
- " t = country_name_variation_table\n",
- " try:\n",
- " return t[t['United Nations'] == united_nations_country_name]['World Bank'].values[0]\n",
- " except IndexError:\n",
- " pass\n",
- " if united_nations_country_name not in world_bank_country_names:\n",
- " raise ValueError\n",
- " return united_nations_country_name\n",
- "\n",
- "print get_world_bank_country_name('Bahamas')\n",
- "print get_world_bank_country_name('Angola')\n",
- "print get_united_nations_country_name('Bahamas, The')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 74,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Ireland\n",
- "Ireland\n"
- ]
- }
- ],
- "source": [
- "# Get countries from United Nations\n",
- "united_nations_country_name = united_nations_country_names[111]\n",
- "world_bank_country_name = get_world_bank_country_name(united_nations_country_name)\n",
- "print united_nations_country_name\n",
- "print world_bank_country_name"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 75,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country or Area | \n",
- " Year(s) | \n",
- " Variant | \n",
- " Value | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 18071 | \n",
- " Ireland | \n",
- " 2100 | \n",
- " Const. mortality (Medium) | \n",
- " 5738.911 | \n",
- "
\n",
- " \n",
- " 18072 | \n",
- " Ireland | \n",
- " 2100 | \n",
- " Constant-fertility scenario | \n",
- " 6732.225 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Country or Area Year(s) Variant Value\n",
- "18071 Ireland 2100 Const. mortality (Medium) 5738.911\n",
- "18072 Ireland 2100 Constant-fertility scenario 6732.225"
- ]
- },
- "execution_count": 75,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Get actual and estimated populations for selected country\n",
- "t = population_by_year_by_country_table\n",
- "country_t = t[t['Country or Area'] == united_nations_country_name]\n",
- "country_t[:2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 76,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "2010"
- ]
- },
- "execution_count": 76,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Get the earliest year when the United Nations starts estimating populations\n",
- "earliest_estimated_year = min(country_t[country_t['Variant'] == 'Low variant']['Year(s)'])\n",
- "earliest_estimated_year"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 77,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[ 2005. , 4158.002],\n",
- " [ 2000. , 3803.741],\n",
- " [ 1995. , 3610.918],\n",
- " [ 1990. , 3531.185],\n",
- " [ 1985. , 3534.064],\n",
- " [ 1980. , 3417.754],\n",
- " [ 1975. , 3183.722],\n",
- " [ 1970. , 2963.004],\n",
- " [ 1965. , 2874.705],\n",
- " [ 1960. , 2828.866],\n",
- " [ 1955. , 2901.138],\n",
- " [ 1950. , 2913.093]])"
- ]
- },
- "execution_count": 77,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Get actual populations for selected country\n",
- "year_packs = country_t[country_t['Year(s)'] < earliest_estimated_year][[\n",
- " 'Year(s)', 'Value',\n",
- "]].values\n",
- "year_packs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 78,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array(4499.1355874125875)"
- ]
- },
- "execution_count": 78,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Estimate population for the given year\n",
- "# Use the spline interpolation regression extrapolation model\n",
- "from infrastructure_planning.growth.interpolated import get_interpolated_spline_extrapolated_linear_function\n",
- "estimate_population = get_interpolated_spline_extrapolated_linear_function(year_packs)\n",
- "population = estimate_population(target_year)\n",
- "population"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 79,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " Country Name | \n",
- " Country Code | \n",
- " Indicator Name | \n",
- " Indicator Code | \n",
- " 1960 | \n",
- " 1961 | \n",
- " 1962 | \n",
- " 1963 | \n",
- " 1964 | \n",
- " 1965 | \n",
- " ... | \n",
- " 2007 | \n",
- " 2008 | \n",
- " 2009 | \n",
- " 2010 | \n",
- " 2011 | \n",
- " 2012 | \n",
- " 2013 | \n",
- " 2014 | \n",
- " 2015 | \n",
- " Unnamed: 60 | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 101 | \n",
- " Ireland | \n",
- " IRL | \n",
- " Electric power consumption (kWh per capita) | \n",
- " EG.USE.ELEC.KH.PC | \n",
- " 695.043484 | \n",
- " 752.018128 | \n",
- " 838.13755 | \n",
- " 886.193539 | \n",
- " 1041.670301 | \n",
- " 1134.39683 | \n",
- " ... | \n",
- " 6218.768058 | \n",
- " 6340.733045 | \n",
- " 5947.909489 | \n",
- " 5910.983289 | \n",
- " 5661.168058 | \n",
- " 5664.831802 | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- " NaN | \n",
- "
\n",
- " \n",
- "
\n",
- "
1 rows × 61 columns
\n",
- "
"
- ],
- "text/plain": [
- " Country Name Country Code Indicator Name \\\n",
- "101 Ireland IRL Electric power consumption (kWh per capita) \n",
- "\n",
- " Indicator Code 1960 1961 1962 1963 \\\n",
- "101 EG.USE.ELEC.KH.PC 695.043484 752.018128 838.13755 886.193539 \n",
- "\n",
- " 1964 1965 ... 2007 2008 \\\n",
- "101 1041.670301 1134.39683 ... 6218.768058 6340.733045 \n",
- "\n",
- " 2009 2010 2011 2012 2013 2014 2015 \\\n",
- "101 5947.909489 5910.983289 5661.168058 5664.831802 NaN NaN NaN \n",
- "\n",
- " Unnamed: 60 \n",
- "101 NaN \n",
- "\n",
- "[1 rows x 61 columns]"
- ]
- },
- "execution_count": 79,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Get electricity consumption per capita for provided years\n",
- "t = electricity_consumption_per_capita_by_year_table\n",
- "country_t = t[t['Country Name'] == world_bank_country_name]\n",
- "country_t"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 80,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[(1960, 695.04348440924809),\n",
- " (1961, 752.01812774394602),\n",
- " (1962, 838.13755046631809)]"
- ]
- },
- "execution_count": 80,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Get year_packs\n",
- "import numpy as np\n",
- "year_packs = []\n",
- "for column_name in country_t.columns:\n",
- " try:\n",
- " year = int(column_name)\n",
- " except ValueError: \n",
- " continue\n",
- " value = country_t[column_name].values[0]\n",
- " if np.isnan(value):\n",
- " continue\n",
- " year_packs.append((year, value))\n",
- "year_packs[:3]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 81,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array(6596.209336832399)"
- ]
- },
- "execution_count": 81,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Estimate electricity consumption per capita for the given year\n",
- "from infrastructure_planning.exceptions import EmptyDataset\n",
- "\n",
- "try:\n",
- " estimate_electricity_consumption_per_capita = get_interpolated_spline_extrapolated_linear_function(\n",
- " year_packs)\n",
- "except EmptyDataset as e:\n",
- " raise\n",
- " \n",
- "electricity_consumption_per_capita = estimate_electricity_consumption_per_capita(target_year)\n",
- "electricity_consumption_per_capita"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 84,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "29677240.169365827"
- ]
- },
- "execution_count": 84,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Multiply population by electricity consumption per capita to get electricity consumption\n",
- "electricity_consumption = population * electricity_consumption_per_capita\n",
- "electricity_consumption"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 85,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Save table"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def get_population_electricity_consumption_table(target_year):\n",
- " pass"
- ]
- }
- ],
- "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.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/experiments/get-spline-interpolated-regression-extrapolated-function.ipynb b/experiments/get-spline-interpolated-regression-extrapolated-function.ipynb
deleted file mode 100644
index 5536b91..0000000
--- a/experiments/get-spline-interpolated-regression-extrapolated-function.ipynb
+++ /dev/null
@@ -1,1057 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "model.fit(np.array(xs).reshape(-1, 1), ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "regression_model.coef_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ True, False, False], dtype=bool)"
- ]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import numpy as np\n",
- "a = np.array([True, False, False])\n",
- "b = np.array([True, True, False])\n",
- "a & b"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "ename": "ValueError",
- "evalue": "The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[1;31mValueError\u001b[0m: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()"
- ]
- }
- ],
- "source": [
- "a and b"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1.04109589041\n",
- "1.0\n",
- "0.958904109589\n"
- ]
- }
- ],
- "source": [
- "import numpy as np\n",
- "from scipy.interpolate import interp1d\n",
- "from sklearn.linear_model import LinearRegression\n",
- "\n",
- "xys = [\n",
- " (1, 1),\n",
- " (2, 2),\n",
- " (3, 1),\n",
- " (4, 2),\n",
- " (8, 1),\n",
- "]\n",
- "\n",
- "def get_spline_interpolated_regression_extrapolated_function(xys, default_slope):\n",
- " xs, ys = zip(*xys)\n",
- " if len(set(xs)) == 1:\n",
- " xs = list(xs) + [xs[0] + 1]\n",
- " ys = list(ys) + [np.mean(ys) + default_slope]\n",
- " middle_function = interp1d(xs, ys, kind='linear')\n",
- " # Find intercepts\n",
- " regression_model = LinearRegression()\n",
- " regression_model.fit(np.array(xs).reshape(-1, 1), ys)\n",
- " slope = regression_model.coef_[0]\n",
- " x_min, x_max = min(xs), max(xs)\n",
- " left_intercept = middle_function(x_min) - slope * x_min\n",
- " right_intercept = middle_function(x_max) - slope * x_max\n",
- " # Define functions for left, middle, right\n",
- " left_function = lambda x: slope * x + left_intercept\n",
- " right_function = lambda x: slope * x + right_intercept\n",
- " \n",
- " def f(x):\n",
- " x = np.array(x)\n",
- " y = np.zeros(x.shape)\n",
- " # Define boolean masks\n",
- " x_left = x < x_min\n",
- " x_middle = (x_min <= x) & (x <= x_max)\n",
- " x_right = x_max < x \n",
- " # Compute y\n",
- " y[x_left] = left_function(x[x_left])\n",
- " y[x_middle] = middle_function(x[x_middle])\n",
- " y[x_right] = right_function(x[x_right])\n",
- " return y\n",
- " \n",
- " return f\n",
- "\n",
- "f = get_spline_interpolated_regression_extrapolated_function(xys, default_slope=1)\n",
- "print f(0)\n",
- "print f(1)\n",
- "print f(9)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "xs = np.array(xs)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "xs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "ys = np.zeros(xs.shape)\n",
- "ys"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "xs[xs > 2]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "xs[xs > 3] = 1\n",
- "xs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "x = np.array([1, 2])\n",
- "x"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "x.size"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "x = np.array(2)\n",
- "x.size"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# Vectorize\n",
- "x = np.array([0, 1, 2, 3, 4, 5])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "x < 2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "x > 4"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "f = lambda x: 2 * x + 1"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "f(x)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "f(x) * (x < 2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "f(x) * (x > 4)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "xys = [\n",
- " (1, 1),\n",
- " (2, 2),\n",
- " (3, 1),\n",
- " (4, 2),\n",
- " (8, 1),\n",
- "]\n",
- "xs, ys = zip(*xys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "xs, ys"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "regression_model = LinearRegression()\n",
- "regression_model.fit(np.array(xs).reshape(-1, 1), ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "regression_model.predict(x.reshape(-1, 1))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "x = np.array(1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "x < 2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "1, 2 + 3"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\nhijURUQy5P8DtEOuozfePRMAAAAASUVORK5CYII=\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "from matplotlib import pyplot as plt\n",
- "xs = np.linspace(0, 10, num=1000, endpoint=True)\n",
- "ys = f(xs)\n",
- "plt.plot(xs, ys);"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "debug"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "f = get_spline_interpolated_regression_extrapolated_function([(0, 0)], default_slope=1)\n",
- "print f(0)\n",
- "print f(1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "xs = 1, 2, 3\n",
- "ys = 4, 5, 6"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[(1, 4), (2, 5), (3, 6)]"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "zip(xs, ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from sklearn.linear_model import LinearRegression"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "m = LinearRegression()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 44,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "m.fit?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 43,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/usr/lib64/python2.7/site-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.\n",
- " DeprecationWarning)\n"
- ]
- },
- {
- "ename": "ValueError",
- "evalue": "Found arrays with inconsistent numbers of samples: [1 2]",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mxs\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[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mys\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[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mm\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mxs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mys\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
- "\u001b[1;32m/usr/lib64/python2.7/site-packages/sklearn/linear_model/base.pyc\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[0;32m 425\u001b[0m \u001b[0mn_jobs_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 426\u001b[0m X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],\n\u001b[1;32m--> 427\u001b[1;33m y_numeric=True, multi_output=True)\n\u001b[0m\u001b[0;32m 428\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 429\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msample_weight\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0matleast_1d\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
- "\u001b[1;32m/usr/lib64/python2.7/site-packages/sklearn/utils/validation.pyc\u001b[0m in \u001b[0;36mcheck_X_y\u001b[1;34m(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)\u001b[0m\n\u001b[0;32m 518\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 519\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 520\u001b[1;33m \u001b[0mcheck_consistent_length\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 521\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 522\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
- "\u001b[1;32m/usr/lib64/python2.7/site-packages/sklearn/utils/validation.pyc\u001b[0m in \u001b[0;36mcheck_consistent_length\u001b[1;34m(*arrays)\u001b[0m\n\u001b[0;32m 174\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muniques\u001b[0m\u001b[1;33m)\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 175\u001b[0m raise ValueError(\"Found arrays with inconsistent numbers of samples: \"\n\u001b[1;32m--> 176\u001b[1;33m \"%s\" % str(uniques))\n\u001b[0m\u001b[0;32m 177\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 178\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
- "\u001b[1;31mValueError\u001b[0m: Found arrays with inconsistent numbers of samples: [1 2]"
- ]
- }
- ],
- "source": [
- "import numpy as np\n",
- "xs = np.array([0, 0])\n",
- "ys = np.array([0, 1])\n",
- "m.fit(xs.reshape(-1, 1), ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "xs, ys = zip(*[(0, 1), (1, 0), (2, 2), (3, 1)])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 38,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
- ]
- },
- "execution_count": 38,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m.fit(np.array(xs).reshape(-1, 1), ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 40,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 0.9])"
- ]
- },
- "execution_count": 40,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m.predict(1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 41,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[0]])"
- ]
- },
- "execution_count": 41,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "np.array([0]).reshape(-1, 1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 50,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "array([[0, 0]])"
- ]
- },
- "execution_count": 50,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x = np.array([\n",
- " (0, 0),\n",
- "])\n",
- "print len(x)\n",
- "x"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 52,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[0, 0]])"
- ]
- },
- "execution_count": 52,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x.reshape(1, -1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "x = np.array([0, 1, 2])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 54,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([1, 2, 3])"
- ]
- },
- "execution_count": 54,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x + 1"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 55,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([0, 2, 4])"
- ]
- },
- "execution_count": 55,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x * 2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 56,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.70000000000000007"
- ]
- },
- "execution_count": 56,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m.intercept_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 71,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[ 0.]\n",
- "[ 0.2]\n",
- "[ 0.]\n",
- "[ 0.5]\n"
- ]
- }
- ],
- "source": [
- "m.coef_ = np.array([0.2])\n",
- "print m.predict(0)\n",
- "print m.predict(1)\n",
- "m.coef_ = np.array([0.5])\n",
- "print m.predict(0)\n",
- "print m.predict(1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 62,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
- ]
- },
- "execution_count": 62,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m.fit(np.array([[0]]), [0])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 63,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 0.])"
- ]
- },
- "execution_count": 63,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m.coef_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 65,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[0, 1],\n",
- " [2, 3]])"
- ]
- },
- "execution_count": 65,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "x = np.array([[0, 1], [2, 3]])\n",
- "x"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 67,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "The slowest run took 6.11 times longer than the fastest. This could mean that an intermediate result is being cached \n",
- "100000 loops, best of 3: 2.61 µs per loop\n"
- ]
- }
- ],
- "source": [
- "timeit zip(*x)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 68,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "The slowest run took 11.98 times longer than the fastest. This could mean that an intermediate result is being cached \n",
- "1000000 loops, best of 3: 577 ns per loop\n"
- ]
- }
- ],
- "source": [
- "timeit x[:, 0], x[:, 1]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from sklearn.linear_model import LinearRegression"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "m = LinearRegression()\n",
- "xys = [(100, 1), (300, 2), (500, 5)]\n",
- "xs, ys = zip(*xys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m.fit(np.array(xs).reshape(-1, 1), ys)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ 0.01])"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "m.coef_"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.99"
- ]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "1 - 0.01"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "5.01"
- ]
- },
- "execution_count": 9,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "5 + 0.01"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "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.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/forecast_demographic_from_series.py b/forecast_demographic_from_series.py
index fb3ea79..bea6b2c 100644
--- a/forecast_demographic_from_series.py
+++ b/forecast_demographic_from_series.py
@@ -1,6 +1,6 @@
from argparse import ArgumentParser
from crosscompute_table import TableType
-from infrastructure_planning.demography.linear import (
+from infrastructure_planning.demography.model.linear import (
forecast_demographic_from_series)
from infrastructure_planning.exceptions import EmptyDataset
from invisibleroads_macros.disk import make_enumerated_folder_for, make_folder
diff --git a/forecast_electricity_consumption.py b/forecast_electricity_consumption.py
index 86f1699..0c86940 100644
--- a/forecast_electricity_consumption.py
+++ b/forecast_electricity_consumption.py
@@ -1,51 +1,47 @@
import numpy as np
from argparse import ArgumentParser
+from invisibleroads_macros.disk import make_enumerated_folder_for, make_folder
+from invisibleroads_macros.log import format_summary
from infrastructure_planning.exceptions import EmptyDataset
from infrastructure_planning.growth.interpolated import (
get_interpolated_spline_extrapolated_linear_function)
-from invisibleroads_macros.disk import make_enumerated_folder_for, make_folder
from os.path import join
from pandas import DataFrame, read_csv
+from six import string_types
from StringIO import StringIO
DATASETS_FOLDER = 'datasets'
-COUNTRY_NAME_VARIATION_TABLE = read_csv(join(
- DATASETS_FOLDER, 'world-country-name-variation.csv'))
-COUNTRY_REGION_INCOME_TABLE = read_csv(StringIO(open(join(
- DATASETS_FOLDER, 'world-country-region-income.csv',
-), 'r').read().decode('utf-8-sig')))
POPULATION_BY_YEAR_BY_COUNTRY_TABLE = read_csv(join(
- DATASETS_FOLDER, 'world-population-by-year-by-country.csv'))
+ DATASETS_FOLDER, 'world-population-by-year-by-country.csv',
+), encoding='utf-8')
ELECTRICITY_CONSUMPTION_PER_CAPITA_BY_YEAR_TABLE = read_csv(join(
DATASETS_FOLDER, 'world-electricity-consumption-per-capita-by-year.csv',
-), skiprows=3)
-UNITED_NATIONS_COUNTRY_NAMES = POPULATION_BY_YEAR_BY_COUNTRY_TABLE[
- 'Country or Area'].unique()
-WORLD_BANK_COUNTRY_NAMES = COUNTRY_REGION_INCOME_TABLE[
- 'Country Name'].unique()
+), encoding='utf-8', skiprows=3)
+COUNTRY_REGION_INCOME_TABLE = read_csv(StringIO(open(join(
+ DATASETS_FOLDER, 'world-country-region-income.csv',
+), 'r').read().decode('utf-8-sig')), encoding='utf-8')
+COUNTRY_NAMES = []
+ALTERNATE_COUNTRY_NAME_BY_COUNTRY_NAME = {}
def run(target_folder, target_year):
- d = {}
- electricity_consumption_by_population_table_path = join(
- target_folder, 'electricity-consumption-by-population.csv')
+ d = []
t = get_population_electricity_consumption_table(target_year)
- t.to_csv(electricity_consumption_by_population_table_path, index=False)
- d.append((
- 'electricity_consumption_by_population_table_path',
- electricity_consumption_by_population_table_path))
- """
+ t_path = join(target_folder, 'electricity-consumption-by-population.csv')
+ t.to_csv(t_path, encoding='utf-8', index=False)
+ d.append(('electricity_consumption_by_population_table_path', t_path))
# World
d.append(plot_electricity_consumption_by_population(
target_folder, 'world', t))
# Region
- for region_name, table in t.groupby('region_name'):
+ """
+ for region_name, table in t.groupby('Region Name'):
d.append(plot_electricity_consumption_by_population(
target_folder, _format_label_for_region(
region_name), table))
# Income
- for income_group_name, table in t.groupby('income_group_name'):
+ for income_group_name, table in t.groupby('Income Group Name'):
d.append(plot_electricity_consumption_by_population(
target_folder, _format_label_for_income_group(
income_group_name), table))
@@ -55,39 +51,58 @@ def run(target_folder, target_year):
def get_population_electricity_consumption_table(target_year):
population_electricity_consumption_packs = []
- for united_nations_country_name in UNITED_NATIONS_COUNTRY_NAMES:
- try:
- world_bank_country_name = get_world_bank_country_name(
- united_nations_country_name)
- except ValueError:
- continue
- population = estimate_population(
- target_year, united_nations_country_name)
+ for country_name in yield_country_name():
try:
+ population = estimate_population(target_year, country_name)
electricity_consumption_per_capita = \
estimate_electricity_consumption_per_capita(
- target_year, world_bank_country_name)
- except EmptyDataset:
+ target_year, country_name)
+ except EmptyDataset as e:
+ print('Skipping %s: %s' % (country_name, e))
continue
electricity_consumption = \
electricity_consumption_per_capita * population
population_electricity_consumption_packs.append((
+ country_name,
+ get_region_name_for(country_name),
+ get_income_group_name_for(country_name),
population,
electricity_consumption_per_capita,
electricity_consumption))
return DataFrame(population_electricity_consumption_packs, columns=[
+ 'Country Name',
+ 'Region Name',
+ 'Income Group Name',
'Population',
'Electricity Consumption Per Capita (kWh)',
'Electricity Consumption (kWh)',
])
-def estimate_population(target_year, united_nations_country_name):
+def plot_electricity_consumption_by_population(target_folder, label, table):
+ variable_nickname = 'electricity_consumption_%s' % label
+ variable_name = variable_nickname + '_image_path'
+ target_path = join(
+ target_folder, variable_nickname.replace('_', '-') + '.jpg')
+ # Plot consumption vs population for the selected target_year
+ return variable_name, target_path
+
+
+def yield_country_name():
+ if not COUNTRY_NAMES:
+ _prepare_country_names()
+ return iter(COUNTRY_NAMES)
+
+
+def estimate_population(target_year, country_name):
t = POPULATION_BY_YEAR_BY_COUNTRY_TABLE
- country_t = t[t['Country or Area'] == united_nations_country_name]
- earliest_estimated_year = min(country_t[
- country_t['Variant'] == 'Low variant']['Year(s)'])
- # Get actual populations
+ country_t = _get_country_table(t, 'Country or Area', country_name)
+ try:
+ earliest_estimated_year = min(country_t[
+ country_t['Variant'] == 'Low variant']['Year(s)'])
+ except ValueError:
+ raise EmptyDataset('Missing population')
+ # Get actual population for each year
year_packs = country_t[country_t['Year(s)'] < earliest_estimated_year][[
'Year(s)', 'Value']].values
# Estimate population for the given year
@@ -96,18 +111,12 @@ def estimate_population(target_year, united_nations_country_name):
return estimate_population(target_year)
-def estimate_electricity_consumption_per_capita(
- target_year, world_bank_country_name):
+def estimate_electricity_consumption_per_capita(target_year, country_name):
t = ELECTRICITY_CONSUMPTION_PER_CAPITA_BY_YEAR_TABLE
- print world_bank_country_name
- print repr(world_bank_country_name)
- country_t = t[t['Country Name'] == world_bank_country_name]
- """
+ country_t = _get_country_table(t, 'Country Name', country_name)
if not len(country_t):
- world_bank_country_name = get_alternate_country_name(
- world_bank_country_name)
- country_t = t[t['Country Name'] == world_bank_country_name]
- """
+ raise EmptyDataset(
+ 'Missing electricity_consumption_per_capita country_name')
year_packs = []
for column_name in country_t.columns:
try:
@@ -118,58 +127,74 @@ def estimate_electricity_consumption_per_capita(
if np.isnan(value):
continue
year_packs.append((year, value))
+ if not year_packs:
+ raise EmptyDataset(
+ 'Missing electricity_consumption_per_capita year_value')
estimate_electricity_consumption_per_capita = \
get_interpolated_spline_extrapolated_linear_function(year_packs)
return estimate_electricity_consumption_per_capita(target_year)
-def plot_electricity_consumption_by_population(target_folder, label, table):
- variable_nickname = 'electricity_consumption_%s' % label
- variable_name = variable_nickname + '_image_path'
- target_path = join(
- target_folder, variable_nickname.replace('_', '-') + '.jpg')
-
- # Plot consumption vs population for the selected target_year
-
- return variable_name, target_path
-
-
-def get_united_nations_country_name(world_bank_country_name):
- t = COUNTRY_NAME_VARIATION_TABLE
- try:
- return t[
- t['World Bank'] == world_bank_country_name
- ]['United Nations'].values[0]
- except IndexError:
- pass
- if world_bank_country_name not in UNITED_NATIONS_COUNTRY_NAMES:
- raise ValueError(world_bank_country_name)
- return world_bank_country_name
-
-
-def get_world_bank_country_name(united_nations_country_name):
- t = COUNTRY_NAME_VARIATION_TABLE
- try:
- return t[
- t['United Nations'] == united_nations_country_name
- ]['World Bank'].values[0]
- except IndexError:
- pass
- if united_nations_country_name not in WORLD_BANK_COUNTRY_NAMES:
- raise ValueError(united_nations_country_name)
- return united_nations_country_name
+def get_region_name_for(country_name):
+ t = COUNTRY_REGION_INCOME_TABLE
+ country_t = _get_country_table(t, 'Country Name', country_name)
+ return country_t['Region'].values[0]
+
+
+def get_income_group_name_for(country_name):
+ t = COUNTRY_REGION_INCOME_TABLE
+ country_t = _get_country_table(t, 'Country Name', country_name)
+ return country_t['IncomeGroup'].values[0]
+
+
+def _prepare_country_names():
+ global COUNTRY_NAMES
+ global ALTERNATE_COUNTRY_NAME_BY_COUNTRY_NAME
+ country_name_table = read_csv(join(
+ DATASETS_FOLDER, 'world-country-name.csv',
+ ), encoding='utf-8', header=None)
+ for index, row in country_name_table.iterrows():
+ country_name = row[0]
+ COUNTRY_NAMES.append(country_name)
+ for alternate_country_name in row[1:]:
+ if not isinstance(alternate_country_name, string_types):
+ continue
+ ALTERNATE_COUNTRY_NAME_BY_COUNTRY_NAME[
+ country_name] = alternate_country_name
+ ALTERNATE_COUNTRY_NAME_BY_COUNTRY_NAME[
+ alternate_country_name] = country_name
+ country_name = alternate_country_name
+
+
+def _get_country_table(table, column_name, country_name):
+ country_t = DataFrame()
+ country_names = []
+ while not len(country_t):
+ country_t = table[table[column_name] == country_name]
+ country_names.append(country_name)
+ try:
+ country_name = _get_alternate_country_name(country_name)
+ except KeyError:
+ break
+ if country_name in country_names:
+ break
+ return country_t
-def get_alternate_country_name(country_name):
- pass
+def _get_alternate_country_name(country_name):
+ if not ALTERNATE_COUNTRY_NAME_BY_COUNTRY_NAME:
+ _prepare_country_names()
+ return ALTERNATE_COUNTRY_NAME_BY_COUNTRY_NAME[country_name]
def _format_label_for_region(region_name):
- pass
+ label = ''
+ return label
def _format_label_for_income_group(income_group_name):
- pass
+ label = ''
+ return label
if __name__ == '__main__':
@@ -185,3 +210,4 @@ def _format_label_for_income_group(income_group_name):
d = run(
args.target_folder or make_enumerated_folder_for(__file__),
args.target_year)
+ print(format_summary(d))