21.12.06 파이썬 정리 1

2021. 12. 6. 17:19작업/데이터분석

12 01) 1. 트럼프 대통령 트윗으로 시작하는 데이터 처리

실습1 인덱싱

# 트럼프 대통령의 1월 1~3일 트윗을 각각 리스트의 원소로 저장합니다.
trump_tweets = [
    'Will be leaving Florida for Washington (D.C.) today at 4:00 P.M. Much work to be done, but it will be a great New Year!',
    'Companies are giving big bonuses to their workers because of the Tax Cut Bill. Really great!',
    'MAKE AMERICA GREAT AGAIN!'
]

def date_tweet(tweet):
    # index에 0~2을 차례대로 저장하여 반복문을 실행합니다.
    for index in range(len(tweet)):
        print('2018년 1월 ' + str(index+1) + '일: ' + tweet[index])


# 실행 결과를 확인하기 위한 코드입니다.
date_tweet(trump_tweets)

실습2 startswith() 1

# 트럼프 대통령 트윗을 공백 기준으로 분리한 리스트입니다. 수정하지 마세요.
trump_tweets = ['thank', 'you', 'to', 'president', 'moon', 'of', 'south', 'korea', 'for', 'the', 'beautiful', 'welcoming', 'ceremony', 'it', 'will', 'always', 'be', 'remembered']

def print_korea(text):
    # 아래 코드를 작성하세요.
    for i in text:
        if i[0]=='k':
            print(i)
    
    
    
# 아래 주석을 해제하고 결과를 확인해보세요.  
print_korea(trump_tweets)

실습3 startswith() 2

# 트럼프 대통령 트윗을 공백 기준으로 분리한 리스트입니다. 수정하지 마세요.
trump_tweets = ['thank', 'you', 'to', 'president', 'moon', 'of', 'south', 'korea', 'for', 'the', 'beautiful', 'welcoming', 'ceremony', 'it', 'will', 'always', 'be', 'remembered']

def print_korea(tweet):
    '''
    문자열로 구성된 리스트에서 k로 시작하는 문자열을 출력합니다.
    '''
    for i in tweet:
        if i.startswith('k'):
            print(i)
    
    
    
# 아래 주석을 해제하고 결과를 확인해보세요.  
print_korea(trump_tweets)

실습4 split()

# 트럼프 대통령의 트윗으로 구성된 문자열입니다. 수정하지 마세요. 
trump_tweets = "thank you to president moon of south korea for the beautiful welcoming ceremony it will always be remembered"

def break_into_words(text):
    # 아래 코드를 작성하세요.
    words=text.split(' ')
    
    
    return words


# 아래 주석을 해제하고 결과를 확인해보세요.  
print(break_into_words(trump_tweets))

실습5 append()

# 트럼프 대통령 트윗을 공백 기준으로 분리한 리스트입니다. 수정하지 마세요.
trump_tweets = ['america', 'is', 'back', 'and', 'we', 'are', 'coming', 'back', 'bigger', 'and', 'better', 'and', 'stronger', 'than', 'ever', 'before']

def make_new_list(text):
    # 아래 코드를 작성하세요.
    new_list=[]
    for i in text:
        if i.startswith('b'):
            new_list.append(i)
    
    
    
    return new_list


# 아래 주석을 해제하고 결과를 확인해보세요.  
new_list = make_new_list(trump_tweets)
print(new_list)

실습6 lower()

# 트럼프 대통령의 트윗 세개로 구성된 리스트입니다. 수정하지 마세요.
trump_tweets = [
    "FAKE NEWS - A TOTAL POLITICAL WITCH HUNT!",
    "Any negative polls are fake news, just like the CNN, ABC, NBC polls in the election.",
    "The Fake News media is officially out of control.",
]
 
def lowercase_all_characters(text):
    processed_text = []
    # 아래 코드를 작성하세요.
    for i in text:
        processed_text.append(i.lower())
    
    
    return processed_text


# 아래 주석을 해제하고 결과를 확인해보세요.  
print('\n'.join(lowercase_all_characters(trump_tweets)))

