복붙노트

[PYTHON] 팬더 / 데이터 프레임을 사용하여 가중 평균 계산

PYTHON

팬더 / 데이터 프레임을 사용하여 가중 평균 계산

나는 다음 표를 가지고있다. 나는 아래 수식에 따라 각 날짜별로 그룹화 된 가중 평균을 계산하려고합니다. 몇 가지 표준 재래식 코드를 사용하여이 작업을 수행 할 수 있지만이 데이터가 팬더 데이터 프레임에 있다고 가정하면 반복을 통하는 것이 아니라이를 달성하는 더 쉬운 방법이 있습니까?

Date        ID      wt      value   w_avg
01/01/2012  100     0.50    60      0.791666667
01/01/2012  101     0.75    80
01/01/2012  102     1.00    100
01/02/2012  201     0.50    100     0.722222222
01/02/2012  202     1.00    80

2012 년 1 월 1 일 в_авг = 0.5 * (60 / съм (60,80,100)) + .75 * (80 / съм (60,80,100)) + 1,0 * (100 / съм (60,80,100))

2012 년 1 월 2 일 в_авг = 0.5 * (100 / съм (100.80)) + 1.0 * (80 / съм (100.80))

해결법

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

    1.나는 2 명의 그룹 멤버들과 함께 이것을 할 것이라고 생각한다.

    나는 2 명의 그룹 멤버들과 함께 이것을 할 것이라고 생각한다.

    먼저 "가중 평균"을 계산하십시오.

    In [11]: g = df.groupby('Date')
    
    In [12]: df.value / g.value.transform("sum") * df.wt
    Out[12]:
    0    0.125000
    1    0.250000
    2    0.416667
    3    0.277778
    4    0.444444
    dtype: float64
    

    이것을 열로 설정하면 그룹으로 묶을 수 있습니다.

    In [13]: df['wa'] = df.value / g.value.transform("sum") * df.wt
    

    이제이 열의 합계가 원하는 것입니다.

    In [14]: g.wa.sum()
    Out[14]:
    Date
    01/01/2012    0.791667
    01/02/2012    0.722222
    Name: wa, dtype: float64
    

    또는 잠재적으로 :

    In [15]: g.wa.transform("sum")
    Out[15]:
    0    0.791667
    1    0.791667
    2    0.791667
    3    0.722222
    4    0.722222
    Name: wa, dtype: float64
    
  2. ==============================

    2.예제 팬더 데이터 프레임을 먼저 만들어 보겠습니다.

    예제 팬더 데이터 프레임을 먼저 만들어 보겠습니다.

    In [1]: import numpy as np
    
    In [2]: import pandas as pd
    
    In [3]: index = pd.Index(['01/01/2012','01/01/2012','01/01/2012','01/02/2012','01/02/2012'], name='Date')
    
    In [4]: df = pd.DataFrame({'ID':[100,101,102,201,202],'wt':[.5,.75,1,.5,1],'value':[60,80,100,100,80]},index=index)
    

    그런 다음 '값'으로 가중되고 색인으로 그룹화 된 'wt'의 평균은 다음과 같이 구합니다.

    In [5]: df.groupby(df.index).apply(lambda x: np.average(x.wt, weights=x.value))
    Out[5]: 
    Date
    01/01/2012    0.791667
    01/02/2012    0.722222
    dtype: float64
    

    또는 함수를 정의 할 수도 있습니다.

    In [5]: def grouped_weighted_avg(values, weights, by):
       ...:     return (values * weights).groupby(by).sum() / weights.groupby(by).sum()
    
    In [6]: grouped_weighted_avg(values=df.wt, weights=df.value, by=df.index)
    Out[6]: 
    Date
    01/01/2012    0.791667
    01/02/2012    0.722222
    dtype: float64
    
  3. ==============================

    3..csv 파일에 테이블을 저장했습니다.

    .csv 파일에 테이블을 저장했습니다.

    df=pd.read_csv('book1.csv')
    
    grouped=df.groupby('Date')
    g_wavg= lambda x: np.average(x.wt, weights=x.value)
    grouped.apply(g_wavg)
    
  4. ==============================

    4.다음은이 문제에 대한 우아한 해결책입니다. (여러 열을 사용하는 Pandas DataFrame 집계 함수)

    다음은이 문제에 대한 우아한 해결책입니다. (여러 열을 사용하는 Pandas DataFrame 집계 함수)

    grouped = df.groupby('Date')
    
    def wavg(group):
        d = group['value']
        w = group['wt']
        return (d * w).sum() / w.sum()
    
    grouped.apply(wavg)
    
  5. from https://stackoverflow.com/questions/26205922/calculate-weighted-average-using-a-pandas-dataframe by cc-by-sa and MIT license