reversals 함수에서 변곡점 찾았다면 이제 본격적으로 사이클을 추출할 차례이다.
알고리즘 순서
- reversals 함수 결과값에서 Peak와 Valley를 읽어온다. 데이터가 없다면 6번으로
- 변곡 포인트의 수가 3개 미만이라면, 1번으로 가서 계속 point를 받아온다.
- x1,x2,x3 세 개의 포인트를 가지고 Y, X range 를 지정한다. (이 때 범위는 절댓값으로 표기한다)
- Y 와 X 값을 비교한다
- X < Y 라면 1번으로 간다.
- X >= Y 라면 4번으로 간다.
- 범위 Y가 시작 포인트를 포함한다면 5번으로
- 그렇지 않다면, 범위 Y를 하나의 사이클로 저장하고 범위 Y에 해당하는 Peak와 Valley 변곡점 2개를 삭제한 후 2번으로
- 범위 Y를 0.5 사이클로 저장하고, 첫번째 데이터(시작점)를 버린 후, 그 다음 데이터를 시작점으로 지정한다. 그리고 2번으로
- 남아있는 각 범위를 0.5 사이클로 계산하여 저장한다.
전체 코드
def extract_cycles(series):
points = deque()
# 주기 저장 형식 지정해주는 함수
def format_output(point1, point2, count):
i1, x1 = point1
i2, x2 = point2
rng = round(abs(x1 - x2),2)
mean = 0.5 * (x1 + x2)
return rng, mean, count, i1, i2
for point in reversals(series):
# Step1 : Peak 과 Valley 포인트를 하나씩 불러옴
points.append(point)
while len(points) >= 3:
# Step2 : 가장 최근의 데이터 포인터 3개 범위의 절댓값을 X 와 Y로 지정
x1, x2, x3 = points[-3][1], points[-2][1], points[-1][1]
X = abs(x3 - x2)
Y = abs(x2 - x1)
# Step3 : 범위 X 와 Y의 절댓값 크기 비교
if X < Y:
# Step3-a :Step1 으로 돌아가 다른 데이터 포인트 받아오기
break
# Step3-b => Step4 ( X >= Y )
# Step5 : Y에 주기 시작점이 포함되어 있는 경우,
elif len(points) == 3:
# 범위 Y를 0.5 사이클로 카운트하여 값 저장
yield format_output(points[0], points[1], 0.5)
# 시작점을 버리고
points.popleft()
# Step2 이동
# Y에 시작점이 포함되어있지 않은 경우,
else:
# Step4 : 범위 Y를 1사이클로 저장한 후,
yield format_output(points[-3], points[-2], 1.0)
# 가장 마지막 값 저장
last = points.pop()
# 해당 범위의 Peak 과 Valley 삭제
points.pop()
points.pop()
# 저장해둔 마지막 값을 다시 포인터로 저장
points.append(last)
else:
# Step6 : point 전체 순회 끝났다면, 남은 범위는 각각 0.5 사이클로 저장
while len(points) > 1:
yield format_output(points[0], points[1], 0.5)
points.popleft()
사용 변수
- x1,x2,x3 : 범위 계산에 사용되는 가장 최근의 포인트 3개
- Y : x2- x1 절대값
- X : x3-x2 절대값
X 가 Y보다 더 최근데이터이다.
간단 예시 보기
이런식으로 데이터를 한 칸씩 미루면서 범위 Y와 X를 비교한다고 보면 된다.
이때, 변곡점의 수가 3개라면 첫번째 데이터는 자동으로 사이클의 시작점이 된다.
단계별 시각화
흰색 배경은 0.5 사이클, 빨간색 배경은 1사이클이다.
왼쪽은 Y와 X를 색으로 표시한 후 사이클에 해당하는 구간을 칠해주었고,
오른쪽은 해당 순서가 끝난 후 변경된 데이터의 모습을 보여주고 있다.
마지막 3줄의 경우, 이미 reversals에서 모든 데이터를 받아온 후 이기 때문에 각 범위를 0.5 사이클로 지정하는 과정이다.
extract_cycles 에 데이터를 넣은 결과를 데이터프레임으로 나타내면 다음과 같다.
함수에 내에 있는 format_output 함수의 기능을 통해, 최종적으로 (range, mean, count, i1,i2) 형태의 값이 반환된다.
'🏷️Workplace > ANALYSIS' 카테고리의 다른 글
[RainflowCounting] 라이브러리 분석 - 개요 (0) | 2023.10.17 |
---|---|
[RainflowCounting] count_cycles( ) (0) | 2023.10.17 |
[RainflowCounting] reversals( ) (0) | 2023.10.17 |
네이버금융 기업 실적 분석 데이터 크롤링 (2) | 2023.02.04 |
[크롤링&SQL] 할리스 매장 정보 크롤링 후 DB 저장 (0) | 2023.01.24 |