실습7 replace()

# 트럼프 대통령의 트윗 세개로 구성된 리스트입니다. 수정하지 마세요.
trump_tweets = [
    "i hope everyone is having a great christmas, then tomorrow it’s back to work in order to make america great again.",
    "7 of 10 americans prefer 'merry christmas' over 'happy holidays'.",
    "merry christmas!!!",
]

def remove_special_characters(text):
    processed_text = []
    # 아래 코드를 작성하세요.
    for i in text:
        i=i.replace(',','').replace("'",'').replace('!','')
        processed_text.append(i)
    
    
    
    return processed_text


# 아래 주석을 해제하고 결과를 확인해보세요.  
print('\n'.join(remove_special_characters(trump_tweets)))

12 01) 2. 영어 단어 모음으로 시작하는 텍스트 파일 분석

실습1 with open() as

filename = 'corpus.txt'

def print_lines(filename):
    # 아래 코드를 작성하세요.
        line_number = 1    
            # 1 This is Elice. 와 같이, "(줄번호) (내용)" 형식으로 출력합니다.
        with open(filename) as file:
            for i in file:
                print(f'{line_number} {i}')
                line_number += 1


# 아래 주석을 해제하고 결과를 확인해보세요.  
print_lines(filename)

실습 2 데이터 형태 변환 - 튜플

# 텍스트 파일을 불러옵니다.
filename = 'corpus.txt'

def import_as_tuple(filename):
    tuples = []
    with open(filename) as file:
        for line in file:
            # 아래 코드를 작성하세요.
            split = line.strip().split(',') # strip -> line으로 읽어올 때 자동으로 읽어오는 앞뒤에 있는 \n 공백문자들을 없애줌
            word = split[0]
            freq = split[1]
            new_tuple=(word,freq)
            tuples.append(new_tuple)
    return tuples


# 아래 주석을 해제하고 결과를 확인해보세요.  
print(import_as_tuple(filename))

실습 3 list comprehension ?

# 단어 모음을 선언합니다. 수정하지 마세요.
words = [
    'apple',
    'banana',
    'alpha',
    'bravo',
    'cherry',
    'charlie',
]

def filter_by_prefix(words, prefix):
    # 아래 코드를 작성하세요.
    new_list = [word for word in words if word[0]==prefix]
    return new_list


# 아래 주석을 해제하고 결과를 확인해보세요.  
a_words = filter_by_prefix(words, 'a')
print(a_words)

실습 4 sorted(리스트, key=함수)

# 해당 단어의 빈도수를 담은 리스트를 선언합니다. 수정하지 마세요.
pairs = [
    ('time', 8),
    ('the', 15),
    ('turbo', 1),
]



#(단어, 빈도수) 쌍으로 이루어진 튜플을 받아, 빈도수를 리턴합니다.    
def get_freq(pair):
    return pair[1]



#(단어, 빈도수) 꼴 튜플의 리스트를 받아, 빈도수가 낮은 순서대로 정렬하여 리턴합니다.
def sort_by_frequency(pairs):
    sorted_pairs = sorted(pairs, key=get_freq)
    return sorted_pairs


# 아래 주석을 해제하고 결과를 확인해보세요.  
print(sort_by_frequency(pairs))

실습 5 차트 그리기

# matplotlib의 일부인 pyplot 라이브러리를 불러옵니다.
import matplotlib.pyplot as plt

# 엘리스에서 차트를 그릴 때 필요한 라이브러리를 불러옵니다.
from elice_utils import EliceUtils
elice_utils = EliceUtils()

# 월별 평균 기온을 선언합니다. 수정하지 마세요.
years = [2013, 2014, 2015, 2016, 2017]
temperatures = [5, 10, 15, 20, 17]

