2017-04-25 5 views
0

Ich frage Google Analytics Daten für Sitzungen und Benutzer für jedes andere Land. Ich möchte diese Daten für jeden einzelnen Tag in meiner Datenbank speichern, damit ich später darauf zugreifen kann.Gruppen-Python-Listen zusammen für gemeinsames Element

Meine Anfrage gibt mir eine wirklich große json zurück und ich versuche, die Optima-Lösung zu finden, um die Geschwindigkeit zu maximieren.

Zuerst gelang es mir, die von den Sitzungen geordneten Daten zurück zu bekommen, was bedeutet, dass ich jetzt nur die ersten 10 Länder in meiner Datenbank speichern kann, ohne für jeden Tag eine neue Zeile für jedes Land zu speichern.

Ich denke, das ist die minimale Menge an Daten, die ich brauche, um wertvolle Informationen zu haben. So, jetzt strukturierte ich meine bd Daten wie diese zu akzeptieren:

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) 

Jetzt ist meine große json, dass ich zurückkommen sieht ungefähr so ​​aus (ich habe eine Menge von Metriken in der Mitte entfernt haben):

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' 
      }] 
     } 
    } 
}] 
} 

ich versuche, herauszufinden, wie ich die Top 10 der Länder mit den meisten Sitzungen für jeden Tag extrahieren und diese Informationen in meinem db speichern, so weit kam ich mit:

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) 

Dies erzeugt mir eine Liste mit im Inneren Werte im Format [date[country, sessions, users]]

so etwas wie folgt aus:

[['20170404', ['US', '1219', '1091']], 
['20170406', ['US', '1203', '1109']], 
['20170405', ['US', '1185', '1073']], 
['20170408', ['PL', '2', '1']], 
['20170408', ['SG', '2', '2']], 
['20170408', ['TT', '2', '2']]] 

Jetzt nisten eine andere für Schleife Ich dachte, die das Datum überprüft und, wenn es das gleiche Es fügt die Werte z[1] zu derselben Liste hinzu, so dass ich für jedes Datum eine Liste mit den Werten für jedes einzelne Land hätte. Jedoch bin ich nicht sicher, wie man diese Wörterbücher zusammen nach dem ersten Wert z[0] gruppiert plus das würde alle Länder und nicht nur die Top 10 tun.

Gibt es einen einfacheren Weg, dies zu erreichen, angesichts der großen json oben? Wie gruppiere ich Listen nach dem ersten Wert und wie sortiere ich dann nach Sitzungen?

Danke!

Antwort

1

Wenn es keine doppelten Länder pro Tag gibt. Sie könnten defaultdicts, verwenden Sie die verschiedenen Ebenen der Gruppierung Räude (magisch):

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) 

Dieses eine dict zurückgibt, die Sie leicht iterieren erlaubt:

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'}})}) 

Um eine bestimmte Kombination von Datum zu empfangen/Land:

print (l['20170404']['US']) 
>>> {'sessions': '1219', 'users': '1091'} 

Iterate durch Ergebnis:

for date, values in l.items(): 
    for country, value in values.items(): 
     print (date, country, value) 
+0

Hallo. Das funktioniert, aber wie kann ich das dann auf meiner DB speichern?Zum Beispiel habe ich: ''20170408': {'PL': {'Sitzungen': '2', 'Benutzer': '1'}, 'SG': {'Sitzungen': '2', 'Benutzer ':' 2 '}, ' TT ': {' sessions ':' 2 ',' users ':' 2 '}}} 'Um das dic zu durchlaufen und die Sessions usw. zu bekommen, brauche ich den Schlüssel (z PL) aber diese ändern sich die ganze Zeit, nein? – Costantin

+0

Nein, ich habe die Antwort bearbeitet. –

+0

- Vielen Dank! – Costantin

Verwandte Themen