2016-07-31 7 views
3

Ich fragte mich, ob es einen effizienteren Weg zur Durchführung der folgenden Operation gab.Ausgabe eines Datenrahmens zu einem JSON-Array

# transforms datetime into timestamp in seconds 
t = df.index.values.astype(np.int64) // 10**6 

return jsonify(np.c_[t, df.open, df.high, df.low, df.close, df.volume].tolist()) 

df wo ein Datenrahmen einen Index enthält, der ein Datum ist, und mindestens (aber nicht nur) die folgenden Attribute: open, high, low, close, volume. Ich gebe dann das neu erstellte Array als JSON mit Kolben jsonify aus. Der obige Code funktioniert, aber es sieht ziemlich ineffizient für mich aus, wie man es schöner/effizienter macht.

Antwort

8

können Sie to_json() Methode verwenden:

In [88]: import pandas_datareader.data as web 

In [89]: apl = web.get_data_yahoo('AAPL', '2016-07-05', '2016-07-07') 

In [90]: apl 
Out[90]: 
       Open  High  Low  Close Volume Adj Close 
Date 
2016-07-05 95.389999 95.400002 94.459999 94.989998 27705200 94.989998 
2016-07-06 94.599998 95.660004 94.370003 95.529999 30949100 95.529999 
2016-07-07 95.699997 96.500000 95.620003 95.940002 25139600 95.940002 

I json.dumps(..., indent=2) um verwenden werden, um es schöner/lesbar zu machen:

In [91]: import json 

orientieren = 'index'

In [98]: print(json.dumps(json.loads(apl.to_json(orient='index')), indent=2)) 
{ 
    "1467849600000": { 
    "Close": 95.940002, 
    "High": 96.5, 
    "Open": 95.699997, 
    "Adj Close": 95.940002, 
    "Volume": 25139600, 
    "Low": 95.620003 
    }, 
    "1467676800000": { 
    "Close": 94.989998, 
    "High": 95.400002, 
    "Open": 95.389999, 
    "Adj Close": 94.989998, 
    "Volume": 27705200, 
    "Low": 94.459999 
    }, 
    "1467763200000": { 
    "Close": 95.529999, 
    "High": 95.660004, 
    "Open": 94.599998, 
    "Adj Close": 95.529999, 
    "Volume": 30949100, 
    "Low": 94.370003 
    } 
} 

orient = 'Aufzeichnungen ' (Reset-Index um Spalte Date sichtbar zu machen):

In [99]: print(json.dumps(json.loads(apl.reset_index().to_json(orient='records')), indent=2)) 
[ 
    { 
    "Close": 94.989998, 
    "High": 95.400002, 
    "Open": 95.389999, 
    "Adj Close": 94.989998, 
    "Volume": 27705200, 
    "Date": 1467676800000, 
    "Low": 94.459999 
    }, 
    { 
    "Close": 95.529999, 
    "High": 95.660004, 
    "Open": 94.599998, 
    "Adj Close": 95.529999, 
    "Volume": 30949100, 
    "Date": 1467763200000, 
    "Low": 94.370003 
    }, 
    { 
    "Close": 95.940002, 
    "High": 96.5, 
    "Open": 95.699997, 
    "Adj Close": 95.940002, 
    "Volume": 25139600, 
    "Date": 1467849600000, 
    "Low": 95.620003 
    } 
] 

Sie Verwendung der folgenden to_json() Parameter vornehmen:

date_format: {' Epoche‘, 'iso'}

Art der Datumsumwandlung. Epoche = Epoche Millisekunden, ISO` = ISO8601, Standard ist Epoche.

date_unit: string, default ‚Ms‘ (Millisekunden)

Die Zeiteinheit, zu codieren regelt Zeitstempel und ISO8601 Präzision. Einer von 's', 'ms', 'us', 'ns' für Sekunden, Millisekunden, Mikrosekunden und Nanosekunden.

orientiert: String

Das Format des JSON-String

  • split: dict wie {index -> [index], Spalten -> [Spalten], Daten -> [Werte] }
  • Datensätze: Liste wie [{Spalte -> value}, ..., {Spalte -> value}]
  • Index: dICT wie {index -> {Spalte -> value}}
  • Spalten: dict wie {c olumn -> {index -> value}} werte: nur die werte array