2012-11-23 6 views
8

Ecco i miei dati da Google BigQuery per analizzare:dati di analisi per creare un oggetto di dati JSON con Python

{ 
    u'kind': u'bigquery#queryResponse', 
    u'rows': [ 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'995' 
       }, 
       { 
        u'v': u'1600' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'942' 
       }, 
       { 
        u'v': u'1607' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'937' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'894' 
       }, 
       { 
        u'v': u'1598' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'848' 
       }, 
       { 
        u'v': u'1592' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'841' 
       }, 
       { 
        u'v': u'1590' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'786' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'779' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'762' 
       }, 
       { 
        u'v': u'1597' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'753' 
       }, 
       { 
        u'v': u'1594' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'740' 
       }, 
       { 
        u'v': u'1596' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'738' 
       }, 
       { 
        u'v': u'1612' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'718' 
       }, 
       { 
        u'v': u'1590' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'717' 
       }, 
       { 
        u'v': u'1610' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'715' 
       }, 
       { 
        u'v': u'1602' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'680' 
       }, 
       { 
        u'v': u'1606' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'674' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'639' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'637' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'634' 
       }, 
       { 
        u'v': u'1590' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'633' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'616' 
       }, 
       { 
        u'v': u'1596' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'614' 
       }, 
       { 
        u'v': u'1596' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'612' 
       }, 
       { 
        u'v': u'1595' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'607' 
       }, 
       { 
        u'v': u'1603' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'579' 
       }, 
       { 
        u'v': u'1593' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'570' 
       }, 
       { 
        u'v': u'1600' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'541' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'525' 
       }, 
       { 
        u'v': u'1608' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'520' 
       }, 
       { 
        u'v': u'1599' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'518' 
       }, 
       { 
        u'v': u'1602' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'486' 
       }, 
       { 
        u'v': u'1595' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'470' 
       }, 
       { 
        u'v': u'1593' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'433' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'429' 
       }, 
       { 
        u'v': u'1607' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'421' 
       }, 
       { 
        u'v': u'1611' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'399' 
       }, 
       { 
        u'v': u'1592' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'363' 
       }, 
       { 
        u'v': u'0' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'353' 
       }, 
       { 
        u'v': u'1594' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'287' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'106' 
       }, 
       { 
        u'v': u'0' 
       } 
      ] 
     }, 
     { 
      u'f': [ 
       { 
        u'v': u'the' 
       }, 
       { 
        u'v': u'57' 
       }, 
       { 
        u'v': u'1609' 
       } 
      ] 
     } 
    ], 
    u'jobReference': { 
     u'projectId': u'670640819051', 
     u'jobId': u'job_5bf745fcee8b470e997d8ea90f380e68' 
    }, 
    u'jobComplete': True, 
    u'totalRows': u'42', 
    u'schema': { 
     u'fields': [ 
      { 
       u'type': u'STRING', 
       u'name': u'word', 
       u'mode': u'NULLABLE' 
      }, 
      { 
       u'type': u'INTEGER', 
       u'name': u'word_count', 
       u'mode': u'NULLABLE' 
      }, 
      { 
       u'type': u'INTEGER', 
       u'name': u'corpus_date', 
       u'mode': u'NULLABLE' 
      } 
     ] 
    } 
} 

Essendo un newbee Python, ho davvero idea di come fare per l'analisi di questi dati per creare un oggetto json come di seguito:

[ 
    {'count': 200, 'year': 2008}, 
    {'count': 240, 'year': 2010}, 
    {'count': 290, 'year': 2009} 
] 

Qualcuno può darmi qualche suggerimento su come iniziare?

Esempio

[{u'v': u'the'}, {u'v': u'995'}, {u'v': u'1600'}] 

In questo per la parola 'the', count è 995 e year è 1600. E così segue.

+1

hi, dove viene "anno" e "contare" viene da? – andrefsp

+0

ho appena aggiornato un'occhiata – iJade

+0

Nel tuo esempio, come stai distinguendo che '{u'v ': u'995'}' rappresenta 'count' e' {u'v ': u'1600'} 'rappresenta' year'? –

risposta

27

Se "Z" è il tuo grande dizionario, su "risposta" otterrai la struttura di cui hai bisogno.

import json 

response = [] 
for row in z['rows']: 
    for key, dict_list in row.iteritems(): 
     count = dict_list[1] 
     year = dict_list[2] 
     response.append({'count': count['v'], 'year' : year['v']}) 

print json.dumps(response) 

In risposta si otterrà il seguente:

