Ho un oggetto DataFrame relativamente grande (circa un milione di righe, centinaia di colonne) e mi piacerebbe ritagliare i valori anomali in ogni colonna per gruppo. Per "valori anomali di clip per ogni colonna per gruppo" intendo: calcolare i quantili del 5% e del 95% per ogni colonna in un gruppo e valori di clip al di fuori di questo intervallo quantile.Modo più rapido per rimuovere i valori anomali per gruppo in grandi panda DataFrame
Ecco il setup Attualmente sto usando:
def winsorize_series(s):
q = s.quantile([0.05, 0.95])
if isinstance(q, pd.Series) and len(q) == 2:
s[s < q.iloc[0]] = q.iloc[0]
s[s > q.iloc[1]] = q.iloc[1]
return s
def winsorize_df(df):
return df.apply(winsorize_series, axis=0)
e poi, con la mia dataframe chiamato features
e indicizzato da DATE
, posso fare
grouped = features.groupby(level='DATE')
result = grouped.apply(winsorize_df)
Questo funziona, tranne che è molto lento, presumibilmente a causa delle chiamate nidificate di apply
: una per ciascun gruppo e quindi una per ogni colonna di ciascun gruppo. Ho provato a eliminare il secondo apply
calcolando quantili per tutte le colonne contemporaneamente, ma mi sono bloccato cercando di limitare ogni colonna con un valore diverso. C'è un modo più veloce per eseguire questa procedura?
Grazie, questo è un buon puntatore, non mi rendevo conto che scipy aveva una funzione 'winsorize'. Tuttavia, presumo che si otterrebbe una maggiore accelerazione se esiste un modo per eseguire l'operazione in blocco sul DataFrame senza dover operare colonna per colonna, in modo simile a come si potrebbe standardizzare o normalizzare in blocco, ad esempio http: // stackoverflow.com/questions/12525722/normalize-data-in-pandas –
Ci sono lo stesso numero di date in ogni gruppo? – unutbu
il gruppo per operazione è per data, quindi ogni gruppo ha solo una data. Intendi chiedere se ciascun gruppo ha lo stesso numero di righe? La risposta è no, ogni data può (e in genere lo fa) avere un numero diverso di righe. –