Source code for experiment_floodplain.data_management.task_sample_survey_recipients.sample

"""Auxiliary functions to generate sample of survey respondents."""

import numpy as np
import pandas as pd
import string
import random


[docs] def get_covariates_dataset(covariatesDF, valuesDF, weights=False): """Compute (weighted) average values of variables in `covariatesDF` from `valuesDF`. Missing values are automatically excluded. Args: covariatesDF (pandas.DataFrame): Dataframe of covariates. Need to have columns named "CATEGORY", "DESCRIPTION", "VARLEVEL", "VARNAME", and "WEIGHTS". valuesDF (pandas.DataFrame): Dataframes of covariates' values. Need to have a column named "VARNAME" containing the variables in `covariatesDF`. weights (Bool): Weights to compute weighted mean. If True, will be pulled from `valuesDF.WEIGHTS`. Default is False Returns: pandas.DataFrame """ meanDict = {} desc = "Distance from flooded areas for addresses in non-flooded areas, in meters" for i, row in covariatesDF.iterrows(): if row.DESCRIPTION == desc: valuesDF = valuesDF.query("FLOODED == 0") key = (f"{row.CATEGORY}", f"{row.DESCRIPTION} ({row.VARLEVEL})") if row.VARNAME in valuesDF: var = valuesDF[row.VARNAME] maskedVar = np.ma.MaskedArray(var, mask=np.isnan(var)) value = ( var.mean() if weights is False else np.ma.average(maskedVar, weights=valuesDF.WEIGHTS) ) meanDict.update({key: value.round(3)}) else: meanDict.update({key: 0.000}) meanDF = pd.DataFrame(meanDict, index=["Average"]).T return meanDF
[docs] def id_generator(seed, length=8, restriction=False): """Generate random string of given length, given `seed`.""" random.seed(seed) chars = string.ascii_uppercase + string.digits if restriction: forbidden_chars = "0O1I" for char in forbidden_chars: chars=chars.replace(char,"") return "".join(random.choice(chars) for _ in range(length))
[docs] def format_data_for_qualtrics(qualtricsDF): """Format pandas.DataFrame that needs to be uploaded as Qualtrics contact list.""" # English to Dutch dictionary waterdepthDict = { "less than 0.5m": "minder dan 0,5 m", "between 0.5 and 1m": "tussen 0,5 en 1,0 m", "between 1 and 1.5m": "tussen 1,0 en 1,5 m", "between 1.5 and 2m": "tussen 1,5 en 2,0 m", "between 2 and 5m": "tussen 2,0 en 5,0 m", "more than 5m": "meer dan 5,0 m", } # adjust for formatting purposes scenarios = [10, 100, 1000, 10000] for s in scenarios: qualtricsDF[f"FLOOD_{s}"] = np.where( qualtricsDF[f"FLOOD_{s}"] == 1, "yes", "no" ) qualtricsDF[f"FLOOD_{s}_NL"] = np.where( qualtricsDF[f"FLOOD_{s}"] == "yes", "ja", "nee" ) qualtricsDF[f"WATERDEPTH_{s}"] = np.where( qualtricsDF[f"WATERDEPTH_{s}"] == "0m", "", qualtricsDF[f"WATERDEPTH_{s}"] ) qualtricsDF[f"WATERDEPTH_{s}_NL"] = qualtricsDF[f"WATERDEPTH_{s}"].replace( waterdepthDict ) qualtricsDF = qualtricsDF.rename( columns={ f"FLOOD_{s}": f"FLOOD_{s}_EN", f"WATERDEPTH_{s}": f"WATERDEPTH_{s}_EN", } ) # dutch to english floodmaxDict = { "1 in 100 years": "1 op 100 jaar", "1 in 1000 years": "1 op 1000 jaar", "1 in 10000 years": "1 op 10000 jaar", } qualtricsDF = qualtricsDF.rename(columns={"FLOOD_MAX": "FLOOD_MAX_EN"}) qualtricsDF["FLOOD_MAX_NL"] = ( qualtricsDF["FLOOD_MAX_EN"].replace(floodmaxDict).copy() ) # WATERDEPTH_MAX to text qualtricsDF["WATERDEPTH_MAX"] = qualtricsDF["WATERDEPTH_MAX"].replace( { 1: "less than 0.5m", 2: "between 0.5 and 1m", 3: "between 1 and 1.5m", 4: "between 1.5 and 2m", 5: "between 2 and 5m", 6: "more than 5m", } ) qualtricsDF["WATERDEPTH_MAX_NL"] = qualtricsDF["WATERDEPTH_MAX"].replace( waterdepthDict ) qualtricsDF = qualtricsDF.rename(columns={ "WATERDEPTH_MAX": "WATERDEPTH_MAX_EN", "PASSWORD": "ExternalDataReference"}) qualtricsDF["Email"] = "email@email.com" # mandatory field in qualtrics # add extra rows for Qualtrics testing ids = [f"password{i}" for i in range(1, 11)] passwords = [id.upper() for id in ids] extrarows = qualtricsDF.tail(10).copy() extrarows["uniqueadd_id"] = ids extrarows["ExternalDataReference"] = passwords qualtricsDF = pd.concat([qualtricsDF, extrarows]) return qualtricsDF