#막대 차트를 출력합니다.   
def draw_graph():
    # 막대 그래프의 막대 위치를 결정하는 pos를 선언합니다.
    pos = range(len(years))  # [0, 1, 2, 3, 4]
    
    # 높이가 온도인 막대 그래프를 그립니다.
    # 각 막대를 가운데 정렬합니다.
    plt.bar(pos, temperatures, align='center')
    
    # 각 막대에 해당되는 연도를 표기합니다.
    plt.xticks(pos, years)
    
    # 그래프를 엘리스 플랫폼 상에 표시합니다.
    plt.savefig('graph.png')
    elice_utils.send_image('graph.png')

print('막대 차트를 출력합니다.')
draw_graph()

12 03) 1. 넷플릭스 시청 데이터로 알아보는 데이터형 변환

실습 1 데이터 빠르게 탐색, 딕셔너리

# 텍스트 파일을 불러옵니다.
source_file = "netflix.txt"

def make_dictionary(filename):
    user_to_titles = {}
    with open(filename) as file:
        for line in file:
            # 아래 코드를 작성하세요.
            user, title = line.strip().split(':')
            user_to_titles[user]=title
            
            
            
        return user_to_titles


# 아래 주석을 해제하고 결과를 확인해보세요.  
print(make_dictionary(source_file))

실습 2 데이터 순회하기 for key,value in 딕셔너리.items():

# 사용자가 시청한 작품의 리스트를 저장합니다. 수정하지 마세요. 
user_to_titles = {
    1: [271, 318, 491],
    2: [318, 19, 2980, 475],
    3: [475],
    4: [271, 318, 491, 2980, 19, 318, 475],
    5: [882, 91, 2980, 557, 35],
}
def get_user_to_num_titles(user_to_titles):
    user_to_num_titles = {}
    
    # 아래 함수를 완성하세요.
    for user,titles in user_to_titles.items(): # .items는 딕셔너리의 키와 벨류를 꺼내오는 듯?
        # print(user) 1
        # print(titles) [271,318,491]
        user_to_num_titles[user]=len(titles) # 각 유저별로 본 작품 수 넣기
    
    return user_to_num_titles
    

# 아래 주석을 해제하고 결과를 확인해보세요.  
print(get_user_to_num_titles(user_to_titles))

실습 3 JSON 데이터 다루기 loads() 딕셔너리로 dumps() 문자열로

# json 패키지를 임포트합니다.
import json



#JSON 파일을 읽고 문자열을 딕셔너리로 변환합니다.
def create_dict(filename):
    with open(filename) as file:
        json_string = file.read()
        
        # 함수를 완성하세요.
        return json.loads(json_string)



#JSON 파일을 읽고 딕셔너리를 JSON 형태의 문자열로 변환합니다.
def create_json(dictionary, filename):
    with open(filename, 'w') as file:
        # 함수를 완성하세요.
        json_string = json.dumps(dictionary)
        file.write(json_string)
        
        
# 아래 주석을 해제하고 결과를 확인해보세요.  
src = 'netflix.json'
dst = 'new_netflix.json'

netflix_dict = create_dict(src)
print('원래 데이터: ' + str(netflix_dict))

netflix_dict['Dark Knight'] = 39217
create_json(netflix_dict, dst)
updated_dict = create_dict(dst)
print('수정된 데이터: ' + str(updated_dict))

실습 4 데이터의 집합 나타내기 set

# 정수 3과 5를 원소로 갖는 새로운 집합을 생성합니다.
my_set = {3,5}

# 채점을 위한 코드입니다. 수정하지 마세요. 
submit1 = my_set.copy()

# 정수 7을 my_set에 추가합니다.
my_set.add(7)

# 채점을 위한 코드입니다. 수정하지 마세요. 
submit2 = my_set.copy()

# new_numbers 리스트의 원소를 my_set에 추가합니다.
new_numbers = [1, 2, 3, 4, 5]
my_set.update(new_numbers)

# 채점을 위한 코드입니다. 수정하지 마세요. 
submit3 = my_set.copy()

# my_set에서 짝수를 모두 제거합니다.
my_set = {num for num in my_set if num%2!=0}

# 채점을 위한 코드입니다. 수정하지 마세요. 
submit4 = my_set.copy()

