所以这可能看起来是一个奇怪的问题,但我有一个 pandas
DataFrame
,里面有地址,我想对其进行地理编码,这样我就可以获得纬度和经度。
我有使用
.apply()
工作的代码,这要归功于这个非常有用的线程(使用 geopy pandas 的坐标新列),但我的问题是所有开放 API 对每秒允许的请求数都有严格的限制,还有每天的请求。
我还没有找到任何方法来限制我的代码,因此符合 API 的限制。我的 DF 有 25K 行,但只有在创建最多 5 行的子集时,我才能成功进行地理编码。
我对 python 和 pandas 没有太多经验,但在 SAS 中,DATA 步骤一次迭代一行,因此我可以使用 sleep 命令来限制请求。使用 python/pandas 实现类似功能的最佳方法是什么?
编辑:所以根据到目前为止的答案,我想确认,我的代码将从:
df_small['city_coord'] = df_small['Address'].apply(geolocator.geocode).apply(lambda x: (x.latitude, x.longitude))
df_small = df_clean[:5]
def f(x, delay=1):
# run your code
sleep(delay)
return geolocator.geocode(x)
df_small['city_coord'] = df_small['Address'].apply(f).apply(lambda x: (x.latitude, x.longitude))
df.iterrows()
和 time.sleep()
:
from time import sleep
for row in df.iterrows():
# run your code
sleep(1) # how many seconds to wait
或者您可以将
time.sleep()
放在 apply
函数本身中(如 @RafaelC 在评论中建议的那样):
def f(x, delay=1):
# run your code
sleep(delay)
df.apply(f)
我遇到了类似的问题,但批准的解决方案对我不起作用,因为我想拨打一批电话并等待不同的时间,而不仅仅是在通话之间等待一秒钟。假设您每分钟发送的电子邮件不超过 5 封。您可以采用上述批准的应答方法,方法是除以每分钟的呼叫次数,然后在每次呼叫之间休眠那么多秒。在这种情况下,您的函数每次都会休眠 12 秒 (60/5 = 12)。
为了我的目的(也可能是其他人的目的),我想发送所有 5 个请求,然后稍等一下。在这种情况下,您可以在可执行代码后附加一个 if 语句,该语句检查您的索引模您的间隔是否为零。您可能需要设置为从 1 开始才能工作(如果尚未设置):
df.index = range(1, len(df) + 1)
df(row, interval, time_delay):
# execute your code
if row.name % interval == 0:
sleep(time_delay)