250318 TIL

수이·2025년 3월 18일

🟡 TIL

목록 보기
30/60

팀스터디

아티클스터디

양질의 데이터를 판별하는 5가지방법 : ③관계형 데이터베이스인가?

  • 요약 : 양질의 데이터 판별법: 관계형 데이터베이스의 양식을 지키고 있는가
    • 관계형데이터베이스
      • 행 + 열의 “테이블”형태로 저장
      • 다른 데이터와 유기적으로 연결됨
    • 테이블이 되기 위한 구성 조건을 모두 지키고 있는지
      • 키의 존재여부 확인 없을 경우 데이터가 무엇을 식별하고 있는지 파악 불가 다른 데이터 테이블과 결합 불가
      • 유일성, 무결성 확인 ex) 주민등록번호 그 자체만으로 특정 개인을 추정할 수 있도록 만들어져야 함 똑같은 주민등록번호 x 모든 개개인이 주민등록번호 필요
  • 주요 포인트 :
    • 3V 개념을 통해 설명을 한 것이 인상 깊었습니다. 아무리 다양한 형태(정형, 비정형, 반정형)를 가지고 있더라도, 실제 데이터 분석 시 형식 역시 눈여겨봐야한다는 것을 알 수 있었습니다. 좋은 데이터라도 형식을 지키지 않았다면 데이터를 정제하는 시간이 늘어나서 비효율적일 것 같습니다.

[공통 인사이트]

키 값에는 유일성과 무결성이 필수다

[의미 있었던 의견]

SQL에서 키 얘기가 나왔었는데 그걸 짚어주는 것 같아서 좋았다
활용하기 좋은 데이터는 공통의 형식이 존재한다
모든 데이터에 키가 존재한다

개인스터디

Python 개인과제 해설

🔗개인과제

1. 숫자 리스트의 평균을 계산하는 방법 🟢

내가 작성한 코드

# 예시 데이터
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. 가장 낮은 기온과 가장 높은 기온을 활용하여 일교차를 함수로 작성 🟢

내가 작성한 코드

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)

3. 가장 많이 판매된 제품의 이름과 수량을 반환하는 함수 🟡

내가 작성한 코드

def find_top_seller(sales_data):
    top_product = max(sales_data, key = sales_data.get) # key
    max_sales = sales_data[top_product] #value 
    return top_product, max_sales

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

3️⃣ 해설

최대값을 찾는 알고리즘✅

numbers = [10, 70, 30, 60, 20]
max_n = 0

for n in numbers:
    if n > max_n:
        max_n = n

print(max_n)

반복문을 통해서 하나씩 꺼내오면서 비교 > 더 큰 값을 가져옴

최대값을 찾는 알고리즘 활용

  1. sales_data.items() + 최대값을 찾는 알고리즘 활용
max_value = 0
for value in sales_data.items():
    if value > max_value:
        max_value = value

print(max_value)
  1. 여기서 최대값을 가지는 이름을 가져와야함
    value 함께 가져오기
max_value = 0
#key 의 경우 비교하지 않아도 되므로 초기값 필요 x

for key, value in sales_data.items():
    if value > max_value:
        max_value = value
        max_key = key

print(max_key, max_value) 

4. 사칙연산을 수행할 수 있는 프로그램 구현 🟢

내가 작성한 코드

def simple_calculator(num1, num2, operator):
    if operator == '+':
        return num1 + num2
    elif operator == '-':
        return num1 - num2
    elif operator == '*':
        return num1 * num2
    elif operator == '/':
        if num2 == 0:
            return 'Cannot divide by zero'
        return num1 / num2
    else :
        return "계산불가"

4️⃣ 해설

try, except 구문✅

에러가 뜬 상황에서 대처를 하는 거

try: # 계속 반복해서 수행할 작업 
        result = 10 / 0
        print(result)
except: # 에러가 뜰 경우 수행할 작업 
        print('나누기 안 됨')

try,except 활용 시

def simple_calculator(num1, num2, operator):
    if operator == '+':
        return num1 + num2
    elif operator == '-':
        return num1 - num2
    elif operator == '*':
        return num1 * num2
    elif operator == '/':
        try:
            return num1 / num2
        except:
            return 'Cannot divide by zero'
    else:
        return 'Invalid operator'   

