import pandas as pd from django.conf import settings import sqlalchemy def raschet_real(df, koefs): koef_summ = sum(koefs.values()) for k, v in koefs.items(): df[k] = (df[k] * v) 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): 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') 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});" else: query = f"select * from {table} where msk_rayon={msk_rayon} and category in ({categories});" points = pd.read_sql(query, conn) points_df = raschet_real(points, koefs) if 'net' in table: if msk_ao is not None: query = f"select * from {table} where msk_ao={msk_ao};" else: query = f"select * from {table} where msk_rayon={msk_rayon};" nets = pd.read_sql(query, conn) nets_df = raschet_real(nets, koefs) return points_df, nets_df