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)
'작업 > 데이터분석' 카테고리의 다른 글
21.12.06 파이썬 데이터처리 모의테스트 (0) | 2021.12.06 |
---|---|
21.12.06 파이썬 정리2 (0) | 2021.12.06 |
21.12.04 numpy, pandas (0) | 2021.12.05 |
21.12.02 JSON, CSV (0) | 2021.12.04 |
21.12.01 파이썬 파일 다루기 / 데이터 구조 다루기 / 그래프 다루기 (0) | 2021.12.01 |