이 저장소에는 날씨 데이터를 기반으로 태양 광 전력 예측을 예측하기위한 두 가지 대안 구현이 포함되어 있습니다. 이 두 가지 접근법을 비교하는 내 학사 논문을 위해 개발되었습니다. 두 개의 데이터 소스는 날씨 및 전력 출력 샘플 데이터 역할을합니다.
프로젝트를 설정하려면 PIPENV를 권장합니다. PIPENV가 설치된 경우 프로젝트 루트에서 pipenv install 사용하면 필요한 모든 종속성을 설치합니다. 그런 다음 pipenv shell 사용하여 모든 종속성을 사용할 수있는 쉘에 들어가거나 특정 명령을 실행하기 위해 pipenv run <command> 만 입력하십시오.
PIPENV를 사용하지 않으면 PipFile에 종속성이 지정되며 사용하는 버전은 Pipfile.Lock에서 찾을 수 있습니다.
나중에 설명한 PVWATTS 서비스를 사용하려면 API 키를 얻어야합니다. 그런 다음 환경 변수로 설정하거나 코드에 직접 넣어야합니다. pipenv를 사용하는 경우 .env 파일로 수행 할 수 있습니다.
프로젝트 사용 방법에 대한 예는 루트 디렉토리의 예제 파일에서 찾을 수 있습니다. 다음 섹션에 설명 된 데이터를 얻기 위해 필요한 단계를 완료 한 후 해당 파일을 직접 실행할 수 있습니다.
pipenv run python example_arima_pvwatts.py
pipenv run python example_arima_uq.py
pipenv run python example_svr_pvwatts.py
pipenv run python example_svr_uq.py
Matplotlib로 플로팅하기 위해 Pandas는 향후 경고를 발행하므로 수입 후 다음 줄을 넣습니다.
from pandas . plotting import register_matplotlib_converters ; register_matplotlib_converters ()데이터를 올바른 형식으로 구문 분석 할 수있는 수입업자를 사용할 수있는 두 개의 데이터 소스가 있습니다. 물론 다른 소스도 사용할 수 있습니다. 첫째, PVWATTS 래퍼가 있고 두 번째로 UQ Solar에서 얻은 데이터 용으로 하나가 있습니다.
pvwatts의 준비된 데이터는 이것과 유사하게 보입니다.
| 시간 | 젖은 | WSPD | 힘 |
|---|---|---|---|
| 2019-06-20 06:00:00 | 16.0 | 0.0 | 957.201 |
| 2019-06-20 07:00:00 | 18.0 | 1.5 | 1648.060 |
| 2019-06-20 08:00:00 | 21.0 | 3.1 | 2260.658 |
| 2019-06-20 09:00:00 | 23.0 | 4.1 | 2647.271 |
| 2019-06-20 10:00:00 | 24.0 | 2.6 | 2838.976 |
공개 PVWATTS API를 통해 얻을 수 있습니다. API 키를 얻으려면 NREL Developer Network에 가입해야합니다. 그런 다음 API 키는 환경 변수 PVWATTS_API_KEY 에 넣어야합니다. 또는 PVWATTS에 직접 삽입 할 수 있습니다. 그 일이 완료되면 사용할 수 있습니다
from importers import pvwatts
data = pvwatts . load () 이를 통해 API를 호출하고 결과를 예측 모듈로 전달할 수있는 Pandas 데이터 프레임으로 결과를 구문 분석합니다. 다음 옵션 매개 변수를 전달하여 load 수도 있습니다.
이 매개 변수에 대한 자세한 내용은 PVWATTS V6 API 설명을 참조하십시오. 모든 매개 변수에는 기본값이 있으므로 매개 변수가없는 메소드를 호출 할 수 있습니다. 반환 데이터는 DateTimeIndex를 사용하여 인덱싱됩니다. PVWATTS는 날짜를 지정하지 않고 항상 1 년 동안 데이터를 반환하기 때문에 2019 년은이 모듈에서 반환 된 각 데이터 프레임에 대해 고정되어 있습니다.
JSON 파일에 PVWATTS JSON 응답이 저장된 경우 다음 편의 방법을 사용하여 해당 파일을 직접 구문 분석 할 수도 있습니다.
pvwatts . load_from_json ( 'filepath.json' )UQ Solar Live Feed의 준비된 데이터는 다음과 비슷해 보입니다.
| 시간 | Airtemp | 습기 | 풍속 | 바람 방향 | 힘 |
|---|---|---|---|---|---|
| 2015-06-20 07:00:00 | 9.27 | 75.24 | 1.72 | 191.47 | 25302.00 |
| 2015-06-20 08:00:00 | 11.28 | 68.72 | 2.14 | 201.45 | 78240.83 |
| 2015-06-20 09:00:00 | 13.38 | 59.02 | 2.59 | 214.77 | 128523.08 |
| 2015-06-20 10:00:00 | 14.49 | 54.19 | 2.92 | 201.67 | 162968.83 |
| 2015-06-20 11:00:00 | 15.65 | 51.89 | 2.34 | 203.23 | 172535.83 |
라이브 피드 웹 사이트에서 다운로드 할 수 있습니다. 오른쪽의 사이드 바에서 PV Site 와 PV Array 선택하십시오. 그런 다음 Download Data 클릭 한 다음 Download Daily Logs . 거기에서 날짜 범위 (1 년 권장)를 지정한 다음 Weather 파일뿐만 아니라 Power & Energy 파일을 다운로드 할 수 있습니다. 지정된 동일한 날짜 범위로 둘 다 다운로드해야합니다.
이제 사용할 수 있습니다
from importers import uq
data = uq . load ( 'power_file.csv' , 'weather_file.csv' ) 각각의 각 파일에 대한 파일 경로로 두 매개 변수를 대체합니다. load 방법은 두 파일을 다시 Pandas Dataframe으로 결합하여 예측 모듈로 전달할 수 있습니다.
기능 및 전원 데이터가있는 데이터 프레임이 존재하므로 예측을 할 수 있습니다. 두 수입업자는 다른 기능을 갖는 데이터 프레임을 반환하지만 전원 출력을 나타내는 power 열이 있습니다.
두 수입업자의 데이터에는 dateTimeIndex가 있으므로 다음과 같은 교육 및 테스트 데이터로 분할 될 수 있습니다.
training_data = data [ '20190601' : '20190607' ] # first week of june 2019
testing_data = data [ '20190608' : '20190614' ] # second week of june 2019 여기서 날짜는 내재적으로 문자열에서 변환됩니다. 예를 들어 '20190601' 2019/06/01 또는 2019 년 6 월 1 일을 나타냅니다.
이 알고리즘은 LIBSVM을 기반으로하는 SVR의 Scikit-Learn 구현을 사용합니다. 이를 사용하려면 다음 수업을 사용할 수 있습니다.
from predictors . svr_model import SVRModel데이터를 확장하지 않고 예측 :
model = SVRModel ( scaling = False )
model . fit ( training_data , kernel = 'rbf' , C = 1e3 , gamma = 0.1 , epsilon = 0.1 )
model . predict ( testing_data ) # returns the prediction data frame containing the testing features and the power prediction
model . prediction . power # use this to access the power prediction testing_data 프레임에서 power 열을 필터링 할 필요는 없으며 SVRModel 클래스는 자동으로 수행됩니다. 선택적으로 filter=['airtemp', 'humidity'] 전달하거나 예측에 사용되는 기능을 제한하기 위해 유사 fit 전달할 수 있습니다. 이러한 방식으로 데이터를 수동으로 필터링 할 필요는 없습니다.
SVR 변수 kernel , C , gamma 및 epsilon 모두 선택 사항이며 모두 기본값이 있습니다.
회귀를 적용하기 전에 모델이 데이터를 스케일로 만들기 위해 스케일링 매개 변수를 True 로 설정할 수 있습니다 (이것은 기본값입니다).
model = svr_model ( base_data = data , scaling = True ) 이렇게하면 1 년 동안 데이터 세트가 될 수있는 base_data 지정해야합니다. 이것은 회귀에 사용되지 않으며 실행 가능한 scaler 객체를 장착하는 데만 사용됩니다. 이에 대한 자세한 내용은 Scikit-Learn의 StandartScaler 구현을 참조하십시오.
이 알고리즘은 PMDarima 패키지 (이전의 피라미드-아리마)에서 사용합니다. 필요한 클래스를 가져 오면 사용할 수 있습니다.
from predictors . arima_model import ARIMAModel이제 외인성 변수를 사용하지 않고 예측을하려면 다음을 수행합니다.
model = ARIMAModel () # scaling is set to true automatically
model . fit ( training_data , order = ( 2 , 1 , 4 ), seasonal_order ( 3 , 1 , 2 , 24 ), use_exogenous = False )
model . predict ( hours = 48 ) # returns the prediction
model . prediction . power # use this to access the power predictionn 모델이 외인성 변수없이 적합했기 때문에 테스트 기능을 제공하는 것이 필요하지 않습니다. 이 경우 반환 된 데이터 프레임에는 power 열만 있습니다. order 모델의 (p,d,q) 매개 변수를 지정합니다. seasonal_order 는 (P,D,Q,s) 매개 변수를 지정합니다. 스케일링 매개 변수는 모델을 만들 때 설정할 수 있습니다. 기본적으로 기본적으로 True 로 설정되지만 다음과 같이 설정할 수 있습니다.
model = ARIMAModel ( scaling = false )외인성 변수를 추가하려면이 매개 변수를 설정하십시오.
model . fit ( training_data , order = ( 2 , 1 , 4 ), seasonal_order ( 3 , 1 , 2 , 24 ), use_exogenous = True ) # use_exogenous is True by default
model . predict ( testing_data = testing_data ) 이렇게하면 예측할 때 testing_data 지정해야합니다. 실제 예측을 할 때는 power 열이 자동으로 제거됩니다. 예측 데이터 프레임에는 이제 power 열에 예측 된 값이 포함 된 Testing_Data 열이 있습니다.
알고리즘에 적절한 p, q, P and Q 매개 변수를 자동으로 찾으려면 다음 호출을 사용하십시오.
model . fit_auto ( training_data , p = ( 0 , 5 ), q = ( 0 , 5 ), P = ( 0 , 5 ), Q = ( 0 , 5 ), d = 1 , D = 1 ) 튜플은 알고리즘이 최적의 매개 변수를 검색 할 범위를 정의합니다. d 와 D 해당 매개 변수를 자동으로 결정하기 위해 제외 될 수 있습니다. fit 방법과 마찬가지로 use_exogenous 기본적으로 True 로 설정되지만 False 라고도 지정할 수도 있습니다.
SVRModel 에서 가능하기 때문에 fit 및 fit_auto 에 필터 배열을 전달하여 예측 프로세스에 포함되어야하는 기능을 제한 할 수도 있습니다.