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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
0
01
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
012
0AfghanistanNaNNaN
1AlbaniaNaNNaN
2AlgeriaNaNNaN
3American SamoaNaNNaN
4AndorraNaNNaN
5AngolaNaNNaN
6AntarcticaNaNNaN
7Antigua and BarbudaNaNNaN
8ArgentinaNaNNaN
9ArmeniaNaNNaN
10ArubaNaNNaN
11AustraliaNaNNaN
12AustriaNaNNaN
13AzerbaijanNaNNaN
14Bahamas, TheBahamasNaN
15BahrainNaNNaN
16BangladeshNaNNaN
17BarbadosNaNNaN
18BelarusNaNNaN
19BelgiumNaNNaN
20BelizeNaNNaN
21BeninNaNNaN
22BermudaNaNNaN
23BhutanNaNNaN
24BoliviaBolivia (Plurinational State of)NaN
25Bosnia and HerzegovinaNaNNaN
26BotswanaNaNNaN
27BrazilNaNNaN
28Brunei DarussalamNaNNaN
29BulgariaNaNNaN
............
186SwitzerlandNaNNaN
187Syrian Arab RepublicNaNNaN
188TaiwanNaNNaN
189TajikistanNaNNaN
190TanzaniaUnited Republic of TanzaniaNaN
191ThailandNaNNaN
192Timor-LesteNaNNaN
193TogoNaNNaN
194TongaNaNNaN
195Trinidad and TobagoNaNNaN
196TunisiaNaNNaN
197TurkeyNaNNaN
198TurkmenistanNaNNaN
199Turks and Caicos IslandsNaNNaN
200TuvaluNaNNaN
201UgandaNaNNaN
202UkraineNaNNaN
203United Arab EmiratesNaNNaN
204United KingdomNaNNaN
205United StatesUnited States of AmericaNaN
206UruguayNaNNaN
207UzbekistanNaNNaN
208VanuatuNaNNaN
209Venezuela, RBVenezuela (Bolivarian Republic of)NaN
210VietnamViet NamNaN
211Virgin Islands (U.S.)United States Virgin IslandsNaN
212West Bank and GazaState of PalestineNaN
213Yemen, Rep.YemenNaN
214ZambiaNaNNaN
215ZimbabweNaNNaN
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country NameCountry CodeRegionIncomeGroupSpecialNotesUnnamed: 5
0ArubaABWLatin America & CaribbeanHigh income: nonOECDSNA data for 2000-2011 are updated from offici...NaN
1AfghanistanAFGSouth AsiaLow incomeFiscal year end: March 20; reporting period fo...NaN
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country or AreaYear(s)VariantValue
0Afghanistan2100Const. mortality (Medium)40190.280
1Afghanistan2100Constant-fertility scenario845843.367
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country NameCountry CodeIndicator NameIndicator Code196019611962196319641965...200720082009201020112012201320142015Unnamed: 60
232UruguayURYElectric power consumption (kWh per capita)EG.USE.ELEC.KH.PCNaNNaNNaNNaNNaNNaN...2413.3542932586.2233622659.7192012803.1533772808.3565442931.917628NaNNaNNaNNaN
233United StatesUSAElectric power consumption (kWh per capita)EG.USE.ELEC.KH.PC4049.7866294182.1755014433.6060214690.4862564970.4464565234.685002...13657.44950913663.42468012913.71142913394.01460713240.35798712954.153262NaNNaNNaNNaN
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country or AreaYear(s)VariantValue
0Afghanistan2100Const. mortality (Medium)40190.280
1Afghanistan2100Constant-fertility scenario845843.367
2Afghanistan2100High variant92331.174
3Afghanistan2100Instant replacement52174.837
4Afghanistan2100Low variant35950.480
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Year(s)Value
152200524860.855
153200020595.360
154199517586.073
155199011731.193
156198511528.977
157198013180.431
158197512551.790
159197011015.621
16019659765.015
16119608774.440
16219558009.614
16319507450.738
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country or AreaYear(s)VariantValue
152Afghanistan2005Medium variant24860.855
153Afghanistan2000Medium variant20595.360
154Afghanistan1995Medium variant17586.073
155Afghanistan1990Medium variant11731.193
156Afghanistan1985Medium variant11528.977
157Afghanistan1980Medium variant13180.431
158Afghanistan1975Medium variant12551.790
159Afghanistan1970Medium variant11015.621
160Afghanistan1965Medium variant9765.015
161Afghanistan1960Medium variant8774.440
162Afghanistan1955Medium variant8009.614
163Afghanistan1950Medium variant7450.738
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Year(s)Value
152200524860.855
153200020595.360
154199517586.073
155199011731.193
156198511528.977
157198013180.431
158197512551.790
159197011015.621
16019659765.015
16119608774.440
16219558009.614
16319507450.738
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country NameCountry CodeRegionIncomeGroupSpecialNotesUnnamed: 5
25BermudaBMUNorth AmericaHigh income: nonOECDNaNNaN
33CanadaCANNorth AmericaHigh income: OECDFiscal year end: March 31; reporting period fo...NaN
234United StatesUSANorth AmericaHigh income: OECDFiscal year end: September 30; reporting perio...NaN
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country or AreaYear(s)VariantValue
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Year(s)Value
411832005298165.797
411842000284594.395
411851995268039.654
411861990254506.647
411871985241870.002
411881980230176.361
411891975219439.031
411901970209891.345
411911965199686.185
411921960186361.893
411931955170939.332
411941950157813.040
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
xy
0a1
1a2
2b3
3c4
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
World BankUnited Nations
0Bahamas, TheBahamas
1BoliviaBolivia (Plurinational State of)
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country NameCountry CodeRegionIncomeGroupSpecialNotesUnnamed: 5
0ArubaABWLatin America & CaribbeanHigh income: nonOECDSNA data for 2000-2011 are updated from offici...NaN
1AfghanistanAFGSouth AsiaLow incomeFiscal year end: March 20; reporting period fo...NaN
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country or AreaYear(s)VariantValue
0Afghanistan2100Const. mortality (Medium)40190.280
1Afghanistan2100Constant-fertility scenario845843.367
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country Name200020052010
232Uruguay2030.2645821999.6343532803.153377
233United States13671.05202413704.57704813394.014607
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country or AreaYear(s)VariantValue
18071Ireland2100Const. mortality (Medium)5738.911
18072Ireland2100Constant-fertility scenario6732.225
\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Country NameCountry CodeIndicator NameIndicator Code196019611962196319641965...200720082009201020112012201320142015Unnamed: 60
101IrelandIRLElectric power consumption (kWh per capita)EG.USE.ELEC.KH.PC695.043484752.018128838.13755886.1935391041.6703011134.39683...6218.7680586340.7330455947.9094895910.9832895661.1680585664.831802NaNNaNNaNNaN
\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))