Windfarm Processing

Processing of the windfarm database consists of filtering the data, adding powercurve, and adding missing data
Table of Contents
Add functions to the path
addpath('functions')

Load Windturbine Data

filename = "data/WT_data/TheWindPowerDatabaseWithRotorParameters23Mar.csv";
opts = detectImportOptions(filename,'Encoding','UTF-8');
t=readtable(filename,opts);
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property.
Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
disp("Number of Windfarm: "+ height(unique([t.Latitude t.Longitude], "row")))
Number of Windfarm: 15889
disp("Number of wind turbines: "+ sum(t.Number_of_turbines,"omitnan"))
Number of wind turbines: 116430

Basic Filtering

Remove offshore turbine
t(~strcmp(t.Offshore_Shore_distance,'No'),:)=[];
Remove turbine not in production (i.e., Construction, Planned, Approved or dismantled)
t(~strcmp(t.Status,'Production'),:)=[];
Remove data without location information
t(isnan(t.Latitude) | isnan(t.Longitude),:)=[];
Remove data outside of study area as defined by the bird datase.
To do that, we first assign to each windfarm the grid id of its location in the bird database and then we filter for windfarm further than 50km from the closest grid id.
load('data/2018/Density_estimationMap','g');
[dist,grid_id] = min(pdist2([g.lat2D(g.latlonmask) g.lon2D(g.latlonmask)],[t.Latitude t.Longitude],@lldistkm));
t.grid_id = grid_id';
t(dist>50,:)=[];
Display table
t
t = 12518×34 table
 IDContinentISO_codeCountryState_codeAreaCityNameX2nd_nameLatitudeLongitudeAltitude_DepthLocation_accuracyOffshore_Shore_distanceManufacturerTurbineHub_heightNumber_of_turbinesTotal_powerDeveloperOperatorOwnerCommissioning_dateStatusDecommissioning_dateLinkUpdateturbine_maketurbine_capacityturbine_rotorDiameterturbine_rotorRadiusturbine_sweptAreaNOTESgrid_id
