ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (Python) module 'pandas' has no attribute 'ols' 일 때 같은 형식으로 데이터 추출법
    IT 지식 창고 2019. 1. 23. 21:21
    Chapter 11. 금융, 경제 데이터 애플리케이션

    Python for Data Analysis (2018 웨스 맥키니) 책 중 일부 

    11.2.1 그룹 요인 밝히기

    In [1]:

    from sklearn.linear_model import LinearRegression

    In [2]:
    from numpy.random import rand
    fac1, fac2, fac3 = np.random.rand(3, 1000)
    
    ticker_subset = tickers.take(np.random.permutation(N)[:1000])
    
    # 임의의 값을 추가한 요인들의 가중합
    port = Series(0.7 * fac1 - 1.2 * fac2 + 0.3 * fac3 + rand(1000),
                  index=ticker_subset)
    factors = DataFrame({'f1': fac1, 'f2': fac2, 'f3': fac3},
                        index=ticker_subset)
    
    In [3]:
    port
    
    Out[3]:
    FZFPV    1.027262
    DTPES    0.345704
    UJKFH    0.284356
    YKCGU    0.025836
    XAYZH    0.413685
               ...   
    XZHYB    1.084148
    VESRG    0.800119
    ARPWX    0.389465
    PMUCA    0.755363
    YPVZL    0.628406
    Length: 1000, dtype: float64
    In [4]:
    factors
    
    Out[4]:
    f1 f2 f3
    FZFPV 0.265639 0.075042 0.623549
    DTPES 0.928075 0.606129 0.121780
    UJKFH 0.723554 0.672966 0.175533
    YKCGU 0.397491 0.492140 0.487649
    XAYZH 0.167037 0.052508 0.824024
    ... ... ... ...
    XZHYB 0.994148 0.096528 0.282916
    VESRG 0.906529 0.261134 0.174794
    ARPWX 0.656523 0.952333 0.377645
    PMUCA 0.775668 0.593376 0.720276
    YPVZL 0.493149 0.230171 0.262245

    1000 rows × 3 columns

    In [5]:

    #여기까지 이런 식의 데이터를 사용 할 것이고, 이 데이터를 가지고 회귀 분석을 할 겁니다.

    #이 책에서는 아래와 같이 코드를 치면 그 밑의 결과처럼 나옵니다.

    pd.ols(y=port, x=factors).beta

    Out[5]:
    f1           0.761789
    f2          -1.208760
    f3           0.289865
    intercept    0.484477
    dtype: float64
    In [6]:

    #그러나 최소자승회귀분석(일반적인 선형회귀분석)은 pandas에서 없어졌으므로

    # module 'pandas' has no attribute 'ols'와 같은 오류가 뜹니다.

    #이것을 sklearn을 이용해서 구하겠습니다.


    #먼저 이런식으로 구하면 상당히 많은 자릿수 까지 구하기 때문에 반올림을 해주고 리스트 형식으로 만들어주겠습니다.

    #sklearn에서는 계수와 상수를 같이 구하는 것이 없어서 따로 구하겠습니다.

    #아래는 계수를 구하는 것입니다.

    factors_array = list(np.round(LinearRegression().fit(factors, port).coef_,6)) factors_array
    Out[6]:
    [0.761789, -1.20876, 0.289865]
    In [7]:

    #아래는 상수 즉 B0를 구하는 것이고, 이 또한 반올림을 해주겠습니다.

    intercept = LinearRegression().fit(factors, port).intercept_

    intercept = round(intercept,6) intercept

    Out[7]:
    0.484477
    In [8]:

    #리스트 객체에 원소를 추가합니다.

    factors_array.append(intercept)
    
    In [9]:

    #그리고 데이터들을 모아 시리즈 형식으로 만들어주면 책과 같은 모양의 데이터들을 만들 수가 있습니다.

    index = ['f1','f2','f3','intercept']
    lm = Series(factors_array, index = index)
    lm
    
    Out[9]:
    f1           0.761789
    f2          -1.208760
    f3           0.289865
    intercept    0.484477
    dtype: float64


    파이썬의 스크립트형식인 주피터노트북을 가독성 좋게 올리고 싶지만... 주피터노트북에서 그대로 가져와서 사용하는 거라 가독성을 높이기가 쉽지 않네요 ㅠㅠ 무튼 pd.ols는 현재 사라졌기 때문에 위와 같이 코드를 사용하면 같은 데이터를 추출해 낼 수가 있습니다.


    댓글

Designed by Tistory.