Python
[자료구조] 그래프 DFS/BFS Python pseudo코드로 이해하기
Understanding DFS/BFS Algorithm through python pseudo-code 비전공자로서 자료구조를 공부하다보면 실제 문제에 적용하기 힘든 경우가 많다. 특히 입문자로서 코딩테스트 빈출 유형인 DFS / BFS는 단순히 이론을 공부하거나 다른 사람들의 코드를 보는 것으로 실력을 쌓는 것은 꽤나 먼 일처럼 느껴진다. 필자의 경우 Graph문제에 대해 깊이 우선 탐색(DFS) / 너비 우선 탐색(BFS) pseudo-code를 이해하는 것이 효과적이었어서 정리할 겸 포스팅하게 되었다. DFS 깊이 우선 탐색의 경우 두 가지 방법이 존재한다. 재귀적으로 문제를 해결하는 방식과, 반복 구조로 문제를 해결하는 방식이다. 재귀적으로 깊이 우선 탐색을 수행하는 방법 def recursiv..
N개의 연속된 자연수 리스트에서 인접하지 않은 m개 뽑기
From N consecutive lists of natural numbers, pick m that are not adjacent. 코딩테스트 대비를 위해 Heap / Queue / Stack의 선형 자료구조 문제를 풀다 보면 대부분은 0번째와 마지막 인덱스만의 예외 처리로 해결되는 경우가 많다. 문제를 풀면서 많이 나오는 듯한 느낌인데, 비슷한 유형의 예외처리가 쉽지 않아 공유해보고자 포스팅하게 되었다. [1,2,3,4,5,6,7] 과 같이 연속된 N개의 자연수에서 m개를 뽑을 때 연속된 자연수가 없는 경우만 뽑아내기 여러번 등장하는 알고리즘인 것 같은데, 생각보다 해결하기가 쉽지 않아 해당 주제에 대해 여러번 고민하다 문제를 해결했다. from collections import deque from ..
[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하기
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..