오늘은 어제에 이어 데이터 전처리를 조금 진행하다가 아두이노 릴레이 모듈에 대해서 공부하고 테스트를 해보았다.
# 발전량 데이터 불러오기
PATH = "data/2022/2022_01.csv"
df = pd.read_csv(PATH)
# 데이터 확인
# df.describe()
# df.info()
# 전처리 이전 데이터 컬럼 정보
"""
tradeNo : 시간
tradeYmd : YYYYMMDD
regionNm : 지역 이름
amgo : 발전량(MWh)
"""
# 서울시 데이터만 가져오기
df = df[df["regionNm"] == "서울시"].reset_index(drop=True)
# 날짜 -> 시간순으로 정렬
df = df.sort_values(["tradeYmd", "tradeNo"], ascending=[True, True]).reset_index(drop=True)
# 지역 컬럼 제거
df = df.drop(columns=["regionNm"])
# 컬럼명 변경
df.columns = ["time", "date", "generation"]
# 컬럼 순서 변경(날짜->시간->발전량)
df = df.iloc[:, [1,0,2]]
# 한시간 전 발전량 컬럼 추가(없으면 NaN)
df["prev_generation"] = df["generation"].shift(1)
# 어제 같은시간 발전량 컬럼 추가(없으면 NaN)
df["prev_date"] = (pd.to_datetime(df["date"].astype(str), format=("%Y%m%d")) - pd.Timedelta(days=1)).dt.strftime("%Y%m%d")
# prev_date 데이터 타입 date와 통일
df["prev_date"] = df["prev_date"].astype("int64")
# date와 prev_date를 비교해서 어제 발전량 저장
df = df.merge(df[["date", "time", "generation"]], left_on=["prev_date", "time"], right_on=["date", "time"], how="left", suffixes=("", "_yesterday"))
# 불필요한 컬럼 제거
df = df.drop(columns=["prev_date", "date_yesterday"])
# 컬럼명 변경
df = df.rename(columns={"generation_yesterday": "yesterday_generation"})
df.head(10)
어제에 이어서 한 시간 전 발전량과 어제 같은 시간의 발전량 컬럼을 추가하였다. 어떻게 처리를 할지 찾아보면서 공부하니까 shift() , pd.to_datetime() , pd.Timedelta() , dt.strftime() , df.merge() 와 같은 새로운 기능들을 배울 수 있었다.
아두이노 릴레이 모듈에 대해서 정확하게 모르던 상태에서는 회로 구성이 상당히 어려웠는데, 공부를 해보니까 이제 감을 잡은 것 같다. 그리고 I2C 방식은 메인 우노를 통해서 서브 우노의 세밀한 값 조절이나 웹에서의 서브 우노 제어 등의 기능이 필요한 것 아니면, I2C 방식이 아닌 일반적인 연결로도 구동이 가능하다는 것 또한 알게 되었다.
내일은 전처리한 데이터를 학습하기 편하게 하나의 파일로 합친 뒤, 발전량 데이터와 일사량 데이터를 합치는 작업을 진행할 것 같다.