본문 바로가기
Python

1/10 - Python 기초 학습 5일차 & Side Project

by PETRA_94 2024. 1. 10.

[기억할 개념]

1. for문을 한 줄로 표현할 때

 
2. map + lambda

 
3. filter: true 값만 뽑아냄

 
 
4. args(arguments): 여러 개의 인수를 하나의 매개변수로 받을 때

 
5. Class: 수 많은 데이터에서 반복적인 처리 과정이 필요할 때

  • Class가 하나의 부모 역할
  • 순서는 Class 정의 → 그 안에 속성을 정의   마지막 개체를 정의해주는 것이 key-point!

 
 
[Python 해설강의]

: 전체적으로 나는 정답을 내기 위해, 굉장히 '창의적'으로 코딩을 하고 있었다. 내가 이해한 선으로, 구글링 과정 중에 이해하면서 풀었는데, 사실 이게 맞는 방식인지도 모르겠다. 코드에도 따로 정답이 있는 건가..? 정답만 나오면 되지 않을까?
그런데 정답 코드를 보니 파이썬의 기초 함수와 문법으로 구성된 논리 구조라, 다시 뜯어봐야 할 것 같다. 하지만 지금 Side Project 때문에 도저히 시간이 나질 않는다. SQL도 다시 못 뜯어보는 중...😵‍💫
 

  • 내가 쓴 코드: return 함수에 name 값을 출력하게 만드는 방법을 튜터님의 도움으로 수정함. inventory_data 예시 코드도 내가 변형함.
inventory_data = [
    {'name': 'Apple', 'quantity': 30},
    {'name': 'Banana', 'quantity': 20},
    {'name': 'Orange', 'quantity': 50}
]

def check_quantity(inventory_data):
    if inventory_data['quantity'] > 25:
        return inventory_data['name'], '과잉'
    else:
        return inventory_data['name'], '부족'

for d, n in map(check_quantity, inventory_data):
    print(d, n)

 

  • 정답 코드: 
def check_inventory(inventory_data, threshold):
    low_stock = []
    high_stock = []
    # threshold = 30
    inven_len = len(inventory_data)
    for i in range(inven_len):
        product = inventory_data[i][0]
        quantity = inventory_data[i][1]
        if quantity > threshold:
            # print(f'{product}는 과잉입니다.')
            high_stock.append(product)
        elif quantity < threshold:
            # print(f'{product}는 부족입니다.')
            low_stock.append(product)
        else: # 동률인경우
            pass
    return high_stock, low_stock
    # print(low_stock, high_stock)
low, high = check_inventory(inventory_data, 30)
print(low, high)

 
 

  • 내가 쓴 코드: Python 정규표현식을 활용하여 유효성 검사함. *문자 출력이 필요할 땐, return 기능 위에 print 값을 넣어줘야 하는 순서 기억할 것!!
email_list = [
    "example@example.com",
    "wrongemail@.com",
    "anotherexample.com",
    "correct@email.co.uk"
]

import re

def validate_emails(email_list):
    if not re.match('^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+..[a-zA-Z0-9-.]+$', email_list):
        print('유효하지 않은 이메일 주소입니다.')
        return
    else:
        print('유효한 이메일 주소입니다.')
        return

result = map(validate_emails, email_list)
print(list(result))

 

  • 정답 코드:
# @검사
"example@example.com".split('@')
# . 검사
if '.' in 'example.com':  
    print('여기 점이 있어요')
#continue를 이용한 방법
for email in email_list:
    split_list = email.split('@')
    # print(split_list)
    if len(split_list) != 2:
        print(f"{email} 유효하지 않은 이메일입니다.")
        continue

    if '.' in  split_list[1]:
        print(f"{email} 유효한 이메일 입니다.")
#if -else를 이용한 방법
for email in email_list:
    split_list = email.split('@')
    # print(split_list)
    if len(split_list) != 1:
        print(f"{email} 유효하지 않은 이메일입니다.")
    else:
        if '.' in  split_list[1]:
            print(f"{email} 유효한 이메일 입니다.")

 
 

  • 내가 쓴 코드: 해설해주신 튜터님이 나보고 접근 방식이 창의적이라고 빵 터지심.
# 예시 데이터
participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]

find_non_completer = participant + completion #중복 원소를 추출해야 하니 2개 리스트 합침

person = max(find_non_completer, key=find_non_completer.count) #제일 등장한 횟수가 많은 사람 추출
print(person)
  • 정답 코드:

 

  • 내가 쓴 코드: 
#클래스 생성&속성 정의
class Customer():
    def join_customer(self, x,y,z):
        self.name=x
        self.email=y
        self.point=z

    def add_points(self, x):
        self.point += x

    def reduce_points(self, x):
        self.point -= x
        if self.point < 0:
            self.point = 0
            print(f'{self.name}: {self.point}\t포인트가 부족합니다.')
        else:
            print(f'{self.name}: {self.point}')

