본문 바로가기
IT - 코딩

AI spark 미세먼지 농도 예측

by 조기정 2023. 4. 30.
import pandas as pd

import os

os.getcwd()
path = os.getcwd()  # 주피터 노트북 파일 경로
os_file_list = os.listdir(path)  # 내 경로 읽어서 파일 리스트 읽음
# print(os_file_list)  # 경로에 있는 파일 리스트
os_file_list = ['META', 'TEST_AWS', 'TEST_INPUT','TRAIN','TRAIN_AWS']
All_data = {}
# 모든 csv 파일 한번에 불러옴
for i in range(len(os_file_list)):
    print(os_file_list[i])
    os_file_list_1 = os.listdir(path+"\\"+os_file_list[i])
    import pandas as pd

    for j in range(len(os_file_list_1)):
        All_data[os_file_list_1[j][:-4]] = pd.read_csv(path+"\\"+os_file_list[i]+"\\"+os_file_list_1[j])

 

 

내가 주로 짜는 전처리 방식이다. 경로를 읽어서 파일명이 들어가 있으면 해당 파일명대로 가져와서

딕셔너리 안에  데이터 프레임을 넣어 데이터를 읽는다.

 

그리고 모든 파일을 한ㅂ너에 읽는데 보니까 각각 다른 파일 안에 같은이름의 파일이 있어 이렇게 있으면 파일들이 어떻게 보이는지 알기 쉽게 만들 수 있다.

 

train_file_list = ['TRAIN']
TRAIN = {}

# 모든 csv 파일 한번에 불러옴
for i in range(len(train_file_list)):
    print(train_file_list[i])
    os_file_list_1 = os.listdir(path+"\\"+train_file_list[i])
    import pandas as pd

    for j in range(len(os_file_list_1)):
        TRAIN[os_file_list_1[j][:-4]] = pd.read_csv(path+"\\"+train_file_list[i]+"\\"+os_file_list_1[j])

 

 

 

train_file_list = ['TRAIN_AWS']
TRAIN_AWS = {}

# 모든 csv 파일 한번에 불러옴
for i in range(len(train_file_list)):
    print(train_file_list[i])
    os_file_list_1 = os.listdir(path+"\\"+train_file_list[i])
    import pandas as pd

    for j in range(len(os_file_list_1)):
        TRAIN_AWS[os_file_list_1[j][:-4]] = pd.read_csv(path+"\\"+train_file_list[i]+"\\"+os_file_list_1[j])

 

 

test_file_list = ['TEST_INPUT']
TEST_INPUT = {}

# 모든 csv 파일 한번에 불러옴
for i in range(len(test_file_list)):
    print(test_file_list[i])
    os_file_list_1 = os.listdir(path+"\\"+test_file_list[i])
    import pandas as pd

    for j in range(len(os_file_list_1)):
        TEST_INPUT[os_file_list_1[j][:-4]] = pd.read_csv(path+"\\"+test_file_list[i]+"\\"+os_file_list_1[j])
test_file_list = ['TEST_AWS']
TEST_AWS = {}

# 모든 csv 파일 한번에 불러옴
for i in range(len(test_file_list)):
    print(test_file_list[i])
    os_file_list_1 = os.listdir(path+"\\"+test_file_list[i])
    import pandas as pd

    for j in range(len(os_file_list_1)):
        TEST_AWS[os_file_list_1[j][:-4]] = pd.read_csv(path+"\\"+test_file_list[i]+"\\"+os_file_list_1[j])

이렇게 4가지 파일을 전부 불러오고. 

여기서 전처리 방식이 문제이다. 시계열 데이터인데 데이터가 2~3일씩 빈 데이터들이 많다..

이렇게 되면 기계학습의 아웃풋이 좋을것이라고 기대하기가 조금 힘들어 진다. 중간에 한개씩 빈것이면 아래와 같이 선형 보간법을 이용하려고 했다.

#결측치 우선 선형 보간함. 다른 방법 있으면 그렇게 ㄱㄱ
def fill_Na(df):
    df_key = list(df.keys())
    for i in range(len(df_key)):
        df[df_key[i]] = df[df_key[i]].interpolate()
    return df

TRAIN_AWS = fill_Na(TRAIN_AWS)
TRAIN = fill_Na(TRAIN)
TEST_INPUT = fill_Na(TEST_INPUT)
TEST_AWS = fill_Na(TEST_AWS)

