'Story List'에 해당되는 글 171건
- 2022.11.12 :: [Python] dataframe 결합 또는 합치기 - UNION 1
- 2022.11.07 :: [Python] Dataframe 행/열 사이 누적합/누적곱
- 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 계산
행(row)과 열(column) 형태인 datafram을 결합하기 위해서 concat() 함수를 사용합니다.
사용 방법은 매우 직관적이며 아래의 샘플코드를 한번 보시면 고등학생때 수업시간에 배운 집합을 생각하시면 매우 간단합니다.
1. 예제1
SampleDf1 = {'A': ['A1', 'A2', 'A3', 'A4'],
'B': ['B1', 'B2', 'B3', 'B4'],
'C': ['C1', 'C2', 'C3', 'C4'],
}
df1 = pd.DataFrame(SampleDf1)
print(df1)
SampleDf2 = {'A': ['A1', 'A2', 'A3', 'A4'],
'B': ['B1', 'B2', 'B3', 'B4'],
'C': ['C1', 'C2', 'C3', 'C4'],
}
df2 = pd.DataFrame(SampleDf2)
print(df2)
(실행결과)
A B C
0 A1 B1 C1
1 A2 B2 C2
2 A3 B3 C3
3 A4 B4 C4
A B C
0 A1 B1 C1
1 A2 B2 C2
2 A3 B3 C3
3 A4 B4 C4
unionDf = pd.concat([df1, df2])
(실행결과)
A B C
0 A1 B1 C1
1 A2 B2 C2
2 A3 B3 C3
3 A4 B4 C4
0 A1 B1 C1
1 A2 B2 C2
2 A3 B3 C3
3 A4 B4 C4
unionDf = pd.concat([df1, df2], ignore_index=True)
- 인덱스 새롭게 설정함
(실행결과)
A B C
0 A1 B1 C1
1 A2 B2 C2
2 A3 B3 C3
3 A4 B4 C4
4 A1 B1 C1
5 A2 B2 C2
6 A3 B3 C3
7 A4 B4 C4
unionDf = pd.concat([df1, df2],axis=1)
print(unionDf)
- 옆으로 데이타를 연결
(실행결과)
A B C A B C
0 A1 B1 C1 A1 B1 C1
1 A2 B2 C2 A2 B2 C2
2 A3 B3 C3 A3 B3 C3
3 A4 B4 C4 A4 B4 C4
unionDf = pd.concat([df1,df2],ignore_index=True).drop_duplicates(keep='first')
print(unionDf)
# 중복행 제거: drop_duplicates() 사용
(실행결과)
A B C
0 A1 B1 C1
1 A2 B2 C2
2 A3 B3 C3
3 A4 B4 C4
unionDf = pd.concat([df1,df2],ignore_index=True).drop_duplicates(keep='last')
print(unionDf)
(실행결과)
A B C
4 A1 B1 C1
5 A2 B2 C2
6 A3 B3 C3
7 A4 B4 C4
2. 예제2
SampleDf1 = {'A': ['A1', 'A2', 'A3', 'A4'],
'B': ['B1', 'B2', 'B3', 'B4'],
'C': ['C1', 'C2', 'C3', 'C4'],
}
df1 = pd.DataFrame(SampleDf1)
print(df1)
SampleDf2 = {'C': ['C1', 'C2', 'C3', 'C4'],
'D': ['D1', 'D2', 'D3', 'D4'],
'E': ['E1', 'E2', 'E3', 'E4'],
'F': ['F1', 'F2', 'F3', 'F4'],
}
df2 = pd.DataFrame(SampleDf2)
print(df2)
unionDf = pd.concat([df1, df2])
print(unionDf)
(실행결과)
A B C
0 A1 B1 C1
1 A2 B2 C2
2 A3 B3 C3
3 A4 B4 C4
C D E F
0 C1 D1 E1 F1
1 C2 D2 E2 F2
2 C3 D3 E3 F3
3 C4 D4 E4 F4
A B C D E F
0 A1 B1 C1 NaN NaN NaN
1 A2 B2 C2 NaN NaN NaN
2 A3 B3 C3 NaN NaN NaN
3 A4 B4 C4 NaN NaN NaN
0 NaN NaN C1 D1 E1 F1
1 NaN NaN C2 D2 E2 F2
2 NaN NaN C3 D3 E3 F3
3 NaN NaN C4 D4 E4 F4
unionDf = pd.concat([df1, df2], ignore_index=True)
print(unionDf)
(실행결과)
A B C D E F
0 A1 B1 C1 NaN NaN NaN
1 A2 B2 C2 NaN NaN NaN
2 A3 B3 C3 NaN NaN NaN
3 A4 B4 C4 NaN NaN NaN
4 NaN NaN C1 D1 E1 F1
5 NaN NaN C2 D2 E2 F2
6 NaN NaN C3 D3 E3 F3
7 NaN NaN C4 D4 E4 F4
unionDf = pd.concat([df1, df2],axis=1)
print(unionDf)
(실행결과)
A B C C D E F
0 A1 B1 C1 C1 D1 E1 F1
1 A2 B2 C2 C2 D2 E2 F2
2 A3 B3 C3 C3 D3 E3 F3
3 A4 B4 C4 C4 D4 E4 F4
3.정리
세부적인 설명보다는 샘플코드와 실행결과를 보면 이해가 쉽게 될것으로 생각되어 코드와 실행결과를 남겼습니다.
Dataframe 객체를 추출(?)이후, 정보 흐름 파악을 위해 컬럼 또는 로우간 누적 합/곱을 합니다.
이때 사용하는 함수로 cumsum / cumprod
가 있습니다.
위에서부터 아래로 한줄씩 덧셈/곱셈을 누적합니다.
1. 예제 데이타 프레임
df = pd.DataFrame({'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]}, index=['1', '2', '3'])
print(df)
[결과]
A B C
1 1 4 7
2 2 5 8
3 3 6 9
2. 누적합 예제
############################
# 행누적합
print()
print(df.cumsum(axis=1))
# 열누적합
print()
print(df.cumsum(axis=0))
[결과]
A B C
1 1 5 12
2 2 7 15
3 3 9 18
A B C
1 1 4 7
2 3 9 15
3 6 15 24
3. 누적곱 예제
############################
# 행누적곱
print()
print(df.cumprod(axis=1))
# 열누적곱
print()
print(df.cumprod(axis=0))
[결과]
A B C
1 1 4 28
2 2 10 80
3 3 18 162
A B C
1 1 4 7
2 2 20 56
3 6 120 504
4. 정리
개발 언어중에, 위의 기능은 python dataframe에만 있는것으로 알고 있다.
C/C++, Java등에서 해당 기능을 구현할려면 루핑을 돌려서 처리하였는데, 역시 Python은 데이타 분석을 위한 다양한 기능이 기본으로 제공되는 것 같다.
참여했던 프로젝트를 완료하고 시간이 지난후에 어떤 기능이 않된다고 연락을 받을때 마다 순간 순간 멍해진다.
오늘도 프로그램이 뜨지 않는다고 해서 연락을 받고 들여다 보니 쩝....
그래도 간략히 정리해두자.
해당 화면이 뜨는 원인은 분명하다. 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