-
Notifications
You must be signed in to change notification settings - Fork 1
/
aflu_h.jl
84 lines (69 loc) · 3.24 KB
/
aflu_h.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#aflu_h.jl lê o arquivo Dados/Dados_hidro_ONS.csv, retirado do site da ONS com os dados de afluência
#a discretização dessa vazão é diária para os últimos 5 anos, vou utilizar esse arquivo para obter algumas funções de vazão afluênte
#a princípio penso em utilizar um modelo de média móvel
#outra função seria pegando o max, min e média desses dados e construindo uma função
#com o mesmo shape da demanda mas com esse min,max e média das vazões históricas
#outra seria pegando o min, max e média e criando uma função randomica mas respeitando esses limites
using Dates, XLSX, Plots, DataFrames
using CSV
using Base.Sort
function n_menores(a, n, unico = 0) #pega os n menores valores do vetor a
if unico == 0
return sort(a; alg=Sort.PartialQuickSort(n))[1:n]
end
return sort(unique(a); alg=Sort.PartialQuickSort(n))[1:n]
end
function min_max(vec, min, max, matr = 1)
v_min = minimum(vec, dims = 2)
v_max = maximum(vec, dims = 2)
if matr == 1
return min .+ (max .- min).*(vec .- v_min)./(v_max .- v_min)
end
return min .+ (max - min)*(vec .- v_min)/(v_max - v_min)
end
#pasta_principal = "Dropbox/LAC/Alocação de unidades/Curtissimo Cascata Finardi"
if ~occursin("Finardi", pwd())
try
cd("Dropbox/LAC/Alocação de unidades/Curtissimo Cascata Finardi")
catch
nothing
end
end
if ~isfile("Dados/ONS/Tratado_Afluencia.csv")
error("Arquivo \"Tratado_Afluência.csv\" não encontrado")
end
#ma(vs,n) = [sum(@view vs[i:(i+n-1)])/n for i in 1:(length(vs)-(n-1))] #média móvel padrão
ma_alterada(vs;n = 48) = [sum(@view vs[i:(i+(length(vs) - n))])/(length(vs) - n + 1) for i in 1:(length(vs)-(length(vs) - n))] #média móvel que acha a janela de dados que serão utilizados nas contas para retornar um vetor com N entradas
Vaz_aflu = CSV.File(string("Dados/ONS/Tratado_Afluencia.csv"), normalizenames=true) |> DataFrame!
quant_usinas = size(Vaz_aflu)[1]
array_vaz_aflu = Array(Vaz_aflu[!,3:end])
codigo_usinas = Vaz_aflu[!,2]
#2204 é o valor utilizado na média móvel como janela de dados utilizados para obter um vetor com 48 entradas no final
#Esse valor pode precisar de alterações dependendo do valor de entrada
all_vaz = ones(quant_usinas,48)
for usina = 1:quant_usinas
all_vaz[usina,:] = ma_alterada(array_vaz_aflu[usina,1:end])#ma(Array(Vaz_aflu[usina,3:end]), 2204)
end
n = 5
menores = ones(quant_usinas)
maiores = ones(quant_usinas)
for k = 1:quant_usinas
menores[k] = sum(n_menores(array_vaz_aflu[k,1:end],n,1))/n
maiores[k] = sum(-n_menores(-array_vaz_aflu[k,1:end],n,1))/n
end
scaled_aflu = ones(size(all_vaz))
scaled_aflu = min_max(all_vaz, menores, maiores)
#aux = min_max.(array_vaz_aflu, menores, maiores)
nomes = []
reservatorio = []
for k = 1:2*quant_usinas
if k <= quant_usinas
push!(nomes, "Media Movel")
push!(reservatorio, Vaz_aflu[k,:Reservatório])
else
push!(nomes, "Media Movel Scaled")
push!(reservatorio, Vaz_aflu[k - quant_usinas,:Reservatório])
end
end
df_vaz = DataFrame([reservatorio [codigo_usinas; codigo_usinas] nomes [all_vaz; scaled_aflu]])
CSV.write("Dados/aflu_h.csv", df_vaz)