API-интерфейс SmartyStreets проходит через фрейм данных - PullRequest
1 голос
/ 08 января 2020

Я довольно новичок в Python и работаю с SmartyStreets API. Я пытаюсь прочитать в фрейме данных, который содержит адреса и просто проверить их. Тем не менее, я сталкиваюсь с проблемами и не дает никаких результатов. Приведенный ниже код должен просто выводить операторы print в конце для каждой строки во фрейме данных.

Я бы хотел, чтобы функция получала имена своих переменных из столбцов во фрейме данных, который содержит правильная информация.

Например: при чтении данных функция должна получить свою адресную переменную из столбца Street1. Аналогично, Город должен быть из столбца Город, Штат из штата и Почтовый индекс из почтового индекса.

Таким образом, для первой итерации функция должна хранить переменные следующим образом:

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

Конечная цель будет заключаться в том, чтобы добавить в конец каждой строки столбец округа с соответствующим округом из API. Однако я не могу заставить это работать без ошибок. Любая помощь будет полезна. При необходимости вы можете получить бесплатный API-ключ на 250 вызовов в месяц на веб-сайте SmartyStreets. Код, который я включил, взят из примеров на 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')

1 Ответ

1 голос
/ 08 января 2020

Насколько я могу судить, есть несколько проблем. Во-первых, ваш словарь называет первый столбец «Steet1», но это должен быть «Street1». Во-вторых, я считаю, что это не правильное использование приложения. Если вы хотите сделать что-то подобное, я предлагаю следующие изменения.

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

Попробуйте, дайте мне знать, если это что-то исправит. Кроме того, здесь, поскольку вы просто печатаете вещи с помощью функции run, вы можете просто l oop завершить с помощью for для l oop и вызвать функцию, не обязательно нужно использовать apply, но это говорит о том, что должно работать.

...