0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

時(shí)間序列分析的四個(gè)基本Python庫介紹

科技綠洲 ? 來源:Python數(shù)據(jù)科學(xué) ? 作者:Python數(shù)據(jù)科學(xué) ? 2023-11-03 10:17 ? 次閱讀

在本文中,我們將介紹四個(gè)主要的Python庫——statmodels、tslearn、tssearch、 tsfresh ——每個(gè)庫都針對時(shí)間序列分析的不同方面進(jìn)行了定制。這些庫為從預(yù)測到模式識(shí)別的任務(wù)提供了強(qiáng)大的工具,使它們成為各種應(yīng)用程序的寶貴資源。

我們使用來自Kaggle的數(shù)據(jù)集,通過加速度計(jì)數(shù)為各種身體活動(dòng)進(jìn)行分析。這些活動(dòng)被分為12個(gè)不同的類別,每個(gè)類別對應(yīng)一個(gè)特定的身體動(dòng)作,如站立、坐著、行走,或從事更有活力的活動(dòng),如慢跑和騎自行車。每個(gè)活動(dòng)都記錄了一分鐘的持續(xù)時(shí)間,提供了豐富的時(shí)間序列數(shù)據(jù)源。

用于此分析的庫有:

# statsmodels
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf

#tslearn
from tslearn.barycenters import dtw_barycenter_averaging

# tssearch
from tssearch import get_distance_dict, time_series_segmentation, time_series_search, plot_search_distance_result

# tsfresh
from tsfresh import extract_features
from tsfresh.feature_selection.relevance import calculate_relevance_table
from tsfresh.feature_extraction import EfficientFCParameters
from tsfresh.utilities.dataframe_functions import impute

Statsmodels

從statmodels庫中,兩個(gè)基本函數(shù)在理解從x, y和z方向收集的加速度數(shù)據(jù)的特征方面起著關(guān)鍵作用。

adfuller函數(shù)是確定時(shí)間序列信號(hào)平穩(wěn)性的有力工具。通過對我們的數(shù)據(jù)進(jìn)行Augmented Dickey-Fuller檢驗(yàn),可以確定加速度信號(hào)是否表現(xiàn)出平穩(wěn)的行為,這是許多時(shí)間序列分析技術(shù)的基本要求。這個(gè)測試幫助我們評估數(shù)據(jù)是否隨時(shí)間而變化。

def activity_stationary_test(dataframe, sensor, activity):
dataframe.reset_index(drop=True)
adft = adfuller(dataframe[(dataframe['Activity'] == activity)][sensor], autolag='AIC')
output_df = pd.DataFrame({'Values':[adft[0], adft[1], adft[4]['1%']], 'Metric':['Test Statistics', 'p-value', 'critical value (1%)']})
print('Statistics of {} sensor:n'.format(sensor), output_df)
print()
if (adft[1] < 0.05) & (adft[0] < adft[4]['1%']):
print('The signal is stationary')
else:
print('The signal is non-stationary')

seasonal_decomposition函數(shù)提供了對時(shí)間序列數(shù)據(jù)結(jié)構(gòu)的寶貴見解。它將時(shí)間序列分解為三個(gè)不同的組成部分:趨勢、季節(jié)性和殘差。這種分解使我們能夠可視化和理解加速度數(shù)據(jù)中的潛在模式和異常。

def activity_decomposition(dataframe, sensor, activity):
dataframe.reset_index(drop=True)
data = dataframe[(dataframe['Activity'] == activity)][sensor]
decompose = seasonal_decompose(data, model='additive', extrapolate_trend='freq', period=50)
fig = decompose.plot()
fig.set_size_inches((12, 7))
fig.axes[0].set_title('Seasonal Decomposition Plot')
fig.axes[3].set_xlabel('Indices')
plt.show()

圖片

Tslearn

