-
Notifications
You must be signed in to change notification settings - Fork 3
/
create_dict_using_json.py
153 lines (117 loc) · 5.1 KB
/
create_dict_using_json.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# Objective: store information regarding every Steam game in a dictionary.
from pathlib import Path
import steamspypi
from src.appids import APP_ID_CONTRADICTION
def get_mid_of_interval(interval_as_str):
interval_as_str_formatted = [
s.replace(",", "") for s in interval_as_str.split("..")
]
lower_bound = float(interval_as_str_formatted[0])
upper_bound = float(interval_as_str_formatted[1])
return (lower_bound + upper_bound) / 2
def get_leading_comment():
# First line of the text file containing the output dictionary
return (
"# Dictionary with key=appid and value=list of name, Wilson score, Bayesian rating, #owners, "
"#players, median playtime, average playtime, #positive reviews, #negative reviews, boolean "
"whether to include the game in the ranking"
)
def create_local_dictionary(
data,
output_filename,
appid_reference_set=None,
quantile_for_our_wilson_score=0.95,
):
# Objective: compute a score for one Steam game.
#
# Input: - data: SteamSpy's data.
# - output_filename: filename to which the local dictionary will be written to.
# - appid_reference_set: a set of appID of games which are examples of "hidden gems".
# By default, the appID of the game called "Contradiction".
# - quantile_for_our_wilson_score: this allows to specify a different confidence for the Wilson score.
# Output: none (the local dictionary is written to output_filename)
if appid_reference_set is None:
appid_reference_set = {APP_ID_CONTRADICTION}
from src.compute_bayesian_rating import choose_prior, compute_bayesian_score
from src.compute_wilson_score import compute_wilson_score
# noinspection PyPep8Naming
d = {}
# Construct observation structure used to compute a prior for the inference of a Bayesian rating
observations = {}
for appid in data:
num_positive_reviews = data[appid]["positive"]
num_negative_reviews = data[appid]["negative"]
num_votes = num_positive_reviews + num_negative_reviews
if num_votes > 0:
observations[appid] = {}
observations[appid]["score"] = num_positive_reviews / num_votes
observations[appid]["num_votes"] = num_votes
prior = choose_prior(observations)
print(prior)
for appid in data:
name = data[appid]["name"]
num_owners = data[appid]["owners"]
try:
num_owners = float(num_owners)
except ValueError:
num_owners = get_mid_of_interval(num_owners)
try:
num_players = data[appid]["players_forever"]
except KeyError:
num_players = None
median_time = data[appid]["median_forever"]
average_time = data[appid]["average_forever"]
num_positive_reviews = data[appid]["positive"]
num_negative_reviews = data[appid]["negative"]
wilson_score = compute_wilson_score(
num_positive_reviews,
num_negative_reviews,
quantile_for_our_wilson_score,
)
num_votes = num_positive_reviews + num_negative_reviews
if num_votes > 0:
# Construct game structure used to compute Bayesian rating
game = {}
game["score"] = num_positive_reviews / num_votes
game["num_votes"] = num_votes
bayesian_rating = compute_bayesian_score(game, prior)
else:
bayesian_rating = None
# Make sure the output dictionary includes the game which will be chosen as a reference of a "hidden gem"
if appid in appid_reference_set:
if wilson_score is None:
raise AssertionError
if bayesian_rating is None:
raise AssertionError
print("Game used as a reference:\t" + name + "\t(appID=" + appid + ")")
if wilson_score is None or bayesian_rating is None:
print("Game with no review:\t" + name + "\t(appID=" + appid + ")")
else:
stats_save = [
name,
wilson_score,
bayesian_rating,
num_owners,
num_players,
median_time,
average_time,
num_positive_reviews,
num_negative_reviews,
]
bool_game_should_appear_in_ranking = True
stats_save.append(bool_game_should_appear_in_ranking)
d[appid] = stats_save
# Save the dictionary to a text file
with Path(output_filename).open("w", encoding="utf8") as outfile:
print(get_leading_comment(), file=outfile)
print(d, file=outfile)
def main():
from src.appids import appid_hidden_gems_reference_set
# SteamSpy's data in JSON format
data = steamspypi.load()
# A dictionary will be stored in the following text file
output_filename = "dict_top_rated_games_on_steam.txt"
create_local_dictionary(data, output_filename, appid_hidden_gems_reference_set)
return True
if __name__ == "__main__":
main()