지난 게시글에서 매수 예정 가격 데이터를 데이터프레임화 하였다. 따라서 이번 게시글에서는 해당 파일로부터 데이터를 어떻게 반환받을 수 있는지 살펴보고자 한다.
기본적인 방법론
사실 쓸데없는 내용이라 생각할 수도 있겠지만(정말로 쓸데없는 내용일 수도 있겠지만), 클래스(class)와 클래스 내 함수(def)로부터 반환값을 얻어오는 방법은 단순하다.
예를 들어 아래와 같이 calculator 라는 클래스 내에 add, sub, multiple 이라는 세 개의 함수가 있다고 가정해보자. 해당 클래스는 value1 과 value2 라는 두 개의 변수를 요구하고 있으며, 각각 특정 함수가 실행될 경우 해당 함수에서는 사전에 받은 값 두 개에 대한 산식을 처리한 결과값을 반환하도록 하고 있다.
class calculator:
def __init__(self, value1, value2):
self.value1 = int(value1)
self.value2 = int(value2)
def add(self):
return self.value1 + self.value2
def sub(self):
return self.value1 - self.value2
def multiple(self):
return self.value1 * self.value2
이 때 각각의 결과값들을 얻어오는 방법은 아래와 같다.
>>> calculator(1, 2).add()
>>> 3
>>> calculator(1, 2).sub()
>>> -1
>>> calculator(1, 2).multiple()
>>> 2
물론 클래스와 함수 간에 변수들을 어떻게 주고 받느냐에 따라 구현해야 할 구조는 달라질 수 있겠지만, 본인은 위의 형태를 가장 선호하고 있는 것은 맞다. 그렇다면 만약에 a와 b를 더한 값에 b를 곱한 값을 반환하도록 하기 위해서는 어떤 구조를 갖춰야 할까? 아래의 코드를 살펴보자.
>>> calculator(calculator(1, 2).add(), 2).multiple()
>>> 6
구조가 너무 복잡해진 게 대충 봐도 보일 정도로 눈에 선하다.
그렇다면 우리는 1과 2를 더한 값에 2를 곱하도록 하는 구조를 어떻게 만들어낼 수 있을까? 바로 클래스를 조금 수정해주면 된다. 즉, 아래의 코드와 같이 6번째 줄에서 self.add() 를 실행한 후 해당 결과값을 self.value3 라는 변수에 입력하게 되면 self.value3 에는 3이라는 값이 입력되어 있을 것이다. 그 후에 multiple() 을 사용하면 알아서 self.value3과 self.value2를 곱한 값을 반환하게 되는 것이다.
※ Line : 6, 15
class calculator:
def __init__(self, value1, value2):
self.value1 = int(value1)
self.value2 = int(value2)
self.value3 = self.add()
def add(self):
return self.value1 + self.value2
def sub(self):
return self.value1 - self.value2
def multiple(self):
return self.value3 * self.value2
>>> calculator(1, 2).multiple()
>>> 6
그래서 무슨 말이 하고 싶은 건데?
이제 다시 본론으로 돌아와서 algorithm_1.py 파일의 맨 밑에 위치한 if __name__ == "__main__": 부분을 살펴보도록 하자. Line 5 에서 그 결과값을 얻어올 수 있다는 것을 어렵지 않게 확인할 수 있는데, 그렇다면 그 코드의 결과값을 result 라는 변수 안에 입력해서 출력해보도록 하자.
if __name__ == "__main__":
item_code = "005930"
start_date = "20220715"
min5_data = pd.read_sql(f"SELECT * FROM s{item_code}", manage_db.engine_5min).sort_values(by='time').reset_index(drop=True)
algo1(min5_data, start_date).run()
아래의 수정 사항을 참고하여 결과 데이터를 확인해보자.
※ Line : 5, 6
if __name__ == "__main__":
item_code = "005930"
start_date = "20220715"
min5_data = pd.read_sql(f"SELECT * FROM s{item_code}", manage_db.engine_5min).sort_values(by='time').reset_index(drop=True)
result = algo1(min5_data, start_date).run()
print(result)
>>>
고가가 갱신되었습니다... 20220715, 20220715090000
저가가 갱신되었습니다... 20220715, 20220715090000
고가가 갱신되었습니다... 20220715, 20220715090500
저가가 갱신되었습니다... 20220715, 20220715090500
:
(이하 생략)
:
(True, item_code first_buy_price second_buy_price
0 NaN 60250.0 NaN)
Line 16, 17 을 통해 현재 result 값이 소괄호인 () 로 감싸져 있다는 것을 확인할 수 있으며, True라는 값 뒤에 쉼표가 찍혀 있고 그 뒤 부분에 데이터프레임이 딸려오고 있다는 것 역시 확인할 수 있다. 그렇다면 result 부분을 result[0] 과 result[1] 으로 나누어 출력해보자.
※ Line : 6, 7
if __name__ == "__main__":
item_code = "005930"
start_date = "20220715"
min5_data = pd.read_sql(f"SELECT * FROM s{item_code}", manage_db.engine_5min).sort_values(by='time').reset_index(drop=True)
result = algo1(min5_data, start_date).run()
print(result[0])
print(result[1])
>>>
고가가 갱신되었습니다... 20220715, 20220715090000
저가가 갱신되었습니다... 20220715, 20220715090000
고가가 갱신되었습니다... 20220715, 20220715090500
저가가 갱신되었습니다... 20220715, 20220715090500
:
(이하 생략)
:
True
item_code first_buy_price second_buy_price
0 NaN 60250.0 NaN
이제 알고리즘 파일에서 매수 예정 가격 데이터가 올바르게 계산되며 해당 데이터가 데이터프레임에 정상적으로 입력되는 것을 확인했으므로, 이제 다음 게시글에서 이 데이터를 main.py 파일 내에서 어떻게 활용할 수 있는지 살펴보도록 하자.