11256'Europe''AT''Austria''NA''Niederösterreich''Ertl''Ertl''NA'47.967014.6600'NA''Yes''No''Enercon''E40/500'651500'NA''Prenn Franz''NA'2000'Production''''Link'29-Apr-0019'Enercon'50040.300020.10001.2692e+03''1894
21247'Europe''AT''Austria''NA''Oberösterreich''Eberschwang''Eberschwang''NA'48.145013.5190'620''Yes''No''Enercon''E40/500'5021000'Windkraft Innviertel GmbH/EWS Consulting''Windkraft Innviertel GmbH''NA'NaN'Production''''Link'29-Apr-0019'Enercon'50040.300020.10001.2692e+03''1840
31252'Europe''AT''Austria''NA''Oberösterreich''Laussa''Laussa''Plattenberg'47.952014.4920'NA''Yes''No''Tacke''TW-600'5031800'EWS Consulting''Energie AG''Erneuerbare Energie Laussa GmbH'1996'Production''''Link'29-Apr-0019'Tacke'6004321.50001.4522e+03''1894
416707'Europe''AT''Austria''NA''Oberösterreich''Munderfing''Munderfing''Kobernaußerwald'48.055013.2420'NA''Yes''No''Vestas''V112/3000'140515000'NA''NA''Municipality of Munderfing/EWS Consulting'NaN'Production''''Link'29-Apr-0019'Vestas'3000112569.8521e+03''1810
51251'Europe''AT''Austria''NA''Oberösterreich''Oberrödham''Oberrödham''NA'48.330013.6620'NA''Yes''No''Vestas''V47/660'6531980'EWS Consulting''Energie AG''NA'1999'Production''''Link'29-Apr-0019'Vestas'6604723.50001.7349e+03''1869
61254'Europe''AT''Austria''NA''Oberösterreich''Schenkenfelden''Schenkenfelden''NA'48.510014.3500'NA''Yes''No''Micon''M1800-600/48'6021200'EWS Consulting''Future Energy GmbH''WEB Windenergie AG'1998'Production''''Link'20-Feb-0020'Micon'60048241.8096e+03''1896
71249'Europe''AT''Austria''NA''Oberösterreich''Schernham''Schernham''NA'48.179013.6090'NA''Yes''No''Enercon''E66/1800'8611800'Windkraft Innviertel GmbH''Windkraft Innviertel GmbH''NA'NaN'Production''''Link'29-Apr-0019'Enercon'180070353.8485e+03''1840
81257'Europe''AT''Austria''NA''Oberösterreich''Spörbichl''Spörbichl''NA'48.552014.6000'NA''Yes''No''Vestas''V47/660'6521320'EWS Consulting''New Energy/Austrian Wind Power GmbH''NA'1999'Production''''Link'29-Apr-0019'Vestas'6604723.50001.7349e+03''1896
91248'Europe''AT''Austria''NA''Oberösterreich''Steiglberg''Steiglberg''NA'48.096013.3560'NA''Yes''No''Vestas''V80/2000'10012000'EWS Consulting''NA''Windkraft Simonsfeld GmbH & Co KG'2002'Production''''Link'16-Sep-0019'Vestas'200080405.0266e+03''1810
101250'Europe''AT''Austria''NA''Oberösterreich''Steindlberg''Steindlberg''NA'48.322013.6660'NA''Yes''No''Vestas''V47/660'6521320'EWS Consulting''Energy from A to Z Gmbh & Co KGa''NA'2001'Production''''Link'29-Apr-0019'Vestas'6604723.50001.7349e+03''1869
111253'Europe''AT''Austria''NA''Oberösterreich''Vorderweissenbach''Sternwald I''Sternwind'48.579014.2310'NA''Yes''No''Vestas''V80/2000'10012000'Sternwind/ImWind''Sternwind/WEB Windenergie AG''Sternwind/WEB Windenergie AG'NaN'Production''''Link'20-Feb-0020'Vestas'200080405.0266e+03''1896
1210444'Europe''AT''Austria''NA''Oberösterreich''Vorderweissenbach''Sternwald II''Sternwind'48.579014.2310'NA''Yes''No''Vestas''V90/2000'105612000'Sternwind/EWS Consulting/ImWind''Sternwind/WEB Windenergie AG''Sternwind/WEB Windenergie AG'NaN'Production''''Link'20-Feb-0020'Vestas'200090456.3617e+03''1896
1322495'Europe''AT''Austria''NA''Oberösterreich''Vorderweissenbach''Sternwald III''NA'48.584014.2200'NA''Yes''No''Vestas''V112/3000'NaN26000'WEB Windenergie AG''Sternwind/WEB Windenergie AG''Sternwind/WEB Windenergie AG'2016'Production''''Link'20-Feb-0020'Vestas'3000112569.8521e+03''1896
1423831'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Antwerpen''Antwerpen BASF''Zandvliet BASF'51.36304.2970'NA''Yes''No''Enercon''E82/2000'98612000'Electrabel''Engie''Engie'NaN'Production''''Link'23-Mar-0020'Enercon'200082415281''761
1517531'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Arendonk, Oud-Turnhout''Arendonk''Zephiros'51.29805.0620'NA''Yes''No''Enercon''E82/2300'108716100'Eneco''NA''NA'NaN'Production''''Link'23-Oct-0017'Enercon'230082415281''861
1623198'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Arendonk''Arendonk''Evergem'51.29705.1010'NA''No''No''Enercon''E82/2300'10812300'Elicio''NA''NA'2015'Production''''Link'21-Oct-0019'Enercon'230082415281''861
171857'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Kasterlee''Bobbejaanland''Kasterlee'51.19904.9050'NA''Yes''No''Vestas''V47/660'421660'NA''NA''NA'2001'Production''''Link'30-Nov-0016'Vestas'6604723.50001.7349e+03''861
1830293'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Zwijndrecht''DEME''NA'51.25004.3140'NA''No''No''Xant''M-21'381100'NA''NA''NA'NaN'Production''''Link'02-Oct-0019'Xant'1002110.5000346.4000''761
1923191'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Hoogstraten''Hoogstraten''NA'51.42204.7500'NA''No''No''Senvion''3.2M114'14339600'Storm''Storm''NA'2015'Production''''Link'22-Jan-0018'Senvion'3200114571.0207e+04''828
204137'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Essen''Kalmthout''Essen'51.44704.5030'NA''Yes''No''Senvion''MM92/2050'10012050'Mega-Windy''Ecopower''NA'2012'Production''''Link'03-Apr-0020'Senvion'205092.500046.20006.7056e+03''795
2118968'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Kalmthout''Kalmthout''Kalmthout'51.44704.5030'NA''Yes''No''Senvion''MM92/2050'10036150'Mega-Windy''Ecopower''NA'2012'Production''''Link'03-Apr-0020'Senvion'205092.500046.20006.7056e+03''795
22692'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Laakdal''Laakdal-Meerhout''Nike Windpark'51.09705.0880'NA''Yes''No''Repower''MD77'11234500'SeeBA EnergyFarming/WPD''SeeBA EnergyFarming''NA'2006'Production''''Link'22-Jan-0018'Repower'15007738.50004.6566e+03''860
2316563'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Meerhout''Laakdal-Meerhout''Nike Windpark'51.09905.0910'NA''Yes''No''Repower''MD77'11234500'SeeBA EnergyFarming/WPD''SeeBA EnergyFarming''NA'2006'Production''''Link'22-Jan-0018'Repower'15007738.50004.6566e+03''860
2423954'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Olen''Olen Umicore''Geel-Olen'51.17904.8880'NA''No''No''Vestas''V117/3450'NaN413800'Wind4Flanders''Wind4Flanders''Engie'NaN'Production''''Link'23-Mar-0020'Vestas'345011758.50001.0751e+04''861
2523179'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Olen''Olen-Geel''NA'51.14804.9130'NA''Yes''No''Enercon''E82/2300'NaN36900'EDF Luminus''EDF Luminus''EDF Luminus'2014'Production''''Link'22-Jan-0018'Enercon'230082415281'Biggest rotor diameter for an Enercon model of this rating.'861
2623180'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Geel''Olen-Geel''NA'51.14404.9260'NA''Yes''No''Enercon''E82/2301'NaN36900'EDF Luminus''EDF Luminus''EDF Luminus'2014'Production''''Link'22-Jan-0018'Enercon'230082415281'Biggest rotor diameter for an Enercon model of this rating.'861
27247'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Puurs''Puurs''Rupeltunnel'51.07904.3520'NA''Yes''No''Vestas''V80/2000'10024000'Aspiravi''Aspiravi''Aspiravi'NaN'Production''''Link'16-Oct-0019'Vestas'200080405.0266e+03''760
2817530'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Puurs''Rijksweg''Puurs'51.06704.3150'NA''Yes''No''Enercon''E82/2300'10824600'Eneco''NA''NA'NaN'Production''''Link'23-Oct-0017'Enercon'230082415281''760
29265'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Schelle''Schelle''NA'51.12504.3210'NA''Yes''No''Enron''1.5s'8534500'Engie''Engie''Engie'NaN'Production''''Link'23-Mar-0020'Enron'150070.500035.20003.8926e+03''761
3025321'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Mol''Sibelco''NA'51.20005.1600'NA''Yes''No''Enercon''E92/2350'10837050'EDF Luminus''NA''EDF renewables'2017'Production''''Link'23-Jan-0018'Enercon'235092466.6476e+03''894
3123173'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Westerlo''Westerlo''NA'51.09004.9140'NA''No''No''Senvion''MM92/2050'10024100'Storm''Storm''NA'NaN'Production''''Link'17-Feb-0020'Senvion'205092.500046.20006.7056e+03''860
3223194'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Westerlo''Westerlo''NA'51.09004.9140'NA''No''No''Senvion''MM100'10024000'Electrabel''Engie''NA'NaN'Production''''Link'23-Mar-0020'Senvion'2000100507854''860
3323193'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Wuustwezel''Wuustwezel''NA'51.40304.6880'NA''Yes''No''Vestas''V90/2000'NaN48000'Electrabel''Engie''NA'NaN'Production''''Link'23-Mar-0020'Vestas'200090456.3617e+03''828
3418814'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Brecht, Wuustwezel, Hoogstraten''Wuustwezel-Brecht''NA'51.39304.6860'NA''Yes''No''Enercon''E82/2300'108716100'NA''NA''Aspiravi'2012'Production''''Link'16-Oct-0019'Enercon'230082415281''828
3518815'Europe''BE''Belgium''NA''Antwerpen (Vlaanderen)''Brecht''Wuustwezel-Brecht''NA'51.34904.6200'NA''Yes''No''Vestas''V90/2000'10536000'NA''NA''Aspiravi'2012'Production''''Link'16-Oct-0019'Vestas'200090456.3617e+03''794
3624888'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Orp-Jauche, Opheylissem''Greensky - E40 (Brabant wallon)''Part 1'50.71605.0440'NA''No''No''Vestas''V100/2000'NaN24000'Engie''NA''NA'NaN'Production''''Link'26-Apr-0019'Vestas'2000100507854''859
3713'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Villers-la-Ville''Marbais''NA'50.53704.5150'NA''Yes''No''Enercon''E82/2000'78816000'Eneco''Electrastar SA''NA'2007'Production''''Link'23-Oct-0017'Enercon'200082415281''791
3810930'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Villers-la-Ville''Marbais''Extension'50.53304.5040'NA''Yes''No''Enercon''E82/2000'7836000'Eneco''Electrastar SA''NA'2010'Production''''Link'23-Oct-0017'Enercon'200082415281''791
39178'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Perwez''Perwez''NA'50.60604.7920'NA''Yes''No''Repower''MD77'8534500'Aspiravi''Les Eoliennes de Perwez''ENI Wind Belgium'NaN'Production''''Link'23-Oct-0017'Repower'15007738.50004.6566e+03''824
40179'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Perwez''Perwez''NA'50.61104.7970'NA''Yes''No''GE Energy''1.5sle'8557500'Eneco''NA''Les Vents de Perwez'NaN'Production''''Link'23-Oct-0017'GE Energy'15007738.50004.6566e+03''824
41210'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Perwez''Perwez''NA'50.59804.7980'NA''Yes''No''Nordex''N100/2500'10025000'Eneco''Hegao Wind''NA'2012'Production''''Link'23-Oct-0017'Nordex'2500100507854''824
422951'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Perwez''Perwez''NA'50.60304.7840'NA''Yes''No''Vestas''V90/2000'10536000'Aspiravi''Aspiravi''Aspiravi'NaN'Production''''Link'16-Oct-0019'Vestas'200090456.3617e+03''824
4318964'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Perwez''Perwez''NA'50.60304.7840'NA''Yes''No''Vestas''V90/2000'10524000'Elicio''NA''NA'NaN'Production''''Link'09-Apr-0020'Vestas'200090456.3617e+03''824
4421075'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Perwez''Perwez''NA'50.59804.7980'NA''Yes''No''Nordex''N100/2500'10012500'NA''NA''NA'2012'Production''''Link'23-Oct-0017'Nordex'2500100507854''824
4524691'Europe''BE''Belgium''NA''Brabant wallon (Wallonie)''Nivelles''Vents d’Arpes''NA'50.57504.3050'NA''Yes''No''Senvion''3.4M114'93413600'Ventis''Ventis''Ventis/CLEF'NaN'Production''''Link'03-Apr-0020'Senvion'3400114571.0207e+04''758
467143'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Baileux''Baileux''Chimay'50.04404.3800'NA''Yes''No''GE Energy''2.5xl'100410000'Greenwind''Ventient Energy''Ventient Energy'NaN'Production''''Link'11-Mar-0020'GE Energy'2500100507854''789
4721711'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Baileux''Baileux''Chimay II'50.04704.3550'NA''Yes''No''GE Energy''2.5-100'10025000'NA''Ventient Energy''Ventient Energy'2014'Production''''Link'11-Mar-0020'2.5-100'2500100507854''756
4826773'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Baileux''Baileux''Chimay II'50.04704.3550'NA''Yes''No''GE Energy''2.75-100'10038250'NA''Ventient Energy''Ventient Energy'2014'Production''''Link'11-Mar-0020'2.75-100'2750100507854''756
4919973'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Leuze-en-Hainaut, Beloeil''Beloeil''Tourpes/Thumaide'50.55503.6380'NA''Yes''No''Enercon''E82/2300'98920700'Windvision''Windvision''NA'NaN'Production''''Link'21-Jan-0020'Enercon'230082415281''691
50167'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Dour, Quiévrain''Dour-Quiévrain''Partie 1'50.40303.7210'NA''Yes''No''Enercon''E82/2000'9848000'Energie Hainaut''NA''Engie'NaN'Production''''Link'23-Mar-0020'Enercon'200082415281''691
514030'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Dour, Quiévrain''Dour-Quiévrain''Partie 2'50.41003.7310'NA''Yes''No''Enercon''E82/2000'9836000'Energie Hainaut''Engie''Engie'2008'Production''''Link'23-Mar-0020'Enercon'200082415281''691
524032'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Dour, Quiévrain''Dour-Quiévrain''Partie 3'50.40803.7280'NA''Yes''No''Enercon''E82/2000'9824000'Ventis''Ventis''Engie'2009'Production''''Link'03-Apr-0020'Enercon'200082415281''691
5315233'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Dour, Quiévrain''Dour-Quiévrain''Partie 4'50.41303.7370'NA''Yes''No''Enercon''E82/2000'9824000'Ventis''Ventis''Ventis'2009'Production''''Link'03-Apr-0020'Enercon'200082415281''691
5415234'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Dour, Quiévrain''Dour-Quiévrain''Partie 5'50.41603.7130'NA''Yes''No''Enercon''E82/2300'9812300'Ventis''Ventis''Ventis'2010'Production''''Link'03-Apr-0020'Enercon'230082415281''691
5515235'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Dour, Quiévrain''Dour-Quiévrain''Partie 6'50.40003.7240'NA''Yes''No''Enercon''E82/2300'9824600'Ventis''SCRL Les Moulins du Haut Pays''Ventis'2010'Production''''Link'03-Apr-0020'Enercon'230082415281''691
5622392'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Hensies''Dour-Quiévrain''Partie 7a'50.41503.7210'NA''Yes''No''Enercon''E92/2350'10424700'Ventis''Ventis''NA'NaN'Production''''Link'03-Apr-0020'Enercon'235092466.6476e+03''691
5722718'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Hensies''Dour-Quiévrain''Partie 7b'50.41703.7290'NA''Yes''No''Enercon''E92/2350'10424700'Electrabel''Engie''Ventis'NaN'Production''''Link'23-Mar-0020'Enercon'235092466.6476e+03''691
5827441'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Ecaussinnes''Ecaussinnes''NA'50.53104.1770'NA''Yes''No''Siemens''SWT-3.2-113'92.500039600'Electrabel''Engie''Engie'2019'Production''''Link'23-Mar-0020'Siemens'320011356.50001.0029e+04''758
5916381'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Estaimpuis''Estaimpuis''La Royère'50.67803.2850'NA''Yes''No''Vestas''V100/2200'NaN24400'EDF Luminus''IPALLE''IPALLE'NaN'Production''''Link'08-Apr-0020'Vestas'2200100507854''627
6025210'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Estaimpuis''Estaimpuis''La Royère'50.65803.2980'NA''Yes''No''Vestas''V100/2200'NaN36600'EDF Luminus''EDF Luminus''EDF Luminus'NaN'Production''''Link'08-Apr-0020'Vestas'2200100507854''627
612701'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Estinnes-au-Mont''Estinnes''Levant de Mons - Estinnes 1'50.41404.0740'NA''Yes''No''Enercon''E126/6000'13516000'Windvision''CGN EE/Enercon''CGN EE'2008'Production''''Link'21-Jan-0020'Enercon'60001266312469''724
6211213'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Estinnes-au-Mont''Estinnes''Levant de Mons - Estinnes 2'50.41404.0740'NA''Yes''No''Enercon''E126/7500'135645000'Windvision''CGN EE/Enercon''CGN EE'2010'Production''''Link'21-Jan-0020'Enercon'750012763.50001.2668e+04''724
6320640'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Estinnes-au-Mont''Estinnes''Levant de Mons - Estinnes 1'50.41404.0740'NA''Yes''No''Enercon''E126/7500'135430000'Windvision''CGN EE/Enercon''CGN EE'2008'Production''''Link'21-Jan-0020'Enercon'750012763.50001.2668e+04''724
6422346'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Seneffe''Feluy''NA'50.55804.2290'NA''Yes''No''Senvion''MM92/2050'94714350'Elawan''Elawan''Elawan/CLEF'NaN'Production''''Link'11-Sep-0019'Senvion'205092.500046.20006.7056e+03''758
6529297'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Seneffe''Feluy - Zone Industrielle''Partie 1 - LEF Colas'50.53304.2000'NA''Yes''No''Vestas''V110/2200'NaN12200'EDF Luminus''NA''NA'NaN'Production''''Link'22-Feb-0019'Vestas'2200110559.5033e+03''758
6619962'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Frasnes-Lez-Anvaing''Frasnes-Lez-Anvaing''NA'50.65603.6450'NA''Yes''No''Senvion''MM92/2050'10012050'Ventis''Ventis/Engie''Ventis/Engie/CLEF'NaN'Production''''Link'03-Apr-0020'Senvion'205092.500046.20006.7056e+03''692
6721755'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Frasnes-Lez-Anvaing''Frasnes-Lez-Anvaing''NA'50.65603.6450'NA''Yes''No''Senvion''MM100'10012000'Ventis''Ventis/Engie''Ventis/Engie/CLEF'2014'Production''''Link'03-Apr-0020'Senvion'2000100507854''692
6824706'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Frasnes-Lez-Anvaing''Frasnes-Lez-Anvaing''NA'50.65603.6450'NA''Yes''No''Senvion''MM92/2050'10012050'NA''NA''NA'NaN'Production''''Link'23-Mar-0020'Senvion'205092.500046.20006.7056e+03''692
6924707'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Frasnes-Lez-Anvaing''Frasnes-Lez-Anvaing''NA'50.65603.6450'NA''Yes''No''Senvion''MM100'10012000'NA''NA''NA'2014'Production''''Link'23-Mar-0020'Senvion'2000100507854''692
703806'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Beaumont, Froidchapelle''Froidchapelle''NA'50.21604.3290'NA''Yes''No''GE Energy''2.5xl'1001025000'Greenwind''Ventient Energy''Ventient Energy'2008'Production''''Link'11-Mar-0020'GE Energy'2500100507854''757
7123514'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Beaumont, Froidchapelle''Froidchapelle''NA'50.21104.3110'NA''Yes''No''Vestas''V100/2000'NaN612000'Elawan''Elawan''EDP Renovaveis'2016'Production''''Link'11-Sep-0019'Vestas'2000100507854''757
72255'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Ath''Ghislenghien''NA'50.65303.8650'NA''Yes''No''Enercon''E82/2000'9812000'Colruyt''NA''NA'2006'Production''''Link'15-Jan-0018'Enercon'200082415281''692
7330671'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Mons''Ghlin''NA'50.48203.8720'NA''Yes''No''Vestas''V110/2000'NaN12000'EDF Luminus''NA''Hydro Extrusion Ghlin'NaN'Production''''Link'16-Mar-0020'Vestas'2000110559.5033e+03''691
7422693'Europe''BE''Belgium''NA''Hainaut (Wallonie)''La Louvière''La Louvière Garocentre''NA'50.50004.1850'NA''Yes''No''Enercon''E92/2350'10449400'Ventis''NA''Ventis/IDEA'NaN'Production''''Link'03-Apr-0020'Enercon'235092466.6476e+03''758
7515854'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Leuze-en-Hainaut''Leuze-en-Hainaut''NA'50.59903.6390'NA''Yes''No''Senvion''MM92/2050'100714350'Electrabel/ELSA/CLEF''Engie''Engie'NaN'Production''''Link'23-Mar-0020'Senvion'205092.500046.20006.7056e+03''691
7619971'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Leuze-en-Hainaut''Leuze-en-Hainaut''NA'50.59903.6390'NA''Yes''No''Senvion''MM92/2050'10024100'Electrabel/ELSA/CLEF''ELSA''ELSA'NaN'Production''''Link'24-Oct-0018'Senvion'205092.500046.20006.7056e+03''691
7719972'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Leuze-en-Hainaut''Leuze-en-Hainaut''NA'50.59903.6390'NA''Yes''No''Senvion''MM92/2050'10012050'Electrabel/ELSA/CLEF''CLEF''CLEF'NaN'Production''''Link'26-Nov-0018'Senvion'205092.500046.20006.7056e+03''691
7827600'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Leuze-en-Hainaut''Leuze-en-Hainaut''NA'50.59903.6390'NA''No''No''Senvion''MM100'NaN12000'Electrabel''NA''Engie/#ND'2018'Production''''Link'24-Oct-0018'Senvion'2000100507854''691
7910783'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Celles-en-Hainaut, Pecq''Molenbaix''NA'50.70203.3950'NA''Yes''No''Senvion''MM100'10012000'Eneco''NA''CLEF'NaN'Production''''Link'27-Jan-0020'Senvion'2000100507854''660
8010784'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Celles-en-Hainaut, Pecq''Molenbaix''NA'50.70203.3950'NA''Yes''No''Senvion''MM100'10048000'Eneco''NA''Eneco'NaN'Production''''Link'27-Jan-0020'Senvion'2000100507854''660
811782'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Beloeil''Moulins Saint-Roch''Bury'50.53203.6170'NA''Yes''No''Senvion''MM100'10012000'IPALLE''TTR Energy''TTR Energy'2018'Production''''Link'06-May-0019'Senvion'2000100507854''659
8225319'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Péruwelz''Moulins Saint-Roch''Bury'50.53203.6170'NA''Yes''No''Senvion''MM100'10036000'IPALLE''TTR Energy''TTR Energy'2018'Production''''Link'06-May-0019'Senvion'2000100507854''659
83439'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Pont-à-Celles''Pont-à-Celles''NA'50.54404.3460'NA''Yes''No''Enercon''E82/2000'98816000'Eneco''Sky Sweeper SA''NA'NaN'Production''''Link'23-Oct-0017'Enercon'200082415281''758
847140'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Quévy''Quévy''NA'50.38003.9550'NA''Yes''No''Enercon''E82/2300'108920700'Ventis''Ventis/#ND''Ventis/Engie'NaN'Production''''Link'03-Apr-0020'Enercon'230082415281''724
8515232'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Seneffe''Seneffe ZI''Dow Corning 1'50.51304.2630'NA''Yes''No''Enercon''E82/2300'10812300'Energie 2030''Energie 2030''Energie 2030'NaN'Production''''Link'24-Oct-0019'Enercon'230082415281''758
8627440'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Seneffe''Seneffe ZI''Dow Corning 2'50.51304.2560'NA''Yes''No''Enercon''E92/2350'10412350'Dow Chemicals Belgium''Dow Chemicals Belgium''Dow Chemicals Belgium'NaN'Production''''Link'28-Jan-0019'Enercon'235092466.6476e+03''758
8730378'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Soignies''Soignies''NA'50.59504.0730'NA''Yes''No''Senvion''MM92/2050'7624100'Electrabel''NA''Engie/#ND'NaN'Production''''Link'23-Mar-0020'Senvion'205092.500046.20006.7056e+03''724
8815337'Europe''BE''Belgium''NA''Hainaut (Wallonie)''Tournai, Antoing, Brunehaut''TGV-TAB''Tournai'50.56903.4050'NA''Yes''No''Enercon''E82/2300'108716100'Ventis''Ventis''Ventis/#ND'NaN'Production''''Link'03-Apr-0020'Enercon'230082415281''659
89423'Europe''BE''Belgium''NA''Liège (Wallonie)''Amblève''Amel''Amblève'50.34706.2230'NA''Yes''No''Enercon''E82/2000'98510000'Aspiravi''Aspiravi''Aspiravi'2008'Production''''Link'10-Apr-0019'Enercon'200082415281''1018
906785'Europe''BE''Belgium''NA''Liège (Wallonie)''Berloz''Berloz''NA'50.69705.1870'NA''Yes''No''Vestas''V90/2000'10536000'EDF renewables''EDF Luminus''EDF Luminus'NaN'Production''''Link'23-Oct-0017'Vestas'200090456.3617e+03''892
917212'Europe''BE''Belgium''NA''Liège (Wallonie)''Berloz''Berloz II''NA'50.69205.1890'NA''Yes''No''Gamesa''G114/2500'9337500'NA''Eneco''Eneco'2016'Production''''Link'15-Jan-0018'Gamesa'2500114571.0207e+04''892
927215'Europe''BE''Belgium''NA''Liège (Wallonie)''Berloz, Geer''Berloz II''NA'50.68705.2010'NA''Yes''No''Gamesa''G114/2500'93410000'NA''EDF Luminus''EDF Luminus'2016'Production''''Link'15-Jan-0018'Gamesa'2500114571.0207e+04''892
93166'Europe''BE''Belgium''NA''Liège (Wallonie)''Butgenbach''Bullange - Butgenbach''NA'50.44506.2420'600''Yes''No''Vestas''V80/2000'7848000'Electrabel''NA''NA'NaN'Production''''Link'28-Aug-0018'Vestas'200080405.0266e+03''1019
943856'Europe''BE''Belgium''NA''Liège (Wallonie)''Bullange''Bullange - Butgenbach II''NA'50.39406.3200'NA''Yes''No''Vestas''V80/2000'NaN612000'Electrabel''Engie''Engie'NaN'Production''''Link'23-Mar-0020'Vestas'200080405.0266e+03''1019
9526770'Europe''BE''Belgium''NA''Liège (Wallonie)''Lincent''Greensky - E40 (Liège)''Part 2'50.71605.0440'NA''No''No''Vestas''V100/2000'NaN24000'Engie''NA''NA'NaN'Production''''Link'26-Apr-0019'Vestas'2000100507854''859
9626771'Europe''BE''Belgium''NA''Liège (Wallonie)''Lincent''Greensky - E40 (Liège)''Part 3'50.71605.0440'NA''No''No''Vestas''V100/2000'NaN36000'Engie''NA''NA'NaN'Production''''Link'26-Apr-0019'Vestas'2000100507854''859
9726772'Europe''BE''Belgium''NA''Liège (Wallonie)''Hannut''Greensky - E40 (Liège)''Part 4'50.71605.0440'NA''No''No''Vestas''V100/2000'NaN24000'Engie''NA''NA'NaN'Production''''Link'26-Apr-0019'Vestas'2000100507854''859
98345'Europe''BE''Belgium''NA''Liège (Wallonie)''Héron''Héron''NA'50.53405.1050'NA''Yes''No''Gamesa''G114/2500'9337500'EDF Luminus''EDF Luminus''EDF Luminus'NaN'Production''''Link'29-Jan-0018'Gamesa'2500114571.0207e+04''858
9930351'Europe''BE''Belgium''NA''Liège (Wallonie)''Lierneux''Lambiester''NA'50.32705.8270'NA''No''No''Siemens''SWT-3.2-113'NaN619200'EDF Luminus''EDF Luminus''EDF Luminus'NaN'Production''''Link'24-Oct-0019'Siemens'320011356.50001.0029e+04''955
10029699'Europe''BE''Belgium''NA''Liège (Wallonie)''NA''Modave''NA'50.49505.2660'NA''Yes''No''Senvion''3.2M114'NaN412800'Electrabel''NA''Wind4Wallonia'NaN'Production''''Link'23-Mar-0020'Senvion'3200114571.0207e+04''891
disp("Number of Windfarm: "+ height(unique([t.Latitude t.Longitude], "row")))
Number of Windfarm: 8429
disp("Number of wind turbines: "+ sum(t.Number_of_turbines,"omitnan"))
Number of wind turbines: 42231

