패킹 / 언패킹
- 패킹: 여러 개의 데이터를 컬렉션(리스트, 튜플, 딕셔너리)으로 묶어 변수에 대입
- 언패킹: 컬렉션 속의 요소들을 여러 개의 변수에 나누어 대입
def personal_info(name, age, address):
print('이름:', name)
print('나이:', age)
print('주소:', address)
personal_info(name='홍길동', age=30, address='경기도 시흥시')
def personal_info(**kwargs):
print(kwargs)
for kw, arg in kwargs.items():
print(kw, ': ', arg, sep='')
# 값을 한 개 넣어도 되고, 세 개 넣어도 됩니다.
personal_info(name='홍길동')
personal_info(name='홍길동', age=30, address='경기도 시흥시')
def arg_printer(**kwargs):
print(kwargs)
dct = {'param1':5, 'param2':8}
arg_printer(param3=9, **dct) # 변수에 **를 붙이면 딕셔너리 형태가 언패킹된다.
# {'param3': 9, 'param1': 5, 'param2': 8}
def arg_printer(a, b, *args, option=True, **kwargs):
print(a, b)
print(args)
print(option)
print(kwargs)
arg_printer(1, 4, 6, 5, param1=5, param2=6)
# 1 4
# (6, 5)
# True
# {'param1': 5, 'param2': 6}
- 함수에는 위치 인수(값으로만 선언됨)와 키워드 인수(이름과 기본값으로 선언됨)인 두 가지 유형의 인수가 있습니다.
- 함수가 호출될 때 위치 인수에 대한 값이 제공되어야 합니다. 키워드 인수는 선택 사항입니다(지정하지 않으면 기본값을 사용함).
- 함수 내에서의 *args는 명시적으로 정의되지 않은 위치 인수를 수집하여 튜플에 저장합니다.
- 함수 내에서의 **kwargs는 *args와 동일하지만 키워드 인수에 대해 수행합니다. 키워드 인수는 이름-값 쌍으로 저장되기 때문에 딕셔너리에 저장됩니다.
- Python은 위치 인수가 키워드 인수를 따르는 것을 허용하지 않습니다. 따라서 먼저 위치 인수를 선언한 다음 키워드 인수를 선언합니다.
csv 파일
정규표현식
# 만약 문자/숫자/특수문자가 섞여있다면?
import re
p = ['123강남구@@', '456종로구!!', '11,093', '27,394']
k = []
for j in p:
if re.search('[a-z가-힣!@]', j): # j에서 소문자 알파멧/한글 문자/특수문자를 찾았다면
k.append(j)
else: # elif re.search('\d', j):
k.append(float(re.sub(',' , '', j))) # '9,740,398' -> 9740398.0
# float(j.replace(',', ''))
print(k)
import csv
import os
import re
# 함수화 하기
def opencsv(filename):
f = open(filename, 'r')
reader = csv.reader(f)
output = []
for i in reader:
output.append(i)
return output
def writecsv(filename, the_list):
with open(filename, 'w', newline = '') as f:
a = csv.writer(f, delimiter = ',')
a.writerows(the_list)
# 예외처리 : try - except
def switch(listname):
for i in listname: # 이중 리스트 안에 있는 리스트 1개를 가져오고
for j in i: # 리스트에 있는 요소를 받아와서
try: # 여기 해당되는건 바꾸고 (, 문자형을 숫자형으로)
i[i.index(j)] = float(re.sub(',','',j))
except: # 해당되지 않으면 바꾸지 말아라 (숫자가 없는 문자형은 넘어가라)
pass
return listname
외국인
os.chdir('/content/') # 경로 불러오기 (재지정)
total = opencsv('seoul.csv') # csv데이터 불러오기
sample = switch(total)
# 새로운 csv 파일 생성 - 외국인 비율 3% 이상인 대상만 추출하기
new_file = [['행정구역', '한국인', '외국인', '외국인 비율(%)']] # 첫번째 행(제목 지정하기)
for i in sample:
foreign = 0
try:
foreign = round(i[2] / (i[1]+i[2]) * 100, 1)
if foreign >= 3:
new_file.append([i[0], i[1], i[2], foreign])
except:
pass
writecsv('seoul_new.csv', new_file)

