Este repositório contém duas implementações alternativas para prever previsão de energia fotovoltaica com base nos dados climáticos. Foi desenvolvido para minha tese de bacharel que compara essas duas abordagens. Duas fontes de dados servem como dados de amostra de clima e potência.
Eu recomendo Pipenv para configurar o projeto. Com o PIPENV instalado, execute pipenv install na raiz do projeto e instalará todas as dependências necessárias. Em seguida, use pipenv shell para entrar no shell onde todas as dependências estarão disponíveis ou apenas pipenv run <command> para executar um comando específico.
Se você não usar PIPENV, as dependências são especificadas no pipfile e as versões que eu uso podem ser encontradas no pipfile.lock.
Para usar o serviço PVWATTS descrito posteriormente, você precisa obter uma chave da API. Em seguida, você deve defini -lo como variável de ambiente (ou colocá -lo diretamente no código). Se você usar Pipenv, isso pode ser feito em um arquivo .env .
Exemplos sobre como usar o projeto podem ser encontrados nos arquivos de exemplo no diretório raiz. Você pode executar diretamente esses arquivos após concluir as etapas necessárias para obter dados descritos na próxima seção.
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
Para conspirar com Matplotlib, o Pandas emite um aviso futuro, então coloquei a seguinte linha após as importações:
from pandas . plotting import register_matplotlib_converters ; register_matplotlib_converters ()Existem duas fontes de dados para as quais está disponível um importador que analisa os dados no formato certo. É claro que é possível usar outras fontes também. Em primeiro lugar, há um invólucro PVWATTS e, em segundo lugar, para dados obtidos da UQ Solar.
Os dados preparados do PVWATTS parecem semelhantes a este:
| tempo | Tamb | wspd | poder |
|---|---|---|---|
| 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 |
Pode ser obtido através da API pública de PVWATTS. Para obter uma chave de API, você precisa se inscrever na NREL Developer Network. A chave da API precisa ser colocada na variável de ambiente PVWATTS_API_KEY . Como alternativa, você pode inseri -lo em PvWatts diretamente. Quando isso é feito, você pode usar
from importers import pvwatts
data = pvwatts . load () Isso chama a API e analisa o resultado como um quadro de dados de pandas que pode ser passado para os módulos de previsão. Você também pode passar os seguintes parâmetros opcionais para load :
Para obter informações sobre esses parâmetros, consulte a descrição da API PVWATTS V6. Todos os parâmetros possuem valores padrão, portanto é possível chamar o método sem parâmetros. Os dados de retorno são indexados usando um DateTimeIndex. Como o PVWATTS não especifica datas, mas sempre retorna dados por um ano inteiro, o ano de 2019 será definido para cada data de dados retornado deste módulo.
Se você tiver uma resposta Pvwatts JSON salva em um arquivo JSON, também é possível analisar esse arquivo diretamente usando o seguinte método de conveniência:
pvwatts . load_from_json ( 'filepath.json' )Os dados preparados do feed ao vivo do UQ Solar se parecem com isso:
| tempo | Airtemp | umidade | velocidade do vento | Enciriro de vento | poder |
|---|---|---|---|---|---|
| 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 |
Ele pode baixar no site do Live Feed. Escolha um PV Site e uma PV Array na barra lateral à direita. Em seguida, clique em Download Data e Download Daily Logs . A partir daí, você pode especificar um intervalo de data (eu recomendo um ano) e, em seguida, faça o download de um arquivo de Power & Energy e um arquivo Weather . Certifique -se de baixar os dois com os mesmos intervalos especificados.
Agora você pode usar
from importers import uq
data = uq . load ( 'power_file.csv' , 'weather_file.csv' ) e substitua os dois parâmetros pelos caminhos do arquivo para cada arquivo respectivo. O método load combina os dois arquivos novamente em um quadro de dados de pandas, pronto para serem transmitidos para um módulo de previsão.
Agora que um DataFrame com recursos e dados de energia está presente, você pode fazer previsões. Ambos os importadores retornam um quadro de dados que possui recursos diferentes, mas ambos possuem uma coluna power que representa a potência.
Como os dados de ambos os importadores possuem um DateTimeIndex, ele pode ser dividido em dados de treinamento e teste como este:
training_data = data [ '20190601' : '20190607' ] # first week of june 2019
testing_data = data [ '20190608' : '20190614' ] # second week of june 2019 Aqui as datas são convertidas de cordas implicitamente. Por exemplo, '20190601' descreve 2019/06/06 ou 01 de junho de 2019.
Este algoritmo usa a implementação do SCIKIT-LEARN do SVR, que é baseada no LIBSVM. Para usá -lo, a aula a seguir está disponível:
from predictors . svr_model import SVRModelFazendo uma previsão sem escalar os dados:
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 Filtrando a coluna power do quadro testing_data não é necessário, a classe SVRModel faz isso automaticamente. Opcionalmente, é possível passar filter=['airtemp', 'humidity'] ou semelhante ao fit para restringir os recursos usados para previsão. Não é necessário filtrar os dados manualmente dessa maneira.
As variáveis SVR kernel , C , gamma e epsilon são todas opcionais, todas elas têm valores padrão.
Para deixar o modelo escalar os dados antes de aplicar a regressão, você pode definir o parâmetro de escala como True (este é o valor padrão):
model = svr_model ( base_data = data , scaling = True ) Dessa forma, você precisa especificar base_data , que pode ser um conjunto de dados por mais um ano. Isso não será usado para regressão, apenas para ajustar um objeto scaler viável. Para obter mais informações, refere-se à implementação StandartScaler do Scikit-Learn.
Esse algoritmo faz uso no pacote PMDARIMA (anteriormente pirâmide-arima). Pode ser usado pela importação da classe necessária:
from predictors . arima_model import ARIMAModelAgora, para fazer uma previsão sem usar variáveis exógenas, faça o seguinte:
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 O fornecimento de recursos de teste não é necessário porque o modelo estava em forma sem variáveis exógenas. Nesse caso, o DataFrame retornado terá apenas uma coluna power . O order especifica os parâmetros (p,d,q) do modelo. O seasonal_order especifica os parâmetros (P,D,Q,s) . O parâmetro de escala pode ser definido ao criar o modelo, por padrão, ele está definido como True , mas pode ser desligado com:
model = ARIMAModel ( scaling = false )Se você deseja adicionar variáveis exógenas, defina este parâmetro:
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 ) Dessa forma, você deve especificar testing_data ao prever. A coluna power será removida automaticamente ao fazer a previsão real. A previsão DataFrame agora terá as colunas testing_data, onde a coluna power contém os valores previstos.
Se você deseja deixar o algoritmo encontrar automaticamente os parâmetros apropriados p, q, P and Q use a seguinte chamada:
model . fit_auto ( training_data , p = ( 0 , 5 ), q = ( 0 , 5 ), P = ( 0 , 5 ), Q = ( 0 , 5 ), d = 1 , D = 1 ) As tuplas definem intervalos nos quais o algoritmo procurará parâmetros ideais. O d e D pode ser deixado de fora para determinar automaticamente esses parâmetros também. Como no método fit , use_exogenous será definido como True por padrão, mas também pode ser especificado como False .
Como é possível com o SVRModel , você também pode passar uma matriz de filtro para fit e fit_auto para restringir quais recursos devem ser incluídos no processo de previsão.