더보기에는 지난 시간 사용한 코드들을 한데 모은 것이다.
지난 글을 확인하지 못했다면 확인하는 것이 이해하는데 좋을 것이다.
2020/06/29 - [파이썬[Python]/프로젝트[Project]] - [Python Project 1.1]미세먼지 예측 프로그램 개발
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])
오늘은 지난 포스팅에 이어서 3개년 데이터들의 평균값을 구하고자 한다.
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)
xlsx파일을 보면 빈칸들이 있는 경우가 있다. 측정이 안된 이유야 모르겠지만 데이터를 가공하려는 입장에서 그러한 데이터는 리스트에 None으로 취급된다.
for문이 총 두개인데 둘 다 같은 매커니즘으로 진행되는 것이니 한 개에 대해서만 설명하겠다.
None인 데이터는 정수 int가 아니므로 수학계산(평균을 구하기 위한 더하기 혹은 나누기)가 되지 않는다. 따라서 None인지 아닌지 여부를 판별하는 for문을 짰다. 한줄씩 따라가보면 이해가 될 것이라 생각한다.
실행을 한 결과 문제가 발생했다.
리스트범위를 벗어났다는 오류..
급히selct16,17,18의 길이를 확인했다. (len()을 사용했다.)
각각의 길이가 달랐다. 데이터의 누락이 있었던 듯 하다. 또한 2월29일의 경우 없을 수 밖에 없었다.
달리 방법이 없어 직접 추가하게 되었다..
데이터가 없는데 어떻게 추가하는지 걱정이라면 안해도 된다. 그저 날짜와 측정소명만 넣어주면 된다. 그렇게 되면 데이터는 자동으로 None값이 될테고 for문에 의해 처리된다. 넣어주는 이유는 개수가 맞아야 날짜가 일치하기 때문이다.
2월29일을 고려해 1년 366일이 나와야 하는데,
만약 날짜가 여러개 누락이 되어 a에 350개의 데이터, b에 365개의 데이터만 있었다면
a의 130번째 데이터가 4월3일 때, b의 130번째 데이터는 5월1일이 나오는 등의 오류가 생길 수 있다는 말이다.
우리의 목표는 개수를 같게하여 1번째는 1월1일 2번째는 1월2일 과같이 일정하게 나오도록 하는 것이다.
xlsx파일을 직접 수정후 길이와 average10리스트를 출력하도록 잠시 print코드를 넣어 실행했다.
리스트 내용이 다소 복잡해보이긴 하지만 길이가 366개인걸 보면 잘 된다는 것을 알 수 있다.
참고로 '데이터를 읽고 있습니다. ' 와 '잠시만 기다려주세요.' 는 파일을 읽었는지를 확인하기 위한 것이기도 하고 나중에 프로그램으로 만들었을 때 사용자에게 알리기 위한 것이므로 나중에 추가하도록 하겠다.
이렇게 미세먼지와 초미세먼지에 대한 3개년의 미세먼지 농도 평균값 리스트를 만들었다.
이제 미세먼지가 적은 날을 출력해주면 되는데, 굳이 적은 날들을 모두 출력해줄 필요는 없을 것 같다.
사용자가 지정한 달, 예를들면 4월에는 4월 xx일 과 같이 출력되면 좋을 것 같다. 추가로 하루만 출력되면 너무 적은 날일 것 같아 3일정도 (4월xx일, 4월tt일, 4월zz일)출력되도록 만들어볼 생각이다.
'[파이썬]Python > 미세먼지 프로젝트' 카테고리의 다른 글
[Python Project 1.5]미세먼지 예측 프로그램 개발-오류수정 (0) | 2020.07.08 |
---|---|
[Python Project 1.4]미세먼지 예측 프로그램 개발-최솟값3개 찾기 (0) | 2020.07.06 |
[Python Project 1.3]미세먼지 예측 프로그램 개발-리스트슬라이싱,날짜계산 (0) | 2020.07.04 |
[Python Project 1.1]미세먼지 예측 프로그램 개발 (0) | 2020.06.29 |