2016-07-02 3 views
4

私は、「Date」と「Num」という列を持つデータフレームを持っています。週ごとのパンダデータフレームの分割

dates = pd.date_range('1/1/2001','1/1/2003', freq = 'd') 
nums = [np.random.randint(100) for x in range(len(dates))] 

df = pd.DataFrame({'Dates': dates, 'DOW': dates.strftime('%a'), 'Nums': nums}) 
df = df[(df.DOW != 'Sat') & (df.DOW !='Sun')] 
df = df.drop([7,18]).reset_index(drop = True) 

私は毎週別々に分離することができるようにデータフレームをビンする必要があります。最終的な目標は、毎週のMAXのNums値を調べて、その週のLAST値と比較して、変化率が何であるかを確認することです。たとえば、

week1 = df[0:5] 
week2 = df[5:9] 
week3 = df[9:12] 

In [156]: w1max = week1.Nums.max() 
Out[156]: 97 

In [157]: w2Last = week2.iloc[-1].Nums 
Out[157]: 76 

pctChange = (w2Last-w1max)/float(w1max) 

In [166]: pctChange 
Out[166]: -0.21649484536082475 

問題は、数週間で欠落していることです(例:week2には月がなく、week3には金曜日がありません)。では、どうやってそれらを分けるのですか?

最も近いものはdf.resample()を使用しているようですが、私はこれを使って比較しようとしています。

答えて

5
import numpy as np 
import pandas as pd 
np.random.seed(2016) 

dates = pd.date_range('1/1/2001','1/1/2003', freq = 'd') 
nums = [np.random.randint(100) for x in range(len(dates))] 

df = pd.DataFrame({'Dates': dates, 'DOW': dates.strftime('%a'), 'Nums': nums}) 
df = df[(df.DOW != 'Sat') & (df.DOW !='Sun')] 
df = df.drop([7,18]).reset_index(drop = True) 

df2 = df.groupby(pd.Grouper(freq='W', key='Dates'))['Nums'].agg(['max','last']) 
df2['previous_max'] = df2['max'].shift(1) 
df2['change'] = (df2['last']-df2['previous_max'])/df2['previous_max'] 
print(df2.head()) 

利回りpd.Grouper object

  max last previous_max change 
Dates           
2001-01-07 83 39   NaN  NaN 
2001-01-14 75 75   83.0 -0.096386 
2001-01-21 97 18   75.0 -0.760000 
2001-01-28 72 37   97.0 -0.618557 
2001-02-04 84 24   72.0 -0.666667 

df.groupbyは、行が数週間でグループ化するために使用することができます。各グループにNumsためmaxlast値の両方を検索することがagg方法を使用することができ :その後

In [163]: df2 = df.groupby(pd.Grouper(freq='W', key='Dates'))['Nums'].agg(['max','last']) 

In [164]: df2.head() 
Out[164]: 
      max last 
Dates     
2001-01-07 83 39 
2001-01-14 75 75 
2001-01-21 97 18 
2001-01-28 72 37 
2001-02-04 84 24 

1行max値をダウンシフトする​​を使用:

In [165]: df2['previous_max'] = df2['max'].shift(1); df2.head() 
Out[165]: 
      max last previous_max 
Dates        
2001-01-07 83 39   NaN 
2001-01-14 75 75   83.0 
2001-01-21 97 18   75.0 
2001-01-28 72 37   97.0 
2001-02-04 84 24   72.0 

次に、パーセント変化は、単純な減算および除算によって計算することができる。

In [166]: df2['change'] = (df2['last']-df2['previous_max'])/df2['previous_max']; df2.head() 
Out[166]: 
      max last previous_max change 
Dates           
2001-01-07 83 39   NaN  NaN 
2001-01-14 75 75   83.0 -0.096386 
2001-01-21 97 18   75.0 -0.760000 
2001-01-28 72 37   97.0 -0.618557 
2001-02-04 84 24   72.0 -0.666667 
+0

鮮やかで、.shiftと.Grouperについては知らなかった – RSHAP

関連する問題