根据请求,我按如下方式调用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)
答案 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)