Load Power Curve data

Power curve data provide the relationship to convert windspeed into power production. This data is downloaded from ...
filename = "data/WT_data/Power_curves_20210319.xls";
opts = detectImportOptions(filename,'Sheet','Power_curves');
tp=readtable(filename,opts);
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property.
Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
powerCurve.ws = table2array(tp(1,6:end-2));
powerCurve.ManufucturerName = tp.ManufucturerName(2:end);
powerCurve.TurbineName = tp.TurbineName(2:end);
powerCurve.Power = table2array(tp(2:end,6:end-2));

Smoothing Power-curve

Because windspeed is more heterogenous (in time) than the reanalysis data, it is standard procedure to smooth the powercurve with a Gaussian of mean 0 and standard deviation proportionaly to the windspeed. Here are some equation used in the litterature
As our wind databse has a 1hour resolution, we follow Staffell & Pfenninger (2016)
powerCurve.ws_smooth=powerCurve.ws(1):0.1:powerCurve.ws(end);
powerCurve.Power_smooth = nan(size(powerCurve.Power,1),numel(powerCurve.ws_smooth));
 
for i_p=1:size(powerCurve.Power,1)
p = interp1(powerCurve.ws,powerCurve.Power(i_p,:),powerCurve.ws_smooth);
% figure; plot(powerCurve.ws,powerCurve.Power(i_p,:),'or',powerCurve.ws_smooth,p,'-k')
for i_w=1:numel(powerCurve.ws_smooth)
s = 0.6+0.2*powerCurve.ws_smooth(i_w);
weight = normpdf(powerCurve.ws_smooth,powerCurve.ws_smooth(i_w),s);
weight = weight ./sum(weight);
powerCurve.Power_smooth(i_p,i_w)=weight*p';
end
% figure; hold on; plot(powerCurve.ws,powerCurve.Power(i_p,:)); plot(powerCurve.ws_smooth,powerCurve.Power_smooth(i_p,:));
end

