如何使用Python中的多个API调用返回的数据构建CSV?

时间:2013-08-28 20:29:38

标签: python api csv data-structures

我想构建一个组合来自多个API调用的数据的CSV文件。我对基本的Python没问题,我可以调用API,提取JSON数据,并将数据写入CSV。我需要帮助的地方是有效地合并数据,这样我就可以在数据提取完成后将其写入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并不擅长,尽管如果这是正确的方法,我知道它足够危险。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这听起来像是数据库的工作(如SQLite)。创建一个表,其中第一列为每个API的日期和一列。允许API列中的NULL。

然后,对于每个API,读取数据并更新/插入(upsert)指定日期的一列。这可以完全独立于CSV生成。

一旦数据在数据库中,生成CSV应该是微不足道的。

使用日期列上的索引更新历史数据会更容易。