66 lines
No EOL
1.7 KiB
Python
66 lines
No EOL
1.7 KiB
Python
#!/usr/bin/env python
|
|
|
|
import argparse
|
|
from random import randint
|
|
import pandas as pd
|
|
import numpy as np
|
|
|
|
ETU_CSV = "etudiants.csv"
|
|
SUBJ_CSV = "sujets.tsv"
|
|
#RES_CSV = "affectations.tsv"
|
|
|
|
|
|
def main(seed):
|
|
|
|
etu_df = pd.read_csv(ETU_CSV)
|
|
res_df = pd.DataFrame()
|
|
|
|
for gr in etu_df['groupe'].unique():
|
|
gr_df = etu_df[etu_df['groupe'] == gr]
|
|
subj_df = pd.read_csv(SUBJ_CSV, sep='\t')
|
|
|
|
while not gr_df.empty:
|
|
subj = subj_df.sample()
|
|
subj_df = subj_df.drop(index=subj.index)
|
|
|
|
n_students = min(gr_df.shape[0], 2)
|
|
etu = gr_df.sample(n=n_students)
|
|
gr_df = gr_df.drop(index=etu.index)
|
|
|
|
res_df = pd.concat([
|
|
res_df,
|
|
etu.merge(subj, how='cross')],
|
|
ignore_index=True)
|
|
|
|
# Ajout des sujets non affectes
|
|
subj_df['groupe'] = gr
|
|
res_df = pd.concat([
|
|
res_df,
|
|
subj_df],
|
|
ignore_index=True)
|
|
|
|
res_fn = f"affectations_{seed}.tsv"
|
|
res_df.to_csv(res_fn, sep='\t', index=False)
|
|
print("Successfully wrote", res_fn)
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(
|
|
prog='Selection de binomes et de sujets SRA2',
|
|
description='Mange etudiants.csv et sujets.tsv, génère affectations_<seed>.tsv. '+\
|
|
'Vous pouvez lui donner une seed avec l\'option `-s | --seed`.')
|
|
parser.add_argument('-s', '--seed')
|
|
|
|
args = parser.parse_args()
|
|
|
|
seed = args.seed
|
|
if seed is None:
|
|
seed = randint(0, 2**32)
|
|
|
|
np.random.seed(int(seed))
|
|
print("Using following random seed:", seed)
|
|
return seed
|
|
|
|
if __name__ == '__main__':
|
|
seed = parse_args()
|
|
main(seed)
|
|
|