Beispiel #1
0
def predict_cars_emissions(datasets, variables):
    target_year = variables['target_year']

    mileage_per_engine_type = datasets['mileage_per_engine_type']
    mileage_share_per_engine_type = mileage_per_engine_type.set_index(
        ['Vehicle', 'Engine']).drop(columns='Sum')

    df = prepare_transportation_emissions_dataset()
    df = df.loc[df.Vehicle == 'Cars',
                ['Year', 'CO2e', 'Road']].set_index('Year')
    emissions_df = df.pivot(values='CO2e', columns='Road')

    df = predict_cars_mileage()
    for road in ('Highways', 'Urban'):
        df[road + 'Emissions'] = emissions_df[road] / 1000  # -> kt

    car_unit_emissions = datasets['car_unit_emissions'].set_index(
        ['Engine', 'Road'])
    elec_df = predict_electricity_emission_factor()
    share_df = predict_cars_in_use_by_engine_type()

    last_hist_year = df[~df.Forecast].index.max()

    # Estimate mileage ratio shares between engine types
    share = estimate_mileage_ratios(share_df)

    # Estimate emissions per km per engine type
    unit_df = car_unit_emissions.reset_index()

    unit_df = unit_df.groupby(['Road', 'Engine',
                               'Class']).mean()['CO2e'].unstack('Class')
    unit_df['Year'] = last_hist_year
    elec_df = elec_df.loc[elec_df.index >= last_hist_year]
    unit_df = estimate_bev_unit_emissions(unit_df, elec_df['EmissionFactor'])

    df = calculate_co2e_per_engine_type(df, share, unit_df)
    engine_shares = share.sum(axis=1).unstack('Engine')
    for engine_type in ('gasoline', 'diesel', 'electric', 'PHEV (gasoline)'):
        df[engine_type] = engine_shares[engine_type]

    df['Emissions'] = (df['HighwaysEmissions'] + df['UrbanEmissions'])
    df['EmissionFactor'] = df['Emissions'] / (
        df['Urban'] + df['Highways']) * 1000000000  # g/km

    return df
