기타/Python

250703_파이썬(길이 N의 부분문자열 뽑기), visual studio code 가상환경 설정

baektree 2025. 7. 3. 21:07

요약/나만의 인사이트

  • V-Code 활용 시 프로젝트 단위별로 폴더1/가상환경을 만들어야 한다.
  • 그래야 라이브러리 충돌 없이 잘 사용할 수 있다.
  • 가상환경 activiate하고 나서 가성환경 unactivate한다.
  • 나의 라이브러리 환경을 공유하고 싶으면, pip freeze >requirements.txt로 할 수 있다.
  • lambda 함수는 간결하고 간편한 방식으로 정의하는 함수이다. 함수를 인자로 전달해야 하는 경우에 유용하게 사용된다. answer = lambda x: x**2 x라는 매개변수에 값을 받아 제곱을 반환한다. print(answer(5)) #25
  • 길이 len(s)의 문자열에서 len(p)만큼 부분추출하기 위해선 range(0, len(s)-len(p)+1)까지 순회해야 한다.
  • 크로스 조인하면 각각의 테이블의 행의 개수를 곱한만큼 행이 생성된다.
  • group by 시 대분류, 중분류, 소분류를 유념하며 하자. 각각 공통된 값끼리 집계가 된다.
  • 조인시 기준이 되는 컬럼을 on 절에 여러개 묶을 수있다.

새롭게 알게 된 것

  • 가상환경
    • 로컬(내 컴퓨터)은 하나의 환경으로 동작한다.
    • 프로젝트 단위별로 폴더1/가상환경1를 생성해서 분리해 사용한다.
    • 그 이유는 프로젝트 별로 라이브러리가 상이하기 때문에 충돌을 막기위함이다.
    • 파이썬은 가장 최근 버전보단 한단계 아래 버전 사용 권장 (라이브러리 최신화에 시간이 소요되기 때문)
    • 진행방법
      1. 폴더 생성
      2. 그 폴더 안에 가상환경 생성 - python -m venv venv
      3. 가상환경 활성화 - .\\\\venv\\\\Scripts\\\\activate
      4. 라이브러리 다운 - pip install pandas
      5. 가상환경에 설치된 라이브러리 목록 확인 - pip list
      6. 가상환경 비활성화 - deactivate
      (설치된 버전 저장 or 동료와 같은 가상환경 설정 공유 시)
      1. 현재 사용하고 있는 모듈 저장하기 - pip freeze > requirements.txt
      2. 추후 requirements 파일이 있으면 다음 명령어로 그대로 모듈 설치 가능 - pip install -r requirements.txt
    • (프로젝트 초기 세팅)
    • 참고개념) 가상환경 / 커널 / 인터프리터 /컴파일러
      • 가상환경(venv): 파이썬에서 라이브러리나 패키지를 독립적으로 관리할 수 있게 해주는 공간(환경) 프로젝트마다 패키지 버전이 다를 때 충돌없이 관리할 수 있음. 하나의 가상환경에 여러 프로젝트를 관리하면 라이브러리 다운받을 때마다 버전이 서로 호환되어 충돌할 수 있음.
        • like 라이브러리를 다운받는 공간
      • 커널(kernel): 주피터 노트북에서 코드를 실행해주는 실행엔진과 같음. 주피터 노트북의 커널을 특정 가상환경에서 연결해서 실행할 수 있음. 즉 어떤 가상환경이 활성화된 상태에서 그 커널을 실행하면, 가상환경의 패키기 사용가능
        • like 주피터 노트북의 코드를 실행해주는 조수
      • 가상환경과 커널의 관계 : 가상환경(방)에 커널이 연결해, 라이브러리를 사용해서 코드를 실행함.
      • 인터프리터: 프로그래밍 언어로 쓴 코드를 한 줄 씩 읽어서 바로 실행해주는 프로그램 주피터 노브툭의 커널도 인터프리터 중 하나이다. (파이썬, 자바)
      • 컴파일러 : 전체 파일을 한꺼번에 번역해서(컴파일해서) 실행 파일을 만듦. (C, C++)

