Этот репозиторий содержит две альтернативные реализации для прогнозирования фотоэлектрического прогнозирования мощности на основе данных о погоде. Он был разработан для моего бакалавриата, который сравнивает эти два подхода. Два источника данных служат данными образца выхода мощности.
Я рекомендую Pipenv для настройки проекта. С установленной Pipenv Run 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 |
Его можно получить с помощью публичного API Pvwatts. Чтобы получить ключ API, вам нужно зарегистрироваться в сети разработчиков NREL. Ключ API затем должен быть помещен в переменную среды PVWATTS_API_KEY . В качестве альтернативы, вы можете вставить его в PVwatts напрямую. Когда это будет сделано, вы можете использовать
from importers import pvwatts
data = pvwatts . load () Это вызывает API и анализирует результат как пандас данных, который можно передать в модули прогнозирования. Вы также можете передать следующие дополнительные параметры для load :
Для получения информации об этих параметрах обратитесь к описанию PVWatts V6 API. Все параметры имеют значения по умолчанию, поэтому вызов метода без параметров также возможно. Данные возврата индексируются с использованием DateTimeIndex. Поскольку PVWatts не указывает даты, но всегда возвращает данные в течение целого года, 2019 год будет установлен для каждого отдела данных, возвращаемого из этого модуля.
Если у вас есть ответ Pvwatts JSON, сохраненный в файле JSON, также можно проанализировать этот файл непосредственно, используя следующий метод удобства:
pvwatts . load_from_json ( 'filepath.json' )Подготовленные данные из Life Live -канала UQ выглядят похожими на это:
| время | Airtemp | влажность | Ветровой скорость | WindDirection | власть |
|---|---|---|---|---|---|
| 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 |
Он может скачать на сайте Live Feed. Выберите PV Site и PV Array с боковой панели справа. Затем нажмите Download Data , а затем Download Daily Logs . Оттуда вы можете указать диапазон дат (я рекомендую год), а затем загрузить файл Power & Energy , а также файл Weather . Убедитесь, что вы загружаете оба с указанными диапазонами дат.
Теперь вы можете использовать
from importers import uq
data = uq . load ( 'power_file.csv' , 'weather_file.csv' ) и заменить оба параметра на пути файла для каждого соответствующего файла. Метод load снова объединяет оба файла в DataFrame Pandas, готовый к передаче в модуль прогнозирования.
Теперь, когда присутствует данные о данных с функциями и данными питания, вы можете сделать прогнозы. Оба импортеры возвращают данные о данных, который имеет разные функции, но оба имеют столбец 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 или 1 июня 2019 года.
Этот алгоритм использует реализацию SVR Scikit-Learn, которая основана на LIBSVM. Чтобы использовать его, доступен следующий класс:
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 Фильтрация столбца power из кадра testing_data не является необходимым, класс SVRModel делает это автоматически. При желании можно пройти filter=['airtemp', 'humidity'] или аналогично fit , чтобы ограничить функции, используемые для прогнозирования. Таким образом, нет необходимости фильтровать данные вручную.
kernel SVR -переменных, C , gamma и epsilon - все это необязательны, все они имеют значения по умолчанию.
Чтобы позволить модели масштабировать данные перед применением регрессии, вы можете установить параметр масштабирования на True (это значение по умолчанию):
model = svr_model ( base_data = data , scaling = True ) Таким образом, вам нужно указать base_data , который может быть набором данных еще на один год. Это не будет использоваться для регрессии, исключительно для подходящего объекта scaler . Для получения дополнительной информации о том, чтобы относиться к реализации Scikit-Learn Scikit-Learn.
Этот алгоритм используется в пакете PMDARIMA (ранее Pyramid-Arima). Его можно использовать путем импорта необходимого класса:
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 Предоставление функций тестирования не требуется, потому что модель была подходящей без экзогенных переменных. В этом случае возвращенный DataFrame будет иметь только столбец 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 будет автоматически удален при предсказании фактического прогноза. Прогнозирование DataFrame теперь будет иметь столбцы testing_data, где столбец power содержит прогнозируемые значения.
Если вы хотите позволить алгоритму автоматически находить соответствующие параметры 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 , чтобы ограничить, какие функции должны быть включены в процесс прогнозирования.