# Cost-optimized probabilistic maintenance for
condition monitoring of wind turbines with rare failures

Viktor Begun and Ulrich Schlickewei  Technische Hochschule Ingolstadt,
Esplanade 10, D-85049 Ingolstadt, Germany

###### Abstract

We propose a method, a model, and a form of presenting model results for
condition monitoring of a small set of wind turbines with rare failures. The
main new ingredient of the method is to sample failure thresholds according to
the profit they give to an operating company. The model is a multiple linear
regression with seasonal components and external regressors, representing all
sensor components except for the considered one. To overcome the scarcity of
the training data, we use the median sensor values from all available turbines
in their healthy state. The cumulated deviation from the normal behavior model
obtained for this median turbine is calibrated for each turbine at the
beginning of the test period and after known failures. The proposed form of
presenting results is to set a scale for possible costs, control for random
maintenance, and show a whole distribution of costs depending on the free
model parameters. We make a case study on an open dataset with SCADA data from
multiple sensors and show that considering the influence of turbine components
is more critical than seasonality. The distribution, the average, and the
standard deviation of maintenance costs can be very different for similar
minimal costs. Random maintenance can be more profitable than reactive
maintenance and other approaches. Our predictive maintenance model outperforms
random maintenance and competitors for the whole set of considered turbines,
giving substantial savings.

Keywords: imbalanced dataset, reliable machine, time series, change detection,
DI-CUSUM.

## 1 Introduction

The worldwide use of wind energy is continuously growing. In 2000, electricity
generation by wind was only about 30 TWh, accounting for a mere 0.2% of the
global power share. However, by 2022, it increased to more than 2 000 TWh and
a market share of 7.6% [1]. In countries like Germany and the UK, wind power
accounts for more than 20-30% of electricity generation. This rate is even
higher for smaller countries with large wind resources and installed wind
power capacities, like Ireland and Uruguay – 33% in both countries and 55% in
Denmark [1].

As this growth unfolds, there is an inevitable increase in the demand to
decrease operation and maintenance costs (O&M). One can estimate the need by
looking at O&M as a ratio to the levelized cost of energy (LCOE). According to
[2], the median O&M/LCOE for wind energy was 24% in 2020. It is lower than for
nuclear energy worldwide, which is 38%, but still higher than for current
methods extracting electricity from solar energy and gas - 13% and 11%
respectively. Therefore, it is desirable to decrease O&M costs for wind
turbines further. A tool for this purpose is condition monitoring (CM). By CM
we mean not only detecting errors in real-time, but also predicting errors
well in advance.

A choice of a CM approach largely depends on the specific task and available
data. We will deal with a few highly reliable wind turbines with a rotor
diameter of 90 meters and 2 MW rated power situated offshore. These conditions
mean that the task is to predict a few failures well in advance and choose a
cost-optimal maintenance strategy. The corresponding data are sensor values,
which depend on time, are seasonal, unlabeled, partly correlated, and
imbalanced. Then, a method to work with such data should be a multi-component
approach containing a normal behavior model (NBM), an appropriate measure of
deviation from NBM, and an alarm decision mechanism for anomaly detection.

There are many ways to build an NBM, for example, to use Kalman filter [3, 4],
regression [5, 6], auto-regression [7], support vector regression, SVR [8],
use bond graphs [9], isolation forest [10], random forest [11], also gradient
boosting decision tree and extreme gradient boosting, XGBOOST [12]. One can
also use different neural network architectures and their combinations, like
perceptron [7, 13], deep belief network [14], denoising autoencoder [15], a
convolutional neural network, CNN, together with gated recurrent units (GRU),
and with a perceptron [16], or deep autoencoder and GRU [17], or just GRU
[18], and so on. This variety suggests that every method used for time series
prediction can also be used to make an NBM of a wind turbine.

The most popular deviation measure is the number of standard deviations above
the mean. One also uses anomaly rate and more sophisticated measures like the
average path length of a binary search [10] and Eucledian or Machalanobis
distance between normal and faulty points, see Refs. [9] and [12, 14, 17]. A
deviation measure can be a score obtained by filtering using a kernel-based
algorithm [5, 8], a linear combination of features, novelty index, and
principal component analysis, PCA [8]. One can introduce time dependence for
all the above approaches within a moving time interval and through confidence
levels, for example, by using an exponential weighted moving average (EWMA)
and other control charts [6, 11, 15, 16].

The number of possibilities for alarm mechanisms is much smaller. Most
frequently, one uses some fixed threshold but also adaptive or time-dependent
threshold, EWMA confidence intervals [16, 18], or a combination of some known
algorithm with machine learning, as in Ref. [17]. Another less popular but
powerful way to encode custom decision rules is to use fuzzy logic [19, 20].
If there is enough data, any classification approach in the range from a
logistic regression to a more sophisticated machine learning algorithm may
work. For extensive reviews of possible CM methods, see, for example, Refs.
[21, 22, 23, 24, 25, 26, 27, 28, 29].

We decided to use the Prophet [30] model as a basis for our NBM because
Prophet is a regression model that explicitly addresses seasonality and cross-
correlations between different parts of a turbine and is already successfully
used for wind turbines, see Refs. [31, 32, 33]. For anomaly detection, we
develop our own procedure, which consists of three main steps: making a
patchwork (Frankenstein111A fictional character which first appeared in Mary
Shelley’s novel ”Frankenstein or The Modern Prometheus”.) turbine for
training, accumulating deviations between data and forecast, and raising the
alarm when it is economically reasonable for a turbine owner. The Frankenstein
turbine is made as a median sensor value from available turbines in their
healthy state. The accumulated deviation in our model is a cumulated sum
(CUSUM) of deviations, which is calibrated (paused and then restarted with a
new mean) after known failures. For different CUSUM applications, see Refs.
[3, 4, 6, 11, 12, 34, 35].

Due to the scarcity of failures in our data, we do not fix an alarm threshold
as in the above references but sample it with probabilities defined by the
profit obtained for the taken threshold in the training data. We also propose
to introduce a scale to judge the quality of obtained results between the best
theoretically possible savings (maximal savings) and a case when every failure
is allowed to happen and then repaired (reactive maintenance). We especially
emphasize the importance of controlling for a case where turbines are
inspected randomly with some frequency (random maintenance). During our
research, we also noticed that most authors presented only the best results
for specially optimized hyperparameters (min(cost)). It limits the
possibilities of comparisons between different models and datasets. Therefore,
we propose to explain and fix the hyperparameters of a model according to the
taken assumptions and display the entire distribution of results as a function
of other parameters. This distribution will also allow the calculation of
average and standard deviation, which a model can produce.

We make a case study using an open data set [36] from Energias de Portugal
(EDP) to carry out a proof of concept. We found 28 works where the EDP data
were analyzed, see journal publications [34, 35, 38, 39, 40, 41, 42, 43, 44,
37], conference proceedings [15, 48, 49, 50, 51, 52, 53, 54, 55, 45, 46, 47],
a PhD [56], three master-thesis [57, 58, 59], and two arXiv preprints [60,
61]. However, only four of them presented the results of their algorithms in
terms of savings measured in Euro [34, 35, 47, 57]. Among them, only three
report values for Hydraulic Group [34, 47, 57], which we decided to analyze.

Our approach allows us to be one of the few who have solved this challenge up
to the final costs. We found that random maintenance may be a good solution in
many cases, a min(cost) may be much smaller than an average cost, and we
obtain the best min(cost) for Hydraulic Group among competitors for the total
set of turbines. Our model allows straightforward usage for other sensor
groups. A complete solution requires one more step – a decision algorithm that
tells which group of sensors signals a true error if there are simultaneous
signals from several groups. We briefly discuss how this can be done in
summary but leave this study for future research.

The paper is organized as follows: Section 2 describes the main properties of
the EDP data, which determined how we constructed our model. Section 3
describes the model and all its elements. Section 4 shows the model results,
while Section 5 concludes the paper. Details about CUSUM are moved to
appendices.

## 2 Data

Due to the commercial sensitivity of the information contained in technical
datasets, companies and firms that possess operational and failure data
exhibit a profound reluctance to share such information. However, open data
are very important for developing effective algorithms and comparing their
results, see discussions in Refs. [62, 63, 64, 65]. That is why we use the EDP
data for the analysis [36].

###  2.1 Description of the EDP data

EDP provides data from 5 out of 16 wind turbines with 2 MW rated power in an
offshore wind park. Each turbine produces three types of data: sensors, logs,
and failures. There is also sensor data from a meteorological mast (metmast).
Sensors are the signals from the Supervisory Control and Data Acquisition
(SCADA) system, which measures temperature, voltage, rotation speed, and
similar. Metmast repeats some SCADA sensors of a turbine but gives more
detailed information about the weather. It is also available when a particular
turbine is not working. Logs are short text messages from a turbine. They
arrive when extraordinary events happen and are timestamped with 1-second
precision. They can be a source of valuable information, but they often repeat
some SCADA sensors, such as Gen.ext.vent.2,
temp:$65\text{\,}\mathrm{\SIUnitSymbolCelsius}$. Logs also come more rarely -
3 logs per turbine per hour on average, while sensor signals come with
10-minute frequency, i.e., 6 per hour. Moreover, each turbine has 83 sensors,
which makes the information from sensors 83*6/3 = 166 times more abundant than
from logs. Messages listed as failures by EDP have the same format as logs.
Thus, failures are the most dangerous logs. We use only sensors and failures
in this paper.

EDP is interested in finding failures in 5 components: Gearbox, Generator,
Generator Bearing, Hydraulic Group, and Transformer, and 16 of the 83
available sensors are associated by EDP with one of these five components. The
number of sensors in each component ranges from 1 for the Hydraulic Group to 8
for the Generator. There are also 83-16=67 sensors in other components such as
the Ambient, Blades, Controller, Grid, Nacelle, Production, Rotor, and
Spinner. They constitute a sixth group, distinct from 5 selected components.

The data span over two full years from 01.01.2016 to 31.12.2017. We found two
different time splits in the literature: one using the data from 2016 for
training and the data from 2017 for testing, see Refs. [47, 57], and another
using 1 year and 8 months from January 1, 2016, to August 31, 2017, for
training, and the remaining 4 months from September 1, 2017 to December 31,
2017, for testing, see Refs. [34, 35]. In order to compare with both found
data splits, we split into 3 parts: training (train) and two test periods in
2017: a test1 ranging for 8 months from January 1 to August 31, 2017, and a
test2 ranging for 4 months from September 1 to December 31, 2017. Then, the
split in the Refs. [47, 57] corresponds to the sum of two of our periods,
test1 \+ test2, which we shortly call test1+2, and the split in the Refs. [34,
35] corresponds to the test2, while we have one more testing period, test1.
Having two test periods in 2017 makes even more sense for the Hydraulic Group
because, with this split, the failures are distributed more homogeneously, see
Tables 1 and 2. Thus, we only trained on the data from 2016 and then tested on
3 testing sets: test1, test2, and the combined test1+2.

###  2.2 Scarcity of the failure data

Available turbines are called T01, T06, T07, T09 and T11. They fail very
rarely and rather chaotically. There are only 28 failures in the 5 selected
components in 2 years, see Table 1, and no failures were reported outside of
these components. The frequency of failures is then 28/5/2=2.8 failures per
component per year.

Group |  train: year 2016 |  test1: Jan-Aug 2017 |  test2: Sep-Dec 2017
---|---|---|---
Gearbox |  T01 |  – |  – |  T09 |  – |  – |  – |  – |  – |  – |  – |  T06 |  – |  T09 |  –
Generator |  – |  T06x5 |  – |  – |  T11 |  – |  – |  T07 |  – |  – |  – |  – |  – |  – |  –
Generator Bearing |  – |  – |  T07 |  T09x3 |  – |  – |  – |  T07 |  T09 |  – |  – |  – |  – |  – |  –
Hydraulic Group |  – |  T06 |  – |  – |  T11 |  – |  T06 |  T07 |  – |  T11 |  – |  – |  T07 |  T09 |  T11
Transformer |  – |  – |  T07x2 |  – |  – |  T01 |  – |  – |  – |  – |  – |  – |  – |  – |  –
Table 1: Failing turbines in train, test1 and test2-period. The x2, x3 and x5
symbols mean 2, 3, and 5 failures for a same turbine.

The component with the largest total number of failures is the Hydraulic
Group. It has 8 out of 28 failures or 4 failures per year on average. One can
also see that the failures are distributed very non-homogeneously. The
Hydraulic Group failed only 2 times in 2016 (in train) but 6 times in 2017 (in
test1+2). However, there is also an opposite case - the Generator failed 6
times in 2016 and only once in 2017. Looking more precisely at failures in the
Hydraulic Group, one can see that there are 4 different types of these 8
failures: ’Oil leakage in Hub’ (3 times), ’Hydraulic group error in the brake
circuit’ (3 times), and also ’Error in pitch regulation’ (once) and ’Pitch
position error related GH’ (once).

Moreover, these failures are non-homogeneously distributed among turbines, see
Table 2.