[{'count': u'995', 'year': u'1600'}, 
{'count': u'942', 'year': u'1607'}, 
{'count': u'937', 'year': u'1599'}, 
{'count': u'894', 'year': u'1598'}, 
{'count': u'848', 'year': u'1592'}, 
{'count': u'841', 'year': u'1590'}, 
{'count': u'786', 'year': u'1603'}, 
{'count': u'779', 'year': u'1609'}, 
{'count': u'762', 'year': u'1597'}, 
{'count': u'753', 'year': u'1594'}, 
{'count': u'740', 'year': u'1596'}, 
{'count': u'738', 'year': u'1612'}, 
{'count': u'718', 'year': u'1590'}, 
{'count': u'717', 'year': u'1610'}, 
{'count': u'715', 'year': u'1602'}, 
{'count': u'680', 'year': u'1606'}, 
{'count': u'674', 'year': u'1603'}, 
{'count': u'639', 'year': u'1603'}, 
{'count': u'637', 'year': u'1603'}, 
{'count': u'634', 'year': u'1590'}, 
{'count': u'633', 'year': u'1599'}, 
{'count': u'616', 'year': u'1596'}, 
{'count': u'614', 'year': u'1596'}, 
{'count': u'612', 'year': u'1595'}, 
{'count': u'607', 'year': u'1603'}, 
{'count': u'579', 'year': u'1593'}, 
{'count': u'570', 'year': u'1600'}, 
{'count': u'541', 'year': u'1599'}, 
{'count': u'525', 'year': u'1608'}, 
{'count': u'520', 'year': u'1599'}, 
{'count': u'518', 'year': u'1602'}, 
{'count': u'486', 'year': u'1595'}, 
{'count': u'470', 'year': u'1593'}, 
{'count': u'433', 'year': u'1609'}, 
{'count': u'429', 'year': u'1607'}, 
{'count': u'421', 'year': u'1611'}, 
{'count': u'399', 'year': u'1592'}, 
{'count': u'363', 'year': u'0'}, 
{'count': u'353', 'year': u'1594'}, 
{'count': u'287', 'year': u'1609'}, 
{'count': u'106', 'year': u'0'}, 
{'count': u'57', 'year': u'1609'}] 

Credo proprio quello che ti serve. Utilizzare solo json e fare un json.dumps per la risposta e il gioco è fatto.

+1

C'è un errore di battitura = [] dovrebbe essere response = [] –

+1

@KG Grazie. Ho corretto. – andrefsp

4

È possibile convertire facilmente oggetti Python in oggetti JSON e viceversa utilizzando il modulo json. Fondamentalmente ci sono solo 2 classi: JSONEncoder e JSONDecoder: il primo trasforma le collezioni Python in stringhe JSON, la seconda una stringa JSON in un oggetto Python.

Esempi:

from json import JSONEncoder 

jsonString = JSONEncoder().encode({ 
    "count": 222, 
    "year": 2012 
}) 

il codice di cui sopra genererà una stringa JSON da un dizionario Python

from json import JSONDecoder 

pyDictionary = JSONDecoder().decode('{"count": 222, "year": 2012}') 

il codice qui sopra genererà un dizionario Python da una stringa JSON

0

Versione 0.28.0 e in seguito di google-cloud-bigquery library utilizzare una classe per analizzare le righe da una tabella o query.

Per esempio per stampare i risultati di una query con uno schema

[ 
    { 
     u'type': u'STRING', 
     u'name': u'word', 
     u'mode': u'NULLABLE' 
    }, 
    { 
     u'type': u'INTEGER', 
     u'name': u'word_count', 
     u'mode': u'NULLABLE' 
    }, 
    { 
     u'type': u'INTEGER', 
     u'name': u'corpus_date', 
     u'mode': u'NULLABLE' 
    }, 
] 

come nel tuo esempio, si potrebbe fare

query = client.query('...') 
rows = query.result() 
for row in rows: 
    # Access by column index. 
    print('word: {}'.format(row[0])) 
    # Access by column name. 
    # The library parses the result into an integer object, 
    # based on the schema. 
    print('word_count: {}'.format(row['word_count'])) 
    # Access by column name, like an attribute. 
    print('corpus_date: {}'.format(row.corpus_date)) 

Nella versione 0.29.0 (non ancora rilasciato come di 2017- 12-04), ci saranno metodi per keys(), values(), items() e get(), proprio come un oggetto dizionario incorporato. (Aggiunto in PR #4393) Così, per convertire le righe da un dizionario JSON-come in 0.29.0:

query = client.query('...') 
rows = query.result() 
for row in rows: 
    row_json = dict(row.items())