Beispiel #2
0
def solar_power_callback(existing_building_perc, new_building_perc):
    # First see what the maximum solar production capacity is to set the
    # Y axis maximum.
    set_variable('solar_power_existing_buildings_percentage', 100)
    set_variable('solar_power_new_buildings_percentage', 100)
    kwp_max = predict_solar_power_production()

    # Then predict with the given percentages.
    set_variable('solar_power_existing_buildings_percentage',
                 existing_building_perc)
    set_variable('solar_power_new_buildings_percentage', new_building_perc)
    kwp_df = predict_solar_power_production()

    ymax = kwp_max.SolarPowerExisting.iloc[-1]
    fig_old = generate_solar_power_graph(kwp_df, "Vanhan",
                                         "SolarPowerExisting", ymax, True)
    # ymax = kwp_max.SolarPowerNew.iloc[-1]
    fig_new = generate_solar_power_graph(kwp_df, "Uuden", "SolarPowerNew",
                                         ymax, False)
    fig_tot, ekwpa, nkwpa = generate_solar_power_stacked(kwp_df)

    graph = PredictionFigure(sector_name='ElectricityConsumption',
                             unit_name='kt',
                             title='Aurinkopaneelien päästövaikutukset',
                             fill=True)
    ef_df = predict_electricity_emission_factor()
    kwp_df['NetEmissions'] = -kwp_df['SolarProduction'] * ef_df[
        'EmissionFactor'] / 1000
    graph.add_series(df=kwp_df,
                     column_name='NetEmissions',
                     trace_name='Päästövaikutukset')
    fig_emissions = graph.get_figure()

    s = kwp_df.SolarProduction

    cd = CardDescription()

    city_owned = get_variable('building_area_owned_by_org') / 100
    cd.set_values(existing_building_perc=existing_building_perc,
                  org_existing_building_kwp=1000 * ekwpa * city_owned,
                  others_existing_building_kwp=1000 * ekwpa * (1 - city_owned))

    existing_kwpa = cd.render("""
    Kun aurinkopaneeleita rakennetaan {existing_building_perc:noround} % kaikesta vanhan
    rakennuskannan kattopotentiaalista, {org_genitive} tulee rakentaa aurinkopaneeleita
    {org_existing_building_kwp} kWp vuodessa skenaarion toteutumiseksi. Muiden kuin {org_genitive}
    tulee rakentaa {others_existing_building_kwp} kWp aurinkopaneeleita vuodessa.
    """)

    cd.set_values(new_building_perc=new_building_perc,
                  org_new_building_kwp=1000 * nkwpa * city_owned,
                  others_new_building_kwp=1000 * nkwpa * (1 - city_owned))
    new_kwpa = cd.render("""
    Kun uuteen rakennuskantaan rakennetaan aurinkopaneeleja {new_building_perc:noround} %
    kaikesta kattopotentiaalista, {org_genitive} tulee rakentaa aurinkopaneeleja
    {org_new_building_kwp} kWp vuodessa skenaarion toteutumiseksi. Muiden kuin {org_genitive}
    tulee rakentaa {others_new_building_kwp} kWp aurinkopaneeleita vuodessa.
    """)

    forecast = s.iloc[-1] * get_variable('yearly_pv_energy_production_kwh_wp')

    sticky = StickyBar(
        label='Aurinkosähkön tuotanto',
        value=forecast,
        unit='GWh',
        current_page=page,
    )

    return [
        fig_old, fig_new, fig_tot, fig_emissions, existing_kwpa, new_kwpa,
        sticky.render()
    ]
    def refresh_graph_cards(self):
        # First see what the maximum solar production capacity is to set the
        # Y axis maximum.
        set_variable('solar_power_existing_buildings_percentage', 100)
        set_variable('solar_power_new_buildings_percentage', 100)
        kwp_max_df = predict_solar_power_production()

        # Then predict with the given percentages.
        existing_card = self.get_card('existing-buildings')
        set_variable('solar_power_existing_buildings_percentage', existing_card.get_slider_value())

        future_card = self.get_card('new-buildings')
        set_variable('solar_power_new_buildings_percentage', future_card.get_slider_value())

        df = predict_solar_power_production()

        forecast_df = df[df.Forecast]
        hist_df = df[~df.Forecast]
        years_left = forecast_df.index.max() - hist_df.index.max()
        ekwpa = (forecast_df.SolarPowerExisting.iloc[-1] - hist_df.SolarPowerExisting.iloc[-1]) / years_left
        nkwpa = forecast_df.SolarPowerNew.iloc[-1] / years_left

        cd = CardDescription()
        city_owned = get_variable('building_area_owned_by_org') / 100
        cd.set_values(
            existing_building_perc=existing_card.get_slider_value(),
            org_existing_building_kwp=1000 * ekwpa * city_owned,
            others_existing_building_kwp=1000 * ekwpa * (1 - city_owned)
        )
        existing_card.set_description(cd.render("""
        Kun aurinkopaneeleita rakennetaan {existing_building_perc:noround} % kaikesta vanhan
        rakennuskannan kattopotentiaalista, {org_genitive} tulee rakentaa aurinkopaneeleita
        {org_existing_building_kwp} kWp vuodessa skenaarion toteutumiseksi. Muiden kuin {org_genitive}
        tulee rakentaa {others_existing_building_kwp} kWp aurinkopaneeleita vuodessa.
        """))

        cd.set_values(
            new_building_perc=future_card.get_slider_value(),
            org_new_building_kwp=1000 * nkwpa * city_owned,
            others_new_building_kwp=1000 * nkwpa * (1 - city_owned)
        )
        future_card.set_description(cd.render("""
        Kun uuteen rakennuskantaan rakennetaan aurinkopaneeleja {new_building_perc:noround} %
        kaikesta kattopotentiaalista, {org_genitive} tulee rakentaa aurinkopaneeleja
        {org_new_building_kwp} kWp vuodessa skenaarion toteutumiseksi. Muiden kuin {org_genitive}
        tulee rakentaa {others_new_building_kwp} kWp aurinkopaneeleita vuodessa.
        """))

        ymax = kwp_max_df.SolarPowerExisting.iloc[-1]
        fig = PredictionFigure(
            sector_name='ElectricityConsumption', unit_name='MWp',
            y_max=ymax, color_scale=2
        )
        fig.add_series(df=df, trace_name=_('Peak power'), column_name='SolarPowerExisting', color_idx=0)
        existing_card.set_figure(fig)

        fig = PredictionFigure(
            sector_name='ElectricityConsumption', unit_name='MWp',
            y_max=ymax, color_scale=2
        )
        fig.add_series(df=df, trace_name=_('Peak power'), column_name='SolarPowerNew', color_idx=1)
        future_card.set_figure(fig)

        pv_kwh_wp = get_variable('yearly_pv_energy_production_kwh_wp')
        df.SolarPowerNew = df.SolarPowerNew * pv_kwh_wp
        df.SolarPowerExisting = df.SolarPowerExisting * pv_kwh_wp
        df.loc[~df.Forecast, 'SolarPowerNew'] = np.nan

        card = self.get_card('production')
        fig = PredictionFigure(
            sector_name='ElectricityConsumption', unit_name='GWh',
            stacked=True, fill=True, color_scale=2
        )
        fig.add_series(df=df, trace_name=_('Existing buildings'), column_name='SolarPowerExisting', color_idx=0)
        fig.add_series(df=df, trace_name=_('Future buildings'), column_name='SolarPowerNew', color_idx=1)
        card.set_figure(fig)

        card = self.get_card('emission-impact')
        fig = PredictionFigure(
            sector_name='ElectricityConsumption', unit_name='kt',
            fill=True
        )
        ef_df = predict_electricity_emission_factor()
        df['NetEmissions'] = -df['SolarProduction'] * ef_df['EmissionFactor'] / 1000
        fig.add_series(df=df, column_name='NetEmissions', trace_name=_('Emissions'))
        card.set_figure(fig)

        s = df.SolarProduction
        self.solar_production_forecast = s.iloc[-1] * get_variable('yearly_pv_energy_production_kwh_wp')