실습 5 집합 연산자 len(), & | -

# 각 영화 별 시청자 리스트를 임포트합니다.
from viewers import dark_knight, iron_man

dark_knight_set = set(dark_knight)
iron_man_set = set(iron_man)

# 두 작품을 모두 시청한 사람의 수
both =len(dark_knight_set & iron_man_set)

# 두 작품 중 최소 하나를 시청한 사람의 수
either = len(dark_knight_set|iron_man_set)

# 다크나이트만 시청한 사람의 수
dark_knight_only = len(dark_knight_set - iron_man_set)

# 아이언맨만 시청한 사람의 수
iron_man_only = len(iron_man_set - dark_knight_set)


# 아래 주석을 해제하고 실행 결과를 확인해보세요.
print("두 작품 모두 시청: {}명".format(both))
print("하나 이상 시청: {}명".format(either))
print("다크나이트만 시청: {}명".format(dark_knight_only))
print("아이언맨만 시청: {}명".format(iron_man_only))

실습 6 차트 설정(폰트설정, X축Y축라벨, 여백, 차트제목)

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

from elice_utils import EliceUtils
elice_utils = EliceUtils()

# 날짜 별 온도 데이터를 세팅합니다.
dates = ["1월 {}일".format(day) for day in range(1, 32)]
temperatures = list(range(1, 32))

# 막대 그래프의 막대 위치를 결정하는 pos를 선언합니다.
pos = range(len(dates))

# 한국어를 보기 좋게 표시할 수 있도록 폰트를 설정합니다.
font = fm.FontProperties(fname='./NanumBarunGothic.ttf')

# 막대의 높이가 빈도의 값이 되도록 설정합니다.
plt.bar(pos, temperatures, align='center')

# 각 막대에 해당되는 단어를 입력합니다.
plt.xticks(pos, dates, rotation='vertical', fontproperties=font)

# 그래프의 제목을 설정합니다.
plt.title('1월 중 기온 변화', fontproperties=font)

# Y축에 설명을 추가합니다.
plt.ylabel('온도', fontproperties=font)

# 단어가 잘리지 않도록 여백을 조정합니다.
plt.tight_layout()

# 그래프를 표시합니다.
plt.savefig('graph.png')
elice_utils.send_image('graph.png')

12 03) 2. 테드 강연으로 알아보는 복잡한 형태의 데이터

실습 1 CSV 데이터 읽고 처리하기 read

# csv 모듈을 임포트합니다. 
import csv

def print_book_info(filename):
    with open(filename) as file:
        # ',' 기호로 분리된 CSV 파일을 처리하세요..
        reader = csv.reader(file, delimiter=',')
        
        # 처리된 파일의 각 줄을 불러옵니다.
        for row in reader:
            
            # 함수를 완성하세요.
            title = row[0]
            author = row[1]
            pages = row[3]
            print("{} ({}): {}p".format(title, author, pages))


# 아래 주석을 해제하고 실행 결과를 확인해보세요.
filename = 'books.csv'
print_book_info(filename)

실습 2 CSV 데이터 변환하기 (페이지 수는 문자열이 아닌 정수)

# CSV, JSON 모듈을 임포트합니다.
import csv
import json
from elice_utils import EliceUtils

elice_utils = EliceUtils()

def books_to_json(src_file, dst_file):
    # 아래 함수를 완성하세요.
    books = []
    with open(src_file) as src:
        reader = csv.reader(src, delimiter=',')
        
        # 각 줄 별로 대응되는 book 딕셔너리를 만듭니다.
        for row in reader:
            # 책 정보를 저장하는 딕셔너리를 생성합니다.
            book = {
                'title': row[0],
                'author':row[1],
                'genre':row[2],
                'pages':int(row[3]),
                'publisher':row[4]
            }
            books.append(book)
    
    with open(dst_file, 'w') as dst:
        # JSON 형식으로 dst_file에 저장합니다.
        json_string = json.dumps(books)
        dst.write(json_string)


