Frage

Ich habe zwei verschiedene Zeitreihen mit teilweise überlappenden Zeitstempeln:

import scikits.timeseries as ts
from datetime import datetime 
a = ts.time_series([1,2,3], dates=[datetime(2010,10,20), datetime(2010,10,21), datetime(2010,10,23)], freq='D')
b = ts.time_series([4,5,6], dates=[datetime(2010,10,20), datetime(2010,10,22), datetime(2010,10,23)], freq='D')

, die folgenden Daten darstellt:

Day:   20. 21. 22. 23.
  a:    1   2   -   3
  b:    4   -   5   6

Ich mag einen gewichteten Durchschnitt an jedem Tag mit Koeffizienten berechnen a (0,3) und b (0,7), während fehlende Werte zu ignorieren:

Day 20.: (0.3 * 1 + 0.7 * 4) / (0.3 + 0.7) = 3.1 / 1.  = 3.1
Day 21.: (0.3 * 2          ) / (0.3      ) = 0.6 / 0.3 = 2
Day 22.: (          0.7 * 5) / (      0.7) = 3.5 / 0.7 = 5
Day 23.: (0.3 * 3 + 0.7 * 6) / (0.3 + 0.7) = 3.1 / 1.  = 5.1

, wenn ich zum ersten Mal versuchen, diese Zeitreihen auszurichten:

a1, b1 = ts.aligned(a, b)

ich richtig maskiert Zeitreihen erhalten:

timeseries([1 2 -- 3],
  dates = [20-Oct-2010 ... 23-Oct-2010],
  freq  = D)

timeseries([4 -- 5 6],
  dates = [20-Oct-2010 ... 23-Oct-2010],
  freq  = D)

aber wenn ich a1 * 0.3 + b1 * 0.7 tun, es ignoriert Werte, die nur in einer Zeitreihe vorhanden sind:

timeseries([3.1 -- -- 5.1],
   dates = [20-Oct-2010 ... 23-Oct-2010],
   freq  = D)

Was soll ich tun, um die erwarteten zu erhalten?

timeseries([3.1 2. 5. 5.1],
   dates = [20-Oct-2010 ... 23-Oct-2010],
   freq  = D)

Bearbeiten . Die Antwort sollte auch auf mehr als zwei Anfangszeitreihen mit unterschiedlichen Gewicht und unterschiedlich fehlenden Werten anwendbar sein

Wenn wir also vier Zeitreihen mit Gewichten T1 haben (0,1), T2 (0.2), T3 (0,3) und T4 (0,4), deren Gewichte zu einem bestimmten Zeitstempel wird sein:

            |  T1 |  T2 |  T3 |  T4 |
weight      | 0.1 | 0.2 | 0.3 | 0.4 |
-------------------------------------
all present | 10% | 20% | 30% | 40% |
T1 missing  |     | 22% | 33% | 45% |
T1,T2 miss. |     |     | 43% | 57% |
T4 missing  | 17% | 33% | 50% |     |
etc.
War es hilfreich?

Lösung

Ich habe versucht, und fand diese:

aWgt = 0.3
bWgt = 0.7

print (np.where(a1.mask, 0., a1.data * aWgt) +
       np.where(b1.mask, 0., b1.data * bWgt)) / (np.where(a1.mask, 0., aWgt) +
                                                 np.where(b1.mask, 0., bWgt))

# array([ 3.1,  2. ,  5. ,  5.1])

Dies ist auf die editierte Frage mit mehr als einem Anfangszeitreihen. Aber hoffentlich wird jemand besser finden.

EDIT: Und das ist meine Funktion:

def weightedAvg(weightedTimeseries):
    sumA = np.sum((np.where(ts.mask, 0., ts.data * weight) for ts, weight in weightedTimeseries), axis=0)
    sumB = np.sum((np.where(ts.mask, 0., weight) for ts, weight in weightedTimeseries), axis=0)
    return np.divide(sumA, sumB)

weightedAvg(((a1, 0.3), (bb, 0.7)))
# array([ 3.1,  2. ,  5. ,  5.1])

Arbeiten für eine beliebige Anzahl von Zeitreihen; -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top