2016-08-08 11 views
0

Ich habe eine Datenmenge, die ich mit SQL abfragen. Meine Abfrage gibt eine lange Zeichenfolge zurück, die einfach die Spaltennamen und dann die Daten enthält, wobei die Zeilen durch Zeilenumbruchzeichen getrennt sind. Ich verwende dann numpy.genfromtxt, um diese lange Zeichenfolge in ein numpliges Array umzuwandeln.Wie lesen Sie richtig Strings von SQL-Datenbank mit NumPy

Es gibt jedoch ein paar Spalten, die als Strings gelesen werden sollten. Also übergebe ich explizit ein dtype Array an genfromtxt, so dass es die Spaltenwerte korrekt speichert. Wenn ich jedoch die Ausgabe inspiziere, erscheinen alle Spalteneinträge, die eine Zeichenfolge sein sollten, einfach als '', eine leere Zeichenfolge.

Ich deklariere den Datentyp dieser Spalten als str. Ein Beispiel für einen solchen Eintrag, der zu einer leeren Zeichenfolge wird, ist im ursprünglichen Dataset das Wort GALAXY. In den offiziellen Dokumenten für das Dataset ist jedoch angegeben, dass der Datentyp dieser Spalte varchar ist. Ich nahm an, str wäre der richtige Typ dafür, aber ich denke nicht.


Edit: ignorieren, dass dies etwas mit SQL hat. Im Grunde habe ich eine Zeichenfolge, die das Ergebnis einer Abfrage ist, und ich muss es in ein numpy Array unter Verwendung np.genfromtxt packen. Ich vermied die expliziten Strings Entsendung weil sie brutal zu sehen sind, aber hier ist eine:

b'bestObjID,ra,dec,z,zErr,zWarning,class,subClass,rChi2,DOF,rChi2Diff,z_noqso,zErr_noqso,zWarning_noqso,class_noqso,subClass_noqso,rChi2Diff_noqso,velDisp,velDispErr,velDispZ,velDispZErr,velDispChi2\n1237662340012638224,239.58334,27.233419,0.09080672,2.924875E-05,0,GALAXY,,1.104714,3735,1.411605,0,0,0,,,0,272.6187,13.61222,0,0,1815.653\n'

Wie Sie sehen können, ist es ein bytes Objekt mit getrennten Reihen von \n und die erste Zeile der Spalte zu sein Etiketten.

Das Ergebnis dieser zu np.genfromtxt vorbei ist

array((1237662340012638224, 239.58334, 27.233419, 0.09080672264099121, 2.9248749342514202e-05, 0, '', '', 1.104714035987854, 3735.0, 1.4116050004959106, 0.0, 0.0, 0, '', '', 0.0, 272.61871337890625, 13.61221981048584, 0.0, 0.0, 1815.6529541015625), dtype=[('bestObjID', '<i8'), ('ra', '<f8'), ('dec', '<f8'), ('z', '<f4'), ('zErr', '<f4'), ('zWarning', '<i8'), ('class', '<c16'), ('subClass', '<c16'), ('rChi2', '<f4'), ('DOF', '<f4'), ('rChi2Diff', '<f4'), ('z_noqso', '<f4'), ('zErr_noqso', '<f4'), ('zWarning_noqso', '<i8'), ('class_noqso', '<c16'), ('subClass_noqso', '<c16'), ('rChi2Diff_noqso', '<f4'), ('velDisp', '<f4'), ('velDispErr', '<f4'), ('velDispZ', '<f4'), ('velDispZErr', '<f4'), ('velDispChi2', '<f4')])

können Sie sehen, wie was 'GALAXY' verwandelt sich in '' sagen sollte, wenn ich den Datentyp dieses Eintrags angeben, dass str ist. Wenn ich stattdessen den c dataype verwende, kann ich die G von GALAXY wiederherstellen, aber nichts mehr. Wenn ich versuche, oder c16 zu verwenden, bekomme ich (nan+0j)

+0

Ihre Frage sehr verleiten klingt - die 'numpy' Bibliothek als DBAPI werden nicht dazu gedacht, verwendet. Wenn Sie Daten aus einer normalen SQL-Datenbank bearbeiten/lesen, können Sie auch klären, wie Sie die Ergebnisse mit "numpy" analysiert haben? Es hört sich so an, als ob das dein wahres Problem ist. Vielleicht möchten Sie auch lesen, wie man ein Problem mit einem [Minimal, Complete und Verifable Beispiel] schreibt (http://stackoverflow.com/help/mcve) – Thtu

+0

@ThomasTu Nun, das ist sehr spezifisch für das, was ich bin arbeiten an. Ich frage Daten aus dem SDSS (Sloan Digital Sky Survey) ab, wobei ich ein Python-Skript verwende, das auf der SDSS-Website zur Verfügung gestellt wird. Dieses Skript fragt sie ab und gibt eine Zeichenfolge zurück, wie ich in meinem ersten Absatz beschrieben habe. Vielleicht hätte ich SQL nicht einmal erwähnen sollen, mein Problem besteht eigentlich darin, eine Reihe von Einträgen über 'genfromtxt' in ein' numpy' Array umzuwandeln. Ich werde den Beitrag mit weiteren Informationen aktualisieren – Anonymous

+0

Führt [astropy/astroquery] (http://astroquery.readthedocs.io/en/latest/sdss/sdss.html) das aus, was Sie für Sie tun möchten?Wenn nicht, versuche ein mcve zu posten und das wird wahrscheinlich helfen, eine nützlichere Antwort zu erzeugen. – Thtu

Antwort

1

Ich vermute, wie Sie genfromtxt verwenden, aber das scheint zu arbeiten?

import numpy as np 
from StringIO import StringIO 

s = b'bestObjID,ra,dec,z,zErr,zWarning,class,subClass,rChi2,DOF,rChi2Diff,z_noqso,zErr_noqso,zWarning_noqso,class_noqso,subClass_noqso,rChi2Diff_noqso,velDisp,velDispErr,velDispZ,velDispZErr,velDispChi2\n1237662340012638224,239.58334,27.233419,0.09080672,2.924875E-05,0,GALAXY,,1.104714,3735,1.411605,0,0,0,,,0,272.6187,13.61222,0,0,1815.653\n' 

S = lambda : StringIO(s) 

np.genfromtxt(S(), dtype = None, names=True, delimiter=',') 

Ausgänge

array((1237662340012638224, 239.58334, 27.233419, 0.09080672, 2.924875e-05, 0, 'GALAXY', False, 1.104714, 3735, 1.411605, 0, 0, 0, False, False, 0, 272.6187, 13.61222, 0, 0, 1815.653), 
    dtype=[('bestObjID', '<i8'), ('ra', '<f8'), ('dec', '<f8'), ('z', '<f8'), ('zErr', '<f8'), ('zWarning', '<i8'), ('class', 'S6'), ('subClass', '?'), ('rChi2', '<f8'), ('DOF', '<i8'), ('rChi2Diff', '<f8'), ('z_noqso', '<i8'), ('zErr_noqso', '<i8'), ('zWarning_noqso', '<i8'), ('class_noqso', '?'), ('subClass_noqso', '?'), ('rChi2Diff_noqso', '<i8'), ('velDisp', '<f8'), ('velDispErr', '<f8'), ('velDispZ', '<i8'), ('velDispZErr', '<i8'), ('velDispChi2', '<f8')]) 
+0

Danke, das ist eine legitime Lösung, obwohl ich endete immer noch explizit die Datentypen deklarieren und mit 'a8' für die Zeichenfolgen. – Anonymous

Verwandte Themen