부동산
total = opencsv('data_school_utf8.csv')
apt = switch(total)
# 새로운 csv 파일 생성 - 경기도에 100M2 이상 10억원 이하인 아파트 검색하기
new_apt_list = [['시군구', '단지명', '면적', '금액']]
for i in apt:
try:
if i[5] > 100 and i[8] <= 100000 and re.match('경기', i[0]):
new_apt_list.append([i[0], i[4], i[5], i[8]])
except:
pass
writecsv('new_apt_list.csv', new_apt_list)

기온
# 가장 더웠던 날 구하기
f = open('CSV_example2_data.csv')
data = csv.reader(f, delimiter=',')
# 헤더의 정보를 빼고 출력하기
# next() : 첫번째 데이터 행을 읽어오면서 데이터의 탐색위치를 다음행으로 이동시키는 명령어
header = next(data) # ['날짜', '지점', '평균기온', '최저기온', '최고기온']
max_temp = 0
for row in data:
row[4] = float(row[4]) # 문자형 데이터를 숫자형으로
if max_temp < row[4]:
max_temp = row[4] # 최고기온
max_data = row[0] # 날짜
f.close()
print(max_temp, max_data) # 28.4 2023-04-19
# 4,5월 최고 기온을 비교하는 그래프
f = open('CSV_example2_data.csv')
data = csv.reader(f)
next(data)
result_04 = [] # 최고 기온 데이터 저장할 리스트 생성
result_05 = []
for row in data:
month = row[0].split('-')[1] # 2023-04-23 에서 04 추출
if month == '04':
result_04.append(float(row[4]))
elif month == '05':
result_05.append(float(row[4]))
f.close()
plt.figure(figsize=(10, 5) # 가로길이 10 세로길이 5
plt.plot(result_04, 'pink', label = 'month_04')
plt.plot(result_05, 'blue', label = 'month_05')
plt.show()

인구
test_dataset = open("/content/example_4_each.csv")
years = [] # 년도 리스트
populations = [] # 인구수 리스트
for line in test_dataset:
(year, population) = line.split(',')
if year != "구분":
years.append(int(year))
populations.append(int(population))
test_dataset.close()
plt.title("Seoul Population Change")
plt.plot(years, populations, # x축에 년도, y축에 인구수가 있는 선 그래프 만들기
color='green', marker='o', linestyle='solid')
plt.ylabel("10Million") # y축에 레이블 추가하기
plt.show()

Matplotlib
https://wikidocs.net/book/5011
Matplotlib Tutorial - 파이썬으로 데이터 시각화하기
## 도서 소개 - 이 책은 파이썬의 대표적인 데이터 시각화 라이브러리인 Matplotlib의 사용법을 소개합니다. - 30여 개 이상의 다양한 주제에 대해 100개…
wikidocs.net
import matplotlib.pyplot as plt
# 그래프를 그릴 도화지 준비하기
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
1. 기본 그래프 그리기
plt.title('plotting') # 그래프의 타이틀
plt.plot([1,2,3,4], [12,43,25,15]) # 첫번째 리스트가 x축 두번째 리스트가 y축
plt.show()

하나의 리스트 형태로 값들을 입력하면 y 값으로 인식하고, x 값은 기본적으로 [0, 1, 2, 3]이 됩니다.
plot((2, 3, 5, 10)) 또는 plot(np.array([2, 3, 5, 10])와 같이 파이썬 튜플 또는 Numpy 어레이의 형태로도 데이터를 입력할 수 있습니다.
# 레이블이 있는 데이터 사용하기
data_dict = {'data_x': [1, 2, 3, 4, 5], 'data_y': [2, 3, 5, 10, 8]}
plt.plot('data_x', 'data_y', data=data_dict)
plt.show()
파이썬 딕셔너리와 같이 레이블이 있는 데이터를 그래프로 나타낼 수 있습니다.
먼저 plot() 함수에 데이터의 레이블 (딕셔너리의 키)을 입력해주고, data 파라미터에 딕셔너리를 지정해줍니다.
2. 범례 표시하기
plt.title('legend')
plt.plot([1, 2, 3, 4], [2, 3, 5, 10], label='Price ($)')
plt.plot([1, 2, 3, 4], [3, 5, 9, 7], label='Demand (#)')
# plt.legend(loc='best') # ncol = 1
plt.legend(loc='best', ncol=2, fontsize=10)
plt.show()

범례 (Legend)는 그래프에 데이터의 종류를 표시하기 위한 텍스트입니다.
그래프 영역에 범례를 나타내기 위해서는 우선 plot() 함수에 label 문자열을 지정하고, matplotlib.pyplot 모듈의 legend() 함수를 호출합니다.
3. 색상 지정하기
plt.title('color')
plt.plot([10,20,30,40], color = 'skyblue', label = 'skyblue')
plt.plot([40,30,20,10], 'pink', label = 'pink')
plt.legend()
plt.show()

color 키워드 인자를 사용해서 더 다양한 색상의 이름을 지정할 수 있습니다.
plot() 함수에 color=’limegreen’과 같이 입력하면, limegreen에 해당하는 색깔이 표시됩니다.
4. 선 종류 지정하기
plt.title('linestyle')
plt.plot([1, 2, 3], [4, 4, 4], '-', color='C0', label='Solid')
# plt.plot([1, 2, 3], [4, 4, 4], linestyle='solid', color='C0', label="'solid'")
# plt.plot([1, 2, 3], [4, 4, 4], linestyle=(0, (1, 1)), color='C0', label='(0, (1, 1))')
plt.plot([1, 2, 3], [3, 3, 3], '--', color='C0', label='Dashed')
plt.plot([1, 2, 3], [2, 2, 2], ':', color='C0', label='Dotted')
plt.plot([1, 2, 3], [1, 1, 1], '-.', color='C0', label='Dash-dot')
plt.axis([0.8, 3.2, 0.5, 5.0])
plt.legend(loc='upper right', ncol=4, fontsize=6)
plt.tight_layout()
plt.show()

‘ - ‘ (Solid), ‘ - - ‘ (Dashed), ‘ : ‘ (Dotted), ‘ -. ‘ (Dash-dot)과 같이 네가지 종류를 선택할 수 있습니다.
plot() 함수의 linestyle 파라미터 값을 직접 지정할 수 있습니다.
포맷 문자열과 같이 ‘solid’, ‘dashed’, ‘dotted’, dashdot’ 네가지의 선 종류를 지정할 수 있습니다.
튜플을 사용해서 선의 종류를 커스터마이즈할 수 있습니다. 예를 들어, (0, (1, 1))은 ‘dotted’와 같고, (0, (5, 5))는 ‘dashed’와 같습니다. 또한 (0, (3, 5, 1, 5))는 ‘dashdotted’와 같습니다.
# 선 끝 모양 지정하기
plt.plot([1, 2, 3], [4, 4, 4], linestyle='solid', linewidth=8,
solid_capstyle='butt', color='C1', label='solid+butt')
plt.plot([1, 2, 3], [3, 3, 3], linestyle='solid', linewidth=4,
solid_capstyle='round', color='limegreen', label='solid+round')
plt.plot([1, 2, 3], [2, 2, 2], linestyle='dashed', linewidth=8,
dash_capstyle='butt', color='dodgerblue', label='dashed+butt')
plt.plot([1, 2, 3], [1, 1, 1], linestyle='dashed', linewidth=4,
dash_capstyle='round', color='violet', label='dashed+round')
plt.xlabel('X-Axis')
plt.ylabel('Y-Axis')
plt.axis([0.8, 3.2, 0.5, 5.0])
plt.legend(loc='upper right', ncol=2)
plt.tight_layout()
plt.show()

5. 마커 지정하기
plt.title('marker')
plt.plot([10,20,30,40], 'r.--', label = 'circle') # 색상, 마커모양, 선모양(r.--)
plt.plot([40,30,20,10], 'g^', label = 'triangle up')
plt.legend()
plt.show()

x, y 값 인자에 대해 선의 색상과 형태를 지정하는 포맷 문자열 (Format string)을 세번째 인자에 입력할 수 있습니다.
포맷 문자열 ‘ro’는 빨간색 (‘red’)의 원형 (‘o’) 마커를 의미합니다. 또한, 예를 들어 ‘b-‘는 파란색 (‘blue’)의 실선 (‘-‘)을 의미합니다.




'DATA ANALYSIS > TIL' 카테고리의 다른 글
| [Day12] Python 심화(4) (0) | 2023.05.11 |
|---|---|
| [Day11] Python 심화(3) (1) | 2023.05.10 |
| [Day9] Python 심화(1) (0) | 2023.05.08 |
| [VOD] 같이 푸는 PYTHON [기초] (0) | 2023.05.04 |
| [Day7] Python 기초(5) (0) | 2023.05.04 |