2017-05-13 3 views
-1

Je les listes suivantes:Déplacement fenêtre Somme produit Calcul Python

a= [1,2,3,4,5,6,7,8,9,10,11,12] 
wts= [0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.10,0.10,0.30] 

Le résultat souhaité est

result = [8.2,7.76,7.848,7.9504,8.179253333,8.420282667,8.628383467,8.790601973,8.894139057,8.930025594,8.891166196,8.770706404] 

Le résultat est le produit d'une somme fenêtre mobile de la liste « a » et liste « WTS '.

Par exemple Résultat 8.2 est obtenu par code

sum(map(lambda xi, yi: xi * yi,x,wt)) 

Le résultat est obtenu par une nouvelle fenêtre d'une obtenue en ajoutant 8.2 à la liste « a ».

La nouvelle liste a doit être l'endroit où le résultat du résultat ci-dessus est ajouté.

a = [1,2,3,4,5,6,7,8,9,10,11,12,8.2] 

Maintenant, pour calculer la valeur suivante de la liste des résultats c.-à-résultat [1] = 7,76, il devrait être le SUMPRODUCT de

a = [2,3,4,5,6,7,8,9,10,11,12,8.2] and 
wts = [0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.10,0.10,0.30] 

La liste « WTS » est la liste fixe et seulement « » serait déplacer la fenêtre, avec le nouveau résultat étant ajouté à un. Tout script python pour y parvenir serait d'une grande aide ici.

Basé sur le ci-dessous, j'applique la fonction ci-dessous à une base de données. Pourriez-vous s'il vous plaît jeter un peu de lumière sur la façon dont j'applique cette fonction à une base de données basée sur plusieurs groupes (basé sur Groupby).

def wma(Curr,wts): 
    Curr.values.tolist() 
    wts.values.tolist() 
    len_list = len(Curr) 
    # Create a fixed sized queue 
    q = deque(maxlen=len_list) 
    # Add list a to q 
    q.extend(Curr) 
    i = 0 
    result = [] 
    while i < len(a): 
     val = sum([x*y for x, y in zip(q, wts)]) 
     q.append(val) 
     result.append(float(round(val, 2))) 
     i += 1 
    return result 

Par exemple j'ai une trame de données avec 5 colonnes à savoir (colonne A, colonne B, colonne C, poids, courant). J'applique la fonction ci-dessus en utilisant le code ci-dessous

s1 = s1.groupby(['Column A', 'Column B', 'Column C']).apply(wma(df['Current'],df['Weights'])) 

Je reçois l'erreur suivante: TypeError: Type unhashable: 'liste'. Toute aide serait d'une grande aide.

Répondre

1

Dans ce cas, vous devez utiliser fixed-sized queue comme indiqué ci-dessous:

Essayez:

from collections import deque 

a= [1,2,3,4,5,6,7,8,9,10,11,12] 
wts= [0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.055555556,0.10,0.10,0.30] 
len_a = len(a) 

# Create a fixed sized queue 
q = deque(maxlen=len_a) 

# Add list a to q 
q.extend(a) 

# See the q 
print('q: ', q) 

i = 0 
result = [] 

while i < len(a): 
    val = sum([x*y for x, y in zip(q, wts)]) 
    q.append(val) 
    result.append(float(round(val, 2))) 
    i += 1 

print('result: ', result) 

# Output 
q: deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], maxlen=12) 
result: [8.2, 7.76, 7.85, 7.95, 8.18, 8.42, 8.63, 8.79, 8.89, 8.93, 8.89, 8.77] 
+0

Merci pour cette réponse. Ce Deque est un nouveau concept que j'ai appris aujourd'hui. – ceeka9388

+0

@ ceeka9388, cela peut être fait en utilisant 'list' aussi, c'est juste que vous avez besoin de' pop' depuis la position '0th' et' append' le 'val', mais en utilisant' queue' est beaucoup plus rapide. – JkShaw

+0

J'ai besoin d'aide pour appliquer cette fonction à un dataframe. Toutes les suggestions seraient d'une grande aide ici. – ceeka9388