如果使用tslearn庫進(jìn)行時(shí)間序列分析??梢圆捎梅指罘椒?,將連續(xù)的加速信號(hào)分解成特定長度的離散段或窗口(例如,150個(gè)數(shù)據(jù)點(diǎn))。這些片段提供了行走過程中運(yùn)動(dòng)的顆粒視圖,并成為進(jìn)一步分析的基礎(chǔ)。重要的是,我們在相鄰部分之間使用了50個(gè)數(shù)據(jù)點(diǎn)的重疊,從而可以更全面地覆蓋潛在的動(dòng)態(tài)。

template_length = 150
overlap = 50 # Adjust the overlap value as needed
segments = [signal[i:i + template_length] for i in range(0, len(signal) - template_length + 1, overlap)]

圖片

為了從這些片段中獲得一個(gè)封裝行走典型特征的代表性模板,我們使用了dtw_barycenter_averaging函數(shù)。該方法采用動(dòng)態(tài)時(shí)間規(guī)整(Dynamic Time Warping, DTW)對分割的時(shí)間序列進(jìn)行對齊和平均,有效地創(chuàng)建了一個(gè)捕捉步行運(yùn)動(dòng)中心趨勢的模板。

template_signal = dtw_barycenter_averaging(segments)
template_signal = template_signal.flatten()

生成的模板為后續(xù)的分類和比較任務(wù)提供了有價(jià)值的參考,有助于基于x軸加速度的步行活動(dòng)識(shí)別和分析。

圖片

Tssearch

對于tssearch庫使用time_series_segmentation函數(shù),通過動(dòng)態(tài)時(shí)間規(guī)整(DTW)或其他相似性度量來識(shí)別輸入時(shí)間序列中與所提供的模板信號(hào)最相似的片段。

該函數(shù)的主要目標(biāo)是定位和提取與模板信號(hào)密切匹配的輸入時(shí)間序列片段。通過將模板信號(hào)與輸入時(shí)間序列進(jìn)行比較,可以找到這些片段,該函數(shù)返回輸入時(shí)間序列中這些片段開始的位置或索引。

segment_distance = get_distance_dict(["Dynamic Time Warping"])

segment_results = time_series_segmentation(segment_distance, template_signal, signal_np)

for k in segment_results:
plt.figure(figsize=(15, 3))
plt.plot(signal_np, color='gray')
plt.vlines(segment_results[k], np.min(signal_np)-1, np.max(signal_np) + 1, 'C1')
plt.xlabel('Indices')
plt.ylabel('Amplitude')
plt.title(k)

圖片

tssearch庫中還有另一個(gè)用于發(fā)現(xiàn)時(shí)間序列數(shù)據(jù)中的相似性和差異性的方法。首先,我們配置了一個(gè)字典dict_distances來指定搜索的距離度量。定義了兩種不同的方法。第一個(gè),標(biāo)記為“elastic”,采用動(dòng)態(tài)時(shí)間規(guī)整(DTW)作為相似性度量。使用特定的參數(shù)定制DTW,例如dtw_type設(shè)置為“sub-dtw”,alpha設(shè)置為0.5,允許靈活的時(shí)間序列對齊和比較。然后是“l(fā)ockstep”,它利用歐幾里得距離以一種更嚴(yán)格的方式來衡量相似性。有了這些距離配置,就可以使用time_series_search函數(shù)執(zhí)行時(shí)間序列搜索,將模板信號(hào)與目標(biāo)信號(hào)(signal_np)進(jìn)行比較,并指定前30個(gè)匹配項(xiàng)的輸出。

dict_distances = {
"elastic": {
"Dynamic Time Warping": {
"function": "dtw",
"parameters": {"dtw_type": "sub-dtw", "alpha": 0.5},
}
},
"lockstep": {
"Euclidean Distance": {
"function": "euclidean_distance",
"parameters": "",
}
}
}

result = time_series_search(dict_distances, template_signal, signal_np, output=("number", 30))
plot_search_distance_result(result, signal_np)

圖片

圖片

這是一種時(shí)間序列聚類的簡單的方法,并且可解釋性很強(qiáng)。

Tsfresh

