2017-04-25 66 views
0

我在查詢每個不同國家/地區的會話和用戶的Google Analytics數據。我想每天保存這些數據到我的數據庫中,以便稍後訪問。羣組Python列表共同爲公共元素

我的查詢給了我一個非常大的json,我試圖找到optima解決方案來最大化速度。

首先,我設法找回了會議訂購的數據,這意味着我現在只能保存我的分貝中的前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上面?如果我如何根據第一個值將列表分組在一起,然後如何按會話進行排序?

謝謝!

回答

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) 

這將返回一個字典,它允許您輕鬆遍歷:

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) 
+0

嗨。這有效,但我怎麼才能將它保存在我的數據庫?例如,我有: ''20170408':{'PL':{'sessions':'2','users':'1'}, 'SG':{'sessions':'2','users ':'2'}, 'TT':{'sessions':'2','users':'2'}}}'爲了遍歷dic並獲取會話等,我需要密鑰(例如PL),但這些一直都在變化,不是嗎? – Costantin

+0

不,我編輯了答案。 –

+0

- 非常感謝! – Costantin