Прежде всего, я бы посоветовал вам увеличить количество баллов, то есть в самой экспериментальной установке.
Тем не менее, похоже, что можно извлечь «события» из предоставленных данных. Идея проста: нам нужно найти «пики», характеризующиеся паттерном «подъём-снижение». Чтобы находить подъемы и спады, естественно использовать производную первого порядка, и поскольку нас интересует только знак (плюс для увеличения функции, минус для уменьшения), я просто использовал сигнум над разностью вперед первого порядка. Поскольку мы предполагаем, что спонтанно возникающих пиков нет, нам нужно найти точки прямой разницы, где меняется знак. Фактически, это суррогатная производная второго порядка, и, фактически, я достиг почти того же результата, используя простую разность вперед 2-го порядка, однако это не очень удобно.
Я использовал следующую процедуру
# imports
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as plticker
# endimports
# path to csv
path = r'JanuaryData.csv'
# reading the csv
df = pd.read_csv(path,usecols=['timestamp','temperature'],parse_dates=True, index_col='timestamp')
# selecting the part for the analysis
startDate = '2020-01-01 00:00:00'
endDate = '2020-01-03 23:59:00'
df = df.loc[startDate:endDate]
# one does not need duplicate temperature values,
# because the task is to find changing values
df2 = df.loc[df['temperature'].shift() != df['temperature']]
# ye good olde forward difference
der = np.diff(df2['temperature'])
# to have the same length as index
der = np.insert(der,len(der),np.NaN)
# make it column
df2['sig'] = np.sign(der)
# temporary array
evts = np.zeros(len(der))
# we find that points, where the signum is changing from 1 to -1, i.e. crosses zero
evts[(df2['sig'].shift() != df2['sig'])*(0 > df2['sig'])] = 1.0
# make it column for plotting
df2['events'] = evts
# preparing plot
fig,ax = plt.subplots(figsize=(20,20))
ax.xaxis_date()
ax.xaxis.set_major_locator(plticker.MaxNLocator(20))
# temperature itself
ax.plot(df2['temperature'],'-xk')
ax2=ax.twinx()
# 'events'
ax2.plot(df2['events'],'-xg')
## uncomment next two lines for plotting of signum
# ax3=ax.twinx()
# ax3.plot(df2['sig'],'-m')
# x-axis tweaking
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
minLim = '2020-01-02 00:07:00'
maxLim = '2020-01-02 23:59:00'
plt.xlim(mdates.date2num(pd.Timestamp(minLim)),
mdates.date2num(pd.Timestamp(maxLim)))
plt.show()
Изображение, полученное с помощью кода: Пики зеленой кривой показывают начало соответствующего пика температуры, и я извиняюсь за не столь визуальное представление. Я попытался проанализировать другие данные в .csv, и похоже, что алгоритм работает хорошо.
EDIT # 1 заменить строку
df2 = df.loc[df['temperature'].shift() != df['temperature']]
с помощью
df2 = pd.DataFrame.copy(df.loc[df['temperature'].shift() != df['temperature']])
избавиться от SettingWithCopyWarning.
, а также перезаписать строки с разницей в прямом направлении от
# ye good olde forward difference
der = np.diff(df2['temperature'])
# to have the same length as index
der = np.insert(der,len(der),np.NaN)
# make it column
df2['sig'] = np.sign(der)
до
# ye good olde forward difference
der = np.sign(np.diff(df2['temperature']))
# to have the same length as index
der = np.insert(der,len(der),np.NaN)
# make it column
df2['sig'] = der
до запретить np.sign()
предупреждение о значении NaN.
РЕДАКТИРОВАТЬ # 2 , чтобы напечатать число событий в диапазоне, используйте
print(np.count_nonzero(df2['events'][minLim:maxLim]))
для пределов, используемых над ним. 6, для всего набора данных это дает 174.