Add Powercurve to windturbine

We assign the power curve to each windfarm
[~,Locb] = ismember(string([t.Turbine t.Manufacturer]) , string([powerCurve.TurbineName powerCurve.ManufucturerName]),'rows');
% t2=t(Locb==0,:);
t.powerCurve = nan(size(t,1),numel(powerCurve.ws_smooth));
t.powerCurve(Locb~=0,:) = powerCurve.Power_smooth(Locb(Locb~=0),:);
It would be nicer to do use the join function, but thes function requires that all windfarms have a matching powercurve. Hence, we use ismemeber()
%t2=join(t,tp,'LeftKeys','ID','RightKeys','Turb_ID');

Analysis of cut-in and cut-off

Compute the cut-in and cut-off value for each powercurve
Cutin = powerCurve.ws(sum(cumprod(powerCurve.Power==0,2),2));
Cutoff = powerCurve.ws(length(powerCurve.ws)-sum(cumprod(fliplr(powerCurve.Power)==0,2),2));
To plot the histogram of cut-in and cut-off, we need to accounts for each windfarm size (number of windturbines).
Cutin_h = repelem(Cutin(Locb(Locb~=0)),t.Number_of_turbines(Locb~=0));
Cutoff_h = repelem(Cutoff(Locb(Locb~=0)),t.Number_of_turbines(Locb~=0));
figure('position',[0 0 1000 300]);
subplot(1,2,1)
histogram(Cutin_h); xlabel('windspeed'); ylabel('Number of windturbine'); title('cut-in'); legend(['M=' num2str(mean(Cutin_h))])
subplot(1,2,2)
histogram(Cutoff_h); xlabel('windspeed'); title('cut-off'); legend(['M=' num2str(mean(Cutoff_h))])
%Cutin(Locb(Locb~=0)).*t.Number_of_turbines(Locb~=0).*t.turbine_sweptArea(Locb~=0))

