반응형

개요

1986년 4월 부터 2023년7월까지 월별 데이터프레임 형식을 만드려고 합니다. 이런 작업이 필요했던 이유는 미국 금리데이터의 경우 금리 변동 때 마다 데이터를 기록하기 때문에 임의의 데이터프레임을 만든 후 merge하여 nan부분을 이전 값으로 채워주기 위함입니다.

 

코드

반응형
반응형

에러

trino를 통해 타 DB간 조인시 타입이 안맞는 경우가 있었습니다. 그래서 다른 DB의 카테고리 넘버를 char -> int로 변경하려고 했을 때 위와 같은 에러가 나타났습니다.

해결

해결 방법은 간단하며, CHAR을 VARCHAR로 변경한 후 INT로 변경해주면 됩니다.

## 에러 발생 SQL
cast(broad_cate_no a as int)


## 에러 해결 SQL
cast(cast(broad_cate_no as varchar) as int)
반응형
반응형
import pymysql
conn = pymysql.connect(
    user='id',
    passwd='password',
    host='111.10.1.1',
    db='test_db',
    charset='utf8'
)



#df는 컬럼이 8개인 데이터프레임

cursor = conn.cursor()
sql = 'insert into test_tbl (col1, col2, col3, col4, col5, col6, col7,col8) values '
data = []
for idx, i in tqdm(enumerate(df.values)):
    sql += '(%s, %s, %s, %s, %s, %s, %s, %s),'
    for j in i:
        data.append(j)
    if idx % 30 == 0:
        sql = sql.rstrip(',')
        cursor.execute(sql, tuple(data))
        sql = 'insert into test_tbl (col1, col2, col3, col4, col5, col6, col7,col8) values '
        data = []
sql = sql.rstrip(',')
try:
    cursor.execute(sql, tuple(data))
except:
    pass
conn.commit()
conn.close()
반응형
반응형

에러 원인

보통 위와 같은 원인은 특정 조건이 만족하는 두개의 True/False 값을 and / or연산으로 묶을 때 발생합니다.

예를들어 특정 데이터 프레임에서 몸무게가 50kg이상 키가 170cm이하인 사람을 찾을 때 

 

df['weight'] >= 50kg 과 df['height'] <= '170cm'이 두개의 조건을 and조건자로 찾아야합니다.

 

에러 문법

# and 연산자 1
# and 조건 대신 &를 쓰며, or조건의 경우도 |를 씁니다.
(df['weight'] >= 50) and (df['height'] <= 170)

# and 연산자 2
# 각각의 조건은 () 로 묶어야 합니다.
df['weight'] >= 50 & df['height'] <= 170

해결

