파이썬

[250313] 라이브러리 복습 + 파이썬 개인과제

jeonieee 2025. 3. 13. 20:47
  • 라이브러리 호출하기
import pandas as pd (pandas 는 6 글자라서 pd 로 줄여 명령)
import numpy as np
import time
from matplotlib.pyplot as plt
  • 코드 연산
    • + : 더하기
    • - : 빼기
    • * : 곱하기
    • / : 나누기
    • // : 버림 나눗셈
    • % : 나머지 계산
    • ** : 거듭제곱
  • 코드 핵심 요약
# pandas 라이브러리를 활용한 csv 파일 읽기 
df = pd.read_csv("xxxx.csv")

# 테이블 확인하기 
display(df, df2, df3)

# 처음 5 줄만 출력하기 
#df2.head()

# 마지막 5 줄만 출력하기 
#df2.tail()

# 각 테이블의 행(가로) 길이 파악하기
len(df)

# shape: 테이블의 행과 열의 갯수를 반환 
df.shape

# dtypes: 테이블 내 컬럼타입(문자형, 숫자형, 배열 등) 확인
df.dtypes

# columns: 테이블 내 컬럼 확인
df.columns

# values: 테이블 내 각 행들을 배열 형태로 확인
df.values

# 테이블 기본 구조 한눈에 확인하기
df.info()

# 전체 행 갯수, 평균, 표준편차, 최솟값, 사분위수, 최댓값 확인 
df2.describe()

#컬럼별로 결측치(데이터가 없는) 확인하기 
df.isnull().sum()

# 특정 컬럼 1개 가져오기
	#방법1: 속성. 사용
	df.Category
	
	#방법2: [] 연산자 사용
	df['Category']
	
	#방법3: iloc 사용
	# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번(카테고리)컬럼을 가져오겠다는 희미
	df.iloc[:,4]

# 특정 컬럼 여러개 가져오기 
	#방법1: [[]] 연산자 사용
	# []를 하나 사용하면 결과값이 series 형태로 반환되어 key error 가발생되며, [[]] 는 dataframe 으로 반환되어 에러가 나지 않습니다. 
	df[['Category','Selling Price']]
	
	#방법2: iloc 사용
	# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번,7번 컬럼을 가져오겠다는 희미
	df.iloc[:,[4,7]]
	
# 특정 컬럼 버리기
# axis=0 은 인덱스 기준, 1은 컬럼 기준 삭제를 의미 
# inplace=True 는 원본을 변경하겠다는 의미, False 의 경우 원본테이블은 변경되지 않음
df3.drop('Interaction type', axis=1, inplace=True)

# 조건에 부합하는 데이터 가져오기1
# 조건에 만족하는 행은 정상출력 ,아닌 행은 NaN 으로 반환 
df2.where(df2['Age']>50)

# 조건에 부합하는 데이터 가져오기2
# true, false의 개념이 아닌 조건에 부합하는 데이터만 슬라이싱하여 가져오고 싶을 때 
# mask 메서드로 불립니다. 이름은 반드시 mask 일 필요가 없습니다. 
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df2[mask]

# 조건에 부합하는 데이터 가져오기3
# 데이터프레임명[조건] 을 사용하면 조건을 만족하는 행만 필터링됩니다.
df2 = df2[df2['Age']>50] 

# 조건에 부합하는 데이터 가져오기4
# loc[]을 활용한 조건 필터링
df2 = df2.loc[df2['Age']>50]

# 데이터 그루핑- 기준 1개
df2.groupby('Gender')['Customer ID'].count()

# 데이터 그루핑- 기준 여러개
df2.groupby(['Gender','Location'])['Customer ID'].count()

# 데이터 count 와 nunique(distinct, 중복제거) 차이 
df2.groupby('Location')['Age'].count()
df2.groupby('Location')['Age'].nunique()

 