Turbine |  train: year 2016 |  test1: Jan-Aug 2017 |  test2: Sep-Dec 2017
---|---|---|---
T01 |  – |  – |  –
T06 |  Error in pitch regulation |  Oil leakage in Hub |  –
T07 |  – |  Oil leakage in Hub |  Oil leakage in Hub
T09 |  – |  – |  Pitch position error related GH
T11 |  Hydraulic group error in the brake circuit |  Hydraulic group error in the brake circuit |  Hydraulic group error in the brake circuit
Table 2: Description of failures in logs for Hydraulc Group .

A similar situation is with other components. We see the scarcity of failure
data as the most important challenge in analyzing the EDP data. Then, dealing
with this challenge is more important than predicting a failure in a
particular component. The Hydraulic Group is the component with the largest
number of failures. Therefore, we decided to study only the Hydraulic Group in
this paper and develop a model that can also be applied to other components.

###  2.3 Seasonality of the data

Another important property of the EDP data is its seasonality, see Fig. 1.

Figure 1: Seasonality in the EDP data. Left: hydraulic oil temperature,
outside (ambient) temperature, and wind speed (top to bottom). The units are
degrees Celsius for temperatures and meters per second for the wind speed.
Right: daily seasonality, the same sensors as left, but averaged over all days
in ”summer” (June to November, solid lines) and in ”winter” (December-May,
dashed lines).

In the left figure, one sees yearly seasonality. The sensor values are first
averaged across all five available turbines. Subsequently, a 15-day moving
average is applied to the averaged data. One can see a strong seasonality for
temperatures but rather a chaotic pattern for the wind speed. The oil
temperature resembles the outside temperature but is about 20 degrees higher
and has more fluctuations. The apparent source of larger fluctuations in the
oil temperature is the changing wind speed, but one can see that it is not the
only source. There is a cooling and heating device in the turbine, and many
other components produce heat, like the Transformer or cool hydraulic oil, by
switching gears to lower rotation speeds in some working modes.

The Fig. 1 right shows daily seasonality. These are the same data as in Fig. 1
left, but grouped by the time of day and further averaged over ”summer” and
”winter”. We made this split because Fig. 1 left shows only two seasons per
year, one with high and another with low temperatures, and the crossing point
is around June. The three selected sensor measurements show a strong and
different daily seasonality. Surprisingly, there is no difference between the
average wind speeds during a day in ”summer” and ”winter”. On the contrary,
the difference in the ambient temperature during the day is larger in
”summer”, and the difference in the oil temperature is larger in ”winter”.

###  2.4 EDP-cost function for Hydraulic Group

EDP provides its cost function, defined as a set of rules, that read for the
hydraulic group as follows:

$\displaystyle TP_{savings}$ $\displaystyle\leavevmode\nobreak\
=\leavevmode\nobreak\ 17\,000\,\text{\texteuro}*N_{TP}*\frac{\Delta
t}{60}\leavevmode\nobreak\ ,\qquad 2<\Delta t\leq 60\leavevmode\nobreak\ ,$
(1) $\displaystyle FP_{cost}$ $\displaystyle\leavevmode\nobreak\
=\leavevmode\nobreak\ 2\,000\,\text{\texteuro}*N_{FP}\leavevmode\nobreak\ ,$
(2) $\displaystyle FN_{cost}$ $\displaystyle\leavevmode\nobreak\
=\leavevmode\nobreak\ 20\,000\,\text{\texteuro}*N_{FN}\leavevmode\nobreak\ ,$
(3) $\displaystyle Savings$ $\displaystyle\leavevmode\nobreak\
=\leavevmode\nobreak\ TP_{savings}-FP_{cost}-FN_{cost}\leavevmode\nobreak\ ,$
(4) $\displaystyle TotalSavings$ $\displaystyle\leavevmode\nobreak\
=\leavevmode\nobreak\
\sum_{turbine=1}^{5}Savings_{turbine}\leavevmode\nobreak\ .$ (5)

where $TP$, $FP$, $FN$ and $N_{TP}$, $N_{FP}$, and $N_{FN}$ are true positive,
false positive, false negative, and their number correspondingly. The numbers
that are written in Eqs. (1-3) are the costs in euros, $\Delta t$ is the
integer number of days before a failure, $\Delta t\in\mathbb{Z}$. If an alarm
is raised outside of the time window of $\Delta t=(2,60]$ days, then this
alarm is treated as $FP$ and costs $2\,000$ €. Note that $TN$ \- true negative
is not mentioned. The price of $FP$ is 10 times smaller than that of $FN$,
which means it is cheaper to have several $FP$s if it allows not to miss a
failure, the $FN$. Therefore, any standard classifier alone can not be used.
One has to calculate the price.

###  2.5 Data preparation and preprocessing

The main preprocessing step is that instead of 5 partly healthy turbines, we
create one healthy patchwork Frankenstein turbine. It is reasonable because
all the turbines are of the same type, from the same producer, presumably of
the same age, and situated in the same place. Then, each healthy turbine
represents a possible reaction of this type of turbine to the environmental
conditions in the given place and moment. Then, the problem is finding healthy
periods for each turbine. EDP rules acknowledge failure detection in a time
window of 2-60 days before a failure, while a correct prediction within the
last 2 days is treated as a false positive. Therefore, we cut out 58+2=60 days
before each failure as unhealthy. The healthy periods are green in Fig. 2
left, while unhealthy periods are yellow and red.

Figure 2: Operating phases of the turbines (left) and the number of ”healthy”
turbines (right).

If several turbines work in a healthy (green) mode, we take a median. We use
the median for several reasons: for simplicity, to filter outliers, because it
has a clear meaning, is widely implemented, and is fast. One can also take
mean values, but a median is slightly better because it corresponds to an
existing turbine sensor if there is an odd number of turbines in a healthy
mode. Thus, for each sensor, we take the median among the same sensors of all
available turbines at each time step. Note that the obtained median sensor
values in the Frankenstein turbine exhibit more fluctuations than those in the
underlying turbines, as a median is selected at every time step, which is 10
minutes for the EDP data. Additionally, different sensors may correspond to
different turbines at a particular moment.

Thus, we assume that the cut of 60 days before failures is enough to remove
the unhealthy behavior, the differences between the rest of the healthy
turbines are not important, and if an unhealthy difference appears, then it
will not happen for all turbines simultaneously and may be mitigated by taking
the median. We also drop two dead sensors, Prod_LatestAvg_ActPwrGen2 and
Prod_LatestAvg_ReactPwrGen2. In order to train our algorithm to avoid seeing a
false positive up to the end of the data, we add a fake ”failure” at the end
of each period, which has zero cost of $TP$ and $FN$ but the same price of 2
000 € for a false positive.

## 3 The model

As one may have noticed from the previous section, the EDP data set is
extensive and imbalanced, sensor values are partly correlated, and there are
also specific requirements for failure detection. Even after reducing the data
from 5 turbines into one Frankenstein turbine, dropping logs, dead sensors,
and metmast, we still have data from 81 sensors every 10 minutes. It makes 6
data points per hour, 144 per day, and 144*365 = 52 560 points per year per
sensor. This vast number of ’healthy’ points contrasts with only 2-6 failures
yearly. The failures are often unique and happen on different turbines with
different failing histories. Logs are more abundant than failures, but they
appear not for every failure, still rarely and irregularly. A turbine may
experience a minor failure, labeled by a corresponding log, during harsh
weather conditions in the summer of 2016 but may not be exposed to such
conditions until the following summer in 2017, see Figs. 1 and 2. An essential
condition is that the EDP cost function excludes failures visible less than
two days in advance and favors those visible 40-60 days in advance. Such cost
function means that EDP looks for failures, which build up slowly.
Additionally, one has to balance the effect of finding a failure with the cost
of examining a turbine.

Such a situation suggests that one needs to build a model of normal behavior,
find a measure that is sensitive to small failures but robust to random,
imperfect predictions, grows gradually and cumulatively when a turbine is
working in a failure mode, and then find a way to raise the alarm in a right
moment. Mathematically speaking, we need to find small permanent shifts in the
mean, which accumulate to a value larger than a profitable threshold. Such an
approach also allows to account for errors appearing suddenly if these
failures do not cause immediate failures but lead to a large enough
accumulated change on a scale of a few days.

###  3.1 Overview of the model

In order to solve the EDP task, we developed a multi-component approach, which
combines machine learning, quality control methods, and classical probability
theory. As a first step, we build a normal behavior model using Prophet [30].
This model can be replaced by any other machine learning model, which
adequately reflects the normal behavior of a turbine and, once trained, does
not change on a scale of weeks, regardless of the season. It is needed for two
reasons. First, a turbine has to be exposed to all possible conditions many
times so that a failure mode repeats a statistically significant number of
times. Second, we accumulate the deviations as the next step of our model. We
keep the original 10-minute resolution of the SCADA data, which means
observing a deviation from NBM for, say, 2 weeks, then we have 2 weeks * 7
days/week * 6 points/hour/day = 84 points/hour for every hour. This
accumulation of data makes a statistical analysis possible. Prophet allows
such long-term predictions without a need to update the model parameters and
enables a user to take into account seasonality and external regressors, i.e.,
the influence of other parts of a turbine, and benefit from the simplicity of
the model. It also has an open-source code written and supported by the Meta
Open Source community.

As the second part of our model, we sum up deviations from normal behavior and
raise an alarm if an accumulated deviation is too large. For this purpose, we
modified a decision interval cumulative sum (DI-CUSUM) [66] method. The
modification is that an alarm threshold is defined not as a first outlier
beyond a fixed, say, 3-$\sigma$ or 6-$\sigma$ threshold, but only when it is
profitable for EDP, considering the costs of inspection, replacement, and
repair. Using a modified DI-CUSUM allows us to deal with the scarcity of
failure data. It has only one parameter, the threshold alarm value, so fewer
failures are needed to estimate the threshold statistically.

The third part of our model is needed to deal with the dependence of a DI-
CUSUM method on the decisions made regarding failures. The problem is that
after reporting an alarm, one has to restart the recording of the accumulated
deviation with updated parameters, which may significantly influence the
possibility of raising further alarms. Therefore, we sample different alarm
thresholds with a probability, which is determined in the training stage based
on the expected cost-benefit it gives. This sampling allows us to check all
available decision paths and deliver not only the best-optimized alarm
threshold but also provide the mean value, uncertainty, and a whole
distribution of costs for our model. A cost distribution tells much more about
a model than a single result for specially tuned parameters. It is also
reasonable to expect that the cost distribution mean and uncertainty will be a
much more robust way to compare different models on the same dataset.

###  3.2 Normal behavior model

The extremely small number of failures in the EDP data appears to be
inadequate for direct training of any machine learning approach for
classifying data points as faulty or healthy or even for statistical analysis.
However, we have a lot of data in a normal state when a turbine works
normally. Therefore, one can first predict normal behavior and later examine
deviations from this normal behavior. We use Prophet [30] as NBM, and for each
sensor $i$, we make a prediction $\hat{y_{i}}$, which consists of four
components:

$\displaystyle\hat{y_{i}}(t)\leavevmode\nobreak\ =\leavevmode\nobreak\
c_{i}\leavevmode\nobreak\ +\leavevmode\nobreak\ D_{i}(t)\leavevmode\nobreak\
+\leavevmode\nobreak\ Y_{i}(t)\leavevmode\nobreak\ +\leavevmode\nobreak\
R_{i}(t)\leavevmode\nobreak\ ,$ (6)

where $c_{i}$ is called a trend, and we choose it to be a constant because we
do not see a reason why the output of a sensor could rise linearly for a long
time. Thus, $c_{i}$ means the yearly average value of a sensor $i$ in our
model. The components $D_{i}(t)$ and $Y_{i}(t)$ model daily and yearly
seasonality,

$\displaystyle D_{i}(t)$
$\displaystyle=\sum_{n=0}^{N_{dd}}\left(a_{n}\cos\left(\frac{2\pi
nt}{P_{dd}}\right)+b_{n}\sin\left(\frac{2\pi
nt}{P_{dd}}\right)\right)\leavevmode\nobreak\ ,$ (7) $\displaystyle Y_{i}(t)$
$\displaystyle=\sum_{n=0}^{N_{yy}}\left(c_{n}\cos\left(\frac{2\pi
nt}{P_{yy}}\right)+d_{n}\sin\left(\frac{2\pi
nt}{P_{yy}}\right)\right)\leavevmode\nobreak\ ,$ (8)

where $N_{dd}$ and $N_{yy}$ are the numbers of daily and yearly components,
and $P_{dd}$ and $P_{yy}$ are the daily and yearly periods. One can choose the
parameters $N_{dd}$, $N_{yy}$, $P_{dd}$, and $P_{yy}$, while the coefficients
$\\{a_{n},b_{n},c_{n},d_{n}\\}$ are found by Prophet during the fit. The
$R_{i}(t)$ are the external regressors:

$\displaystyle R_{i}(t)$ $\displaystyle=\sum_{j\neq
i}\beta_{j}y_{j}(t)\leavevmode\nobreak\ ,$ (9)