Data Imputation

Several method exist for missing data: median, GLM or kNN (or more sofisticated like MICE).
Illustration of available data
var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power','powerCurve'};
figure('position',[0 0 1000 1000]);
subplot(6,1,1); histogram(t.Number_of_turbines); xlabel('Number of turbines'); ylim([0.5 10000]);set(gca, 'YScale', 'log')
subplot(6,1,2); histogram(t.turbine_sweptArea); xlabel('Swept Area (m^2)'); ylim([0.5 10000]); xlim([0 40000]); set(gca, 'YScale', 'log')
subplot(6,1,3); histogram(t.Hub_height); xlabel('Hub height (m)'); axis tight;set(gca, 'YScale', 'log'); xlim([0 170]);
subplot(6,1,4); histogram(t.turbine_capacity); xlabel('Turbine Capacity (kW)'); axis tight;set(gca, 'YScale', 'log')
subplot(6,1,[5 6]); hold on;
plot(powerCurve.ws_smooth, nanmean(t.powerCurve/1000),'k');
plot(powerCurve.ws_smooth, nanmedian(t.powerCurve/1000),'-.k');
plot(powerCurve.ws_smooth, quantile(t.powerCurve/1000,0.1),'--k');
plot(powerCurve.ws_smooth, quantile(t.powerCurve/1000,.9),'--k');
ax=gca; ylabel('Power (MW)'); xlabel('Windspeed (km/h)')
var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power','powerCurve'};
a=sprintf([num2str(nansum(t.Number_of_turbines)) '\t windfarms\n']);
for i=1:numel(var_test)
tmp = nansum(t.Number_of_turbines(all(isnan(t.(var_test{i})),2)));
a=[a sprintf([num2str(tmp) '(' num2str(100*tmp/nansum(t.Number_of_turbines)) 'perc)\t windfarms without ' var_test{i} '\n' ])];
end
disp(a)
42231 windfarms 65(0.15392perc) windfarms without turbine_sweptArea 65(0.15392perc) windfarms without turbine_capacity 13532(32.0428perc) windfarms without Hub_height 0(0perc) windfarms without Number_of_turbines 65(0.15392perc) windfarms without Total_power 9325(22.0809perc) windfarms without powerCurve
Old Illustration
% var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power'};
% figure('position',[0 0 1000 1000]);
% for i1=1:numel(var_test)
% for i2=(i1+1):numel(var_test)
% subplot(numel(var_test),numel(var_test),i2+(i1-1)*numel(var_test)); hold on
% plot(t.(var_test{i2}),t.(var_test{i1}),'.k');
% if i2==i1+1, xlabel(strrep(var_test{i2},'_',' ')); ylabel(strrep(var_test{i1},'_',' ')); end
% l=lsline; l.Color='r';
% box on;
% end
% end
Create new variable for imputated value
tim=t;

