Как обнаружить несколько плато, подъемов и спусков в данных временных рядов с использованием Python - PullRequest
0 голосов
/ 30 ноября 2018

Анализируя данные временных рядов велосипедных маршрутов, я хотел бы знать временной интервал для каждого плато, подъема и спуска. Образец CSV-файла загружен здесь .

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.dates as mdates


df = pd.read_csv(r'C:\Data\Sample.csv', parse_dates=['dateTime'])
feature_used='Cycle_Alt'
print("Eliminating null values..")
df=df[df[feature_used].notnull()]

plt.figure(figsize=(8,6))
x=df['dateTime']        
y=df['Cycle_Alt']

plt.plot(x,y,c='b',linestyle=':',label="Altitude")
plt.xticks(rotation='vertical')
plt.gcf().autofmt_xdate()   
plt.legend(loc='best', bbox_to_anchor=(1, 0.5))

ЭтоСюжет дает мне такой профиль.enter image description here

Что можно сделать, чтобы классифицировать данные временных рядов для обнаружения каждого плато, подъема и спуска, при условии, что в выборке может быть больше переменных, чем представлено в выборке.

enter image description here

1 Ответ

0 голосов
/ 30 ноября 2018

Если вас интересует только определение плато, восхождений и спусков в серии, проще всего использовать функцию numpy.diff для вычисления n-й дискретной разности.Затем вы можете использовать numpy.sign для преобразования различий в положительные (подъемы), нулевые (плато) или отрицательные (спуски).

Пример:

a = np.random.randint(1, 5, 10)
#array([1, 1, 1, 1, 3, 4, 2, 2, 2, 2])

diff = np.diff(a)
#array([ 0,  0,  0,  2,  1, -2,  0,  0,  0])

gradient = np.sign(diff)
#array([ 0,  0,  0,  1,  1, -1,  0,  0,  0])

Обратите внимание, что конечный массив gradient будет иметь на один элемент меньше, чем исходный массив, поскольку функция numpy.diff будет возвращать (n-1) различий для массива длины n.

...