Почему я получаю сообщение об ошибке, когда я анализирую данные, но не в одной строке? - PullRequest
2 голосов
/ 12 октября 2019

Впервые на питоне. Я работаю с библиотекой pygeocodio в python

API_KEY = "myapikey"

from geocodio import GeocodioClient

client = GeocodioClient(API_KEY)


addresses = client.geocode("21236 Birchwood Loop, 99567, AK")
addresses.best_match.get("accuracy")
Out[61]: 1

addresses.best_match.get("accuracy_type")
Out[62]: 'rooftop'

Однако, если я хочу перебрать кадр данных (example.csv):

import pandas as pd
customers = pd.read_csv("example.csv")

for row in customers.iterrows():
    addresses = client.geocode(row)
    addresses.best_match.get("accuracy")

Я получаю ошибку:

  File "C:\Users\jtharian\AppData\Local\Continuum\anaconda3\lib\site-packages\geocodio\client.py", line 58, in error_response
    raise exceptions.GeocodioDataError(response.json()["error"])

GeocodioDataError: Could not geocode address. Postal code or city required.

представьте example.csv:

21236 Birchwood Loop, 99567, AK
1731 Bragaw St, 99508, AK
300 E Fireweed Ln, 99503, AK
4360 Snider Dr, 99654, AK
1921 W Dimond Blvd 108, 99515, AK
2702 Peger Rd, 99709, AK
1651 College Rd, 99709, AK
898 Ballaine Rd, 99709, AK
23819 Immelman Circle, 99567, AK
9750 W Parks Hwy, 99652, AK
7205 Shorewood Dr, 99645, AK

Почему я получаю эту ошибку?

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

Глядя на api docs , вы хотите одну строку, представляющую адрес из ваших столбцов отдельных компонентов адреса, например:

location = client.geocode("1109 N Highland St, Arlington VA")

Таким образом, чтобы получить такой столбец вВ df вы можете отобразить каждый вектор в строку, а затем использовать простую конкатенацию строк, чтобы создать единственную строку, которая затем будет вставлена ​​в новую серию в вашем df:

import pandas as pd

customers = pd.read_csv("example.csv", header=None)
customers['address_string'] = customers[0].map(str) + ' ' + customers[1].map(str) + customers[2].map(str)

Производить:

# >>> customers['address_string']
# 0       21236 Birchwood Loop 99567 AK
# 1             1731 Bragaw St 99508 AK
# 2          300 E Fireweed Ln 99503 AK
# 3             4360 Snider Dr 99654 AK
# 4     1921 W Dimond Blvd 108 99515 AK

Затем вы можете перебирать значения Строк адресных строк и сохранять точность в списке, который можно вставить в ваш df:

geocoded_acuracy = []
geocoded_acuracy_type = []

for address in customers['address_string'].values:
    geocoded_address = client.geocode(address)
    accuracy = geocoded_address.best_match.get("accuracy")
    accuracy_type = geocoded_address.best_match.get("accuracy_type")

    geocoded_acuracy.append(accuracy)
    geocoded_acuracy_type.append(accuracy_type)

customers['accuracy'] = geocoded_acuracy
customers['accuracy_type'] = geocoded_acuracy_type

results = customers[['address_string', 'accuracy', 'accuracy_type']]

Результаты df будет выглядеть следующим образом:

# >>> results
#                      address_string  accuracy        accuracy_type
# 0     21236 Birchwood Loop 99567 AK      1.00              rooftop
# 1           1731 Bragaw St 99508 AK      1.00              rooftop
# 2        300 E Fireweed Ln 99503 AK      1.00              rooftop
# 3           4360 Snider Dr 99654 AK      1.00  range_interpolation
# 4   1921 W Dimond Blvd 108 99515 AK      1.00              rooftop
# 5            2702 Peger Rd 99709 AK      1.00              rooftop
# 6          1651 College Rd 99709 AK      1.00              rooftop
# 7          898 Ballaine Rd 99709 AK      1.00              rooftop
# 8    23819 Immelman Circle 99567 AK      1.00              rooftop
# 9         9750 W Parks Hwy 99652 AK      0.33                place
# 10       7205 Shorewood Dr 99645 AK      1.00  range_interpolation

Затем, чтобы записать результаты df в .csv:

results.to_csv('results.csv')

Объединение всего этого приводит к следующему коду:

import pandas as pd
from geocodio import GeocodioClient

API_KEY = 'insert_your_key_here'

client = GeocodioClient(API_KEY)

customers = pd.read_csv("example.csv", header=None)
customers['address_string'] = customers[0].map(str) + ' ' + customers[1].map(str) + customers[2].map(str)

geocoded_acuracy = []
geocoded_acuracy_type = []

for address in customers['address_string'].values:
    geocoded_address = client.geocode(address)
    accuracy = geocoded_address.best_match.get("accuracy")
    accuracy_type = geocoded_address.best_match.get("accuracy_type")

    geocoded_acuracy.append(accuracy)
    geocoded_acuracy_type.append(accuracy_type)

customers['accuracy'] = geocoded_acuracy
customers['accuracy_type'] = geocoded_acuracy_type

results = customers[['address_string', 'accuracy', 'accuracy_type']]

results.to_csv('results.csv')
1 голос
/ 12 октября 2019

Я бы использовал apply и конкретные исключения и т. Д., Но сейчас я предполагаю, что пока новые только сосредоточиться на том, что работает и ошибки. Но когда вы познакомитесь с пандами и питоном, определенно изучите эти темы. 1009 *

errors, address_list, accuracy_list, accuracy_type_list = [], [], [], []
for index, row in customers.iterrows():
    try:
        addresses = client.geocode(row.values[0])
        accuracy = addresses.best_match.get("accuracy")
        accuracy_type = addresses.best_match.get("accuracy_type")

        address_list.append(addresses)
        accuracy_list.append(accuracy)
        accuracy_type_list.append(accuracy_type)
    except Exception as e:
        address_list.append(None)
        accuracy_list.append(None)
        accuracy_type_list.append(None)
        errors.append(f"failure {e.args[0]} at index {index}")

Что я делаю? iterrows предоставляет кортежи индекса и строк. Поэтому я геокодирую каждый элемент строки. Если это работает, я добавляю результаты в address_list. То же самое с точностью. Но когда это терпит неудачу, я добавляю сообщение в список ошибок, чтобы указать, где ошибка произошла в кадре данных;т.е. индекс. Но мне также нужен заполнитель в address_list, поэтому я просто добавляю None. Так что теперь я могу сделать

customers['addresses'] = address_list
customers['accuracy'] = accuracy_list
customers['accuracy_type'] = accuracy_type_list

и сохранить свой фрейм данных, если это необходимо. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html

...