prereise.gather.demanddata.bldg_electrification package¶
Subpackages¶
Submodules¶
prereise.gather.demanddata.bldg_electrification.const module¶
prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_cook module¶
- prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_cook.generate_cook_profiles(yr_temps=2019, states=None, bldg_class='res', efficiency='high')[source]¶
This script returns hourly electricity loads from converting fossil fuel cooking to electric cooking
- Parameters:
yr_temps (int) – year for temperature, defaults to
const.base_year
.states (list) – list of states to loop through, defaults to None, in which case
const.state_list
is used.bldg_class (str) – type of building. Default is residential.
efficiency (str) – efficiency of cooking. Default is high.
- Raises:
TypeError – if
yr_temps
is not an int. ifbldg_class
andefficiency
are not str.ValueError – if
bldg_class
is not ‘res’ or ‘com’ ifefficiency
is not ‘high’ or ‘low’
prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_dhw module¶
- prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_dhw.func_dhw_cop(temp_c, model)[source]¶
Generate COPs for input hourly temperatures with a given heat pump model :param list temp_c: hourly temperatures :param str model : type of heat pump :return list cop: Coefficient of performance list
- prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_dhw.generate_dhw_profiles(yr_temps=2019, states=None, bldg_class='res', hp_model='advperfhp')[source]¶
Create time series for electricity loads from converting fossil fuel water heating to heat pump water heaters
- Parameters:
yr_temps (int) – year for temperature, defaults to
const.base_year
.states (list) – list of states to loop through, defaults to None, in which case
const.state_list
is used.bldg_class (str) – type of building. Default is residential.
hp_model (str) – type of heat pump. Default is advanced performance cold climate heat pump.
- Raises:
TypeError – if
yr_temps
is not an int. ifbldg_class
andhp_model
are not str.ValueError – if
bldg_class
is not ‘res’ or ‘com’ ifhp_model
is not ‘advperfhp’, ‘midperfhp’ or ‘futurehp’
prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_htg module¶
- prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_htg.calculate_cop(temp_c, model)[source]¶
- prereise.gather.demanddata.bldg_electrification.ff2elec_profile_generator_htg.generate_htg_profiles(yr_temps=2019, states=None, bldg_class='res', hp_model='advperfhp', output_folder='Profiles')[source]¶
Generate and write profiles on dist. Create time series for electricity loads from converting fossil fuel heating to electric heat pumps.
- Parameters:
yr_temps (int) – year for temperature, defaults to
const.base_year
.states (list) – list of states to loop through, defaults to None, in which case
const.state_list
is used.bldg_class (str) – type of building.
hp_model (str) – type of heat pump.
output_folder (str) – location to store profiles (will be created if necessary).
- Raises:
TypeError – if
yr_temps
is not an int. ifbldg_class
andhp_model
are not str.ValueError – if
yr_temps
is not one of the available temperature data year ifbldg_class
is not ‘res’ or ‘com’ ifhp_model
is not ‘advperfhp’, ‘midperfhp’ or ‘futurehp’
prereise.gather.demanddata.bldg_electrification.ff_model module¶
- prereise.gather.demanddata.bldg_electrification.ff_model.adjust_puma_slopes(puma_data, state_slopes_res, state_slopes_com, year=2019)[source]¶
Create per-puma slopes from per-state slopes.
- Parameters:
puma_data (pandas.DataFrame) – puma data.
state_slopes_res (pandas.DataFrame) – residential state slopes.
state_slopes_com (pandas.DataFrame) – commercial state slopes.
year (int) – year of temperatures to download.
- Returns:
(tuple) – a pair of pandas.DataFrame objects for per-puma residential and commercial slopes, respectively.
- prereise.gather.demanddata.bldg_electrification.ff_model.calculate_r2(endogenous, residuals)[source]¶
Calculate r2 value of fit.
- Parameters:
endogenous (iterable) – vector of observations of endogenous variable.
residuals (iterable) – vector of residuals between modeled fit and observations.
- Returns:
(float) – r-squared value of fit.
- prereise.gather.demanddata.bldg_electrification.ff_model.calculate_state_slopes(puma_data, year=2019)[source]¶
Estimate regression parameters per-state for residential and commercial fuel use.
- Parameters:
puma_data (pandas.DataFrame) – data frame of per-puma data.
year (int/str) – year of data to use for analysis.
- Returns:
(tuple) – a pair of pandas.DataFrame objects for per-state residential and commercial slopes, respectively.
prereise.gather.demanddata.bldg_electrification.floor_area_avg_slopes module¶
- prereise.gather.demanddata.bldg_electrification.floor_area_avg_slopes.get_zone_floor_area(iso, zone_shape, pumas_shp)[source]¶
Computes the zone floor area for each ISO.
- Parameters:
iso (str) – abbrev. name of ISO.
zone_shape (geopandas.GeoDataFrame) – geo data frame of zone(BA) shape file
pumas_shp (geopandas.GeoDataFrame) – geo data frame of pumas shape file
- Returns:
(pandas.DataFrame) – Floor area in square meters for all the zones with breakdowns of residential, commercial, total heated and total cooled
Note
zone floor area in square meters saved as csv into Profiles/result_stats
- prereise.gather.demanddata.bldg_electrification.floor_area_avg_slopes.main_plots(iso, zone_shape, pumas_shp, state_shp, country_shp, size, plot_show=True)[source]¶
Creats floor area avraged slopes for all zones within the ISO for one year.
- Parameters:
iso (str) – abbrev. name of ISO.
zone_shape (geopandas.GeoDataFrame) – geo data frame of zone(BA) shape file
pumas_shp (geopandas.GeoDataFrame) – geo data frame of pumas shape file
state_shp (geopandas.GeoDataFrame) – geo data frame of state shape file
country_shp (geopandas.GeoDataFrame) – geo data frame of nation shape file
plot_show (bool) – show the plot or not, default to True.
size (int) – defining the image size of plots in dpi.
Note
Floor area avg. heating and cooling slope, error and map plots for all zones in each ISO saved as png and csv into Profiles/result_stats/hourly_plots
prereise.gather.demanddata.bldg_electrification.helper module¶
- prereise.gather.demanddata.bldg_electrification.helper.read_shapefile(url)[source]¶
Read shape files for overlay
- Parameters:
url (str) – directory in blob storage that contain the shape file in zip format
- Returns:
(geopandas.GeoDataFrame) – geo data frame of the shape file
- prereise.gather.demanddata.bldg_electrification.helper.state_shp_overlay(state, state_shp, zone_shp)[source]¶
Select load zones within a state
- Parameters:
state (str) – abbrev. of state
state_shp (geopandas.GeoDataFrame) – geo data frame of state shape file
zone_shp (geopandas.GeoDataFrame) – geo data frame of zone(BA) shape file
- Returns:
(geopandas.GeoDataFrame) – state boundaries and load zones within it
- prereise.gather.demanddata.bldg_electrification.helper.zone_shp_overlay(zone_name_shp, zone_shp, pumas_shp)[source]¶
Select pumas within a zonal load area
- Parameters:
zone_name_shp (str) – name of the zone in ba_area.shp
zone_shp (geopandas.GeoDataFrame) – geo data frame of zone(BA) shape file
pumas_shp (geopandas.GeoDataFrame) – geo data frame of pumas shape file
- Returns:
(pandas.DataFrame) – puma data of all pumas within the zone, including fraction within the zone
prereise.gather.demanddata.bldg_electrification.load_projection module¶
- prereise.gather.demanddata.bldg_electrification.load_projection.ff_electrify_profiles(weather_years, puma_data, base_scen, new_scen, new_hp_profile)[source]¶
Calculate hourly electricity loads for a projection scenario from converting fossil fuel heating, dhw and cooking to electric ones
- Parameters:
weather_years (list) – user defined year(s) of weather profile for load projection
puma_data (pandas.DataFrame) – puma data within zone, output of
zone_shp_overlay()
base_scen (LoadProjectionScenario) – reference scenario instance
new_scen (LoadProjectionScenario) – projection scenario instance
new_hp_profile (str) – either “elec” or “ff”. Choose either current electric heat pump heating demand profiles or current fossil fuel heating demand that the projected newly electrified load will follow.
- :return (pandas.DataFrame) – hourly projection load from converting fossil fuel
consumption to electricity for projection scenarios given weather conditions from selected weather years.
- prereise.gather.demanddata.bldg_electrification.load_projection.predict_scenario(zone_name, zone_name_shp, base_scen, new_scens, weather_years, new_hp_profile)[source]¶
Load projection for one zone in all selected weather years.
- Parameters:
zone_name (str) – name of load zone used to save profile.
zone_name_shp (str) – name of load zone within shapefile.
base_scen (LoadProjectionScenario) – reference scenario instance
new_scen (LoadProjectionScenario) – projection scenario instance
weather_years (list) – user defined year(s) of weather profile for load projection
new_hp_profile (str) – either “elec” or “ff”. Choose either current electric heat pump heating demand profiles or current fossil fuel heating demand that the projected newly electrified load will follow.
- :return (dict) – hourly projected load breakdowns for all scenarios, keys are
scenario names, values are data frames of load breakdowns.
- prereise.gather.demanddata.bldg_electrification.load_projection.scale_energy(base_energy, temp_df, base_scen, new_scen, midperfhp_cop, advperfhp_cop, new_hp_profile)[source]¶
Project energy consumption for each projection scenarios from the base scenario
- Parameters:
base_energy (pandas.DataFrame) – dataframe of disaggregated electricity consumptions for all weather years
temp_df (pandas.DataFrame) – weather records the given hours
base_scen (LoadProjectionScenario) – reference scenario instance
new_scen (LoadProjectionScenario) – projection scenario instance
midperfhp_cop (pandas.DataFrame) – average performance heat pump COP against DBT with a 0.1 degree C interval
advperfhp_cop (pandas.DataFrame) – advanced performance heat pump (90% percentile cold climate heat pump) COP against DBT with a 0.1 degree C interval
new_hp_profile (str) – either “elec” or “ff”. Choose either current electric heat pump heating demand profiles or current fossil fuel heating demand that the projected newly electrified load will follow.
- :return (pandas.DataFrame) – hourly electricity consumption induced by heat pump
heating, resistance heating, cooling, and baseload for a projection scenario
- prereise.gather.demanddata.bldg_electrification.load_projection.temp_to_energy(temp_series, hourly_fits_df, db_wb_fit, base_scen, hp_heat_cop)[source]¶
Compute baseload, heating, and cooling electricity for a certain hour of year under model base year scenario
- Parameters:
temp_series (pandas.Series) – data for the given hour.
hourly_fits_df (pandas.DataFrame) – hourly and week/weekend breakpoints and coefficients for electricity use equations.
db_wb_fit (pandas.DataFrame) – least-square estimators of the linear relationship between WBT and DBT
base_scen (LoadProjectionScenario) – reference scenario instance
hp_heat_cop (pandas.DataFrame) – heat pump COP against DBT with a 0.1 degree C interval
- Returns:
(list) – energy for baseload, heat pump heating, resistance heating, and cooling of certain hour
prereise.gather.demanddata.bldg_electrification.load_projection_scenario module¶
- class prereise.gather.demanddata.bldg_electrification.load_projection_scenario.LoadProjectionScenario(id, input_series, other=None)[source]¶
Bases:
object
Define load projection scenario for a load zone. For a base scenario, read and save building stock inputs. For a projection scenario, some fields are projected from base scenario based on the projection scenario inputs.
- Parameters:
id (str) – id of scenario, ‘base’ refers to modeled base year scenario
input_series (pandas.Series) –
precomputed information of building stock floor area and energy usages for a base scenario. User defined growth inputs for a projection scenario. This series contains information for a load zone, which are listed as follows:
population
total building floor area by type
primary energy source types and household fraction for space heating, cooling, hot water and cooking
assumed dominate type of heat pump
assumed energy efficiency of cooking and air conditioning.
other (LoadProjectionScenario) – the base scenario instance for a projection scenario creation. None if creating a base scenario.
- compare_hp_heat_type(other)[source]¶
- :return (bool) – True if the heat pump type for projection scenario is the
same as that of base scenario, otherwise False
- floor_area_growth_type(other, clas)[source]¶
:return (float) – compound floor area growth by building type
- frac_cook_ff2hp(other, clas)[source]¶
:return (float) – fraction of floor area electrified for cooking
- frac_cool_growth(other)[source]¶
:return (float) – floor area growth ratio that have electric air conditioning
- frac_cooling_eff_change(other)[source]¶
- :return (float) – ratio of cooling efficiency improvement compares to base
scenario
- frac_hp_growth(other)[source]¶
- :return (float) – floor area growth ratio that use hp as main heating
appliance
prereise.gather.demanddata.bldg_electrification.puma_data_agg module¶
- prereise.gather.demanddata.bldg_electrification.puma_data_agg.aggregate_puma_df(puma_states, tract_puma_mapping, tract_gbs_area, tract_degday_normals, tract_pop)[source]¶
Scale census tract data up to puma areas.
- Parameters:
puma_states (pandas.DataFrame) – mapping of puma to state.
tract_puma_mapping (pandas.DataFrame) – tract to puma mapping.
tract_gbs_area (pandas.DataFrame) – General Building Stock area for residential, commercial, industrial areas by tract
tract_degday_normals (pandas.DataFrame) – heating and cooling degree day normals by tract
tract_pop (pandas.DataFrame) – population by tract
- Returns:
(pandas.DataFrame) – population; residential, commercial, industrial areas; heating degree days; cooling degree days; residential space heating household fuel fractions.
- prereise.gather.demanddata.bldg_electrification.puma_data_agg.puma_timezone_latlong(timezones, pumas)[source]¶
Assign timezone and lat/long to each puma.
- Parameters:
timezones (geopandas.DataFrame) – US timezones.
pumas (geopandas.DataFrame) – US pumas.
- Returns:
(pandas.Series) – timezone for every puma.
- Returns:
(pandas.DataFrame) – latitude and longitude for every puma.
- prereise.gather.demanddata.bldg_electrification.puma_data_agg.scale_fuel_fractions(hh_fuels, puma_df, year=2019)[source]¶
Scale census tract data up to puma areas.
- Parameters:
hh_fuels (pandas.DataFrame) – household fuel type by puma.
puma_df (pandas.DataFrame) – output of
aggregate_puma_df()
.year (int/str) – year to use within label when creating columns.
- Returns:
(pandas.DataFrame) – fractions of natural gas, fuel oil and kerosone, propane, and electricity used for space heating, hot water, cooking, and other in residential and commercial buildings.
prereise.gather.demanddata.bldg_electrification.puma_hp_estimator module¶
- prereise.gather.demanddata.bldg_electrification.puma_hp_estimator.estimate_puma_hp_penetration(hp_fit_df, hp_fit_df_low_elec, puma_data_metro)[source]¶
Compute current heat pump penetration for PUMAs, and then scale the values to align with regional inputs from RECS and CBECS surveys. When compute heat pump penetration rate from the regression model, the simpler model with less variance is chosen when the fraction of electrified heating is less than 0.27 (by default) as observed from the relationship between current heat pump penetration rate and the fraction of electrified heating
- Parameters:
hp_fit_df (pandas.DataFrame) – slope and intercept of heat pump penetration regression model, output of
hp_penetration_fit()
hp_fit_df_low_elec (pandas.DataFrame) – slope and intercept of heat pump penetration regression model for low electrified locations, output of :py:func: hp_penetration_fit()
puma_data_metro (pandas.DataFrame) – puma data within metropolitan areas, output of :py:func: puma_county_shp_overlay()
- Returns:
(pandas.DataFrame) hp_puma_df: current heat pump penetration estimations for pumas that has been scaled based on RECS and CBECS surveys. The indices of this dataframe includes all PUMA id’s in the CONUS. The columns include estimates of current heat pump penetration result for residential and commercial building stock
- prereise.gather.demanddata.bldg_electrification.puma_hp_estimator.hp_penetration_fit(stats)[source]¶
Fit current heat pump penetration rate on metropolitan area data
- Parameters:
stats (pandas.DataFrame) – metropolitan area data, output of :py:func: metro_data()
- Returns:
(tuple) – hp_fit_df: slope and intercept of heat pump penetration regression model, fit_stats: fitting statistics of heat pump penetration regression model; hp_fit_df_low_elec: slope and intercept of a simpler heat pump penetration model fitted on data points with low electrification rate of buildings; fit_stats_low_elec: fitting statistics of a simpler heat pump penetration model fitted on data points with low electrification rate of buildings.
- prereise.gather.demanddata.bldg_electrification.puma_hp_estimator.metro_data(puma_data)[source]¶
Aggregate puma metrics to the population weighted metropolitan area values of AHS survey
- Parameters:
puma_data (pandas.DataFrame) – puma data within metropolitan areas, output of :py:func: puma_county_shp_overlay()
- :return (pandas.DataFrame) stats – metropolitan area data to be used for heat
pump penetration linear regression model. The row indices includes all metropolitan areas with AHS heat pump data. Columns include data on the fraction of floor area that use electricity for space heating, average natural gas price for year 2019, normal year HDD, and AHS heat pump penetration rate.
- prereise.gather.demanddata.bldg_electrification.puma_hp_estimator.puma_county_shp_overlay(pumas_shp, county_shp)[source]¶
Align all counties that are within survey areas of AHS(American Housing Survey) to PUMAs geographically
- Parameters:
pumas_shp (geopandas.GeoDataFrame) – geo data frame of pumas shape file
county_shp (geopandas.GeoDataFrame) – geo data frame of county shape file
- :return (pandas.DataFrame) – puma data of all pumas within the survey areas of
AHS, including fraction within the zone. Row indices are id’s of puma that is covered by AHS survey data. Columns include household heat pump possession rate from AHS, fraction of geographical area each PUMA in each county, and other end-use energy information in “/data/puma_data.csv”
prereise.gather.demanddata.bldg_electrification.weather_data_agg module¶
- prereise.gather.demanddata.bldg_electrification.weather_data_agg.create_era5_pumas(years, tract_puma_mapping, tract_pop, tract_lat_lon, directory, variable='temp')[source]¶
- Create {variable}s_pumas_{state}_{year}.csv or dewpt_pumas_{state}_{year} for all
CONUS states and input year(s)
- Parameters:
year (iterable) – year(s) for which data files to be produced
tract_puma_mapping (pandas.Series) – tract to puma mapping.
tract_pop (pandas.Series) – population, indexed by tract.
tract_lat_lon (pandas.DataFrame) – data frame, indexed by tract, with columns “state”, “lat”, and “lon”.
directory (str) – path to root directory for ERA5 downloads (not including variable name)
str – variable to produce temp {Default} – dry bulb temperataure, corresponds to ERA5 variable “2m_temperature” dewpt – dew point temperature, corresponds to ERA5 variable “2m_dewpoint_temperature” pres – surface pressure, corresponds to ERA5 variable “surface_pressure”
- Raises:
ValueError – if the
variable
name is invalid.FileNotFoundError – if not all required files are present.
- prereise.gather.demanddata.bldg_electrification.weather_data_agg.dark_fractions(puma, puma_data, year)[source]¶
Compute annual time series of fraction of each hour that is dark for a given puma
- Parameters:
puma (str) – puma name
puma_data (pandas.DataFrame) – puma data for lat, long, and timezone
year (int) – year of desired dark fractions
- Returns:
(list) – hourly dark fractions for the year
- prereise.gather.demanddata.bldg_electrification.weather_data_agg.era5_download(years, directory, variable='temp')[source]¶
Download ERA5 data
- Parameters:
year (iterable) – year(s) for which data to be downloaded given as single value or iterable list
directory (str) – path to root directory for ERA5 downloads
str – variable to be downloaded, chosen from: temp {Default} – dry bulb temperataure, corresponds to ERA5 variable “2m_temperature” dewpt – dew point temperature, corresponds to ERA5 variable “2m_dewpoint_temperature” pres – surface pressure, corresponds to ERA5 variable “surface_pressure”
- Raises:
ValueError – if the
variable
name is invalid or if any values inyears
are outside of the valid range.Exception – if the cdsapi package is not configured properly.
- prereise.gather.demanddata.bldg_electrification.weather_data_agg.generate_dark_fracs(year, directory)[source]¶
Generate puma level hourly time series of darkness fractions for all pumas within a state
- Parameters:
year (int) – year of desired dark fractions
directory (str) – path to local root directory for weather data
- Export:
(csv) – statewide hourly dark fractions for every puma
- prereise.gather.demanddata.bldg_electrification.weather_data_agg.generate_wetbulb_temps(year, directory)[source]¶
Generate puma level hourly time series of wetbulb temperatures for all pumas within a state
- Parameters:
year (int) – year of desired dark fractions
directory (str) – path to local root directory for weather data
- Export:
(csv) – statewide hourly wetbulb temperatures for every puma
- prereise.gather.demanddata.bldg_electrification.weather_data_agg.t_to_twb(temp_values, dwpt_values, press_values)[source]¶
Compute wetbulb temperature from drybulb, dewpoint, and pressure
- Parameters:
temp_values (list) – drybulb temperatures, C
dwpt_values (list) – dewpoint temperatures, C
press_values (list) – pressures, Pa
- Returns:
(list) – wetbulb temperatures
prereise.gather.demanddata.bldg_electrification.zone_profile_generator module¶
- prereise.gather.demanddata.bldg_electrification.zone_profile_generator.bkpt_scale(df, num_points, bkpt, heat_cool)[source]¶
Adjust heating or cooling breakpoint to ensure there are enough data points to fit.
- Parameters:
df (pandas.DataFrame) – load and temperature for a certain hour of the day, wk or wknd.
num_points (int) – minimum number of points required in df to fit.
bkpt (float) – starting temperature breakpoint value.
heat_cool (str) – dictates if breakpoint is shifted warmer for heating or colder for cooling
- Returns:
(pandas.DataFrame) dft – adjusted dataframe filtered by new breakpoint. Original input df if size of initial df >= num_points
- Returns:
(float) bkpt – updated breakpoint. Original breakpoint if size of initial df >= num_points
- prereise.gather.demanddata.bldg_electrification.zone_profile_generator.hourly_load_fit(load_temp_df, plot_boolean)[source]¶
Fit hourly heating, cooling, and baseload functions to load data
- Parameters:
load_temp_df (pandas.DataFrame) – hourly load and temperature data
plot_boolean (boolean) – whether or not create profile plots.
- Returns:
(pandas.DataFrame) hourly_fits_df – hourly and week/weekend breakpoints and coefficients for electricity use equations
- Returns:
(float) s_wb_db, i_wb_db – slope and intercept of fit between dry and wet bulb temperatures of zone
- prereise.gather.demanddata.bldg_electrification.zone_profile_generator.main(zone_name, zone_name_shp, base_year, year, plot_boolean=False)[source]¶
Run profile generator for one zone for one year.
- Parameters:
zone_name (str) – name of load zone used to save profile.
zone_name_shp (str) – name of load zone within shapefile.
base_year (int) – data fitting year.
year (int) – profile year to calculate.
plot_boolean (boolean) – whether or not create profile plots.
- prereise.gather.demanddata.bldg_electrification.zone_profile_generator.plot_profile(profile, actual, plot_boolean)[source]¶
Plot profile vs. actual load
- Parameters:
profile (pandas.Series) – total profile hourly load
actual (pandas.Series) – zonal hourly load data
plot_boolean (boolean) – whether or not create profile plots.
- Returns:
(plot)
- prereise.gather.demanddata.bldg_electrification.zone_profile_generator.temp_to_energy(temp_series, hourly_fits_df, db_wb_fit)[source]¶
Compute baseload, heating, and cooling electricity for a certain hour of year
- Parameters:
load_temp_series (pandas.Series) – data for the given hour.
hourly_fits_df (pandas.DataFrame) – hourly and week/weekend breakpoints and coefficients for electricity use equations.
s_wb_db (float) – slope of fit between dry and wet bulb temperatures of zone.
i_wb_db (float) – intercept of fit between dry and wet bulb temperatures of zone.
- Returns:
(list) – [baseload, heating, cooling]
- prereise.gather.demanddata.bldg_electrification.zone_profile_generator.zonal_data(puma_data, hours_utc, year)[source]¶
Aggregate puma metrics to population weighted hourly zonal values
- Parameters:
puma_data (pandas.DataFrame) – puma data within zone, output of zone_shp_overlay()
hours_utc (pandas.DatetimeIndex) – index of UTC hours.
year (int) – year of temperature data
- Returns:
(pandas.DataFrame) temp_df – hourly zonal values of temperature, wetbulb temperature, and darkness fraction