Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.77 KB | None | 0 0
  1. from utils.db import Database, open_db
  2. from geopy.geocoders import Nominatim
  3. from geopy.distance import vincenty
  4.  
  5. def calc(field, operation, grouping, display, filters=[]):
  6.     if field == 'remun':            fi = 1
  7.     elif field == 'd_work_home':    fi = 7
  8.     elif field == 'd_school_home':  fi = 8
  9.  
  10.     with open_db() as db:
  11.  
  12.         count = db.cur.execute('''
  13.            SELECT s.idStage,
  14.                s.remuneration,     p.annee,    p.libelle,
  15.                ela.lat,            ela.lon,    ela.pays,
  16.                ca.lat,             ca.lon,     ca.pays,
  17.                ena.lat,            ena.lon,    ena.pays
  18.            FROM Stage as s
  19.            LEFT JOIN (Eleve as el, Adresse as ela) ON (el.idEleve = s.idEleve AND ela.idAdresse = el.idADresse)
  20.            LEFT JOIN (Entreprise as en, Adresse as ena) ON (en.idEntreprise = s.idEntreprise AND ena.idAdresse = en.idAdresse)
  21.  
  22.            LEFT JOIN (Appartient, Promo as p, Campus, Adresse as ca) ON (
  23.                Appartient.idEleve = el.idEleve AND p.id = Appartient.idPromo AND p.annee = s.annee
  24.                AND Campus.idCampus = p.idCampus AND ca.idAdresse = Campus.idAdresse
  25.            )
  26.        ''')
  27.  
  28.         row = db.cur.fetchone()
  29.         data = []
  30.         visited = {}
  31.         geoloc = Nominatim()
  32.         while row:
  33.             k = row[0]
  34.             if k in visited.keys():
  35.                 data[visited[k]][3].append(row[3])
  36.             else:
  37.                 data.append((
  38.                     row[0], row[1] if row[1] and row[1] > 10 else None, row[2], [ row[3] ],
  39.                     row[6], row[9], row[12],
  40.                     vincenty((row[4], row[5]), (row[10], row[11])).kilometers if row[4] and row[10] else None,
  41.                     vincenty((row[4], row[5]), (row[7], row[8])).kilometers if row[4] and row[7] else None
  42.                 ))
  43.  
  44.                 visited[k] = len(data) - 1
  45.  
  46.             row = db.cur.fetchone()
  47.  
  48.         i = 0
  49.         while i < len(data):
  50.             if data[i][fi] == None:
  51.                 del data[i]
  52.                 continue
  53.  
  54.             for filtr in filters:
  55.  
  56.                 pfield = filtr[0]
  57.                 if pfield == 'remun':           field = data[i][1]
  58.                 elif pfield == 'country':       field = data[i][6]
  59.                 elif pfield == 'promo':         field = data[i][3]
  60.                 elif pfield == 'd_work_home':   field = data[i][7]
  61.                 elif pfield == 'd_school_home': field = data[i][8]
  62.  
  63.  
  64.                 value = filtr[2]
  65.                 if pfield == 'remun' or pfield == 'd_work_home' or pfield == 'd_school_home':
  66.                     value = int(value)
  67.  
  68.                 pop = filtr[1]
  69.                 if field == None or (
  70.                     (pop == 'eq' and (field != value if pfield != 'promo' else value not in field)) or
  71.                     (pop == 'neq' and (field == value if pfield != 'promo' else value in field)) or
  72.                     (pop == 'geq' and field < value) or
  73.                     (pop == 'leq' and field > value)
  74.                 ):
  75.                     del data[i]
  76.                     i -= 1
  77.                     break
  78.  
  79.             i += 1
  80.  
  81.         if grouping == 'individual':
  82.             groups = { k: [k] for k in range(len(data)) }
  83.             data.sort(key=lambda x, fi=fi: x[fi])
  84.         elif grouping == 'promo' or grouping == 'promo_simple':
  85.             groups = {}
  86.  
  87.             if grouping == 'promo_simple':
  88.                 keys = ( ('ING1',), ('ING2',), ('ING3',), ('ING4',) )
  89.             else:
  90.                 keys = db.exec("""SELECT DISTINCT libelle FROM Promo""")[1]
  91.             for k in keys:
  92.                 k = k[0]
  93.                 groups[k] = []
  94.                 for i in range(len(data)):
  95.                     if k in data[i][3]:
  96.                         groups[k].append(i)
  97.  
  98.             for filtr in filters:
  99.                 if filtr[0] == 'promo':
  100.                     value = filtr[2]
  101.                     pop = filtr[1]
  102.                     groups = { k: groups[k] for k in groups if (
  103.                         (pop == 'eq' and value == k) or
  104.                         (pop == 'neq' and value != k)
  105.                     ) }
  106.         elif grouping == 'year':
  107.             groups = {}
  108.  
  109.             keys = db.exec('SELECT DISTINCT annee FROM Promo')[1]
  110.             for k in keys:
  111.                 k = k[0]
  112.                 groups[k] = []
  113.                 for i in range(len(data)):
  114.                     if data[i][2] == k: groups[k].append(i)
  115.         elif grouping == 'country':
  116.             groups = {}
  117.  
  118.             keys = db.exec('SELECT DISTINCT pays FROM Adresse')[1]
  119.             for k in keys:
  120.                 k = k[0]
  121.                 groups[k] = []
  122.                 for i in range(len(data)):
  123.                     if data[i][6] == k: groups[k].append(i)
  124.  
  125.         groups = { k: groups[k] for k in groups.keys() if len(groups[k]) }
  126.         ret, count = {}, { k: len(groups[k]) for k in groups.keys() }
  127.         if operation == 'sum' or operation == 'mean':
  128.             for k in groups.keys():
  129.                 ret[k] = 0
  130.                 for idx in groups[k]:
  131.                     ret[k] += data[idx][fi]
  132.  
  133.                 if operation == 'mean': ret[k] /= count[k]
  134.         elif operation == 'median':
  135.             for k in groups.keys():
  136.                 if count[k] == 1:
  137.                     ret[k] = data[groups[k][0]][fi]
  138.                     continue
  139.                 groups[k].sort(key=lambda x, data=data, fi=fi: data[x][fi])
  140.  
  141.                 idx = groups[k][int(count[k]/2)]
  142.                 if count[k] % 2 == 0:
  143.                     ret[k] = data[idx][fi]
  144.                 elif count[k] % 2 == 1:
  145.                     idx2 = groups[k][int(count[k]/2) + 1]
  146.                     ret[k] = (data[idx][fi] + data[idx2][fi])/2
  147.  
  148.  
  149.         return (groups, count, len(data), ret)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement