# RUL prediction without failures in historical data

I have faced in the past some problems of predictive maintenance where I had historical sensor data with failures. With this kind of dataset, you can calculate the RUL (Remaining Useful Life) and label the data accordingly. That allows you to:

• Perform a regression, trained to predict the RUL
• Label data before the fail and try to predict it (raising a notice like: be careful, the system is going to fail "soon").
• Label data performing a multi-class classification. Like the step before, but placing more labels to predict (it should tell you if you are in a healthy, warning, or close-to-error status, for example)

By the way, this time I will have historical data without failures (they did not and will not perform a RTF, Run To Failure). I know that in a specific moment someone did the maintenance program, right before the system breaks. I indeed will have the minimum allowed sensor value.

How can I face this kind of problem, doing predictive maintenance and telling that they could perform their maintenance "a little bit" later without incurring in a failure? I was thinking about survival analysis (I have never done it before), but I do not think I will have technical specs of the hardware showing the estimated life of a particular part.

I do not have the data yet, but I am starting to guess how I will face that problem. I created a simple example of what I should expect (with a single sensor, I guess I will have more).

In my test data I put a vertical line where I assume they performed maintenance, The horizontal line is the limit that the sensor should never cross before getting an error. The data after the vertical green line is the data I will never have in my dataset.

import matplotlib.pyplot as plt
import pandas as pd

min_s1 = 23;
replace_cycle = 20
df_1 = pd.DataFrame(data={'s1':[100,99,98,98,97,95,92,88,84,76,70,64,55,45,40,35,32,30,29,28,27,27,26,25,25,24,24,23,23]})
df_2 = pd.DataFrame(data={'s1':[99,97,98,97,96,95,91,85,80,71,65,57,49,40,35,31,28,27,27,26,26,25,25,24,23,23,23,23,23]})
df_3 = pd.DataFrame(data={'s1':[100,98,98,97,97,96,93,89,86,78,72,67,59,50,43,36,33,31,31,29,30,28,28,27,26,26,25,25,24]})

fig, ax = plt.subplots()

df_1.plot(ax=ax, style='.-');
df_2.plot(ax=ax, style='.-');
df_3.plot(ax=ax, style='.-');
plt.axhline(min_s1, color='red', linestyle='--');
plt.axvline(replace_cycle, color='green', linestyle='--');
ax.legend(['s1 registered run #1','s1 registered run #2','s1 registered run #3','s1 min value','s1 maintenance']);