[Numpy] where, argmax, unique, argsort
·
python/Pandas | Numpy
데이터를 조건에 맞게 찾고, 정렬하고, 고유값을 뽑아내는 핵심 함수들입니다.데이터 분석에서 "찾기"는 기본 중의 기본이다.특정 조건에 맞는 위치가 궁금하다 → np.where( )가장 큰 값은 어디인가? → np.argmax( )중복 없이 어떤 값들이 들어 있는가? → np.unique( )정렬 순서를 알고 싶다 → np.argsort( )이 네가지 함수는 조건, 추출, 분류, 정렬, 그룹핑의 기반이 되는 매우 자주 쓰이는 함수들이다. np.where( ) - 조건에 따라 인덱스나 값을 선택● 조건이 True인 인덱스 반환import numpy as npa = np.array([10, 20, 30, 25, 15])np.where(a > 20)# (array([2, 3], dtype=int64),)─ 조건..
DoesNotExist vs MultipleObjectsReturned - ORM 예외처리
·
python/Django
ORM을 사용해서 개발을 하다 보면 아래 오류가 종종 발생하고는 합니다.User.DoesNotExist: User matching query does not exist. 처음에는 ORM이 잘 작동했지만 서비스에서 트랙픽이 증가하고, 데이터가 누적되기 시작하면서예외가 빈번하게 발생했습니다. 먼저 발생원인에 대해 확인하면get( ) 메서드의 핵심 특징을 알아야합니다. get( )은 단 하나의 레코드만 존재할 때만 성공합니다.그 외엔 무조건 예외를 발생시킵니다. 예외 발생 조건 원인 DoesNotExist해당 조건에 맞는 결과가 0개삭제되었거나 조건이 잘못됨MultipleObjectsReturned결과가 2개 이상일 때중복 데이터 또는 unique 제약 누락 예외를 처리하지 않으면 서버에서 500에러가 발..
OperationalError 해결 방법 – DB 커넥션 끊김 (MySQL)
·
python/Django
Django 프로젝트를 하던 중 django.db.utils.OperationalError: (2006, "MySQL server has gone away") 서버 로그에서 위와 같은 오류가 발생했다. 검색을 해보니트래픽이 몰렸을 때서버가 일정 시간 이상 대기 상태였다가 재접속할 때Celery worker가 DB에 오래 연결되어 있었을 때 먼저 OperationalError란?Django에서 DB와 통신 중 운영 레벨(DB 커넥션, 네트워크, 설정 등)의 문제가 발생하면OperationalError가 발생한다. 유형 설명 DB 커넥션 타임아웃일정 시간 사용하지 않으면 DB가 커넥션을 끊어버림DB 커넥션 풀 한도 초과동시에 너무 많은 요청으로 커넥션 부족MySQL 서버 설정 문제wait_timeout, ..
[Numpy] 슬라이싱, 마스킹, 조건 추출
·
python/Pandas | Numpy
데이터 분석은 "계산" 만큼이나 "필터링"이 중요합니다.필요한 값을 빠르게 꺼내올 수 있어야,이상치를 제거할 수 있고특정 조건만 모델에 투입할 수 있으며불필요한 데이터를 제거하고 속도를 높일 수 있습니다.Numpy는 이를 위해 세 가지 강력한 도구를 제공합니다.슬라이싱 (slicing) → 위치 기반 추출마스킹 (masking) → 조건 기반 필터링조건 추출 → 조건에 맞는 값만 걸러내기 기본 슬라이싱 문법import numpy as nparr = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]]) 3 X 3 정수 배열. 행과 열 기준으로 쉽게 부분 배열을 뽑을 수 있다. 행(row) 슬라이싱arr[0] ..
[Numpy] 브로드캐스팅(broadcasting)과 벡터화(vectorization) 연산
·
python/Pandas | Numpy
Python 기본 리스트로 수치 계산을 하려면 보통 for문이 필요하다.하지만 NumPy는 단순한 리스트가 아니라 배열(벡터) 연산이 가능한 구조로 되어 있어,한 줄의 수식만으로도 대량의 데이터를 동시에 처리할 수 있다.그 비결은 바로 벡터화(vectorization) 와 브로드캐스팅(broadcasting) 이다. 용어 설명 벡터화(vectorization)반복문 없이 배열 전체에 연산 수행브로드캐스팅(broadcasting)서로 다른 shape의 배열 간 연산 시 자동 확장 벡터화 연산 기본import numpy as npa = np.array([1, 2, 3])b = np.array([10, 20, 30])a + b # → array([11, 22, 33])a * b ..
[Numpy] ndarray 구조 - 배열의 모양, 차원 ,타입
·
python/Pandas | Numpy
NumPy의 핵심은 바로 ndarray다.이 객체를 제대로 이해하지 못하면 벡터 연산, 브로드캐스팅, 슬라이싱, reshape, 연산 최적화 등 모든 기능이 막히게 된다. ndarray란?N-dimensional array: 다차원 배열리스트와 비슷하지만 훨씬 빠르고, 메모리 효율적이며, 다양한 수치 연산 지원Pandas의 .values도 사실 내부적으로는 ndarray 배열 생성 - np.array()import numpy as npa = np.array([1, 2, 3]) # 1차원 배열b = np.array([[1, 2], [3, 4]]) # 2차원 배열 배열 속성 확인a.shape # (3,)a.ndim # 1a.dtype # int64a.size # ..
[Numpy] percentile() - 백분위수 구하기
·
python/Pandas | Numpy
데이터 분석을 하다 보면 단순 평균으로는 전체 분포를 이해하기 어렵다.예를 들어 한 반의 평균 점수가 75점이라 해도,상위 10%가 100점이고 하위 90%가 60점대라면 분포는 완전히 왜곡돼 있다. 이럴 때 필요한 것이 백분위수(percentile) 이다.상위 10% 이상 성적을 보고 싶다? → 90 percentile하위 25% 컷을 알고 싶다? → 25 percentile중앙값은? → 50 percentile (== median)Numpy는 np.percentile( ) 로 이를 아주 쉽게 계산할 수 있다. 예제 데이터scores = [55, 60, 65, 70, 75, 80, 85, 90, 95, 100] 기본 문법import numpy as npnp.percentile(data, q) 예제1..
[Pandas] clip() - 이상값 방어의 핵심
·
python/Pandas | Numpy
데이터를 전처리를 하다 보면 종종 이런 일이 생긴다:나이에 200살이 들어와 있다.점수가 110점으로 입력되어 있다.상품 가격이 음수로 들어와 있다.이런 이상값을 제거하거나, 상하한을 지정해서 데이터를 안전하게 자르는 작업이 필요하다.이럴 때 Pandas의 clip() 은 최소값보다 작은 값은 최솟값으로, 최대값보다 큰 값은 최대값으로 잘라주는 함수다. 예제 데이터import pandas as pddf = pd.DataFrame({ 'score': [95, 105, 85, 70, 30], 'age': [25, 180, 38, 200, -5]})기본 문법Series.clip(lower=None, upper=None)DataFrame.clip(lower=None, upper=None)lower ..
transaction.atomic() 트랙잭션 처리하기
·
python/Django
회원가입 시 사용자(User)와 프로필(Profile) 데이터를같은 요청에서 동시에 저장하려고 했습니다. 처음에는 별 문제가 없었는데중간에 Profile.objects.create() 단계에서 오류가 나면User는 저장됐고 Profile은 저장이 안 되는 데이터 불일치 현상이 발생했습니다. 즉, 가입은 성공 했는데 프로필이 없는 유저가 생겨난 겁니다. 원인 분석Django ORM은 기본적으로 각 쿼리를 독립적으로 실행합니다.따라서 여러 개 쿼리를 실행하다가중간에 하나라도 실패하면 앞에서 실행된 쿼리는 그대로 DB에 남게 됩니다.→ 트랜잭션을 명시적으로 걸지 않으면, 중간 실패 시 롤백이 일어나지 않습니다. 예를 들어django.db.utils.IntegrityError: NOT NULL constrain..
[Pandas] where() - 조건을 만족하는 값은 살리고, 아니면 치환
·
python/Pandas | Numpy
일반적으로 데이터를 필터링하면 조건에 맞는 행만 추출하게 됩니다. (query(), Boolean Indexing 등)하지만 때로는 조건을 만족하는 값은 유지하고, 만족하지 않는 값은 다른 값으로 바꿔야 하는 경우가 있습니다. 예를 들어:점수가 70점이상이면 그대로 두고, 70 미만이면 '재시험'이라고 표시결측치는 그래도 두고, 음수 값만 0으로 치환특정 범위를 벗어난 값만 수정이럴 때 Pandas의 where() 함수가 진가를 발휘합니다. 예제 데이터import pandas as pdimport numpy as npdf = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie', 'David'], 'score': [85, 67, 90, 45]})기본 문법Da..