2

複数の 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 日あたり 1 行ずつ増加します)。これを1日に数回実行する必要があるため、これが大きくなると効率がある程度心配になります。残念ながら、履歴データは変更される可能性があるため、コマンドを実行するたびにリスト全体を再構築する必要があります。ただし、履歴データはめったに変更されず、わずかな割合でしか変更されないため、データを更新するだけで効率が向上する場合は、それを受け入れます。

私が作業できることがわかっているオプションの 1 つは、最初の API 呼び出しからすべてを CSV ファイルに書き込んでから、ファイルを再度開き、後続の呼び出しごとに CSV にさらにデータを書き込むことです (つまり、CSV への 15 回の個別の読み取りと書き込み)。プログラムの実行ごと)。それは私にはあまり効率的ではないように思えます。

データセットを構築するためにメモリ内でSQLiteを使用し、最後にCSVにダンプする必要がありますか? リストのリストの方が優れていますか? 私は SQL に強いわけではありませんが、それが正しい方法である場合に危険であることは十分承知しています。

4

2 に答える 2

0

これは、データベース (SQLite など) の仕事のように思えます。最初の列が日付で、API ごとに 1 つの列を持つテーブルを作成します。API 列で NULL を許可します。

次に、各 API について、データを読み取り、指定された日付のその 1 つの列だけを更新/挿入 (アップサート) します。これは、CSV 生成から完全に独立している可能性があります。

データがデータベースに入ると、CSV の生成は簡単になります。

日付列のインデックスを使用すると、履歴データの更新がはるかに簡単になります。

于 2013-08-28T20:42:31.680 に答える
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
于 2013-08-28T20:39:14.540 に答える