df[(df['weight'] >= 50 & (df['height'] != 170)]
반응형
반응형

개요

PERlEPS(2022.09)와 같은 문자열이 있을 때 부터 그 이후의 문자열을 제거하려면 어떻게 해야할까요? 

저는 split를 사용하여 해결하였습니다.

 

코드

#특정 문자 기준으로 분리하기
'PERlEPS(2022.09)'.split('l')

#분리된 리스트에서 0번 인덱스 가져오기
'PERlEPS(2022.09)'.split('l')[0]

해결

반응형
반응형

최근 MSSQL에 python을 통해 전처리 한 대용량 데이터를 insert할 일이 생겨, 관련된 내용을 정리하려고 합니다.

 

테스트에 사용하는 데이터의 row는 10만건이며 행은 15행이 존재합니다.

 

TEST1 : 6분26초 (하나씩 insert - 최종 commit)

첫 번째 테스트는 데이터를 하나씩 삽입 후에 commit을 진행하였습니다.

10만건의 데이터를 삽입하는데 10분이 걸렸으며, 모든데이터 삽입 후 commit을 하기 때문에 중간에 에러 발생시 롤백이 진행됩니다.

 

 

 

TEST2 : 18분41초 (하나씩 insert - 삽입 마다 commit)

 두 번째 테스트는 TEST1과 같은 방식이지만 하나씩 삽입할 때마다 커밋을 해주었습니다. 이런경우 중간에 에러가 날 경우라도 기존에 삽입된 데이터는 유지된다는 장점이 있지만 TEST1에 비해 약 3배 정도 느려진 것을 확인할 수 있습니다.

 

 

 

TEST3 : 23초 (bulk insert)

 세 번째 테스트는 한번 삽이할 때 30개의 데이터를 삽입하는 방법입니다. 벌크 인서트라고 하며, 기존 TEST 대비 엄청 빠른 속도를 보입니다. 

저는 아래 답변을 참고하였습니다.

https://hashcode.co.kr/questions/10863/python-%EC%9A%A9%EB%9F%89%EC%9D%B4-%ED%81%B0-dataframe%EC%9D%84-mssql%EC%97%90-%EB%B9%A0%EB%A5%B4%EA%B2%8C-insert%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%B4-%EB%AD%94%EA%B0%80%EC%9A%94

 

python 용량이 큰 dataframe을 mssql에 빠르게 insert할 수 있는 방법이 뭔가요?

python의 pandas로 데이터프레임을 만들고 mssql에 insert하려는데 데이터프레임이 평균적으로 25만 rows에 14컬럼으로 형성됩니다.sqlalchemy.create_engine으로 sql형태로 전체를 insert하는 방법을 해보니 로컬

hashcode.co.kr

 

 

TEST4 : 7분 38초 (executemany)

executemany 말 그대로 많은 데이터를 인서트하는 방법입니다. 하지만 제가 잘 이해를 못해서 그런지 성능이 크게 좋지 못했습니다.

 

결론

앞선 테스트에서 봤듯이 저는 TEST3번을 통해 데이터를 INSERT했습니다.

TEST3 방법을통해 약 190만건의 데이터를 INSERT하는데 7분41초가 걸렸으며, 혹시 이보다 빠른 속도를 원하시는 분들은 sqlalchemy(create_engine), to_sql등 찾아보면 좋을 것 같습니다.

 

반응형
반응형

이번 포스팅은 리눅스 서버에 아나콘다를 설치하겠습니다.

os는 우분투 18.04 lts에 설치해보도록 하겠습니다.

 

아나콘다 다운

https://www.anaconda.com/products/distribution#linux

 

Anaconda | Anaconda Distribution

Anaconda's open-source Distribution is the easiest way to perform Python/R data science and machine learning on a single machine.

www.anaconda.com

우선 위의 링크에 접속해 anaconda 리눅스 버전을 다운받겠습니다.

마우스 우 클릭 후 링크 주소를 복사합니다.

curl -O https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh

위 명령어를 통해 아나콘다를 다운로드 합니다.

아나콘다 설치

1. sh파일 실행

bash Anaconda3-2022.10-Linux-x86_64.sh

2. 실행 후 엔터를 누르다 보면 라이센트 관련 내용이 나오고 yes를 입력합니다.

3. 아나콘다 디렉토리 위치 선택이 나오며, 엔터를 누르면 자동으로 설정된 디렉토리에 아나콘다가 설치됩니다.

4. conda init 실행 질문에 yes

아나콘다 확인

 설치가 완료된 후 conda 명령어가 실행되지 않을 수 있다 그럴 경우 아래 명령어를 입력해 줍니다.

home아래 본인의 디렉토리 입력 필수

export PATH="/home/taegwan/anaconda3/bin:$PATH"

입력 후에 cond 작성후 tab버튼을 눌렀을 때 자동완성으로 conda가 입력되면 아나콘다가 설치된 것입니다.

또한 서버 재접속 시 명령어 앞에 (base)가 표시되면 설치가 정상적으로 된 것입니다.

 

 

마지막으로 아래 명령어를 통해 콘다 가상환경을 생성한 후 pip 버전을 확인해보겠습니다.

conda env list
#create 실행 후 y입력
conda create -n test python=3.8
conda env list
conda activate test
pip --version

다음은 jupyter notebook 설치를 통해 원격으로 접속하는 방법을 포스팅하겠습니다.

반응형
반응형

위 에러는 문장에 특정 단어를 strip으로 제거할 때 나타났습니다. 문장 그대로 보면 str이 아닌 bytes-like object가 필요하다고 하지만, 에러가 난 문장은 byte타입이었으며, 문자열로 변경하니 정상적으로 작동하는 것을 확인할 수 있었습니다.

 

에러

 

해결

 

반응형

+ Recent posts