2016-07-15 175 views
9

Ho un pandas dataframe da restituire come oggetto Flask Response in un'applicazione flask. Attualmente sto convertendolo in un JSON Object,Come serializzare/deserializzare Pandas DataFrame da e verso ProtoBuf/Gzip in un'app RESTful Flask?

df = df.to_json() 
return Response(df, status=200, mimetype='application/json') 

Le dimensioni dataframe è davvero enorme della grandezza, probabilmente 5000000 X 10. Sul lato client, quando ho deserializzare come,

df = response.read_json() 

Come il mio numero di URL request parameters cresce, cresce anche il dataframe. Il tempo di deserializzazione cresce a linear factor rispetto alla serializzazione, che vorrei evitare. ad esempio: Serialization richiede 15-20 secondi, deserialization richiede 60-70 secondi.

C'è un modo che protobuf può aiutare in questo caso per convertire il dataframe panda in un oggetto protobuf. C'è anche un modo per mandare questo JSON come il mimetipo Gunzipped attraverso il pallone? Credo che ci sia un tempismo ed efficienza comparabili tra protobuf e gunzip.

Qual è la soluzione migliore in uno scenario del genere?

Grazie in anticipo.

risposta

1

Mi sono imbattuto nello stesso problema di recente. Ho risolto iterando attraverso le righe del mio DataFrame e chiamando protobuf_obj.add() in quel ciclo, usando le informazioni da DataFrame. È quindi possibile GZIP l'output della stringa serializzata.

vale a dire qualcosa sulla falsariga di:

for _, row in df.iterrows(): 
    protobuf_obj.add(val1=row[col1], val2=row[col2]) 
proto_str = protobuf_obj.SerializeToString() 
return gzip.compress(proto_str) 

Dato che la questione non è stata risolta in 9 mesi, non sono sicuro che ci sia una soluzione migliore, ma sicuramente aperto a sentire uno se non c'è!