gpt4 book ai didi

python - 如何使用 Python 优化大型数据集的 API 调用?

转载 作者:行者123 更新时间:2023-12-04 10:34:54 25 4
gpt4 key购买 nike

目标:将地址列表发送到 API 并提取某些信息(例如:指示地址是否位于洪水区的标志)。

解决方案:适用于小数据的 Python 脚本。

问题:我想针对大输入优化我当前的解决方案。如何提高 API 调用的性能。如果我有 100,000 个地址,我当前的解决方案会失败吗?这会减慢 HTTP 调用速度吗?我会收到请求超时吗? API 是否抵抗进行的 API 调用次数?

  • 输入:地址列表

示例输入

777 Brockton Avenue, Abington MA 2351

30 Memorial Drive, Avon MA 2322

我当前的解决方案适用于小型数据集。

# Creating a function to get lat & long of the existing adress and then detecting the zone in fema
def zonedetect(addrs):
global geolocate
geocode_result = geocode(address=addrs, as_featureset=True)
latitude = geocode_result.features[0].geometry.x
longitude = geocode_result.features[0].geometry.y
url = "https://hazards.fema.gov/gis/nfhl/rest/services/public/NFHL/MapServer/28/query?where=1%3D1&text=&objectIds=&time=&geometry="+str(latitude)+"%2C"+str(longitude)+"&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=*&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&resultOffset=&resultRecordCount=&queryByDistance=&returnExtentsOnly=false&datumTransformation=&parameterValues=&rangeValues=&f=json"
response = req.get(url)
parsed_data = json.loads(response.text)
formatted_data = json_normalize(parsed_data["features"])
formatted_data["Address_1"] = addrs

#Exception handling
if response.status_code == 200:
geolocate = geolocate.append(formatted_data, ignore_index = True)
else:
print("Request to {} failed".format(postcode))

# Reading every adress from existing dataframe
for i in range(len(df.index)):
zonedetect(df["Address"][i])

除了使用上面的 for 循环之外,还有一个替代方法。我可以批量处理这个逻辑吗?

最佳答案

hazards.fema.gov 服务器发送 100,000 个请求肯定会导致服务器速度变慢,但这主要会影响您的脚本,因为您需要等待每个 HTTP 请求排队和响应可能需要很长时间才能处理。

更好的方法是发送一个 REST 查询以获取您需要的所有内容,然后再处理逻辑。查看 REST API,您会发现 geometry URL 参数能够接受 geometryMultiPoint from the docs .下面是一个多点示例:

{
"points" : [[-97.06138,32.837],[-97.06133,32.836],[-97.06124,32.834],[-97.06127,32.832]],
"spatialReference" : {"wkid" : 4326}
}

所以你可以做的是创建一个对象来存储你想要查询的所有点:

multipoint = { points: [], spatialReference: { wkid: 4326}

当你循环时,将纬度/经度点附加到多点列表:

for i in range(len(df.index)):
address = df["Address"][i]
geocode_result = geocode(address=addrs, as_featureset=True)
latitude = geocode_result.features[0].geometry.x
longitude = geocode_result.features[0].geometry.y
multiPoint.points.append([latitude, longitude])

然后您可以在您的查询中将多点设置为几何,这样只会产生一个 API 请求,而不是每个点一个。

关于python - 如何使用 Python 优化大型数据集的 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60231193/

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