- 개인과제

  • 문제 1 : 숫자 리스트의 평균을 계산하는 방법
    • 배경 : 전자 상거래 플랫폼에서 고객의 평균 주문을 계산해야 합니다. 이를 위해 숫자 리스트의 평균을 계산하는 방법을 연습합니다.
    • 목표 : 주어진 숫자 리스트의 평균을 계산하는 함수를 작성하세요.
    • 데이터 : numbers: 숫자가 담긴 리스트
    • 📌 요구 지식: 리스트, 반복문
# 예시 데이터
numbers = [10, 20, 30, 40, 50]

def calculate_avg(numbers):
    # 여기에 코드를 작성하세요
    
    return total_avg

total_avg = calculate_avg(numbers)
print("숫자들의 평균:", total_avg)
  • 내 풀이 
# 예시 데이터
numbers = [10, 20, 30, 40, 50]

def calculate_avg(numbers):
    total_avg = sum(numbers) / len(numbers) 
    
    return total_avg

total_avg = calculate_avg(numbers)
print("숫자들의 평균:", total_avg)

 

  • 문제 2 : 가장 낮은 기온과 가장 높은 기온을 활용하여 일교차를 함수로 작성
    • 배경 : 기상청에서는 하루 동안의, 가장 높았던 기온과 가장 낮았던 기온을 확인하고 일교차를 보고하고자 합니다.
    • 목표 : 하루 동안 기록된 기온 목록을 받아, 가장 낮은 기온과 가장 높은 기온을 활용하여 일교차를 함수를 작성하세요.
    • 데이터 : 하루 동안 기록된 기온의 리스트
    • 📌 요구 지식: 리스트, min(), max() 함수 사용

 

# 예시 데이터
numbers = [10, 20, 30, 40, 50]

def calculate_diff_temperature(numbers):
    # 여기에 코드를 작성하세요
    
    return diff_temp

diff_temp= calculate_diff_temperature(numbers)
print("일교차:", diff_temp)

 

  • 내 풀이
# 예시 데이터
numbers = [10, 20, 30, 40, 50]

def calculate_diff_temperature(numbers):
    diff_temp = max(numbers) - min(numbers)
    
    return diff_temp

diff_temp= calculate_diff_temperature(numbers)
print("일교차:", diff_temp)

 

INTERMEDIATE ⭐⭐

  • 문제 3 : 가장 많이 판매된 제품의 이름과 수량을 반환하는 함수를 작성
    • 배경 : 한 소매점에서는 다양한 제품을 판매하고 있습니다. 매월 판매된 제품들의 목록과 각 제품의 판매 수량이 기록됩니다. 이 데이터를 분석하여 가장 많이 판매된 제품을 찾아내려고 합니다.
    • 목표 : 제품 명과 판매 수량이 담긴 목록을 받아, 가장 많이 판매된 제품의 이름과 수량을 반환하는 함수를 작성하세요.
    • 데이터 : 제품 이름과 해당 제품의 판매 수량을 담은 딕셔너리로 구성되어 있음
    • 📌 요구 지식: 딕셔너리, max() 함수 사용
def find_top_seller(sales_data):
    # 여기에 코드를 작성하세요
    
    return top_product, max_sales

# 테스트
sales_data = {"apple": 50, "orange": 2, "banana" : 30}
print("가장 많이 판매된 제품과 수량 :", find_top_seller(sales_data))
# 출력 : 가장 많이 판매된 제품과 수량 : ('apple', 50)
  • 내 풀이
def find_top_seller(sales_data):

  for i,j in (sales_data.items()):
    if j == max(sales_data.values()):
      top_product = i
      max_sales = j

  return top_product, max_sales

