daniilak

Untitled

Jun 9th, 2023
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.66 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import pandas as pd
  3. import geopandas as gpd
  4. from shapely.geometry import Point
  5. import json
  6. import time
  7. import tqdm
  8.  
  9. start_time = time.time()
  10.  
  11. # same region dictionary
  12. R = {"Алтайский край": "22", "Амурская область": "28", "Архангельская область": "29", "Астраханская область": "30",
  13.      "Белгородская область": "31", "Брянская область": "32", "Владимирская область": "33",
  14.      "Волгоградская область": "34", "Вологодская область": "35", "Воронежская область": "36",
  15.      "Еврейская автономная область": "79", "Забайкальский край": "75", "Ивановская область": "37",
  16.      "Иркутская область": "38", "Кабардино-Балкария": "7", "Калининградская область": "39", "Калужская область": "40",
  17.      "Камчатский край": "41", "Карачаево-Черкесия": "9", "Кемеровская область": "42", "Кировская область": "43",
  18.      "Костромская область": "44", "Краснодарский край": "23", "Красноярский край": "24", "Курганская область": "45",
  19.      "Курская область": "46", "Ленинградская область": "47", "Липецкая область": "48", "Магаданская область": "49",
  20.      "Москва": "77", "Московская область": "50", "Мурманская область": "51", "Ненецкий автономный округ": "83",
  21.      "Нижегородская область": "52", "Новгородская область": "53", "Новосибирская область": "54", "Омская область": "55",
  22.      "Оренбургская область": "56", "Орловская область": "57", "Пензенская область": "58", "Пермский край": "59",
  23.      "Приморский край": "25", "Псковская область": "60", "Адыгея": "1", "Республика Алтай": "4", "Башкортостан": "2",
  24.      "Республика Бурятия": "3", "Дагестан": "5", "Ингушетия": "6", "Калмыкия": "8", "Республика Карелия": "10",
  25.      "Республика Коми": "11", "Автономна Республіка Крим": "90", "Республика Крым": "90", "Марий Эл": "12",
  26.      "Мордовия": "13", "Республика Саха (Якутия)": "14", "Северная Осетия — Алания": "15", "Татарстан": "16",
  27.      "Республика Тыва": "17", "Республика Хакасия": "19", "Ростовская область": "61", "Рязанская область": "62",
  28.      "Самарская область": "63", "Санкт-Петербург": "78", "Саратовская область": "64", "Сахалинская область": "65",
  29.      "Свердловская область": "66", "Севастополь": "91", "Смоленская область": "67", "Ставропольский край": "26",
  30.      "Тамбовская область": "68", "Тверская область": "69", "Томская область": "70", "Тульская область": "71",
  31.      "Тюменская область": "72", "Удмуртия": "18", "Ульяновская область": "73", "Хабаровский край": "27",
  32.      "Ханты-Мансийский автономный округ — Югра": "86", "Челябинская область": "74", "Чечня": "20", "Чувашия": "21",
  33.      "Чукотский автономный округ": "87", "Ямало-Ненецкий автономный округ": "89", "Ярославская область": "76"}
  34.  
  35. print("Reading Russian geometry")
  36.  
  37. df = gpd.read_file('russia.geo.json')[['id', 'geometry', 'tags']]
  38. df['reg'] = df['tags'].map(lambda x: int(R.get(x.get('name', 0), 0)))
  39. df = df[['geometry', 'reg']]
  40. df['reg'] = df['reg'].astype(int)
  41. df = df[df.reg != 0]
  42. df = df.to_crs('EPSG:4326')
  43.  
  44. print("Reading addresses")
  45.  
  46. ad = pd.read_csv('addresses_adverts.csv', sep="\t")
  47. # ad = pd.read_csv('addresses_adverts.csv', sep="\t", nrows=10000)
  48.  
  49. print("Creating GeoDataFrame for all points (this may take some time)")
  50.  
  51. geometry = [Point(xy) for xy in zip(ad.geo_lon, ad.geo_lat)]
  52. pnts = gpd.GeoDataFrame(ad, geometry=geometry, crs='EPSG:4326')
  53.  
  54. chunk_size = 100000  # adjust this value to your needs
  55. chunks = [pnts[i:i + chunk_size] for i in range(0, pnts.shape[0], chunk_size)]
  56.  
  57. print("Mapping addresses to regions")
  58.  
  59. joined_chunks = []
  60.  
  61. for chunk in tqdm.tqdm(chunks):
  62.     joined_chunk = gpd.sjoin(chunk, df, how='left', predicate='within')
  63.     joined_chunks.append(joined_chunk)
  64.  
  65. # Concatenate all chunks at once
  66. joined = pd.concat(joined_chunks)
  67.  
  68. print("Cleaning the result")
  69.  
  70. # Keep only the first match for each point
  71. joined = joined.sort_index()
  72. joined = joined.loc[~joined.index.duplicated(keep='first')]
  73.  
  74. joined['reg'] = joined['reg'].fillna(-1).astype(int)  # fill not matched with -1
  75.  
  76. # Create a new DataFrame with the desired columns
  77. result = pd.DataFrame({
  78.     'id': joined['id'],
  79.     'geo_lat': joined['geo_lat'],
  80.     'geo_lon': joined['geo_lon'],
  81.     'region_id': joined['reg']
  82. })
  83.  
  84. print("Writing into file")
  85. result.to_json('result_new.json', orient='records', double_precision=13)
  86. result.to_csv('result_new.csv', sep="\t")
  87.  
  88. print(f"Finished in: {time.time() - start_time} seconds")
Add Comment
Please, Sign In to add comment