2017-02-02 5 views
1

のmongoexportからのJSON配列をBeddit sleeptrackerのデータが含まれています。以下は、切り捨てられたドキュメントの1つの例です(不要な詳細を削除しました)。 thisthisなどのPandasを使用してPythonで埋め込み配列を埋め込んだネストJSON

{ 
     "user" : "xxx", 
     "provider" : "beddit", 
     "date" : ISODate("2016-11-30T23:00:00.000Z"), 
     "data" : [ 
      { 
       "end_timestamp" : 1480570804.26226, 
       "properties" : { 
        "sleep_efficiency" : 0.8772404, 
        "resting_heart_rate" : 67.67578, 
        "short_term_resting_heart_rate" : 61.36963, 
        "activity_index" : 50.51958, 
        "average_respiration_rate" : 16.25667, 
        "total_sleep_score" : 64, 
       }, 
       "date" : "2016-12-01", 
       "session_range_start" : 1480545636.55059, 
       "start_timestamp" : 1480545636.55059, 
       "session_range_end" : 1480570804.26226, 
       "tags" : [ 
        "not_enough_sleep", 
        "long_sleep_latency" 
       ], 
       "updated" : 1480570805.25201 
      } 
     ], 
     "__v" : 0 
    } 

いくつかの関連の質問は、上記のデータ構造のために働くしていないようです。他の関連する質問で推奨されているように、パフォーマンス上の理由から各行をループすることを避けようとしています(完全なデータセットは〜150MBです)。 「データ」 -keyをjson_normalizeで平滑化すると、各のキーがトップレベルになります。私は1つのDataFrameを好むだろう。 total_sleep_scoreは列です。

ご協力いただきありがとうございます。 JavaScriptを使用してデータを「準備する」方法を知っていますが、Pythonを使って理解してやりたいと思います。

編集(好ましい構造を示すためのコメントからのリクエスト):

{ 
    "user" : "xxx", 
    "provider" : "beddit", 
    "date" : ISODate("2016-11-30T23:00:00.000Z"), 
    "end_timestamp" : 1480570804.26226, 
    "properties.sleep_efficiency" : 0.8772404, 
    "properties.resting_heart_rate" : 67.67578, 
    "properties.short_term_resting_heart_rate" : 61.36963, 
    "properties.activity_index" : 50.51958, 
    "properties.average_respiration_rate" : 16.25667, 
    "properties.total_sleep_score" : 64, 
    "date" : "2016-12-01", 
    "session_range_start" : 1480545636.55059, 
    "start_timestamp" : 1480545636.55059, 
    "session_range_end" : 1480570804.26226, 
    "updated" : 1480570805.25201, 
    "__v" : 0 
} 

「プロパティ」APPENDは必要ではありませんが、いいだろう。

+0

あなたはデータがどのように見えるべきかの例を提供することはできますか? – Kie

+0

元の投稿を編集しました。 – martwetzels

+0

このJSON-Objectの書式を常に同じにすると、オブジェクトをループさせたくない場合は、JSONに変換して文字列を操作して文字列を操作できます。しかし、それがより良いパフォーマンスを発揮するかどうかはわかりません。 – Kie

答えて

0

平坦化のためにこのアルゴをお試しください: -

def flattenPattern(pattern): 
    newPattern = {} 
    if type(pattern) is list: 
     pattern = pattern[0] 

    if type(pattern) is not str: 
     for key, value in pattern.items(): 
      if type(value) in (list, dict): 
       returnedData = flattenPattern(value) 
       for i,j in returnedData.items(): 
         if key == "data": 
          newPattern[i] = j 
         else: 
          newPattern[key + "." + i] = j 
      else: 
       newPattern[key] = value 


    return newPattern 


print(flattenPattern(dictFromJson)) 


OutPut:- 
{ 
    'session_range_start':1480545636.55059, 
    'start_timestamp':1480545636.55059, 
    'properties.average_respiration_rate':16.25667, 
    'session_range_end':1480570804.26226, 
    'properties.resting_heart_rate':67.67578, 
    'properties.short_term_resting_heart_rate':61.36963, 
    'updated':1480570805.25201, 
    'properties.total_sleep_score':64, 
    'properties.activity_index':50.51958, 
    '__v':0, 
    'user':'xxx', 
    'provider':'beddit', 
    'date':'2016-12-01', 
    'properties.sleep_efficiency':0.8772404, 
    'end_timestamp':1480570804.26226 
} 
+0

これは私に 'AttributeError:' unicode 'オブジェクトに属性' items ''エラーがありません。 – martwetzels

+0

@martwetzels、私はあなたがjsonをこの関数に直接渡していると思います。まず、jsonをx = json.loads(あなたのjson文字列)のような変数にロードします。その後、これは動作します。私の変数名dictFromJsonを見れば、それはjsonからのdictオブジェクトを示します。 –

0

私は次のようにこれまで私のために働いた、を求めていない明示的に何が:

ステップ1

データレコードを正規化します元のデータセット(Pandas DataFrame内ではない)でjson_normalizeを使用し、データの前に接頭辞を付けます。これらは.apply(pd.Series)で 'フォーマット' することができるようにレコードがdictsと直列た

beddit_data = pd.io.json.json_normalize(beddit, record_path='data', record_prefix='data.', meta='_id') 

ステップ2

特性

beddit_data_properties = beddit_data['data.properties'].apply(pd.Series) 

ステップ3

最終ステップでは、両方のDataFramesをマージします。ステップ1では、DataFrameをBeditの元のDataFrameとマージできるように、 'meta = _id'を保持しました。私はこれまでの結果の結果にある程度の時間を費やすことができるので、最終ステップにはまだ含まれていませんでした。

beddit_final = pd.concat([beddit_data_properties[:], beddit_data[:]], axis=1) 

誰もが興味を持っている場合、それは準備ができたとき、私は最終的Jupyterノートブックを共有することができますが:)

関連する問題