where $j\neq i$ indicates that $j$ takes all values except $i$. This condition
implies that we consider all sensors, except the selected one, as external
influences on the chosen sensor. The coefficients $\beta_{j}$ show the
relative importance of the selected sensor $y_{i}(t)$ compared to the rest of
the sensors.

We fit Prophet parameters $\\{a_{n},b_{n},c_{n},d_{n},\beta_{j}\\}$ on the
2016 (train) year using Frankenstein turbine. Then we freeze the obtained
parameters, select a sensor of interest $i$, take the measured $y_{j\neq i}$
values for all other sensors in the next 2017 year, and substitute them to
regressors $R_{i}(t)$ in Eq. (9). The obtained regressors are further
substituted to Eq. (6), and we obtain our model prediction $\hat{y_{i}}(t)$.
The residual at time t for sensor i is called $\epsilon_{i}(t)$ and is defined
as:

$\displaystyle\epsilon_{i}(t)\leavevmode\nobreak\ =\leavevmode\nobreak\
y_{i}(t)-\hat{y_{i}}(t)\leavevmode\nobreak\ .$ (10)

One may notice one more benefit from using Prophet with our Frankenstein
turbine. Prophet is essentially a Fourier expansion and a linear regression at
its core. We will use Prophet with relatively low and fixed daily and yearly
seasonality for a whole train period of one year. This means we will use
smooth functions like $\sin$ and $\cos$ for long periods, not shorter than a
day. In contrast, sudden jumps that occur during training at junctions of the
Frankenstein turbine made of healthy data appear randomly and relatively more
often with intervals of as little as 10 minutes and are therefore smothered.
However, when we use the trained model on the test data for individual
turbines, we look for permanent shifts appearing on a scale larger than a day,
which may be seen on the regularly oscillating background.

We do not normalize $y(t)$ to have the prediction in the original units and be
able to use intuition, for example, be sure that temperatures larger than,
let’s say, $300\text{\,}\mathrm{\SIUnitSymbolCelsius}$ are not ok, or
fluctuations in the size of $20\text{\,}\mathrm{\SIUnitSymbolCelsius}$ within
an hour are not normal. This absence of normalization makes the regression
coefficients $\beta_{j}$ dimensional and unconstrained by a usual condition
for correlation to be between -1 and +1. We do not use any other functionality
of Prophet, such as monthly, weekly, or other seasonality, holidays, or
special events, because we do not see enough reasons to introduce it.

An example of our prediction with Prophet is shown in Fig. 3.

Figure 3: Example of a fit with Prophet. Left, top to bottom: the measured
values $y_{i}(t)$ where $i=$Hyd_Oil_Temp_Avg, the average temperature of oil
in the hydraulic system in the EDP notations, a forecast $\hat{y}_{i}(t)$, a
forecast for the trend $c_{i}$, which is constant, and the residuals
$\varepsilon_{i}$. Right, top to bottom: the contribution of external
regressors $R_{i}$, daily and yearly components, and the same residuals as on
the left figure.

One can see that the daily component for daily=$N_{dd}$=1 is a pure sine wave
with a surprisingly small amplitude of about
$0.9\text{\,}\mathrm{\SIUnitSymbolCelsius}$. The yearly component is almost
not seen in the chosen period, and its amplitude is about
$0.25\text{\,}\mathrm{\SIUnitSymbolCelsius}$. Domination of external
regressors over seasonal components is not surprising. The external regressors
already include seasonality because it is primarily reflected in the weather
conditions that are depicted in the regressors. The seasonality components are
there to compensate for what is not adequately represented by the external
regressors. Apparently, one does not need much compensation.

We scanned the daily and yearly parameters ranging from 0 to 15 for both,
including all corresponding combinations. We were looking at the mean and
standard deviation (std) of the residuals for both test1, test2, and the
joined test1+2 period. We found that the number of daily components has a
stronger influence on mean and std as yearly components. However, std is
always larger than the difference between the obtained mean values for any
combinations. This means that a choice of the daily and yearly parameters for
the EDP data is somewhat arbitrary. It agrees with the finding that external
regressors play the crucial role, see Fig. 3. Therefore, we select
daily=yearly=1 to address seasonality with a minimal number of parameters.

###  3.3 Deviations from normal behavior model

In order to check whether our NBM describes normal behavior well and allows us
to separate it from abnormal behavior, we need to set a scale and indicators
of deviation. As the indicators, we take an average of the residuals
$\epsilon_{dd}(t)$ in a moving average window (MA) of $dd$-days and a standard
deviation, $\sigma_{dd}$, of the residuals within the same MA. After trying
different intervals, we found that visually distinct changes only occur at the
scale of an order of magnitude, such as 3 and 30 days. We took 30 days for the
MA of residuals because it is half of the maximal prediction interval of 60
days and compared it with the values for the first three days of the
measurements. We observed that the residuals are around the starting three
days average for all turbines even after two years,

$\displaystyle|\epsilon_{30}(t)|\leavevmode\nobreak\ <\leavevmode\nobreak\
\epsilon_{3}\leavevmode\nobreak\ +\leavevmode\nobreak\
3*\sigma_{3}\leavevmode\nobreak\ ,$ (11)

where $|\epsilon_{30}(t)|$ is a modulus of the average residuals in a 30-day
MA time window, while $\epsilon_{3}$ and $\sigma_{3}$ are the average residual
and standard deviation in the first 3 days of training, i.e., from 1 Jan 2016
to 3 Jan 2016. This starting standard deviation $\sigma_{3}$ is itself around
$3\text{\,}\mathrm{\SIUnitSymbolCelsius}$,

$\displaystyle\sigma_{3}\leavevmode\nobreak\ \simeq\leavevmode\nobreak\
\text{$3\text{\,}\mathrm{\SIUnitSymbolCelsius}$}\leavevmode\nobreak\ ,$ (12)

and mostly does not change in the following 30 days and for later MA periods
for all turbines for the whole two years,

$\displaystyle\sigma_{3}\leavevmode\nobreak\ \sim\leavevmode\nobreak\
\sigma_{30}(t)\leavevmode\nobreak\ ,$ (13)

where $\sigma_{30}(t)$ is a standard deviation in the 30-day MA time interval.
The $\sigma_{30}(t)$ almost does not decrease with a tendency to grow before
some failures, being always larger than
$2.1\text{\,}\mathrm{\SIUnitSymbolCelsius}$ and lower than
$7.5\text{\,}\mathrm{\SIUnitSymbolCelsius}$, which means between
$0.7*\sigma_{3}$ and $2.5*\sigma_{3}$,

$\displaystyle\text{$2.1\text{\,}\mathrm{\SIUnitSymbolCelsius}$}\leavevmode\nobreak\
<\leavevmode\nobreak\ $ $\displaystyle\sigma_{30}(t)\leavevmode\nobreak\
<\leavevmode\nobreak\
\text{$7.5\text{\,}\mathrm{\SIUnitSymbolCelsius}$}\leavevmode\nobreak\ ,$ (14)
$\displaystyle 0.7*\sigma_{3}\leavevmode\nobreak\ <\leavevmode\nobreak\ $
$\displaystyle\sigma_{30}(t)\leavevmode\nobreak\ <\leavevmode\nobreak\
2.5*\sigma_{3}\leavevmode\nobreak\ .$ (15)

This stability of the prediction and relatively small deviations mean that NBM
parameters obtained on the Frankenstein turbine in 2016 worked well for real
turbines in both years, 2016 and 2017.

Limited statistics available for turbine failures in EDP data restrict our
ability to use failures to find and label faulty deviations from normal
behavior directly. Moreover, a more precise look at the failures shows that
they may be unique because even the failures in the same category often have
different error messages, and every turbine has a unique history of failures,
which may be important. Fortunately, methods to address such problems have
already been developed because a similar situation has arisen in the
industrial production processes of goods. For example, manufacturers require a
production line that can consistently deliver the desired output. They also
need to halt production whenever any large enough deviation arises, regardless
of the cause. Once the root cause is identified, manufacturers try to
eliminate it to prevent its occurrence. This means that statistics on such
failures cannot be accumulated since they are actively addressed and resolved.
The corresponding discipline is statistical process control222There is also a
similar term – statistical quality control (SQC). The SQC has quality in the
name, so it is about the output, while SPC is about a process and an input.
Both SQC and SPC are often used interchangeably, and there is also no
difference in our context because we use the methods that are the same for
both SQC and SPC. (SPC), see, e.g. [67]. A general framework of SPC is to
monitor a deviation, set a tolerance (confidence level) threshold, and trigger
an alarm upon crossing the threshold. The simplest way to set a confidence
level in SPC is to use the number of standard deviations from an expectation.
However, it is not directly applicable because one needs to adjust the alarm
threshold to the EDP data and requirements for failure detection.

####  3.3.1 Calibrated CUSUM

A fundamental technique in SPC is the analysis of a cumulative sum (CUSUM) of
changes - residuals in our case,

$\displaystyle C_{n}(t)\leavevmode\nobreak\ =\leavevmode\nobreak\
\sum_{i=1}^{n}\epsilon(t_{i})\leavevmode\nobreak\ ,$ (16)

where $n$ is the number of time steps after starting counting deviations. A
plot of $C_{n}(t)$ with control limits (thresholds) is called a cumulative sum
control chart. An alarm is generated when $C_{n}$ reaches a control limit. One
can see from Eqs. (11), (15) that a popular control limit $\pm 3*\sigma$ would
not be reached for our NBM. Therefore, we define a proper threshold later in
Section 3.4.

Two further important steps that we take are restarting and calibrating the
CUSUM after known failures because the state of a turbine changes after
failure. Calibration means that we wait for 2 days, until a new behavior of a
turbine is established, record the residuals for the subsequent 2 days,
calculate a mean for these two latest days, and use it as a starting point,
i.e., the zero ground counting level, $\mu_{0}$, for a CUSUM,

$\displaystyle C_{n}(t)\leavevmode\nobreak\ =\leavevmode\nobreak\
\sum_{i=1}^{n}(\epsilon(t_{i})-\mu_{0})\leavevmode\nobreak\ .$ (17)

Thus, the calibration takes 4 days in total. After that time, a CUSUM is
started, and an alarm can be triggered. We checked the behavior of $C_{n}(t)$
for several possible calibration time splits and found that two days of
waiting plus two days for determining the ground level, $\mu_{0}$, is the best
for the considered dataset, while the MA interval can be still 30 days as in
our considerations at the beginning of Section 3.3. The overall effect of
restarting and calibration can be seen in Fig. 4. The T01 and T11 turbines are
selected because they have zero and a maximal number of failures in the
Hydraulic Group, correspondingly, while T07 is selected for later comparison
in Section 4.

Figure 4: Left: 30-day moving average of residuals for T01 and T11 turbines,
which restarts after failures. Right: The corresponding restarting CUSUM,
which is additionally calibrated for 2+2 days, see text. Vertical lines
indicate failures. We take the same color for all non-Hydraulic Group failures
because we look only at the Hydraulic Group in this paper, and other failures
are not supposed to be detected by our approach.

The restarting MA of the residuals on the left shows the same as restarting
and calibrating CUSUM on the right, but calibration filters and lowers the
signal while CUSUM amplifies it. For example, the visually seen persistent
drop for about $10\text{\,}\mathrm{\SIUnitSymbolCelsius}$ after the first
failure in T01 lasts for about 1 year. Without calibration, it would make a
CUSUM of $10\text{\,}\mathrm{\SIUnitSymbolCelsius}$/measure * 365 days * 144
measures/day = 525 600. This333The accumulated CUSUM deviation has a formal
measure of degrees Celsius or Kelvin because we did not standardize our
residuals by dividing on standard deviation, not to introduce a dependence on
it, because $\sigma$ is not constant. However, one may confuse the obtained
CUSUM numbers with temperature. Therefore, we imply but omit writing the
degree measure for CUSUMs. is an order of magnitude larger than the value
reached by a calibrated CUSUM for T01 in Fig. 4. A similar calculation shows
that the calibrated CUSUM has accumulated a drop in the mean temperature by 80
000 / 365 days / 144 measures/day $\simeq$
$1.5\text{\,}\mathrm{\SIUnitSymbolCelsius}$ / measure. Thus, the calibration
leads to the start of the recording of the CUSUM when the mean temperature
after failure has already dropped by
$8.5\text{\,}\mathrm{\SIUnitSymbolCelsius}$ to a new, more stable level.
Therefore, we look only at the relevant shift in mean on the scale of
$1.5\text{\,}\mathrm{\SIUnitSymbolCelsius}$, which otherwise would have been
hidden by a trivial shift for $8.5\text{\,}\mathrm{\SIUnitSymbolCelsius}$
caused by a previous failure. It means that the calibration is working as
expected.

One can also see from Fig. 4 that the CUSUM for T01, which does not have
failures in the Hydraulic Group, is larger than the CUSUM for T11, which
contains failures mainly in the Hydraulic Group. Fortunately, false positives
are cheaper than false negatives, see Section 2.4, but we still need to find a
cost-effective alarm decision mechanism.

###  3.4 Alarm decision mechanism

