'Story List'에 해당되는 글 179건
- 2022.10.15 :: [Kiwoom API] OpenAPI OCX 업데이트 에러.. 1
- 2022.09.11 :: [libevent] visual studio 2019 compile
- 2022.09.03 :: [Python] 동적 변수 선언, 값 할당 그리고 사용
- 2022.08.26 :: [Git] GUI 에서 push 후 hang on..상태
- 2022.08.19 :: [Python] for 문 비교( C/C++ vs Python)
- 2022.08.16 :: [Python] 휴일 & 공휴일 확인
- 2022.08.16 :: [Python] 리스트 안에 값(value, element)가 있는지 확인
- 2022.08.15 :: [Datetime] 기준날짜를 offset day 계산
- 2022.08.13 :: [데이타 변환] list str 원소를 int 로 변환
- 2022.08.10 :: [Pandas] 데이타프레임(DataFrame)을 엑셀(excel) 파일로 저장
참여했던 프로젝트를 완료하고 시간이 지난후에 어떤 기능이 않된다고 연락을 받을때 마다 순간 순간 멍해진다.
오늘도 프로그램이 뜨지 않는다고 해서 연락을 받고 들여다 보니 쩝....
그래도 간략히 정리해두자.
해당 화면이 뜨는 원인은 분명하다. kiwoom에서 패포하는 ocx 파일의 버젼이 갱신, 즉 업데이트되었기 때문입니다.
그래서, 업데이트를 해주어야 하는데, 현재 프로젝트에서 직접 kiwoom에서 패포하는 ocx파일을 가져올수 없습니다.
그래서, kiwoom에서 관리 배포하는 KOA StudioSA를 로긴을 정상적으로 진행하는 방식으로 OCX를 업데이트 하면 해결됩니다.
참 쉽죠~~
몇년전 libevent library기반으로 개발된 프로젝트를 업그레이드중 libevent를 visual sutdio 2019 포팅하는게 조금 번거로워 해당 내용을 정리합니다.
1. 소스 가져오기
> git clone https://github.com/libevent/libevent.git
2. 컴파일 하기
1) 빌드 디렉토리 생성
> md build
2) cmake-gui.exe 실행 및 path 설정
-(1) 소스 파일과 빌드 target 디렉토리 설정
-(2) 설정(configure) 파일 생성
-(3) visual studio 2019 solution 파일 생성
-(4) 빌드하기
(1) 소스 파일과 빌드 target 디렉토리 설정
# 위 에러 메시지를 보면, OpenSSL 라이브러리에 대한 설정내용이 없기때문임.
해결방법은 OpenSSL 라이브러리를 설정해주거나, 아니면 빼버리면 됩니다.(전, 빼는 방향으로 진행하겠습니다.^^)
# BUILD_TYPE을 Debug, 암호모듈(MBEDTLS,OPENSSL)을 OFF, 그리고 빌드정보를 보기 위해 VERBOSE로 설정
(2) Configure를 클릭하면, 위와 같이 성공 메시지를 확인 가능
> Configuring done
(3) visual studio 2019 solution 파일 생성
(4) 빌드하기
# Open Project를 클릭 -> Visual Studio 2019 오픈
# 빌등 완료후 생성된 라이브러 확인
cf) 참고로 static library를 생성을 위해서, LIBRARY_TYPE을 STATIC으로 변경하면됨
C/C++을 오랫동안(음...20년이 넘나?)사용하다가, Data type assignment 언어인 Python은 처음부터 접근과 사용이 매우 수월(?)했습니다. 그렇지만, 문법(?)적으로 동적으로 변수를 선언 및 사용하는 방법은 다른 개발 언어와 비교했을때 확실히 다름(?)이 있어, 아래와 같이 간단히 정리하고자 합니다.
# 지역별 APT 평균 가격
# 강남구,서초구,........
regionPrice = ['14억', '13억', '9억', '7억', '6억']
#regionMajor = [....]
# 동적 변수 선언 및 값 할당
for i in range(0, len(regionPrice)):
locals()['df{}'.format(i)] = regionPrice[i]
# 동적 변수 접근
for i in range(0, len(regionPrice)):
df = locals()['df{}'.format(i)]
print(df)
프로젝트에 사용된 일부 코드를 발취하여 편집하였습니다.
글로벌 변수로 사용하기 위해서는 locals() --> Globals()로 변경하면 됩니다.
기술적인 이론을 이해하기 위해서는, Python의 메모리 관리와 인터프린터 언어의 특성에 대해서 감(?)을 잡아함. 이부분은시간이 날때 따로 정리 하도록하겠습니다.
# 갑자기 push이후에 오랫동안 hang on..이 되면서 멍때릴때는 현상이 발행하면
cmd 창에서 'git push -u orgin main' 으로 진행해주세요.
개발 언어를 여러개 사용하다보니 순간 순간 헷갈리는 경우가 있어 나를 위해 기록으로 남김
[C/C++]
for (int i = 0; i < 10; i++) {
printf("%d\n", i);
}
[PYTHON]
for i in range(0, 10, 1): #range(시작,끝,증가값)
print i
해당 일이 휴일 또는 공휴일인지 확인
# 공휴일 체크 모듈:
pytimekr
# 샘플 코드
import datetime
from pytimekr import pytimekr
# 주말(weekend) & 연휴(holiday)
def CheckOffDay(d):
holidayList = pytimekr.holidays()
bHoliday = holidayList.__contains__(d)
bWeekday = d.weekday() > 4
return(bWeekday or bHoliday)
if __name__ == '__main__':
# 리턴: 리스트 형태로 관련값 반환: %Y-%m-%d
#holidayList = pytimekr.holidays()
#for index in holidayList:
# print(index)
# 시분초 없이
dtTest = datetime.date(2022, 9, 8)
print(type(dtTest))
print(dtTest)
# for manual test
strToday = '20220815'
dtToday = datetime.datetime.strptime(strToday, '%Y%m%d')
print(type(dtToday))
print(dtToday.date())
print(CheckOffDay(dtToday.date()))
# CheckOffDay()를 통해서, 해당일이 공휴일 또는 주말이면 True가 리턴됨
리스트내에 값(value, element)가 존재하는지 확인 하는 3가지 방법
아래 코드는 광복절(8월 15일)이 리스트 내에 존재하는지 확인
# 리스트 안에 값(value, element)가 있는지 확인
dtDay = datetime.date(2022, 8, 15)
holidayList = pytimekr.holidays()
# 방법1:
bOffDay = holidayList.__contains__(dtDay)
print(f'[방법 1:] {bOffDay}')
# 방법2:
bOffDay = False
if dtDay in holidayList:
bOffDay = True
print(f'[방법 2:] {bOffDay}')
# 방법3:
bOffDay = False
if holidayList.count(dtDay) > 0:
bOffDay = True
print(f'[방법 3:] {bOffDay}')
[결과]
[방법 1:] True
[방법 2:] True
[방법 3:] True
아래 코드는 특정 날짜를 기준으로 offset day를 구하는 코드 입니다.
이때, working day를 기준으로 해당 날짜를 예제입니다.
사용 용례: 오늘을 기준으로 working day 5일전의 날짜는 언제인가?(주말제외)
# working days 계산: 오늘 기준 5일전(당일제외) 날짜 구함(단, 주말을 제외)
nBefore = 5
PivotDatetime = datetime.datetime.now()
BeforeDatatime = PivotDatetime - datetime.timedelta(days=nBefore)
# BeforeDatatime 부터 PivotDatetime 으로 주말이 몇번 있는지 확인
nLoop = 0
nOffday = 0
while nLoop < nBefore:
if CheckWeekend(BeforeDatatime):
nOffday = nOffday +1
BeforeDatatime = BeforeDatatime + datetime.timedelta(days=1)
nLoop = nLoop + 1
#
BeforeDatatime = PivotDatetime - datetime.timedelta(days=(nBefore+nOffday))
strBeforeDay = BeforeDatatime.strftime('%Y%m%d%H%M%S')
#
print(f'{BeforeDatatime} {PivotDatetime}')
주말을 체크하는 함수
# return: Bool
def CheckWeekend(d):
return d.weekday() > 4
파이썬의 데이타 변환은 이전 블로그 글에서 소개드린 대로 매우 직관적으로 됩니다. 하지만, 다른 객체의 원소로 포함된 데이타 타입의 변환은 익숙하지 않으면 실수할 수 있어 정리하고자 합니다.
# List 원소 str원소를 int로 변환
stringList = ['1','2','3','4','5']
print(type(stringList))
print(stringList)
# 방법1: map 사용
intList1 = list(map(int,stringList))
print(type(intList1))
print(intList1)
# 방법2: list 사용
intList2 = [int(n) for n in stringList]
print(type(intList2))
print(intList2)
[결과]
['1', '2', '3', '4', '5']
<class 'list'>
[1, 2, 3, 4, 5]
<class 'list'>
[1, 2, 3, 4, 5]
cf) 추가 적으로 위의 방법은 python 3인 경우에 적용되며, python 2를 사용한다면 아래를 사용
intList1 = map(int, stringList)
print(type(intList1))
print(intList1)
DataFrame 데이터를 엑셀(excel)로 저장하는 방법중 개인적으로 선호하는 두가지 방법을 정리하고자 합니다.
1. to_excel() 사용
to_excel()함수를 보면, 다양한 인자를 지원하고 있는 것을 확인 할수 있습니다. 하나하나 세세하게 살표보면 좋겠지만, 제 경험상으로는 파일 이름(excel_writer)과 엑셀형식에서 맞게 시트 이름(sheet_name) 정도만 알면 일차적으로 접근하는데는 무리가 없습니다.
(샘플코드)
# 투자자별 순매수 상위종목
# 20220808 부터 20220809 까지 개인의 순매수 금액이 높은 순서대로 종목을 정렬해서 반환
# KOSPI, KOSDAQ, KONEX
# 금융투자 / 보험 / 투신 / 사모 / 은행 / 기타금융 / 연기금 / 기관합계 / 기타법인 / 개인 / 외국인 / 기타외국인 / 전체
market = "ALL"
strfrom = "20220809"
strTo = "20220809"
foreignDf = stock.get_market_net_purchases_of_equities(strfrom, strTo, market, "외국인")
print(foreignDf)
# 파일 이름
prefix = 'cww'
suffix = datetime.datetime.now().strftime("_%y%m%d_%H%M%S.xlsx") #연월일_시분초
print('{}{}'.format(prefix,suffix))
filename = prefix + suffix
print(filename)
# 저장
foreignDf.to_excel(
excel_writer=filename,
sheet_name='외국인',
index=False)
print('Done')
위의 코드는 프로젝트 코드의 일부를 발취한 부분으로, 주기적으로 외국인이 순매수한 거래량과 거래대금등을 취합하고, 그 내용을 엑셀 파일로 기록하는 부분입니다.
해당 경로에 파일이 파일이 없으면 새로 만들지만, 이미 존재하면 덮어쓰기를 함
(실행결과)
to_excel()의 경우 하나의 시트만 저장 가능함. (이 부분은 단점으로 생각됨)
그래서, 하나의 엑셀파일에 여러 시트를 저장하는 경우는 아래의 방법을 사용
2. ExcelWriter()사용
여러개 데이타프레임을 하나의 엑셀 파일에 저장
# 투자자별 순매수 상위종목
# 20220808 부터 20220809 까지 개인의 순매수 금액이 높은 순서대로 종목을 정렬해서 반환
# KOSPI, KOSDAQ, KONEX
# 금융투자 / 보험 / 투신 / 사모 / 은행 / 기타금융 / 연기금 / 기관합계 / 기타법인 / 개인 / 외국인 / 기타외국인 / 전체
market = "ALL"
strfrom = "20220809"
strTo = "20220809"
foreignDf = stock.get_market_net_purchases_of_equities(strfrom, strTo, market, "외국인")
print(foreignDf)
#market = "KOSPI"
gigwanDf = stock.get_market_net_purchases_of_equities(strfrom, strTo, market, "기관합계")
print(gigwanDf)
#
tusinDf = stock.get_market_net_purchases_of_equities(strfrom, strTo, market, "투신")
print(tusinDf)
#
samoDf = stock.get_market_net_purchases_of_equities(strfrom, strTo, market, "투신")
print(samoDf)
# 파일 이름
prefix = 'cww'
suffix = datetime.datetime.now().strftime("_%y%m%d_%H%M%S.xlsx") #연월일_시분초
print('{}{}'.format(prefix,suffix))
filename = prefix + suffix
print(filename)
# 저장
writer = pd.ExcelWriter(filename)
foreignDf.to_excel(writer, sheet_name='외국인')
gigwanDf.to_excel(writer, sheet_name='기관')
tusinDf.to_excel(writer, sheet_name='투신')
samoDf.to_excel(writer, sheet_name='사모')
writer.save()
(출력결과)