代码之家  ›  专栏  ›  技术社区  ›  Tasos

同时应用于多行

  •  2
  • Tasos  · 技术社区  · 7 年前

    import http.client, urllib.request, urllib.parse, urllib.error, base64
    import pandas as pd
    import json
    
    headers = {
        # Request headers
        'Content-Type': 'application/json',
        'Ocp-Apim-Subscription-Key': 'my-api-key-goes-here',
    }
    
    params = urllib.parse.urlencode({
    })
    
    df = pd.read_csv('mydata.csv',names=['id','text'])
    
    def call_api(row):
        try:
            body = {
              "documents": [
                    {
                        "language": "en",
                        "id": row['id'],
                        "text": row['text']
                    }
                ]
            }
            conn = http.client.HTTPSConnection('api-url')
            conn.request("POST", "api-endpoint" % params, str(body), headers)
            response = conn.getresponse()
            data = response.read()
            data = json.loads(data)
            return data['documents'][0]['score']
            conn.close()
        except Exception as e:
            print("[Errno {0}] {1}".format(e.errno, e.strerror))
    
    
    df['score'] = df.apply(call_api,axis=1)
    

    body['documents'] 列表。

    返回的数据遵循此架构:

    {
      "documents": [
        {
          "score": 0.92,
          "id": "1"
        },
        {
          "score": 0.85,
          "id": "2"
        },
        {
          "score": 0.34,
          "id": "3"
        }
      ],
      "errors": null
    }
    

    所以,我要找的是应用相同的api调用,不是逐行,而是每次100行的批处理。在Pandas中有没有什么方法可以做到这一点,或者我应该迭代dataframe行,自己创建批处理,然后再次迭代以在新列上添加返回值?

    1 回复  |  直到 7 年前
        1
  •  2
  •   John Zwinck    7 年前

    DataFrame.apply()

    df.to_dict('records')
    

    然后你只需要把它分成100块:

    start = 0
    while start < len(df):
        documents = df.iloc[start:start+100].to_dict('records')
        call_api(documents)
        start += 100
    

    最后,您可以使用一个HTTP会话 requests 图书馆:

    import requests
    session = requests.Session()
    call_api(session, documents)
    

    call_api() 你知道吗 session.post(...) . 这比每次建立一个新连接更有效。