2017-01-28 35 views
1

我正在查看年度化的棒球統計數據,並且希望計算回顧前3年的點擊數量方面的表現。然而,我想說明一個事實,即在我的數據集超過3年的時候,一個單一球員可能只在聯盟中待了1 - 2年,而且不會有3年的觀測值,計算滾動平均值。例如:如何在沒有保證觀測數的情況下使用Pandas滾動平均值

In[6]: df = pd.DataFrame({'PLAYER_ID': ['A', 'A', 'A', 'B', 'B'], 
          'HITS': [45, 55, 50, 20, 24]}) 
In[9]: df 
Out[9]: 
    PLAYER_ID HITS 
0   A 45 
1   A 55 
2   A 50 
3   B 20 
4   B 24 

我將如何使用GROUPBY和聚合/變換(或一些其他進程)來計算滾動平均值爲每個玩家具有最大3年曆史總計,然後只用可用的最大具有少於3年曆史績效數據的球員的歷史觀察數據?

很確定我的答案在於Pandas包,但會對任何解決方案感興趣。

謝謝!

+0

您確定滾動手段實際上是您想要的嗎?每個球員只有一到三個觀察數據,這個數據太稀少了,因此滾動意味着特別有意義。 –

+0

爲了簡化說明,它被年度化了。我會在遊戲關卡數據上做一些其他事情。 – Alt182

+0

什麼是你的[抽樣頻率](http://pandas.pydata.org/pandas-docs/stable/timeseries.html#resampling)? –

回答

1

pd.DataFrame.rolling自動處理這個問題。使用您的數據。例如,df.groupby('PLAYER_ID').rolling(1).mean()會給你:

   HITS PLAYER_ID 
PLAYER_ID 
A   0 45.0   A 
      1 55.0   A 
      2 50.0   A 
B   3 20.0   B 
      4 24.0   B 

對於示例情況下,我使用的只是1窗口大小,這意味着我們對待每個觀測作爲自己的意思。這不是特別有趣。有了更多的數據,你可以使用更大的窗口大小:例如,如果你的數據是每週,rolling(5)會給你一個大約每月的窗口大小(或者如果你的數據是每天等,則爲rolling(31))。

兩個問題要注意使用這種方法的時候:

  1. 如果你的數據沒有定期採樣(例如,如果它跳過一個星期或在一個月時間),你的移動平均值將不會按時排列。出於這個原因,如果你的數據還沒有定期採樣,你通常會想重​​新採樣。
  2. 如果您的數據包含NaN值,那些值將被傳播:包含該NaN的每個窗口也將爲NaN。您必須以某種方式impute those values以防止這種情況發生。
+0

不能說這對我有用。當我嘗試這個時,我得到一個AttributeError「無法訪問」DataFrameGroupby「對象的可滾動屬性'滾動' 但是,我可以這樣做: 'In [24]:df_test.sort_values(by = ['PLAYER_ID' ,'HITS'],ascending = True,inplace = True) In [25]:df_test = df_test.groupby(['PLAYER_ID'],as_index = False).agg({'HITS':{'Rolling Avg HITS' :lambda x:x [-3:]。意味着()}}) 在[26]:df_test 缺貨[26]: PLAYER_ID HITS 滾動軸承平均HITS 1乙22' 只要其排序事先就不會在此做同樣的? – Alt182

+0

你使用的是什麼版本的'pandas'? 「滾動」對象最近才推出,在此之前你會使用'rolling_mean(1)',所以試試。至於解決方法:是的,這可能在這個特定的實例中起作用,但我不確定它會推廣到什麼程度。 –

+0

熊貓0.18.0這樣就可以吧。並再次感謝您的幫助。 – Alt182

相關問題