|
|
|
|
@ -17,7 +17,7 @@ from sklearn import model_selection as ms
|
|
|
|
|
from sqlalchemy import text
|
|
|
|
|
from django.contrib.gis.db.models.functions import Distance
|
|
|
|
|
from postamates.settings import AGE_DAY_LIMIT
|
|
|
|
|
from postamates.settings import DB_URL, STATUS_TASK_NAME
|
|
|
|
|
from postamates.settings import DB_URL, STATUS_TASK_NAME, STATUS_TASK_NAME_IMPORT
|
|
|
|
|
from service.models import PlacementPoint, LastMLCall
|
|
|
|
|
from service import models
|
|
|
|
|
from service.utils import log_to_telegram
|
|
|
|
|
@ -26,44 +26,37 @@ from io import StringIO
|
|
|
|
|
from django.core.cache import cache
|
|
|
|
|
from service.layer_service import LayerService
|
|
|
|
|
from service.service import PointService
|
|
|
|
|
from service.utils import run_psql_command
|
|
|
|
|
from service.utils import run_psql_command, change_status
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task()
|
|
|
|
|
def raschet(table_name='service_placementpoint', need_time=True):
|
|
|
|
|
def raschet(table_name='service_placementpoint', need_time=True, task_name=STATUS_TASK_NAME):
|
|
|
|
|
print('start raschet')
|
|
|
|
|
status, _ = models.TaskStatus.objects.get_or_create(task_name=STATUS_TASK_NAME)
|
|
|
|
|
# status, _ = models.TaskStatus.objects.get_or_create(task_name=STATUS_TASK_NAME)
|
|
|
|
|
raschet_objs = models.RaschetObjects.objects.all()
|
|
|
|
|
if raschet_objs:
|
|
|
|
|
status.status = 'Начало расчета кол-ва ПВЗ вокруг точек'
|
|
|
|
|
status.save()
|
|
|
|
|
change_status('Начало расчета кол-ва ПВЗ вокруг точек', task_name=task_name)
|
|
|
|
|
total = raschet_objs.count()
|
|
|
|
|
for _i, r_o in enumerate(raschet_objs):
|
|
|
|
|
obj = models.Post_and_pvz.objects.get(id=r_o.obj_id)
|
|
|
|
|
LayerService().count_post_pvz_for_placementpoint(obj)
|
|
|
|
|
status.status = "Подсчет кол-ва ПВЗ вокруг точек: " + str(int((_i + 1) / total * 100)) + "%"
|
|
|
|
|
status.save()
|
|
|
|
|
status.status = 'Расчет кол-ва ПВЗ вокруг точек завершен'
|
|
|
|
|
status.save()
|
|
|
|
|
change_status(f'Подсчет кол-ва ПВЗ вокруг точек: {str(int((_i + 1) / total * 100))}%', task_name=task_name)
|
|
|
|
|
change_status('Подсчет кол-ва ПВЗ вокруг точек завершен', task_name=task_name)
|
|
|
|
|
group_objects = models.RaschetGroups.objects.all()
|
|
|
|
|
group_total = group_objects.count()
|
|
|
|
|
if group_objects:
|
|
|
|
|
status.status = 'Начало расчета расстояний'
|
|
|
|
|
status.save()
|
|
|
|
|
change_status('Начало расчета расстояний', task_name=task_name)
|
|
|
|
|
qs = models.PlacementPoint.objects.all()
|
|
|
|
|
for _k, g_o in enumerate(group_objects):
|
|
|
|
|
g = models.Post_and_pvzGroup.objects.get(id=g_o.obj_id)
|
|
|
|
|
for q in qs:
|
|
|
|
|
PointService.calculate_dist_for_group(point=q, group=g)
|
|
|
|
|
status.status = "Подсчет расстояний: " + str(int(_k / group_total * 100)) + "%"
|
|
|
|
|
status.save()
|
|
|
|
|
status.status = "Подсчет расстояний завершен"
|
|
|
|
|
status.save()
|
|
|
|
|
change_status(f'Подсчет расстояний: {str(int((_k + 1) / group_total * 100))}%', task_name=task_name)
|
|
|
|
|
change_status('Расчет завершен', task_name=task_name)
|
|
|
|
|
models.RaschetObjects.objects.all().delete()
|
|
|
|
|
models.RaschetGroups.objects.all().delete()
|
|
|
|
|
# Запуск ML
|
|
|
|
|
status.status = 'Запуск ML'
|
|
|
|
|
status.save()
|
|
|
|
|
change_status('Запуск ML', task_name=task_name)
|
|
|
|
|
log_to_telegram(f'{table_name} start raschet')
|
|
|
|
|
try:
|
|
|
|
|
log_to_telegram('try connect to db')
|
|
|
|
|
@ -122,8 +115,9 @@ def raschet(table_name='service_placementpoint', need_time=True):
|
|
|
|
|
Y_trn = pts_trn[['fact']]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
status.status = 'Записи для инференса'
|
|
|
|
|
status.save()
|
|
|
|
|
# status.status = 'Записи для инференса'
|
|
|
|
|
# status.save()
|
|
|
|
|
change_status('Записи для инференса', task_name=task_name)
|
|
|
|
|
# Записи для инференса
|
|
|
|
|
if table_name == 'service_placementpoint':
|
|
|
|
|
pts_inf = pts.loc[(pts.status == 'Pending') |
|
|
|
|
|
@ -173,11 +167,13 @@ def raschet(table_name='service_placementpoint', need_time=True):
|
|
|
|
|
r2_scores = []
|
|
|
|
|
mapes = []
|
|
|
|
|
y_infers = []
|
|
|
|
|
status.status = 'Обучение inference 0%'
|
|
|
|
|
status.save()
|
|
|
|
|
# status.status = 'Обучение inference 0%'
|
|
|
|
|
# status.save()
|
|
|
|
|
change_status('Обучение inference 0%', task_name=task_name)
|
|
|
|
|
for i in seeds:
|
|
|
|
|
status.status = 'Обучение inference: ' + str(int((seeds.index(i) + 1) / len(seeds) * 100)) + '%'
|
|
|
|
|
status.save()
|
|
|
|
|
# status.status = 'Обучение inference: ' + str(int((seeds.index(i) + 1) / len(seeds) * 100)) + '%'
|
|
|
|
|
# status.save()
|
|
|
|
|
change_status(f'Обучение inference: {str(int((seeds.index(i) + 1) / len(seeds) * 100))}%', task_name=task_name)
|
|
|
|
|
x_trn, x_test, y_trn, y_test = ms.train_test_split(X_trn, Y_trn, test_size=0.2, random_state=i)
|
|
|
|
|
model = catboost.CatBoostRegressor(cat_features=['property_era'], random_state=i)
|
|
|
|
|
model.fit(x_trn, y_trn, verbose=False)
|
|
|
|
|
@ -187,7 +183,8 @@ def raschet(table_name='service_placementpoint', need_time=True):
|
|
|
|
|
r2_scores.append(r2_score)
|
|
|
|
|
mapes.append(mape)
|
|
|
|
|
y_infers.append(model.predict(X_inf.drop(columns=['id'])))
|
|
|
|
|
status.status = 'Обучение inference 100%'
|
|
|
|
|
change_status('Обучение inference 100%', task_name=task_name)
|
|
|
|
|
# status.status = 'Обучение inference 100%'
|
|
|
|
|
current_pred = sum(y_infers) / 5
|
|
|
|
|
|
|
|
|
|
# расчет шапов
|
|
|
|
|
@ -246,8 +243,10 @@ def raschet(table_name='service_placementpoint', need_time=True):
|
|
|
|
|
log_to_telegram(f'Ошибка при обновлении полей в базе данных: {e}')
|
|
|
|
|
log_to_telegram('Начинается обновление полей в базе')
|
|
|
|
|
if len(pts_inf) > 0:
|
|
|
|
|
status.status = 'Перерасчет ML: 50%'
|
|
|
|
|
status.save()
|
|
|
|
|
|
|
|
|
|
# status.status = 'Перерасчет ML: 50%'
|
|
|
|
|
# status.save()
|
|
|
|
|
change_status('Перерасчет ML: 50%', task_name=task_name)
|
|
|
|
|
# Загрузка в базу обновленных значений
|
|
|
|
|
try:
|
|
|
|
|
log_to_telegram('Подключение к базе данных 2')
|
|
|
|
|
@ -377,8 +376,9 @@ def raschet(table_name='service_placementpoint', need_time=True):
|
|
|
|
|
log_to_telegram('len(pts_inf) <= 0')
|
|
|
|
|
run_psql_command()
|
|
|
|
|
log_to_telegram('end raschet')
|
|
|
|
|
status.status = 'Перерасчет ML завершен'
|
|
|
|
|
status.save()
|
|
|
|
|
# status.status = 'Перерасчет ML завершен'
|
|
|
|
|
# status.save()
|
|
|
|
|
change_status('Перерасчет ML завершен', task_name=task_name)
|
|
|
|
|
if need_time:
|
|
|
|
|
LastMLCall.objects.all().delete()
|
|
|
|
|
LastMLCall.objects.create()
|
|
|
|
|
@ -511,3 +511,10 @@ def load_data(obj_id: int):
|
|
|
|
|
status.status = "Загрузка данных завершена"
|
|
|
|
|
status.save()
|
|
|
|
|
models.TempFiles.objects.all().delete()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task()
|
|
|
|
|
def import_task(file_id):
|
|
|
|
|
PointService().start_mathing(file_id)
|
|
|
|
|
PointService().make_enrichment()
|
|
|
|
|
raschet('service_preplacementpoint', need_time=False, task_name=STATUS_TASK_NAME_IMPORT)
|