You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.5 KiB
96 lines
3.5 KiB
import geojson
|
|
import numpy as np
|
|
import pandas as pd
|
|
from django.contrib.gis.geos import GEOSGeometry
|
|
from geojson import MultiPolygon
|
|
from tqdm import tqdm
|
|
from service.tasks import calculate_group_distance
|
|
|
|
from service import models
|
|
|
|
|
|
def load_data(filepath: str):
|
|
models.PlacementPoint.objects.all().delete()
|
|
df = pd.read_csv(filepath)
|
|
df = df.replace(np.nan, None)
|
|
df = df.replace('NaT', None)
|
|
for row in tqdm(df.to_dict('records'), desc='Loading data...'):
|
|
data = {
|
|
k: row[k] for k in row.keys() if
|
|
k not in ['id', 'location_id', 'area', 'district', 'age_month']
|
|
}
|
|
models.PlacementPoint.objects.create(**data)
|
|
|
|
|
|
def load_ao_and_rayons(
|
|
ao_filepath: str,
|
|
rayons_filepath: str,
|
|
):
|
|
models.AO.objects.all().delete()
|
|
models.Rayon.objects.all().delete()
|
|
gj = geojson.load(ao_filepath)
|
|
objs = gj['features']
|
|
for obj in tqdm(objs, desc='Loading AOs...'):
|
|
name = obj['properties']['okrug']
|
|
coords = obj['geometry']['coordinates']
|
|
models.AO.objects.create(**{'name': name, 'polygon': GEOSGeometry(str(MultiPolygon(coords)))})
|
|
gj = geojson.load(rayons_filepath)
|
|
objs = gj['features']
|
|
for obj in tqdm(objs, desc='Loading Rayons...'):
|
|
name = obj['properties']['rayon']
|
|
coords = obj['geometry']['coordinates']
|
|
okr = obj['properties']['okrug']
|
|
ao = models.AO.objects.get(name=okr)
|
|
models.Rayon.objects.create(**{'name': name, 'polygon': GEOSGeometry(str(MultiPolygon(coords))), 'AO': ao})
|
|
|
|
|
|
def load_rivals(filepath: str):
|
|
df = pd.read_excel(filepath)
|
|
df = df.replace(np.nan, None)
|
|
df = df.replace('NaT', None)
|
|
df.columns = df.columns.str.lower()
|
|
for row in tqdm(df.to_dict('records'), desc='Loading data...'):
|
|
category = row.get('category')
|
|
group = row.get('group')
|
|
if category:
|
|
cat, _ = models.Post_and_pvzCategory.objects.get_or_create(name=category)
|
|
if group:
|
|
gr, _ = models.Post_and_pvzGroup.objects.get_or_create(name=group, category=cat)
|
|
row['category'] = cat
|
|
row['group'] = gr
|
|
lon = str(row.pop('lon'))
|
|
lat = str(row.pop("lat"))
|
|
row['wkt'] = "POINT(" + lon + " " + lat + ")"
|
|
models.Post_and_pvz.objects.get_or_create(**row)
|
|
new_groups = df[['group', 'category']].drop_duplicates().to_dict(orient='records')
|
|
calculate_group_distance.delay(new_groups)
|
|
|
|
|
|
def load_other_objects(filepath: str):
|
|
df = pd.read_excel(filepath)
|
|
df = df.replace(np.nan, None)
|
|
df = df.replace('NaT', None)
|
|
df.columns = df.columns.str.lower()
|
|
for row in tqdm(df.to_dict('records'), desc='Loading data...'):
|
|
category = row.get('category')
|
|
group = row.get('group')
|
|
if category:
|
|
cat, _ = models.OtherObjectsCategory.objects.get_or_create(name=category)
|
|
if group:
|
|
gr, _ = models.OtherObjectsGroup.objects.get_or_create(name=group, category=cat)
|
|
row['category'] = cat
|
|
row['group'] = gr
|
|
lon = str(row.pop('lon'))
|
|
lat = str(row.pop("lat"))
|
|
row['wkt'] = "POINT(" + lon + " " + lat + ")"
|
|
models.OtherObjects.objects.get_or_create(**row)
|
|
|
|
|
|
def load_dist(filepath: str):
|
|
models.PointDist.objects.all().delete()
|
|
df = pd.read_csv(filepath)
|
|
for row in tqdm(df.to_dict('records'), desc='Loading data...'):
|
|
row['id1'] = models.PlacementPoint.objects.get(pk=row.get('id1'))
|
|
row['id2'] = models.PlacementPoint.objects.get(pk=row.get('id2'))
|
|
models.PointDist.objects.create(**row)
|