У меня есть файл .csv с несколькими миллионами строк. Строки содержат данные о местоположении (название улицы), и я пытаюсь преобразовать это название улицы в долготу и широту, пытаясь провести некоторый географический анализ. Проблема заключается в том, что для обработки одной строки требуется около 0,5 с.
Я попытался улучшить свой код с помощью динамического c программирования и сохранения уже рассчитанных значений в словаре, чтобы я мог их повторно использовать, но это только уменьшило время, необходимое для вычисления одной строки, примерно до 0,3 с.
Название улицы довольно часто повторяется, и когда я нахожусь примерно в 1000-й строке, я получаю около 50% совпадений из словаря, к сожалению, это все еще кажется слишком медленным. Если у кого-то есть идея, как я могу улучшить этот код, я все слышу, так как текущий код более или менее бесполезен, так как для перебора всех строк потребуется неделя.
Мой текущий код выглядит следующим образом :
def long_lat_to_csv(dataset, output_file):
dataset['longitude'] = None
dataset['latitude'] = None
geolocator = Nominatim(user_agent="test")
longlat = dict()
area = "New York City, USA"
for i, row in dataset.iterrows():
if int(i) % 100 == 0:
print('current row:', i)
address = row['Street Name']
try:
# if address already calculated:
long, lat = longlat[address]
dataset.at[i, 'longitude'] = long
dataset.at[i, 'latitude'] = lat
except:
# if address isn't calculated yet
try:
loc = geolocator.geocode(address + ',' + area)
longlat[address] = [loc.longitude, loc.latitude]
except:
# also store addresses that return None
longlat[address] = None
dataset.to_csv(output_file, index=False)