Windfarm level: Number_of_turbines Turbine_capacity and Total_power

First, we deal with value at the windfarm level. Three variables are linked, with total power = number_of_turbine x turbine_capacity.
Check occurane of nan with either/or these two variable.
X=[tim.Number_of_turbines tim.Total_power tim.turbine_capacity];
[a1,~,c] = unique(isnan(X),'rows');
table(~a1(:,1), ~a1(:,2), ~a1(:,3) ,histcounts(c)','variableNames',{'Number of turbine','Total power','Turbine capacity','Number'})
ans = 1×4 table
 Number of turbineTotal powerTurbine capacityNumber
111112518
For all the missing windfarm, we missing two variables, so we can't fill them up easily.
We first fill-up Number_of_turbines and Total_power at the same time.We perform the prediction for both variable with a fglm
mdl = fitglm(tim.Number_of_turbines, tim.Total_power)
mdl =
Generalized linear regression model: y ~ 1 + x1 Distribution = Normal Estimated Coefficients: Estimate SE tStat pValue ________ ______ ______ __________ (Intercept) 364.57 53.021 6.876 6.4498e-12 x1 1698.6 10.641 159.63 0 12518 observations, 12516 error degrees of freedom Estimated Dispersion: 1.87e+07 F-statistic vs. constant model: 2.55e+04, p-value = 0
[ypred,yci] = predict(mdl,tim.Number_of_turbines(isnan(tim.Total_power),:));
tim.Total_power(isnan(tim.Total_power)) = ypred;
 
mdl2 = fitglm(tim.Total_power,tim.Number_of_turbines)
mdl2 =
Generalized linear regression model: y ~ 1 + x1 Distribution = Normal Estimated Coefficients: Estimate SE tStat pValue _________ __________ ______ ______ (Intercept) 0.97952 0.024067 40.7 0 x1 0.0003948 2.4732e-06 159.63 0 12518 observations, 12516 error degrees of freedom Estimated Dispersion: 4.35 F-statistic vs. constant model: 2.55e+04, p-value = 0
[ypred,yci] = predict(mdl2,tim.Total_power(isnan(tim.Number_of_turbines),:));
tim.Number_of_turbines(isnan(tim.Number_of_turbines)) = round(ypred);
Ilustration
figure('position',[0 0 1000 300]);
subplot(1,2,1); hold on; box on;
plot(t.Total_power,t.Number_of_turbines,'.k'); l=lsline; l.Color='r';
plot(tim.Total_power(isnan(t.Total_power)|isnan(t.Number_of_turbines)),tim.Number_of_turbines(isnan(t.Total_power)|isnan(t.Number_of_turbines)),'.r');
xlabel('Total power (kW)'); ylabel('Number of turbines');
Then, we fill-up turbine capacity
Wind turbine capacity is directly related to total power and number of windturbine
tim.turbine_capacity(isnan(tim.turbine_capacity)) = tim.Total_power(isnan(tim.turbine_capacity)) ./ tim.Number_of_turbines(isnan(tim.turbine_capacity));
Illustration
figure('position',[0 0 1000 300]);
subplot(1,2,1); hold on
plot(t.Total_power ./ t.Number_of_turbines , t.turbine_capacity , '.k' ); l=lsline; l.Color='r';
plot(tim.Total_power(isnan(t.turbine_capacity)) ./ tim.Number_of_turbines(isnan(t.turbine_capacity)) , tim.turbine_capacity(isnan(t.turbine_capacity)) , '.r' );
xlabel('Total power / Number of turbines (kW)'); ylabel('Turbine capacity (kW)'); box on;

Windturbine level: Hub_height and turbine_sweptArea

At the windturbine level, we are missing a lot of hub height. Hub height is well related to turbine capacity and swept area.
Check occurane of nan for the three variable
X=[tim.turbine_sweptArea tim.turbine_capacity tim.Hub_height];
[a1,~,c] = unique(isnan(X),'rows');
table(~a1(:,1), ~a1(:,2), ~a1(:,3) ,histcounts(c)','variableNames',{'Swept area','Turbine capacity','hub height','Number'})
ans = 4×4 table
 Swept areaTurbine capacityhub heightNumber
11118167
21104185
3010165
40001
Hub height can be determined from swept area and/or turbine capacity for 4K cases.
First, we build a glm with turbine_capacity and turbine_sweptArea and predict only for nan value in Hub_height:
mdl = fitglm([tim.turbine_sweptArea tim.turbine_capacity],tim.Hub_height)
mdl =
Generalized linear regression model: y ~ 1 + x1 + x2 Distribution = Normal Estimated Coefficients: Estimate SE tStat pValue _________ __________ ______ ___________ (Intercept) 49.763 0.46652 106.67 0 x1 0.0052245 0.00013783 37.905 9.2783e-290 x2 0.0073252 0.00048016 15.256 7.805e-52 8167 observations, 8164 error degrees of freedom Estimated Dispersion: 330 F-statistic vs. constant model: 6.34e+03, p-value = 0
[ypred,yci] = predict(mdl,[tim.turbine_sweptArea(isnan(tim.Hub_height),:) tim.turbine_capacity(isnan(tim.Hub_height),:)]);
ypred(ypred>max(tim.Hub_height))=max(tim.Hub_height); % Avoid missleading value of hubheight
tim.Hub_height(isnan(tim.Hub_height)) = ypred;
Then, we build a glm with turbine_capacity and predict only for nan value in Hub_height:
mdl = fitglm(tim.turbine_capacity,tim.Hub_height)
mdl =
Generalized linear regression model: y ~ 1 + x1 Distribution = Normal Estimated Coefficients: Estimate SE tStat pValue ________ __________ ______ ______ (Intercept) 47.962 0.30583 156.83 0 x1 0.023158 0.00015658 147.9 0 12352 observations, 12350 error degrees of freedom Estimated Dispersion: 270 F-statistic vs. constant model: 2.19e+04, p-value = 0
[ypred,yci] = predict(mdl,tim.turbine_capacity(isnan(tim.Hub_height),:));
% ypred(ypred>max(tim.Hub_height))=max(tim.Hub_height); % Avoid missleading value of hubheight
tim.Hub_height(isnan(tim.Hub_height)) = ypred;
Finally, we build a glm with turbine_capacity and predict only for nan value in turbine_sweptArea:
mdl = fitglm(tim.turbine_capacity,tim.turbine_sweptArea);
[ypred,yci] = predict(mdl,tim.turbine_capacity(isnan(tim.turbine_sweptArea),:));
% ypred(ypred>max(tim.Hub_height))=max(tim.Hub_height); % Avoid missleading value of hubheight
tim.turbine_sweptArea(isnan(tim.turbine_sweptArea)) = ypred;
Ilustration
figure('position',[0 0 1000 300]);
subplot(1,2,1); hold on
plot(t.turbine_sweptArea,t.Hub_height,'.k'); l=lsline; l.Color='r';
plot(tim.turbine_sweptArea(isnan(t.Hub_height)),tim.Hub_height(isnan(t.Hub_height)),'.r');
xlabel('Turbine swept area (m^2)'); ylabel('Hub height (m)'); ylim([0 180]); xlim([0 20000])
box on;
subplot(1,2,2); hold on
plot(t.turbine_capacity,t.Hub_height,'.k'); l=lsline; l.Color='r';
plot(tim.turbine_capacity(isnan(t.Hub_height)),tim.Hub_height(isnan(t.Hub_height)),'.r'); ylim([0 180]); xlim([0 8000])
xlabel('Turbine capacity (kW)'); ylabel('Hub height (m)');
box on;
figure('position',[0 0 700 700]); hold on;
h = worldmap([min(tim.Latitude)-2 max(tim.Latitude)+2], [min(tim.Longitude)-2 max(tim.Longitude)+2]);
setm(h,'frame','on','grid','off'); set(findall(h,'Tag','MLabel'),'visible','off'); set(findall(h,'Tag','PLabel'),'visible','off')
bordersm('countries','facecolor',[228 238 243]./255);
% surfm(g.lat,g.lon,turbineSweptAreaMap)
scatterm(t.Latitude, t.Longitude, [], t.Hub_height,'.');
c=colorbar; c.Label.String='Hub_height (m)';
We can then assess the missing value in the new imputated table
var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power'};
a=sprintf([num2str(size(tim,1)) '\t windfarms\n' ]);
for i=1:numel(var_test)
a=[a sprintf([num2str(sum(all(isnan(tim.(var_test{i})),2))) '\t windfarms without ' var_test{i} '\n' ])];
end
disp(a)
12518 windfarms 1 windfarms without turbine_sweptArea 1 windfarms without turbine_capacity 1 windfarms without Hub_height 1 windfarms without Number_of_turbines 1 windfarms without Total_power
The remaining missing data (if any) can be filled with the median value.
for i=1:numel(var_test)
tim.(var_test{i})(isnan(tim.(var_test{i})))=nanmedian(tim.(var_test{i}));
end

Power Curve

To input the power curve, we parametrize the power curve function based on its max value which corresponds to the windturbine capacity.
We first build a power curve template based on the median value of all windfarm (note that we use tim here)
powerCurve_template = nanmedian(tim.powerCurve'./max(tim.powerCurve,[],2)',2);
figure('position',[0 0 900 300]); hold on
plot(powerCurve.ws_smooth,(powerCurve.Power_smooth'./max(powerCurve.Power_smooth,[],2)'),'color',[.8 .8 .8])
plot(powerCurve.ws_smooth, powerCurve_template,'k','linewidth',2)
xlabel('windspeed (m/s)'); ylabel('Power'); title('Power curve normalized by its max value')
The maximum value of the powercurve is well related to the turbine capacity
Use GLM to impute max powercurve based on turbine capacity
mdl = fitglm(tim.turbine_capacity,max(tim.powerCurve,[],2) );
[ypred,yci] = predict(mdl,tim.turbine_capacity(isnan(max(tim.powerCurve,[],2)),:));
% ypred(ypred>max(tim.powerCurve(:)))=max(tim.powerCurve(:));
tim.powerCurve(isnan(max(tim.powerCurve,[],2)),:) = powerCurve_template' .* ypred;
figure; hold on; box on;
plot(max(t.powerCurve,[],2),t.turbine_capacity,'.k');l=lsline; l.Color='r';
plot(max(tim.powerCurve(isnan(max(t.powerCurve,[],2)),:),[],2),t.turbine_capacity(isnan(max(t.powerCurve,[],2))),'.r');
xlabel('Max Power Curve (kW)'); ylabel('Turbine Capacity (kW)')

Windfarm database characteristics

disp(['Number of Windfarms: ' num2str(height(tim))])
Number of Windfarms: 12518
disp(['Number of Windturbines: ' num2str(nansum(tim.Number_of_turbines))])
Number of Windturbines: 42696
disp(['Total power: ' num2str(nansum(tim.Total_power*1000/1e9))])
Total power: 77.0891
Group by country
tim.Total_sweptArea = tim.turbine_sweptArea.*tim.Number_of_turbines;
groupsummary(tim,'Country','sum',{'Number_of_turbines' 'Total_power','Total_sweptArea'})
ans = 11×5 table
 CountryGroupCountsum_Number_of_turbinessum_Total_powersum_Total_sweptArea
1'Austria'1331479201.4496e+05
2'Belgium'26081118390505.2464e+06
3'Czech Republic'451242228906.5768e+05
4'Denmark'3104953838409.3967e+05
5'France'142176141.6036e+074.7636e+07
6'Germany'9703304725.3427e+071.5217e+08
7'Luxembourg'26741535004.4892e+05
8'Netherlands'624175531577108.3218e+06
9'Poland'5050911068553.6533e+06
10'Spain'477746394101.7896e+06
11'Switzerland'1937750502.0912e+05
*GroupCount=number of windfarm
Distance to cast
load('coastlines.mat')
tmp = pdist2([tim.Latitude tim.Longitude],[coastlat coastlon], @lldistkm);
tim.distCoast = min(tmp,[],2);
hh = repelem(tim.Hub_height,tim.Number_of_turbines);
figure('position',[0 0 800 400]);
histogram(hh); ylabel('Number of windturbines'); xlabel('Hub Height (m)');
legend(['M=' num2str(mean(hh)) ' ; SD=' num2str(std(hh)) ])
rr = repelem(tim.turbine_rotorRadius,tim.Number_of_turbines);
hhhh = repelem(tim.Hub_height,tim.Number_of_turbines);
h=0:200;
tmp = real(2*sqrt(rr.^2 - (h-hhhh).^2));
tmp = tmp ./ sum(tmp,2) .* rr.^2*pi;
figure('position',[0 0 800 400]);
subplot(1,2,1); barh(h,nansum(tmp))
ylabel('Height above ground level (m)'); xlabel('Sum of area (m^2)');
subplot(1,2,2); plot(h,cumsum(nansum(tmp))./sum(tmp(:),'omitnan'))
xlabel('Height above ground level (m)'); grid on; axis tight; xline([60 150])
dd = repelem(sqrt(tim.turbine_sweptArea/pi)*2,tim.Number_of_turbines);
figure('position',[0 0 800 400]);
histogram(dd); ylabel('Number of windturbines'); xlabel('Swept diameter (m)');
legend(['M=' num2str(mean(dd)) ' ; SD=' num2str(std(dd)) ])

Save

save('data/windfarms_processed.mat', 'tim')