Assume that the AddOnePlayer input and output tables have the names InputTable and OutputTable, respectively.
To compute a table that contains the Shapley value of each player:
- Create a table that contains the weighted payoff produced by adding a player to each combination. For example:
CREATE TABLE stratum (PARTITION KEY(player)) AS SELECT player, (InputTable.value - OutputTable.value) / divisor AS partial_value, OutputTable.size AS size FROM inputTable INNER JOIN OutputTable ON (InputTable.comb = OutputTable.comb2);
- Create a table that contains the partial Shapley value produced when each player is added to a combination of a given size. For example:
CREATE TABLE stratum_avg (PARTITION KEY(player)) AS SELECT player, size, SUM(partial_value) AS partial_avg FROM stratum GROUP BY player, size;
- Create a table that lists the Shapley value for each player. For example:
CREATE TABLE shapley_values (PARTITION KEY(player)) AS SELECT player, SUM(partial_avg) / numberOfPlayers AS shapley_value FROM stratum_avg GROUP BY player;
Alternatively, combine the preceding statements into this statement:
CREATE TABLE shapley_values (PARTITION KEY(player)) AS SELECT player, SUM(partial_avg) / numberOfPlayers AS shapley_value FROM ( SELECT player, size, SUM(partial_value) AS partial_avg FROM ( SELECT player, (inputTable.value - outputTable.value) / divisor AS partial_value, outputTable.size AS size FROM inputTable INNER JOIN outputTable ON (inputTable.comb=outputTable.comb2) ) AS stratum GROUP BY player, size ) AS stratum_avg GROUP BY player;
To normalize the Shapley values, so that their sum is 1:
SELECT player, shapley_value / ( SELECT SUM(shapley_value) FROM shapley_values ) AS normalized__shapley_values FROM shapley_values;