2017-05-01 3 views
0

Scikit-learn Bibliothek haben ein brillantes Beispiel für Datencluster - stock market structure. Es funktioniert gut in US-Aktien. Aber wenn man Ticker aus anderen Märkten hinzufügt, erscheint der Fehler numpy, dass Arrays die gleiche Größe haben sollten - das ist beispielsweise der Fall, wenn deutsche Aktien einen anderen Handelskalender haben.Filter numpy Array von Tupeln

Ok, nach quotes herunterladen I Vorbereitung gemeinsamer Daten hinzufügen:

quotes = [quotes_historical_yahoo_ochl(symbol, d1, d2, asobject=True) 
      for symbol in symbols] 


def intersect(list_1, list_2): 
    return list(set(list_1) & set(list_2)) 

dates_all = quotes[0].date 
for q in quotes: 
    dates_symbol = q.date 
    dates_all = intersect(dates_all, dates_symbol) 

Dann stecken Ich bin mit numpy Array von Tupeln Filterung. Hier einige Versuche:

# for index, q in enumerate(quotes): 
#  filtered = [i for i in q if i.date in dates_all] 

#  quotes[index] = np.rec.array(filtered, dtype=q.dtype) 
#  quotes[index] = np.asanyarray(filtered, dtype=q.dtype) 
# 
#  quotes[index] = np.where(a.date in dates_all for a in q) 
# 
#  quotes[index] = np.where(q[0].date in dates_all) 

Wie Filter numpy Array anzuwenden oder, wie man wirklich konvertieren Liste von Datensätzen (nach Filter) zurück zu numpy ‚s recarray?

Zitate [0] .dtype:

'(numpy.record, [('date', 'O'), ('year', '<i2'), ('month', 'i1'), ('day', 'i1'), ('d', '<f8'), ('open', '<f8'), ('close', '<f8'), ('high', '<f8'), ('low', '<f8'), ('volume', '<f8'), ('aclose', '<f8')])' 

Zitate [0] .shape:

<class 'tuple'>: (261,) 
+0

Von arra y von Tupeln Ich vermute, du meinst ein 'strukturiertes Array' (oder' recarray'). Wenn ja, würden wir gerne die 'Form' und' Dtype' des Arrays kennen. – hpaulj

+0

Danke für den Hinweis. Hinzugefügt! –

Antwort

0

So quotes ist eine Liste von recarrays und in date_all Sie den Durchschnitt aller Werte sammeln im Feld date.

kann ich ein solches Array neu mit:

In [286]: dt=np.dtype([('date', 'O'), ('year', '<i2'), ('month', 'i1'), ('day', 
    ...: 
    ...:), ('low', '<f8'), ('volume', '<f8'), ('aclose', '<f8')]) 
In [287]: 
In [287]: arr=np.ones((2,), dtype=dt) # 2 element structured array 
In [288]: arr 
Out[288]: 
array([(1, 1, 1, 1, 1., 1., 1., 1., 1., 1., 1.), 
     (1, 1, 1, 1, 1., 1., 1., 1., 1., 1., 1.)], 
     dtype=[('date', 'O'), ('year', '<i2'), ('month', 'i1'), ('day', 'i1'), ... ('aclose', '<f8')]) 
In [289]: type(arr[0]) 
Out[289]: numpy.void 

wiederum die in einen recarray (Ich nicht, diese so weit wie Klar strukturierte Arrays verwenden‘):

In [291]: np.rec.array(arr) 
Out[291]: 
rec.array([(1, 1, 1, 1, 1., 1., 1., 1., 1., 1., 1.), 
(1, 1, 1, 1, 1., 1., 1., 1., 1., 1., 1.)], 
      dtype=[('date', 'O'), ('year', '<i2'), ('month', 'i1'), ('day', 'i1'), .... ('aclose', '<f8')]) 

dtype der recarray Displays etwas anders:

In [292]: _.dtype 
Out[292]: dtype((numpy.record, [('date', 'O'), ('year', '<i2'), ('month', 'i1'), ....('aclose', '<f8')])) 
In [293]: __.date 
Out[293]: array([1, 1], dtype=object) 

In jedem Fall die date Feld ist ein Array von Objekten, möglicherweise datetime?

q ist eines dieser Arrays; i ist ein Element und i.date ist das Datumsfeld.

[i for i in q if i.date in dates_all] 

So ist filtered Liste der recarray Elemente. np.stack macht es besser, sie zu einem Array zusammenzufügen (das funktioniert auch mit dem recarray).

np.stack([i for i in arr if i['date'] in alist]) 

Oder Sie könnten die Indizes der passenden Datensätze und den Index der Kurs Array

In [319]: [i for i,v in enumerate(arr) if v['date'] in alist] 
Out[319]: [0, 1] 
In [320]: arr[_] 

oder ziehen Sie das Datumsfeld zuerst sammeln:

In [321]: [i for i,v in enumerate(arr['date']) if v in alist] 
Out[321]: [0, 1] 

in1d könnte auch arbeiten Suche

In [322]: np.in1d(arr['date'],alist) 
Out[322]: array([ True, True], dtype=bool) 
In [323]: np.where(np.in1d(arr['date'],alist)) 
Out[323]: (array([0, 1], dtype=int32),) 
+0

Vielen Dank für die ausführliche Antwort und saugen NumPy Tricks: 'i ['date']', 'in1d' andere! –