실패는 성공을 위한 밑거름

파이선코드 이해가안가서 풀이한것 (개인풀이) 본문

devops/back-end

파이선코드 이해가안가서 풀이한것 (개인풀이)

레드매실 2025. 3. 9. 19:04

파이선코드 이해가안가서 풀이한것 (개인풀이)

df_all[f'scipy_data_{window}'] = df_all[f'scipy_{window}'].rolling(window=10).apply(lambda x: np.polyfit(np.arange(len(x)), x, 1)[0], raw=False) * 100
        
-------------------

rolling(window=10) (+ mean())
rolling의 의미 :
처음부터 배열끝까지 window개까지 데이터를 묶겠다는뜻
그래서 배열앞의 window개까지는 값이 없어진다.
[1-window(=10)(없는값),2-x(없는값), 3-x(없는값),,,,  (1~10원소들의 평균값), (2~11원소들의 평균값), (3~12원소들의 평균값),,,,]
그리고 이거는 바로 값이 나오지않는다. 
평균값을 가져오려면 mean()을 사용하고 사용자 정의함수를 사용하려면 apply를 사용한다.

-----------------------

apply()
x_array.apply 이전의 값(x_array)들을 람다식으로 넘기겠다는것
------------------------

lambda x
item.apply(lambda x : method)  
item을 x로 매개변수삼아서 method로 처리하겠다는 뜻

-------------------

np.arange()
위에 apply보면 그전에 아이템이 배열이고 배열을 x로 치환해서 람다식으로 보이는가?
len(x)는 배열의 길이를 반환하는거고 배열길이만큼 순번을 만들어준다.
만약 x가 10길이의 배열이라면

ex) x = [100, 102, 101, 104, 107, 110, 109, 112, 115, 118]
return np.arange(len(x)) -> return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

-------------------------

np.polyfit(np.arange(len(x)), x, 1)
np.polyfit(시간, 가격, 1)을 통해 **가격이 시간에 따라 얼마나 증가 또는 감소하는지(기울기)**를 계산하는 거야.
np.polyfit([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [100, 102, 101, 104, 107, 110, 109, 112, 115, 118], 1)
y = ax + b에서 기울기 a를 구하는 과정이야.
출력 예시: [1.8, 100.5]
1.8 → 기울기 (stock price 증가 속도)
100.5 → y절편 (시간=0일 때 예상 가격, 무시 가능)

 

메서드를 다시 풀면 

        df_all[f'scipy_data_{window}'] = df_all[f'scipy_{window}'].rolling(window=10).apply(lambda x: np.polyfit(np.arange(len(x)), x, 1)[0], raw=False) * 100
        # 10개씩 묶어서 
        
        item1_1 = easy_code(df_all[f'scipy_{window}'])

        def easy_code(item):
            smooth_prices = item
            # 기울기(변화율) 값을 저장할 리스트
            slopes = []

            # 윈도우 크기 설정 (10개씩 묶어서 계산)
            window_size = 10

            # 데이터 길이만큼 반복
            for i in range(len(smooth_prices)):
                # 10개씩 데이터를 가져오기 (맨 앞부분은 데이터가 부족할 수 있음)
                if i < window_size - 1:
                    slopes.append(None)  # 데이터가 부족하면 기울기 없음
                    continue
                
                # 최근 10개 데이터를 가져오기
                x = smooth_prices[i - window_size + 1 : i + 1].values  # 최근 10개 데이터
                
                # x축 (인덱스) 생성 -> [0, 1, 2, ..., 9]
                x_index = np.arange(len(x))
                
                # 1차 다항 회귀 (선형 회귀) 적용 -> 기울기 계산
                slope = np.polyfit(x_index, x, 1)[0]
                
                # 보기 좋게 100배 확대
                slopes.append(slope * 100)
            return slopes