One may notice that a CUSUM $C_{n}(t)$ is a distance traveled by a random walk
with the steps $\epsilon(t_{i})$. Even a very tricky random walk with sudden
growths, falls, and inflection points can appear just by chance. Moreover, the
size of a possible CUSUM grows with the number of steps in one direction as
$C_{n}\sim\sigma\sqrt{n}$, where $\sigma$ is a standard deviation of the steps
$\epsilon$. Even very large random CUSUMs in one direction are possible. They
are less frequent but not excluded, see Appendix A. Therefore, it is crucial
to correctly select a moment when we need to raise an alarm.

Due to limited statistics on turbine failures in EDP data, we need an
algorithm with the lowest number of parameters, which need to be fitted.
Therefore, we take the simplest version of a CUSUM, which is a two-sided CUSUM
without a cutoff, and raise the alarm when it reaches a threshold of height
$h$. Thus, the only parameter of this method is $h$. More sophisticated
approaches can be found in Refs. [68, 69]. We make a calibration, as explained
in Section 3.3.1, therefore the CUSUM has additionally a starting mean
$\mu_{0}$ in the definition:

$\displaystyle C_{a}\leavevmode\nobreak\ =\leavevmode\nobreak\
|\sum_{i=1}^{i_{a}}(\epsilon(t_{i})-\mu_{0})\leavevmode\nobreak\
|\leavevmode\nobreak\ \geq\leavevmode\nobreak\ h\leavevmode\nobreak\ ,$ (18)

where $a$ means alarm. This method has its own name - DI-CUSUM [66], where DI
stands for a Decision Interval, where interval means the time after the last
crossing of $C_{a}$ with zero and subsequent growth until $h$ is reached, see
Appendix B.

####  3.4.1 Dependence of alarm decision on the path

The difference between our situation and the standard usage of a DI-CUSUM is
that in the case of a statistical process control, one knows the process well
and aims to raise an alarm as soon as the size of a dangerous shift is larger
than a threshold. In our case, it is not possible because we need an alarm not
as soon as we see a dangerous deviation but in a time window of 2-60 days
before a failure. Moreover, we do not know when this 2-60 days period starts
and also do not know which deviation is dangerous.

Our goal is to make a cost-effective algorithm that brings profit. Therefore,
we choose the cost of selecting a threshold, $Cost(h)$, as a performance
measure. This function is shown in Fig. 5 left. One can see three main
regions, which are easier to explain right to left: first, the threshold is
too large, the failure is not found; second, a wide range of thresholds give
profit, the profit increases linearly when thresholds decrease; third, the
threshold is too small, the failure may be found, but the costs depend
strongly on $h$ with some random pattern. In order to understand this random
pattern, let us consider two similar thresholds, $h$=14 000 and $h$=14 500,
and plot CUSUMs for them, see Fig. 5 right.

Figure 5: Left: The cost of raising the alarm as a function of the height of
the threshold $h$ for the T11 turbine in the train period. Right: CUSUM of the
residuals between our model and the actual temperature values in the Hydraulic
Group for the T11 turbine in the train period for three different alarm
thresholds $h=\infty$, $h=14\,000$, and $h=14\,500$.

The ”h=inf” line in Fig. 5 is the unaltered CUSUM, the same as in Fig. 4 for
T11. The abrupt drops of the CUSUM to zero mark the moments of restarting,
which happen either at failure or by reaching a threshold $h$. The form of the
curves is different after restarting at different thresholds. Moreover, when
we calculated the price, we saw that the $h$=14 000 leads to 22 000 € of
losses, while the $h$=14 500 threshold leads to almost maximal savings of
around 17 000 €. The reason is that $h$=14 000 triggers an alarm at the
beginning of the 60-day period, but $h$=14 000 is reached earlier and gives an
alarm earlier than 60 days. The too-early alarm gives 2 000 € of losses for
the false alarm and also 20 000 € of losses for not finding the following
failure because the value of the CUSUM after restart is not enough to trigger
one more alarm in time.

Thus, a wide range of acceptable thresholds exist. However, one can also see
from Fig. 4 that even the largest profitable threshold for T11, $h=27\,000$,
does not allow to avoid at least one false alarm for T01 because it has a much
larger CUSUM. We plot cost profiles for all turbines in Fig. 6 to find the
$h$-values, which are profitable for the largest number of available turbines
in the train period. We grouped the turbines into those that failed in the
train period (faulty) and those that did not fail in the train (healthy).

Figure 6: Cost as a function of alarm threshold $h$ for faulty (left) and
healthy (right) turbines in the train period.

One may notice from Fig. 6, left, that another faulty turbine, T06, has a
similar cost profile, while cost profiles for healthy turbines look very
different. If a turbine is healthy, then any alarm brings unnecessary
expenses, and it would be better not to make any forecasts. In other words,
reactive maintenance is the most profitable strategy for healthy turbines.
Technically, it means having an alarm threshold $h$ so large that it is never
reached. Therefore, the $Cost(h)$ for healthy turbines starts with a large
number and then drops to 0 € with growing $h$. One can also see that the wide
minimum in the $Cost(h)$ for T06 does not overlap with the minimum for T11.
This behavior is expected because these are different turbines, and the
failure logs are also different: Error in pitch regulation and Hydraulic group
error in the brake circuit, correspondingly. The cost profiles for T07 and T09
also favor larger thresholds than for T01, and a fine for false positives
disappears only after $h\gg 30\,000$ when faulty turbines give only losses.
Moreover, if the turbines have different cost profiles in the train, then one
can not exclude large differences in other periods. It means that there is no
$h$-threshold, which is the best for all turbines, and there is no guarantee
that the best $h$ found in the train will stay the best in other periods.
Therefore, we propose not to select a fixed $h$-threshold but to sample it
according to our best knowledge about profitable $h$ values.

####  3.4.2 Sample thresholds

We propose to sample $h$ with a probability proportional to the savings it
brings in the train. We accept only those $h$ that cause expected costs lower
than reactive maintenance for a faulty turbine. This requirement can be
formulated as a function of costs for each turbine ”i”:

$\displaystyle f_{i}(Cost(h))=20\,000\leavevmode\nobreak\
\text{\texteuro}\leavevmode\nobreak\ -\leavevmode\nobreak\
Cost_{i}(h)\leavevmode\nobreak\ ,$ (19)

for which we accept only those $h$ that cause $f_{i}(Cost)>0$. The upper cost
boundary of 20 000 € is the price of a false negative for one faulty turbine,
see Eq. (3). In shorter notations, the requirement for $h$ reads:

$\displaystyle h\in\\{h\mid f_{i}(Cost(h))>0\\}\leavevmode\nobreak\ .$ (20)

In order to obtain a probability distribution of acceptable thresholds, we
normalize the cost function:

$\displaystyle P_{i}(h)\leavevmode\nobreak\ =\leavevmode\nobreak\
\frac{f_{i}(Cost(h))}{\sum_{h}f_{i}(Cost(h))}\leavevmode\nobreak\ .$ (21)

The result for faulty and healthy turbines can be seen in Fig. 7, left and
right, correspondingly.

Figure 7: Probability distributions to find the best price, constructed from
the costs $Cost_{i}(h)$, see Fig. 6.

Comparing $P_{i}(h)$ for healthy and faulty turbines in Fig. 7, one may see
that $P_{i}(h)$ for healthy turbines allows large $h$ and gradually prohibits
small $h$, while $P(h)$ obtained from faulty turbines allows only moderate
$h$. Note also that the preferred $h$ are different for the faulty turbines
T06 and T11, and the overlap is relatively small. The exact form of $P_{i}(h)$
for healthy turbines is also different444One may also notice a difference in
scale for $P(h)$ for faulty and healthy turbines in Fig. 7. The difference
appears because all distributions are normalized to $1$, and the $P(h)$
distributions for healthy turbines extend long in the right direction. Then
the maximum for $P(h)$ of healthy turbines is defined by the range of $h$,
which we took as $h_{max}=150\,000$ as an acceptable round number.. This means
that the turbines fail somewhat differently, and we further need to combine
the information about failures to get some average, which can be acceptably
good for different turbine failures.

We have no information about the frequency of different failures in different
turbines, but we know they have the same producer and characteristics.
Therefore, we consider the failures as equivalent and independent and assume
that a selected $h$ may work for any turbine in the future. Thus, a final
probability of picking up the best $h$ is a sum of the probabilities to find
the best $h$ for each turbine,

$\displaystyle P(h)\leavevmode\nobreak\ =\leavevmode\nobreak\
\frac{\sum_{i}P_{i}(h)}{\sum_{h}\sum_{i}P_{i}(h)}\leavevmode\nobreak\ ,$ (22)

where we also normalized $P(h)$ to unity, see Fig. 8.

Figure 8: Probability distribution to sample an alarm threshold $h$ in our
model.

Having the distribution of thresholds $P(h)$, we can also calculate the mean
and standard deviation:

$\displaystyle\langle h\rangle\leavevmode\nobreak\ \simeq\leavevmode\nobreak\
19\,400\leavevmode\nobreak\
,\qquad\text{and}\qquad\sigma_{h}\leavevmode\nobreak\ =\leavevmode\nobreak\
\sqrt{\langle h^{2}\rangle-\langle h\rangle^{2}}\leavevmode\nobreak\
\simeq\leavevmode\nobreak\ 4\,400\leavevmode\nobreak\ ,$ (23)

where $\langle h^{n}\rangle=\sum_{h}h^{n}P(h)$. We can estimate the
sensitivity of our model using Eq. (23). For this purpose, we divide $\langle
h\rangle$ by 144 ten-minute intervals per day and by an expected permanent
shift in mean, let’s say by $10\text{\,}\mathrm{\SIUnitSymbolCelsius}$. Then,
we obtain that this shift can be seen in our model after $\langle
h\rangle$$\text{\,}\mathrm{\SIUnitSymbolCelsius}$ / (144 * intervals/day) /
$10\text{\,}\mathrm{\SIUnitSymbolCelsius}$ $\simeq$ 13 days on average.
Similarly, one can get that the minimal permanent shift in mean, that is, on
average, seen by our model 60 days after appearance, is
$2.25\text{\,}\mathrm{\SIUnitSymbolCelsius}$. One can also see from Fig. 8
that the distribution is relatively wide, with $\langle
h\rangle/4\lesssim\sigma_{h}\lesssim\langle h\rangle/2$ and non-Gaussian. For
example, no $h\sim 14\,000$ is allowed because it was not in the original
distributions for T06 and T11. The results of applying the $P(h)$ distribution
are shown in Section 4.

###  3.5 Implementation

Upon examining existing machine learning libraries with a broad scope like
scikit-learn, as well as packages dedicated to time series prediction, see a
comprehensive list and comparisons in [70], we did not find any that contain
the necessary steps in the form that we need. Therefore, we developed our own
Python classes and functions, which use different libraries to perform
required operations. The largest code-building block is Prophet [30]. We leave
only daily and yearly seasonality in Prophet and use additive external
regressors without upper or lower bounds on their values. We also used NumPy,
pandas, SciPy, Matplotlib, Seaborn, and other libraries. The most
computationally intensive part was finding the best seasonality parameters
because their total number grows quickly with adding season resolution. It
required parallelization and computing on a cluster. The rest of the
computations can be done on a laptop.

## 4 Results

It is essential to establish a reference scale to discuss the results. To
accomplish this, we propose considering three fundamental approaches to
condition monitoring: random maintenance, scheduled maintenance, and reactive
maintenance, as outlined below.

###  4.1 Baseline scenarios for comparison

####  4.1.1 Reactive maintenance

This type of maintenance is a reaction to failures that have already happened
and is also called corrective maintenance. One does not find failures,
$N_{TP}=0$, $TP_{savings}=0$, triggers no alarms and makes no inspections,
$N_{FP}=0$, $FP_{cost}=0$, let every broken component fail,
$N_{FN}=all\leavevmode\nobreak\ failures$, $FN_{cost}=N_{FN}*20\,000$ €, and
fix the results. This approach gives only losses, but the number of failures
limits them:

$\displaystyle-\leavevmode\nobreak\ Total\leavevmode\nobreak\ Savings$
$\displaystyle\leavevmode\nobreak\ =\leavevmode\nobreak\
20\,000\,\text{\texteuro}\leavevmode\nobreak\ *\leavevmode\nobreak\
\text{number of failures}\leavevmode\nobreak\ .$ (24)

The number of failures in train, test1, test2, and test1+2 is 2, 3, 3, and 6,
correspondingly, which gives the following maximal losses after reactive
maintenance:

$\displaystyle\text{{train}:\leavevmode\nobreak\
40\,000\,\texteuro}\leavevmode\nobreak\ ,$
$\displaystyle\text{{test1}:\leavevmode\nobreak\
60\,000\,\texteuro}\leavevmode\nobreak\ ,$
$\displaystyle\text{{test2}:\leavevmode\nobreak\
60\,000\,\texteuro}\leavevmode\nobreak\ ,$
$\displaystyle\text{{test1+2}:\leavevmode\nobreak\
120\,000\,\texteuro}\leavevmode\nobreak\ .$ (25)

####  4.1.2 Random maintenance

