Ejemplo n.º 1
0
def test_get_causal_impact_results_statsmodels_or_tensorflow():
    """
    tests get_causal_impact_results function with the statsmodels
    or the tensorflow implementation (depends on which one is installed)
    """
    if PYTHON_IMPLEMENTATION_USED == "pycausalimpact":
        ci_implementation = "statsmodels"
        print("Using pycausalimpact (statsmodels implementation)")
    elif PYTHON_IMPLEMENTATION_USED == "tfcausalimpact":
        ci_implementation = "tensorflow"
        print("Using tfcausalimpact (tensorflow implementation)")
    else:
        raise ValueError(
            "Neither tfcausalimpact nor pycausalmodel seem to be installed")

    data = generate_test_dataset()

    test_experiment_config = ExperimentConfig(**dict(
        data=data,
        experiment_name="experiment1",
        correlation_metric="mutual_info",
        time_var="t",
        y_var="y",
        training_period=[0, 69],
        evaluation_period=[70, 99],
        percentile_correlation_cut=0.5,
        max_number_of_columns=4,
    ))

    most_relevant_vars = get_most_relevant_variables(test_experiment_config)

    # TODO: Don't add time_var? Is the index relevant?
    data = data[[test_experiment_config.y_var] + most_relevant_vars]

    data = impute_missing_values(data, impute_x_vars=True, impute_y_vars=True)

    experiment_output = get_causal_impact_results(
        processed_data=data,
        ci_implementation=ci_implementation,
        experiment_config=test_experiment_config,
    )

    results = experiment_output.results_summary

    cumulative_abs_effects = results.loc["abs_effect", "cumulative"]

    assert (
        190 > cumulative_abs_effects > 100
    ), f"Cumulative absolute results {cumulative_abs_effects} aren't what is expected!"
Ejemplo n.º 2
0
def test_passing_causal_model_config_to_get_causal_impact_results_from_tensorflow(
):
    data = generate_test_dataset()

    custom_alpha = 0.02
    causal_model_config = TFCausalImpactConfig(**dict(
        model=None,
        alpha=custom_alpha,
        # Model args dictionary
        prior_level_sd=0.6,
        fit_method="vi",
        nseasons=30,  # monthly seasonality.
        season_duration=7,
    ))

    test_experiment_config = ExperimentConfig(**dict(
        data=data,
        experiment_name="experiment1",
        correlation_metric="mutual_info",
        time_var="t",
        y_var="y",
        training_period=[0, 69],
        evaluation_period=[70, 99],
        percentile_correlation_cut=0.5,
        max_number_of_columns=4,
        causal_model_config=causal_model_config,
    ))

    most_relevant_vars = get_most_relevant_variables(test_experiment_config)
    data = data[[test_experiment_config.y_var] + most_relevant_vars]
    data = impute_missing_values(data, impute_x_vars=True, impute_y_vars=True)

    experiment_output = get_causal_impact_results(
        processed_data=data,
        ci_implementation="tensorflow",
        experiment_config=test_experiment_config,
    )

    results = experiment_output.results_summary

    cumulative_abs_effects = results.loc["abs_effect", "cumulative"]

    assert (experiment_output.trained_model.alpha == custom_alpha
            ), f"Alpha should be {custom_alpha}"

    assert (
        190 > cumulative_abs_effects > 100
    ), f"Cumulative absolute results {cumulative_abs_effects} aren't what is expected!"
Ejemplo n.º 3
0
def test_get_most_relevant_variables():
    np.random.seed(12345)
    df = generate_test_dataset()
    test_experiment_config = ExperimentConfig(**dict(
        data=df,
        experiment_name="experiment1",
        correlation_metric="mutual_info",
        time_var="t",
        y_var="y",
        training_period=[0, 69],
        evaluation_period=[70, 99],
        percentile_correlation_cut=0.5,
        max_number_of_columns=4,
    ))
    most_relevant_columns = get_most_relevant_variables(test_experiment_config)

    assert set(["x1", "x2"]) == set(
        most_relevant_columns), f"got {set(most_relevant_columns)} instead"
Ejemplo n.º 4
0
def test_get_results_from_list_of_experiments():
    np.random.seed(134)
    data = generate_test_dataset()

    # Generate List of experiment configs
    # In this case, data is shared, but it doesn't have to be
    experiment_config1 = ExperimentConfig(**dict(
        data=data,
        experiment_name="experiment1",
        correlation_metric="mutual_info",
        time_var="t",
        y_var="y",
        training_period=[0, 69],
        evaluation_period=[70, 99],
        percentile_correlation_cut=0.5,
        max_number_of_columns=4,
        available_x_columns=["x1", "x2"],
    ))

    experiment_config2 = ExperimentConfig(**dict(
        data=data,
        experiment_name="experiment2",
        correlation_metric="mutual_info",
        time_var="t",
        y_var="x2",
        training_period=[0, 60],
        evaluation_period=[61, 99],
        percentile_correlation_cut=0.5,
        max_number_of_columns=4,
        available_x_columns=["x1", "x3"],
    ))

    experiment_configs = [experiment_config1, experiment_config2]

    all_experiments_results = get_results_from_list_of_experiments(
        experiment_configs, ci_implementation="tensorflow")

    cumulative_abs_effects = all_experiments_results[
        "experiment1"].results_summary.loc["abs_effect", "cumulative"]

    assert (
        190 > cumulative_abs_effects > 100
    ), f"Cumulative absolute results {cumulative_abs_effects} aren't what is expected!"
Ejemplo n.º 5
0
def test_get_causal_impact_results_r():
    """
    tests get_causal_impact_results function with R implementation
    """
    ci_implementation = "r"

    data = generate_test_dataset()
    test_experiment_config = ExperimentConfig(**dict(
        data=data,
        experiment_name="experiment1",
        correlation_metric="mutual_info",
        time_var="t",
        y_var="y",
        training_period=[0, 69],
        evaluation_period=[70, 99],
        percentile_correlation_cut=0.5,
        max_number_of_columns=4,
    ))

    most_relevant_vars = get_most_relevant_variables(test_experiment_config)

    # TODO: Don't add time_var? Is the index relevant?
    data = data[
        [test_experiment_config.time_var, test_experiment_config.y_var] +
        most_relevant_vars]

    data = impute_missing_values(data, impute_x_vars=True, impute_y_vars=True)

    experiment_output = get_causal_impact_results(
        processed_data=data,
        ci_implementation=ci_implementation,
        experiment_config=test_experiment_config,
    )

    results = experiment_output.results_summary
    cumulative_abs_effects = results.loc["abs_effect", "cumulative"]

    assert (
        190 > cumulative_abs_effects > 100
    ), f"Cumulative absolute results {cumulative_abs_effects} aren't what is expected!"
Ejemplo n.º 6
0
#########
#
# Example of package usage
#
########
import CausalImpactExplainer as cie
import numpy as np
from CausalImpactExplainer.utils import generate_test_dataset

np.random.seed(134)
data = generate_test_dataset()

test_experiment_config = cie.ExperimentConfig(**dict(
    data=data,
    experiment_name="experiment1",
    correlation_metric="mutual_info",
    time_var="t",
    y_var="y",
    training_period=[0, 69],
    evaluation_period=[70, 99],
    percentile_correlation_cut=0.5,
    max_number_of_columns=4,
))

most_relevant_columns = cie.get_most_relevant_variables(test_experiment_config)
print(most_relevant_columns)

data = data[[test_experiment_config.y_var] + most_relevant_columns]

data = cie.impute_missing_values(data, impute_x_vars=True, impute_y_vars=True)