2013-08-28 56 views
1

我想創建一個CSV文件,將來自多個API調用的數據組合起來。我對基本的Python沒問題,我可以調用API,提取JSON數據,並將數據寫入CSV。我需要幫助的地方是高效合併數據,以便在數據提取完成後將其寫入CSV。如何使用Python中的多個API調用返回的數據構建CSV?

這就是數據看起來就像直接從API請求:

{u'dateTime': u'2011-03-28', u'value': u'2298'}, 
{u'dateTime': u'2011-03-29', u'value': u'2322'}, 
{u'dateTime': u'2011-03-30', u'value': u'2309'}, 
{u'dateTime': u'2011-03-31', u'value': u'2224'}, 
{u'dateTime': u'2011-04-01', u'value': u'2763'}, 
{u'dateTime': u'2011-04-02', u'value': u'3543'}, 

所以我會看很多合併這一起:

>APICALL1 
2011-03-28,2298 
2011-03-29,2322 
2011-03-30,2309 

>APICALL2 
2011-03-28,432 
2011-03-29,0 
2011-03-30,444 

每個API調用的結果看起來很漂亮非常相似:日期和價值。日期總是格式相同,所以這是我們的共同元素。

對於給定的日期和值,可能沒有值或0返回,所以我需要能夠說明沒有數據的情況。

理想的輸出會是這個樣子:

2011-03-28,2298,432,23952,765,31 
2011-03-29,2322,0,432353,766,31 
2011-03-30,2309,444,2343923,0,32 
2011-03-31,2224,489,3495,765,33 

我有大約15電話要打,而每個返回響應包含近似800行數據(800天,基本上是由每天1排成長進入未來)。我需要每天運行幾次,所以我在一定程度上關注效率,因爲這種增長越來越大。不幸的是,歷史數據可能會改變,所以我需要在每次運行命令時重建整個列表。但是,歷史數據很少發生變化,只有很小的百分比變化,所以如果只有更新數據纔有效率,我願意接受。

我知道我可以做的一個選擇是從第一個API調用中將所有內容寫入CSV文件,然後重新打開文件併爲每個後續調用寫入更多數據到CSV(即15個單獨的讀取和每個程序執行寫入CSV)。這對我來說聽起來不太有效。

我應該在內存中使用SQLite來構建數據集,然後在最後將其轉儲爲CSV嗎?列表清單是否更好?我對SQL不太瞭解,儘管如果這是正確的路,我確實知道這很危險。

回答

0

您可以使用pandas庫。

import sys 
import pandas as pd 

# Simulation of return values from the calls 
calls = [ 
    [ 
     {u'dateTime': u'2011-03-28', u'value': u'2298'}, 
     {u'dateTime': u'2011-03-29', u'value': u'2322'}, 
     {u'dateTime': u'2011-03-30', u'value': u'2309'}, 
    ], 
    [ 
     {u'dateTime': u'2011-03-28', u'value': u'28'}, 
     {u'dateTime': u'2011-03-29', u'value': u'22'}, 
     {u'dateTime': u'2011-03-30', u'value': u'09'}, 
    ] 
] 

# Create an initial empty data frame 
df = pd.DataFrame() 
# Make the consecutive calls 
for i, call in enumerate(calls): 
    # Create the new DataFrame from the data you got 
    df_new = pd.DataFrame(call).set_index('dateTime') 
    # Rebane the column to avoid collision 
    df_new.rename(columns={'value': 'value_%s' % i}, inplace=True) 
    # Merge it with the current data frame 
    df = pd.concat([df, df_new], axis=1) 
# Save data to file (I'm using here the sys.stdout, just 
# to print it to console. 
df.to_csv(sys.stdout, header=None) 

結果:

2011-03-28,2298,28 
2011-03-29,2322,22 
2011-03-30,2309,09 
+0

謝謝Viktor!我跑了你的確切代碼,我得到:「引發異常('項目名稱重疊')」。我相信原因是兩個JSON響應都使用'value'作爲索引名稱。如果我在第二個調用響應中將索引名稱更改爲'value2',則代碼有效。有沒有辦法處理這個熊貓內部問題,還是應該在使用pd之前仔細研究數據? – briancl

+0

@ user2726872您可以通過重命名該列來處理它。我更新了代碼。由於新版本可以處理重複名稱,因此您可能會使用真正舊版本的熊貓。 –

+0

我現在收到一個'inplace'是關鍵字的錯誤。我的問題一定是老大熊貓。我從Ubuntu的倉庫安裝了'python-pandas',這個倉庫一定很舊。我將更新熊貓而不是修復過時的代碼。謝謝您的幫助! – briancl

0

這聽起來像一個數據庫(如SQLite的)工作。創建一個包含第一列的表格作爲每個API的日期和一列。在API列中允許NULL。

然後,對於每個API,讀取數據並更新/插入(upsert)指定日期的那一列。這可以完全獨立於CSV一代。

一旦數據在數據庫中,生成一個CSV應該是微不足道的。

使用日期列上的索引更新歷史數據會容易得多。

相關問題