Question

I ai deux séries chronologiques différentes avec des horodatages partiellement chevauchants:

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')

qui représente les données suivantes:

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

Je souhaite calculer une moyenne pondérée sur tous les jours avec des coefficients a (0,3) et B (0,7), tout en ignorant les valeurs manquantes:

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

lorsque je tente d'abord d'aligner ces timeseries:

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

Je correctement masquée se timeseries:

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)

mais quand je fais a1 * 0.3 + b1 * 0.7, il ne tient pas compte des valeurs, qui sont présents dans un timeseries seulement:

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

Que dois-je faire pour recevoir l'attendu?

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

EDIT :. La réponse devrait être applicable aussi à plus de deux timeseries initiales avec des poids différents et des valeurs manquantes différemment

Donc, si nous disposons de quatre séries temporelles avec des poids T1 (0,1), T2 (0,2), T3 (0,3) et T4 (0,4), leur poids à une estampille temporelle donnée seront les suivants:

            |  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.
Était-ce utile?

La solution

J'ai essayé et trouvé ceci:

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])

Ceci est applicable à la question plus retouchées à l'aide d'un timeseries initial. Mais nous espérons que quelqu'un trouvera mieux.

EDIT: Et voici ma fonction:

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])

Travaux pour un certain nombre de séries chronologiques; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top