Beispiel #4
0
    def refresh_graph_cards(self):
        ecard = self.get_card('renovated-per-year')
        self.set_variable('geothermal_existing_building_renovation',
                          ecard.get_slider_value() / 10)
        ncard = self.get_card('new-building-installation')
        self.set_variable('geothermal_new_building_installation_share',
                          ncard.get_slider_value())

        df = predict_geothermal_production()
        print(df)

        fig = PredictionFigure(
            sector_name='BuildingHeating',
            unit_name='milj. k-m²',
            smoothing=True,
            y_max=25,
        )
        fig.add_series(
            df=df,
            column_name='GeoBuildingNetAreaExisting',
            trace_name='Kerrosala',
        )
        ecard.set_figure(fig)

        org_owned = self.get_variable('building_area_owned_by_org') / 100
        cd = CardDescription()

        first_forecast = df[df.Forecast].iloc[0]
        last_forecast = df.iloc[-1]
        last_hist_year = df[~df.Forecast].index.max()
        last_forecast_year = df[df.Forecast].index.max()

        cd.set_values(
            existing_building_perc=self.get_variable(
                'geothermal_existing_building_renovation'),
            existing_building_area=last_forecast.GeoBuildingNetAreaExisting,
            boreholes_org=first_forecast.BoreholesPerYear * org_owned,
            boreholes_others=first_forecast.BoreholesPerYear * (1 - org_owned),
            borehole_area=last_forecast.BoreholeAreaNeeded,
            borehole_depth=self.get_variable('geothermal_borehole_depth'),
            new_building_perc=self.get_variable(
                'geothermal_new_building_installation_share'),
            new_building_area=last_forecast.GeoBuildingNetAreaNew,
            geothermal_production=last_forecast.GeoEnergyProduction,
            perc_dh=last_forecast.GeoEnergyProduction)
        ecard.set_description(
            cd.render("""
        Kun olemassaolevasta rakennuskannasta remontoidaan {existing_building_perc:noround} %
        joka vuosi ja vaihdetaan lämmitystavaksi maalämpö, vuonna {target_year} maalämmöllä
        lämmitetään {existing_building_area} milj. kerrosneliömetriä. Skenaarion toteutumiseksi
        {org_genitive} pitää rakentaa ensi vuonna {boreholes_org} maalämpökaivoa, kun oletetaan kaivon
        syvyydeksi {borehole_depth} m. Muiden pitää rakentaa ensi vuonna {boreholes_others} kaivoa.
        """))

        ncard.set_description(
            cd.render("""
        Kun uudesta rakennuskannasta {new_building_perc:noround} % rakennetaan maalämmöllä,
        vuonna {target_year} lämmitetään maalämmöllä {new_building_area} milj. kerrosneliömetriä.
        |p|Vanhan ja uuden rakennuskannan maalämpökaivot tarvitsevat silloin yhteensä {borehole_area} km²
        pinta-alaa.
        """))
        fig = PredictionFigure(
            sector_name='BuildingHeating',
            unit_name='milj. k-m²',
            smoothing=True,
            y_max=10,
        )
        fig.add_series(
            df=df,
            column_name='GeoBuildingNetAreaNew',
            trace_name='Kerrosala',
        )
        ncard.set_figure(fig)

        card = self.get_card('geothermal-production')
        fig = PredictionFigure(
            sector_name='BuildingHeating',
            unit_name='GWh',
            smoothing=True,
            fill=True,
            stacked=True,
            color_scale=2,
        )
        fig.add_series(
            df=df,
            column_name='GeoEnergyProductionExisting',
            trace_name='Vanha rakennuskanta',
            color_idx=0,
        )
        fig.add_series(
            df=df,
            column_name='GeoEnergyProductionNew',
            trace_name='Uusi rakennuskanta',
            color_idx=1,
        )
        card.set_figure(fig)
        card.set_description(
            cd.render("""
            Vuonna {target_year} maalämpöpumpuilla tuotetaan {geothermal_production} GWh lämpöä.
            Skenaariossa se käytetään korvaamaan kaukolämpöä.
        """))

        # District heat
        dhdf = predict_district_heating_emissions()
        card = self.get_card('district-heat-emission-factor')
        fig = PredictionFigure(
            sector_name='BuildingHeating',
            unit_name='g/kWh',
            smoothing=True,
        )
        fig.add_series(df=dhdf,
                       column_name='Emission factor',
                       trace_name=_('Emission factor'))
        card.set_figure(fig)
        last_dhdf_hist_year = dhdf[~dhdf.Forecast].index.max()
        dhef_target = dhdf.loc[last_forecast_year, 'Emission factor']
        dhef_hist = dhdf.loc[last_dhdf_hist_year, 'Emission factor']
        cd.set_values(dh_emission_factor_target=dhef_target,
                      dh_emission_factor_hist=dhef_hist,
                      perc_change=((dhef_target / dhef_hist) - 1) * 100)
        cd.set_variables(last_dhdf_hist_year=last_dhdf_hist_year, )
        card.set_description(
            cd.render("""
            Skenaariossa paikallisella maalämmöllä korvataan pelkästään kaukolämpöä.
            Vuonna {target_year} kaukolämmöntuotannon päästökerroin on {dh_emission_factor_target}
            g/km. Muutos vuoteen {last_dhdf_hist_year} on {perc_change} %.
        """))

        # Electricity
        edf = predict_electricity_emission_factor()
        card = self.get_card('electricity-emission-factor')
        fig = PredictionFigure(
            sector_name='ElectricityConsumption',
            unit_name='g/kWh',
            smoothing=True,
        )
        fig.add_series(
            df=edf,
            column_name='EmissionFactor',
            trace_name=_('Emission factor'),
        )
        card.set_figure(fig)
        cd.set_values(
            heat_pump_el=last_forecast.ElectricityUse,
            elef=edf.loc[last_forecast_year].EmissionFactor,
        )
        card.set_description(
            cd.render("""
            Vuonna {target_year} maalämpöpumput käyttävät sähköä {heat_pump_el} GWh.
            Sähkönkulutuksesta aiheutuvat päästöt määräytyvät sähkönhankinnan päästökertoimen
            mukaan ({elef} g/kWh vuonna {target_year}).
        """))

        card = self.get_card('emissions')
        fig = PredictionFigure(
            sector_name='BuildingHeating',
            unit_name='kt',
            smoothing=True,
            fill=True,
        )
        fig.add_series(
            df=df,
            column_name='NetEmissions',
            trace_name=_('Emissions'),
        )
        card.set_figure(fig)
