Lo scopo di questa domanda è esplorare ulteriormente MultiIndex dataframes e porre domande sull'approccio migliore per varie attività.Considerazioni sulla progettazione di panda per i datafondi MultiIndex
Creare il dataframe
import pandas as pd
df = pd.DataFrame({'index_date' : ['12/07/2016','12/07/2016','12/07/2016','12/07/2016','12/07/2016'],
'portfolio' : ['A','B','C','D','E'],
'reporting_ccy' : ['GBP','GBP','GBP','GBP','GBP'],
'portfolio_ccy' : ['JPY','USD','USD','EUR','EUR'],
'amount' : [100,200,300,400,500],
'injection' : [1,2,3,4,5],
'to_usd' : [1.3167,1.3167,1.3167,1.3167,1.3167],
'to_ccy' : [0.009564,1,1,1.1093,1.1093],
'm5' : [2,4,6,8,10],
'm6' : [1,3,5,7,9]});
Ruotare il dataframe
df_pivot = df.pivot_table(index='index_date',columns=['portfolio','portfolio_ccy','reporting_ccy']).swaplevel(0, 1, axis=1).sortlevel(axis=1)
Rinominare le colonne
df_pivot.columns.names = ['portfolio','measures', 'portfolio_ccy', 'reporting_ccy']
Questo produce una rappresentazione imperniato dei dati in modo tale che:
- un portafoglio possono avere 1 o più misure
- mostra la valuta di portafoglio di default
- mostra il portafoglio moneta di
- una misura può avere 1 o molte valute di segnalazione.
I termini di 4. qual è l'approccio migliore per l'implementazione dato che abbiamo le x rate per le valute?
Tale che creiamo un dataframe come quella derivata qui:
Creare dataframe
df1 = pd.DataFrame({'index_date' : ['12/07/2016','12/07/2016','12/07/2016','12/07/2016','12/07/2016'],
'portfolio' : ['A','B','C','D','E'],
'reporting_ccy' : ['JPY','USD','USD','EUR','EUR'],
'portfolio_ccy' : ['JPY','USD','USD','EUR','EUR'],
'amount' : [13767.2522, 263.34, 395.01, 474.785901, 593.4823763],
'injection' : [1,2,3,4,5],
'to_usd' : [0.009564, 1, 1, 1.1093, 1.1093],
'to_ccy' : [1.3167, 1.3167, 1.3167, 1.3167, 1.3167],
'm5' : [2,4,6,8,10],
'm6' : [1,3,5,7,9]});
Concatenate & Pivot le DataFrames
df_concat = pd.concat([df,df1])
df_pivot1 = df_concat.pivot_table(index='index_date',columns=['portfolio','portfolio_ccy','reporting_ccy']).swaplevel(0, 1, axis=1).sortlevel(axis=1)
df_pivot1.columns.names = ['portfolio','measures', 'portfolio_ccy', 'reporting_ccy']
Questo dimostra ora 1 misura avendo molte valute.
df_pivot1.xs(('amount', 'A'), level=('measures','portfolio'), drop_level=False, axis=1)
Domanda
Esiste un modo migliore, come l'aggiunta di dati direttamente ad un dataframe multiIndexed al livello 3 df_pivot1.columns.get_level_values(3).unique()
?
Mi piacerebbe essere in grado di scorrere ogni livello e aggiungere nuove misure derivate da altre misure usando df.assign()
o altri metodi.
Il caso d'uso qui è di aggiungere altre valute alle misure, ove applicabile. La concatenazione e il re-pivot come sopra non sembrano ottimali.
Questo è anche esplorato ulteriormente [qui] (http://stackoverflow.com/questions/38491990/adding-and-renaming-a-column-in-a-multiindex-dataframe/38493363) – toasteez
Anche se questa è una domanda ben formata, sono confuso riguardo alle tue esigenze. Potrebbe essere completamente fuori, ma stai cercando di usare df_pivot e aggiungere tutte le valute di segnalazione o qualcosa del genere? Puoi usare df (prima di pivot) per farlo? –
Quello che sto insinuando è che non esiste un modo semplice per aggiungere a un livello inferiore in un frame di dati con più indici. Ho risolto questo e penso che altre domande pubblicate da me lo esplorino. Questo è dopo pivot. Il motivo è che potresti avere un MultiIndex e vuoi aggiungere altre misure derivate dai dati nel frame Multi-Index esistente o da altre fonti di dati, ecc. – toasteez