Сравнение двух наборов атрибутов из двух наборов данных и обновление третьего набора данных совпадениями

У меня есть пара вопросов о моем коде. Во-первых, у меня возникают проблемы с моими сверхвложенными циклами for, а во-вторых, есть ли у кого-нибудь советы по улучшению моего кода в целом.

Я пытаюсь написать код, который нормализует небольшой набор пространственных данных (inputD) путем сравнения столбцов из него и огромного набора эталонных данных, называемых refD, а затем возвращает возможные совпадения в новой таблице, называемой «соответствия». Сравниваемые поля:

refDs latitude, refDs longitude, inputDs lat (которую я скопировал в список, inLat), inDs long (в другом списке, inLong),

Поле refDs "nameAttested" (формальное название местоположения), поле refDs "nameTransliterated" (ради этого кода, это одно или несколько альтернативных имен местоположения), inDs nameAtt (скопировано в список, inAtt), inDs nameTrans (скопировано в список, inTrans).

Итак, для тех из вас, кто считает, это четыре списка — по одному для каждого атрибута inputDs и четыре столбца в таблице, refDs, которые будут сравниваться. Во-первых, если координаты совпадают (в пределах 5 друг от друга), записи refDs и inputDs добавляются в новую таблицу «совпадает». Затем каждый из атрибутов имени необходимо сравнить дважды — refAtt с inAtt, refTrans с inAtt, refAtt с inTrans и refTrans с inTrans, и для каждого совпадения имени атрибут количества совпадений («mCount») получает += 1. Кроме того, некоторые поля nameTrans как в refD, так и в inD содержат 0 имен или более 1.

В приведенном ниже коде показано, как я работаю над вложенным курсором вставки для моей таблицы совпадений, который перебирает мои списки inLat и inLong, передавая их и refLat и refLong в функцию расстояния по большому кругу (которую я успешно добавил). Взглянем:

   # set variables
   lat1 = "reprLat"
   lon1 = "reprLong"
   lat2 = inLat
   lon2 = inLong
   refAtt = refDs.nameAttested
   refTrans = refDs.nameTransliterated

   # insertCursor for matches Table
    rows = arcpy.da.InsertCursor(matches, [lat1, lon1, lat2, lon2, refAtt, refTrans,"inAtt", 
    "inTrans", "mCount"])

    #searchcursor for refDs
    refCursor = arcpy.da.SearchCursor(refDs, ["reprLat", "reprLong"])


   for i in lat2:
       for x in lon2:
            for y in lat1:
                for z in lon1:
                    if great_circle(lon1[0], lat1[0], lon2[0], lat2[0]) <= 5:
                        rows.insertRow()
                        for x in inAtt:
                            for y in inTrans:
                                for z in refAtt:
                                    for i in refTrans:
                                        if textdistance.jaro(refAtt, inAtt) >= 0.45:
                                            mCount += 1
                                        elif textdistance.jaro(refAtt, inTrans) >= 0.45:
                                            mCount += 1
                                        elif textdistance.jaro(refTrans, inAtt) >= 0.45:
                                             mCount += 1
                                        elif textdistance.jaro(refTrans, inTrans) >= 0.45:
                                             mCount += 1

Я проверил первую часть (измерение расстояний), запустив ее в Juptyer с помощью простого, если ... ‹= 5, напечатать «да», иначе напечатать «нет». И независимо от числа, относительно которого я измерял расстояния (5, 20, 100, 1000), я получал либо все «да», либо все «нет». Так что я явно что-то не так делаю. Может ли кто-нибудь сказать мне, как исправить семантику этого раздела?

Кроме того, можно ли как-то сделать все это вложение... более элегантным? Я только начал учиться программировать в этом году, и я все еще учусь многим базовым вещам и делаю элементарные ошибки.

Заранее спасибо.


person Andrea    schedule 15.05.2020    source источник