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.

66 lines
2.8 KiB

import pandas as pd
from django.conf import settings
import sqlalchemy
from service import models
from tqdm import tqdm
def raschet_real(df, koefs):
koef_summ = sum(koefs.values())
df['rate'] = df[list(koefs.keys())].apply(lambda x: sum([x[k]*koefs[k] for k in list(koefs.keys())]), axis=1)
df['rate'] = df['rate'] / koef_summ
return df
def raschet(tables, filters, koefs, method):
conn = sqlalchemy.create_engine(settings.DB_URL, connect_args={'options': '-csearch_path=public'})
msk_ao = filters.get('msk_ao')
msk_rayon = filters.get('msk_rayon')
rate_from = filters.get('rate_from', None)
rate_to = filters.get('rate_to', None)
category = filters.get('category', [])
categories = ','.join([f"'{c}'" for c in category])
points_df = None
nets_df = None
for table in tables:
if 'point' in table:
if msk_ao is not None:
query = f"select * from {table} where msk_ao={msk_ao} and category in ({categories});" if len(categories) > 0 else f"select * from {table} where msk_ao={msk_ao};"
elif msk_rayon is not None:
query = f"select * from {table} where msk_rayon={msk_rayon} and category in ({categories});" if len(categories) > 0 else f"select * from {table} where msk_rayon={msk_rayon};"
else:
query = f"select * from {table} where category in ({categories});" if len(categories) > 0 else f"select * from {table};"
points = pd.read_sql(query, conn)
if method == 'rate':
points_df = raschet_real(points, koefs)
if rate_from is not None and rate_to is not None:
points_df = points_df[(points_df['rate'] >= rate_from) & (points_df['rate'] <= rate_to)]
else:
points_df = points[(points['model'] >= rate_from) & (points['model'] <= rate_to)]
if 'net' in table:
if msk_ao is not None:
query = f"select * from {table} where msk_ao={msk_ao};"
elif msk_rayon is not None:
query = f"select * from {table} where msk_rayon={msk_rayon};"
else:
query = f"select * from {table};"
nets = pd.read_sql(query, conn)
if method == 'rate':
nets_df = raschet_real(nets, koefs)
if rate_from is not None and rate_to is not None:
nets_df = nets_df[(nets_df['rate'] >= rate_from) & (nets_df['rate'] <= rate_to)]
else:
nets_df = nets[(nets['model'] >= rate_from) & (nets['model'] <= rate_to)]
return points_df, nets_df
# ==============
def load_data(filepath: str):
models.PlacementPoint.objects.all().delete()
df = pd.read_csv(filepath).iloc[:,1:].to_dict('records')
for data in tqdm(df, desc='Loading data...'):
dt = models.PlacementPoint(**data)
dt.save()