将API调用应用于大型数据帧时出现问题?

时间:2017-01-09 17:08:10

标签: python python-3.x pandas python-requests python-multiprocessing

根据请求,我按如下方式调用API:

Decimal

我还有一个像这样的大型熊猫数据框:

def foo(input):

    payload = {'key': '', 'in': input ,'fj': 'm'}

    r = requests.get('https://api.example.com/api', params=payload)
    res = json.loads(r.input)
    return res

然后我想把它应用到一个大型的pandas数据帧,然后我试着:

    ColA
0   The quick  fox jumps over the lazy 
1   The quick  fox  over the lazy dog
2   The quick brown fox jumps over the lazy dog
....

n   The  brown fox jumps over the  dog

通过上述方法,它永远不会完成。因此,我尝试了这个:

df['result'] = df[['ColA']].apply(foo, axis=1)

问题是API没有收到任何东西,而且,我得到以下异常:

df['result'] = df['ColA'].apply(foo)

或者我试着:

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我仍然有同样的问题。有没有想过如何有效地将pandas列传递给api?。

更新

尝试使用多处理后,我注意到我有一个docs = df['ColA'].values.tolist() list(map(foo, docs)) 错误。因此,我猜这种情况与Caching issue有关,所以我的问题是,如果这与缓存有关,我该如何解决这个问题呢?

更新2

JSONDecodeError: Expecting value: line 1 column 1 (cchar 0)

1 个答案:

答案 0 :(得分:1)

受到the @GauthierFeuillen answer的启发,我想让它更适合熊猫友善:

import pandas as pd
from multiprocessing import Pool
import requests

url='https://api.example.com/api'

df = pd.read_csv("data.csv")

def get_data(text, url=url):
    r = requests.get(url,
                     params={'key': '<YOUR KEY>',
                             'in': text
                             'fj': 'm'})
    if r.status_code != requests.codes.ok:
        return np.nan
    return r.text

if __name__ == '__main__':
    p = Pool(5)
    # get data/response only for _unique_ strings (parameters)
    rslt = pd.Series(p.map(get_data, df['ColA'].unique().tolist()),
                     index=df['ColA'].unique())
    # map responses back to DF (it'll take care of duplicates)
    df['new'] = df['ColA'].map(rslt)