# 테스트
sales_data = {"apple": 50, "orange": 2, "banana" : 30}
print("가장 많이 판매된 제품과 수량 :", find_top_seller(sales_data))
# 출력 : 가장 많이 판매된 제품과 수량 : ('apple', 50)

 

  • 문제 4 : 사칙연산을 수행할 수 있는 프로그램 구현
    • 배경 : 컴퓨터 과학 수업에서 학생들은 기본적인 프로그래밍 원리를 익히고, 실제 생활에 적용할 수 있는 간단한 프로그램을 만드는 연습을 합니다. 간단한 계산기를 만들어서 사칙연산을 수행할 수 있는 프로그램을 구현하는 것은 기본적인 프로그래밍 실습에 적합합니다.
    • 목표 : 두 숫자와 연산자를 입력받아, 해당 연산을 수행하고 결과를 반환하는 함수를 작성하세요.
    • 데이터 : 
      • num1, num2: 숫자 입력값
      • operator: 문자열 형태의 연산자('+', '-', '*', '/')
    •  📌 요구 지식: 조건문 (if-elif), 예외 처리 (try-except), 문자열 조작
def simple_calculator(num1, num2, operator):
    # 여기에 코드를 작성하세요
    pass

# 테스트
print(simple_calculator(10, 5, '+'))  # 출력: 15
print(simple_calculator(10, 5, '-'))  # 출력: 5
print(simple_calculator(10, 5, '*'))  # 출력: 50
print(simple_calculator(10, 0, '/'))  # 출력: 'Cannot divide by zero'
  • 내 풀이
def simple_calculator(num1, num2, operator):
    if operator == '+' :
        result = num1 + num2
    elif operator == '-' :
        result = num1 - num2
    elif operator == '*' :
        result = num1 * num2
    elif operator == '/' : 
        if num2 == 0 : 
          result = 'Cannot divide by zero' 
        else : num1 / num2     
    return result

# 테스트
print(simple_calculator(10, 5, '+'))  # 출력: 15
print(simple_calculator(10, 5, '-'))  # 출력: 5
print(simple_calculator(10, 5, '*'))  # 출력: 50
print(simple_calculator(10, 0, '/'))  # 출력: 'Cannot divide by zero'

 

  • 문제 5 : 이메일 주소가 올바른 형식을 갖추고 있는지 판단하는 프로그램 구현
    • 배경 : 당신은 회사의 고객 데이터베이스를 관리하고 있습니다. 데이터베이스에 저장된 고객의 이메일 주소가 유효한 형식을 갖추고 있는지 검증하는 작업이 필요합니다.
    • 목표 : 문자열 형태의 이메일 주소 목록을 분석하여, 각 이메일 주소가 올바른 형식을 갖추고 있는지 판단하는 프로그램을 작성하세요.
    • 데이터 : 
      • 이메일 주소는 문자열 리스트로 제공됩니다.
      • 올바른 이메일 주소의 형식은 다음과 같습니다:
        • 하나의 '@' 기호를 포함해야 합니다.
        • '@' 기호 앞에는 하나 이상의 문자가 있어야 합니다.
        • '@' 기호 뒤에는 도메인명이 와야 하며, 도메인명은 '.'을 포함한 하나 이상의 문자로 구성되어야 합니다.
      •  요구사항:
        • 각 이메일 주소가 올바른 형식을 갖추고 있는지 검사합니다. (문자열 메소드 사용)
        • 올바른 형식의 이메일 주소인 경우, "유효한 이메일 주소입니다."를 출력합니다.
        • 올바르지 않은 형식의 경우, "유효하지 않은 이메일 주소입니다."를 출력합니다.
      •  📌 요구 지식: 문자열 조작 (split(), in 연산자), 정규 표현식 활용
def validate_emails(email_list):
    # 여기에 코드를 작성하세요
    pass

# 이메일 목록
email_list = [
    "example@example.com",
    "wrongemail@com",
    "anotherexample.com",
    "correct@email.co.uk"
]

# 이메일 유효성 검사 실행
validate_emails(email_list)
# 함수 실행 결과
example@example.com 유효한 이메일 주소입니다.
wrongemail@com 유효하지 않은 이메일 주소입니다.
anotherexample.com 유효하지 않은 이메일 주소입니다.
correct@email.co.uk 유효한 이메일 주소입니다.
  • 내 풀이
    • ㅜㅜ 여기서부터 이해가 잘 안가기 시작함 너무 어렵다...