In this approach, one inspects turbines randomly but with a definite
distribution of failures [71, 72]. To select a distribution, we first
formulate our assumptions. Let us assume that inspection dates do not depend
on anything, and every day has the same probability of being selected, which
means the uniform distribution of inspections. Taking this distribution, we
sampled 12 different dates for each turbine within two years of our data. On
average, it will give one inspection per turbine per 60 days555We checked the
dependence on the number of inspections and found an optimal number of about
6-10 random inspections per year for each period except for the train. In
contrast, for the train period and more than 10 inspections in other periods,
the costs grow linearly due to the costs of false positive alarms., which
could potentially give the best possible savings, see Eq. (1). Sampling many
times from a uniform distribution, we cover even very exotic inspection
patterns and see the effect of a different distribution of failures, which
occurred in different periods. We also assume a 100% failure detection rate
for simplicity. We show the result for 10 000 inspections in the test2 (Sep-
Dec 2017) and the test1+2 period (the whole year 2017) in Fig. 9. Cost
distributions for other periods are not shown because they are similar.

Figure 9: Costs distribution of random maintenance. Left: costs for individual
turbines, where healthy turbines have a vertical filling pattern, and faulty
turbines have a horizontal pattern. Right: costs for the total number of
turbines.

One can see that the distribution for healthy turbines has always only one
maximum. The position of the mean corresponds to the number and the cost of
false alarms. On average, we generated two random inspections per four months
of the duration of the test2 period and six random inspections per one year of
the duration of the test1+2 period. This sampling leads to the average costs
of 4 000 € and 12 000 €, correspondingly. The distribution of costs for random
maintenance has a width corresponding to the probability of selecting an
inspection date within a chosen period on a scale of two years. It can be
estimated using Binomial distribution but is larger because of additional
uncertainty due to a limited number of samples. The distribution for faulty
turbines has two maxima in the short test2 period and two or three maxima in
the long test1+2 period. The reason is that there is not more than one failure
per turbine in the test2 period, but either one or two failures per turbine in
the test1+2 period. Then, there are two and three possibilities: failure found
or not in test2, and two, one, or no failure found in test1+2. The costs can
be estimated similarly to the test2 period. The sum of the costs for all
turbines is random and gives a smeared distribution. The widths of the
distributions are relatively large. Therefore, we present the mean and
standard deviation of the random maintenance costs rounded to a hundred euros:

$\displaystyle\text{{train}:\leavevmode\nobreak\ 59\,000 $\pm$
23\,500}\leavevmode\nobreak\ ,$
$\displaystyle\text{{test1}:\leavevmode\nobreak\ 36\,400 $\pm$
27\,500}\leavevmode\nobreak\ ,$
$\displaystyle\text{{test2}:\leavevmode\nobreak\ 54\,500 $\pm$
19\,700}\leavevmode\nobreak\ ,$
$\displaystyle\text{{test1+2}:\leavevmode\nobreak\ 53\,300 $\pm$
37\,800}\leavevmode\nobreak\ ,$ (26)

where the numbers are in Euro. One can see from Eq. (26) that random
maintenance is cheaper than reactive maintenance in all three possible test
periods, while in the train period, the costs of reactive maintenance are well
covered by $1\sigma$ uncertainty. This means that savings obtained by chance
can be very significant. Moreover, if one picks up only the cases that have
led to the best savings for each turbine, then one can also find the cases
with much lower costs among the performed 10 000 samples for the inspection
dates:

$\displaystyle\min(\text{{train}):\leavevmode\nobreak\
2000}\leavevmode\nobreak\ ,$
$\displaystyle\min(\text{{test1}):\leavevmode\nobreak\
-37\,000}\leavevmode\nobreak\ ,$
$\displaystyle\min(\text{{test2}):\leavevmode\nobreak\
-16\,100}\leavevmode\nobreak\ ,$
$\displaystyle\min(\text{{test1+2}):\leavevmode\nobreak\
-54\,100}\leavevmode\nobreak\ .$ (27)

With more samplings, one can push the minimal costs up to the configuration of
inspection dates, which gives a theoretical minimum of zero false positives
and all failures found precisely 60 days in advance:

$\displaystyle Maximal\leavevmode\nobreak\ Savings\leavevmode\nobreak\
=\leavevmode\nobreak\ -17\,000\,\text{\texteuro}\leavevmode\nobreak\
*\leavevmode\nobreak\ \text{number of failures}\leavevmode\nobreak\ ,$ (28)

which gives for all turbines in the considered periods:

$\displaystyle\min_{th}(\text{{train}):\leavevmode\nobreak\
-34\,000}\leavevmode\nobreak\ ,$
$\displaystyle\min_{th}(\text{{test1}):\leavevmode\nobreak\
-51\,000}\leavevmode\nobreak\ ,$
$\displaystyle\min_{th}(\text{{test2}):\leavevmode\nobreak\
-51\,000}\leavevmode\nobreak\ ,$
$\displaystyle\min_{th}(\text{{test1+2}):\leavevmode\nobreak\
-102\,000}\leavevmode\nobreak\ .$ (29)

One may see from Eqs. (25), (26), and (29) that the costs obtained randomly
span over a huge interval starting from the maximal theoretically possible
savings of 102 000 € for random maintenance to 120 000 € of losses for
reactive maintenance in the test1+2 period (the year 2017). The mean savings
for random maintenance are notably lower than reactive maintenance in all test
periods. Therefore, we conclude that it is not enough to present a result of a
model, using the argument that it was obtained using some hyperparameters.
Even if these hyperparameters are written, their choice can be somewhat
random, and the result may heavily depend on how long the authors sampled from
the parameter space. One should always control for random maintenance. The
minimal check is the comparison of model results with the average random
maintenance. Even better would also be to present a standard deviation, and
the best is to show a whole distribution of costs depending on the model
parameters because a cost distribution may be non-Gaussian and multi-modal.

There are too many turbines and cases to consider them separately. One is also
interested in the final costs for all turbines. Therefore, we chose two
turbines with interesting and somewhat opposite histories, T07 and T11, and
present results for them, as well as for all turbines together, see the next
Sections 4.2, 4.3, and 4.4.

###  4.2 A turbine with unexpected unseen failure - T07

The T07 turbine is special because it has no Hydraulic Group failures in the
train but has the same failure in both test1 and test2 periods. Moreover, the
corresponding log says that it is Oil leakage in Hub, which did not happen in
any turbine in the train period, see Tables 1 and 2. Therefore, we can check
how our model generalizes and how different period duration influences the
detection. The costs for all possible test periods and available models are
presented in Table 3, with average and standard deviation (when available)
rounded to hundreds of euros. We show the distributions of costs in the test2
and test1+2 periods in Fig. 10. We also show the same for the T11 turbine to
compare T07 and T11 better later in Section 4.3.

Figure 10: Distribution of costs in our model vs random maintenance for T07
(upper row) and T11 turbines (lower row). Two periods are considered - test2,
Sep-Dec 2017 (left), and test1+2, the whole 2017 year (right). Vertical lines
limit the range between maximal savings (dotted), which are theoretically
possible, see also $\min_{th}$ in Eq. (29), and the costs of reactive
maintenance (dashed). Up and down triangles show the mean values for random
maintenance and in our model, correspondingly. Shaded rectangles and a small
vertical line within them show interquartile range (iqr) and median,
correspondingly. Whiskers are set as minimal and maximal values.

Our model gives better results than random maintenance, especially in the
test2 period from September to December 2017. The failure of T07 is always
found in our model, while with random maintenance, the failure is sometimes
found (the maximum below zero), but sometimes not (the maximum above 20 000
€), the same as in Fig. 9 upper left for T07. The mean cost obtained in our
model is lower than the lower quartile for random maintenance.

The costs for 2017 occasionally give almost the same average in our model and
for random maintenance, while the distributions are different. There are two
failures in T07, and random maintenance gives three maxima. These maxima
correspond to the cases where both failures are found, one found but one not,
and both not found, as shown in Fig. 9 bottom left for T07. However, our model
gives only two maxima at the lowest costs, so we always find at least one of
the two failures. Note that both random maintenance and our model are much
better than reactive maintenance.

Only authors of Refs. [34] and [47] presented their results for T07. The
authors of Ref. [47] considered only the test1+2 period, while the authors of
Ref. [34] do not publish the costs in a table but show figures with alarms and
failures as a function of time. From these figures, we find the number of
false positives, $N_{FP}$, and also the approximate number of days between
alarms and failures, $\Delta t$. From these two numbers, we calculate the
costs obtained in their models in all possible test periods, see Table 3.
These costs are their best results. Therefore, we should compare them with our
best results, which give maximal savings (min(cost)) among all 10 000 samples
we have taken. The models are ranged according to the min(cost). We also added
the corresponding numbers of days between alarms and failures and the numbers
of false positives and false negatives.

Models for T07 | cost in Euro |  $\langle\Delta t\rangle$ |  $N_{FP}$ |  $N_{FN}$
---|---|---|---|---
|  average $\pm$ std |  min(cost) |  |  |
test1, Jan-Aug 2017, 1 failure
maximal savings |  -17 000 |  -17 000 |  60 |  0 |  0
random maintenance |  6 700 $\pm$ 15 500 |  -17 000 |  60 |  0 |  0
our model |  15 700 $\pm$ 14 200 |  -9 000 |  60 |  4 |  0
reactive maintenance |  20 000 |  20 000 |  0 |  0 |  1
Ref.[34]: NBM, NBM-LI, WHC-LOF |  – |  20 000 |  0 |  0 |  1
Ref.[34]: CCA, EDP |  – |  22 000 |  0 |  1 |  1
Ref.[34]: LoMST |  – |  24 000 |  0 |  2 |  1
test2, Sep-Dec 2017, 1 failure
maximal savings |  -17 000 |  -17 000 |  60 |  0 |  0
Ref.[34]: WHC-LOF |  – |  -17 000 |  60 |  0 |  0
random maintenance666The failure in T07 appears 48 days after the start of the test2 period. Therefore, the costs for random maintenance are limited by the earliest detection of 48 days and corresponding savings of 13 600 €. It is less than the earliest allowed detection in 60 days, but EDP did not mention how to count costs in this case and both Refs. [34] and [47] do not discuss this issue. Therefore, we decided to show the best results in all models. Otherwise, the failure in test2 has to be treated as not found in both Refs. [34] and [47].  |  7 100 $\pm$ 14 500 |  -13 600 |  48 |  0 |  0
Ref.[34]: LoMST |  – |  -13 583 |  55 |  1 |  0
our model |  -6 100 $\pm$ 1 800 |  -9 633 |  34 |  0 |  0
reactive maintenance |  20 000 |  20 000 |  0 |  0 |  1
Ref.[34]: NBM, NBM-LI, CCA, EDP |  – |  20 000 |  0 |  0 |  1
test1+2, year 2017, 2 failures
maximal savings |  -34 000 |  -34 000 |  60 |  0 |  0
random maintenance |  9 800 $\pm$ 21 600 |  -31 433 |  59 |  1 |  0
our model |  9 500 $\pm$ 15 000 |  -16 650 |  43.5 |  4 |  0
Ref.[34]: WHC-LOF |  – |  3 000 |  30 |  0 |  1
Ref.[34]: LoMST |  – |  10 416 |  26 |  3 |  1
reactive maintenance |  40 000 |  40 000 |  0 |  0 |  2
Ref.[47], Ref.[34]: NBM, NBM-LI |  – |  40 000 |  0 |  0 |  2
Ref.[34]: CCA, EDP |  – |  42 000 |  0 |  1 |  2
Table 3: Comparison of different models for T07 turbine in all test periods.
Columns left to right: the model; the mean and standard deviation of the cost
distribution (if available); minimal costs (min(cost)), which are also the
maximal savings; the average number of days in advance that failures were
detected, and the number of false positives and false negatives corresponding
to min(cost).

One can see from Table 3 that the failure in the test1 period is found only in
our model or randomly. This failure is the Oil leakage in Hub unseen in the
train. The average cost is relatively high. There are two reasons: first, a
problem with Hydraulic Group, which is seen at the beginning of the test1
period in Fig. 4 but was solved by an operator, which is seen from the logs
like User 0 primary access and other logs indicating manual interventions in
that period; second, there was heating in August 2017, that was caused by a
failure in generator bearing on 2017-08-20 06:08:00 with a clear log Generator
bearings damaged and the subsequent failure in the generator the next day
2017-08-21 14:47:00 with a log Generator damaged. The heating was apparently
so intense that the hydraulic oil temperature sensor also measured it.
However, the average cost is smaller than the reactive maintenance approach.
Therefore, our model is profitable in the test1 period.

The next failure with the same log appearing in the test2 period is much
better found, which can be attributed to the behavior of MA and CUSUM in Fig.
4. In the joined test1+2 period, the authors of Ref. [34] see the second
failure better than we do. However, we find both failures, which makes the
min(cost) in the joined period smaller, while our average costs are also below
reactive maintenance. Nevertheless, random maintenance is also a competitive
approach in this case.

If an algorithm is used in production, it faces not the best but all possible
situations, producing a distribution of outcomes. Therefore, we would like to
emphasize that it is very important to show not only the best results but also
to present the whole distribution of outcomes and remember to check the model
against random maintenance.

