🐼 seoul_2022.csv 파일 구성 🐼
모든 코드는 해당 파일을 사용하여 작성
...
row[-1] : 최고기온 열
row[-2] : 최저기온 열
row[-3] : 평균기온 열
👀 최고기온 데이터 준비할 때 밑의 형광펜 부분을 추가해주고, plt.plot(date_list, result, 'r.') 로 그리면 년도를 나타낼 수 있다.
🗨️ split() : 사용자가 설정하는 특정 문자로 문자열 분리(기본적으로 공백문자) 🗨️
데이터
date = '1907-10-01'
년도만 추출
print(date.split('-')[0])
-> 1907
print(date.split('-')[-3])
-> 1907월만 추출
print(date.split('-')[1])
-> 10
print(date.split('-')[-2])
-> 10일만 추출
print(date.split('-')[2])
-> 01
print(date.split('-')[-1])
-> 01
🗨️ 한글, 마이너스 기호 깨짐 방지 🗨️
➕ 12/4일의 최저기온, 평균기온, 최고기온을 지정한 년도의 부분만 출력하기
- input()으로 시작 년도, 끝나는 년도 입력받기
- for문 안에서 범위를 지정해주기
import csv import matplotlib.pyplot as plt from datetime import datetime high_result = [] low_result = [] avg_result = [] datelist = [] f = open('/content/seoul_2022.csv', encoding="cp949") # 2) 데이터 불러오기 data = csv.reader(f) next(data) # 3) 헤더 추출 start = input("원하는 시작 년도를 넣어주세요 : ") end = input("원하는 종료 년도를 넣어주세요 : ") # 4) result list 변수에 기온 데이터 담기 for row in data: if int(start) <= int(row[0].split('-')[0]) and int(end) >= int(row[0].split('-')[0]): if row[-1] != '' and row[-2] != '' and row[-3] != '': # 4-1) 결측치 제외 # 월과 일이 일치하는 데이터만 담기 if row[0].split('-')[1] == '12' and row[0].split('-')[2] == '04': high_result.append(float(row[-1])) # 4-2) 데이터 담기 low_result.append(float(row[-2])) avg_result.append(float(row[-3])) datelist.append(datetime.strptime(row[0].split('-')[0], '%Y')) plt.figure(figsize=(20,5) ,dpi=200) plt.rcParams['axes.unicode_minus'] = False #마이너스 기호 깨짐 방지 plt.rc('font', family="NanumBarunGothic") # 나눔 바른 고딕을 기본 글꼴로 설정 plt.plot(datelist, high_result, 'r', label="최고기온") plt.plot(datelist, low_result, 'b', label="최저기온") plt.plot(datelist, avg_result, 'g', label="평균기온") plt.title(start + "년 부터 " + end +"년 까지 기온 변화 그래프") plt.legend() plt.show() ```
👀 다른 년도를 응용하려면 변수 리스트 선언, if문을 년도에 맞게 바꿔주면 됨
import csv
from datetime import datetime
import matplotlib.pyplot as plt
aug = [] # 1) list 선언
jan = []
f = open('/content/seoul_2022.csv', encoding="cp949")
data = csv.reader(f)
next(data) # 3) 헤더 추출
for row in data:
month = row[0].split('-')[1]
if month == '08':
if row[-1] != '':
aug.append(float(row[-1]))
if month == '01':
if row[-1] != '':
jan.append(float(row[-1]))
plt.figure(dpi=100)
plt.rcParams['axes.unicode_minus'] = False
plt.rc('font', family="NanumBarunGothic")
plt.title("서울 최고기온 데이터 01월과 08월 boxplot")
plt.boxplot(jan)
plt.boxplot(aug) # plt.boxplot([jan, aug]) 따로 그리고 싶을 때
plt.show()
import csv
from datetime import datetime
import matplotlib.pyplot as plt
f = open('/content/seoul_2022.csv', encoding="cp949") # 1) 데이터 불러오기
data = csv.reader(f)
next(data) # 2) 헤더 추출
# 3) 월별 데이터 저장할 month변수를 선언
# month = [[0], [1], [2], [3] ... [11]]
# month[0].append
month = []
for i in range(12):
month.append([])
# 4) 각 달에 맞게 list 변수에 최고 기온 데이터 담기
for row in data:
if row[-1] != '': # 결측치 제외
month[int(row[0].split('-')[1])-1].append(float(row[-1]))
# temp = int(row[0].split('-')[1])
# month[temp-1].append(float(row[-1]))
plt.figure(dpi=100)
plt.rcParams['axes.unicode_minus'] = False #마이너스 기호 깨짐 방지
plt.rc('font', family="NanumBarunGothic") # 나눔 바른 고딕을 기본 글꼴로 설정
plt.title("서울 최고 기온 데이터 월별 boxplot")
plt.boxplot(month)
plt.show()
import csv
from datetime import datetime
import matplotlib.pyplot as plt
f = open('/content/seoul_2022.csv', encoding="cp949") # 1) 데이터 불러오기
data = csv.reader(f)
next(data) # 2) 헤더 추출
# 3) 일별 데이터 저장할 day변수를 선언
# month = [[0], [1], [2], [3] ... [11]]
# month[0].append
day = []
for i in range(31):
day.append([])
# 4) 각 일에 맞게 list 변수에 최고 기온 데이터 담기
for row in data:
if row[-1] != '': # 결측치 제외
day[int(row[0].split('-')[2])-1].append(float(row[-1]))
plt.figure(dpi=100)
plt.rcParams['axes.unicode_minus'] = False
plt.rc('font', family="NanumBarunGothic")
plt.title("서울 최고 기온 데이터 일별 boxplot")
plt.boxplot(day)
plt.show()
🚩 소감 🚩
리스트 안 리스트라는 개념이 좀 생소하고 어려웠는데 예시랑 같이 이해해보니까 조금은 ..? 이해가 된 것 같다. 나중에도 이 개념이 어려우면 더 찾아보든가 아니면 예시를 잘 생각해보면 될 것 같다. 저번주 데이터분석 수업과 비교하면 난이도가 좀 올라간 것 같아서 정신을 좀만 놓으면 수업을 따라가기 힘들 것 같다 ㅎㅎ.... 최고기온, 최저기온, 평균기온을 구하는 부분에서 결측치를 제외할 때 and가 아닌 or을 써도되는게 맞는 것 같아서 계속 아리까리했는데 or은 한개라도 true이면 true가 돼서 그렇게되면 개수가 맞지 않기 때문이라고한다. 그리고 for문을 돌릴 때 or보다 and가 더빠르다고 한다. or은 앞이 계속 false가 나온다고 해도 뒤쪽에 true가 나올 수 있기 때문에 계속 진행해야되는데, and는 false가 하나라도 나오면 바로 넘어가니까 그렇다고한다 ...^..^ 너무피곤하다,,,