분류 전체보기

    [collections] Python namedtuple 사용하기

    데이터 사이언스를 하다보면, 데이터를 딕셔너리 형태로 만드는 경우가 많다. 그런데 tuple형태의 자료를 다루는 것이 불가피할 때, 일반적인 튜플의 경우 key값 할당이 불가능하므로 곤란할 때가 많다. 이 때, 내장된 collections 패키지의 namedtuple은 유용한 기능을 수행한다. tuple로 정렬된 여러 x,y좌표들에 대해 거리를 계산하는 공식을 만들었다고 가정하자. 일반적인 tuple로 값을 할당하여 계산 로직을 짜면 아래와 같이 코드가 작성 될 것이다. 일반적인 tuple pt1 = (1.0, 5.0) pt2 = (2.5, 1.5) from math import sqrt line_length = sqrt((pt2[0] - pt1[0]) ** 2 + (pt2[1] - pt1[1]) ** ..

    Python에서 SQL에 데이터 UPSERT하기

    Python에서 SQL에 데이터 UPSERT하기

    RTDB를 지속적으로 업데이트하게 되면서, key column에 대해 중복되지 않게 데이터를 업데이트하는 로직의 필요성이 생겼다. Pandas의 to_sql 메서드의 경우 같은 이름의 SQL 테이블이 존재할 때 3가지 방식을 지원하는데, 아래와 같다. if_exists: 'fail'일 때 테이블이 존재하면 ValueError를 일으킨다. if_exists: 'replace'일 때 테이블이 존재하면 기존의 테이블을 없애고 새로운 테이블을 덮어씌워 저장한다. if_exists: 'append'일 때 테이블이 존재하면 새로운 table을 새로운 행으로 추가하여 저장한다. 특정 column에 대해 중복된 행을 제외하고 데이터를 업데이트 하는 기능을 지원할 줄 알았는데, 그런 기능은 없었다. Python으로 이와..

    Pandas에서 DateTime Indexing 응용하기

    데이터를 정제하다 보면, 시계열 자료를 다룰 일이 많다. datetime이라는 패키지만 따로 공부해야 할 정도로 Python의 datetime 타입을 다루는 방식은 가지각색이다. 그 중에서도 오늘은 pandas DataFrame의 DateTime을 indexing하는 방식을 포스팅하려고 한다. Slicing DataFrame의 loc 메서드를 사용하면 SQL과 비슷한 방식의 직관적인 indexing이 가능하다. 가장 직관적이고 쉬운 만큼 많이 활용하는 방식이다. 아래와 같은 간단한 DataFrame을 생성한다. 2021년 1월 1일부터 80일간의 데이터를 생성하였다. import numpy as np import pandas as pd from datetime import datetime as dt df..

    Python의 concurrent.futures 활용하여 병렬 실행 결과 return하기

    공장의 여러 tag들로 데이터를 한꺼번에 긁어와야 할 일이 생겼다. 문제는, tag 갯수가 많은데 함수가 list를 받아들이지 못해 for문으로 일일히 데이터를 받아와야 하는 상황이 생겼다. 시간을 단축시키는 일이 중요한 업무인지라 이를 병렬로 실행시키는 방법을 알아보게 되었다. 원리를 쉽게 설명하면 컴퓨터의 cpu에는 코어가 존재하고, 코어 안에는 스레드가 있다. 작업을 실행시키면, 스레드에 작업을 할당하여 실행시키는데 Python의 thread를 할당하는 함수를 사용하여 작업을 할당시켜 반복문을 돌게 하는 것이다. 알아본 결과, Python의 thread를 할당하는 패키지는 threading, multiprocessing, subprocess 등이 있는데 병렬 실행은 성공하였지만 결과를 return하..

    Pandas에서 결측치를 채워넣는 여러 방법들

    데이터 분석가의 재량을 넘어서서 현장의 문제가 존재하기 때문에, 아무리 좋은 데이터를 가져온다 하더라도 결측치는 존재할 수 밖에 없다. 학생 신분으로 실습을 할 때에는 결측치를 대부분 없앤 뒤 데이터를 사용하였지만, 회사에서 일을 하는 입장이 되니 정합성 있게 데이터를 채워넣는 일이 중요해졌다. 따라서 pandas에서 결측치를 단순히 없애는 방법이 아닌, 정교하게 채워넣는 기술들에 대해 정리해보려 한다. 1. fillna함수 응용하기 # fillna() 함수로 결측치 채워넣기 df.fillna(0) # 결측치를 0으로 채우기 df.fillna('a') # 결측치를 a라는 문자열로 채우기 df.fillna(method= 'ffill') # 뒤의 결측치를 앞의 값으로 채우기. 'pad'도 사용 가능하다. d..

    Python 내장 패키지 itertools 도장깨기

    코딩 테스트를 볼 때 내장 패키지를 알면 도움이 되는 경우가 적지 않다. 외부 패키지를 import할 수 없기 때문에, 내장 패키지를 최대한 활용하는 것이 좋다. 특히 Python의 경우 언어가 단순한 만큼 input이 커지면 시간복잡도가 다른 언어에 비해 높다. 따라서 직접 짠 모듈을 쓰는 것보다 기존의 내장 패키지를 import하는 것이 좋다. 오늘은 그 중 itertools라는 iterable한 객체를 처리할 수 있는 패키지에 대해 정리해보려 한다. 공식 package guideline은 아래와 같다. https://docs.python.org/ko/3/library/itertools.html itertools — 효율적인 루핑을 위한 이터레이터를 만드는 함수 — Python 3.9.6 문서 doc..

    Pandas concat 함수 응용하기

    concat함수는 데이터를 재구조화할 때 가장 많이 사용하는 함수 중 하나일 것이다. 다양한 테이블을 방향에 상관없이 merging할 때 많이 쓰인다. Pandas에 merge라는 메소드가 따로 존재함에도, merge보다 concat함수를 많이 사용한다. merge의 경우 테이블 병합이 2개까지만 이루어지지만, concat의 경우 리스트 형태로 합치기 때문에 더욱 실용적이다. 기본 문법 pd.concat(objs, axis = 0, # 0일 경우 행병합(위아래 합치기) 1일 경우 열병합(좌우로 합치기). Default는 0. join = 'outer', # 'outer'의 경우 outer join, 'inner'의 경우 inner join. Optional. ignore_index = False, # T..

    pyodbc를 이용하여 python에서 MSSQL 연결하기

    pyodbc를 이용하여 python에서 MSSQL 연결하기

    python에서 DB를 연결할 때 주로 SQLite3를 많이 사용하지만, 회사에서 MSSQL을 사용해야 할 일이 생겼다. Python의 SQLAlchemy 툴킷을 이용하면 다양한 형태의 DB에 접근할 수 있다. SQLAlchemy는 쉽게 각 DB의 API를 이용해 Python에서 제어할 수 있게 해주는 ToolKit이라 생각하면 된다. MSSQL 사전 설정하기 MSSQL 홈페이지에서 개발자용 SQL Server를 다운로드한다. https://www.microsoft.com/ko-kr/sql-server/sql-server-downloads Microsoft SQL Server Management Studio를 실행한다. PC 설정 > 시스템 > 정보의 디바이스 이름을 서버 이름으로 설정하고 로그인한다. ..