def validate_emails(email_list):
    vaild = []
    invaild = []

    for mail in email_list :
        if "@" in mail and "." in mail.split("@")[-1] :
          vaild.append(mail)
          print(f"{mail} : 유효한 이메일입니다")
        else :
          invaild.append(mail)
          print(f"[mail] : 유효하지 않은 이메일입니다")
    return vaild, invaild

# 이메일 목록
email_list = [
    "example@example.com",
    "wrongemail@com",
    "anotherexample.com",
    "correct@email.co.uk"
]

# 이메일 유효성 검사 실행
validate_emails(email_list)
--------------------------------------------------------------
example@example.com : 유효한 이메일입니다
[mail] : 유효하지 않은 이메일입니다
[mail] : 유효하지 않은 이메일입니다
correct@email.co.uk : 유효한 이메일입니다
(['example@example.com', 'correct@email.co.uk'],
 ['wrongemail@com', 'anotherexample.com'])

 

도전 문제

CHALLENGE ⭐⭐⭐

  • 문제 6 : 각 문자가 등장하는 빈도를 함께 출력하는 프로그램 구현
    • 배경 : 당신은 대규모 텍스트 데이터를 분석하는 프로젝트를 진행하고 있습니다. 텍스트 데이터에서 특정 패턴을 찾아내는 작업을 수행해야 합니다. 이번 작업에서는 중복된 문자를 제거하고 각 문자가 한 번씩만 나타나게 하는 프로그램을 작성하는 것이 목표입니다. 하지만 각 문자는 처음 등장한 순서를 유지해야 하며, 추가적으로 각 문자가 등장하는 빈도를 함께 계산해야 합니다.
    • 목표 : 주어진 문자열에서 중복된 문자를 제거하고, 각 문자가 처음 등장한 순서대로 한 번씩만 나타나게 하며, 각 문자가 등장하는 빈도를 함께 출력하는 프로그램을 작성하세요.
    • 데이터 : 입력 문자열은 알파벳 대문자와 소문자, 숫자, 공백으로 구성될 수 있습니다. 
    •  요구사항:
      • 주어진 문자열에서 중복된 문자를 제거합니다.
      • 각 문자가 처음 등장한 순서를 유지합니다.
      • 각 문자가 등장하는 빈도를 함께 출력합니다.
      • 결과는 (문자, 빈도수) 형태의 튜플 리스트로 반환합니다.
    •  📌 요구 지식: 딕셔너리, 리스트, 문자열 조작, 반복문
def remove_duplicates_and_count(s):
    result_with_frequency = []
		# 여기에 코드 작성
		
    return result_with_frequency # 튜플 리스트로 변환
# 예시 문자열
input_string = "abracadabra123321"

# 중복 문자 제거 및 빈도수 계산 실행
result = remove_duplicates_and_count(input_string)
print(result)

#실행 결과
[('a', 5), ('b', 2), ('r', 2), ('c', 1), ('d', 1), ('1', 2), ('2', 2), ('3', 2)]

 

  • 문제 7 : 경기 동안 각 선수가 이동한 총 누적 거리를 계산하는 프로그램 구현
    • 배경 : 축구 경기 데이터 분석가로서, 선수들의 위치 데이터를 활용하여 그들의 활동 범위와 이동 효율성을 계산하는 것은 팀 전략을 세우는 데 중요합니다. 선수들의 이동 패턴을 분석하고 이를 통해 그들의 총 누적 이동 거리를 계산하여 선수의 활동량을 평가할 수 있습니다.
    • 목표 : 선수들의 위치 데이터가 주어졌을 때, 해당 데이터를 분석하여 경기 동안 각 선수가 이동한 총 누적 거리를 계산하는 프로그램을 작성하세요.
    • 데이터 : 
      • 위치 데이터는 선수의 이름과 그에 따른 위치 좌표의 리스트를 포함하는 딕셔너리 형태로 제공됩니다. 각 좌표는 (x, y) 튜플로 표현됩니다.
      • 선수는 경기 동안 여러 번 위치가 변경될 수 있으며, 각 위치는 이전 위치에서의 이동 거리를 기록합니다.
      요구사항:
      • 유클리드 거리 공식을 사용하여 각 위치 변경 시 이동 거리를 계산합니다.
      • 각 선수별로 경기 동안 이동한 총 누적 거리를 출력합니다.
    • 📌 요구 지식: 리스트, 딕셔너리, 반복문
