diff --git a/comparison_figures.py b/comparison_figures.py
new file mode 100644
index 0000000000000000000000000000000000000000..476fe5bec29f86569d6f3fbfe5908c9b9cde83d6
--- /dev/null
+++ b/comparison_figures.py
@@ -0,0 +1,240 @@
+import os
+import click
+import numpy as np
+import pandas as pd
+import seaborn as sns
+import matplotlib.pyplot as plt
+
+# pylint: disable=no-value-for-parameter
+
+
+def compute_contrip(x, y, w1, w2):
+
+ return (
+ np.minimum(np.full((y.shape[0], x.shape[1]), 5), x + (y - 0.5) * w1)
+ - (1 - y) / w2 * x
+ - (5 - x) / 100
+ )
+
+
+def scaling(score):
+ return (score - 0.61) / (5 - 0.61) * 4 + 1
+
+
+def generate_dataframe(score, consensus):
+
+ df = pd.DataFrame()
+ df["ConTrip Score"] = np.ndarray.flatten(score, "F")
+ df["Consensus Score"] = np.asarray([consensus] * 5).flatten()
+ df["Rating"] = np.asarray(
+ [
+ ["Rating: 1"] * 51,
+ ["Rating: 2"] * 51,
+ ["Rating: 3"] * 51,
+ ["Rating: 4"] * 51,
+ ["Rating: 5"] * 51,
+ ]
+ ).flatten()
+
+ return df
+
+
+def generate_dataframe_2(score, rating):
+
+ df = pd.DataFrame()
+ df["ConTrip Score"] = score.flatten()
+ df["Rating"] = np.asarray([rating] * 6).flatten()
+ df["Consensus Score"] = np.asarray(
+ [
+ ["Consensus: 0.0"] * 41,
+ ["Consensus: 0.2"] * 41,
+ ["Consensus: 0.4"] * 41,
+ ["Consensus: 0.6"] * 41,
+ ["Consensus: 0.8"] * 41,
+ ["Consensus: 1.0"] * 41,
+ ]
+ ).flatten()
+
+ return df
+
+
+def generate_plots_1(df, output, scale):
+
+ fig, ax = plt.subplots(figsize=(5, 5))
+
+ sns.scatterplot(
+ data=df,
+ x="Consensus Score",
+ y="ConTrip Score",
+ hue="Rating",
+ palette=["#d7191c", "#fdae61", "#fee08b", "#abdda4", "#2b83ba"],
+ )
+
+ ax.spines["top"].set_visible(False)
+ ax.spines["right"].set_visible(False)
+
+ custom_lines = []
+ for el in [
+ ["Rating: 1", "#d7191c"],
+ ["Rating: 2", "#fdae61"],
+ ["Rating: 3", "#fee08b"],
+ ["Rating: 4", "#abdda4"],
+ ["Rating: 5", "#2b83ba"],
+ ]:
+
+ custom_lines.append(
+ plt.plot(
+ [],
+ [],
+ marker="o",
+ ms=7,
+ ls="",
+ mec="black",
+ mew=0,
+ color=el[1],
+ label=el[0],
+ )[0]
+ )
+
+ ax.legend(
+ bbox_to_anchor=(0.0, 1.05, 1.0, 0.102),
+ handles=custom_lines,
+ loc="upper center",
+ facecolor="white",
+ ncol=3,
+ fontsize=8,
+ frameon=False,
+ )
+
+ fig.tight_layout()
+
+ if scale:
+ out_file = os.path.join(output, "contrip_score_consensus_scaling.pdf")
+ else:
+ out_file = os.path.join(output, "contrip_score_consensus.pdf")
+
+ plt.savefig(out_file)
+ plt.close()
+
+
+def generate_plots_2(df, output, scale):
+
+ fig, ax = plt.subplots(figsize=(5, 5))
+
+ sns.scatterplot(
+ data=df,
+ x="Rating",
+ y="ConTrip Score",
+ hue="Consensus Score",
+ palette=["#d7191c", "#fdae61", "#fee08b", "#abdda4", "#2b83ba", "#5e4fa2"],
+ )
+
+ ax.spines["top"].set_visible(False)
+ ax.spines["right"].set_visible(False)
+
+ custom_lines = []
+ for el in [
+ ["Consensus: 0.0", "#d7191c"],
+ ["Consensus: 0.2", "#fdae61"],
+ ["Consensus: 0.4", "#fee08b"],
+ ["Consensus: 0.6", "#abdda4"],
+ ["Consensus: 0.8", "#2b83ba"],
+ ["Consensus: 1.0", "#5e4fa2"],
+ ]:
+
+ custom_lines.append(
+ plt.plot(
+ [],
+ [],
+ marker="o",
+ ms=7,
+ ls="",
+ mec="black",
+ mew=0,
+ color=el[1],
+ label=el[0],
+ )[0]
+ )
+
+ ax.legend(
+ bbox_to_anchor=(0.0, 1.05, 1.0, 0.102),
+ handles=custom_lines,
+ loc="upper center",
+ facecolor="white",
+ ncol=3,
+ fontsize=8,
+ frameon=False,
+ )
+
+ fig.tight_layout()
+
+ if scale:
+ out_file = os.path.join(output, "contrip_score_rating_scaling.pdf")
+ else:
+ out_file = os.path.join(output, "contrip_score_rating.pdf")
+
+ plt.savefig(out_file)
+ plt.close()
+
+
+def generate_figure_1(weight_1, weight_2, scale, output):
+
+ rating = np.linspace(1, 5, 5).reshape(1, 5)
+ consensus = np.linspace(0, 1, 51).reshape(51, 1)
+
+ score = compute_contrip(rating, consensus, weight_1, weight_2)
+
+ if scale:
+ score = scaling(score)
+
+ df = generate_dataframe(score, consensus)
+
+ generate_plots_1(df, output, scale)
+
+
+def generate_figure_2(weight_1, weight_2, scale, output):
+
+ rating = np.linspace(1, 5, 41).reshape(1, 41)
+ consensus = np.linspace(0, 1, 6).reshape(6, 1)
+
+ score = compute_contrip(rating, consensus, weight_1, weight_2)
+
+ if scale:
+ score = scaling(score)
+
+ df = generate_dataframe_2(score, rating)
+
+ generate_plots_2(df, output, scale)
+
+
+# ------------------------------------------------------------------------------
+# CLICK
+# ------------------------------------------------------------------------------
+
+
+@click.command(
+ short_help="script to study how different parameters change"
+ "the behavior of the score of a tripadvisor rating"
+)
+@click.option(
+ "-w1",
+ "--weight_1",
+ default=0.5,
+ help="weight for the importance of the consensus value",
+)
+@click.option(
+ "-w2",
+ "--weight_2",
+ default=10.0,
+ help="weight for the importance of the consensus value 2",
+)
+@click.option("-sf", "--scaling_flag", is_flag=True, help="flag to perform the scaling")
+@click.option("-o", "--output", default="", help="output folder")
+def main(weight_1, weight_2, scaling_flag, output):
+
+ generate_figure_1(weight_1, weight_2, scaling_flag, output)
+ generate_figure_2(weight_1, weight_2, scaling_flag, output)
+
+
+if __name__ == "__main__":
+ main()