У меня проблема с извлечением набора данных из API для целей отчетности, и, к сожалению, он имеет:
- Нет поля уникального идентификатора
- Три из четырех полей, которые Для составления уникального составного ключа используются каждый 32-битный га sh значений. Они не должны иметь значения ha sh, но, похоже, разработчик по какой-то причине хэшировал их в этой указанной c конечной точке API.
Я использую Python 3.7.6 и pandas 1.0.3. В конечном итоге данные окажутся на SQL сервере.
Для моей задачи я должен убедиться, что при вызове API REST я могу проверить уникальность записи и наличие обновлений в существующих записях. в моей базе данных используйте уникальный идентификатор, чтобы понять, какие строки нужно обновить.
Значения 32-битного га sh вызывают следующие проблемы:
При объединении 3 га sh полей (и одно поле даты и времени), которые образуют допустимый составной ключ, полученная строка слишком длинна для использования в качестве первичного ключа базы данных.
Кажется, что длина перегружена Pandas .duplicates()
функция (см., Например, ниже)
Я не знаю способ 'unha sh' их уникальный идентификатор (например, целое число), который я мог бы использовать для проверки существующих записей в базе данных, которые могут потребовать обновления. Как я могу преобразовать это длинное значение в действительный уникальный идентификатор, который будет одинаковым для любой строки ха sh значение, которое точно такое же?
Pandas включает pd.Factorize, который теоретически может быть использован для создания уникального идентификатора во вновь извлеченных данных, но тогда он не согласуется с ранее извлеченными данными, которые уже находятся в базе данных, поскольку он генерирует разные ключи для тех же хешей. Кроме того, аналогично факторизации # 2 также не работает точно, учитывая длину строки (см. Ниже).
Пожалуйста, найдите пример # 2 выше, где pandas .duplicates () завершается ошибкой. Я объединяю четыре составных ключа ha sh строк в pandas следующим образом:
df['id'] = (df['Question ID'].astype(str)+df['WorkflowInstance ID'].astype('str')+df['Agent ID'].astype('str')+df['Evaluation Start Date'].astype('str')).sort_values()
И затем делаю:
df['id'].duplicated().sum()
Я получаю 19 дубликатов:
Out[252]: 19
Вот эти «дубликаты» (примечание: я удалил номера строк данных из вывода):
Out[264]:
100094146736011ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05+11:00
101580231257511ea533b-5eb8-8bb1-a514-0242ac11000211e9e0ef-5ec7-3570-9724-0242ac1100052020-02-20 04:15:04+11:00
102935022988411ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05+11:00
103643806614811ea5122-ee46-6471-a514-0242ac11000211e9e0ef-62d2-f9b0-9724-0242ac1100052020-02-17 12:15:05+11:00
104448956250611ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03+11:00
104448956250611ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05+11:00
105036638204211ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05+11:00
105439525877511ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03+11:00
105439525877511ea3cba-ec08-1e01-b4fb-0242ac11000511e9e0ef-6156-6bd0-9724-0242ac1100052020-01-22 13:00:11+11:00
105753070464411ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03+11:00
105753070464411ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05+11:00
105929086494811ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05+11:00
105942530227011ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03+11:00
106416598476711ea533b-5eb8-8bb1-a514-0242ac11000211e9e0ef-5ec7-3570-9724-0242ac1100052020-02-20 04:15:04+11:00
107187437764311ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03+11:00
108645054061411ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03+11:00
108669477403111ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03+11:00
108669477403111ea3cba-ec08-1e01-b4fb-0242ac11000511e9e0ef-6156-6bd0-9724-0242ac1100052020-01-22 13:00:11+11:00
108783533783711ea6ebc-2980-1bb1-be7d-0242ac11000311e9e0ef-5a8e-e2f0-a8b3-0242ac1100032020-03-26 04:15:01+11:00
Они не являются дубликатами. А учитывая, что они являются строками, я бы подумал, что они не будут подвержены ошибкам с плавающей запятой или ошибкам округления?
Однако! Если я ополаскиваю и повторяю, я получаю 0 дубликатов (как и должно быть):
df['id'][df['id'].duplicated()].sort_values().duplicated().sum()
Out[257]: 0
Что может быть причиной этого странного поведения?
Этот обходной путь позволяет мне по крайней мере определить уникальность в записи, но это не решает другие проблемы выше.