boolean Maske, in der pandas-panel

ich bin mit einigen Schwierigkeiten Maskierung eine Platte in der gleichen Weise, dass ich würde ein DataFrame. Was ich tun möchte, fühlt sich einfach, aber ich habe nicht gefunden, einen Weg suchen, an die docs und online-Foren. Ich habe ein einfaches Beispiel:

import pandas
import numpy as np
import datetime
start_date = datetime.datetime(2009,3,1,6,29,59)
r = pandas.date_range(start_date, periods=12)
cols_1 = ['AAPL', 'AAPL', 'GOOG', 'GOOG', 'GS', 'GS']
cols_2 = ['close', 'rate', 'close', 'rate', 'close', 'rate']
dat = np.random.randn(12, 6)

dftst = pandas.DataFrame(dat, columns=pandas.MultiIndex.from_arrays([cols_1, cols_2], names=['ticker','field']), index=r)
pn = dftst.T.to_panel().transpose(2,0,1)
print pn

Out[14]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 12 (major_axis) x 3 (minor_axis)
Items axis: close to rate
Major_axis axis: 2009-03-01 06:29:59 to 2009-03-12 06:29:59
Minor_axis axis: AAPL to GS

Ich habe jetzt ein Panel-Objekt, wenn ich ein Stück entlang der Elemente Achse, bekomme ich einen DataFrame

close_p = pn['close']
print close_p

Out[16]: 
ticker                   AAPL      GOOG        GS
2009-03-01 06:29:59 -0.082203 -0.286354  1.227193
2009-03-02 06:29:59  0.340005 -0.688933 -1.505137
2009-03-03 06:29:59 -0.525567  0.321858 -0.035047
2009-03-04 06:29:59 -0.123549 -0.841781 -0.616523
2009-03-05 06:29:59 -0.407504  0.188372  1.311262
2009-03-06 06:29:59  0.272883  0.817179  0.584664
2009-03-07 06:29:59 -1.767227  1.168876  0.443096
2009-03-08 06:29:59 -0.685501 -0.534373 -0.063906
2009-03-09 06:29:59  0.851820  0.068740  0.566537
2009-03-10 06:29:59  0.390678 -0.012422 -0.152375
2009-03-11 06:29:59 -0.985585 -0.917705 -0.585091
2009-03-12 06:29:59  0.067498 -0.764343  0.497270

Kann ich filtern diese Daten auf zwei wegen:

1) erstelle ich eine Maske und maskieren Sie die Daten wie folgt:

msk = close_p > 0
close_p = close_p.mask(msk)

2) ich kann die Scheibe nur durch den booleschen operator in msk oben

close_p = close_p[close_p > 0]
Out[28]: 
ticker                   AAPL      GOOG        GS
2009-03-01 06:29:59       NaN       NaN  1.227193
2009-03-02 06:29:59  0.340005       NaN       NaN
2009-03-03 06:29:59       NaN  0.321858       NaN
2009-03-04 06:29:59       NaN       NaN       NaN
2009-03-05 06:29:59       NaN  0.188372  1.311262
2009-03-06 06:29:59  0.272883  0.817179  0.584664
2009-03-07 06:29:59       NaN  1.168876  0.443096
2009-03-08 06:29:59       NaN       NaN       NaN
2009-03-09 06:29:59  0.851820  0.068740  0.566537
2009-03-10 06:29:59  0.390678       NaN       NaN
2009-03-11 06:29:59       NaN       NaN       NaN
2009-03-12 06:29:59  0.067498       NaN  0.497270

Was ich kann nicht herausfinden, wie zu tun ist, filter alle meine Daten auf Grundlage einer Maske, ohne eine for-Schleife. Ich kann Folgendes tun:

msk = (pn['rate'] > 0) & (pn['close'] > 0)
def mask_panel(pan, msk):
    for item in pan.items:
        pan[item] = pan[item].mask(msk)
    return pan
print pn['close']

Out[32]: 
ticker                   AAPL      GOOG        GS
2009-03-01 06:29:59 -0.082203 -0.286354  1.227193
2009-03-02 06:29:59  0.340005 -0.688933 -1.505137
2009-03-03 06:29:59 -0.525567  0.321858 -0.035047
2009-03-04 06:29:59 -0.123549 -0.841781 -0.616523
2009-03-05 06:29:59 -0.407504  0.188372  1.311262
2009-03-06 06:29:59  0.272883  0.817179  0.584664
2009-03-07 06:29:59 -1.767227  1.168876  0.443096
2009-03-08 06:29:59 -0.685501 -0.534373 -0.063906
2009-03-09 06:29:59  0.851820  0.068740  0.566537
2009-03-10 06:29:59  0.390678 -0.012422 -0.152375
2009-03-11 06:29:59 -0.985585 -0.917705 -0.585091
2009-03-12 06:29:59  0.067498 -0.764343  0.497270

mask_panel(pn, msk)

print pn['close']

Out[34]: 
ticker                   AAPL      GOOG        GS
2009-03-01 06:29:59 -0.082203 -0.286354       NaN
2009-03-02 06:29:59       NaN -0.688933 -1.505137
2009-03-03 06:29:59 -0.525567       NaN -0.035047
2009-03-04 06:29:59 -0.123549 -0.841781 -0.616523
2009-03-05 06:29:59 -0.407504       NaN       NaN
2009-03-06 06:29:59       NaN       NaN       NaN
2009-03-07 06:29:59 -1.767227       NaN       NaN
2009-03-08 06:29:59 -0.685501 -0.534373 -0.063906
2009-03-09 06:29:59       NaN       NaN       NaN
2009-03-10 06:29:59       NaN -0.012422 -0.152375
2009-03-11 06:29:59 -0.985585 -0.917705 -0.585091
2009-03-12 06:29:59       NaN -0.764343       NaN

So dass die obige Schleife funktioniert der trick. Ich weiß, es ist ein schneller vektorisierter Weg, dies zu tun mit der ndarray, aber ich habe nicht, dass Sie zusammen noch. Es scheint auch, wie sollte diese Funktionalität sein, die in den pandas-Bibliothek. Wenn es einen Weg gibt, um dies zu tun, dass ich vermisst werde, irgendwelche Vorschläge würde sehr geschätzt.

  • Es fühlt sich an wie Sie sollten in der Lage sein, um mit der boolean-panel pn.gt(0)...
  • vielen Dank Andy, es sei denn, ich bin falsch, ich denke, das wäre etwas anderes machen. Das würde nan sich jeder DataFrame in meinem panel, wo seine Werte sind kleiner als 0 ist. Was ich tun möchte, ist nan aus jeder DataFrame in meinem Panel, wo 'schließen' ist kleiner als 0 ist. Wieder in der Nähe ist der einem bestimmten DataFrame in meinem Panel. Ich werde weiter basteln und posten, wenn ich etwas schöner.
  • Würde das nur auf die enge dataframe (Teil der Systemsteuerung)? Wollen Sie ändern, dass Sie in die Systemsteuerung und lassen Sie die andere unverändert?
InformationsquelleAutor granders19 | 2013-02-01
Schreibe einen Kommentar