import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
"In Norway, average household electricity consumption is 16 000 kWh per year, and the average price was NOK 1.1 per kWh in 2013."
Source: energifaktanorge.no
The average household electricity consumption in Northern Norway was 19719 in 2012 (last data available).
Source: ssb.no
cons = pd.read_csv("energy_consumption_region.csv", delimiter= ';')
cons.tail()
https://www.enova.no/privat/alle-energitiltak/solenergi/el-produksjon-/
From 1 July 2020, the fixed subsidy rate for electricity generation will change from NOK 10,000 to NOK 7,500. The rate of NOK 1,250 per installed power up to 15 kW is maintained.
To receive the current support rate, the measure must be completed and registered with an invoice in Enova's application portal by 30 June 2020.
Due to the corona situation, Enova has chosen to postpone these changes from April 1 to July 1.
Norway's subsidies at 1000€ + 125€/kW (usually amount to +/- 15% of system cost) Source: https://www.otovo.no/blog/2019/02/21/the-otovo-solar-insight-solar-payback-trends-2019/
Eligibility: <100kW capacity Other information: NOK 15 000 registration fee for prosumers (<100 kW). These schemes differ depending on the energy provider
Type of scheme: Subsidy (Enova)
#Solar panels
category = ['Entry', 'Entry', 'Entry', 'Entry', 'Entry', 'Max_Power', 'Max_Power',
'Max_Power', 'Max_Power', 'Grid', 'Grid']
item = ['1', '2', '3', '4', '5','1', '2', '3', '4', '1', '2']
hier_index = list(zip(category, item))
hier_index = pd.MultiIndex.from_tuples(hier_index, names=['cat', 'item'])
data = np.array([[80, 4.6, 105.5, 54.5, 3.5, 1290],
[90, 5.4, 100.5, 52, 3.5, 1290],
[140, 8.88, 147, 66, 5, 2290],
[160, 9.6, 130.6, 66.6, 3.5, 2290],
[200, 11.3, 158, 80.8, 3.5, 3499],
[50, 3, 63, 54, 3.5, 1090],
[75, 4.17, 110.8, 50.2, 3.5, 2790],
[100, 6, 119.5, 54, 4, 1999],
[185, 11.1, 148.2, 66.6, 4, 2999],
[300, 10.8, 165, 99.2, 3.5, 2999],
[315, 9.31, 165, 99.2, 3, 3290]])
df_panel = pd.DataFrame(data, index=hier_index, columns= ['watts','A', 'X', 'Y', 'Z', 'Price'])
#Panels structure
category = ['Bracket', 'Bracket', 'Bracket', 'Bracket', 'Tray rack', 'Tray rack', 'Tray rack']
item = ['1','2','3','4','1','2','3']
hier_index = list(zip(category, item))
hier_index = pd.MultiIndex.from_tuples(hier_index, names=['cat', 'item'])
data = np.array([['50/75/80/90/100', 1, 'adjus', 775],
['140/160/185', 1, 'adjus', 775],
['270/280/300', 1, 'adjus', 1049],
['185', 4, 'not-adjus', 12900],
['300', 4, 'adjus', 15990],
['300', 6, 'adjus', 18490],
['90/160/200/50/75/100/185', 1, 'adjus',1195]])
df_struc = pd.DataFrame(data, index=hier_index, columns= ['panels','Quant', 'Movement', 'Price'])
#Charge regulator
brand = ['Basic', 'Basic', 'MorningStar', 'SunWind', 'SunWind','PeakPower', 'PeakPower', 'PeakPower',
'Victron', 'Victron', 'Victron SmartSolar', 'Victron SmartSolar', 'Victron BlueSolar']
item = ['1', '2', '1', '1', '2', '1', '2', '3', '1', '2', '1', '2', '1']
hier_index = list(zip(brand, item))
hier_index = pd.MultiIndex.from_tuples(hier_index, names=['brand', 'item'])
data = np.array([[10, 'NA', 'NA', 'NA', 495],
[20, 'NA', 'NA', 'NA', 595],
[30, 'NA', 'NA', 'NA', 3490],
[16, 180, 180, 'NA', 1890],
[20, 240, 240, 'NA', 2990],
[10, 130,260, 'NA', 1290],
[20, 260,520, 'NA', 1790],
[30, 390, 780, 'NA', 1995],
[30, 'NA', 'NA', 100, 2990],
[50, 'NA', 'NA', 100, 3990],
[70, 1000, 2000, 'NA', 7990],
[15, 220, 440, 75, 1499],
[10, 'NA', 'NA', 'NA', 890]])
df_reg = pd.DataFrame(data, index=hier_index, columns= ['A', 'max_12V', 'max_24', 'V', 'Price'])
#Batteries
category = ['SunWind', 'SunWind', 'SunWind', 'SunWind', 'SunWind', 'SunWind', 'SunWind', 'SunWind',
'Rolls', 'Rolls', 'Rolls', 'Rolls', 'Rolls', 'Rolls', 'MG', 'MG']
technology = ['AGM', 'AGM', 'AGM', 'AGM', 'Lithium', 'Lithium', 'Lithium', 'Lithium',
'Lead / acid', 'Lead / acid', 'Lead / acid', 'Lead / acid', 'Lead / acid',
'Lead / acid', 'Lithium', 'Lithium', ]
item = ['1', '2', '3', '4', '5', '6', '7', '8', '1',
'2', '3', '4', '5', '6', '1', '2']
hier_index = list(zip(category, technology, item))
hier_index = pd.MultiIndex.from_tuples(hier_index, names=['cat', 'tech', 'item'])
data = np.array([[136, 'NA', 32.9,17.3, 20.9, 32.5, 3390],
[260, 'NA', 52.2, 24, 22, 64, 5990],
[292, 'NA', 52.1, 27, 20.3, 73.5, 6990],
[305, 'NA', 52.6, 27.8, 26, 72.1, 11995],
[50, 'NA', 25, 16, 18, 7.5, 4499],
[100,'NA', 31, 17.3, 21.7, 13.5, 6999],
[125, 'NA', 33.7, 17.2, 27.9, 15, 12995],
[300, 'NA', 52, 26.8, 22.8, 35.3, 25195],
[120, 12, 34.3, 17.1, 24.1, 34, 3490],
[504, 6, 31.8, 18.1, 42.5, 60, 6995],
[503, 12, 55.7, 28.6, 46.4, 123, 17990],
[605, 6, 31.8, 18.1, 42.5, 57, 6790],
[2490, 2, 39.2, 22.4, 63, 94, 12595],
[3426, 2, 39.4, 22.9, 80.3, 129, 15990],
[200, 'NA', 'NA', 'NA', 'NA', 'NA', 49990],
[300, 'NA', 'NA', 'NA', 'NA', 'NA', 62990]])
df_bat = pd.DataFrame(data, index=hier_index, columns= ['cap', 'V', 'X', 'Y', 'Z','weight', 'Price'])
#Inverter
category = ['SunWind', 'SunWind', 'SunWind', 'Phoenix', 'Phoenix', 'Phoenix', 'Phoenix',
'Phoenix', 'Phoenix', 'Phoenix', 'Phoenix', 'Phoenix', 'Phoenix' ]
item = ['1', '2', '3', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
hier_index = list(zip(category, item))
hier_index = pd.MultiIndex.from_tuples(hier_index, names=['cat', 'item'])
data = np.array([[12, 300, 'No', 1390],
[12, 600, 'No', 1990],
[12, 1500, 'No', 3695],
[12, 250, 'No', 1390],
[12, 375, 'No', 1790],
[12, 500, 'Yes', 2195],
[12, 800, 'No', 3495],
[12, 1200, 'Yes', 4999],
[24, 250, 'Yes', 1390],
[24, 375, 'Yes', 1790],
[24, 500, 'Yes', 2195],
[24, 800, 'Yes', 3495],
[24, 1200, 'Yes', 4999]])
df_inv = pd.DataFrame(data, index=hier_index, columns= ['voltage', 'power', 'connect', 'Price'])
#Exchangers
category = ['Multiplus', 'Multiplus', 'Multiplus', 'Quattro', 'Quattro', 'Quattro',
'EasySolar', 'EasySolar', 'Multi']
item = ['1', '2', '3', '1', '2', '3', '1', '2', '1']
hier_index = list(zip(category, item))
hier_index = pd.MultiIndex.from_tuples(hier_index, names=['cat', 'item'])
data = np.array([[12, 1200, 2100, 300, 11490],
[12, 2000, 4000, 500, 14995],
[12, 3000, 6000, 800, 20495],
[24, 5000, 5000, 800, 32995],
[12, 3000, 6000, 800, 25995],
[48, 8000, 8000, 600, 34990],
[24, 3000, 3000, 200, 16999],
[24, 3000, 6000, 400, 24999],
[12, 500, 900, 250, 5990]])
df_exc = pd.DataFrame(data, index=hier_index, columns= ['voltage', 'VA', 'power', 'battery', 'Price'])
#Accesories
category = ['Structure', 'Structure', 'Structure', 'Structure', 'Structure', 'Security',
'Cable', 'Cable', 'Cable', 'Cable', 'Cable', 'Cable', 'Aditional']
item = ['1', '2', '3', '4', '5', '1', '1', '2', '3', '4', '5', '6', '1']
hier_index = list(zip(category, item))
hier_index = pd.MultiIndex.from_tuples(hier_index, names=['cat', 'item'])
data = np.array([['Aluminium rail', 360],
['Shot for alloy rail', 99],
['Mounting clip double', 45],
['Mounting clip simple', 40],
['Mounting bracket', 87],
['Switch, 2 poles, 25A', 695],
['Cable(4mm2, 50m)', 1690],
['Cable clips(100)', 139],
['Cable MC4 for solar panel (1m)', 69],
['Splitter MC4 cable', 164],
['Battery-regulator cable', 225],
['Battery parallelcable (6mm, 1m)', 115],
['Battery monitor', 2595]])
df_acc = pd.DataFrame(data, index=hier_index, columns= ['description', 'Price'])
print('panels')
display(df_panel)
print('structure')
display(df_struc)
print('regulator')
display(df_reg)
print('exchanger')
display(df_exc)
print('inverter')
display(df_inv)
print('batteries')
display(df_bat)
print('accesories')
display(df_acc)
df_panel['NOK/W'] = round((df_panel['Price'] / df_panel['watts']),2)
df_panel.sort_values(by='NOK/W', ascending=True)
# Create Figure (empty canvas)
fig1 = plt.figure()
axes = fig1.add_axes([0.1, 0.1, 0.8, 0.8])
#AGM
eprice = df_panel.loc['Entry'][['Price']]
ewatt = df_panel.loc['Entry'][['watts']]
#Lithium
mpprice = df_panel.loc['Max_Power'][['Price']]
mpwatt = df_panel.loc['Max_Power'][['watts']]
#Lead acid
gprice = df_panel.loc['Grid'][['Price']]
gwatt = df_panel.loc['Grid'][['watts']]
# Plot on that set of axes
axes.plot(eprice, ewatt,'b', lw=0.5, ls='-', marker='+', ms = 8, label="Entry")
axes.plot(mpprice, mpwatt, 'r', lw=0.5, ls='-', marker='+', ms = 8, label="Max Power")
axes.plot(gprice, gwatt, 'g', lw=0.5, ls='-', marker='+', ms = 8, label="Grid")
axes.set_xlabel('NOK')
axes.set_ylabel('watts')
axes.set_title('Panels subcategories per price')
axes.legend(loc=0)
The best relation between power and price is given by the "Grid" panels, being the the panel of 300 watts the cheapest price in NOK/watt.
The system proposed is of 3kWp installed, to try to match the energy consumption of a household.
pwsyst = 3000 #3000 wp = 3 kWp
pwpanel = df_panel.loc['Grid'].loc['1'][['watts']] #panel selected (Grid, 300w)
quantity = pwsyst / pwpanel #10
NASA/POWER Climatologies
Monthly & Annual Climatologies (July 1983 - June 2005)
Location: Latitude 70.43 Longitude 24.5
Source: https://power.larc.nasa.gov/data-access-viewer/
df_clim = pd.read_csv('Climatology.csv', delimiter= ';', na_values= 'NA')
df_clim
# Create Figure (empty canvas)
fig2 = plt.figure()
axes = fig2.add_axes([0.1, 0.1, 0.8, 0.8])
#Temperature
months = df_clim.columns[2:14]
values = df_clim.iloc[0][2:14].astype(float)
# Plot on that set of axes
axes.plot(months, values,'b', lw=0.5, ls='-', marker='+', ms = 8)
axes.plot(months, np.zeros(12),'black', lw=0.5, ls='-')
axes.set_xlabel('month')
axes.set_ylabel('ºC')
axes.set_title('Monthly average temperature at 2 meters')
# Create Figure (empty canvas)
fig3 = plt.figure()
axes = fig3.add_axes([0.1, 0.1, 0.8, 0.8])
#hours
months = df_clim.columns[2:14]
values = df_clim.iloc[1][2:14].astype(float)
# Plot on that set of axes
axes.plot(months, values,'r', lw=0.5, ls='-', marker='+', ms = 8)
axes.plot(months, np.zeros(12),'black', lw=0.5, ls='-')
axes.set_xlabel('month')
axes.set_ylabel('hours')
axes.set_title('Daily hours')
# Create Figure (empty canvas)
fig4 = plt.figure()
axes = fig4.add_axes([0.1, 0.1, 0.8, 0.8])
#Irradiation
months = df_clim.columns[2:14]
direct = df_clim.iloc[4][2:14].astype(float)
diff = df_clim.iloc[5][2:14].astype(float)
# Plot on that set of axes
axes.plot(months, direct,'r', lw=0.5, ls='-', marker='+', ms = 8, label="Direct")
axes.plot(months, (direct + diff),'b', lw=0.5, ls='-', marker='+', ms = 8, label="Direct + Diffuse")
axes.set_xlabel('month')
axes.set_ylabel('kW-hr/m^2/day')
axes.set_title('Daily normal radiation')
axes.legend(loc=0)
# Create Figure (empty canvas)
fig5 = plt.figure()
axes = fig5.add_axes([0.1, 0.1, 0.8, 0.8])
#Irradiation
months = df_clim.columns[2:14]
deg0 = df_clim.iloc[6][2:14].astype(float)
deg55 = df_clim.iloc[7][2:14].astype(float)
deg70 = df_clim.iloc[8][2:14].astype(float)
deg85 = df_clim.iloc[9][2:14].astype(float)
deg90 = df_clim.iloc[10][2:14].astype(float)
# Plot on that set of axes
axes.plot(months, deg0,'LightSalmon', lw=2, ls='-', marker='+', ms = 8, label="Tilted 0 degrees")
axes.plot(months, deg55,'DarkSalmon', lw=1, ls='-', marker='+', ms = 8, label="Tilted 55 degrees")
axes.plot(months, deg70,'IndianRed', lw=1, ls='-', marker='+', ms = 8, label="Tilted 70 degrees")
axes.plot(months, deg85,'Crimson', lw=1, ls='-', marker='+', ms = 8, label="Tilted 85 degrees")
axes.plot(months, deg90,'FIreBrick', lw=2, ls='-', marker='+', ms = 8, label="Tilted 90 degrees")
axes.set_xlabel('month')
axes.set_ylabel('kW-hr/m^2/day')
axes.set_title('Solar irradiance in tilted surfaces')
axes.legend(loc=0)
# Create Figure (empty canvas)
fig6 = plt.figure()
axes = fig6.add_axes([0.1, 0.1, 0.8, 0.8])
#Irradiation
months = df_clim.columns[2:14]
opt = df_clim.iloc[12][2:14].astype(float)
avg_opt = (55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, )
# Plot on that set of axes
axes.plot(months, opt,'b', lw=0.5, ls='-', marker='+', ms = 8)
axes.plot(months, avg_opt,'grey', lw=0.5, ls='-', )
axes.set_ylim([0, 90])
axes.set_xlabel('month')
axes.set_ylabel('degrees')
axes.set_title('Solar irradiance optimal angle')