【问题标题】:SmartyStreets API looped across a data frameSmartyStreets API 在数据帧中循环
【发布时间】:2020-04-26 07:58:30
【问题描述】:

我对 Python 还很陌生,并且正在使用 SmartyStreets API。我正在尝试读取包含地址的数据框并简单地验证它们。但是,我遇到了问题并且没有产生任何结果。下面的代码应该简单地在数据框中的每一行的末尾输出打印语句。

我希望该函数从包含正确信息的数据框中的列中获取其变量的名称。

例如: 读取数据时,该函数应该从 Street1 列中获取其地址变量。同样,City 应该来自 City 列,State 来自 state,Zipcode 来自 zipcode。

所以对于第一次迭代,函数应该按如下方式存储变量:

lookup.street = '1600 Amphitheatre Pkwy'
lookup.city = 'Mountain view"
lookup.state = 'CA'
lookup.zip = '94043'

最终目标是让它在每行末尾附加一个县列,其中包含来自 API 的正确县。但是,我无法让它在没有错误的情况下运行。任何帮助都会有所帮助。如果需要,您可以从 SmartyStreets 网站获取每月 250 次调用的免费 API 密钥。我包含的代码来自 github 上的示例。这可能不是最有效的方法,如果您有更有效的编码方式,请随时将其包含在您的回复中。使用的代码和发现的错误如下所示。

import pandas as pd
from smartystreets_python_sdk import StaticCredentials, exceptions, ClientBuilder
from smartystreets_python_sdk.us_street import Lookup as StreetLookup

##Defines Dictionary
dict = {'Street1': ["1600 Amphitheatre Pkwy", "1 Infinite Loop", "1 Rosedale"],
        'City': ['Mountain view', 'Cupertino', 'Baltimore'],
        'State': ['CA', 'CA', 'MD'],
        'Zipcode': ['94043', '95014', '21237']}
##Converts Dictionary to Data Frame
df = pd.DataFrame(dict)

##Defines Function
def run(address = '', city = '', state = '', zipcode = ''):
    
    auth_id = 'ID HERE'
    auth_token = 'TOKEN HERE'
    
    credentials = StaticCredentials(auth_id, auth_token)
    
    client = ClientBuilder(credentials).build_us_street_api_client()
    
        
    lookup = StreetLookup()
    #lookup.input_id = '' ##Optional ID from your system
    #lookup.addressee = addressee
    lookup.street = address
    ##lookup.street2 = address2
    #lookup.secondary = secondary ##STE, Apartment, etc.
    #lookup.urbanization = '' ##PR Addresses ONLY
    lookup.city = city
    lookup.state = state
    lookup.zipcode = zipcode
    lookup.candidates = 1
    lookup.match = 'Invalid'

    try:
        client.send_lookup(lookup)
    except exceptions.SmartyException as err:
        print(err)
        return

    result = lookup.result

    if not result:
        print("No candidates. This means the address is not valid.")
        return

    first_candidate = result[0]

    print("Address is valid. (There is at least one candidate)\n")
    print("ZIP Code: " + first_candidate.components.zipcode)
    print("County: " + first_candidate.metadata.county_name)

    for c, candidate in enumerate(lookup.result):
        print("- {}: {}, {}, {}".format(c, candidate.delivery_line_1, candidate.last_line, candidate.metadata.county_name))

##Runs function     
df.apply(run(address = 'Street1',  city = 'City', state = 'State', zipcode = 'Zipcode'))

运行时出现以下错误:

TypeError: ("'NoneType' 对象不可调用", '发生在索引处 Steet1')

【问题讨论】:

  • 不太了解这个API,你的代码看起来还不错。能否提供出现此错误的行号?
  • 看起来像在第 321 行:文件“C:\Users\Name\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\apply.py”,第 321 行,在apply_series_generator results[i] = self.f(v) TypeError: ("'NoneType' object is not callable", 'occured at index Steet1') 如果去掉函数要求,使函数定义为 run(),并且你硬编码一个地址。在终端调用 run(),你会得到输出。所以它正确地调用了API。我的任务是调整给定的代码,使其适用于我的数据框函数。
  • 这里是我用来构建函数的原始代码的链接:github.com/smartystreets/smartystreets-python-sdk/blob/master/…
  • @Chris 既然您已经修复了错字,您是否仍然收到错误?现在是否发生了不同的错误?

标签: python pandas smartystreets


【解决方案1】:

据我所知,存在一些问题。首先,您的字典称第一列为“Steet1”,但应该是“Street1”。其次,我认为这不是 apply 的正确用法。如果您想做这样的事情,我建议进行以下更改。

def run(row):
    address = row['Street1']
    city = row['City']
    state = row['State']
    zipcode = row['Zipcode']
    ...
df.apply(run, axis = 1)

试试看,如果能解决问题,请告诉我。此外,由于您只是使用函数 run 打印内容,因此您可以使用 for 循环循环并调用该函数,不一定需要使用 apply,但这表示它仍然可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    相关资源
    最近更新 更多