###  4.3 A turbine, which fails similarly in all periods - T11

It is interesting to look at T11 because it is the only turbine that fails in
the train, test1, and test2 periods. Moreover, the failure log is always the
same: Hydraulic group error in the brake circuit. This repetition could have
been a reason to find the failure better than for T07. Surprisingly, this is
not the case, because we found only one article considering T11, and this
article reports losses larger than reactive maintenance, see Table 4.

Models for T11 | cost in Euro |  $\langle\Delta t\rangle$ |  $N_{FP}$ |  $N_{FN}$
---|---|---|---|---
|  average $\pm$ std |  min(cost) |  |  |
test1, Jan-Aug 2017, 1 failure
maximal savings |  -17 000 |  -17 000 |  60 |  0 |  0
random maintenance |  6 800 $\pm$ 15 600 |  -17 000 |  60 |  0 |  0
our model |  400 $\pm$ 12 300 |  -13 000 |  60 |  2 |  0
reactive maintenance |  20 000 |  20 000 |  0 |  0 |  1
test2, Sep-Dec 2017, 1 failure
maximal savings |  -17 000 |  -17 000 |  60 |  0 |  0
our model |  -3 800 $\pm$ 10 500 |  -15 583 |  55 |  0 |  0
random maintenance777The failure in T11 appears 11 days after a start of the test2 period. Therefore the maximal possible savings measured within test2 by random maintenance can not exceed 3 117 €. |  20 400 $\pm$ 8 400 |  -3 117 |  11 |  0 |  0
reactive maintenance |  20 000 |  20 000 |  0 |  0 |  1
test1+2, year 2017, 2 failures
maximal savings |  -34 000 |  -34 000 |  60 |  0 |  0
random maintenance |  9 600 $\pm$ 21 600 |  -33 716 |  59.5 |  0 |  0
our model |  -5 100 $\pm$ 19 900 |  -25 750 |  52.5 |  2 |  0
reactive maintenance |  40 000 |  40 000 |  0 |  0 |  2
Ref.[47] |  – |  42 000 |  0 |  1 |  2
Table 4: Comparison of different models for T11 turbine in all test periods,
see Table 3 for description of columns.

Our model finds failures for T11 similarly well as for T07 but a little more
difficult for T11. The reason is that the corresponding CUSUM for T11 is
smaller than for T07, see Fig. 4. The reason for random maintenance is that
for T11, the failure appears only 11 days after the start of the period, while
it was 48 days for T07. Then, the chances of randomly choosing a day in this
period and the total possible savings are also correspondingly smaller. On
average, failures in T11 are found very well by our model. The mean of each
distribution is far below the reactive maintenance threshold, which means
profitability.

###  4.4 All turbines together

The sum of the results for all turbines is shown in Fig. 11 and Table 5.

Figure 11: Cost distributions for all five turbines in our model compared to
random maintenance.

The sum is shuffled, which means that each turbine is inspected individually,
and then the inspection plans for different turbines are combined randomly.

Models for all turbines | cost in Euro |  $\langle\Delta t\rangle$ |  $N_{FP}$ |  $N_{FN}$
---|---|---|---|---
|  average $\pm$ std |  min(cost) |  |  |
test1, Jan-Aug 2017, 3 failures
maximal savings |  -51 000 |  -51 000 |  60 |  0 |  0
random maintenance |  36 400 $\pm$ 27 500 |  -37 017 |  57.(6) |  6 |  0
our model |  46 200 $\pm$ 24 400 |  -18 483 |  52.(3) |  13 |  0
reactive maintenance |  60 000 |  60 000 |  0 |  0 |  3
test2, Sep-Dec 2017, 3 failures
maximal savings |  -51 000 |  -51 000 |  60 |  0 |  0
our model |  -1 700 $\pm$ 18 000 |  -37 950 |  47 |  1 |  0
random maintenance888The failures in the test2 period appear in T07, T09, and T11 only 48, 15, and 11 days after the start of the period, correspondingly. It is less than the earliest allowed detection in 60 days. Therefore, the earliest possible detection limits savings measured within the test2 period. |  54 500 $\pm$ 19 700 |  -16 116 |  23.(6) |  2 |  0
reactive maintenance |  60 000 |  60 000 |  0 |  0 |  3
test1+2, year 2017, 6 failures
maximal savings |  -102 000 |  -102 000 |  60 |  0 |  0
random maintenance |  53 300 $\pm$ 37 800 |  -54 083 |  34.1(6) |  2 |  0
our model |  34 800 $\pm$ 32 500 |  -53 083 |  44.1(6) |  11 |  0
Ref.[57] v0 |  – |  -21 342 |  40.8(3) |  24 |  0
Ref.[57] v1 |  – |  85 367 |  9.6(6) |  1 |  0
reactive maintenance |  120 000 |  120 000 |  0 |  0 |  6
Ref.[47] |  – |  132 000 |  0 |  6 |  6
Table 5: Total cost for all turbines together.

Both random maintenance and our model are profitable on average in all test
periods. The best detection time per failure is more than 40 days in all test
periods in our model. Reducing the number of false alarms may be very
profitable for long observation periods. Interquartile ranges are relatively
small, but standard deviations are large, especially whiskers extending far
away from the mean. It indicates that the distributions have heavy tails. In
other words, occasional large savings, as well as rare large losses, are
possible. The failures are better found in our model than by random
maintenance, with the most significant difference in September-December 2017.
Our model and random maintenance give better results than those found in the
literature and are below reactive maintenance, which means profitability.

## 5 Summary and outlook

We analyzed the data from a few wind turbines with long periods of normal
behavior and a few heterogeneously distributed failures [36]. Our model
consists of four parts: data preparation, normal behavior model, quantifying
deviations from normal behavior, and a probabilistic alarm decision mechanism.
First, we make one healthy ”Frankenstein” turbine for reference. We cut
presumably faulty periods for each turbine and take median values of the rest
for each sensor. Second, to disentangle the influence of different turbine
components, we treat all sensors except those chosen as external regressors in
a linear regression. Then, we use one year of ”Frankenstein” data as input to
find the regression coefficients. Using these coefficients, we predict for the
whole of the following year. For this purpose, we used the Prophet model [30],
which can handle the mentioned steps and has a built-in daily and yearly
seasonality. Third, we assume that a failure can be found as a slight
persistent shift in mean between prediction and outcome and use a cumulative
sum of residuals to find such shifts. Due to the scarcity of the failure data,
we take DI-CUSUM [66] because it has only one parameter for an alarm. We
restart and re-calibrate DI-CUSUM after known failures to reduce the number of
false positives. Fourth, to overcome the CUSUM’s dependence on the history of
previous alarms, we sample different thresholds with different probabilities.
The probabilities are proportional to the profit they give in the training
period.

In order to set a scale for comparison between different models, we defined
the lower and the upper bounds of possible acceptable maintenance costs. For
this we take the natural bounds: the theoretically possible minimum, when all
failures are found at a day of maximal savings without any false alarms -
maximal savings, and the reactive maintenance approach, when one does not make
any prediction and preventive maintenance, but pays for failures which
occurred. To control for random effects, we checked the costs of the random
maintenance.

Our model allows us to get the results for all turbines and considered
periods. We obtain the best savings for both single turbines and the total set
of turbines in all periods available for comparison with other authors, except
for one case of T07 in the test2 period. Average costs obtained in our model
are better than random maintenance in 7 out of 9 cases, and in the remaining 2
cases, both approaches agree within one standard deviation. The uncertainty is
significant because of the scarcity of input data and the simplicity of the
chosen approach, which contains only one tune parameter. However, our model
gives the results that have the mean and even the third quartile of the cost
distribution below reactive maintenance, which means profitability in most
cases. The average savings obtained for the hydraulic group amount to 85 200
Euro for the considered 5 turbines in the test year, with even more
significant potential savings of up to 173 100 Euro per year.

We want to emphasize the importance of showing not only the best results, but
also the average, standard deviation, and whole distribution of results.
Otherwise, one can achieve the best performance randomly after enough
sampling, even from a uniform distribution. This approach gives the best
minimal costs in all test periods except for the second test period. Also,
this exception appears only because of an ambiguity in counting costs in this
period. Therefore, it is important to show not only the best possible outcome
that a researcher can get for a specific data set with specially fitted hyper-
parameters, but also a whole distribution of possibilities. It is relevant
because a practitioner will use a model on similar, yet different, real-world
data. It seems impossible that a large set of tuned hyper-parameters will
coincide for different data sets. Moreover, researchers rarely publish even
the main parameters of their models. On the contrary, by publishing
distributions of results, one gives an understanding of a whole range of
possible outcomes. Such an approach improves the interpretability and
reproducibility of results.

As possible developments in the model, we would like to mention an opportunity
to further improve the costs by filtering false alarms. One can
straightforwardly use our model for other sensor groups with multiple sensors.
This usage would require the calibration of these groups as a whole and
comparison with signals from other groups. One could do this using Mahalanobis
distance or some other collective distance measure for the whole group
together with a decision mechanism that will tell in which sensor group a
failure is happening. One can also improve the existing method by considering
more sophisticated CUSUM-based approaches, which count a number of steps since
a deviation started, moving summation window (MOSUM), or decay of a signal, as
in exponentially weighted moving average (EWMA), and similar approaches.
However, one should always consider the limited number of failures, which does
not allow the introduction of too many new parameters. It would be interesting
to see whether the probability of threshold selection based on cost is a good
prior for Bayesian algorithms. It would be interesting to see how well our
approach generalizes when more information about failures becomes available.
For example, one can take a subset of turbines in a big wind farm and study
the uncertainty that appears because of a small set of turbines. The outcome
may help develop better maintenance strategies for small wind farms.

An imbalanced dataset is a very challenging but common and important case.
Large and expensive systems with many components are made to be reliable.
However, even they fail sometimes and produce precisely this type of data –
many points in normal behavior and only a few failures. The developed method
may be helpful for other expensive mechanisms with multiple sensors, such as
maritime and train engines, industrial robots, automated assembly and
production lines, and other reliable machines.

## Acknowledgments

We thank Sergiy Begun and Grygorii Shurenkov for fruitful discussions. This
research was funded by the Bavarian State Ministry of Science and the Arts
(Bayerisches Staatsministerium für Wissenschaft und Kunst).

##  Appendix A Accumulated random walk in one dimension

In this appendix, we clarify the distinction between the typical deviation of
a single measurement and much larger deviations that can result from
cumulative random walks, see [68] for more details. The values of CUSUM, which
a random walk may reach, depend on an underlying distribution, which leads to
that random walk. The simplest example of such a distribution is a Gaussian
random walk – a symmetric random walk with a step size $x$, which varies
according to a normal distribution with zero mean and standard deviation
$\sigma$:

$\displaystyle P(x)=\mathcal{N}(0,\sigma^{2})\leavevmode\nobreak\
=\leavevmode\nobreak\
\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{x}{2\,\sigma^{2}}\right)\leavevmode\nobreak\
.$ (30)

Then, after $n$ steps, the distribution of the traveled distance,
$C_{n}=\sum_{i=1}^{n}x_{i}$, the CUSUM, will be

$\displaystyle P(C_{n})=\mathcal{N}(0,n\,\sigma^{2})\leavevmode\nobreak\ .$
(31)

One can then find an average CUSUM as a root mean squared distance traveled by
a Gaussian random walk:

$\displaystyle\langle C_{n}\rangle\leavevmode\nobreak\ =\leavevmode\nobreak\
\sqrt{Var(C_{n})}\leavevmode\nobreak\ =\leavevmode\nobreak\
\sigma\sqrt{n}\leavevmode\nobreak\ .$ (32)

It means that, on average, a deviation as large as $\sigma\sqrt{n}$ can appear
randomly. One can also estimate a probable upper limit of a CUSUM using the
law of the iterated logarithm [73, 74]. The magnitude of oscillations in a
random walk, governed by a distribution with not too heavy tails and a zero
drift, is [75]:

$\displaystyle\limsup_{\begin{subarray}{c}n\to\infty\end{subarray}}|C_{n}|\leavevmode\nobreak\
=\leavevmode\nobreak\ \sqrt{2\log(\log(n))}*\sigma\sqrt{n}\leavevmode\nobreak\
.$ (33)

The $\log(\log(n))$ is a very slowly growing function. If a random walk
continues in a range of 1 to 100 days, then the maximal number of steps with
10-minute intervals in one direction is up to 144 and 14 400, correspondingly.
For such numbers, the square root with the double logarithm in (33) is
approximately constant and is equal to $2$. Therefore, one can estimate a
maximal CUSUM, which may appear randomly as

$\displaystyle C_{n}\leavevmode\nobreak\ \sim\leavevmode\nobreak\
2*\sigma\sqrt{n}\leavevmode\nobreak\ .$ (34)

The same applies if fluctuations are not around zero but around $\mu_{0}$.
Reaching a threshold $C_{n}=h$ can indicate a shift from the starting mean
$\mu_{0}$ to a new value $\mu_{1}$. To be sure that it is not random, we
require that the reached value divided by the number of steps is larger than
that estimated in Eq. (34):