하지만 그렇지 못했고 나는 나중에 이부분을 있는데이터끼리 시계열 분해를 해서 빈 부분을 예측해서 채워넣는다던지의 방식을 수행할 계획이다.

 

# a = "pmmap"
def location(df, All_data,a = "awsmap" ): # pmmap
    
    TRAIN_AWS_key = list(df.keys())
     
    for i in range(len(TRAIN_AWS_key)):

        Latitude = All_data[a].loc[All_data[a]["Location"]== TRAIN_AWS_key[i]].Latitude.iloc[0]
        Longitude = All_data[a].loc[All_data[a]["Location"]== TRAIN_AWS_key[i]].Longitude.iloc[0]

        df[TRAIN_AWS_key[i]]["Latitude"] = Latitude
        df[TRAIN_AWS_key[i]]["Longitude"] = Longitude

    return df

TRAIN_AWS = location(TRAIN_AWS, All_data,a = "awsmap" )
TRAIN = location(TRAIN, All_data,a = "pmmap" )
TEST_AWS = location(TEST_AWS, All_data,a = "awsmap" )
TEST_INPUT = location(TEST_INPUT, All_data,a = "pmmap" )

해당 부분은 위도와 경도 부분의 데이터를 한 데이터 프레임 안에 넣는 코드이다. 정보를 다른 csv파일에 저장되어 있어서 모든 정보를 하나의 데이터 프레임에 넣는 과정이다. 

 

df = TRAIN_AWS
def concat_all(df): # 모든 데이터 프레임 하나로.
    try:
        qweqwr = df["신방동"] # 걍 있으면
        df_key = ["공주","신방동","정림동","이원면","읍내동","예산군","아름동","신흥동","성성동","노은동","문창동","모종동","동문동","독곶리","대천2","논산","홍성읍"]
    except: 
        pass
    df_key = list(df.keys())

    for i in range(len(df_key)):
        df_1 = df[df_key[i]]
        ## 이름식별 코드##
        col_list = list(df_1.columns)
        for k in range(len(col_list)):
            df_1 = df_1.rename(columns={col_list[k]:df_key[i]+col_list[k]})
        ##          ##
        if i == 0:
            df_all = df_1
            continue
        df_all = pd.concat([df_all,df_1],axis = 1,ignore_index=False)
    return df_all
ALL_TRAIN_AWS = concat_all(TRAIN_AWS)
# del TRAIN_AWS
ALL_TRAIN = concat_all(TRAIN)
# del TRAIN
ALL_TEST_INPUT = concat_all(TEST_INPUT)
# del TEST_INPUT
ALL_TEST_AWS = concat_all(TEST_AWS)
# del TEST_AWS

여기에서는 딕셔너리 자료형을 하나의 데이터 프레임에 넣기 위해 딕셔너리 안의 키값들을 가져와서 데이터 프레임 변수명이 유니크 하기 위해 해준 부분이다.

 

def use_col_(ALL_TRAIN,str_): # 컬럼명에 어떠한 단어가 포함되는 값 빼어내줌
    ALL_TRAIN_col_list = list(ALL_TRAIN.columns)

    pre_list = [] # 예측할 컬럼들.
    for i,v in enumerate(ALL_TRAIN_col_list):
        if str_ in v :
            pre_list.append(v)
    return pre_list
target = use_col_(ALL_TRAIN,"PM")

해당 부분은 y값에 쓸 데이터 프레임 명만 뺴내기 위해서 만들었다.

def trian_use_column(ALL_TRAIN): # 컬럼명에 어떠한 단어가 포함되는 값 빼어내줌
    ALL_TRAIN_col_list = list(ALL_TRAIN.columns)

    pre_list = [] # 예측할 컬럼들.
    
    for i,v in enumerate(ALL_TRAIN_col_list):
        if "기온"in v or "풍향" in v or "풍속"  in v or "강수량" in v  or "습도"  in v or "Latitude" in v  or "Longitude" in v  :
            pre_list.append(v)
    return pre_list
trian_use_columns = trian_use_column(ALL_TRAIN_AWS)

해당 부분은 x값에 쓸 데이터 프레임 명만 빼내기 위해서 만들었다. 필요해보이는 변수명들을 적용한것이다. 그러면 학습데이터 셋은

 

이런식으로 보인다.

 

 

'IT - 코딩' 카테고리의 다른 글

경제영어뉴스_자동요약(수정 중)  (0) 2023.07.23
chat GPT4 API 사용 오류  (2) 2023.04.14