customer1 = Customer()
customer1.join_customer("Alice", "alice@example.com", 100)
customer1.add_points(50)
customer1.reduce_points(20)
customer1.reduce_points(150)  # 포인트 부족 상황 테스트
  • 정답 코드:
# dictionary 형으로 만들기 
def find_non_completer(participant, completion):
    my_dict = {}
    for name in participant:
        # name이 없으면 values값 0으로 설정
        my_dict[name] = my_dict.get(name,0) + 1

    for name2 in completion:
        my_dict[name2] = my_dict[name2] -1

    for name3 in my_dict:
        if my_dict[name3] == 1:
            return name3
#모듈을 이용한 방법
#https://docs.python.org/ko/3/library/collections.html#collections.Counter
from collections import Counter

# Counter(participant)

result = Counter(participant) - Counter(completion)
answer = list(result.keys())
print(answer[0])

 
 

[본 Project]

  • 오늘 주제 데이터셋에 대한 어떤 '분야'의 데이터를 분석할지 정했다.
  • 우선 넷플릭스의 직종별, 연봉별, 결혼유무별 이용자를 분류해서 Insight를 추출한 후, 기획안을 작성하기로 했다. 
  • 다만 유의미하지 않다면, 2번 주제로 다시 돌아가야 한다. 하지만 우리 팀에 코딩 brain이 있어서, 걱정은 없다.
  • Side Project 때문에 자리를 비우는 시간이 많아 부팀장을 지정했다. OTT에서 2년 동안 일하셨던 93년생 남성 분으로, 그래도 회의를 리드해가실 줄 알고, 방향 중심을 잡아가실 줄 알아서 맡아달라고 공표했다.
  • 본 Project에서 전략 짜는 부분은 내가 특화돼 있으니, 이 부분을 맡기로 했다. 서포트해 줄 1명만 있으면 된다.
    사실 입사하면 의사소통할 일이 굉장히 많은데, 그 중에 마케터들도 있을 것이고, 기획 단계에 어느 부분에 해당되는지 알면 더 원활히 될 것이기 때문에 나와 같이 전략 짤 분을 자원받는다고 했다. 내일 정해질 듯.
  • 다른 팀들은 이제서야 데이터셋을 확인하고 주제 선정하는 것 같은데, 우리 팀은 미리 해놔서 다행이다.
  • 오늘까지 Time-line을 세부적으로 설정해서 내일부터 바로 데이터 분석에 들어갈 수 있게 setting해놨다.

 

[Side Project]

  • 오늘은 정말 자료조사와 회의의 연속이라, 체력적으로 너무 힘들었다.
  • 그래도 팀원 분들이 열심히 조사에 임해주셔서 어느 정도 전략 방향성과 타겟을 잡았고,
  • 자료 조사 보완&취합 담당 2명 / VOC 크롤링 및 API GPT에 연동한 작업 담당 3명을 설정했다.
    그에 따라, 대형 커뮤니티 사이트 리스트와 키워드까지 설정했다. 하지만 데이터 분석가나 엔지니어들에게 요청하려면, 각 페이지마다 루트 설정을 해야 된다고 한다....!!(처음 안 사실) 그래서 노션으로 우선 순위를 매긴 커뮤니티 리스트와 키워드, 계정, 각 페이지별 루트 설정까지 정리해서 명일 저녁(1/11)까지 드리기로 했다.
    (내가 하기로 했는데, 잘하면 팀원들한테 분배해서 도와달라고 할지도...)
  • 그리고 영상 아이데이션은 2개를 필수적으로 공통으로 하기로 했고, 전체 전략/견적안/영상 스토리보드/MediaMix/가설 검증&기획의도 등등 각자 역할을 지정했다. 이제 마감일만 잘 지켜서 하면 되는 부분!

 

[배운 점]

  • 역시 오늘도 느낀 점은 리더는 정말 바쁘고 체력적으로 힘들다는 것이다. 왜 유명한 CEO나 C-level들이 자기 관리에 철저한지 알겠다. 체력이 딸리면 연속으로 진행되는 회의에서 벙어리가 될 수 밖에 없음..(빨리 킥복싱 등록해야지..)
  • 본 팀에서 부팀장을 지정한 팀원은 꽤나 부끄러워 하셨다. 과분한 자리라면서, 부끄러워 하심.(ㅋㅋㅋㅋㅋㅋㅋㅋ)
  • 본 팀에서 본 Project와 Side Project의 투입 비율을 6:4로 들어갈 예정이니, 여러분들이 많이 도와주셔야 한다고 강요 같은 부탁을 했다. (ㅎㅎㅎ..죄송해요 여러분. 여러분이 저보다 코딩 잘하시니까..) 사실 코딩 부분은 공식 팀 Brain분이 얼마 걸리지 않는다고 하셔서 전략과 마케팅 방안을 짜는 데에 많은 시간을 쓸 것 같다. (벌써 머리를 쥐어 뜯게 됨)
  • 아무튼 오늘도 발의하고, 확인하고, 정리하고, 방향성 정하고, 뭐하고...정말 바쁘게 지냈다.