5. 이메일 주소가 올바른 형식을 갖추고 있는지 판단하는 프로그램 구현 🟢

내가 작성한 코드

def validate_emails(email_list):
    for email in email_list:
        if '@' not in email:
            print(f"{email} 유효하지 않은 이메일 주소입니다.")
            continue

        id, domain = email.split('@')
        if len(id) == 0:
            print(f"{email} 유효하지 않은 이메일 주소입니다.")
        elif '.' not in domain:
            print(f"{email} 유효하지 않은 이메일 주소입니다.")
        else:
            print(f"{email} 유효한 이메일 주소입니다.")

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

# 이메일 유효성 검사 실행
validate_emails(email_list)

5️⃣ 해설

조건 세워보기

  1. '@'가 존재하는지 아닌지
  2. '@'가 하나만 존재해야 함 ('@' 기준으로 2개가 나누어져야 함)
  3. '.'이 존재하는지 아닌지
  4. (공백이 존재하는지 아닌지) > 옵션
def validate_emails(email_list):
    for email in email_list:
        if '@' in email: 
            parts = email.split('@') 
            if len(parts) == 2:
                username, domain = parts # pythontic한 코드 (언패킹)
                # username = parts[0]
                # domain = parts[1]
                if '.' in domain:
                    print(f"{email} 유효한 이메일 주소입니다.")
                else:
                    print(f"{email} 유효하지 않은 이메일 주소입니다.")
            else:
                print(f"{email} 유효하지 않은 이메일 주소입니다.")
        else:
            print(f"{email} 유효하지 않은 이메일 주소입니다.")

continue, break 알아보기 ✅

  • continue : 현재 반복 건너뛰고 다음 반복으로
for n in [1,2,3,4,5]:
    print(n)
    if n == 2:
        print('당신은 continue를 만났습니다')
        continue
    print(n*100)
  • 결과값
1
100
2
당신은 continue를 만났습니다
3
300
4
400
5
500
  • break : 현재 반복 즉시 종료
for n in [1,2,3,4,5]:
    print(n)
    if n == 2:
        print('당신은 break를 만났습니다')
        break
    print(n*100)
  • 결과값
1
100
2
당신은 break를 만났습니다

continue 활용

def validate_emails(email_list):
    for email in email_list:
        if "@" in email:
            parts = email.split('@')
            if len(parts) == 2:
                username, domain = parts
                if "." in domain:
                    print(f"{email} 유효한 이메일 주소입니다.")
                    continue
        print(f"{email} 유효하지 않은 이메일 주소입니다.")

6. 각 문자가 등장하는 빈도를 함께 출력하는 프로그램 구현 🔴

내가 작성한 코드

def remove_duplicates_and_count(s):
    result_with_frequency = [] 
    
    for character in sorted(set(s)): #정렬은 되나 숫자가 먼저 등장
        count = s.count(character)
        result_with_frequency.append((character, count)) 
        
    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)]

6️⃣ 해설

def remove_duplicates_and_count(s):
    result_with_frequency = []
    frequency = {}  # 각 문자의 빈도수를 저장할 딕셔너리

    for char in input_string:
      # 각 문자의 빈도수 업데이트
      if char in frequency.keys():
          frequency[char] += 1
      else:
          frequency[char] = 1

    return list(frequency.items())

dictionary 만들고 값을 넣는 법 기억하기 ✅

a_dict = {}
a_dict['가'] = 1
a_dict['나'] = 2

a_dic # {'가': 1, '나': 2}
a_dict.keys() # a_dict.keys()

7. 경기 동안 각 선수가 이동한 총 누적 거리를 계산하는 프로그램 구현🔴

7️⃣ 해설

머신러닝 다룰 때 ✅

피타고라스 a^2 + b^2 = c^2
c = sqrt(a^2 + n^2)

거리 기반 계산 : 유사도 계산 시 사용하는 걸로 이해

  • 유클리디안 거리
  • 맨해튼 거리
  • 코사인 거리
