2017-09-14 8 views
0

2列の「パンツ」と「ヒット」を日付で索引付けすると、最新の過去の打撃平均(平均数atbatあたりのヒット数)たとえば、過去の打撃平均は、10を超える最小の死傷者数である可能性があります。これは、条件付き数のルックバック期間を持つローリングウィンドウのようなものです。たとえば、次のように指定します。列の合計に基づいてカスタムルックバックの長さを持つパンダローリングウインドウ

 date, atbats, hits, 
2017-01-01,  5, 2, 
2017-01-02,  6, 3, 
2017-01-03,  1, 1, 
2017-01-04,  12, 3, 
2017-01-04,  1, 0, 

最初の日には、過去の未亡人がありませんでした。 2日目はわずか6です。両方とも10未満であるため、NaNでも0でもかまいません。

3日目では、過去2日間を振り返り、5 + 6の平均値(2 + 3)/(5 + 6)= 0.45ヒット/ atbat。

3日目は、過去3日間を振り返り、(2 + 3 + 1)/(5 + 6 + 1)= 0.5ヒット/ atbatを取得します。

4日目は、最後の日を振り返り、4/16 = 0.25ヒット/ atbatを取得します。最終日は10(16)を超えているので、これ以上見る必要はありません。

最終データフレームは次のようになります。

 date, atbats, hits, pastAtbats, pastHits, avg, 
2017-01-01,  5, 2,   0,  0, 0, 
2017-01-02,  6, 3,   0,  0, 0, 
2017-01-03,  1, 1,   11,  5, 0.45, 
2017-01-04,  16, 4,   12,  6, 0.50, 
2017-01-04,  1, 0,   16,  4, 0.25, 

はパンダで可能な計算のこの種のですか?

私が考えることができる唯一の解決策は、純粋なブルートフォースです。各行のatbatsでヒットを分割し、各行をx回複製します。ここでx = atbats、そして10のローリングウィンドウを行います。 「atbats」は1日平均約80であるため、データフレームのサイズと計算するウィンドウの総数が大幅に増加します。

答えて

0

必要なものを達成するためにiterrowsを使用してください。以下を参照してください:

オリジナルデータフレーム:

index atbats hits 
1  5  2 
2  6  3 
3  1  1 
4  16  4 
4  1  0 
5  1  0 
6  14  2 
7  5  1 

コード:

data = [] 
last = [0,0] 
past_atbats = 0 
past_hits = 0 
for i, row in df.iterrows(): 
    if(last[0] >= 10): 
     data.append(last.copy()) 
    else: 
     data.append([0,0]) 

    if(row['atbats'] >= 10): 
     last[0] = row['atbats'] 
     last[1] = row['hits'] 
    else: 
     last[0] += row['atbats'] 
     last[1] += row['hits'] 

df_past = pd.DataFrame(data=data,index=df.index,columns=['past_atbats','past_hits']) 
df = df.merge(df_past,left_index=True,right_index=True) 
df['avg'] = df['past_hits'].divide(df['past_atbats']) 

結果に:

index atbats hits past_atbats past_hits  avg 
1  5  2   0   0  NaN 
2  6  3   0   0  NaN 
3  1  1   11   5 0.454545 
4  16  4   12   6 0.500000 
4  16  4   16   4 0.250000 
4  1  0   12   6 0.500000 
4  1  0   16   4 0.250000 
5  1  0   17   4 0.235294 
6  14  2   18   4 0.222222 
7  5  1   14   2 0.142857 

おそらく最適化を行うことができますが、私はそれはあなたを助けになると思います。

+0

私は、よりパフォーマンスの高いものを望んでいました... iterrowsを使用することは、効果的に手動で行ごとに繰り返すだけです。 – Albeit

関連する問題