2017-04-04 4 views
8

Ich erhalte den Fehler: ValueError: Wrong number of items passed 3, placement implies 1, und ich kämpfe um herauszufinden, wo und wie ich das Problem angehen könnte.ValueError: Falsche Anzahl der übergebenen Elemente - Bedeutung und Vorschläge?

Ich verstehe nicht wirklich die Bedeutung des Fehlers; was es für mich schwierig macht, Fehler zu beheben. Ich habe auch den Code-Block eingefügt, der den Fehler in meinem Jupyter Notebook auslöst.

Die Daten sind schwer anzubringen; also suche ich niemanden, der versucht, diesen Fehler für mich neu zu erstellen. Ich bin nur auf der Suche nach Feedback, wie ich diesen Fehler beheben könnte.

KeyError         Traceback (most recent call last) 
C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\indexes\base.py in get_loc(self, key, method, tolerance) 
    1944    try: 
-> 1945     return self._engine.get_loc(key) 
    1946    except KeyError: 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4154)() 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4018)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12368)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)() 

KeyError: 'predictedY' 

During handling of the above exception, another exception occurred: 

KeyError         Traceback (most recent call last) 
C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in set(self, item, value, check) 
    3414   try: 
-> 3415    loc = self.items.get_loc(item) 
    3416   except KeyError: 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\indexes\base.py in get_loc(self, key, method, tolerance) 
    1946    except KeyError: 
-> 1947     return self._engine.get_loc(self._maybe_cast_indexer(key)) 
    1948 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4154)() 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4018)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12368)() 

pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:12322)() 

KeyError: 'predictedY' 

During handling of the above exception, another exception occurred: 

ValueError        Traceback (most recent call last) 
<ipython-input-95-476dc59cd7fa> in <module>() 
    26  return gp, results 
    27 
---> 28 gp_dailyElectricity, results_dailyElectricity = predictAll(3, 0.04, trainX_dailyElectricity, trainY_dailyElectricity, testX_dailyElectricity, testY_dailyElectricity, testSet_dailyElectricity, 'Daily Electricity') 

<ipython-input-95-476dc59cd7fa> in predictAll(theta, nugget, trainX, trainY, testX, testY, testSet, title) 
     8 
     9  results = testSet.copy() 
---> 10  results['predictedY'] = predictedY 
    11  results['sigma'] = sigma 
    12 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value) 
    2355   else: 
    2356    # set column 
-> 2357    self._set_item(key, value) 
    2358 
    2359  def _setitem_slice(self, key, value): 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in _set_item(self, key, value) 
    2422   self._ensure_valid_index(value) 
    2423   value = self._sanitize_column(key, value) 
-> 2424   NDFrame._set_item(self, key, value) 
    2425 
    2426   # check if we are modifying a copy 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\generic.py in _set_item(self, key, value) 
    1462 
    1463  def _set_item(self, key, value): 
-> 1464   self._data.set(key, value) 
    1465   self._clear_item_cache() 
    1466 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in set(self, item, value, check) 
    3416   except KeyError: 
    3417    # This item wasn't present, just insert at end 
-> 3418    self.insert(len(self.items), item, value) 
    3419    return 
    3420 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in insert(self, loc, item, value, allow_duplicates) 
    3517 
    3518   block = make_block(values=value, ndim=self.ndim, 
-> 3519       placement=slice(loc, loc + 1)) 
    3520 
    3521   for blkno, count in _fast_count_smallints(self._blknos[loc:]): 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in make_block(values, placement, klass, ndim, dtype, fastpath) 
    2516      placement=placement, dtype=dtype) 
    2517 
-> 2518  return klass(values, ndim=ndim, fastpath=fastpath, placement=placement) 
    2519 
    2520 # TODO: flexible with index=None and/or items=None 

C:\Users\brennn1\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\internals.py in __init__(self, values, placement, ndim, fastpath) 
    88    raise ValueError('Wrong number of items passed %d, placement ' 
    89        'implies %d' % (len(self.values), 
---> 90            len(self.mgr_locs))) 
    91 
    92  @property 

