MINERVA/Python 2022. 11. 12. 04:38
반응형

행(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.정리

세부적인 설명보다는 샘플코드와 실행결과를 보면 이해가 쉽게 될것으로 생각되어 코드와 실행결과를 남겼습니다.

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 11. 7. 16:42
반응형

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은 데이타 분석을 위한 다양한 기능이 기본으로 제공되는 것 같다.

반응형
posted by choiwonwoo
:
MINERVA/ETC 2022. 10. 15. 12:02
반응형

참여했던 프로젝트를 완료하고 시간이 지난후에 어떤 기능이 않된다고 연락을 받을때 마다 순간 순간 멍해진다.

 

오늘도 프로그램이 뜨지 않는다고 해서 연락을 받고 들여다 보니 쩝....

 

그래도 간략히 정리해두자.

 

[에러 메시지 1]
[에러 메시지 2]

해당 화면이 뜨는 원인은 분명하다. kiwoom에서 패포하는 ocx 파일의 버젼이 갱신, 즉 업데이트되었기 때문입니다.

그래서, 업데이트를 해주어야 하는데, 현재 프로젝트에서 직접 kiwoom에서 패포하는 ocx파일을 가져올수 없습니다.

 

KOA StudioSA

그래서, kiwoom에서 관리 배포하는 KOA StudioSA를 로긴을 정상적으로 진행하는 방식으로 OCX를 업데이트 하면 해결됩니다.

 

참 쉽죠~~

반응형
posted by choiwonwoo
:
MINERVA/C_CPP 2022. 9. 11. 09:33
반응형

몇년전 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 오픈

# 빌등 완료후 생성된 라이브러 확인

생성된 Dynamic library

cf) 참고로 static library를 생성을 위해서, LIBRARY_TYPE을 STATIC으로 변경하면됨

Static library configure
생성된 Static library

 

 

 

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 9. 3. 21:58
반응형

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의 메모리 관리와 인터프린터 언어의 특성에 대해서 감(?)을 잡아함. 이부분은시간이 날때 따로 정리 하도록하겠습니다.

 

반응형
posted by choiwonwoo
:
MINERVA/Git 2022. 8. 26. 03:11
반응형

# 갑자기 push이후에 오랫동안 hang on..이 되면서 멍때릴때는 현상이 발행하면

cmd 창에서 'git push -u orgin main' 으로 진행해주세요.

 

 

 

 

 

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 8. 19. 14:21
반응형

개발 언어를 여러개 사용하다보니 순간 순간 헷갈리는 경우가 있어 나를 위해 기록으로 남김

 

[C/C++]
 for (int i = 0; i < 10; i++) {
    printf("%d\n", i);
}

[PYTHON]
for i in range(0, 10, 1): #range(시작,끝,증가값)
  print i

 

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 8. 16. 07:57
반응형

해당 일이 휴일 또는 공휴일인지 확인

 

# 공휴일 체크 모듈:

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가 리턴됨

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 8. 16. 07:47
반응형

리스트내에 값(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

반응형
posted by choiwonwoo
:
MINERVA/Python 2022. 8. 15. 08:31
반응형

아래 코드는 특정 날짜를 기준으로 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

 

반응형
posted by choiwonwoo
: