2016-04-05 12 views
3

時系列通貨データを返すWeb APIからJSON応答を読み込んでいますが、通貨のみを分離して平均計算を実行できる必要がありますそれらの上に。Python/PandasライブラリでJSON応答からデータを解析するときに問題が発生する

APIの戻り値:

          rates 
2016-03-01 {u'USD': 0.66342297, u'AUD': 0.92449052} 
2016-03-02 {u'USD': 0.66676313, u'AUD': 0.91501037} 
2016-03-03 {u'USD': 0.67240633, u'AUD': 0.914753} 
2016-03-04 {u'USD': 0.68185522, u'AUD': 0.91650478} 
2016-03-05 {u'USD': 0.68185522, u'AUD': 0.91650478} 
2016-03-06 {u'USD': 0.68073566, u'AUD': 0.91793187} 
2016-03-07 {u'USD': 0.6794346, u'AUD': 0.90979962} 
2016-03-08 {u'USD': 0.67392847, u'AUD': 0.90683613} 
2016-03-09 {u'USD': 0.66438164, u'AUD': 0.88859516} 
2016-03-10  {u'USD': 0.66666, u'AUD': 0.89461305} 
2016-03-11 {u'USD': 0.67452488, u'AUD': 0.89174887} 
2016-03-12 {u'USD': 0.67452488, u'AUD': 0.89174887} 
2016-03-13 {u'USD': 0.67358755, u'AUD': 0.89251092} 
2016-03-14 {u'USD': 0.6667529, u'AUD': 0.88783949} 
2016-03-15 {u'USD': 0.66084856, u'AUD': 0.88557738} 
2016-03-16 {u'USD': 0.67423336, u'AUD': 0.89318458} 
2016-03-17 {u'USD': 0.68315297, u'AUD': 0.89391181} 
2016-03-18 {u'USD': 0.67954772, u'AUD': 0.89359166} 
2016-03-19 {u'USD': 0.67983322, u'AUD': 0.89388959} 
2016-03-20 {u'USD': 0.67951586, u'AUD': 0.89439032} 
2016-03-21 {u'USD': 0.67690921, u'AUD': 0.892827} 
2016-03-22 {u'USD': 0.67500204, u'AUD': 0.88599621} 
2016-03-23 {u'USD': 0.67137479, u'AUD': 0.89131852} 
2016-03-24 {u'USD': 0.66980223, u'AUD': 0.89002584} 
2016-03-25 {u'USD': 0.6686168, u'AUD': 0.89045449} 
2016-03-26 {u'USD': 0.6686168, u'AUD': 0.89045449} 
2016-03-27 {u'USD': 0.66853276, u'AUD': 0.8903994} 
2016-03-28 {u'USD': 0.67270532, u'AUD': 0.89168637} 
2016-03-29 {u'USD': 0.68576241, u'AUD': 0.89832338} 
2016-03-30 {u'USD': 0.69112465, u'AUD': 0.90136407} 
2016-03-31 {u'USD': 0.69193139, u'AUD': 0.90265425} 

Pythonのコード:CSVから

urlread = url + api_id + '&start=' + startdate + '&end=' + enddate +   '&base=' + base + '&symbols=' + symbols + '&prettyprint=false' 
    print(urlread) 
    #Reads in response from URL 
    result = pd.read_json(urlread, orient="records") 
    #Removes Columns not required 
    del result['base'] 
    del result['license'] 
    del result['disclaimer'] 
    del result['start_date'] 
    del result['end_date'] 
    #del json['rates'] 
    #Prints output of JSON to screen for troubleshooting, can be commented out 
    print(result) 
    #Writes JSON output to CSV file and formats Date and Removes Headers 
    with open("Historical.csv", "w") as output: 
     result.to_csv(output, date_format='%d/%m/%Y', header = None) 

出力:

1/03/2016 {u'USD': 0.6634229700000001, u'AUD': 0.92449052} 
2/03/2016 {u'USD': 0.66676313, u'AUD': 0.9150103700000001} 
3/03/2016 {u'USD': 0.67240633, u'AUD': 0.9147529999999999} 
4/03/2016 {u'USD': 0.68185522, u'AUD': 0.91650478} 
5/03/2016 {u'USD': 0.68185522, u'AUD': 0.91650478} 
6/03/2016 {u'USD': 0.68073566, u'AUD': 0.91793187} 
7/03/2016 {u'USD': 0.6794346, u'AUD': 0.90979962} 
8/03/2016 {u'USD': 0.67392847, u'AUD': 0.9068361300000001} 
9/03/2016 {u'USD': 0.66438164, u'AUD': 0.88859516} 
10/03/2016 {u'USD': 0.66666, u'AUD': 0.89461305} 

だから、それだけで出力をダンプだと私はそれを解析することができないようJSONの書式を削除します。実際には、私はcsvにダンプする前にすべての通貨を平均化する必要があります。それをどうすれば実現できますか?

+0

'json'の有効なサンプルを追加できますか? – jezrael

+0

JSONはありません。Python(2)辞書の表現です。これでJSONパーサーが失敗します。 –

+0

私はそれがjsonではないと思いますが、 'print(result)' – jezrael

答えて

1

は、私はあなたがDataFrame constructorを使用することができると思う:あなたは、with openの属性を省略してもかまいませto_csvを書きたい場合は

result = result.drop(['base','license','disclaimer','start_date','end_date'], axis=1) 

print result 
               rates 
2016-03-01 {u'USD': 0.66342297, u'AUD': 0.92449052} 

result = pd.DataFrame([x for x in result.rates], index=result.index) 
print result 
       AUD  USD 
2016-03-01 0.924491 0.663423 

代わりdelのおdropを使用することができます

result.to_csv("Historical.csv", date_format='%d/%m/%Y', header = None) 
+0

どうしますか? – jezrael

+0

パーフェクト、あなたのおかげで、それはまさに私が必要としていたものです。私はパンダがすでにそれをPythonの辞書に読み込んでいたことに気付かなかった。それをデータフレームに入れて問題を解決し、必要に応じてデータを変換できるようになりました –

0

天才! 、

これは私が立ち往生したものです。実際にはPython Dictを印刷していて、未処理のJSONは印刷していなかったことに気がつきませんでした。

jezrael - 新しいDataframeを作成したあなたの答えは、tipeがdropを使用してopenを省略することにも感謝しています。今よく見える。

私は今、各列の平均を取得し、必要な形式でcsvに出力する新しいデータフレームを構築することができました。

ありがとうございました - 問題解決済み!

関連する問題