DATA ANALYSIS/TIL

[Day10] Python 심화(2)

yel1nk 2023. 5. 9. 17:54

패킹 / 언패킹

  • 패킹: 여러 개의 데이터를 컬렉션(리스트, 튜플, 딕셔너리)으로 묶어 변수에 대입
  • 언패킹: 컬렉션 속의 요소들을 여러 개의 변수에 나누어 대입
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