Impone una denominazione rigida di più argomenti

1

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:

  1. 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.
  2. 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?

    
posta Simon 06.04.2018 - 23:34
fonte

1 risposta

0

Utilizza gli argomenti delle parole chiave. Gli argomenti delle parole chiave non devono essere passati in ordine. Ci sono molti sostenitori di argomenti con parole chiave per questo e altri motivi.

def aggregate(**kwargs): # kwargs['q1'], etc are available here. pass

Puoi passare questo dizionario come q_map o passare qualcosa come q3_m=this, q1=that, etc... e l'ordine non ha importanza.

Se stai parlando di:

  • 42 potenziali diverse colonne
  • di cui quattro saranno usati come q1, q2, q3_h, q3_m
  • e tutti questi mapping sono noti

quindi vorrei creare una funzione wrapper che ha mappature di tutte le potenziali colonne alle variabili appropriate e quindi chiama aggregate .

È possibile che non capisco completamente il problema, ma questo è il migliore dato quello che hai descritto.

    
risposta data 07.04.2018 - 23:56
fonte

Leggi altre domande sui tag