Ho alcuni dati del questionario nei file CSV per diversi progetti. Ho creato una funzione che prende un sottoinsieme specifico di colonne e calcola i valori aggregati. Il problema è che attraverso questi diversi progetti, i nomi delle colonne sono diversi ma devono ancora essere aggregati allo stesso modo
Il modo in cui sto gestendo questo momento è il seguente ...
Ogni progetto utilizza un diverso script python in cui utilizzo un dizionario per mappare le chiavi a colonne specifiche nel mio file dataframe / csv:
import pandas as pd
df = pd.read_csv("data.csv")
q_map = {'q1': df['question1'],
'q2': df['question2'],
'q3_h': df['question3_hours'],
'q3_m': df['question3_minutes']}
Per ogni progetto è necessario un diverso q_map
perché i nomi delle colonne variano. Ad esempio, qui q1
è mappato a df['question1']
, ma in un altro progetto potrebbe essere chiamato df['q1_1']
Quindi passo q_map
alla mia funzione di aggregazione:
def aggregate(q_map):
if len(q_map) != 4:
raise Exception("Incorrect number of items")
total_a = q_map['q1'] + q_map['q2']
total_minutes = q_map['q3_h']*60 + q_map['q3_m']
return total_a, total_minutes
total, minutes = aggregate(q_map)
Quindi in sostanza il dizionario viene usato come un modo per garantire che i nomi delle colonne siano sempre gli stessi all'interno della funzione, in questo modo la funzione stessa non ha bisogno di preoccuparsi se le colonne sono nominate in modo diverso tra i progetti, tutto sarà comunque aggregato allo stesso modo
Questo non è molto user-friendly per (almeno) 2 ragioni:
- L'utente finale deve passare un numero esatto di colonne affinché l'aggregazione funzioni. Sto gestendo questo al momento con
Exception
ma non c'è modo intuitivo per l'utente di sapere esattamente quante colonne devono essere passate senza leggere la documentazione. - Le chiavi devono essere uguali a quelle utilizzate internamente dalla funzione (ad esempio
q1
,q3_h
). Di nuovo, è difficile per l'utente sapere esattamente come nominare le proprie chiavi durante la creazione del dizionario. Una chiave con nome errato causerà problemi.
Sento che la soluzione naturale è usare solo argomenti con nome nella mia firma come:
def aggregate(q1, q2, q3_h, q3_m):
pass
In questo modo l'utente non deve preoccuparsi della denominazione o di quante colonne sono passate. Tuttavia, in realtà questa funzione utilizza 42 colonne diverse per l'aggregazione, e sento che una firma di funzione di quella lunghezza sarebbe ingombrante e facile da gestire passa colonne nell'ordine sbagliato
Esiste un modo più ragionevole (oltre agli argomenti con nome) per gestire questo tipo di situazione, in cui è necessario applicare un numero specifico e un nome specifico di argomenti inseriti in una funzione?