0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

时间序列分析的四个基本Python库介绍

科技绿洲 来源:Python数据科学 作者:Python数据科学 2023-11-03 10:17 次阅读

在本文中,我们将介绍四个主要的Python库——statmodels、tslearn、tssearch、 tsfresh ——每个库都针对时间序列分析的不同方面进行了定制。这些库为从预测到模式识别的任务提供了强大的工具,使它们成为各种应用程序的宝贵资源。

我们使用来自Kaggle的数据集,通过加速度计数为各种身体活动进行分析。这些活动被分为12个不同的类别,每个类别对应一个特定的身体动作,如站立、坐着、行走,或从事更有活力的活动,如慢跑和骑自行车。每个活动都记录了一分钟的持续时间,提供了丰富的时间序列数据源。

用于此分析的库有:

# 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库中,两个基本函数在理解从x, y和z方向收集的加速度数据的特征方面起着关键作用。

adfuller函数是确定时间序列信号平稳性的有力工具。通过对我们的数据进行Augmented Dickey-Fuller检验,可以确定加速度信号是否表现出平稳的行为,这是许多时间序列分析技术的基本要求。这个测试帮助我们评估数据是否随时间而变化。

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函数提供了对时间序列数据结构的宝贵见解。它将时间序列分解为三个不同的组成部分:趋势、季节性和残差。这种分解使我们能够可视化和理解加速度数据中的潜在模式和异常。

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库进行时间序列分析。可以采用分割方法,将连续的加速信号分解成特定长度的离散段或窗口(例如,150个数据点)。这些片段提供了行走过程中运动的颗粒视图,并成为进一步分析的基础。重要的是,我们在相邻部分之间使用了50个数据点的重叠,从而可以更全面地覆盖潜在的动态。

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)]

图片

为了从这些片段中获得一个封装行走典型特征的代表性模板,我们使用了dtw_barycenter_averaging函数。该方法采用动态时间规整(Dynamic Time Warping, DTW)对分割的时间序列进行对齐和平均,有效地创建了一个捕捉步行运动中心趋势的模板。

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

生成的模板为后续的分类和比较任务提供了有价值的参考,有助于基于x轴加速度的步行活动识别和分析。

图片

Tssearch

对于tssearch库使用time_series_segmentation函数,通过动态时间规整(DTW)或其他相似性度量来识别输入时间序列中与所提供的模板信号最相似的片段。

该函数的主要目标是定位和提取与模板信号密切匹配的输入时间序列片段。通过将模板信号与输入时间序列进行比较,可以找到这些片段,该函数返回输入时间序列中这些片段开始的位置或索引

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库中还有另一个用于发现时间序列数据中的相似性和差异性的方法。首先,我们配置了一个字典dict_distances来指定搜索的距离度量。定义了两种不同的方法。第一个,标记为“elastic”,采用动态时间规整(DTW)作为相似性度量。使用特定的参数定制DTW,例如dtw_type设置为“sub-dtw”,alpha设置为0.5,允许灵活的时间序列对齐和比较。然后是“lockstep”,它利用欧几里得距离以一种更严格的方式来衡量相似性。有了这些距离配置,就可以使用time_series_search函数执行时间序列搜索,将模板信号与目标信号(signal_np)进行比较,并指定前30个匹配项的输出。

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)

图片

图片

这是一种时间序列聚类的简单的方法,并且可解释性很强。

Tsfresh

tsfresh库则是一个很好的自动化特征提取过程的工具。effentfcparameters()定义了一组提取设置,它指定了特征提取参数和配置。这些设置可以控制在提取过程中计算哪些特征。然后就可以使用extract_features函数应用进行特征的提取。这里应该将“Activity”列作为标识符列,并提供了特征提取参数。重要的是,该库可以对缺失值(NaN)的特征进行自动删除,结果保存在x_extract中,是从时间序列数据中提取的大量特征集合。Tsfresh简化了通常复杂且耗时的特征工程过程,为时间序列分析提供了宝贵的资源。

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]

图片

总结

本文向您介绍了时间序列分析的四个基本Python库:statmodels、tslearn、tssearch和tsfresh。时间序列分析是金融和医疗保健等各个领域的重要工具,在这些领域,我们需要了解数据随时间的变化趋势,以便做出明智的决策和预测。

