Beispiel #1
0
 def test_reset_pop_counters(self):
     model = ChathamHouseModel(dict())
     model.reset_pop_counters()
     assert model.pop_biomass == 0
     assert model.pop_nonbiomass == 0
     assert model.pop_grid == 0
     assert model.pop_offgrid == 0
Beispiel #2
0
    def testCampModel(self, camptypes, lightingoffgridcost,
                      elecgriddirectenergy, cookingsolidcost,
                      lighting_type_descriptions, cooking_type_descriptions):
        model = ChathamHouseModel({
            'Household Size': 5,
            'Electricity Cost': 25,
            'Cooking LPG NonCamp Price': 1.8,
            'Kerosene CO2 Emissions': 2.96,
            'Lighting Offgrid Scaling Factor': 1,
            'Cooking Solid Scaling Factor': 1
        })
        noncampelecgridco2 = {'sdn': 0.615}
        camp = 'Southern Darfur : Wilayat - State'
        unhcr_camp = {'Southern Darfur : Wilayat - State': (916885, 'sdn')}
        population, iso3 = unhcr_camp[camp]
        number_hh = model.calculate_number_hh(population)
        camp_camptypes = camptypes.get(camp)
        elecco2 = noncampelecgridco2[iso3]

        tier = 'Baseline'
        camplightingoffgridtype = camp_camptypes['Lighting OffGrid %s' % tier]
        campcookingsolidtype = camp_camptypes['Cooking Solid %s' % tier]
        res = model.calculate_offgrid_solid(
            tier, number_hh, lighting_type_descriptions,
            camplightingoffgridtype, lightingoffgridcost, elecgriddirectenergy,
            elecco2, number_hh, cooking_type_descriptions,
            campcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == 9.775621570875002
        assert offgrid_capital_costs == 4.1443202
        assert offgrid_co2_emissions == 15827.062570875001
        assert solid_expenditure == 17.732900221858348
        assert solid_capital_costs == 0.272694513508602
        assert solid_co2_emissions == 486665.6448458868

        tier = 'Target 1'
        camplightingoffgridtype = camp_camptypes['Lighting OffGrid %s' % tier]
        campcookingsolidtype = camp_camptypes['Cooking Solid %s' % tier]
        res = model.calculate_offgrid_solid(
            tier, number_hh, lighting_type_descriptions,
            camplightingoffgridtype, lightingoffgridcost, elecgriddirectenergy,
            elecco2, number_hh, cooking_type_descriptions,
            campcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == 1.5779240444426306
        assert offgrid_capital_costs == 8.06913039432437
        assert offgrid_co2_emissions == 3835.58834969693
        assert solid_expenditure == 7.15870727889462
        assert solid_capital_costs == 9.20896466314155
        assert solid_co2_emissions == 189409.2845950458
Beispiel #3
0
 def test_sum_population(self):
     remdict = {
         'AFG': {
             'individual': {
                 'a': 10,
                 'b': 20
             }
         },
         'BUR': {
             'self-settled': {
                 'c': 12,
                 'd': 21
             }
         }
     }
     pop = ChathamHouseModel.sum_population(
         {'AFG': {
             'individual': {
                 'a': 10,
                 'b': 20
             }
         }}, 'AFG', remdict)
     assert pop == 30
     assert remdict == {
         'AFG': {
             'individual': {}
         },
         'BUR': {
             'self-settled': {
                 'c': 12,
                 'd': 21
             }
         }
     }
Beispiel #4
0
 def test_calculate_mostfrequent(self):
     mostfreq = ChathamHouseModel.calculate_mostfrequent({
         'a': 1,
         'b': 5,
         'c': 5,
         'd': 3,
         'e': 4
     })
     assert mostfreq == 5
Beispiel #5
0
 def test_calculate_regional_average(self):
     avg = ChathamHouseModel.calculate_regional_average(
         'things', {
             'COM': 0.5,
             'ETH': 0.1,
             'AGO': 0.9
         }, 'DJI')
     assert avg == (0.3, 14)
     avg = ChathamHouseModel.calculate_regional_average(
         'things', {
             'AGO': 0.3,
             'LSO': 0.7,
             'DZA': 0.7
         }, 'DJI')
     assert avg == (0.5, 202)
     avg = ChathamHouseModel.calculate_regional_average(
         'things', {
             'AGO': 0.3,
             'COM': 0.5,
             'AIA': 0.9
         }, 'LBY')
     assert avg == (0.4, 2)
Beispiel #6
0
 def test_get_total_spending(self):
     model = ChathamHouseModel(dict())
     model.total_spending = 3515.6789123
     assert model.get_total_spending() == 3516000000
Beispiel #7
0
 def test_get_camp_percentage_offgrid(self):
     model = ChathamHouseModel(dict())
     model.camp_offgrid = 3
     model.camp_grid = 2
     assert model.get_camp_percentage_offgrid() == 3 / 5
Beispiel #8
0
 def test_get_percentage_offgrid(self):
     model = ChathamHouseModel(dict())
     model.total_offgrid = 2
     model.total_grid = 3
     assert model.get_percentage_offgrid() == 2 / 5
Beispiel #9
0
 def test_get_camp_percentage_biomass(self):
     model = ChathamHouseModel(dict())
     model.camp_biomass = 2
     model.camp_nonbiomass = 1
     assert model.get_camp_percentage_biomass() == 2 / 3
Beispiel #10
0
 def test_get_percentage_biomass(self):
     model = ChathamHouseModel(dict())
     model.total_biomass = 1
     model.total_nonbiomass = 2
     assert model.get_percentage_biomass() == 1 / 3
Beispiel #11
0
 def test_add_keyfigures(self):
     model = ChathamHouseModel(dict())
     iso3 = 'AFG'
     country = 'Afghanistan'
     camp = 'Urban'
     tier = 'Baseline'
     se = 100
     oe = 200
     cookingtypedesc = 'Firewood/Charcoal Mix'
     cooking_pop = 1000
     lightingtypedesc = 'Torch Dependent'
     lighting_pop = 2000
     results = [list(), None]
     ne = 10000
     ge = 5000
     model.add_keyfigures(iso3,
                          country,
                          camp,
                          tier,
                          se,
                          oe,
                          cookingtypedesc,
                          cooking_pop,
                          lightingtypedesc,
                          lighting_pop,
                          results,
                          ne=ne,
                          ge=ge)
     model.reset_pop_counters()
     cookingtypedesc = 'LPG/Natural Gas'
     cooking_pop = 3500
     lightingtypedesc = 'On grid'
     lighting_pop = 1500
     model.add_keyfigures(iso3,
                          country,
                          camp,
                          tier,
                          se,
                          oe,
                          cookingtypedesc,
                          cooking_pop,
                          lightingtypedesc,
                          lighting_pop,
                          results,
                          ne=ne,
                          ge=ge)
     model.reset_pop_counters()
     cookingtypedesc = 'Firewood dependent'
     cooking_pop = 7000
     model.add_keyfigures(iso3,
                          country,
                          camp,
                          tier,
                          se,
                          oe,
                          cookingtypedesc,
                          cooking_pop,
                          lightingtypedesc,
                          lighting_pop,
                          results,
                          ne=ne,
                          ge=ge)
     assert results[0] == [[
         'AFG', 'Afghanistan', 'Urban', 'Baseline', 10100,
         'Firewood/Charcoal Mix', 0, 1000, 5200, 'Torch Dependent', 0, 2000
     ],
                           [
                               'AFG', 'Afghanistan', 'Urban', 'Baseline',
                               10100, 'LPG/Natural Gas', 3500, 0, 5200,
                               'On grid', 1500, 0
                           ],
                           [
                               'AFG', 'Afghanistan', 'Urban', 'Baseline',
                               10100, 'Firewood dependent', 0, 7000, 5200,
                               'On grid', 1500, 0
                           ]]
     assert model.get_percentage_biomass() == 8000 / 11500
     with pytest.raises(ZeroDivisionError):
         model.get_camp_percentage_biomass()
     assert model.get_percentage_offgrid() == 2000 / 5000
     with pytest.raises(ZeroDivisionError):
         model.get_camp_percentage_offgrid()
     assert model.get_total_spending() == 45900000000
     model.reset_pop_counters()
     camp = 'lala'
     cookingtypedesc = 'Alternative biomass'
     lightingtypedesc = 'Kerosene dependent'
     model.add_keyfigures(iso3, country, camp, tier, se, oe,
                          cookingtypedesc, cooking_pop, lightingtypedesc,
                          lighting_pop, results)
     assert results[0] == [[
         'AFG', 'Afghanistan', 'Urban', 'Baseline', 10100,
         'Firewood/Charcoal Mix', 0, 1000, 5200, 'Torch Dependent', 0, 2000
     ],
                           [
                               'AFG', 'Afghanistan', 'Urban', 'Baseline',
                               10100, 'LPG/Natural Gas', 3500, 0, 5200,
                               'On grid', 1500, 0
                           ],
                           [
                               'AFG', 'Afghanistan', 'Urban', 'Baseline',
                               10100, 'Firewood dependent', 0, 7000, 5200,
                               'On grid', 1500, 0
                           ],
                           [
                               'AFG', 'Afghanistan', 'lala', 'Baseline',
                               100, 'Alternative biomass', 7000, 0, 200,
                               'Kerosene dependent', 0, 1500
                           ]]
     assert model.get_total_spending() == 46200000000
     assert model.get_percentage_biomass() == 8000 / 18500
     assert model.get_camp_percentage_biomass() == 0
     assert model.get_percentage_offgrid() == 3500 / 6500
     assert model.get_camp_percentage_offgrid() == 1500 / 1500
Beispiel #12
0
    def testSmallCampModel(self, small_camptypes, lightingoffgridcost,
                           elecgriddirectenergy, cookingsolidcost,
                           lighting_type_descriptions,
                           cooking_type_descriptions):
        model = ChathamHouseModel({
            'Household Size': 5,
            'Electricity Cost': 25,
            'Cooking LPG NonCamp Price': 1.8,
            'Kerosene CO2 Emissions': 2.96,
            'Lighting Offgrid Scaling Factor': 1,
            'Cooking Solid Scaling Factor': 1
        })
        camp_group = 'Subsaharan Africa G'
        smallcamps = {camp_group: 83908.56}
        small_camps_elecgridco2 = {camp_group: 0.3994098361}
        number_hh = model.calculate_number_hh(smallcamps[camp_group])
        campgroup_camptypes = small_camptypes.get(camp_group)
        elecco2 = small_camps_elecgridco2[camp_group]

        tier = 'Baseline'
        camplightingoffgridtype = campgroup_camptypes['Lighting OffGrid %s' %
                                                      tier]
        campcookingsolidtype = campgroup_camptypes['Cooking Solid %s' % tier]
        res = model.calculate_offgrid_solid(
            tier, number_hh, lighting_type_descriptions,
            camplightingoffgridtype, lightingoffgridcost, elecgriddirectenergy,
            elecco2, number_hh, cooking_type_descriptions,
            campcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == 0.894614187294
        assert offgrid_capital_costs == 0.37926669120000006
        assert offgrid_co2_emissions == 1442.1696815239604
        assert solid_expenditure == ''
        assert solid_capital_costs == ''
        assert solid_co2_emissions == ''

        tier = 'Target 3'
        camplightingoffgridtype = campgroup_camptypes['Lighting OffGrid %s' %
                                                      tier]
        campcookingsolidtype = campgroup_camptypes['Cooking Solid %s' % tier]
        res = model.calculate_offgrid_solid(
            tier, number_hh, lighting_type_descriptions,
            camplightingoffgridtype, lightingoffgridcost, elecgriddirectenergy,
            elecco2, number_hh, cooking_type_descriptions,
            campcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == 0.15505425729584385
        assert offgrid_capital_costs == 8.547099603928343
        assert offgrid_co2_emissions == 592.1439284539138
        assert solid_expenditure == ''
        assert solid_capital_costs == ''
        assert solid_co2_emissions == ''

        camp_group = 'Asia E'
        smallcamps = {camp_group: 19577.01373}
        small_camps_elecgridco2 = {camp_group: ''}
        number_hh = model.calculate_number_hh(smallcamps[camp_group])
        campgroup_camptypes = small_camptypes.get(camp_group)
        elecco2 = small_camps_elecgridco2[camp_group]

        tier = 'Target 2'
        camplightingoffgridtype = campgroup_camptypes['Lighting OffGrid %s' %
                                                      tier]
        campcookingsolidtype = campgroup_camptypes['Cooking Solid %s' % tier]
        res = model.calculate_offgrid_solid(
            tier, number_hh, lighting_type_descriptions,
            camplightingoffgridtype, lightingoffgridcost, elecgriddirectenergy,
            elecco2, number_hh, cooking_type_descriptions,
            campcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == ''
        assert offgrid_capital_costs == ''
        assert offgrid_co2_emissions == ''
        assert solid_expenditure == 0.28453285405596584
        assert solid_capital_costs == 0.19577013729999998
        assert solid_co2_emissions == 520.506277903452

        tier = 'Baseline'
        camplightingoffgridtype = campgroup_camptypes['Lighting OffGrid %s' %
                                                      tier]
        campcookingsolidtype = campgroup_camptypes['Cooking Solid %s' % tier]
        res = model.calculate_offgrid_solid(
            tier, number_hh, lighting_type_descriptions,
            camplightingoffgridtype, lightingoffgridcost, elecgriddirectenergy,
            elecco2, number_hh, cooking_type_descriptions,
            campcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == ''
        assert offgrid_capital_costs == ''
        assert offgrid_co2_emissions == ''
        assert solid_expenditure == 0.6505642389516176
        assert solid_capital_costs == 0.00916640744582953
        assert solid_co2_emissions == 11087.728057822153
Beispiel #13
0
    def testNonCampModel(self, lightingoffgridcost, elecgriddirectenergy,
                         cookingsolidcost, slumratios,
                         lighting_type_descriptions,
                         cooking_type_descriptions):
        model = ChathamHouseModel({
            'Population Adjustment Factor': 0.7216833622,
            'Household Size': 5,
            'Electricity Cost': 25,
            'Cooking LPG NonCamp Price': 1.8,
            'Kerosene CO2 Emissions': 2.96,
            'Lighting Offgrid Scaling Factor': 1,
            'Cooking Solid Scaling Factor': 1
        })
        iso3 = 'ago'
        unhcr_non_camp = {iso3: 59970}
        urbanratios = {iso3: 0.58379}
        elecappliances = {iso3: 92.6033836492}
        noncampelecgridco2 = {iso3: 0.0375}
        cookinglpg = {iso3: 4.096473669}

        country_elecappliances = elecappliances.get(iso3)
        country_noncampelecgridco2 = noncampelecgridco2[iso3]
        country_cookinglpg = cookinglpg[iso3]

        displaced_population = unhcr_non_camp[iso3]
        number_hh_by_pop_type = model.calculate_population(
            iso3, displaced_population, urbanratios, slumratios, list())
        assert number_hh_by_pop_type == {
            'Rural': 1389.3629848179437,
            'Slum': 7601.16815388216,
            'Urban': 3003.4688612998957
        }
        number_hh_by_pop_type = model.calculate_population(
            iso3, displaced_population, urbanratios, {iso3: 0.658}, list())
        assert number_hh_by_pop_type == {
            'Rural': 1389.3629848179437,
            'Slum': 6977.851155989793,
            'Urban': 3626.785859192263
        }
        pop_type = 'Rural'
        number_hh = number_hh_by_pop_type[pop_type]
        country_elec_access = 0.055
        hh_grid_access, hh_offgrid = model.calculate_hh_access(
            number_hh, country_elec_access)
        assert hh_grid_access == 76.4149641649869
        assert hh_offgrid == 1312.9480206529568
        country_nonsolid_access = 0.11
        hh_nonsolid_access, hh_no_nonsolid_access = model.calculate_hh_access(
            number_hh, country_nonsolid_access)
        assert hh_nonsolid_access == 152.8299283299738
        assert hh_no_nonsolid_access == 1236.5330564879698
        elecgrid = {0: 3, 1: 35, 2: 194, 3: 820, 4: 1720}
        grid_expenditure, grid_co2_emissions = model.calculate_ongrid_lighting(
            hh_grid_access, elecgrid, country_elecappliances,
            country_noncampelecgridco2)
        assert grid_expenditure == 0.0017690710607775378
        assert grid_co2_emissions == 0.26536065911663065
        nonsolid_expenditure, nonsolid_co2_emissions = model.calculate_non_solid_cooking(
            hh_nonsolid_access, country_cookinglpg)
        assert nonsolid_expenditure == 0.013522977588360128
        assert nonsolid_co2_emissions == 22.237785367525543
        noncamplightingoffgridtypes = {
            'Urban Baseline Type': 1,
            'Urban Target 1 Type': 1,
            'Urban Target 2 Type': 3,
            'Urban Target 3 Type': 7,
            'Rural Baseline Type': 1,
            'Rural Target 1 Type': 1,
            'Rural Target 2 Type': 3,
            'Rural Target 3 Type': 7,
            'Slum Baseline Type': 1,
            'Slum Target 1 Type': 1,
            'Slum Target 2 Type': 3,
            'Slum Target 3 Type': 7
        }
        noncampcookingsolidtypes = {
            'Urban Baseline Type': 2,
            'Urban Target 1 Type': 2,
            'Urban Target 2 Type': 7,
            'Urban Target 3 Type': 8,
            'Rural Baseline Type': 1,
            'Rural Target 1 Type': 1,
            'Rural Target 2 Type': 7,
            'Rural Target 3 Type': 8,
            'Slum Baseline Type': 1,
            'Slum Target 1 Type': 1,
            'Slum Target 2 Type': 7,
            'Slum Target 3 Type': 8
        }
        tier = 'Target 2'
        noncamplightingoffgridtype = noncamplightingoffgridtypes['%s %s Type' %
                                                                 (pop_type,
                                                                  tier)]
        noncampcookingsolidtype = noncampcookingsolidtypes['%s %s Type' %
                                                           (pop_type, tier)]
        res = model.calculate_offgrid_solid(
            tier, hh_offgrid, lighting_type_descriptions,
            noncamplightingoffgridtype, lightingoffgridcost,
            elecgriddirectenergy, country_noncampelecgridco2,
            hh_no_nonsolid_access, cooking_type_descriptions,
            noncampcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == 0.002157308870967376
        assert offgrid_capital_costs == 0.2328784963573492
        assert offgrid_co2_emissions == 8.238647374164904
        co2_emissions = grid_co2_emissions + offgrid_co2_emissions
        assert co2_emissions == 8.504008033281535
        assert solid_expenditure == 0.09999499528651126
        assert solid_capital_costs == 0.06182665282439849
        assert solid_co2_emissions == 1405.3438532905193
        co2_emissions = nonsolid_co2_emissions + solid_co2_emissions
        assert co2_emissions == 1427.5816386580448

        tier = 'Target 3'
        noncamplightingoffgridtype = noncamplightingoffgridtypes['%s %s Type' %
                                                                 (pop_type,
                                                                  tier)]
        noncampcookingsolidtype = noncampcookingsolidtypes['%s %s Type' %
                                                           (pop_type, tier)]
        res = model.calculate_offgrid_solid(
            tier, hh_offgrid, lighting_type_descriptions,
            noncamplightingoffgridtype, lightingoffgridcost,
            elecgriddirectenergy, country_noncampelecgridco2,
            hh_no_nonsolid_access, cooking_type_descriptions,
            noncampcookingsolidtype, cookingsolidcost)
        lighting_type_description, offgrid_expenditure, offgrid_capital_costs, offgrid_co2_emissions, \
        cooking_type_description, solid_expenditure, solid_capital_costs, solid_co2_emissions = res
        assert offgrid_expenditure == 0.01213095423222568
        assert offgrid_capital_costs == 0.6686980152740906
        assert offgrid_co2_emissions == 46.32746639944912
        co2_emissions = grid_co2_emissions + offgrid_co2_emissions
        assert co2_emissions == 46.59282705856575
        assert solid_expenditure == 0.3275797640995024
        assert solid_capital_costs == 0.0989177392294985
        assert solid_co2_emissions == 290.5365064344328
        co2_emissions = nonsolid_co2_emissions + solid_co2_emissions
        assert co2_emissions == 312.7742918019583
Beispiel #14
0
def main():
    """Generate dataset and create it in HDX"""
    configuration = Configuration.read()
    with Download() as downloader:
        constants = float_value_convert(
            downloader.download_tabular_key_value(
                configuration['constants_url']))
        constants['Lighting Grid Tier'] = int(constants['Lighting Grid Tier'])

        camp_overrides = downloader.download_tabular_cols_as_dicts(
            configuration['camp_overrides_url'])
        camp_overrides['Population'] = integer_value_convert(
            camp_overrides['Population'], dropfailedvalues=True)
        camp_overrides['Country'] = key_value_convert(
            camp_overrides['Country'], valuefn=get_iso3)
        datasets = Dataset.search_in_hdx('displacement',
                                         fq='organization:unhcr')
        all_camps_per_country, unhcr_non_camp, unhcr_camp, unhcr_camp_excluded = \
            get_camp_non_camp_populations(constants['Non Camp Types'], constants['Camp Types'],
                                          camp_overrides, datasets, downloader)
        country_totals = copy.deepcopy(all_camps_per_country)

        world_bank_url = configuration['world_bank_url']
        urbanratios = get_worldbank_series(
            world_bank_url % configuration['urban_ratio_wb'], downloader)
        slumratios = get_slumratios(configuration['slum_ratio_url'],
                                    downloader)

        noncamp_elec_access = dict()
        noncamp_elec_access['Urban'] = get_worldbank_series(
            world_bank_url % configuration['urban_elec_wb'], downloader)
        noncamp_elec_access['Rural'] = get_worldbank_series(
            world_bank_url % configuration['rural_elec_wb'], downloader)
        noncamp_elec_access['Slum'] = avg_dicts(noncamp_elec_access['Rural'],
                                                noncamp_elec_access['Urban'])

        ieadata = downloader.download_tabular_cols_as_dicts(
            configuration['iea_data_url'])
        elecappliances = key_value_convert(ieadata['Electrical Appliances'],
                                           keyfn=get_iso3,
                                           valuefn=float,
                                           dropfailedkeys=True)
        cookinglpg = key_value_convert(ieadata['Cooking LPG'],
                                       keyfn=get_iso3,
                                       valuefn=float,
                                       dropfailedkeys=True)
        elecgridtiers = key_value_convert(
            downloader.download_tabular_key_value(
                configuration['elec_grid_tiers_url']),
            keyfn=int,
            valuefn=float)
        elecgriddirectenergy = float_value_convert(
            downloader.download_tabular_key_value(
                configuration['elec_grid_direct_energy_url']))
        elecgridco2 = key_value_convert(downloader.download_tabular_key_value(
            configuration['elec_grid_co2_url']),
                                        keyfn=get_iso3,
                                        valuefn=float,
                                        dropfailedkeys=True)

        def get_elecgridco2(iso, inf):
            elgridco2 = elecgridco2.get(iso)
            if elgridco2 is None:
                elgridco2, reg = model.calculate_regional_average(
                    'Grid CO2', elecgridco2, iso)
                inf.append('elco2(%s)=%.3g' % (reg, elgridco2))
            return elgridco2

        noncamptypes = downloader.download_tabular_cols_as_dicts(
            configuration['noncamp_types_url'])
        noncamplightingoffgridtypes = integer_value_convert(
            noncamptypes['Lighting OffGrid'])
        noncampcookingsolidtypes = integer_value_convert(
            noncamptypes['Cooking Solid'])

        camptypes = get_camptypes(configuration['camp_types_url'], downloader)
        camptypes_fallbacks_offgrid, camptypes_fallbacks_solid = \
            get_camptypes_fallbacks(configuration['camp_types_fallbacks_url'], downloader, keyfn=get_iso3)

        costs = downloader.download_tabular_cols_as_dicts(
            configuration['costs_url'])
        lightingoffgridcost = float_value_convert(costs['Lighting OffGrid'])
        cookingsolidcost = float_value_convert(costs['Cooking Solid'])

        noncamp_nonsolid_access = downloader.download_tabular_cols_as_dicts(
            configuration['noncamp_cooking_nonsolid_url'])
        noncamp_nonsolid_access['Urban'] = key_value_convert(
            noncamp_nonsolid_access['Urban'],
            keyfn=get_iso3,
            valuefn=float,
            dropfailedkeys=True)
        noncamp_nonsolid_access['Rural'] = key_value_convert(
            noncamp_nonsolid_access['Rural'],
            keyfn=get_iso3,
            valuefn=float,
            dropfailedkeys=True)
        noncamp_nonsolid_access['Slum'] = noncamp_nonsolid_access['Urban']

        small_camptypes = get_camptypes(configuration['small_camptypes_url'],
                                        downloader)
        small_camp_data = downloader.download_tabular_cols_as_dicts(
            configuration['small_camps_data_url'])
        smallcamps = float_value_convert(small_camp_data['Population'])
        small_camps_elecgridco2 = float_value_convert(
            small_camp_data['Electricity Grid CO2'])

        type_descriptions = downloader.download_tabular_cols_as_dicts(
            configuration['type_descriptions_url'])
        lighting_type_descriptions = type_descriptions['Lighting Descriptions']
        cooking_type_descriptions = type_descriptions['Cooking Descriptions']

    model = ChathamHouseModel(constants)
    pop_types = ['Urban', 'Slum', 'Rural', 'Camp', 'Small Camp']
    headers = list()
    results = list()

    for i, pop_type in enumerate(pop_types):
        results.append(list())
        if pop_type == 'Camp':
            headers.append(['ISO3 Country Code', 'Country Name', 'Camp Name'])
            hxlheaders = ['#country+code', '#country+name', '#loc+name']
        elif pop_type == 'Small Camp':
            headers.append(['Region'])
            hxlheaders = ['#region+name']
        else:
            headers.append(['ISO3 Country Code', 'Country Name'])
            hxlheaders = ['#country+code', '#country+name']
        headers[-1].extend(['Population', 'Tier'])
        hxlheaders.extend(['#population+num', '#indicator+tier'])
        if pop_type not in ['Camp', 'Small Camp']:
            headers[-1].extend(
                ['Grid Expenditure ($m/yr)', 'Grid CO2 Emissions (t/yr)'])
            hxlheaders.extend([
                '#indicator+value+grid+expenditure',
                '#indicator+value+grid+co2_emissions'
            ])
        headers[-1].extend([
            'Offgrid Type', 'Lighting Type Description',
            'Offgrid Expenditure ($m/yr)', 'Offgrid Capital Costs ($m)',
            'Offgrid CO2 Emissions (t/yr)'
        ])
        hxlheaders.extend([
            '#indicator+type+offgrid', '#indicator+text+lighting',
            '#indicator+value+offgrid+expenditure',
            '#indicator+value+offgrid+capital_costs',
            '#indicator+value+offgrid+co2_emissions'
        ])
        if pop_type not in ['Camp', 'Small Camp']:
            headers[-1].extend([
                'Nonsolid Expenditure ($m/yr)', 'Nonsolid CO2 Emissions (t/yr)'
            ])
            hxlheaders.extend([
                '#indicator+value+nonsolid+expenditure',
                '#indicator+value+nonsolid+co2_emissions'
            ])
        headers[-1].extend([
            'Solid Type', 'Cooking Type Description',
            'Solid Expenditure ($m/yr)', 'Solid Capital Costs ($m)',
            'Solid CO2_Emissions (t/yr)'
        ])
        hxlheaders.extend([
            '#indicator+type+solid', '#indicator+text+cooking',
            '#indicator+value+solid+expenditure',
            '#indicator+value+solid+capital_costs',
            '#indicator+value+solid+co2_emissions'
        ])
        if pop_type != 'Small Camp':
            headers[-1].append('Info')
            hxlheaders.append('#meta+info')

        results[i].append(hxlheaders)

    results.append(list())
    headers.append(['ISO3 Country Code', 'Country Name', 'Population'])
    hxlheaders = ['#country+code', '#country+name', '#population+num']
    results[len(results) - 1].append(hxlheaders)

    results.append(list())
    headers.append([
        'ISO3 Country Code', 'Country Name', 'Camp', 'Tier',
        'Cooking Spending', 'Cooking Description',
        'Population not using Biomass', 'Population using Biomass',
        'Lighting Spending', 'Lighting Description', 'Population on Grid',
        'Population off Grid'
    ])

    results.append(list())
    headers.append([
        'code', 'title', 'value', 'latest_date', 'source', 'source_link',
        'notes', 'explore', 'units'
    ])

    today = datetime.utcnow()

    for iso3 in sorted(unhcr_non_camp):
        info = list()
        population = model.sum_population(unhcr_non_camp, iso3,
                                          all_camps_per_country)
        number_hh_by_pop_type = model.calculate_population(
            iso3, population, urbanratios, slumratios, info)
        country_elecappliances = elecappliances.get(iso3)
        if country_elecappliances is None:
            country_elecappliances, region = \
                model.calculate_regional_average('Electrical Appliances', elecappliances, iso3)
            info.append('elap(%s)=%.3g' % (region, country_elecappliances))
        country_elecgridco2 = get_elecgridco2(iso3, info)
        country_cookinglpg = cookinglpg.get(iso3)
        if country_cookinglpg is None:
            country_cookinglpg, region = model.calculate_regional_average(
                'LPG', cookinglpg, iso3)
            info.append('lpg(%s)=%.3g' % (region, country_elecappliances))

        cn = Country.get_country_name_from_iso3(iso3)
        for pop_type in number_hh_by_pop_type:
            model.reset_pop_counters()
            info2 = copy.deepcopy(info)
            number_hh = number_hh_by_pop_type[pop_type]

            country_elec_access = noncamp_elec_access[pop_type].get(iso3)
            if country_elec_access is None:
                country_elec_access, region = \
                    model.calculate_regional_average('Grid access', noncamp_elec_access[pop_type], iso3)
                info2.append('elac(%s)=%.3g' %
                             (region, country_elecappliances))
            hh_grid_access, hh_offgrid = model.calculate_hh_access(
                number_hh, country_elec_access)
            pop_grid_access = model.calculate_population_from_hh(
                hh_grid_access)
            pop_offgrid_access = model.calculate_population_from_hh(hh_offgrid)
            model.pop_grid += pop_grid_access

            country_noncamp_nonsolid_access = noncamp_nonsolid_access[
                pop_type].get(iso3)
            if country_noncamp_nonsolid_access is None:
                country_noncamp_nonsolid_access, region = \
                    model.calculate_regional_average('Nonsolid access', noncamp_nonsolid_access[pop_type], iso3)
                info2.append('nsac(%s)=%.3g' %
                             (region, country_elecappliances))
            hh_nonsolid_access, hh_no_nonsolid_access = \
                model.calculate_hh_access(number_hh, country_noncamp_nonsolid_access)
            pop_biomass_access = model.calculate_population_from_hh(
                hh_no_nonsolid_access)
            pop_nonbiomass_access = model.calculate_population_from_hh(
                hh_nonsolid_access)
            model.pop_nonbiomass += pop_nonbiomass_access

            ge, gc = model.calculate_ongrid_lighting(hh_grid_access,
                                                     elecgridtiers,
                                                     country_elecappliances,
                                                     country_elecgridco2)
            ne, nc = model.calculate_non_solid_cooking(hh_nonsolid_access,
                                                       country_cookinglpg)

            for tier in model.tiers:
                info3 = copy.deepcopy(info2)
                noncamplightingoffgridtype = model.get_noncamp_type(
                    noncamplightingoffgridtypes, pop_type, tier)
                noncampcookingsolidtype = model.get_noncamp_type(
                    noncampcookingsolidtypes, pop_type, tier)

                res = model.calculate_offgrid_solid(
                    tier, hh_offgrid, lighting_type_descriptions,
                    noncamplightingoffgridtype, lightingoffgridcost,
                    elecgriddirectenergy, country_elecgridco2,
                    hh_no_nonsolid_access, cooking_type_descriptions,
                    noncampcookingsolidtype, cookingsolidcost)
                noncamplightingtypedesc, oe, oc, oco2, noncampcookingtypedesc, se, sc, sco2 = res
                model.add_keyfigures(iso3,
                                     cn,
                                     pop_type,
                                     tier,
                                     se,
                                     oe,
                                     noncampcookingtypedesc,
                                     pop_biomass_access,
                                     noncamplightingtypedesc,
                                     pop_offgrid_access,
                                     results,
                                     ne=ne,
                                     ge=ge)
                population = model.calculate_population_from_hh(number_hh)
                info3 = ','.join(info3)
                row = [
                    iso3, cn, population, tier, ge, gc,
                    noncamplightingoffgridtype, noncamplightingtypedesc, oe,
                    oc, oco2, ne, nc, noncampcookingsolidtype,
                    noncampcookingtypedesc, se, sc, sco2, info3
                ]
                results[pop_types.index(pop_type.capitalize())].append(row)

    camp_offgridtypes_in_countries = dict()
    camp_solidtypes_in_countries = dict()
    missing_from_unhcr = list()
    for name in sorted(camptypes):
        model.reset_pop_counters()
        info = list()
        unhcrcampname = name
        result = unhcr_camp.get(unhcrcampname)
        if result is None:
            firstpart = name.split(':')[0].strip()
            for unhcrcampname in sorted(unhcr_camp):
                if firstpart in unhcrcampname:
                    result = unhcr_camp[unhcrcampname]
                    logger.info(
                        'Matched first part of name of %s to UNHCR name: %s' %
                        (name, unhcrcampname))
                    info.append('Matched %s' % firstpart)
                    break
        if result is None:
            camptype = unhcr_camp_excluded.get(name)
            if camptype is None:
                if check_name_dispersed(name):
                    logger.info(
                        'Camp %s from the spreadsheet has been treated as non-camp!'
                        % name)
                else:
                    missing_from_unhcr.append(name)
            else:
                logger.info('Camp %s is in UNHCR data but has camp type %s!' %
                            (name, camptype))
            continue
        population, iso3, accommodation_type = result
        del all_camps_per_country[iso3][accommodation_type][unhcrcampname]

        camp_camptypes = camptypes[name]

        number_hh = model.calculate_number_hh(population)
        country_elecgridco2 = get_elecgridco2(iso3, info)

        for tier in model.tiers:
            info2 = copy.deepcopy(info)
            camplightingoffgridtype = camp_camptypes.get(
                'Lighting OffGrid %s' % tier)
            if camplightingoffgridtype is None:
                logger.warning('No Lighting OffGrid %s for %s in %s' %
                               (tier, name, cn))
            campcookingsolidtype = camp_camptypes.get('Cooking Solid %s' %
                                                      tier)
            if campcookingsolidtype is None:
                logger.warning('No Cooking Solid %s for %s in %s' %
                               (tier, name, cn))

            res = model.calculate_offgrid_solid(
                tier, number_hh, lighting_type_descriptions,
                camplightingoffgridtype, lightingoffgridcost,
                elecgriddirectenergy, country_elecgridco2, number_hh,
                cooking_type_descriptions, campcookingsolidtype,
                cookingsolidcost)
            camplightingtypedesc, oe, oc, oco2, campcookingtypedesc, se, sc, sco2 = res
            cn = Country.get_country_name_from_iso3(iso3)
            model.add_keyfigures(iso3, cn, name, tier, se, oe,
                                 campcookingtypedesc, population,
                                 camplightingtypedesc, population, results)
            info2 = ','.join(info2)
            row = [
                iso3, cn, name, population, tier, camplightingoffgridtype,
                camplightingtypedesc, oe, oc, oco2, campcookingsolidtype,
                campcookingtypedesc, se, sc, sco2, info2
            ]
            results[pop_types.index('Camp')].append(row)
            if camplightingoffgridtype:
                append_value(camp_offgridtypes_in_countries, iso3, tier, name,
                             camplightingoffgridtype)
            if campcookingsolidtype:
                append_value(camp_solidtypes_in_countries, iso3, tier, name,
                             campcookingsolidtype)

    logger.info(
        'The following camps are in the spreadsheet but not in the UNHCR data : %s'
        % ', '.join(missing_from_unhcr))

    for iso3 in sorted(country_totals):
        info = list()
        population = model.sum_population(country_totals, iso3)
        cn = Country.get_country_name_from_iso3(iso3)
        row = [iso3, cn, population]
        results[len(results) - 3].append(row)

        extra_camp_types = all_camps_per_country[iso3]

        country_elecgridco2 = get_elecgridco2(iso3, info)

        for accommodation_type in sorted(extra_camp_types):
            camps = extra_camp_types[accommodation_type]
            for name in sorted(camps):
                model.reset_pop_counters()
                info2 = copy.deepcopy(info)
                population = camps[name]
                if population < 20000:
                    logger.info(
                        'Ignoring extra camp %s from UNHCR data with population %s (<20000) and accommodation type %s in country %s.'
                        % (name, population, accommodation_type, cn))
                    continue
                number_hh = model.calculate_number_hh(population)
                offgrid_tiers_in_country = camp_offgridtypes_in_countries.get(
                    iso3)
                if offgrid_tiers_in_country is None:
                    offgrid_tiers_in_country = camptypes_fallbacks_offgrid.get(
                        iso3)
                    if not offgrid_tiers_in_country:
                        logger.warning(
                            'Missing fallback for country %s, where UNHCR data has extra camp %s with population %s and accommodation type %s'
                            % (cn, name, population, accommodation_type))
                        continue
                info2.append('UNHCR only')
                for tier in offgrid_tiers_in_country:
                    info3 = copy.deepcopy(info2)
                    camplightingoffgridtype = offgrid_tiers_in_country[tier]
                    if isinstance(camplightingoffgridtype, int):
                        campcookingsolidtype = camptypes_fallbacks_solid[iso3][
                            tier]
                        info3.append('Fallback')
                    else:
                        camplightingoffgridtype = model.calculate_mostfrequent(
                            offgrid_tiers_in_country[tier])
                        campcookingsolidtype = model.calculate_mostfrequent(
                            camp_solidtypes_in_countries[iso3][tier])

                    res = model.calculate_offgrid_solid(
                        tier, number_hh, lighting_type_descriptions,
                        camplightingoffgridtype, lightingoffgridcost,
                        elecgriddirectenergy, country_elecgridco2, number_hh,
                        cooking_type_descriptions, campcookingsolidtype,
                        cookingsolidcost)
                    camplightingtypedesc, oe, oc, oco2, campcookingtypedesc, se, sc, sco2 = res
                    model.add_keyfigures(iso3, cn, name, tier, se, oe,
                                         campcookingtypedesc, population,
                                         camplightingtypedesc, population,
                                         results)
                    info3 = ','.join(info3)
                    row = [
                        iso3, cn, name, population, tier,
                        camplightingoffgridtype, camplightingtypedesc, oe, oc,
                        oco2, campcookingsolidtype, campcookingtypedesc, se,
                        sc, sco2, info3
                    ]
                    results[pop_types.index('Camp')].append(row)

    for region in sorted(smallcamps):
        model.reset_pop_counters()
        info = list()
        population = smallcamps[region]
        if not population or population == '-':
            continue
        number_hh = model.calculate_number_hh(population)
        region_camptypes = small_camptypes.get(region)
        if region_camptypes is None:
            logger.info('Missing camp group %s in small camp types!' % region)
            continue

        elecco2 = small_camps_elecgridco2[region]
        if not elecco2 or elecco2 == '-':
            info.append('Blank elco2')
            elecco2 = 0

        for tier in model.tiers:
            info2 = copy.deepcopy(info)
            camplightingoffgridtype = region_camptypes['Lighting OffGrid %s' %
                                                       tier]
            campcookingsolidtype = region_camptypes['Cooking Solid %s' % tier]

            res = model.calculate_offgrid_solid(
                tier, number_hh, lighting_type_descriptions,
                camplightingoffgridtype, lightingoffgridcost,
                elecgriddirectenergy, elecco2, number_hh,
                cooking_type_descriptions, campcookingsolidtype,
                cookingsolidcost)
            camplightingtypedesc, oe, oc, oco2, campcookingtypedesc, se, sc, sco2 = res
            model.add_keyfigures('', region, 'small camp', tier, se, oe,
                                 campcookingtypedesc, population,
                                 camplightingtypedesc, population, results)
            info2 = ','.join(info2)
            row = [
                region,
                model.round(population), tier, camplightingoffgridtype,
                camplightingtypedesc, oe, oc, oco2, campcookingsolidtype,
                campcookingtypedesc, se, sc, sco2, info2
            ]
            results[pop_types.index('Small Camp')].append(row)

    date = today.date().isoformat()
    source = 'Estimate from the Moving Energy Initiative'
    data_url = 'https://data.humdata.org/dataset/energy-consumption-of-refugees-and-displaced-people'
    rows = [
        [
            'MEI01',
            '% of Refugees and Displaced People Cooking with Biomass in Camps',
            model.get_camp_percentage_biomass(), date, source, data_url, '',
            '', 'ratio'
        ],
        [
            'MEI02', '% of Refugees and Displaced People Off-Grid in Camps',
            model.get_camp_percentage_offgrid(), date, source, data_url, '',
            '', 'ratio'
        ],
        [
            'MEI03',
            'Total Annual Energy Spending by Refugees and Displaced People',
            model.get_total_spending(), date, source, data_url, '', '',
            'dollars_million'
        ],
        [
            'MEI04', 'No. of Countries Hosting Refugees and Displaced People',
            len(country_totals), date, source, data_url, '', '', 'count'
        ]
    ]
    results[len(results) - 1].extend(rows)

    dataset, resources, showcase = generate_dataset_resources_and_showcase(
        pop_types, today)
    folder = gettempdir()
    file_to_upload = None
    for i, _ in enumerate(results):
        resource = resources[i]
        file_to_upload = join(folder, resource['name'])
        write_list_to_csv(results[i], file_to_upload, headers=headers[i])
        resource.set_file_to_upload(file_to_upload)
    dataset.add_update_resources(resources)
    dataset.update_from_yaml()
    #    dataset.create_in_hdx()
    for resource in dataset.get_resources():
        name = resource['name'].lower()
        if 'figures' in name and 'disagg' not in name:
            logger.info('Updating key figures datastore for %s' % name)