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') 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) 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)] 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) 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)] return points_df, nets_df