每个库都专注于时间序列分析的不同方面,选择哪个库取决于具体问题。通过结合使用这些库,可以处理各种与时间相关的挑战,从预测财务趋势到对医疗保健中的活动进行分类。当要开始自己的时间序列分析项目时,请记住这些库,结合着使用它们可以帮助你解决很多的实际问题。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3904

    浏览量

    61311
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56412
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
  • 数据集
    +关注

    关注

    4

    文章

    1179

    浏览量

    24356
收藏 人收藏

    评论

    相关推荐

    十大Python机器学习常用

    学习这些框架,高效开发。这些应用程序可在浏览器和移动设备中使用。6. PyFluxPyFlux 是专门针对时间序列开发的 Python 开源时间
    发表于 05-02 16:37

    python数据分析的类

    ,因为它太重要了.Pandas提供了我们很多函数,能够快速的方便的,处理结构化的大型数据,不夸张的说,Pandas是让Python成为强大的数据分析工具的非常重要的一因素。而且对于
    发表于 05-10 15:18

    时间序列数据的处理

    摘要: 随着云计算和IoT的发展,时间序列数据的数据量急剧膨胀,高效的分析时间序列数据,使之产生业务价值成为一
    发表于 05-30 16:08

    怎么有效学习Python数据分析

    的过程。对于新手,如何学好python,这些很关键:Part1:能掌握好Python关键代码以及Pandas、Numpy、Matplotlib、Seaborn这四个基本工具包,便能独立完成一些简单的数据
    发表于 06-28 15:18

    利用Python进行数据分析时间序列基础

    《利用Python进行数据分析》 112时间序列基础
    发表于 03-20 09:30

    如何在同一中使用四个Selectio Wizard从四个不同的通道中捕获数据?

    嗨,大家好,我正在开发一Vivado项目,我想在同一中使用四个Selectio Wizard(使用iodelay)从四个不同的通道中捕
    发表于 08-17 10:31

    成为Python数据分析师,需要掌握哪些技能

    有很多封装好的工具和命令,我要做的是用哪些数学方法解决一问题,并构建出来。要想快速入门Python数据分析,就要使用好Python相关的
    发表于 06-23 12:16

    成为Python数据分析师,需要掌握哪些技能

    有很多封装好的工具和命令,我要做的是用哪些数学方法解决一问题,并构建出来。要想快速入门Python数据分析,就要使用好Python相关的
    发表于 06-30 11:42

    介绍有关时间序列预测和时间序列分类

    通过之前有关LSTM的8遍基础教程和10篇处理时间序列预测任务的教程介绍,使用简单的序列数据示例,已经把LSTM的原理,数据处理流程,模型架构,Keras实现都讲清楚了。从这篇文章开始
    发表于 07-12 09:18

    基于SVM的混沌时间序列分析

    支持向量机是一种基于统计学习理论的新的机器学习方法,该方法已用于解决模式分类问题. 本文将支持向量机( SVM)用于混沌时间序列分析,实验数据采用典型地Mackey - Glass混沌时间
    发表于 10-10 15:14 0次下载
    基于SVM的混沌<b class='flag-5'>时间</b><b class='flag-5'>序列</b><b class='flag-5'>分析</b>

    时间序列小波分析的操作步骤及实例分析

    时间序列(Time Series)是地学研究中经常遇到的问题。在时间序列研究中,时域和频域是常用的两种基本形式。其中,时域分析具有
    发表于 11-15 10:45 6.7w次阅读
    <b class='flag-5'>时间</b><b class='flag-5'>序列</b>小波<b class='flag-5'>分析</b>的操作步骤及实例<b class='flag-5'>分析</b>

    如何用Python进行时间序列分解和预测?

    ,那么本文将带你快速掌握一些必不可少的概念。 目录 什么是时间序列? 如何在Python中绘制时间序列数据?
    的头像 发表于 02-14 11:34 2201次阅读
    如何用<b class='flag-5'>Python</b>进行<b class='flag-5'>时间</b><b class='flag-5'>序列</b>分解和预测?

    时间序列分析及其应用

    时间序列分析及其应用。
    发表于 02-22 13:56 1次下载

    时间序列分析的定义

    01 时间序列分析的定义 1.1 概念 首先,时间序列定义为在一定时间间隔内按
    的头像 发表于 03-16 16:17 4329次阅读

    python列表序列操作教程

    python列表也是序列对象,可以进行序列通用的操作,类似字符串序列的操作。
    的头像 发表于 02-23 15:04 434次阅读