Google API 响应数据:计算字典列表中出现次数最多的字典值
Google API Response Data: Count most frequent dictionary values from list of dictionaries
我有一个 Python 脚本 (Python 3.7) 可以访问 Google Sheet 并使用 sheet 获取所有数据get_all_records()
来自 gspread
库的方法。
响应数据是字典列表,google sheet 中的每一行表示为它自己的字典,key/value 对表示为列 header 和行值分别像这样:
[{'Away Team': 'Gillingham',
'Bet': 'Over 2.5 Goals',
'Home Team': 'AFC Wimbledon',
'Timestamp': '10/17/2019 10:36:01'},
{'Away Team': 'Liverpool',
'Bet': 'Home Win',
'Home Team': 'Man United',
'Timestamp': '10/18/2019 22:59:18'},
{'Away Team': 'Newcastle',
'Bet': 'BTTS',
'Home Team': 'Arsenal',
'Timestamp': '10/18/2019 22:59:31'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:29:45'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:29:52'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:30:00'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:30:02'},
{'Away Team': 'Newcastle',
'Bet': 'BTTS',
'Home Team': 'Arsenal',
'Timestamp': '10/18/2019 22:59:31'}]
'Bet'
键的值可以是 8 个值中的 1 个。对于每个唯一值,我想计算 'Home Team'
键中值在所有词典中的出现频率。
在上面的示例中,key-value 对 'Bet': 'BTTS'
最常见的 'Home Team'
值是 Everton
我尝试使用 collections
模块中的 default dictionary
为每个唯一的 'Bet'
键值创建新词典,但我很快意识到我只能使用 'Home Team'
values as keys with the 'Bet'
value as the value 但我无法捕获频率。
sheet 上的数据是通过 Google 表格收集的,因此我可以确保所捕获数据的完整性,因为该表格只允许从预定义的 [=41] 中选择值=] 或单选按钮。
在 modules/techniques 上提供正确方向的建议或指示以帮助我在这里将不胜感激。
我不熟悉 collections 模块,但是使用老式的、简单的方法很容易实现 Python。
假设我们将您的词典列表存储在一个名为 raw_dicts
的变量中。请允许我建议将其解析为更方便我们任务的数据结构:
parsed_dict = dict()
for dictionary in raw_dicts:
bet = dictionary['Bet']
if bet not in parsed_dict.keys():
parsed_dict[bet] = dict()
if dictionary['Home Team'] not in parsed_dict[bet].keys():
parsed_dict[bet][dictionary['Home Team']] = 0
parsed_dict[bet][dictionary['Home Team']] += 1
我在这里所做的是为每个投注团队对创建一个计数器。我们得到了这本漂亮的字典:
{
"Over 2.5 Goals": {
"AFC Wimbledon": 1
},
"Home Win": {
"Man United": 1
},
"BTTS": {
"Everton": 4,
"Arsenal": 2
}
}
现在我们有了这么好的字典,剩下的就是一个简单的最大化问题,教科书上有解:
most_frequent_bet = ""
most_frequent_team = ""
highest_frequency = 0
for bet in parsed_dict.keys():
for team in parsed_dict[bet].keys():
if parsed_dict[bet][team] > highest_frequency:
most_frequent_bet = bet
most_frequent_team = team
highest_frequency = parsed_dict[bet][team]
这可以通过许多其他方法来实现,有些方法比我的方法更优雅、更简短。我想在这里做的是一个易于阅读的代码,一步一步。
我有一个 Python 脚本 (Python 3.7) 可以访问 Google Sheet 并使用 sheet 获取所有数据get_all_records()
来自 gspread
库的方法。
响应数据是字典列表,google sheet 中的每一行表示为它自己的字典,key/value 对表示为列 header 和行值分别像这样:
[{'Away Team': 'Gillingham',
'Bet': 'Over 2.5 Goals',
'Home Team': 'AFC Wimbledon',
'Timestamp': '10/17/2019 10:36:01'},
{'Away Team': 'Liverpool',
'Bet': 'Home Win',
'Home Team': 'Man United',
'Timestamp': '10/18/2019 22:59:18'},
{'Away Team': 'Newcastle',
'Bet': 'BTTS',
'Home Team': 'Arsenal',
'Timestamp': '10/18/2019 22:59:31'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:29:45'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:29:52'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:30:00'},
{'Away Team': 'Man City',
'Bet': 'BTTS',
'Home Team': 'Everton',
'Timestamp': '10/20/2019 20:30:02'},
{'Away Team': 'Newcastle',
'Bet': 'BTTS',
'Home Team': 'Arsenal',
'Timestamp': '10/18/2019 22:59:31'}]
'Bet'
键的值可以是 8 个值中的 1 个。对于每个唯一值,我想计算 'Home Team'
键中值在所有词典中的出现频率。
在上面的示例中,key-value 对 'Bet': 'BTTS'
最常见的 'Home Team'
值是 Everton
我尝试使用 collections
模块中的 default dictionary
为每个唯一的 'Bet'
键值创建新词典,但我很快意识到我只能使用 'Home Team'
values as keys with the 'Bet'
value as the value 但我无法捕获频率。
sheet 上的数据是通过 Google 表格收集的,因此我可以确保所捕获数据的完整性,因为该表格只允许从预定义的 [=41] 中选择值=] 或单选按钮。
在 modules/techniques 上提供正确方向的建议或指示以帮助我在这里将不胜感激。
我不熟悉 collections 模块,但是使用老式的、简单的方法很容易实现 Python。
假设我们将您的词典列表存储在一个名为 raw_dicts
的变量中。请允许我建议将其解析为更方便我们任务的数据结构:
parsed_dict = dict()
for dictionary in raw_dicts:
bet = dictionary['Bet']
if bet not in parsed_dict.keys():
parsed_dict[bet] = dict()
if dictionary['Home Team'] not in parsed_dict[bet].keys():
parsed_dict[bet][dictionary['Home Team']] = 0
parsed_dict[bet][dictionary['Home Team']] += 1
我在这里所做的是为每个投注团队对创建一个计数器。我们得到了这本漂亮的字典:
{
"Over 2.5 Goals": {
"AFC Wimbledon": 1
},
"Home Win": {
"Man United": 1
},
"BTTS": {
"Everton": 4,
"Arsenal": 2
}
}
现在我们有了这么好的字典,剩下的就是一个简单的最大化问题,教科书上有解:
most_frequent_bet = ""
most_frequent_team = ""
highest_frequency = 0
for bet in parsed_dict.keys():
for team in parsed_dict[bet].keys():
if parsed_dict[bet][team] > highest_frequency:
most_frequent_bet = bet
most_frequent_team = team
highest_frequency = parsed_dict[bet][team]
这可以通过许多其他方法来实现,有些方法比我的方法更优雅、更简短。我想在这里做的是一个易于阅读的代码,一步一步。