tsfresh庫則是一個(gè)很好的自動(dòng)化特征提取過程的工具。effentfcparameters()定義了一組提取設(shè)置,它指定了特征提取參數(shù)和配置。這些設(shè)置可以控制在提取過程中計(jì)算哪些特征。然后就可以使用extract_features函數(shù)應(yīng)用進(jìn)行特征的提取。這里應(yīng)該將“Activity”列作為標(biāo)識(shí)符列,并提供了特征提取參數(shù)。重要的是,該庫可以對缺失值(NaN)的特征進(jìn)行自動(dòng)刪除,結(jié)果保存在x_extract中,是從時(shí)間序列數(shù)據(jù)中提取的大量特征集合。Tsfresh簡化了通常復(fù)雜且耗時(shí)的特征工程過程,為時(shí)間序列分析提供了寶貴的資源。

extraction_settings = EfficientFCParameters()
X_extracted = extract_features(final_df, column_id='Activity',
default_fc_parameters=extraction_settings,
# we impute = remove all NaN features automatically
impute_function=impute, show_warnings=False)

X_extracted= pd.DataFrame(X_extracted, index=X_extracted.index, columns=X_extracted.columns)

values = list(range(1, 13))
y = pd.Series(values, index=range(1, 13))

relevance_table_clf = calculate_relevance_table(X_extracted, y)
relevance_table_clf.sort_values("p_value", inplace=True)
relevance_table_clf.head(10)

圖片

top_features = relevance_table_clf["feature"].head(10)
x_features = X_extracted[top_features]

圖片

總結(jié)

本文向您介紹了時(shí)間序列分析的四個(gè)基本Python庫:statmodels、tslearn、tssearch和tsfresh。時(shí)間序列分析是金融和醫(yī)療保健等各個(gè)領(lǐng)域的重要工具,在這些領(lǐng)域,我們需要了解數(shù)據(jù)隨時(shí)間的變化趨勢,以便做出明智的決策和預(yù)測。

每個(gè)庫都專注于時(shí)間序列分析的不同方面,選擇哪個(gè)庫取決于具體問題。通過結(jié)合使用這些庫,可以處理各種與時(shí)間相關(guān)的挑戰(zhàn),從預(yù)測財(cái)務(wù)趨勢到對醫(yī)療保健中的活動(dòng)進(jìn)行分類。當(dāng)要開始自己的時(shí)間序列分析項(xiàng)目時(shí),請記住這些庫,結(jié)合著使用它們可以幫助你解決很多的實(shí)際問題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4344

    瀏覽量

    62864
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3291

    瀏覽量

    57823
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4806

    瀏覽量

    84935
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1209

    瀏覽量

    24777