ValueError: Wrong number of items passed 3, placement implies 1 

Mein Code ist wie folgt:

def predictAll(theta, nugget, trainX, trainY, testX, testY, testSet, title): 

    gp = gaussian_process.GaussianProcess(theta0=theta, nugget =nugget) 
    gp.fit(trainX, trainY) 

    predictedY, MSE = gp.predict(testX, eval_MSE = True) 
    sigma = np.sqrt(MSE) 

    results = testSet.copy() 
    results['predictedY'] = predictedY 
    results['sigma'] = sigma 

    print ("Train score R2:", gp.score(trainX, trainY)) 
    print ("Test score R2:", sklearn.metrics.r2_score(testY, predictedY)) 

    plt.figure(figsize = (9,8)) 
    plt.scatter(testY, predictedY) 
    plt.plot([min(testY), max(testY)], [min(testY), max(testY)], 'r') 
    plt.xlim([min(testY), max(testY)]) 
    plt.ylim([min(testY), max(testY)]) 
    plt.title('Predicted vs. observed: ' + title) 
    plt.xlabel('Observed') 
    plt.ylabel('Predicted') 
    plt.show() 

    return gp, results 

gp_dailyElectricity, results_dailyElectricity = predictAll(3, 0.04, trainX_dailyElectricity, trainY_dailyElectricity, testX_dailyElectricity, testY_dailyElectricity, testSet_dailyElectricity, 'Daily Electricity') 
+0

Ich kenne Pandas nicht (Sie sollten dieses Tag übrigens hinzufügen), aber dieses Traceback meldet einen 'KeyError' auf der' results ['vorhergesagtenY'] = ... 'Zeile, was' results' bedeutet hat keinen ''vorhergesagtenY''-Schlüssel. Ist 'Ergebnisse' irgendein Pandas-Objekt, das' [] 'Zugriff erlaubt, aber nicht erlaubt, neue Schlüssel zu erstellen? –

+0

sollte nicht Ergebnis sein, sondern testX.copy(). Können Sie sagen, wie sich testSet, testX und testY verhalten? – Quickbeam2k1

Antwort

9

Im Allgemeinen ist der Fehler ValueError: Wrong number of items passed 3, placement implies 1 schlägt vor, dass Sie versuchen, in zu wenig pigeonholes zu viele Tauben zu setzen. In diesem Fall

results['predictedY'] = predictedY

versucht 3 der Wert auf der rechten Seite der Gleichung zu setzen „Dinge“ in einen Behälter, der nur eine erlaubt. Da die linke Seite eine Datenrahmenspalte ist und mehrere Elemente in dieser (Spalten-) Dimension akzeptieren kann, sollten Sie feststellen, dass zu viele Elemente in einer anderen Dimension vorhanden sind.

Hier scheint es, dass Sie sklearn für die Modellierung verwenden, wo gaussian_process.GaussianProcess() stammt (Ich rate, aber korrigieren Sie mich und überarbeiten Sie die Frage, wenn das falsch ist).

Jetzt, Sie generieren für y vorhergesagten Werte hier:

predictedY, MSE = gp.predict(testX, eval_MSE = True)

Doch wie können wir aus the documentation for GaussianProcess, predict() kehrt zwei Einzelteile sehen. Die erste ist y, die array-like (Betonung meiner) ist. Das bedeutet, dass es mehr als eine Dimension haben kann, oder, um für dickköpfige Menschen wie mich konkret zu sein, kann es mehr als eine Spalte haben - sehen, dass es (n_samples, n_targets) zurückgeben kann, was, abhängig von testX, (1000, 3) sein könnte Nummern auswählen). So könnte Ihre predictedY 3 Spalten haben.

Wenn Sie also versuchen, etwas mit drei "Spalten" in eine einzelne Datenfeldspalte zu setzen, übergeben Sie 3 Elemente, wobei nur 1 passen würde.

Verwandte Themen