for player.positions in player_positions.items():
    total_distance = 0.0
    for i in range(0, len(positions) -1): # 두 개의 차이를 구해야하기 때문에 -1
        x1, y1 = positions[i]
        x2, y2 = positions[i+1]
        # x1 = positions[i][0] # i=0일때 0
        # y1 = positions[i][1] # 0 
        
        # x2 = positions[i+1][0] # 1
        # y2 = positions[i+1][1] # 1
        
        distance = ((x2 - x1) ** 2 + (y2 - y-1) ** 2) ** 0.5
        # distance = np.sqrt((x2 - x1) ** 2 + (y2 - y-1) ** 2) numpy 라이브러리 사용시 
        # distance = math.sqrt((x2 - x1) ** 2 + (y2 - y-1) ** 2) math 라이브러리 사용시
        total_distance += distance
    print(f"{player}의 총 누적 이동 거리 : {total_distance:.2f} 미터")
    # 두 자리까지 보여주는거 / 반올림인 경우 round 사용이 맞음    

8. 언어를 확인하여 암호를 해독하는 프로그램 구현
카카오 코테 변형 문제⚠️

8️⃣ 해설

s = 'seven칠육zero'

#영어 딕셔너리 생성
en_num = {'zero':0, 'one':1, 'two':2, 'three':3,
          'four':4, 'five':5, 'six':6, 'seven':7,
          'eight':8, 'nine':9}
#한글 딕셔너리 생성
ko_num = {'영':0, '일':1, '이':2, '삼':3, '사':4, '오':5,
        '육':6, '칠':7, '팔':8, '구':9}

#딕셔너리 돌면서 key,value가 일치하면 바꾸기 
for item in en_num.items():
    word, num = item
    s = s.replace(word, str(num))

for item in ko_num.items():
    word, num = item
    s = s.replace(word, str(num))

개수 세는 매커니즘 ✅

number = 0
for i in [1,2,3,4,5]:
    number += 1

split 복습

s = 'onetwothree'
s1, s2 = s.split('two')

s1 + str(2) + s2 # one2three

split 활용

def solution(s):

  en_num = {'zero':0, 'one':1, 'two':2, 'three':3,
            'four':4, 'five':5, 'six':6, 'seven':7,
            'eight':8, 'nine':9}

  ko_num = {'영':0, '일':1, '이':2, '삼':3, '사':4, '오':5,
         '육':6, '칠':7, '팔':8, '구':9}

  en_n = 0
  for item in en_num.items():
      word, num = item

      if word in s:
          en_n += 1
          split1, split2 = s.split(word)
          s = split1 + str(num) + split2

  ko_n = 0
  for item in ko_num.items():
      word, num = item

      if word in s:
          ko_n += 1
          split1, split2 = s.split(word)
          s = split1 + str(num) + split2

  return s, ko_n, en_n

데일리퀘스트

SQL - 재구매가 일어난 상품과 회원 리스트 구하기
SQL - 최댓값 구하기
Python - 제일 작은 수 제거하기
Python - 가운데 글자 가져오기


일기

  • SQL 코드카타 53-54✅
  • Python 코드카타 29-30✅ 해설세션 참여✅ 기초트레이닝 Day5 ❌
  • 전처리&시각화 4주차❌
  • 라이브세션 5회차 참석✅
  • Pandas 개인과제 1-5✅

원래 오늘 전처리 강의 완강하려고 했는데, 생각해보니 빨리 과제를 시작해야 할 것 같아서 하루종일 과제만 했다. SQL때처럼 머리에서 뭔가 다다닥 나와서 쓰는 게 아니라, 오픈북 테스트처럼 기존 자료들 뒤져보고 구글링 하면서 이건가? 이건가? 하면서 찾아보는 시간이 길어서 엄청 힘들었다

어떻게든 5번까지 풀긴했는데 6번은 내일 마저 다시 해봐야할 것 같다 그래도 파이썬 알고리즘 문제같은 것보단 판다스가 훨씬 나은 것 같기두..😭

지난주부터 정신이 하나도 없는데 내일도 정신 없을 예정.. 파이팅🍀


오늘의무드
break = 현재 내 꼬락서니

0개의 댓글