def calculate_total_distances(player_positions):
    # 여기에 코드를 작성하세요

    return

 

# 선수별 위치 데이터
player_positions = {
    "John Doe": [(0, 0), (1, 1), (2, 2), (5, 5)],
    "Jane Smith": [(2, 2), (3, 8), (6, 8)],
    "Mike Brown": [(0, 0), (3, 4), (6, 8)]
}

# 총 누적 이동 거리 계산 실행
calculate_total_distances(player_positions)

#실행 결과

John Doe의 총 누적 이동 거리: 7.07 미터
Jane Smith의 총 누적 이동 거리: 9.08 미터
Mike Brown의 총 누적 이동 거리: 10.00 미터

 

  • 문제 8 : 언어를 확인하여 암호를 해독하는 프로그램 구현
    • 📌 요구 지식: 딕셔너리 매핑, 문자열 조작, 반복문
    • 문제배경 : 어느날, 르탄이가 당신의 길을 막고 암호를 말할테니 이 암호를 풀어야 길을 비켜준다고 합니다. 르탄이가 알려주는 암호는 한글과 영어로 쓰여있는 숫자들을 나열한 것인데 이를 알려주면 여러분이 아라비아 숫자 형태로 바꾸어서 르탄이한테 다시 알려주어야 합니다. 또한 숫자로 바꾸기 전에 한글로 이루어진 숫자가 몇개인지, 영어로 이루어진 숫자가 몇개인지를 함께 알려주어야 합니다. 
    • 목표 : 이렇게 영어와 한글이 섞인 숫자들이 문자열 형태로 주어집니다. 이를 아라비아 숫자형태로 바꾸어서 출력하고, 한글로 적인 숫자의 개수, 영어로 적인 숫자의 개수를 차례로 반환하는 함수를 완성해주세요!
    • 제한사항
    • 참고로, 암호로 주어질 수 있는 영어숫자와 한글숫자의 범위는 아래와 같습니다.
      • 영어숫자의 범위 : zero ~ nine
      • 한글숫자의 범위 : 영 ~ 구
    • 또한 입출력 값은 다음의 범위를 가집니다.  
      • 입력으로 주어지는 문자의 길이는 1에서 4까지 가질 수 있습니다.
      • 출력값으로 나올 수 있는 정수는 0~9999 입니다
  • 요구사항:
def password_decryptor(password_list):
    # 여기에 코드를 작성하세요

    return
# 암호 목록
password_list = [
    "삼five이사",
    "zero오six칠",
    "foureight삼구",
    "이sevenfour팔",
    "nine일이삼"
]

# 실행 결과
[삼five이사]에 대한 암호는 [3524]로, 한글은 [3]개, 영어는 [1]개 입력되었습니다.
[zero오six칠]에 대한 암호는 [0567]로, 한글은 [2]개, 영어는 [2]개 입력되었습니다.
[foureight삼구]에 대한 암호는 [4839]로, 한글은 [2]개, 영어는 [2]개 입력되었습니다.
[이sevenfour팔]에 대한 암호는 [2748]로, 한글은 [2]개, 영어는 [2]개 입력되었습니다.
[nine일이삼]에 대한 암호는 [9123]로, 한글은 [3]개, 영어는 [1]개 입력되었습니다.