def create_1d_stats(run_data):
    """
    Create count and revenue stats per attribute value from a data dictionary
    :param run_data: [{context: context_dict, action: action_dict, result: result_dict}]
    :return: {context_key/action_key: {context_value/action_value: {count: int, revenue: int, rate: int}}}
    """
    stats = dict()
    means = dict()
    total = dict(count=0, revenue=0, rate=0)
    count = 0
    for record in run_data:
        success = record["result"]["effect"]["Success"]
        price = record["action"]["price"]
        info = dict(record["context"]["context"], **record["action"])
        for k, v in info.items():
            create_key(stats, k, dict())
            create_key(stats[k], v, dict())
            stats[k][v]["count"] = stats[k][v].get("count", 0) + 1
            stats[k][v]["revenue"] = stats[k][v].get("revenue", 0) + success * price
            stats[k][v]["rate"] = stats[k][v]["revenue"] / stats[k][v]["count"]
            total["count"] += stats[k][v]["count"]
            total["revenue"] += stats[k][v]["revenue"]
            total["rate"] += stats[k][v]["rate"]
            count += 1
    for stat in total.keys():
        means[stat] = total[stat] / count
    return stats, means
def create_1d_stats(run_data):
    """
    Create count and revenue stats per attribute value from a data dictionary
    :param run_data: [{context: context_dict, action: action_dict, result: result_dict}]
    :return: {context_key/action_key: {context_value/action_value: {count: int, revenue: int, rate: int}}}
    """
    stats = dict()
    means = dict()
    total = dict(count=0, revenue=0, rate=0)
    count = 0
    for record in run_data:
        success = record["result"]["effect"]["Success"]
        price = record["action"]["price"]
        info = dict(record["context"]["context"], **record["action"])
        for k, v in info.items():
            create_key(stats, k, dict())
            create_key(stats[k], v, dict())
            stats[k][v]["count"] = stats[k][v].get("count", 0) + 1
            stats[k][v]["revenue"] = stats[k][v].get("revenue",
                                                     0) + success * price
            stats[k][v]["rate"] = stats[k][v]["revenue"] / stats[k][v]["count"]
            total["count"] += stats[k][v]["count"]
            total["revenue"] += stats[k][v]["revenue"]
            total["rate"] += stats[k][v]["rate"]
            count += 1
    for stat in total.keys():
        means[stat] = total[stat] / count
    return stats, means
def create_2d_stats(run_data):
    """
    Create stats from a data dictionary
    :param run_data: [{context: context_dict, action: action_dict, result: result_dict}]
    """
    stats = dict()
    for record in run_data:
        success = record["result"]["effect"]["Success"]
        price = record["action"]["price"]
        for ck, cv in record["context"]["context"].items():
            for ak, av in record["action"].items():
                create_key(stats, ck, dict())
                create_key(stats[ck], ak, dict())
                create_key(stats[ck][ak], cv, dict())
                create_key(stats[ck][ak][cv], av, dict())
                stats[ck][ak][cv][av]["count"] = stats[ck][ak][cv][av].get("count", 0) + 1
                stats[ck][ak][cv][av]["revenue"] = stats[ck][ak][cv][av].get("revenue", 0) + success * price
                stats[ck][ak][cv][av]["rate"] = stats[ck][ak][cv][av]["revenue"] / stats[ck][ak][cv][av]["count"]
    return stats
def create_2d_stats(run_data):
    """
    Create stats from a data dictionary
    :param run_data: [{context: context_dict, action: action_dict, result: result_dict}]
    """
    stats = dict()
    for record in run_data:
        success = record["result"]["effect"]["Success"]
        price = record["action"]["price"]
        for ck, cv in record["context"]["context"].items():
            for ak, av in record["action"].items():
                create_key(stats, ck, dict())
                create_key(stats[ck], ak, dict())
                create_key(stats[ck][ak], cv, dict())
                create_key(stats[ck][ak][cv], av, dict())
                stats[ck][ak][cv][av]["count"] = stats[ck][ak][cv][av].get(
                    "count", 0) + 1
                stats[ck][ak][cv][av]["revenue"] = stats[ck][ak][cv][av].get(
                    "revenue", 0) + success * price
                stats[ck][ak][cv][av]["rate"] = stats[ck][ak][cv][av][
                    "revenue"] / stats[ck][ak][cv][av]["count"]
    return stats