我正在查询每个不同国家/地区的会话和用户的Google Analytics数据。我希望每天在我的数据库中保存这些数据,以便以后可以访问它。
我的查询给了我一个非常大的json回来,我试图找到最佳速度的最佳解决方案。
首先,我设法取回了会话订购的数据,这意味着我现在只能保存我的数据库中的前10个国家/地区,而不是每天为每个国家/地区保存新行。
我认为这是获取有价值信息所需的最少数据量。所以现在我构建了我的bd来接受这样的数据:
20170101 | US | 112 (sessions) | 111 (users)
20170101 | CA | 111 (sessions) | 221 (users)
... (for 8 more rows)
20170102 | US | 11 (sessions) | 22 (users)
... (and so on, so 10 rows per day)
现在我回来的大json看起来像这样(我在中间删除了很多指标):
m = {
'reports': [{
'data': {
'rowCount': 2003,
'maximums': [{
'values': ['1219', '1109']
}],
'minimums': [{
'values': ['1', '1']
}],
'totals': [{
'values': ['33505', '30382']
}],
'rows': [{
'dimensions': ['20170404', 'US'],
'metrics': [{
'values': ['1219', '1091']
}]
}, {
'dimensions': ['20170406', 'US'],
'metrics': [{
'values': ['1203', '1109']
}]
}, {
'dimensions': ['20170405', 'US'],
'metrics': [{
'values': ['1185', '1073']
}]
}, {
'dimensions': ['20170408', 'PL'],
'metrics': [{
'values': ['2', '1']
}]
}, {
'dimensions': ['20170408', 'SG'],
'metrics': [{
'values': ['2', '2']
}]
}, {
'dimensions': ['20170408', 'TT'],
'metrics': [{
'values': ['2', '2']
}]
}]
},
'nextPageToken': '1000',
'columnHeader': {
'dimensions': ['ga:date', 'ga:countryIsoCode'],
'metricHeader': {
'metricHeaderEntries': [{
'name': 'ga:sessions',
'type': 'INTEGER'
}, {
'name': 'ga:users',
'type': 'INTEGER'
}]
}
}
}]
}
我试图找出如何提取每天会话最多的前10个国家/地区并将此信息保存在我的数据库中,到目前为止我想出了:
x = m['reports'][0]['data']['rows']
l =[]
for data in x:
date = data['dimensions'][0]
country = data['dimensions'][1]
sessions = data['metrics'][0]['values'][0]
users = data['metrics'][0]['values'][1]
n = [date, [country,sessions, users]]
l.append(n)
这会生成一个列表,其中包含格式为[date[country, sessions, users]]
这样的事情:
[['20170404', ['US', '1219', '1091']],
['20170406', ['US', '1203', '1109']],
['20170405', ['US', '1185', '1073']],
['20170408', ['PL', '2', '1']],
['20170408', ['SG', '2', '2']],
['20170408', ['TT', '2', '2']]]
现在我想嵌套另一个for循环来检查日期,如果它相同,它会将值z[1]
添加到同一个列表中,所以对于每个日期我都会有一个列表与每个国家的价值观。但是,我不确定如何根据第一个值z[0]
将这些字典组合在一起加上这将对所有国家/地区进行分组,而不仅仅是前10个国家/地区。
鉴于上面的大json,是否有更简单的方法来实现这一目标?如果我如何根据第一个值将列表组合在一起以及如何按会话排序?
谢谢!
答案 0 :(得分:1)
每天没有重复的国家/地区。您可以使用defaultdicts来管理不同级别的分组(神奇地):
import pprint
from collections import defaultdict
def recursive_defaultdict():
return defaultdict(recursive_defaultdict)
l = recursive_defaultdict()
x = m['reports'][0]['data']['rows']
for data in x:
date = data['dimensions'][0]
country = data['dimensions'][1]
sessions = data['metrics'][0]['values'][0]
users = data['metrics'][0]['values'][1]
l[date][country] = {'sessions': sessions, 'users': users}
pprint.pprint(l)
这会返回一个dict,允许您轻松迭代:
defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
{'20170404': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
{'US': {'sessions': '1219',
'users': '1091'}}),
'20170405': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
{'US': {'sessions': '1185',
'users': '1073'}}),
'20170406': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
{'US': {'sessions': '1203',
'users': '1109'}}),
'20170408': defaultdict(<function recursive_defaultdict at 0x7f3ecfb45e18>,
{'PL': {'sessions': '2', 'users': '1'},
'SG': {'sessions': '2', 'users': '2'},
'TT': {'sessions': '2', 'users': '2'}})})
要接收日期/国家/地区的特定组合:
print (l['20170404']['US'])
>>> {'sessions': '1219', 'users': '1091'}
迭代结果:
for date, values in l.items():
for country, value in values.items():
print (date, country, value)