$\displaystyle\mu_{1}\leavevmode\nobreak\ =\leavevmode\nobreak\
\mu_{0}\leavevmode\nobreak\ +\leavevmode\nobreak\
\frac{h}{n}\leavevmode\nobreak\ \geq\leavevmode\nobreak\
\mu_{0}\leavevmode\nobreak\ +\leavevmode\nobreak\
2\,\frac{\sigma}{\sqrt{n}}\leavevmode\nobreak\ .$ (35)

The law of the iterated logarithm does not forbid larger deviations but says
they are rare [76]. Therefore, one can replace the coefficient $2$ in Eq. (35)
with an arbitrary coefficient $\kappa$. The starting assumption was that the
distribution is symmetric, so we can rewrite Eq. (35) as follows:

$\displaystyle|\mu_{1}-\mu_{0}|\leavevmode\nobreak\ \geq\leavevmode\nobreak\
\kappa\leavevmode\nobreak\ \frac{\sigma}{\sqrt{n}}\leavevmode\nobreak\ ,$ (36)

where one may recognize a Shewhart control chart [69]. Thus, a new mean,
$\mu_{1}$, should be accepted if it is $\kappa$ times larger than the standard
deviation $\sigma$ over the square root of the number of steps $n$. Note that
the non-scaled threshold $h$ can be very large. If we take 1 and 100 days as a
reference again, then according to Eq. (32), the average CUSUMs obtained
randomly may reach $\sqrt{144}*\sigma=12*\sigma$, and
$\sqrt{14\,400}*\sigma=120*\sigma$ correspondingly. Moreover, our model gives
random fluctuations on the scale of $\sigma=\leavevmode\nobreak\
$$3\text{\,}\mathrm{\SIUnitSymbolCelsius}$, see Eq. (12), and the average
profitable threshold of an accumulated deviation $\langle
h\rangle\leavevmode\nobreak\ =\leavevmode\nobreak\
19\,400\,$$\text{\,}\mathrm{\SIUnitSymbolCelsius}$$\leavevmode\nobreak\
\simeq\leavevmode\nobreak\ 6\,400*\sigma$. These numbers differ dramatically
from the usual $2$-, $3$-, and $6$-sigma deviations taken for single, non-
accumulated deviations. Therefore, the dependence of a CUSUM on the number of
steps must be considered.

##  Appendix B DI-CUSUM

In this appendix, we make a short derivation of the DI-CUSUM formula, see also
[68]. If a threshold $h$ is reached, then it is a consequence of a continuous
rise or fall (run) of a CUSUM until the value of that threshold $h$. The start
of this run can be determined as the last crossing with zero, $i_{0}$, and Eq.
(18) can be rewritten:

$\displaystyle C_{a}\leavevmode\nobreak\ =\leavevmode\nobreak\
\sum_{i=1}^{i_{0}}(\epsilon(t_{i})-\mu_{0})\leavevmode\nobreak\
+\leavevmode\nobreak\
\sum_{i=i_{0}}^{i_{a}}(\epsilon(t_{i})-\mu_{0})\leavevmode\nobreak\
=\leavevmode\nobreak\
\sum_{i=i_{0}}^{i_{a}}(\epsilon(t_{i})-\mu_{0})\leavevmode\nobreak\
=\leavevmode\nobreak\ h\leavevmode\nobreak\ .$ (37)

The $i_{0}$ is special because the CUSUM before $i_{0}$ in Eq. (37) disappears
since it is zero at $i_{0}$ by the definition of $i_{0}$. Changes that lead to
an alarm are assumed irreversible. Therefore, a CUSUM needs to be restarted
after reaching a threshold. A new CUSUM should start from a new mean,
$\mu_{new}=\mu_{old}+\delta$, to which the residuals have drifted during the
time before the alarm. The simplest way to get a new mean is to assume that
the change in the CUSUM of the residuals was linear, adding a small constant
value at each step. Then,

$\displaystyle\mu_{new}$ $\displaystyle\leavevmode\nobreak\
-\leavevmode\nobreak\ \mu_{old}\leavevmode\nobreak\ =\leavevmode\nobreak\
\delta\leavevmode\nobreak\ =\leavevmode\nobreak\ h/n\leavevmode\nobreak\
,\quad n\leavevmode\nobreak\ =\leavevmode\nobreak\
i_{a}-i_{0}\leavevmode\nobreak\ ,\quad\text{and}$ $\displaystyle\mu_{new}$
$\displaystyle\leavevmode\nobreak\ =\leavevmode\nobreak\
\mu_{old}\leavevmode\nobreak\ +\leavevmode\nobreak\
h/(i_{a}-i_{0})\leavevmode\nobreak\ ,$ (38)

where $h$ in Eq. (38) comes with its sign: if CUSUM was growing before the
alarm, then $h$ is positive; if CUSUM was falling, then $h$ is negative.

