2016-08-09 15 views
1

Die Situation ist, dass ich ein paar Dateien mit time_series Daten für verschiedene Bestände mit mehreren Feldern haben. jede DateiPandas anwenden multicolumnindex auf Datenframe

time, open, high, low, close, volume 

enthält das Ziel, dass alle in einem Datenrahmen der Form

field  open        high       ... 
security hk_1  hk_2  hk_3 ...  hk_1  hk_2  hk_3 ... ... 
time 
t_1  open_1_1 open_2_1 open_3_1 ... high_1_1 high_2_1 high_3_1 ... ...    
t_2  open_1_2 open_2_2 open_3_2 ... high_1_2 high_2_2 high_3_2 ... ... 
...  ...  ...  ... ...  ...  ...  ... ... ... 

ich ein Multiindex erstellt zu bekommen, ist

fields = ['time','open','high','low','close','volume','numEvents','value'] 
midx = pd.MultiIndex.from_product([security_name'], fields], names=['security', 'field']) 

und für einen Start, versucht, das anzuwenden MultiIndex zum Dataframe bekomme ich vom Lesen der Daten von CSV (durch Erstellen eines neuen Datenrahmens und Hinzufügen des Index)

for c in eqty_names_list: 

    midx = pd.MultiIndex.from_product([[c], fields], names=['security', 'field']) 

    df_temp = pd.read_csv('{}{}.csv'.format(path, c)) 
    df_temp = pd.DataFrame(df_temp, columns=midx, index=df_temp['time']) 
    df_temp.df_name = c 
    all_dfs.append(df_temp) 

jedoch nur die neuen Datenrahmen enthält nan

security 1_HK 
field  time open high low  close volume 
time         
NaN   NaN  NaN  NaN NaN  NaN  NaN 

Außerdem ist es immer noch eine Spalte für die Zeit enthält, obwohl ich, dass der Index zu machen versucht (so dass ich später alle anderen Datenrahmen für andere beitreten können Aktien nach Index, um den aggregierten Datenrahmen zu erhalten).

Wie kann ich mich bewerben die Multiindex auf den Datenrahmen ohne meine Daten zu verlieren und dann später die Datenrahmen verbinden wie diese

security 1_HK 
field  time open high low  close volume 
time 

suchen so etwas wie erstellen (beachten Sie Hierarchiefeld und Sicherheit sind eingeschaltet)

field  time    open high  ... 
security 1_HK 2_HK ... 1_HK 2_HK ... ... 
time 

Antwort

1

Ich denke, Sie können zuerst alle Dateien zur Liste files, dann mit Listenverständnis erhalten alle DataFrames und concat sie durch Spalten (axis=1). Wenn Parameter hinzufügen keys, erhalten Sie Multiindex in Spalten:

Dateien:

a.csv, b.csv, c.csv

import pandas as pd 
import glob 

files = glob.glob('files/*.csv') 
dfs = [pd.read_csv(fp) for fp in files] 

eqty_names_list = ['hk1','hk2','hk3'] 
df = pd.concat(dfs, keys=eqty_names_list, axis=1) 

print (df) 
    hk1  hk2  hk3  
    a b c a b c a b c 
0 0 1 2 0 9 6 0 7 1 
1 1 5 8 1 6 4 1 3 2 

Letzte Notwendigkeit swaplevel und sort_index:

df.columns = df.columns.swaplevel(0,1) 
df = df.sort_index(axis=1) 
print (df) 
    a   b   c   
    hk1 hk2 hk3 hk1 hk2 hk3 hk1 hk2 hk3 
0 0 0 0 1 9 7 2 6 1 
1 1 1 1 5 6 3 8 4 2 
+0

Dank. das funktioniert wunderbar. Hinweis für jeden, der sich das anschaut; Die Reihenfolge der Dateien sollte der Reihenfolge in eqty_names_list entsprechen, wenn Sie Daten wie diese lesen – chrise

+0

Ja, Sie haben Recht. ich danke Ihnen für die Annahme! – jezrael

Verwandte Themen