2016-06-27 14 views
12

Pandaları kullanma 0.18.1, Tek sütunlu bir veri karesinin yuvarlanma ortalamasını almak isterim. 0.18.0 sürümünden bu, rolling() nesneleriyle yapılır. Bu yuvarlanan nesneler için varsayılan değer haklı olmalıdır. Yuvarlanabilen nesneyi ortadaki değere hizalamak için merkez = Doğru, iletebileceğiniz bir boolean argümanı vardır, ancak sola hizalamanın bir yolu yoktur. İşte bir örnek:Bir pandalar yuvarlanma nesnesini sola hizalama

df = pandas.DataFrame({'A': [2,3,6,8,20, 27]}) 
df 
    A 
0 2 
1 3 
2 6 
3 8 
4 20 
5 27 

standart metot otomatik sağa hizalar, bu nedenle herhangi bir değer büyüklüğü üç bir pencere ile ilk iki endeksi değerlerini de var: Biz işlemini ortalamak-hizalayabilirsiniz

df.rolling(window=3).mean() 
      A 
0  NaN 
1  NaN 
2 3.666667 
3 5.666667 
4 11.333333 
5 18.333333 

böyle:

df.rolling(3).mean() 
      A 
0 3.666667 
1 5.666667 
2 11.333333 
3 18.333333 
4  NaN 
5  NaN 
01:

df.rolling(window=3).mean(center=True) 
      A 
0  NaN 
1 3.666667 
2 5.666667 
3 11.333333 
4 18.333333 
5  NaN 

Ama ne aradığım budur

Bunu, varsayılan doğru hizalama ile yaparak ve sonra yeniden dizine ekleyerek veya satırların sırasını ters çevirerek ve daha sonra "sağa hizalanmış" yaparak gerçekleştirebilirim, ancak bunlar ne olması gerektiğine ilişkin çalışmalardır. düz ileri bir işlem.

cevap

13

Sana shift kullanabilirsiniz düşünüyorum: Ben bunu yapmak için daha doğrudan bir yolu olduğunu umuyordum ama

a = df.rolling(window=3).mean().shift(-2) 
print (a) 
      A 
0 3.666667 
1 5.666667 
2 11.333333 
3 18.333333 
4  NaN 
5  NaN 
+0

Bu, iyi bir çözümdür. Bu işlevsellik henüz haddeleme nesnelerinde değil sanırım. – Alex

+0

Evet, haklısınız galiba. Ben de onu hiç görmedim. – jezrael

+4

Bu cevabı kabul ettim çünkü istenen işlevsellik pandaların yuvarlanan nesnelerinde gerçekten yok ve bu en zarif çözümü sağlıyor. Eğer bu sol hizalamayı biraz daha dinamik bir şekilde yönetmek istendiyse, pencere boyutu bir w değişkeniyle ayarlanabilir ve daha sonra .shift() yöntemindeki argüman w-1 olabilir. – Alex