## References

  * [1] Ember  “Global Electricity Review 2023”, 2023  Ember  URL: https://ember-climate.org/insights/research/global-electricity-review-2023/
  * [2] Organisation for Economic Co-operation and Development, Nuclear Energy Agency  “LCOE - Levelized Cost of Electricity”, 2020  URL: https://www.oecd-nea.org/lcoe/
  * [3] Xiukun Wei, Michel Verhaegen and Tim Engelen  “Sensor fault detection and isolation for wind turbines based on subspace identification and Kalman filter techniques”  In _International Journal of Adaptive Control and Signal Processing_ 24.8 Wiley Online Library, 2010, pp. 687–707  DOI: https://doi.org/10.1002/acs.1162
  * [4] Anders Bech Borchersen and Michel Kinnaert  “Model-based fault detection for generator cooling system in wind turbines using SCADA data”  In _Wind Energy_ 19.4 Wiley Online Library, 2016, pp. 593–606  DOI: https://doi.org/10.1002/we.1852
  * [5] Simon Letzgus  “Change-point detection in wind turbine SCADA data for robust condition monitoring with normal behaviour models”  In _Wind Energy Science_ 5.4 Copernicus GmbH, 2020, pp. 1375–1397  DOI: https://doi.org/10.5194/wes-5-1375-2020
  * [6] Phong B Dao  “A CUSUM-based approach for condition monitoring and fault diagnosis of wind turbines”  In _Energies_ 14.11 MDPI, 2021, pp. 3236  DOI: https://doi.org/10.3390/en14113236
  * [7] Meik Schlechtingen and Ilmar Ferreira Santos  “Comparative analysis of neural network and regression based condition monitoring approaches for wind turbine fault detection”  In _Mechanical systems and signal processing_ 25.5 Elsevier, 2011, pp. 1849–1875  DOI: https://doi.org/10.1016/j.ymssp.2010.12.007
  * [8] Francesco Natili, Alessandro Paolo Daga, Francesco Castellani and Luigi Garibaldi  “Multi-scale wind turbine bearings supervision techniques using industrial SCADA and vibration data”  In _Applied Sciences_ 11.15 MDPI, 2021, pp. 6785  DOI: https://doi.org/10.3390/app11156785
  * [9] Mohand Arab Djeziri, Samir Benmoussa and Roberto Sanchez  “Hybrid method for remaining useful life prediction in wind turbine systems”  In _Renewable Energy_ 116 Elsevier, 2018, pp. 173–187  DOI: https://doi.org/10.1016/j.renene.2017.05.020
  * [10] Conor McKinnon et al.  “Investigation of isolation forest for wind turbine pitch system condition monitoring using SCADA data”  In _Energies_ 14.20 MDPI, 2021, pp. 6601  DOI: https://doi.org/10.3390/en14206601
  * [11] Qifa Xu, Shixiang Lu, Zhongping Zhai and Cuixia Jiang  “Adaptive fault detection in wind turbine via RF and CUSUM”  In _IET Renewable Power Generation_ 14.10 Wiley Online Library, 2020, pp. 1789–1796  DOI: https://doi.org/10.1049/iet-rpg.2019.0913
  * [12] Tongke Yuan, Zhifeng Sun and Shihao Ma  “Gearbox fault prediction of wind turbines based on a stacking model and change-point detection”  In _Energies_ 12.22 MDPI, 2019, pp. 4224  DOI: https://doi.org/10.3390/en12224224
  * [13] Ángel Encalada-Dávila, Bryan Puruncajas, Christian Tutivén and Yolanda Vidal  “Wind turbine main bearing fault prognosis based solely on scada data”  In _Sensors_ 21.6 MDPI, 2021, pp. 2228  DOI: https://doi.org/10.3390/s21062228
  * [14] Hong Wang et al.  “Early fault detection of wind turbines based on operational condition clustering and optimized deep belief network modeling”  In _Energies_ 12.6 MDPI, 2019, pp. 984  DOI: https://doi.org/10.3390/en12060984
  * [15] Songtao Du, Yiming Wan, Cong Zhang and Sihang Zhang  “Anomaly Root Cause Analysis for Wind Turbines Based on Denoising Autoencoder and Sparse Estimation”  In _2023 IEEE 12th Data Driven Control and Learning Systems Conference (DDCLS)_ , 2023, pp. 449–454  IEEE  DOI: https://doi.org/10.1109/DDCLS58216.2023.10166052
  * [16] Ziqian Kong et al.  “Condition monitoring of wind turbines based on spatio-temporal fusion of SCADA data by convolutional neural networks and gated recurrent units”  In _Renewable Energy_ 146 Elsevier, 2020, pp. 760–768  DOI: https://doi.org/10.1016/j.renene.2019.07.033
  * [17] Yan Zhang et al.  “A dynamic threshold method for wind turbine fault detection based on spatial-temporal neural network”  In _Journal of Renewable and Sustainable Energy_ 14.5 AIP Publishing, 2022  DOI: https://doi.org/10.1063/5.0100389
  * [18] Ángel Encalada-Dávila et al.  “Early fault detection in the main bearing of wind turbines based on Gated Recurrent Unit (GRU) neural networks and SCADA data”  In _IEEE/ASME Transactions on Mechatronics_ 27.6 IEEE, 2022, pp. 5583–5593  DOI: https://doi.org/10.1109/TMECH.2022.3185675
  * [19] Meik Schlechtingen, Ilmar Ferreira Santos and Sofiane Achiche  “Wind turbine condition monitoring based on SCADA data using normal behavior models. Part 1: System description”  In _Applied Soft Computing_ 13.1 Elsevier, 2013, pp. 259–270  DOI: https://doi.org/10.1016/j.asoc.2012.08.033
  * [20] Meik Schlechtingen and Ilmar Ferreira Santos  “Wind turbine condition monitoring based on SCADA data using normal behavior models. Part 2: Application examples”  In _Applied Soft Computing_ 14 Elsevier, 2014, pp. 447–460  DOI: https://doi.org/10.1016/j.asoc.2013.09.016
  * [21] Adrian Stetco et al.  “Machine learning methods for wind turbine condition monitoring: A review”  In _Renewable energy_ 133 Elsevier, 2019, pp. 620–635  DOI: https://doi.org/10.1016/j.renene.2018.10.047
  * [22] Jorge Maldonado-Correa, Sergio Martı́n-Martı́nez, Estefanı́a Artigao and Emilio Gómez-Lázaro  “Using SCADA data for wind turbine condition monitoring: A systematic literature review”  In _Energies_ 13.12 MDPI, 2020, pp. 3132  DOI: https://doi.org/10.3390/en13123132
  * [23] Juan José Montero Jimenez et al.  “Towards multi-model approaches to predictive maintenance: A systematic literature survey on diagnostics and prognostics”  In _Journal of manufacturing systems_ 56 Elsevier, 2020, pp. 539–557  DOI: https://doi.org/10.1016/j.jmsy.2020.07.008
  * [24] Yirui Wang et al.  “A review of applications of artificial intelligent algorithms in wind farms”  In _Artificial Intelligence Review_ 53 Springer, 2020, pp. 3447–3500  DOI: 10.1007/s10462-019-09768-7
  * [25] Innes Murdo Black, Mark Richmond and Athanasios Kolios  “Condition monitoring systems: a systematic literature review on machine-learning methods improving offshore-wind turbine operational management”  In _International Journal of Sustainable Energy_ 40.10 Taylor & Francis, 2021, pp. 923–946  DOI: https://doi.org/10.1080/14786451.2021.1890736
  * [26] Joyjit Chatterjee and Nina Dethlefs  “Scientometric review of artificial intelligence for operations & maintenance of wind turbines: The past, present and future”  In _Renewable and Sustainable Energy Reviews_ 144 Elsevier, 2021, pp. 111051  DOI: https://doi.org/10.1016/j.rser.2021.111051
  * [27] Zhou Wu et al.  “A comprehensive review on deep learning approaches in wind forecasting applications”  In _CAAI Transactions on Intelligence Technology_ 7.2 Wiley Online Library, 2022, pp. 129–143  DOI: https://doi.org/10.1049/cit2.12076
  * [28] Hamed Badihi et al.  “A comprehensive review on signal-based and model-based condition monitoring of wind turbines: Fault diagnosis and lifetime prognosis”  In _Proceedings of the IEEE_ 110.6 IEEE, 2022, pp. 754–806  DOI: https://doi.org/10.1109/JPROC.2022.3171691
  * [29] Onur Surucu, Stephen Andrew Gadsden and John Yawney  “Condition monitoring using machine learning: A review of theory, applications, and recent advances”  In _Expert Systems with Applications_ 221 Elsevier, 2023, pp. 119738  DOI: https://doi.org/10.1016/j.eswa.2023.119738
  * [30] Sean J Taylor and Benjamin Letham  “Forecasting at scale”  In _The American Statistician_ 72.1 Taylor & Francis, 2018, pp. 37–45  DOI: https://doi.org/10.1080/00031305.2017.1380080
  * [31] Amirashkan Haghshenas, Agus Hasan, Ottar Osen and Egil Tennfjord Mikalsen  “Predictive digital twin for offshore wind farms”  In _Energy Informatics_ 6.1 SpringerOpen, 2023, pp. 1–26  DOI: https://doi.org/10.1186/s42162-023-00257-4
  * [32] Qiucheng Lyu et al.  “Condition Monitoring of Wind Turbines with Implementation of Interactive Spatio Temporal Deep Learning Networks”  In _IEEE Transactions on Instrumentation and Measurement_ IEEE, 2023  DOI: https://doi.org/10.1109/TIM.2023.3284924
  * [33] Roberto Lázaro, Nurseda Y Yürüșen and Julio J Melero  “Determining Remaining Lifetime of Wind Turbine Gearbox Using a Health Status Indicator Signal”  In _Journal of Physics: Conference Series_ 1618.2, 2020, pp. 022037  IOP Publishing  DOI: https://doi.org/10.1088/1742-6596/1618/2/022037
  * [34] Sarah Barber et al.  “Enabling co-innovation for a successful digital transformation in wind energy using a new digital ecosystem and a fault detection case study”  In _Energies_ 15.15 MDPI, 2022, pp. 5638  DOI: https://doi.org/10.3390/en15155638
  * [35] Effi Latiffianti, Shawn Sheng and Yu Ding  “Wind turbine gearbox failure detection through cumulative sum of multivariate time series data”  In _Frontiers in Energy Research_ 10 Frontiers, 2022, pp. 904622  DOI: https://doi.org/10.3389/fenrg.2022.904622
  * [36] EDP - Energias Portugal  “HTW 2018: Wind Turbine Failures Detection, Hack the Wind [dataset]”, 2018  URL: https://www.edp.com/en/innovation/open-data/reuses/hack-the-wind
  * [37] Cyriana MA Roelofs, Marc-Alexander Lutz, Stefan Faulstich and Stephan Vogt  “Autoencoder-based anomaly root cause analysis for wind turbines”  In _Energy and AI_ 4 Elsevier, 2021, pp. 100065  DOI: https://doi.org/10.1016/j.egyai.2021.100065
  * [38] Wisdom Udo and Yar Muhammad  “Data-driven predictive maintenance of wind turbine based on SCADA data”  In _IEEE Access_ 9 IEEE, 2021, pp. 162370–162388  DOI: https://doi.org/10.1109/ACCESS.2021.3132684
  * [39] Maryna Garan, Khaoula Tidriri and Iaroslav Kovalenko  “A data-centric machine learning methodology: Application on predictive maintenance of wind turbines”  In _Energies_ 15.3 MDPI, 2022, pp. 826  DOI: https://doi.org/10.3390/en15030826
  * [40] Eric Stefan Miele, Fabrizio Bonacina and Alessandro Corsini  “Deep anomaly detection in horizontal axis wind turbines using graph convolutional autoencoders for multivariate time series”  In _Energy and AI_ 8 Elsevier, 2022, pp. 100145  DOI: https://doi.org/10.1016/j.egyai.2022.100145
  * [41] Xingchen Liu, Juan Du and Zhi-Sheng Ye  “A condition monitoring and fault isolation system for wind turbine based on SCADA data”  In _IEEE Transactions on Industrial Informatics_ 18.2 IEEE, 2021, pp. 986–995  DOI: https://doi.org/10.1109/TII.2021.3075239
  * [42] Nur Nalisa Hanim Binti Shahrulhisham, Kok Hen Chong, CT Yaw and SP Koh  “Application of Machine Learning Technique Using Support Vector Machine in Wind Turbine Fault Diagnosis”  In _Journal of Physics: Conference Series_ 2319.1, 2022, pp. 012017  IOP Publishing  DOI: https://doi.org/10.1088/1742-6596/2319/1/012017
  * [43] Zhanjun Tang et al.  “Fault Diagnosis of Wind Turbine Generators Based on Stacking Integration Algorithm and Adaptive Threshold”  In _Sensors_ 23.13 MDPI, 2023, pp. 6198  DOI: https://doi.org/10.3390/s23136198
  * [44] Mindaugas Jankauskas et al.  “Exploring the limits of early predictive maintenance in wind turbines applying an anomaly detection technique”  In _Sensors_ 23.12 MDPI, 2023, pp. 5695  DOI: https://doi.org/10.3390/s23125695
  * [45] Fernando PG Sá et al.  “Wind turbine fault detection: a semi-supervised learning approach with automatic evolutionary feature selection”  In _2020 International Conference on Systems, Signals and Image Processing (IWSSIP)_ , 2020, pp. 323–328  IEEE  DOI: https://doi.org/10.1109/IWSSIP48289.2020.9145244
  * [46] Christian Gruhl et al.  “The problem with real-world novelty detection-issues in multivariate probabilistic models”  In _2021 IEEE international conference on autonomic computing and self-organizing systems companion (ACSOS-C)_ , 2021, pp. 204–209  IEEE  DOI: https://doi.org/10.1109/ACSOS-C52956.2021.00055
  * [47] Khaoula Tidriri, Ahmad Braydi and Hussain Kazmi  “Data-driven decision-making methodology for prognostic and health management of wind turbines”  In _2021 Australian & New Zealand Control Conference (ANZCC)_, 2021, pp. 104–109  IEEE  DOI: https://doi.org/10.1109/ANZCC53563.2021.9628240
  * [48] Fabrizio Bonacina, Eric Stefan Miele and Alessandro Corsini  “On the use of artificial intelligence for condition monitoring in horizontal-axis wind turbines”  In _IOP Conference Series: Earth and Environmental Science_ 1073.1, 2022, pp. 012005  IOP Publishing  DOI: https://doi.org/10.1088/1755-1315/1073/1/012005
  * [49] Mahi Ayman et al.  “Fault Detection in Wind Turbines using Deep Learning”  In _2022 2nd International Mobile, Intelligent, and Ubiquitous Computing Conference (MIUCC)_ , 2022, pp. 272–278  IEEE  DOI: https://doi.org/10.1109/MIUCC55081.2022.9781749
  * [50] Danielle Pinna et al.  “Fault identification in wind turbines: a data-centric machine learning approach”  In _2022 International Conference on Computational Science and Computational Intelligence (CSCI)_ , 2022, pp. 565–568  IEEE  DOI: https://doi.org/10.1109/CSCI58124.2022.00106
  * [51] Oliver Lauwers and Bart De Moor  “Unsupervised Wind Turbine Anomaly Detection A Weighted Cepstral Distance Application”  In _39th Conference Benelux Meeting on Ssytems and Control, Date: 2020/03/10-2020/03/12, Location: Elspeet, The Netherlands_ , 2020  URL: ftp://gold.esat.kuleuven.be/pub/pub/stadius/ida/reports/20-18.pdf
  * [52] Zheng Wang and Xuening Chu  “Operating Condition Identification of Complete Wind Turbine using DBN and Improved DDPG-SOM”  In _2022 IEEE 11th Data Driven Control and Learning Systems Conference (DDCLS)_ , 2022, pp. 94–101  IEEE  DOI: https://doi.org/10.1109/DDCLS55054.2022.9858494
  * [53] Topon Paul, Vidhisha Reddy, Sai Prem Kumar Ayyagari and Kaneharu Nishino  “Residual Signature Analysis for Wind Turbine Failure Prognosis”  In _2023 IEEE PES Innovative Smart Grid Technologies Europe (ISGT EUROPE)_ , 2023, pp. 1–5  IEEE  DOI: https://doi.org/10.1109/ISGTEUROPE56780.2023.10407545
  * [54] Danielle R Pinna et al.  “Identificação de Falhas em Turbinas Eólicas Utilizando Abordagens de Aprendizado de Máquina”  In _Anais do XXXVIII Simpósio Brasileiro de Bancos de Dados_ , 2023, pp. 439–444  SBC  DOI: https://doi.org/10.5753/sbbd.2023.232700
  * [55] Danielle Pinna et al.  “Fault Classification of Wind Turbine: A Comparison of Hyperparameter Optimization Methods”  In _International Conference on Optimization, Learning Algorithms and Applications_ , 2023, pp. 229–243  Springer  DOI: https://doi.org/10.1007/978-3-031-53036-4˙16
  * [56] Liu Xingchen  “Machine Learning for Health Monitoring and Management of Power Plants”, 2021  URL: https://www.proquest.com/openview/d784e9a5376d0c026ab21c386effbd52/1
  * [57] John Eriksson  “Machine learning for predictive maintenance on wind turbines: Using SCADA data and the Apache Hadoop ecosystem”, 2020, pp. 76  URL: https://urn.kb.se/resolve?urn=urn:nbn:se:liu:diva-164892
  * [58] Manisha Pranav Sakarvadia  “Predictive maintenance with industrial sensor data”, 2023  URL: https://uis.brage.unit.no/uis-xmlui/handle/11250/3089849
  * [59] Davide Manna  “Health Monitoring for Wind Turbines - Datasets Processing and Development of RUL prognostics”, 2023  URL: https://webthesis.biblio.polito.it/28861/1/tesi.pdf
  * [60] Stephan Rabanser et al.  “Intrinsic anomaly detection for multi-variate time series”  In _arXiv preprint arXiv:2206.14342 [cs.LG]_ , 2022  DOI: https://doi.org/10.48550/arXiv.2206.14342
  * [61] Simon Letzgus and Klaus-Robert Müller  “Towards transparent and robust data-driven wind turbine power curve models”  In _arXiv preprint arXiv:2304.09835 [cs.LG]_ , 2023  DOI: https://doi.org/10.48550/arXiv.2304.09835
  * [62] Andrew Kusiak  “Renewables: Share data on wind energy”  In _Nature_ 529.7584 Nature Publishing Group UK London, 2016, pp. 19–21  DOI: https://doi.org/10.1038/529019a
  * [63] Alaize Dall-Orsoletta, Fernando Romero and Paula Ferreira  “Open and collaborative innovation for the energy transition: An exploratory study”  In _Technology in Society_ 69 Elsevier, 2022, pp. 101955  DOI: https://doi.org/10.1016/j.techsoc.2022.101955
  * [64] Diana Vieira Fernandes and Carlos Santos Silva  “Open Energy Data—A regulatory framework proposal under the Portuguese electric system context”  In _Energy Policy_ 170 Elsevier, 2022, pp. 113240  DOI: https://doi.org/10.1016/j.enpol.2022.113240
  * [65] Eda Jovicic, Daria Primorac, Marko Cupic and Alan Jovic  “Publicly Available Datasets for Predictive Maintenance in the Energy Sector: A Review”  In _IEEE access_ IEEE, 2023, pp. 73505–73520  DOI: https://doi.org/10.1109/ACCESS.2023.3295113
  * [66] Douglas M Hawkins and David H Olwell  “Cumulative sum charts and charting for quality improvement”  Springer Science & Business Media, 1998
  * [67] Douglas C Montgomery  “Introduction to statistical quality control”  John Wiley & Sons, 2019
  * [68] Peihua Qiu  “Introduction to statistical process control”  CRC press, 2013
  * [69] Michele Basseville and Igor V Nikiforov  “Detection of abrupt changes: theory and application”  PTR Prentice-Hall, 1993
  * [70] Julien Siebert, Janek Groß and Christof Schroth  “A systematic review of python packages for time series analysis”  In _arXiv preprint arXiv:2104.07406 [cs.MS]_ , 2021  DOI: https://doi.org/10.48550/arXiv.2104.07406
  * [71] Ilia Borukhovich Gertsbakh  “Reliability theory: with applications to preventive maintenance”  Springer Science & Business Media, 2000
  * [72] Toshio Nakagawa  “Random maintenance policies”  Springer, 2014
  * [73] Aleksandr Khintchine  “Über einen Satz der Wahrscheinlichkeitsrechnung”  In _Fundamenta Mathematicae_ 6.1, 1924, pp. 9–20  URL: http://eudml.org/doc/214283
  * [74] A Kolmogoroff  “Über das Gesetz des iterierten Logarithmus”  In _Mathematische Annalen_ 101.1 Springer, 1929, pp. 126–135  URL: http://eudml.org/doc/159322
  * [75] Aleksandr A. Borovkov and A. Borovkov  “Asymptotic Analysis of Random Walks. Heavy-Tailed Distributions.”  Cambridge University Press, 2008
  * [76] A.A. Brown and V.V. Petrov  “Sums of Independent Random Variables”  Springer, 1975