복붙노트

[PYTHON] Python - GroupBy 객체 롤링 함수

PYTHON

Python - GroupBy 객체 롤링 함수

나는 시계열 객체를 유형으로 그룹화했습니다. grouped.sum ()은 원하는 결과를 제공하지만 rollbysum을 groupby 객체로 작업 할 수 없습니다. groupby 객체에 롤링 함수를 적용 할 수있는 방법이 있습니까? 예 :

x = range(0, 6)
id = ['a', 'a', 'a', 'b', 'b', 'b']
df = DataFrame(zip(id, x), columns = ['id', 'x'])
df.groupby('id').sum()
id    x
a    3
b   12

그러나 나는 다음과 같이하고 싶다 :

  id  x
0  a  0
1  a  1
2  a  3
3  b  3
4  b  7
5  b  12

해결법

  1. ==============================

    1.

    In [16]: df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)
    Out[16]: 
    0    0.0
    1    0.5
    2    1.5
    3    3.0
    4    3.5
    5    4.5
    
    In [17]: df.groupby('id')['x'].cumsum()
    Out[17]: 
    0     0
    1     1
    2     3
    3     3
    4     7
    5    12
    
  2. ==============================

    2.이 오래된 질문을하는 Google 직원에게 :

    이 오래된 질문을하는 Google 직원에게 :

    @ kekert의 @ Garrett의 답변에 대한 의견과 관련하여

    df.groupby('id')['x'].rolling(2).mean()
    

    지금은 더 이상 사용되지 않는

    df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)
    

    흥미롭게도, 새로운 .rolling (). mean () 접근 방식은 group_by 열에 의해 먼저 인덱싱 된 인덱스와 다중 인덱스 시리즈를 반환하는 것으로 보입니다. 반면 이전 접근법은 원래의 df 인덱스로 인덱스 된 인덱스를 반환하기 만 했었지만이 인덱스는 원본 데이터 프레임에 새로운 열로 추가하는 것이 매우 편리했습니다.

    그래서 나는 새로운 rolling () 메서드를 사용하고 여전히 동일하게 작동하는 솔루션을 찾았다 고 생각합니다.

    df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True)
    

    너에게 시리즈를 줄거야.

    0    0.0
    1    0.5
    2    1.5
    3    3.0
    4    3.5
    5    4.5
    

    이 항목을 열로 추가 할 수 있습니다.

    df['x'] = df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True)
    
  3. ==============================

    3.나는 기계공에 대해 잘 모르겠다. 그러나 이것은 효과적이다. 반환 값은 단지 nd 배열이다. 나는이 방식으로 누적 또는 "롤링"함수를 적용 할 수 있으며 같은 결과를 가져야한다고 생각합니다.

    나는 기계공에 대해 잘 모르겠다. 그러나 이것은 효과적이다. 반환 값은 단지 nd 배열이다. 나는이 방식으로 누적 또는 "롤링"함수를 적용 할 수 있으며 같은 결과를 가져야한다고 생각합니다.

    나는 cumprod, cummax 및 cummin으로 그것을 테스트했으며 모두 ndarray를 반환했습니다. 팬더는 이러한 함수가 시리즈를 반환한다는 것을 알기에 충분히 똑똑하다고 생각합니다. 따라서 함수는 집계가 아닌 변환으로 적용됩니다.

    In [35]: df.groupby('id')['x'].cumsum()
    Out[35]:
    0     0
    1     1
    2     3
    3     3
    4     7
    5    12
    

    편집 : 나는이 구문이 시리즈를 반환합니다 궁금 발견 :

    In [54]: df.groupby('id')['x'].transform('cumsum')
    Out[54]:
    0     0
    1     1
    2     3
    3     3
    4     7
    5    12
    Name: x
    
  4. ==============================

    4.판다의 확장 방법을 일반화하고 사용하는 또 다른 방법이 있습니다.

    판다의 확장 방법을 일반화하고 사용하는 또 다른 방법이 있습니다.

    매우 효율적이며 시계열 계산과 같이 고정 된 창을 사용하여 롤링 창 계산을 완벽하게 수행합니다.

    # Import pandas library
    import pandas as pd
    
    # Prepare columns
    x = range(0, 6)
    id = ['a', 'a', 'a', 'b', 'b', 'b']
    
    # Create dataframe from columns above
    df = pd.DataFrame({'id':id, 'x':x})
    
    # Calculate rolling sum with infinite window size (i.e. all rows in group) using "expanding"
    df['rolling_sum'] = df.groupby('id')['x'].transform(lambda x: x.expanding().sum())
    
    # Output as desired by original poster
    print(df)
      id  x  rolling_sum
    0  a  0            0
    1  a  1            1
    2  a  2            3
    3  b  3            3
    4  b  4            7
    5  b  5           12
    
  5. from https://stackoverflow.com/questions/13996302/python-rolling-functions-for-groupby-object by cc-by-sa and MIT license