收藏 人收藏

    評論

    相關(guān)推薦

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】全書概覽與時(shí)間序列概述

    的,書籍封面如下。下面對全書概覽并對第一章時(shí)間序列概述進(jìn)行細(xì)度。 一. 全書概覽 全書分為8章,每章的簡介如下: ●第1章“時(shí)間序列概述”:介紹
    發(fā)表于 08-07 23:03

    【《時(shí)間序列與機(jī)器學(xué)習(xí)》閱讀體驗(yàn)】+ 了解時(shí)間序列

    收到《時(shí)間序列與機(jī)器學(xué)習(xí)》一書,彩色印刷,公式代碼清晰,非常精美。感謝作者,感謝電子發(fā)燒友提供了一個(gè)讓我學(xué)習(xí)時(shí)間序列及應(yīng)用的機(jī)會(huì)! 前言第一
    發(fā)表于 08-11 17:55

    【《時(shí)間序列與機(jī)器學(xué)習(xí)》閱讀體驗(yàn)】+ 時(shí)間序列的信息提取

    本人有些機(jī)器學(xué)習(xí)的基礎(chǔ),理解起來一點(diǎn)也不輕松,加油。 作者首先說明了時(shí)間序列的信息提取是時(shí)間序列分析的一
    發(fā)表于 08-14 18:00

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】時(shí)間序列的信息提取

    本章主講時(shí)間序列的信息提取,章節(jié)中有許多概念定義和數(shù)學(xué)公式,并配有Python代碼演示,細(xì)細(xì)品讀與理解動(dòng)手演練,還是很開拓思維視野的。下面以筆記形式進(jìn)行展開。 時(shí)間
    發(fā)表于 08-17 21:12

    python數(shù)據(jù)分析的類

    ,因?yàn)樗匾?Pandas提供了我們很多函數(shù),能夠快速的方便的,處理結(jié)構(gòu)化的大型數(shù)據(jù),不夸張的說,Pandas是讓Python成為強(qiáng)大的數(shù)據(jù)分析工具的非常重要的一個(gè)因素。而且對于
    發(fā)表于 05-10 15:18

    怎么有效學(xué)習(xí)Python數(shù)據(jù)分析

    的過程。對于新手,如何學(xué)好python,這些很關(guān)鍵:Part1:能掌握好Python關(guān)鍵代碼以及Pandas、Numpy、Matplotlib、Seaborn這四個(gè)基本工具包,便能獨(dú)立完成一些簡單的數(shù)據(jù)
    發(fā)表于 06-28 15:18

    利用Python進(jìn)行數(shù)據(jù)分析時(shí)間序列基礎(chǔ)

    《利用Python進(jìn)行數(shù)據(jù)分析》 112時(shí)間序列基礎(chǔ)
    發(fā)表于 03-20 09:30

    JavaEE+項(xiàng)目案例+(代碼+數(shù)據(jù))前四個(gè)

    JavaEE+項(xiàng)目案例+(代碼+數(shù)據(jù))前四個(gè)
    發(fā)表于 12-09 16:38 ?12次下載

    時(shí)間序列小波分析的操作步驟及實(shí)例分析

    時(shí)間序列(Time Series)是地學(xué)研究中經(jīng)常遇到的問題。在時(shí)間序列研究中,時(shí)域和頻域是常用的兩種基本形式。其中,時(shí)域分析具有
    發(fā)表于 11-15 10:45 ?6.8w次閱讀
    <b class='flag-5'>時(shí)間</b><b class='flag-5'>序列</b>小波<b class='flag-5'>分析</b>的操作步驟及實(shí)例<b class='flag-5'>分析</b>

    Git的使用說明四個(gè)點(diǎn)詳細(xì)說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Git的使用說明四個(gè)點(diǎn)詳細(xì)說明包括了:一、創(chuàng)建版本 ,二、VS2017中使用創(chuàng)建、提交項(xiàng)目,三、提交代碼,、創(chuàng)建分支
    發(fā)表于 06-18 08:00 ?0次下載

    四個(gè)有趣的關(guān)于Python 3.9版本新特性

    四個(gè)有趣的關(guān)于Python 3.9版本新特性
    的頭像 發(fā)表于 10-08 14:47 ?3107次閱讀
    <b class='flag-5'>四個(gè)</b>有趣的關(guān)于<b class='flag-5'>Python</b> 3.9版本新特性

    如何用Python進(jìn)行時(shí)間序列分解和預(yù)測?

    ,那么本文將帶你快速掌握一些必不可少的概念。 目錄 什么是時(shí)間序列? 如何在Python中繪制時(shí)間序列數(shù)據(jù)?
    的頭像 發(fā)表于 02-14 11:34 ?2543次閱讀
    如何用<b class='flag-5'>Python</b>進(jìn)行<b class='flag-5'>時(shí)間</b><b class='flag-5'>序列</b>分解和預(yù)測?

    時(shí)間序列分析及其應(yīng)用

    時(shí)間序列分析及其應(yīng)用。
    發(fā)表于 02-22 13:56 ?1次下載

    時(shí)間序列分析的定義

    01 時(shí)間序列分析的定義 1.1 概念 首先,時(shí)間序列定義為在一定時(shí)間間隔內(nèi)按
    的頭像 發(fā)表于 03-16 16:17 ?5727次閱讀

    python列表序列操作教程

    python列表也是序列對象,可以進(jìn)行序列通用的操作,類似字符串序列的操作。
    的頭像 發(fā)表于 02-23 15:04 ?677次閱讀