gpt4 book ai didi

python - 如何从多个 API 调用更新 Pandas 数据框

转载 作者:行者123 更新时间:2023-12-03 14:31:37 24 4
gpt4 key购买 nike

我需要做一个python脚本来

  • 读取包含列(person_idnameflag)的 csv 文件。该文件有 3000 行。
  • 基于person_id从 csv 文件,我需要调用一个 URL 传递 person_id做一个 GET
    http://api.myendpoint.intranet/get-data/1234
    URL会返回person_id的一些信息,例如下面的示例。我需要获取所有租金对象并保存在我的 csv 中。我的输出需要是这样的

  • import pandas as pd
    import requests

    ids = pd.read_csv(f"{path}/data.csv", delimiter=';')
    person_rents = df = pd.DataFrame([], columns=list('person_id','carId','price','rentStatus'))

    for id in ids:
    response = request.get(f'endpoint/{id["person_id"]}')
    json = response.json()
    person_rents.append( [person_id, rent['carId'], rent['price'], rent['rentStatus'] ] )
    pd.read_csv(f"{path}/data.csv", delimiter=';' )
    person_id;name;flag;cardId;price;rentStatus
    1000;Joseph;1;6638;1000;active
    1000;Joseph;1;5566;2000;active
    响应示例
    {
    "active": false,
    "ctodx": false,
    "rents": [{
    "carId": 6638,
    "price": 1000,
    "rentStatus": "active"
    }, {
    "carId": 5566,
    "price": 2000,
    "rentStatus": "active"
    }
    ],
    "responseCode": "OK",
    "status": [{
    "request": 345,
    "requestStatus": "F"
    }, {
    "requestId": 678,
    "requestStatus": "P"
    }
    ],
    "transaction": false
    }
  • 从 csv 的响应中保存附加数据后,我需要使用 URL 上的 carId 从另一个端点获取数据。里程结果必须保存在同一个csv中。
    http://api.myendpoint.intranet/get-mileage/6638
    http://api.myendpoint.intranet/get-mileage/5566

  • 每次调用的返回将是这样的
    {"mileage":1000.0000}
    {"mileage":550.0000}
    最终输出必须是
    person_id;name;flag;cardId;price;rentStatus;mileage
    1000;Joseph;1;6638;1000;active;1000.0000
    1000;Joseph;1;5566;2000;active;550.0000
    有人可以帮我写这个脚本吗?
    可以与 pandas 或任何 python 3 库一起使用。

    最佳答案

    代码说明

  • 创建数据框,df , 与 pd.read_csv .
  • 预计 'person_id' 中的所有值, 是独一无二的。

  • 使用.apply'person_id' , 调用prepare_data .
  • prepare_data预计 'person_id'成为 strint ,如类型注释所示,Union[int, str]

  • 调用API ,这将返回 dict , 到 prepare_data功能。
  • 转换 'rents' dict 中的关键, 到一个数据框中,带有 pd.json_normalize .
  • 使用.apply'carId' , 调用API , 并提取 'mileage' , 添加到数据框 data ,作为一列。
  • 添加 'person_id'data , 可用于合并 dfs .
  • 转换 pd.Series , s到一个数据框,带有 pd.concat ,然后是 merge dfs , 在 person_id .
  • 使用 pd.to_csv 保存到 csv以所需的形式。

  • 潜在问题
  • 如果有问题,最有可能发生在 call_api功能。
  • 只要call_api返回 dict ,就像问题中显示的响应一样,代码的其余部分将正常工作以产生所需的输出。

  • import pandas as pd
    import requests
    import json
    from typing import Union

    def call_api(url: str) -> dict:
    r = requests.get(url)
    return r.json()

    def prepare_data(uid: Union[int, str]) -> pd.DataFrame:

    d_url = f'http://api.myendpoint.intranet/get-data/{uid}'
    m_url = 'http://api.myendpoint.intranet/get-mileage/'

    # get the rent data from the api call
    rents = call_api(d_url)['rents']
    # normalize rents into a dataframe
    data = pd.json_normalize(rents)

    # get the mileage data from the api call and add it to data as a column
    data['mileage'] = data.carId.apply(lambda cid: call_api(f'{m_url}{cid}')['mileage'])
    # add person_id as a column to data, which will be used to merge data to df
    data['person_id'] = uid

    return data


    # read data from file
    df = pd.read_csv('file.csv', sep=';')

    # call prepare_data
    s = df.person_id.apply(prepare_data)

    # s is a Series of DataFrames, which can be combined with pd.concat
    s = pd.concat([v for v in s])

    # join df with s, on person_id
    df = df.merge(s, on='person_id')

    # save to csv
    df.to_csv('output.csv', sep=';', index=False)
  • 如果运行此代码时出现任何错误:
  • 发表评论,让我知道。
  • edit您的问题,并粘贴整个 TraceBack ,作为文本,放入代码块中。


  • 例子
    # given the following start dataframe
    person_id name flag
    0 1000 Joseph 1
    1 400 Sam 1

    # resulting dataframe using the same data for both id 1000 and 400
    person_id name flag carId price rentStatus mileage
    0 1000 Joseph 1 6638 1000 active 1000.0
    1 1000 Joseph 1 5566 2000 active 1000.0
    2 400 Sam 1 6638 1000 active 1000.0
    3 400 Sam 1 5566 2000 active 1000.0

    关于python - 如何从多个 API 调用更新 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64127158/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com