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)