Beispiel #5
0
def solar_power_callback(existing_building_perc, new_building_perc):
    # First see what the maximum solar production capacity is to set the
    # Y axis maximum.
    set_variable('solar_power_existing_buildings_percentage', 100)
    set_variable('solar_power_new_buildings_percentage', 100)
    kwp_max = predict_solar_power_production()

    # Then predict with the given percentages.
    set_variable('solar_power_existing_buildings_percentage',
                 existing_building_perc)
    set_variable('solar_power_new_buildings_percentage', new_building_perc)
    kwp_df = predict_solar_power_production()

    ymax = kwp_max.SolarPowerExisting.iloc[-1]
    fig_old = generate_solar_power_graph(kwp_df, "Vanhan",
                                         "SolarPowerExisting", ymax, True)
    ymax = kwp_max.SolarPowerNew.iloc[-1]
    fig_new = generate_solar_power_graph(kwp_df, "Uuden", "SolarPowerNew",
                                         ymax, False)
    fig_tot, ekwpa, nkwpa = generate_solar_power_stacked(kwp_df)

    ef_df = predict_electricity_emission_factor()
    kwp_df['EmissionReductions'] = ef_df['EmissionFactor'] * kwp_df[
        'SolarPowerAll'] / 1000
    graph = PredictionGraph(
        sector_name='ElectricityConsumption',
        unit_name='kt',
        title='Aurinkopaneelien päästövähennykset',
    )
    graph.add_series(kwp_df,
                     trace_name='Päästövähennykset',
                     column_name='EmissionReductions')
    fig_emissions = graph.get_figure()

    s = kwp_df.SolarPowerAll
    forecast = s.iloc[-1] * get_variable('yearly_pv_energy_production_kwh_wp')

    existing_kwpa = html.Div([
        html.Span("Kun aurinkopaneeleita rakennetaan "),
        html.Span('%d %%' % existing_building_perc,
                  className='summary-card__value'),
        html.Span(
            " kaikesta vanhan rakennuskannan kattopotentiaalista, Helsingin kaupunkikonsernin tulee rakentaa aurinkopaneeleja "
        ),
        html.Span("%d kWp" % (1000 * ekwpa * CITY_OWNED / 100),
                  className='summary-card__value'),
        html.Span(
            " vuodessa skenaarion toteutumiseksi. Muiden kuin Helsingin kaupungin tulee rakentaa "
        ),
        html.Span("%d kWp" % (1000 * ekwpa * (100 - CITY_OWNED) / 100),
                  className='summary-card__value'),
        html.Span(" vuodessa."),
    ])

    new_kwpa = html.Div([
        html.Span("Kun uuteen rakennuskantaan rakennetaan aurinkopaneeleja "),
        html.Span('%d %%' % new_building_perc,
                  className='summary-card__value'),
        html.Span(
            " kaikesta kattopotentiaalista, Helsingin kaupunkikonsernin tulee rakentaa aurinkopaneeleja "
        ),
        html.Span("%d kWp" % (1000 * nkwpa * CITY_OWNED / 100),
                  className='summary-card__value'),
        html.Span(
            " vuodessa skenaarion toteutumiseksi. Muiden kuin Helsingin kaupungin tulee rakentaa "
        ),
        html.Span("%d kWp" % (1000 * nkwpa * (100 - CITY_OWNED) / 100),
                  className='summary-card__value'),
        html.Span(" vuodessa."),
    ])

    sticky = StickyBar(
        label='Aurinkosähkön tuotanto',
        value=forecast,
        goal=SOLAR_POWER_GOAL,
        unit='GWh',
        current_page=page,
        below_goal_good=False,
    )

    return [
        fig_old, fig_new, fig_tot, fig_emissions, existing_kwpa, new_kwpa,
        sticky.render()
    ]