# 아래 주석을 해제하고 결과를 확인해보세요.  
src_file = 'books.csv'
dst_file = 'books.json'
books_to_json(src_file, dst_file)
elice_utils.send_file(dst_file)

실습 3 한 줄 익명함수 lambda

'''
num을 제곱한 값을 리턴합니다.
'''
def _square(num):
    return num * num

# _square()와 동일한 기능을 하는 lambda 함수 square를 만들어 보세요.
square = lambda num:num*num

'''
string이 빈 문자열일 경우 빈 문자열을, 아니면 첫 번째 글자를 리턴합니다.
'''
def _first_letter(string):
    return string[0] if string else ''

first_letter = lambda string:string[0] if string else ''


# assert를 이용하여 두 함수의 기능이 동일한 지 테스트합니다. 아래 주석을 해제하고 결과 값을 확인해보세요.
testcases1 = [3, 10, 7, 1, -5]
for num in testcases1:
    assert(_square(num) == square(num))

testcases2 = ['', 'hello', 'elice', 'abracadabra', '  abcd  ']
for string in testcases2:
    assert(_first_letter(string) == first_letter(string))

# 위의 assert 테스트를 모두 통과해야만 아래의 print문이 실행됩니다.
print("성공했습니다!")

실습 4 함수를 리턴하는 함수 itemgetter()

데이터의 모음을 받아 n번째 원소를 리턴하는 함수

'''
주어진 값이 정수가 아니거나 최솟값 minimum보다 작으면 False를 리턴하는 함수를 리턴합니다.

'''
def min_validator(minimum):
    def helper(n):
        # n의 타입이 정수가 아니면 False를 리턴합니다.
        if type(n) is not int:
            return False
        # 아래 함수를 완성하세요.
        return minimum <= n
    
    return helper
'''    
주어진 값이 정수가 아니거나 최댓값 maximum보다 크면 False를 리턴하는 함수를 리턴합니다.
'''
def max_validator(maximum):
    def helper(n):
        # n의 타입이 정수가 아니면 False를 리턴합니다.
        if type(n) is not int:
            return False
        # 아래 함수를 완성하세요.
        return n<=maximum
    
    return helper


def validate(n, validators):
    # validator 중 하나라도 통과하지 못하면 False를 리턴합니다.
    for validator in validators:
        if not validator(n):
            return False
    
    return True


# 작성한 함수를 테스트합니다. # 아래 주석을 해제하고 결과 값을 확인해보세요.
# # 나이 데이터를 검증하는 validator를 선언합니다. 
age_validators = [min_validator(0), max_validator(120)]
ages = [9, -3, 7, 33, 18, 1999, 287, 0, 13]

# 주어진 나이 데이터들에 대한 검증 결과를 출력합니다.
print("검증 결과")
for age in ages:
    result = "유효함" if validate(age, age_validators) else "유효하지 않음"
    print("{}세 : {}".format(age, result))

실습 5 map(함수, 데이터)

# CSV 모듈을 임포트합니다.
import csv

def get_titles(books_csv):
    with open(books_csv) as books:
        reader = csv.reader(books, delimiter=',')
        # 함수를 완성하세요.
        get_title = lambda row: row[0]
        titles = map (get_title, reader)
        
        return list(titles)


# 작성한 코드를 테스트합니다. 주석을 해제하고 실행하세요.
books = 'books.csv'
titles = get_titles(books)
for title in titles:
     print(title)

실습 6 filter(함수,데이터)

# CSV 모듈을 임포트합니다.
import csv

def get_titles_of_long_books(books_csv):
    with open(books_csv) as books:
        reader = csv.reader(books, delimiter=',')
        # 함수를 완성하세요.
        is_long = lambda row: int(row[3])>250
        get_title = lambda row: row[0]
        
        long_books = filter(is_long, reader)
        long_book_titles = map(get_title, long_books)
        
        return list(long_book_titles)


# 작성한 함수를 테스트합니다. 주석을 해제하고 실행하세요.
books  = 'books.csv'
titles = get_titles_of_long_books(books)
for title in titles:
    print(title)