특히 어려웠던 것

  • 파이썬 - 길이 N의 부분문자열 뽑기
    • 문제
      • 숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
      • 예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
    • 핵심 개념
      • 슬라이싱 t[0:3] , t[1:4], t[2:5], t[3:6], t[4:7]
        • len(p)길이 만큼 뽑기
        • t[i : i+len(p)]
        ⇒ 슬라이싱을 활용해 잘라내는 범위를 확인
      • 슬라이싱 마지노선 range 5
        • for i in range 5
        • for i in range ( len(t) - len(p) + 1)
        ⇒ 반복할 범위 확인
      <aside> 💡</aside>
    • 길이 len(s)의 문자열에서 길이 k짜리 substing은 range(len(s)-k+1)번 반복
    • 풀이
    def solution(t, p):
      answer = []
      for i in range (len(t)-len(p)+1):
        answer.append(t[i:i+len(p)])
    
      count = 0
      for j in answer:
        if int(j) <= int(p):
          count += 1 
    
      return count
    
  • SQL -cross join , null 값도 count
    • 문제
      • Write a solution to find the number of times each student attended each exam. Return the result table ordered by student_id and subject_name. The result format is in the following example.
    • 핵심개념
      • 학생별 모든 과목이 리스트업되도록 cross join
      • cross join한 테이블을 CTE를 활용해 임시테이블로 만들기
      • 학생별 모든과목이 다 나오도록 left join 이때 on 절로 묶을 때 학생 아이디와 과목이 여러개니까 아이디, 과목별로 묶일 수 있도록 함.
      • 학생 이름, 과목으로 group by
      • 과목 count , 이때 null값은 제외되도록 examination의 subject_name을 카운트
    • 풀이
    # Write your MySQL query statement below
    # 각 학생이 시험에 참가한 횟수
    # 조회; student_id subject_name
    # 시험테이블과 학생 테이블을 id기준으로 join해서 학생 아이디 기준으로 count (새로운 행)
    # order by student_id, subject_name
    WITH A AS (
    SELECT S.student_id, S.student_name, U.subject_name
    FROM Students S CROSS JOIN Subjects U
    )
    SELECT A.student_id,
            A.student_name,
            A.subject_name,
            COUNT(E.subject_name) AS attended_exams
    FROM A LEFT JOIN Examinations E
    ON A.student_id = E.Student_id 
    AND A.subject_name = E.subject_name
    GROUP BY A.student_name, A.subject_name
    ORDER BY A.student_id, A.subject_name
    
  • 통계학
    • 복습
      • 다중선형회귀는 다양한 지표를 통해서 모형의 적합정도를 평가해한다.
      • 선형회귀는 x, y간에 선형성이 있다고 가정해야 세울 수 있는 모형
      • but y가 끊어진 데이터 있을 경우(범주형 데이터)
    • 분류
      • 입력값을 통해 미리 정의된 범주 중 하나로 분류하는 문제
      • 임계값(ex 0.5)을 기준으로 분류하는 것
      • 로지스틱 회귀
        • 오즈: 몇배 더 많은가?
        • 오짓함수 : 오즈에다 로그를 씌움
        • 확률 / 오즈 / 로그오즈
        • 결과가 범주형일 때 확률을 예측하는 회귀모양
        • 2개의 값, 이진범주형일 때 결과값을 예측
        • 1일 확률과 0일 확률
        • (TP) positive라고 예측했는데 맞았다.
        • (TN) negavtive라고 예측했는데 맞았다.
      • 로직스틱 회귀의 한계
        • 선형회귀의 한계
  • 머신러닝
    • 이상치 제거(정규분포이용)
      • 평균, 표준편차 구하기
      • 평균으로부터 +-3시그마 범위 내 : 정상
      • 평균으로부터 +- 3시그마 범위 외 : 비정상
    • 정규분포보다 IQR방법이 더 엄격하다.
    • 스탠다드 스케일링(평균, 표준편차), minmax 스케일링(0~1)
      • fit.transform : 통계값을 계산해 적용해준다.
    • 범주형데이터 변환 예외는 catboost이다. (카테고리기반 모델)
    • 순서가 있는 경우에만 라벨 인코딩
    • 원핫인코딩 = 겟 더미즈 활용
    • 다중공선성확인 - 상관관계, VIF

다음에 적용해 볼 것

  • 슬라이딩 윈도우, 부문 문자열 문제 5개 이상 풀어보기
  • cross join , null 값 count 하기