지난 포스팅에서 평균값을 구하는 데이터 처리를 통해 미세먼지와 초미세먼지의 일평균 미세먼지 농도 평균을 구했다.
지난 포스팅에서 사용된 코드는 더보기를 확인하기 바란다.
from openpyxl import Workbook, load_workbook #xlsx파일 읽는데 필요한 모듈 import
load16 = load_workbook("daily2016.xlsx", data_only = True) #파일로드
load16S = load16['Sheet1'] #파일속 Sheet를 가져옴
load17 = load_workbook("daily2017.xlsx", data_only = True)
load17S = load17['Sheet1']
load18 = load_workbook("daily2018.xlsx", data_only = True)
load18S = load18['Sheet1']
#모든 데이터들이 들어갈 빈 리스트 생성
all_value16 = []
all_value17 = []
all_value18 = []
#3년 간의 일평균 대기환경 지수 리스트로 가져오기 (all_valueYY) for문 사용
for row in load16S.rows:
row_value = []
for cell in row:
row_value.append(cell.value)
all_value16.append(row_value)
for row in load17S.rows:
row_value = []
for cell in row:
row_value.append(cell.value)
all_value17.append(row_value)
for row in load18S.rows:
row_value = []
for cell in row:
row_value.append(cell.value)
all_value18.append(row_value)
select16 = [] #필요한 데이터. 즉 서대문구의 데이터만 담을 리스트 생성
select17 = [] #필요한 데이터. 즉 서대문구의 데이터만 담을 리스트 생성
select18 = [] #필요한 데이터. 즉 서대문구의 데이터만 담을 리스트 생성
for i in range(len(all_value16)):
if all_value16[i][1] == '서대문구': #원하는 지역인 것만 모아온 것.
select16.append(all_value16[i])
for i in range(len(all_value17)):
if all_value17[i][1] == '서대문구': #원하는 지역인 것만 모아온 것.
select17.append(all_value17[i])
for i in range(len(all_value18)):
if all_value18[i][1] == '서대문구': #원하는 지역인 것만 모아온 것.
select18.append(all_value18[i])
average10 = [] #미세먼지평균 데이터를 넣을 빈리스트
average25 = [] #초미세먼지평균 데이터를 넣을 빈리스트
for i in range(len(select18)):
#None 인 데이터 처리
if select16[i][6] == None:
if select17[i][6] == None:
if select18[i][6] == None:
ans10 = '측정불가'
else:
ans10 = select18[i][6]
else:
if select18[i][6] == None:
ans10 = select17[i][6]
else:
ans10 = (select17[i][6] + select18[i][6]) / 2
else:
if select17[i][6] == None:
if select18[i][6] == None:
ans10 = select16[i][6]
else:
ans10 = (select16[i][6] + select18[i][6]) / 2
else:
if select18[i][6] == None:
ans10 = (select16[i][6] + select17[i][6]) / 2
else:
ans10 = (float(select16[i][6]) + float(select17[i][6]) + float(select18[i][6])) / 3
average10.append(ans10)
#pm25(초미세먼지) 3년간의 일 평균 초미세먼지 농도를 가지고 새로운 일 평균 초미세먼지 값을 찾는 과정
for i in range(len(select18)):
#None 인 데이터 처리
if select16[i][7] == None:
if select17[i][7] == None:
if select18[i][7] == None:
ans25 = '측정불가'
else:
ans25 = select18[i][7]
else:
if select18[i][7] == None:
ans25 = select17[i][7]
else:
ans25 = (select17[i][7] + select18[i][7]) / 2
else:
if select17[i][7] == None:
if select18[i][7] == None:
ans25 = select16[i][7]
else:
ans25 = (select16[i][7] + select18[i][7]) / 2
else:
if select18[i][7] == None:
ans25 = (select16[i][7] + select17[i][7]) / 2
else:
ans25 = (float(select16[i][7]) + float(select17[i][7]) + float(select18[i][7])) / 3
average25.append(ans25)
이번 포스팅에서는 지난 포스팅에서 언급한대로 지정한 달의 미세먼지 농도가 적은 세날을 출력하도록 기능을 구현하고자한다.
이번에는 리스트에서 최솟값3개를 찾는 함수를 만들것이다. 그런데 그전에 리스트의 길이가 366임을 확인했고 리스트 1은 1월1일, 2는 2월 2일 과같이 나타낼 것이라 말한 바 있다. 하지만 생각해보면 366이라는 길이를 계속확인하면서 최솟값을 찾는 것은 시간이 걸리는 일이다. 그렇기 때문에 원하는 달에 대해서만 리스트 슬라이싱을 통한 리스트를 만들것이다. 쉽게 말하자면 1월이 원하는 달이라면 average10[0:31:1]과 같이나타내서 슬라이싱을 하겠다는 것이다.
따라서 코드를 작성하면 다음과 같다.
mon = input("원하는 달을 숫자로 한개만 입력하세요.(ex 10, 1, 2):")
#mon은 str형식이므로 if문, elif문에서 '1', '2'와 같이 str형식으로 조건을 달아준다.
monwant10 = []
monwant25 = []
if mon == '1':
mon = int(mon)
monwant10 = average10[0:31:1]
monwant25 = average25[0:31:1]
elif mon == '2':
mon = int(mon)
monwant10 = average10[31:60:1]
monwant25 = average25[31:60:1]
elif mon == '3':
mon = int(mon)
monwant10 = average10[60:91:1]
monwant25 = average25[60:91:1]
elif mon == '4':
mon = int(mon)
monwant10 = average10[91:121:1]
monwant25 = average25[91:121:1]
elif mon == '5':
mon = int(mon)
monwant10 = average10[121:152:1]
monwant25 = average25[121:152:1]
elif mon == '6':
mon = int(mon)
monwant10 = average10[152:182:1]
monwant25 = average25[152:182:1]
elif mon == '7':
mon = int(mon)
monwant10 = average10[182:213:1]
monwant25 = average25[182:213:1]
elif mon == '8':
mon = int(mon)
monwant10 = average10[213:244:1]
monwant25 = average25[213:244:1]
elif mon == '9':
mon = int(mon)
monwant10 = average10[244:274:1]
monwant25 = average25[244:274:1]
elif mon == '10':
mon = int(mon)
monwant10 = average10[274:305:1]
monwant25 = average25[274:305:1]
elif mon == '11':
mon = int(mon)
monwant10 = average10[305:335:1]
monwant25 = average25[305:335:1]
elif mon == '12':
mon = int(mon)
monwant10 = average10[335:366:1]
monwant25 = average25[335:366:1]
다소 길다. 그러나 별도의 모듈을 사용하지 않기 때문에 그냥 사용하도록 하겠다.
조건문에서 mon을 int로 바꿔주는 것을 볼 수 있는데, 다른 코드에서 사용하기 위함이니 그냥 넘어가도록 하자.
그런데 생각해보자. 사용자가 순순히 1월에서 12월을 입력해줄까? 즉, 숫자1부터 12까지만 입력할까? 물론 아니다.
실수건 고의건 사용자는 '12월', '십이월' 과 같이 우리가 코드로 정한것 외의 것을 입력할 수도 있다. 우리는 프로그래머이다. 프로그램을 작성하는 것 뿐아니라 어떤 상황에서도 프로그램이 돌아가도록 만들어야 한다.
말이 너무 길었는데 else문을 사용하여 이를 방지하겠다.
mon = input("원하는 달을 숫자로 한개만 입력하세요.(ex 10, 1, 2):")
print("입력완료!")
print()
monwant10 = []
monwant25 = []
if mon == '1':
mon = int(mon)
monwant10 = average10[0:31:1]
monwant25 = average25[0:31:1]
elif mon == '2':
mon = int(mon)
monwant10 = average10[31:60:1]
monwant25 = average25[31:60:1]
elif mon == '3':
mon = int(mon)
monwant10 = average10[60:91:1]
monwant25 = average25[60:91:1]
elif mon == '4':
mon = int(mon)
monwant10 = average10[91:121:1]
monwant25 = average25[91:121:1]
elif mon == '5':
mon = int(mon)
monwant10 = average10[121:152:1]
monwant25 = average25[121:152:1]
elif mon == '6':
mon = int(mon)
monwant10 = average10[152:182:1]
monwant25 = average25[152:182:1]
elif mon == '7':
mon = int(mon)
monwant10 = average10[182:213:1]
monwant25 = average25[182:213:1]
elif mon == '8':
mon = int(mon)
monwant10 = average10[213:244:1]
monwant25 = average25[213:244:1]
elif mon == '9':
mon = int(mon)
monwant10 = average10[244:274:1]
monwant25 = average25[244:274:1]
elif mon == '10':
mon = int(mon)
monwant10 = average10[274:305:1]
monwant25 = average25[274:305:1]
elif mon == '11':
mon = int(mon)
monwant10 = average10[305:335:1]
monwant25 = average25[305:335:1]
elif mon == '12':
mon = int(mon)
monwant10 = average10[335:366:1]
monwant25 = average25[335:366:1]
else:
print()
print("잘못입력하셨습니다. 다시 입력해주세요.")
print()
이전 코드와 조금씩 다른 점들이 보인다. 마지막 코드에서는 모두 합해질 것이기때문에 그냥 가도 좋다.
방금 프로그램이 멈춰선 안된다곤 했는데, 마지막에서 while문을 사용할 것이기 때문에 멈추지 않을 것이다.
하지만 현재는 개발중인 단계이고 while문을 사용하지 않았기 때문에 멈춰도 이상한게 아니다.
자 이제 원한느 달에 대한 리스트monwant를 만들었다.
이번에는 최솟값을 출력할때 1월 xx일과 같이 return되어 출력되어야 하므로 리스트의 인덱스를 가지고 날짜를 출력하도록 해주겠다. 위 코드에서 mon과 연동지을 것이다.
def NewCalc(mon,Num):
if mon == 1:
a = "1월"+ str(Num+1)+"일"
return a
elif mon == 2:
a = "2월"+ str(Num+1)+"일"
return a
elif mon == 3:
a = "3월" +str(Num+1) +"일"
return a
elif mon == 4:
a = "4월" +str(Num+1) +"일"
return a
elif mon == 5:
a = "5월" +str(Num+1) +"일"
return a
elif mon == 6:
a = "6월" +str(Num+1) +"일"
return a
elif mon == 7:
a = "7월" +str(Num+1) +"일"
return a
elif mon == 8:
a = "8월" +str(Num+1) +"일"
return a
elif mon == 9:
a = "9월" +str(Num+1) +"일"
return a
elif mon == 10:
a = "10월" +str(Num+1) +"일"
return a
elif mon == 11:
a = "11월" +str(Num+1) +"일"
return a
elif mon == 12:
a = "12월" +str(Num+1) +"일"
return a
else:
a = "Error"
return a
물론 함수이름은 원하는 대로 새로 설정해도 좋다. 대신 뒤에서 헷갈리지 않도록 조심해야한다. 달에 대한 리스트를 따로 만들어 두었기 때문에 0번 인덱스가 1일 이고, 1번이 2일, ... 그어떤 달이 와도 공통적인 사항이다. 따라서 리스트의 인덱스인 Num에 1을 더해주었다.
그럼 다음포스팅에서 최종적으로 최솟값3개를 찾는 함수를 구현해보도록 하겠다.
'[파이썬]Python > 미세먼지 프로젝트' 카테고리의 다른 글
[Python Project 1.5]미세먼지 예측 프로그램 개발-오류수정 (0) | 2020.07.08 |
---|---|
[Python Project 1.4]미세먼지 예측 프로그램 개발-최솟값3개 찾기 (0) | 2020.07.06 |
[Python Project 1.2]미세먼지 예측 프로그램 개발-평균데이터 구하기 (0) | 2020.07.02 |
[Python Project 1.1]미세먼지 예측 프로그램 개발 (0) | 2020.06.29 |