精华内容
下载资源
问答
  • 对应分析的可以对时间序列
    万次阅读 多人点赞
    更多相关内容
  • Python时间序列分析指南!

    千次阅读 2021-08-01 00:17:54
    Datawhale干货译者:陈超,北京大学,数据派THU 本文约7500字,建议阅读20+分钟本文介绍了时间序列的定义、特征并结合实例给出了时间序列在Python中评价指标和方法。...

     Datawhale干货 

    译者:陈超北京大学,数据派THU

    
    
    
    本文约7500字,建议阅读20+分钟本文介绍了时间序列的定义、特征并结合实例给出了时间序列在Python中评价指标和方法。
    

    时间序列是在规律性时间间隔上记录的观测值序列。本指南将带你了解在Python中分析给定时间序列的特征的全过程。

    主要内容

    1. 什么是时间序列?

    2. 如何在Python中导入时间序列?

    3. 什么是面板数据?

    4. 时间序列可视化

    5. 时间序列的模式

    6. 时间序列的加法和乘法

    7. 如何将时间序列分解?

    8. 平稳和非平稳时间序列

    9. 如何获取平稳的时间序列?

    10. 如何检验平稳性?

    11. 白噪音和平稳序列的差异是什么?

    12. 如何去除时间序列的线性分量?

    13. 如何消除时间序列的季节性?

    14. 如何检验时间序列的季节性?

    15. 如何处理时间序列中的缺失值?

    16. 什么是自回归和偏自回归函数?

    17. 如何计算偏自回归函数?

    18. 滞后图

    19. 如何估计时间序列的预测能力?

    20. 为什么以及怎样使时间序列平滑?

    21. 如何使用Granger因果检验来获知时间序列是否对预测另一个序列帮助?

    22. 下一步是什么?

     

    1. 什么是时间序列?

    时间序列是在规律性时间间隔记录的观测值序列。

    依赖于观测值的频率,典型的时间序列可分为每小时、每天、每周、每月、每季度和每年为单位记录。有时,你可能也会用到以秒或者分钟为单位的时间序列,比如,每分钟用户点击量和访问量等等。

    1.1 为什么要分析时间序列呢?

    因为它是你做序列预测前的一步准备过程。而且,时间序列预测拥有巨大的商业重要性,因为对商业来说非常重要的需求和销量、网站访问人数、股价等都是时间序列数据。

    1.2 所以时间序列分析包括什么内容呢?

    时间序列分析包括理解序列内在本质的多个方面以便于你可更好地了解如何做出有意义并且精确的预测。

    2. 如何在Python中导入时间序列?

    所以怎样导入时间序列数据呢?典型的时间序列数据以.csv格式或者其他表格形式存储,包括两列:日期和测量值。

    让我们用pandas包里的read.csv()读取时间序列数据(一个澳大利亚药品销售的csv文件)作为一个pandas数据框。加入parse_dates=[‘date’]参数将会把日期列解析为日期字段。

    from dateutil.parser import parse
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import seaborn as sns
    import numpy as np
    import pandas as pd
    plt.rcParams.update({'figure.figsize': (10, 7), 'figure.dpi': 120})
    
    
    # Import as Dataframe
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'])
    df.head()
    

    数据框时间序列

    此外,你也可以将其导入为date作为索引的pandas序列。你只需要固定pd.read_csv()里的index_col参数。

    ser = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
    ser.head()
    

    时间序列

    注意,在此序列当中,‘value’列的位置高于date以表明它是一个序列。

    3. 什么是面板数据?

    面板数据也是基于时间的数据集。

    差异在于,除了时间序列,它也包括同时测量的一个或多个相关变量。

    通常来看,面板数据当中的列包括了有助于预测Y的解释型变量,假设这些列将在未来预测阶段有用。

    面板数据的例子如下:

    # dataset source: https://github.com/rouseguy
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/MarketArrivals.csv')
    df = df.loc[df.market=='MUMBAI', :]
    df.head()
    

     

    面板数据

    4. 时间序列可视化

    让我们用matplotlib来对序列进行可视化。

     

    # Time series data source: fpp pacakge in R.
    import matplotlib.pyplot as plt
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
    
    
    # Draw Plot
    def plot_df(df, x, y, title="", xlabel='Date', ylabel='Value', dpi=100):
        plt.figure(figsize=(16,5), dpi=dpi)
        plt.plot(x, y, color='tab:red')
        plt.gca().set(title=title, xlabel=xlabel, ylabel=ylabel)
        plt.show()
    
    
    plot_df(df, x=df.index, y=df.value, title='Monthly anti-diabetic drug sales in  Australia from 1992 to 2008.')
    

     

     时间序列可视化

    因为所有的值都是正值,你可以在Y轴的两侧进行显示此值以强调增长。

    # Import data
    df = pd.read_csv('datasets/AirPassengers.csv', parse_dates=['date'])
    x = df['date'].values
    y1 = df['value'].values
    
    
    # Plot
    fig, ax = plt.subplots(1, 1, figsize=(16,5), dpi= 120)
    plt.fill_between(x, y1=y1, y2=-y1, alpha=0.5, linewidth=2, color='seagreen')
    plt.ylim(-800, 800)
    plt.title('Air Passengers (Two Side View)', fontsize=16)
    plt.hlines(y=0, xmin=np.min(df.date), xmax=np.max(df.date), linewidth=.5)
    plt.show()
    

    航空乘客数据——两侧序列

    因为这是一个月度时间序列,每年遵循特定的重复模式,你可以把每年作为一个单独的线画在同一张图上。这可以让你同时比较不同年份的模式。

    4.1 时间序列的季节图

    # Import Data
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
    df.reset_index(inplace=True)
    
    
    # Prepare data
    df['year'] = [d.year for d in df.date]
    df['month'] = [d.strftime('%b') for d in df.date]
    years = df['year'].unique()
    
    
    # Prep Colors
    np.random.seed(100)
    mycolors = np.random.choice(list(mpl.colors.XKCD_COLORS.keys()), len(years), replace=False)
    
    
    # Draw Plot
    plt.figure(figsize=(16,12), dpi= 80)
    for i, y in enumerate(years):
        if i > 0:        
            plt.plot('month', 'value', data=df.loc[df.year==y, :], color=mycolors[i], label=y)
            plt.text(df.loc[df.year==y, :].shape[0]-.9, df.loc[df.year==y, 'value'][-1:].values[0], y, fontsize=12, color=mycolors[i])
    
    
    # Decoration
    plt.gca().set(xlim=(-0.3, 11), ylim=(2, 30), ylabel='$Drug Sales$', xlabel='$Month$')
    plt.yticks(fontsize=12, alpha=.7)
    plt.title("Seasonal Plot of Drug Sales Time Series", fontsize=20)
    plt.show()
    

    药品销售的季节图

    每年二月会迎来药品销售的急速下降,而在三月会再度上升,接下来的4月又开始下降,以此类推。很明显,该模式在特定的某一年中重复,且年年如此。

    然而,随着年份推移,药品销售整体增加。你可以很好地看到该趋势并且在年份箱线图当中看到它是怎样变化的。同样地,你也可以做一个月份箱线图来可视化月度分布情况。

    4.2 月度(季节性)箱线图和年度(趋势)分布

    你可以季节间隔将数据分组,并看看在给定的年份或月份当中值是如何分布的,以及随时间推移它们是如何比较的。

    # Import Data
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
    df.reset_index(inplace=True)
    
    
    # Prepare data
    df['year'] = [d.year for d in df.date]
    df['month'] = [d.strftime('%b') for d in df.date]
    years = df['year'].unique()
    
    
    # Draw Plot
    fig, axes = plt.subplots(1, 2, figsize=(20,7), dpi= 80)
    sns.boxplot(x='year', y='value', data=df, ax=axes[0])
    sns.boxplot(x='month', y='value', data=df.loc[~df.year.isin([1991, 2008]), :])
    
    
    # Set Title
    axes[0].set_title('Year-wise Box Plot\n(The Trend)', fontsize=18); 
    axes[1].set_title('Month-wise Box Plot\n(The Seasonality)', fontsize=18)
    plt.show()
    

    年度和月度箱线图

    箱线图将年度和月度分布变得很清晰。并且,在阅读箱线图当中,12月和1月明显有更高的药品销售量,可被归因于假期折扣季。

    到目前为止,我们已经看到了识别模式的相似之处。现在怎样才能从通常模式当中找到离群值呢?

    5. 时间序列的模式

    任何时间序列都可以被分解为如下的部分:基线水平+趋势+季节性+误差

    当在时间序列当中观测到增加或降低的斜率时,即可观测到相应的趋势。然而季节性只有在由于季节性因素导致不同的重复模式在规律性的间隔之间被观测到时才能发现。可能是由于当年的特定月份,特定月份的某一天、工作日或者甚至是当天某个时间。

    然而,并不是所有时间序列必须有一个趋势和/或季节性。时间序列可能没有不同的趋势但是有一个季节性。反之亦然。

    所以时间序列可以被看做是趋势、季节性和误差项的整合。

    fig, axes = plt.subplots(1,3, figsize=(20,4), dpi=100)
    pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/guinearice.csv', parse_dates=['date'], index_col='date').plot(title='Trend Only', legend=False, ax=axes[0])
    
    
    pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/sunspotarea.csv', parse_dates=['date'], index_col='date').plot(title='Seasonality Only', legend=False, ax=axes[1])
    
    
    pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/AirPassengers.csv', parse_dates=['date'], index_col='date').plot(title='Trend and Seasonality', legend=False, ax=axes[2])
    

    时间序列中的模式

    另一个需要考虑的方面是循环的行为。当序列当中上升和下降模式并不在固定的日历间隔出现时,就会出现循环的行为。需注意不要混淆循环的效应和季节的效应。

    所以,怎样区分循环的和季节性的模式呢?

    如果模式不是基于固定的日历频率,那它就是循环的。因为,循环效应不像季节性那样受到商业和其他社会经济因素的影响。

    6. 时间序列的加法和乘法

    基于趋势和季节性的本质,时间序列以加法或乘法的形式建模,其中序列里的每个观测值可被表达为成分的和或者积:

    加法时间序列:值=基线水平+趋势+季节性+误差

    乘法时间序列:值=基线水平*趋势*季节性*误差

    7. 怎样分解时间序列的成分?

    你可以通过将序列作基线水平,趋势,季节性指数和残差的加法或乘法组合来实现一个经典的时间序列分解。

    statsmodels包里的seasonal_decompose使用起来非常方便。

    from statsmodels.tsa.seasonal import seasonal_decompose
    from dateutil.parser import parse
    
    
    # Import Data
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
    
    
    # Multiplicative Decomposition
    result_mul = seasonal_decompose(df['value'], model='multiplicative', extrapolate_trend='freq')
    
    
    # Additive Decomposition
    result_add = seasonal_decompose(df['value'], model='additive', extrapolate_trend='freq')
    
    
    # Plot
    plt.rcParams.update({'figure.figsize': (10,10)})
    result_mul.plot().suptitle('Multiplicative Decompose', fontsize=22)
    result_add.plot().suptitle('Additive Decompose', fontsize=22)
    plt.show()
    

    加法和乘法分解

    在序列开始时,设置extrapolate_trend='freq' 来注意趋势和残差中缺失的任何值。

    如果你仔细看加法分解当中的残差,它有一些遗留模式。乘法分解看起来非常随意,这很好。所以理想状况下,乘法分解应该在这种特定的序列当中优先选择。

    趋势,季节性和残差成分的数值输出被存储在result_mul 当中。让我们提取它们并导入数据框中。

    # Extract the Components ----
    # Actual Values = Product of (Seasonal * Trend * Resid)
    df_reconstructed = pd.concat([result_mul.seasonal, result_mul.trend, result_mul.resid, result_mul.observed], axis=1)
    df_reconstructed.columns = ['seas', 'trend', 'resid', 'actual_values']
    df_reconstructed.head()
    

    如果你检查一下seas, trend 和 resid列的乘积,应该确实等于actual_values。

    8. 平稳和非平稳时间序列

    平稳性是时间序列的属性之一。平稳序列的值不是时间的函数。

    也就是说,这种序列的统计属性例如均值,方差和自相关是随时间不变的常数。序列的自相关只是与前置值的相关,之后会详细介绍。

    平稳时间序列也没有季节效应。

    所以如何识别一个序列是否平稳呢?让我们通过实例来展示一下:

    平稳和非平稳时间序列

    上图来自R语言的 TSTutorial。

    所以为什么平稳序列是重要的呢?为什么我要提到它?

    我将展开讲一下,但是要理解它只是有可能通过使用特定的转换方法实现任何时间序列的平稳化。大多数统计预测方法都用于平稳时间序列。预测的第一步通常是做一些转换将非平稳数据转化为平稳数据。

    9. 如何获取平稳的时间序列?

    你可以通过以下步骤实现序列的平稳化:

    1. 差分序列(一次或多次);

    2. 对序列值进行log转换;

    3. 对序列值去n次根式值;

    4. 结合上述方法。

    实现数据平稳化最常见也最方便的方法是对序列进行差分至少一次,直到它变得差不多平稳为止。

    9.1 所以什么是差分?

    如果Y_t是t时刻的Y值,那么第一次差分Y = Yt – Yt-1。在简化的格式当中,差分序列就是从当前值中减去下一个值。

    如果第一次差分不能使数据平稳,你可以第二次差分,以此类推。

    例如,考虑如下序列: [1, 5, 2, 12, 20]

    一次差分: [5-1, 2-5, 12-2, 20-12] = [4, -3, 10, 8]

    二次差分: [-3-4, -10-3, 8-10] = [-7, -13, -2]


    9.2 为什么要在预测之前将非平稳数据平稳化?

    预测平稳序列相对容易,预测也相对更可靠。

    一个重要的原因是自回归预测模型必须是利用序列自身的滞后量作为预测变量的线性回归模型。

    我们知道线性回归在预测变量(X变量)与其他变量不相关时效果最佳。所以序列平稳化也因为移除所有持续的自相关而解决了这个问题,因此使得模型中的预测变量(序列的滞后值)几乎独立。

    现在我们已经建立了序列平稳化非常重要的概念,那怎样检验给定序列是否平稳化呢?

    10. 怎样检验平稳性?

    序列的平稳性可以通过之前我们提到的序列图看出来。

    另外一种方法是将序列分成2或多个连续的部分,计算概要统计量例如均值,方差和自相关。如果统计量显著差异,序列可能不是平稳的。

    尽管如此,你需要一个方法来从量化的角度判断一个给定序列是否平稳。可以通过‘Unit Root Tests单位根检验’来实现。这里有多种变式,但这些检验都是用来检测时间序列是否非平稳并且拥有一个单位根。

    有多种单位根检验的具体应用:

    1. 增广迪基·富勒检验(ADF Test);

    2. 科维亚特夫斯基-菲利普斯-施密特-辛-KPSS检验(趋势平稳性);

    3. 菲利普斯 佩龙检验(PP Test)。

    最常用的是ADF检验,零假设是时间序列只有一个单位根并且非平稳。所以ADF检验p值小于0.05的显著性水平,你拒绝零假设。

    KPSS检验,另一方面,用于检验趋势平稳性。零假设和p值解释与ADH检验相反。下面的代码使用了python中的statsmodels包来做这两种检验。

    from statsmodels.tsa.stattools import adfuller, kpss
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'])
    
    
    # ADF Test
    result = adfuller(df.value.values, autolag='AIC')
    print(f'ADF Statistic: {result[0]}')
    print(f'p-value: {result[1]}')
    for key, value in result[4].items():
        print('Critial Values:')
        print(f'   {key}, {value}')
    
    
    # KPSS Test
    result = kpss(df.value.values, regression='c')
    print('\nKPSS Statistic: %f' % result[0])
    print('p-value: %f' % result[1])
    for key, value in result[3].items():
        print('Critial Values:')
        print(f'   {key}, {value}')
    ADF Statistic: 3.14518568930674
    p-value: 1.0
    Critial Values:
       1%, -3.465620397124192
    Critial Values:
       5%, -2.8770397560752436
    Critial Values:
       10%, -2.5750324547306476
    
    
    KPSS Statistic: 1.313675
    p-value: 0.010000
    Critial Values:
       10%, 0.347
    Critial Values:
       5%, 0.463
    Critial Values:
       2.5%, 0.574
    Critial Values:
       1%, 0.739
    


    11. 白噪音和平稳序列的差异是什么?

    如平稳序列,白噪音也不是时间的函数,它的均值和方差并不随时间变化。但是它与平稳序列的差异在于,白噪音完全随机,均值为0。

    无论怎样,在白噪音当中是没有特定模式的。如果你将FM广播的声音信号作为时间序列,你在频道之间的频段听到的空白声就是白噪音。

    从数学上来看,均值为0的完全随机的数字序列是白噪音。

    randvals = np.random.randn(1000)
    pd.Series(randvals).plot(title='Random White Noise', color='k')
    

    随机白噪音

    12. 怎样将时间序列去趋势化?

    对时间序列去趋势就是从时间序列当中移除趋势成分。但是如何提取趋势呢?有以下几个方法。

    1. 从时间序列当中减去最优拟合线。最佳拟合线可从以时间步长为预测变量获得的线性回归模型当中获得。对更复杂的模型,你可以使用模型中的二次项(x^2);

    2. 从我们之前提过的时间序列分解当中减掉趋势成分;

    3. 减去均值;

    4. 应用像Baxter-King过滤器(statsmodels.tsa.filters.bkfilter)或者Hodrick-Prescott 过滤器 (statsmodels.tsa.filters.hpfilter)来去除移动的平均趋势线或者循环成分。

    让我们来用一下前两种方法。

    # Using scipy: Subtract the line of best fit
    from scipy import signal
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'])
    detrended = signal.detrend(df.value.values)
    plt.plot(detrended)
    plt.title('Drug Sales detrended by subtracting the least squares fit', fontsize=16)
    

    通过减去最小二乘拟合来对时间序列去趋势化

    # Using statmodels: Subtracting the Trend Component.
    from statsmodels.tsa.seasonal import seasonal_decompose
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
    result_mul = seasonal_decompose(df['value'], model='multiplicative', extrapolate_trend='freq')
    detrended = df.value.values - result_mul.trend
    plt.plot(detrended)
    plt.title('Drug Sales detrended by subtracting the trend component', fontsize=16)
    

    通过减去趋势成分来去趋势化

    13. 怎样对时间序列去季节化?

    这里有多种方法对时间序列去季节化。以下就有几个:

    1. 取一个以长度为季节窗口的移动平均线。这将在这个过程中使序列变得平滑;

    2. 序列季节性差分(从当前值当中减去前一季节的值);

    3. 将序列值除以从STL分解当中获得的季节性指数。

    如果除以季节性指数后仍没办法得到良好的结果,再试一下序列对数转换然后再做。你之后可以通过去指数恢复到原始尺度。

    # Subtracting the Trend Component.
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date')
    
    
    # Time Series Decomposition
    result_mul = seasonal_decompose(df['value'], model='multiplicative', extrapolate_trend='freq')
    
    
    # Deseasonalize
    deseasonalized = df.value.values / result_mul.seasonal
    
    
    # Plot
    plt.plot(deseasonalized)
    plt.title('Drug Sales Deseasonalized', fontsize=16)
    plt.plot()
    

    时间序列去季节化

    14. 怎样检验时间序列的季节性?

    常见的方法是绘制序列并在固定的时间间隔内检查可重复的模式。所以,季节性的类型由钟表或日历决定:

    1. 一天的每个小时;

    2. 一月的每天;

    3. 每周;

    4. 每月;

    5. 每年。

    然而,如果你想要一个更权威的季节性检验,使用自回归函数(ACF)图。更多关于自回归的信息将在下一部分介绍。但是当强季节性模式出现时,ACF图通常揭示了在季节窗的倍数处明显的重复峰值。

    例如,药品销售时间序列是每年都有重复模式的一个月度序列。所以,你可以看到第12,24和36条线等的峰值。

    我必须警告你在现实世界的数据集当中,这样强的模式很难见到,并且有可能被各种噪音所扭曲,所以你需要一双仔细的眼睛来捕获这些模式。

    from pandas.plotting import autocorrelation_plot
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')
    
    
    # Draw Plot
    plt.rcParams.update({'figure.figsize':(9,5), 'figure.dpi':120})
    autocorrelation_plot(df.value.tolist())
    

    自相关图

    除此之外,如果你想做统计检验,CHT检验可以检验季节性差异是否对序列平稳化有必要。

    15. 如何处理时间序列当中的缺失值?

    有时,你的时间序列会有缺失日期/时间。那意味着,数据没有被捕获或者在那段时间内不可用。那些天的测量值有可能为0,你可以把那些时间段填充0。

    其次,当处理时间序列时,你通常不应该用序列均值来替代缺失值,尤其是序列非平稳的时候,一个快捷粗略的处理方法来说你应该做的是向前填充之前的值。

    然而,依赖于序列的本质,你想要在得出结论之前尝试多种方法。有效的缺失值处理方法有:

    • 向后填充;

    • 线性内插;

    • 二次内插;

    • 最邻近平均值;

    • 对应季节的平均值。

    为了衡量缺失值的表现,我在时间序列当中手动引入缺失值,使用上述方法处理并衡量处理值和真实值之间的均方误差。

    # # Generate dataset
    from scipy.interpolate import interp1d
    from sklearn.metrics import mean_squared_error
    df_orig = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'], index_col='date').head(100)
    df = pd.read_csv('datasets/a10_missings.csv', parse_dates=['date'], index_col='date')
    
    
    fig, axes = plt.subplots(7, 1, sharex=True, figsize=(10, 12))
    plt.rcParams.update({'xtick.bottom' : False})
    
    
    ## 1. Actual -------------------------------
    df_orig.plot(title='Actual', ax=axes[0], label='Actual', color='red', style=".-")
    df.plot(title='Actual', ax=axes[0], label='Actual', color='green', style=".-")
    axes[0].legend(["Missing Data", "Available Data"])
    
    
    ## 2. Forward Fill --------------------------
    df_ffill = df.ffill()
    error = np.round(mean_squared_error(df_orig['value'], df_ffill['value']), 2)
    df_ffill['value'].plot(title='Forward Fill (MSE: ' + str(error) +")", ax=axes[1], label='Forward Fill', style=".-")
    
    
    ## 3. Backward Fill -------------------------
    df_bfill = df.bfill()
    error = np.round(mean_squared_error(df_orig['value'], df_bfill['value']), 2)
    df_bfill['value'].plot(title="Backward Fill (MSE: " + str(error) +")", ax=axes[2], label='Back Fill', color='firebrick', style=".-")
    
    
    ## 4. Linear Interpolation ------------------
    df['rownum'] = np.arange(df.shape[0])
    df_nona = df.dropna(subset = ['value'])
    f = interp1d(df_nona['rownum'], df_nona['value'])
    df['linear_fill'] = f(df['rownum'])
    error = np.round(mean_squared_error(df_orig['value'], df['linear_fill']), 2)
    df['linear_fill'].plot(title="Linear Fill (MSE: " + str(error) +")", ax=axes[3], label='Cubic Fill', color='brown', style=".-")
    
    
    ## 5. Cubic Interpolation --------------------
    f2 = interp1d(df_nona['rownum'], df_nona['value'], kind='cubic')
    df['cubic_fill'] = f2(df['rownum'])
    error = np.round(mean_squared_error(df_orig['value'], df['cubic_fill']), 2)
    df['cubic_fill'].plot(title="Cubic Fill (MSE: " + str(error) +")", ax=axes[4], label='Cubic Fill', color='red', style=".-")
    
    
    # Interpolation References:
    # https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html
    # https://docs.scipy.org/doc/scipy/reference/interpolate.html
    
    
    ## 6. Mean of 'n' Nearest Past Neighbors ------
    def knn_mean(ts, n):
        out = np.copy(ts)
        for i, val in enumerate(ts):
            if np.isnan(val):
                n_by_2 = np.ceil(n/2)
                lower = np.max([0, int(i-n_by_2)])
                upper = np.min([len(ts)+1, int(i+n_by_2)])
                ts_near = np.concatenate([ts[lower:i], ts[i:upper]])
                out[i] = np.nanmean(ts_near)
        return out
    
    
    df['knn_mean'] = knn_mean(df.value.values, 8)
    error = np.round(mean_squared_error(df_orig['value'], df['knn_mean']), 2)
    df['knn_mean'].plot(title="KNN Mean (MSE: " + str(error) +")", ax=axes[5], label='KNN Mean', color='tomato', alpha=0.5, style=".-")
    
    
    ## 7. Seasonal Mean ----------------------------
    def seasonal_mean(ts, n, lr=0.7):
        """
        Compute the mean of corresponding seasonal periods
        ts: 1D array-like of the time series
        n: Seasonal window length of the time series
        """
        out = np.copy(ts)
        for i, val in enumerate(ts):
            if np.isnan(val):
                ts_seas = ts[i-1::-n]  # previous seasons only
                if np.isnan(np.nanmean(ts_seas)):
                    ts_seas = np.concatenate([ts[i-1::-n], ts[i::n]])  # previous and forward
                out[i] = np.nanmean(ts_seas) * lr
        return out
    
    
    df['seasonal_mean'] = seasonal_mean(df.value, n=12, lr=1.25)
    error = np.round(mean_squared_error(df_orig['value'], df['seasonal_mean']), 2)
    df['seasonal_mean'].plot(title="Seasonal Mean (MSE: " + str(error) +")", ax=axes[6], label='Seasonal Mean', color='blue', alpha=0.5, style=".-")
    

     缺失值处理

    你也可以根据你想实现的精确程度考虑接下来的方法。

    1. 如果你有解释变量,可以使用像随机森林或k-邻近算法的预测模型来预测它。

    2. 如果你有足够多的过去观测值,可以预测缺失值。

    3. 如果你有足够的未来观测值,回测缺失值。

    4. 从之前的周期预测相对应的部分。


    16. 什么是自相关和偏自相关函数?

    自相关是序列和自己滞后量的简单相关。如果序列显著自相关,均值和序列之前的值(滞后量)可能对预测当前值有帮助。

    偏自相关也会传递相似的信息但是它传递的是序列和它滞后量的纯粹相关,排除了其他中间滞后量对相关的贡献。

    from statsmodels.tsa.stattools import acf, pacf
    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    
    
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')
    
    
    # Calculate ACF and PACF upto 50 lags
    # acf_50 = acf(df.value, nlags=50)
    # pacf_50 = pacf(df.value, nlags=50)
    
    
    # Draw Plot
    fig, axes = plt.subplots(1,2,figsize=(16,3), dpi= 100)
    plot_acf(df.value.tolist(), lags=50, ax=axes[0])
    plot_pacf(df.value.tolist(), lags=50, ax=axes[1])
    

    自相关函数 和 偏自相关函数

    17. 怎样计算偏自相关函数?

    怎样计算偏自相关呢?

    序列滞后量(k)的偏自相关是Y的自回归方程中滞后量的系数。Y的自回归方程就是Y及其滞后量作为预测项的线性回归。

    For Example, if Y_t is the current series and Y_t-1 is the lag 1 of Y, then the partial autocorrelation of lag 3 (Y_t-3) is the coefficient $\alpha_3$ of Y_t-3 in the following equation:

    例如,如果Y_t是当前的序列,Y_t-1是Y的滞后量1,那么滞后量3(Y_t-3)的偏自相关就是下面方程中Y_t-3的系数:

    自回归方程


    18. 滞后图

    滞后图是一个时间序列对其自身滞后量的散点图。它通常用于检查自相关。如果序列中存在如下所示的任何模式,则该序列是自相关的。如果没有这样的模式,这个序列很可能是随机的白噪声。

    在下面太阳黑子面积时间序列的例子当中,随着n_lag增加,图越来越分散。

    from pandas.plotting import lag_plot
    plt.rcParams.update({'ytick.left' : False, 'axes.titlepad':10})
    
    
    # Import
    ss = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/sunspotarea.csv')
    a10 = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')
    
    
    # Plot
    fig, axes = plt.subplots(1, 4, figsize=(10,3), sharex=True, sharey=True, dpi=100)
    for i, ax in enumerate(axes.flatten()[:4]):
        lag_plot(ss.value, lag=i+1, ax=ax, c='firebrick')
        ax.set_title('Lag ' + str(i+1))
    
    
    fig.suptitle('Lag Plots of Sun Spots Area \n(Points get wide and scattered with increasing lag -> lesser correlation)\n', y=1.15)    
    
    
    fig, axes = plt.subplots(1, 4, figsize=(10,3), sharex=True, sharey=True, dpi=100)
    for i, ax in enumerate(axes.flatten()[:4]):
        lag_plot(a10.value, lag=i+1, ax=ax, c='firebrick')
        ax.set_title('Lag ' + str(i+1))
    
    
    fig.suptitle('Lag Plots of Drug Sales', y=1.05)    
    plt.show()
    

     

    药品销售的滞后图

    太阳黑子的滞后图

    19. 怎样估计时间序列的预测能力?

    时间序列越有规律性和重复性的模式,越容易被预测。“近似熵”可用于量化时间序列波动的规律性和不可预测性。

    近似熵越高,预测越难。另一个更好的选项是“样本熵”。

    样本熵类似与近似熵,但是在估计小时间序列的复杂性上结果更一致。例如,较少样本点的随机时间序列 “近似熵”可能比一个更规律的时间序列更低,然而更长的时间序列可能会有一个更高的“近似熵”。

    样本熵可以很好地处理这个问题。请看如下演示:

    # https://en.wikipedia.org/wiki/Approximate_entropy
    ss = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/sunspotarea.csv')
    a10 = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')
    rand_small = np.random.randint(0, 100, size=36)
    rand_big = np.random.randint(0, 100, size=136)
    
    
    def ApEn(U, m, r):
        """Compute Aproximate entropy"""
        def _maxdist(x_i, x_j):
            return max([abs(ua - va) for ua, va in zip(x_i, x_j)])
    
    
        def _phi(m):
            x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
            C = [len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) / (N - m + 1.0) for x_i in x]
            return (N - m + 1.0)**(-1) * sum(np.log(C))
    
    
        N = len(U)
        return abs(_phi(m+1) - _phi(m))
    
    
    print(ApEn(ss.value, m=2, r=0.2*np.std(ss.value)))     # 0.651
    print(ApEn(a10.value, m=2, r=0.2*np.std(a10.value)))   # 0.537
    print(ApEn(rand_small, m=2, r=0.2*np.std(rand_small))) # 0.143
    print(ApEn(rand_big, m=2, r=0.2*np.std(rand_big)))     # 0.716
    0.6514704970333534
    0.5374775224973489
    0.0898376940798844
    0.7369242960384561
    # https://en.wikipedia.org/wiki/Sample_entropy
    def SampEn(U, m, r):
        """Compute Sample entropy"""
        def _maxdist(x_i, x_j):
            return max([abs(ua - va) for ua, va in zip(x_i, x_j)])
    
    
        def _phi(m):
            x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
            C = [len([1 for j in range(len(x)) if i != j and _maxdist(x[i], x[j]) <= r]) for i in range(len(x))]
            return sum(C)
    
    
        N = len(U)
        return -np.log(_phi(m+1) / _phi(m))
    
    
    print(SampEn(ss.value, m=2, r=0.2*np.std(ss.value)))      # 0.78
    print(SampEn(a10.value, m=2, r=0.2*np.std(a10.value)))    # 0.41
    print(SampEn(rand_small, m=2, r=0.2*np.std(rand_small)))  # 1.79
    print(SampEn(rand_big, m=2, r=0.2*np.std(rand_big)))      # 2.42
    0.7853311366380039
    0.41887013457621214
    inf
    2.181224235989778
    
    
    del sys.path[0]
    


    20. 为何要以及怎样对时间序列进行平滑处理?

    时间序列平滑处理可能在以下场景有用:

    • 在信号当中减小噪声的影响从而得到一个经过噪声滤波的序列近似。

    • 平滑版的序列可用于解释原始序列本身的特征。

    • 趋势更好地可视化。

    怎样对序列平滑处理?让我们讨论一下以下方法:

    1. 使用移动平均;

    2. 做LOESS光滑(局部回归);

    3. 做LOWESS光滑(局部加权回归)。

    移动均值就是定义宽度的滚动窗口的均值。但是你必须明智地选择窗口宽度,因为大范围窗口可能会造成序列过度平滑。例如,窗口大小等于季节持续时间时(例如:12为月度序列),将有效地抵消季节效应。

    LOESS,局部回归的简写,适应于每个点邻近的多元回归。可通过statsmodels包使用,你可以使用frac参数确定被纳入拟合回归模型的邻近数据点的百分比来控制平滑度。

    下载数据集: Elecequip.csv

    from statsmodels.nonparametric.smoothers_lowess import lowess
    plt.rcParams.update({'xtick.bottom' : False, 'axes.titlepad':5})
    
    
    # Import
    df_orig = pd.read_csv('datasets/elecequip.csv', parse_dates=['date'], index_col='date')
    
    
    # 1. Moving Average
    df_ma = df_orig.value.rolling(3, center=True, closed='both').mean()
    
    
    # 2. Loess Smoothing (5% and 15%)
    df_loess_5 = pd.DataFrame(lowess(df_orig.value, np.arange(len(df_orig.value)), frac=0.05)[:, 1], index=df_orig.index, columns=['value'])
    df_loess_15 = pd.DataFrame(lowess(df_orig.value, np.arange(len(df_orig.value)), frac=0.15)[:, 1], index=df_orig.index, columns=['value'])
    
    
    # Plot
    fig, axes = plt.subplots(4,1, figsize=(7, 7), sharex=True, dpi=120)
    df_orig['value'].plot(ax=axes[0], color='k', title='Original Series')
    df_loess_5['value'].plot(ax=axes[1], title='Loess Smoothed 5%')
    df_loess_15['value'].plot(ax=axes[2], title='Loess Smoothed 15%')
    df_ma.plot(ax=axes[3], title='Moving Average (3)')
    fig.suptitle('How to Smoothen a Time Series', y=0.95, fontsize=14)
    plt.show()
    

    平滑时间序列

    21. 如何使用Granger因果检验得知是否一个时间序列有助于预测另一个序列?

     

    Granger因果检验被用于检验是否一个时间序列可以预测另一个序列。Granger因果检验是如何工作的?

    它基于如果X引起Y的变化,Y基于之前的Y值和之前的X值的预测效果要优于仅基于之前的Y值的预测效果。

    所以需要了解Granger因果检验不能应用于Y的滞后量引起Y自身的变化的情况,而通常仅用于外源变量(不是Y的滞后量)。

    它在statsmodel包中得到了很好的实现。它采纳2列数据的二维数组作为主要参数,被预测值是第一列,而预测变量(X)在第二列。

    零假设检验:第二列的序列不能Granger预测第一列数据。如果p值小于显著性水平(0.05),你可以拒绝零假设并得出结论:X的滞后量确实有用。

    第二个参数maxlag决定有多少Y的滞后量应该纳入检验当中。

    from statsmodels.tsa.stattools import grangercausalitytests
    df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'])
    df['month'] = df.date.dt.month
    grangercausalitytests(df[['value', 'month']], maxlag=2)
    Granger Causality
    number of lags (no zero) 1
    ssr based F test:         F=54.7797 , p=0.0000  , df_denom=200, df_num=1
    ssr based chi2 test:   chi2=55.6014 , p=0.0000  , df=1
    likelihood ratio test: chi2=49.1426 , p=0.0000  , df=1
    parameter F test:         F=54.7797 , p=0.0000  , df_denom=200, df_num=1
    
    
    Granger Causality
    number of lags (no zero) 2
    ssr based F test:         F=162.6989, p=0.0000  , df_denom=197, df_num=2
    ssr based chi2 test:   chi2=333.6567, p=0.0000  , df=2
    likelihood ratio test: chi2=196.9956, p=0.0000  , df=2
    parameter F test:         F=162.6989, p=0.0000  , df_denom=197, df_num=2
    

    在上述例子当中,实际上所有检验的p值只能无限接近于0。所以“月份”实际上可以用于预测航空乘客的数量。


    22. 下一步是什么?

    这就是我们现在要说的。我们从非常基础的内容开始,理解了时间序列不同特征。一旦分析完成之后,接下来的一步是预测。

    原文标题:

    Time Series Analysis in Python – A Comprehensive Guide with Examples

    原文链接:

    https://www.machinelearningplus.com/time-series/time-series-analysis-python/

    编辑:黄继彦

    干货学习,三连

    展开全文
  • 时间序列—相关性和滞后性分析_python

    千次阅读 多人点赞 2022-06-11 09:50:48
    本文讲述了两个时间序列(信号)的相关性分析可以利用相关性分析进行特征筛选。此外本文还讲了怎么判断时间序列的滞后性的方法。

    😊作者简介:大家好我是hellobigorange,大家可以叫我大橙子
    💖本文摘要:本文讲述了两个时间序列(信号)的相关性分析,可以利用相关性分析进行特征筛选。此外本文还讲了怎么判断时间序列的滞后性的方法。

    一、分析数据的相关性和滞后性的必要性

    1.1 相关性

    在使用机器学习模型对数据进行训练的时候,需要考虑数据量和数据维度,在很多情况下并不是需要大量的数据和大量的数据维度,这样会造成机器学习模型运行慢,且消耗硬件设备。除此之外,在数据维度较大的情况下,还存在”维度灾难“的问题。
    在开展特征工程时,数据的降维方法思想上有两种

    • 特征降维: 一种是例如主成分分析方法(PCA)破坏数据原有的结构从而提取数据的主要特征
    • 特征选取: 按照一定的法则来对数据的属性进行取舍达到降维的目的。
      • 相关性分析:分析特征和因变量(标签列)的相关性,保留相关性强的。
      • 方差:对于方差太小的,说明特征的整体变化不大,可以剔除。

    1.2 滞后性

    有时候将某个特征滞后一定时间后, 得到一个新的特征, 可能会与目标变量有更强的相关性,个人理解,一般某个特征变量, 你有足够的专业知识或推断认为其可能存在滞后性后, 再考虑这个问题就可以。

    比如我最近做的管道的入口压力和出口压力,二者都是由传感器同时采集的,但是由于管道是有一定长度的,因此出口压力有可能会比入口压力传导上有一定的延迟。 再比如产量对负荷的影响中,产量数据并不是实时统计的,可能也会存在特征统计的滞后性问题。

    二、相关性分析

    欧式距离:在时间序列预测有缺陷,不能辨认形状的相似度,适用于距离度量.

    2.1 皮尔逊相关系数

    在统计学中,皮尔逊相关系数(pearson correlation coefficient)用于度量两个变量X和Y之间的线性相关性,其值介于-1与1之间。在自然科学领域中,该系数广泛用于度量两个变量之间的线性相关程度。

    1、本文采用Pearson相关系数来考察各类因素x_i对因变量y的影响力,相关系数按公式(3)计算
    在这里插入图片描述

    2、两变量之间的相关性可由相关系数初步决定,但须进行显著性检验再最后判断。其显著性检验公式为
    在这里插入图片描述
    3、评判标准:
    若r>0,表明2个变量是正相关,即一个变量的值越大,另一个变量的值也会越大;若 r<0,表明 2个变量是负相关,即一个变量的值越大,另一个变量的值反而会越小。r 的绝对值越大表明相关性越强。
    在这里插入图片描述
    直观感受不同的Pearson相关系数对应的图像在这里插入图片描述

    2.2 负荷相关性分析_python实现

    "data.csv"
     最大负荷,常住人口,人均收入,GDP,农业总值,工业总值,第三产业产值,年平均温度,年降水,年售电量
     21.2,6.8,3752,2.21,2.4,11.5,21,15.9,998.5,0.9
     22.7,7,3897,2.78,2.43,11.8,22,15.6,995.2,0.98
     24.36,7.15,4058,3.05,2.67,12.14,22.7,16.4,1002.6,1.1
     26.22,7.28,4237,3.82,1.85,12.2,23,17.1,1237,1.23
     28.18,7.42,4552,4.34,2.36,13,24.4,16.1,1170,1.36
     30.16,7.55,4998,5.86,2.88,13.6,25.4,16.6,1001.3,1.49
     86.6,10.23,22760,84.94,31,72,73,16.2,1232.5,5.41
    
    
    """
    DataFrame.corr(method='pearson', min_periods=1)
    
    参数说明:
    method:可选值为{‘pearson’, ‘kendall’, ‘spearman’}
    pearson:Pearson相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性数据便会有误差。
    kendall:用于反映分类变量相关性的指标,即针对无序序列的相关系数,非正态分布的数据
    spearman:非线性的,非正态分布的数据的相关系数
    min_periods:样本最少的数据量
    返回值:各类型之间的相关系数DataFrame表格。"""
    data = pd.read_csv("data.csv")
    data.corr()
    

    结果分析:
    下图显示就是各个特征之间的相似性分析,第一列就是各特征与因变量的关系,里面显示年平均降水量和年降水相关性偏低。对比之前的灰色关联度分析的结果差异过大,经思考应该是灰色关联度无量纲处理的问题,采用MinMaxScaler或者StandardScaler后,二者结果相近.
    在这里插入图片描述

    2.2 灰色关联度分析

    灰色关联分析适用于探究非线性相关性。灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度

    我之前写的一篇GRA文章:灰色关联度分析法(GRA)_python

    2.3 其他方法

    时间序列相似性度量综述

    三、滞后性

    3.1 TLCC

    TLCC算法: 将其中一个时间序列y2滞后-k——k阶,与另一个时间序列y1一起计算pearson系数。假设在i阶的相关性最强,说明y2滞后y1有i阶;若i<0,则y2超前y1有i阶。

    3.2 互相关性

    互相关性 np.correlate: 主要原理就是将时间序列y2滞后-k——k阶,与时间序列y1计算点积和(主要看一个方向性,若相关性最强时,序列的正负方向一致,此时点积应该是最大的),若第i阶的点积和最大,则说明y2滞后y1有i阶,若i<0,则y2超前y1有i阶。
    在这里插入图片描述
    在这里插入图片描述
    方法二详细原理参考: 互相关(cross-correlation)及其在Python中的实现
    代码

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    """原始数据"""
    x = np.linspace(0, 20, 100)
    y1 = np.sin(x)
    y2 = np.sin(x + 1)
    plt.plot(x, y1)
    plt.plot(x, y2)
    plt.legend(['y1', 'y2'])
    plt.show()
    
    """利用pearson计算滞后性"""
    # 从图中可以看出y2滞后5阶
    data_cor = pd.DataFrame(np.array([y1, y2]).T, columns=['y1', 'y2'])
    for i in range(-10, 10):
        data_cor[str(i)] = data_cor['y2'].shift(i) 
    data_cor.dropna(inplace=True)
    p = data_cor.corr()
    print("person相关系数:\n", data_cor.corr())
    plt.plot(range(-10, 10),data_cor.corr().iloc[0][2:].values)
    plt.legend(['y1', 'y2'])
    plt.title('pearson')
    plt.xlabel('y2-lag_order')
    plt.show()
    
    """利用互相关性计算滞后性"""
    a = np.correlate(y1, y2, mode="same")
    print("y1滞后y2:", len(a) // 2 - a.argmax())  # 若为负数,说明y1超前y2
    # plt.plot(x[:-5],y1[5:]) # 结论y1超前y2五个单位。将y1时间向前错位即可重合
    
    
    

    结果分析:
    原始序列:
    在这里插入图片描述
    pearson,可以看出y2滞后y1有5阶的时候, pearson相关性最强. 通样滞后5阶时自相关点积和最大.
    在这里插入图片描述

    参考链接

    【1】机器学习相关性的度量
    【2】皮尔逊(Pearson),二维相关性分析(TDC),灰色关联分析,最大信息系数(MIC)
    【3】互相关(cross-correlation)及其在Python中的实现
    【4】利用时序相关性分析和聚类提升销量预测模型
    【5】如何确定两个时间序列是否存在相关性
    【6】时间序列联动分析
    【7】有哪些有效的可以衡量两段或多段时间序列相似度的方法?
    【8】机器学习_各种距离度量总结

    展开全文
  • 时间序列(数据分析

    千次阅读 2022-03-25 13:51:46
    时间序列可以是不规则的,没有固定的时间单位或单位间的偏移量。 最简单和最广泛使用的时间序列是那些由时间戳索引的。 11.1 日期和时间数据的类型及工具 Python标准库包含了日期和时间数据的类型,也包括日历...

    目录

    第11章 时间序列

    11.1 日期和时间数据的类型及工具

    11.1.1 字符串与datetime互相转换

    11.2 时间序列基础

    11.2.1 索引、选择、子集

    11.2.2 含有重复索引的时间序列

    11.3 日期范围、频率和移位

    11.3.1 生成日期范围

    11.3.2 频率和日期偏置

    11.3.3 移位(前向和后向)日期

    11.4 时区处理

    11.4.1 时区的本地化和转换

    11.4.2 时区感知时间戳对象的操作

    11.4.3 不同时区间的操作

    11.5 时间时区和区间计算

    11.5.1 区间频率转换

    11.5.2 季度区间的频率

    11.5.3 将时间戳转换为区间(以及逆转换)

    11.5.4 从数组生成PeriodIndex

    11.6 重新采样与频率转换

    11.6.1 向下采样

    11.6.2 向上采样与插值

    11.6.3 使用区间进行重新采样

    11.7 移动窗口函数

    11.7.1 指数加权函数

    11.7.2 二元移动窗口函数

    11.7.3 用户自定义的移动窗口函数

    参考书籍


    第11章 时间序列

    时间序列数据在很多领域都是重要的结构化数据形式,例如金融、经济、生态学、神经科学和物理学。

    在多个时间点观测或测量的数据形成了时间序列。

    许多时间序列是固定频率的,也就是说数据是根据相同的规则定期出现的,例如每15秒、每5分钟或每月1次。

    时间序列也可以是不规则的,没有固定的时间单位或单位间的偏移量。

    最简单和最广泛使用的时间序列是那些由时间戳索引的。

    11.1 日期和时间数据的类型及工具

    Python标准库包含了日期和时间数据的类型,也包括日历相关的功能。

    datetime、time和calendar模块是开始处理时间数据的主要内容。

    datetime.datetime类型,或简写为datetime,是广泛使用的:

    datetime既存储了日期,也存储了细化到微秒的时间。timedelta表示两个datetime对象的时间差:

    datetime模块的数据类型:

    11.1.1 字符串与datetime互相转换

    可以使用str方法或传递一个指定的格式给strftime方法来对datetime对象和pandas的Timestamp对象进行格式化:

    格式代码的完整列表:

    可以使用datetime.strptime,将字符串转换日期:

    datetime.strptime是在已知格式的情况下转换日期的好方式。

    每次都必须编写一个格式代码可能有点烦人,特别是对于通用日期格式,在这种情况下,使用第三方dateutil包的parser.parse方法

    dateutil能够解析大部分人类可理解的日期表示:

    在国际场合下,日期出现在月份之前很常见,因此你可以传递dayfirst=True来表明这种情况:

    pandas主要是面向处理日期数组的,无论是用作轴索引还是用作DataFrame中的列。

    to_datetime方法可以转换很多不同的日期表示格式。

    标准日期格式,比如ISO8601可以非常快地转换:

    to_datetime方法还可以处理那些被认为是缺失值的值(None、空字符串等):

    NaT(Not a time)是pandas中时间戳数据的是null值。

    dateutil.parser是一个有用但并不完美的工具。值得注意的是,它会将一些字符串识别为你并不想要的日期——例如,'42’将被解析为2042年的当前日期。

    11.2 时间序列基础

    pandas中的基础时间序列种类是由时间戳索引的Series,在pandas外部则通常表示为Python字符串或datetime对象:

    在这种情况下,这些datetime对象可以被放入DatetimeIndex中:

    和其他Series类似,不同索引的时间序列之间的算术运算在日期上自动对齐:

    pandas使用NumPy的datetime64数据类型在纳秒级的分辨率下存储时间戳:

    DatetimeIndex中的标量值是pandas的Timestamp对象:

    所有使用datetime对象的地方都可以用Timestamp。

    此外,Timestamp还可以存储频率信息(如果有的话)并了解如何进行时区转换和其他类型操作。

    11.2.1 索引、选择、子集

    当你基于标签进行索引和选择时,时间序列的行为和其他的pandas.Series类似:

    为了方便,你还可以传递一个能解释为日期的字符串:

    对一个长的时间序列,可以传递一个年份或一个年份和月份来轻松地选择数据的切片:

    如果你指定了月份也是有效的: 

    使用datetime对象进行切片也是可以的:

    大部分的时间序列数据是按时间顺序排序的,你可以使用不包含在时间序列中的时间戳进行切片,以执行范围查询:

    和之前一样,你可以传递一个字符串的日期、datetime对象或者时间戳。请记住通过这种方式的切片产生了原时间序列的视图,类似于NumPy的数组。这意味着没有数据被复制,并且在切片上的修改会反映在原始数据上。

    有一个等价实例方法,truncate,它可以在两个日期间对Series进行切片:

    上面这些操作也都适用于DataFrame,并在其行上进行索引:

    11.2.2 含有重复索引的时间序列

    在某些应用中,可能会有多个数据观察值落在特定的时间戳上。

    示例:

    通过检查索引的is_unique属性,我们可以看出索引并不是唯一的:

    对上面的Series进行索引,结果是标量值还是Series切片取决于是否有时间戳是重复的:

    假设你想要聚合含有非唯一时间戳的数据。一种方式就是使用groupby并传递level=0:

    11.3 日期范围、频率和移位

    pandas的通用时间序列是不规则的,即时间序列的频率不是固定的。

    经常有需要处理固定频率的场景,例如每日的、每月的或每15分钟,这意味着我们甚至需要在必要的时候向时间序列中引入缺失值。

    pandas拥有一整套标准的时间序列频率和工具用于重新采样、推断频率以及生成固定频率的数据范围。

    例如,你可以通过调用resample方法将样本时间序列转换为固定的每日频率数据:

    字符串’D’被解释为每日频率。在频率间转换,又称为重新采样,后边详细讲解。

    11.3.1 生成日期范围

    pandas.date_range是用于根据特定频率生成指定长度的DatetimeIndex:

    默认情况下,date_range生成的是每日的时间戳。

    如果你只传递一个起始或结尾日期,你必须传递一个用于生成范围的数字:

    开始日期和结束日期严格定义了生成日期索引的边界。例如,如果你需要一个包含每月最后业务日期的时间索引,你可以传递’BM’频率(business end of month,月度业务结尾;),只有落在或在日期范围内的日期会被包括:

    基础时间序列频率(不全):

    默认情况下,date_range保留开始或结束时间戳的时间(如果有的话):

    有时候你会获得包含时间信息的开始日期或结束日期,但是你想要生成的是标准化为零点的时间戳。有一个normalize选项可以实现这个功能:

    11.3.2 频率和日期偏置

    pandas中的频率是由基础频率和倍数组成的。

    基础频率通常会有字符串别名,例如’M'代表每月,'H’代表每小时。

    对于每个基础频率,都有一个对象可以被用于定义日期偏置。

    例如,每小时的频率可以使用Hour类来表示:

    你可以传递一个整数来定义偏置量的倍数:

    在大多数应用中,你都不需要显式地创建这些对象,而是使用字符串别名,如’H'或’4H'。在基础频率前放一个整数就可以生成倍数:

    多个偏置可以通过加法进行联合:

    类似地,你可以传递频率字符串,例如’1h30min’将会有效地转换为同等的表达式:

    有些频率描述点的时间并不是均匀分隔的。例如,'M'(日历月末)和’BM'(月内最后工作日)取决于当月天数,以及像之后的例子中,取决于月末是否是周末。我们将这些日期称为锚定偏置量。

    11.3.2.1 月中某星期的日期

    "月中某星期"(week of month )的日期是一个有用的频率类,以’WOM’开始。它允许你可以获取每月第三个星期五这样的日期:

    11.3.3 移位(前向和后向)日期

    "移位"是指将日期按时间向前移动或向后移动。

    Series和DataFrame都有一个shift方法用于进行简单的前向或后向移位,而不改变索引:

    像上面这样进行移位时,会在时间序列的起始位或结束位引入缺失值。

    shift常用于计算时间序列或DataFrame多列时间序列的百分比变化,代码实现如下:

    由于简单移位并不改变索引,一些数据会被丢弃。因此,如果频率是已知的,则可以将频率传递给shift来推移时间戳而不是简单的数据:

    其他的频率也可以传递,为你前移和后移数据提供灵活性:

    这里的T代表分钟。

    11.3.3.1 使用偏置进行移位日期

    pandas日期偏置也可以使用datetime或Timestamp对象完成:

    如果你添加了一个锚定偏置量,比如MonthEnd,根据频率规则,第一个增量会将日期“前滚”到下一个日期:

    锚定偏置可以使用rollforward和rollback分别显式地将日期向前或向后"滚动":

    将移位方法与groupby一起使用是日期偏置的一种创造性用法:

    使用resample是更简单更快捷的方法:

    11.4 时区处理

    在Python语言中,时区信息来源于第三方库pytz(可以使用pip或conda安装),其中公开了Olson数据库,这是世界时区信息的汇编。

    pandas中的方法可以接收时区名称或时区对象。

    11.4.1 时区的本地化和转换

    默认情况下,pandas中的时间序列是时区简单型的。例如,考虑下边的时间序列:

    索引的tz属性是None:

    日期范围可以通过时区集合来生成:

    使用tz_localize方法可以从简单时区转换到本地化时区:

    一旦时间序列被本地化为某个特定的时区,则可以通过tz_convert将其转换为另一个时区:

    tz_localize和tz_convert也是DatetimeIndex的实例方法:

    11.4.2 时区感知时间戳对象的操作

    与时间序列和日期范围类似,单独的Timestamp对象也可以从简单时间戳本地化为时区感知时间戳,并从一个时区转换为另一个时区:

    也可以在创建Timestamp的时候传递一个时区:

    时区感知的Timestamp对象内部存储了一个Unix纪元(1970年1月1日)至今的纳秒数量UTC时间戳数值,该数值在时区转换中是不变的:

    在使用pandas的DateOffset进行时间算术时,pandas尽可能遵从夏时制。这里我们构建恰好在DST转换之前发生的时间戳(向前和向后)。首先,我们构造转换到DST之前的30分钟的时间:

    之后,我们构建从DST进行转换前的90分钟:

    11.4.3 不同时区间的操作

    如果两个时区不同的时间序列需要联合,那么结果将是UTC时间的。由于时间戳以UTC格式存储,这是一个简单的操作,不需要转换:

    11.5 时间时区和区间计算

    时间区间表示的时间范围,比如一些天、一些月、一些季度或者是一些年。

    Period类表示的正是这种数据类型,需要一个字符串或数字的频率:

    在这个例子中,Period对象表示的是从2007年1月1日到2007年12月31日(包含在内)的时间段。在时间段上增加或减去整数可以方便地根据它们的频率进行移位。

    如果两个区间拥有相同的频率,则它们的差是它们之间的单位数:

    使用period_range函数可以构造规则区间序列:

    PeriodIndex类存储的是区间的序列,可以作为任意pandas数据结构的轴索引:

    如果你有一个字符串数组,你也可以使用PeriodIndex类:

    11.5.1 区间频率转换

    使用asfreq可以将区间和PeriodIndex对象转换为其他的频率。例如,假设我们有一个年度区间,并且想要在一年的开始或结束时将其转换为月度区间。这非常简单:

    你可以将Period('2007', 'A-DEC')看作一段时间中的一种游标,将时间按月份划分,参见下图。对于除十二月以外的一个月结束的财政年度,相应的每月分期是不同的:

    当你从高频率向低频率转换时,pandas根据子区间的"所属"来决定父区间。

    例如,在A-JUN频率中,Aug-2007是2008区间的一部分:

    完整的PeriodIndex对象或时间序列可以按照相同的语义进行转换:

    这里,年度区间将被替换为对应于每个年度区间内的第一个月的月度区间。

    如果我们想要每年最后一个工作日,我们可以使用’B’频率来表示我们想要的是区间的末端:

    11.5.2 季度区间的频率

    季度数据是会计、金融和其他领域的标准。

    很多季度数据是在财年结尾报告的,通常是一年12个月中的最后一个日历日或工作日。

    因此,由于是财年结尾,区间2012Q4有着不同的意义。pandas支持所有的可能的12个季度频率从Q-JAN到Q-DEC:

    在财年结束于1月的情况下,2012Q4运行时间为11月至1月,你可以通过转换为每日频率进行检查,参考下图:

    因此,做简单的区间算术是可行的,例如,要获取在季度倒数第二个工作日下午4点的时间戳,你可以这么做:

    你可以使用peroid_range生成季度序列。它的算术也是一样的:

    11.5.3 将时间戳转换为区间(以及逆转换)

    通过时间戳索引的Series和DataFrame可以被to_period方法转换为区间:

    由于区间是非重叠时间范围,一个时间戳只能属于给定频率的单个区间。尽管默认情况下根据时间戳推断出新PeriodIndex的频率,但你可以指定任何想要的频率。在结果中包含重复的区间也是没有问题的:

    使用to_timestamp可以将区间再转换为时间戳:

    11.5.4 从数组生成PeriodIndex

    固定频率数据集有时存储在跨越多列的时间范围信息中。例如,在这个宏观经济数据集中,年份和季度在不同列中:

    通过将这些数组和频率传递给PeriodIndex,你可以联合这些数组形成DataFrame的索引:

    11.6 重新采样与频率转换

    重新采样是指将时间序列从一个频率转换为另一个频率的过程。

    将更高频率的数据聚合到低频率被称为向下采样,而从低频率转换到高频率称为向上采样。

    并不是所有的重新采样都属于上面说的两类;例如,将W-WED(weekly on Wednesday,每周三)转换到W-FRI(每周五)既不是向上采样也不是向下采样。

    pandas对象都配有resample方法,该方法是所有频率转换的工具函数。resample拥有类似于groupby的API;你调用resample对数据分组,之后再调用聚合函数:

    resample方法参数:

    11.6.1 向下采样

    将数据聚合到一个规则的低频率上是一个常见的时间序列任务。

    将数据聚合到一个规则的低频率上是一个常见的时间序列任务。你要聚合的数据不必是固定频率的。期望的频率定义了用于对时间序列切片以聚合的箱体边界。

    例如,要将时间转换为每月,'M’或’BM',你需要将数据分成一个月的时间间隔。每个间隔是半闭合的,一个数据点只能属于一个时间间隔,时间间隔的并集必须是整个时间帧。

    在使用resample进行向下采样数据时有些事情需要考虑:

            · 每段间隔的哪一边是闭合的

            · 如何在间隔的起始或结束位置标记每个已聚合的箱体

    示例:

    假设你想通过计算每一组的加和将这些数据聚合到五分钟的块或柱内:

    传递的频率按五分钟的增量定义了箱体边界。默认情况下,左箱体边界是包含的,因此00:00的值是包含在00:00到00:05间隔内的。传递closed='right’将间隔的闭合端改为了右边。

    产生的时间序列按照每个箱体左边的时间戳被标记。传递label='right’你可以使用右箱体边界标记时间序列:

    下图阐明了分钟频率按五分钟频率进行的重新采样:

    可能需要将结果索引移动一定的数量,例如从右边缘减去一秒,以使其更清楚地表明时间戳所指的间隔。要实现这个功能,向loffset传递字符串或日期偏置:

    11.6.1.1 开端-峰值-谷值-结束(OHLC)重新采样

    在金融中,为每个数据桶计算四个值是一种流行的时间序列聚合方法:第一个值(开端)、最后一个值(结束)、最大值(峰值)和最小值(谷值)。通过使用ohlc聚合函数你将会获得包含四种聚合值列的DataFrame,这些值在数据的单次扫描中被高效计算:

    11.6.2 向上采样与插值

    当从低频率转换为高频率时,并不需要任何聚合。让我们考虑带有每周数据的DataFrame:

    当对这些数据使用聚合函数时,每一组只有一个值,并且会在间隙中产生缺失值。我们使用asfreq方法在不聚合的情况下转换到高频率:

    假设你想在非星期三的日期上向前填充每周数值。fillna和reindex方法中可用的填充或插值方法可用于重采样:

    你可以同样选择仅向前填充一定数量的区间,以限制继续使用观测值的时距:

    11.6.3 使用区间进行重新采样

    对以区间为索引的数据进行采样与时间戳的情况类似:

    向上采样更为细致,因为你必须在重新采样前决定新频率中在时间段的哪一端放置数值,就像asfreq方法一样。convention参数默认值是’start',但也可以是'end':

    由于区间涉及时间范围,向上采样和向下采样就更为严格:

            · 在向下采样中,目标频率必须是原频率的子区间。

            · 在向上采样中,目标频率必须是原频率的父区间。

    如果不满足这些规则,将会引起异常。这主要会影响每季度、每年和每周的频率。

    11.7 移动窗口函数

    统计和其他通过移动窗口或指数衰减而运行的函数是用于时间序列操作的数组变换的一个重要类别。这对平滑噪声或粗糙的数据非常有用。称这些函数为移动窗口函数,尽管它也包含了一些没有固定长度窗口的函数,比如指数加权移动平均。与其他的统计函数类似,这些函数会自动排除缺失数据。

    先载入一些时间序列数据并按照工作日频率进行重新采样:

    介绍rolling算子,它的行为与resample和groupby类似。

    rolling可以在Series或DataFrame上通过一个window(以一个区间的数字来表示,参见下图)进行调用。

    表达式rolling(250)与groupby的行为类似,但是它创建的对象是根据250日滑动窗口分组的而不是直接分组。因此这里我们获得了苹果公司股票价格的250日移动窗口平均值。

    默认情况下,滚动函数需要窗口中所有的值必须是非NA值。由于存在缺失值这种行为会发生改变,尤其是在时间序列的起始位置你拥有的数据是少于窗口区间的(见图苹果公司250日每日返回标准差):

    为了计算扩展窗口均值,使用expanding算子,而不是rolling。扩展均值从时间序列的起始位置开始时间窗口,并增加窗口的大小,知道它覆盖整个序列。

    expanding_mean = appl_std250.expanding().mean()

    在DataFrame上调用一个移动窗口函数会将变换应用到每一列上(见图股票价格60日MA,Y轴取对数):

    rolling函数也接收表示固定大小的时间偏置字符串,而不只是一个区间的集合数字。对不规则时间序列使用注释非常有用。这些字符串可以传递给resample。例如,我们可以像这样计算20天的滚动平均值:

    11.7.1 指数加权函数

    指定一个常数衰减因子以向更多近期观测值提供更多权重,可以替代使用具有相等加权观察值的静态窗口尺寸的方法。有多种方式可以指定衰减因子。其中一种流行的方式是使用一个span(跨度),这使得结果与窗口大小等于跨度的简单移动窗口函数。

    由于指数加权统计值给更近期的观测值以更多的权重,与等权重的版本相比,它对变化“适应”得更快。

    pandas拥有ewm算子,同rolling、expanding算子一起使用。以下是将苹果公司股票价格的60日均线与span=60的EW移动平均线进行比较的例子(见图,简单移动平均与指数加权平均对比):

    11.7.2 二元移动窗口函数

    一些统计算子,例如相关度和协方差,需要操作两个时间序列。例如,金融分析师经常对股票与基准指数(如标普500)的关联性感兴趣。为了了解这个功能,我们首先计算所有我们感兴趣的时间序列的百分比变化:

    在我们调用rolling后,corr聚合函数可以根据spx_rets计算滚动相关性(见图,苹果公司与标普500的六个月的收益相关性):

    假设你想要一次性计算多只股票与标普500的相关性。编写循环并创建一个新的DataFrame是简单的但可能也是重复性的,所以如果你传递了一个Series或一个DataFrame,像rolling_corr这样的函数将会计算Series(例子中的spx_rets)与DataFrame中每一列的相关性(见图,多只股票与标普500的六个月收益相关性):

    11.7.3 用户自定义的移动窗口函数

    在rolling及其相关方法上使用apply方法提供了一种在移动窗口中应用你自己设计的数组函数的方法。唯一的要求是该函数从每个数组中产生一个单值(缩聚)。例如,尽管我们可以使用rolling(...).quantile(q)计算样本的分位数,但我们可能会对样本中特定值的百分位数感兴趣。scipy.stats.percentileofscore函数就是实现这个功能的(见图):

    参考书籍

            --《利用Python实现数据分析》

    展开全文
  • 文| Vachel编辑| Sucie转载:时序人00写在前面时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列,其中隐藏着一些过去与未来的关系。时间序列分析试图通过研...
  • 【BI学习心得09-时间序列分析

    千次阅读 2021-01-02 20:20:45
    一阶指数平滑实际就是历史数据的加权平均,它可以用于任何一种 没有明显函数规律但确实存在某种前后关联\color{red}没有明显函数规律但确实存在某种前后关联没有明显函数规律但确实存在某种前后关联的时间序列的 ...
  • 小波分析实例时间序列(TIme Series)是地学研究中经常遇到的问题。在时间序列研究中,时域和频域是常用的两种基本形式。其中,时域分析具有时间定位能力,但无法得到关于时间序列变化的更多信息;频域分析(如...
  • 时间序列分析实例

    千次阅读 2022-03-02 11:37:11
    时间序列分析简介 可参考链接: 时间序列详解 时间序列针对不同曲线情况的预测方式 时间序列python实例 python建立时间序列分析 理解ACF 和PACF ADF检验理解 ADF检验补充 实例 某段时间日活预测 历史数据为2022-01-...
  • 在GEE中,时间序列分析经常用到,有时根据研究需要,会统计在每个pixel上时间序列最大值所对应的日期或时间,这一操作,这一操作的算法思想与取一个列表中最大值所对应的索引有异曲同工之处。 废话不多说直接上代码 ...
  • 数据挖掘之时间序列分析

    万次阅读 多人点赞 2018-08-12 23:45:16
    时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。 表1 常用的时间序列模型 模型名称 描述 平滑法 常用于趋势分析和预测,利用修匀技术,削弱短期随机波动序列的影响,使...
  • 时间序列数据分析

    千次阅读 2021-08-29 16:56:18
    时间序列数据分析 参考知乎文章:时间序列数据分析101,作者:厉建扬 除此之外还添加了分类、聚类的评估方法汇总+python实现。 文章目录时间序列数据分析1 准备和处理时间序列数据1.1 准备数据集1.2 寻找时间轴1.3...
  • 说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解...目前非平稳时间序列分析应用最多的模型就是ARIMA模型,本项目也是通过Python程序来进行数据探索性分析、数据预处...
  • 时间序列分析

    万次阅读 多人点赞 2017-03-22 17:04:51
    http://blog.csdn.net/pipisorry/article/details/62053938时间序列简介时间序列是时间间隔不变的情况下收集的时间点集合。这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式。但是什么时间...
  • 时间序列分析的目的就是给定一个已经被观测的时间序列,观测该序列的未来值。 一、时间序列的平稳性与差分法 1.时间序列的平稳性: 平稳性就是要求经由样本时间序列所得到的拟合曲线 ,在未来的一段期间内仍能顺...
  • 第一章 时间序列分析简介 第二章 时间序列的预处理 第三章 平稳时间序列分析 第四章 非平稳序列的随机分析 第五章 非平稳序列的确定性分析 第六章 多元时间序列分析 第一章 时间序列分析简介 1.1 时间序列的定义 ...
  • 第15章Stata时间序列分析

    千次阅读 多人点赞 2021-07-30 16:30:49
    reg regress m s g t #本命令的含义是不考虑数据的时间序列性质,直接以城乡人口净转移量为因变量,其他变量为自变量进行简单线性回归
  • 作者 |Vachel编辑| Sucie回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,是一种预测性的建模技术,它研究的是因变量(Y)和自变量(X)之间的关系,例...
  • Eviews软件做时间序列分析

    千次阅读 2021-01-17 12:51:54
    金融经济的实证类毕业论文主要分为时间序列(time series)和面板数据(panel data)两种类型,进入七月,不少小伙伴们已经动手开始进行毕业论文的数据分析部分啦,可是怎么操作Eviews来对时间序列模型进行分析?...
  • 时间序列的平稳性检验方法汇总

    千次阅读 2022-03-22 00:12:04
    当我们有一个新的时间序列数据时,怎么判断它是否是平稳的呢?时间序列平稳性检验方法,可分为三类:图形分析方法简单统计方法假设检验方法一、图形分析方法图形分析方法是一种最基本、最简单直接的方法...
  • 时间序列分析相关概念

    千次阅读 2018-10-01 20:24:18
    1. 在时间序列分析中, 数学模型是什么?数学公式又是什么?数学推导过程又是什么?… … 一句话:用数学公式后者符号来表示现实存在的意义。数学是“万金油”的科学,它是作为工作和分析方法运用到某个学科当中。...
  • python数据分析时间序列分析(Time series analysis)

    万次阅读 多人点赞 2018-12-06 14:01:20
    时间序列分析包括用于分析时间序列数据的方法,以便提取有意义的统计数据和数据的其他特征。时间序列预测是使用模型根据先前观察到的值预测未来值。虽然回归分析通常采用的方式是测试理论,即一个或多个...
  • Python数据分析:pandas时间序列处理及操作 基本类型,以时间戳为索引的series–>datatimeindex 创建方法: 指定index为datatime的list from datetime import datetime import pandas as pd import numpy ...
  • Matlab 时间序列分析(根据例子学原理)

    万次阅读 多人点赞 2020-09-15 20:02:49
    时间序列分析 时间序列分析是一种数据分析方法,它研究的对象是代表某一现象的一串随时间变化而又相关联的数据系列,从而描述和探索该现象随时间发展变化的规律性。 时间序列分析方法包括: (1)确定性时序分析 (2)...
  • 数学建模之时间序列分析

    千次阅读 2020-07-12 14:48:54
    时序图检验:根据平稳时间序列均值、方差为常数的性质,平稳序列的时序图应该显示出该序列始终在一个常数值附近随机波动,而且波动的范围有界、无明显趋势及周期特征。 自相关图检验:平稳序列通常具有短期相关性。...
  • 基于matlab的时间序列分析(主要流程+完整代码)案例简介时间序列简介平稳时间序列{xt}ARIMA=AR+MA+INTEGRATER实例应用数据平稳化模型选择——确定p、qACF/PACF图法(不推荐)根据最佳lags值确定代码函数模型检验...
  • 时间序列分析关键理论知识点整理

    千次阅读 2020-06-28 14:09:59
    目录时间序列的组合成分[^实用案例分析]常用时序算法及适应范围[^实用案例分析]拖尾和截尾自相关和偏自相关函数的特征ARIMA过程与其自相关函数偏自相关函数特征[^计量经济学]在这里插入图片描述]...
  • 【Python】时间序列分析完整过程

    万次阅读 多人点赞 2019-05-20 10:48:21
    1. 导言 1.1 基本定义   根据维基百科上对时间序列的定义,我们简单将其理解为: 时间序列:一系列以时间顺序作为索引的数据点...  咱们先来看看,对时间序列数据分析,需要用到哪些库吧 ~ import numpy as np ...
  • 数据分析——时间序列分析模型(AR,MA,ARMA,ARIMA)

    万次阅读 多人点赞 2019-01-08 17:39:21
    时间序列是某个时间段或者某些时间点对应的不同数值的数值,这些数值只有两个具体数据:时间要素、数值要素。时间要素可以是某一个时间段或者某一个时刻。例如一个杂货铺一周(七天)的销售额为时间段的时间要素...
  • 通过这些时间序列分析,从中发现和揭示现象发展变化的规律,并将这些知识和信息用于预测。比如销售量是上升还是下降,销售量是否与季节有关,是否可以通过现有的数据预测未来一年的销售额是多少等。 对于时间...
  • 时间序列数据处理2——时间序列聚类算法

    千次阅读 多人点赞 2021-07-02 11:40:59
     本文主要实现对时间序列聚类算法研究和相关搬运工作。 目录1. 时间序列聚类2. 时间序列聚类的步骤2.1 数据简化2.2 相似性/距离度量2.3 聚类方法2.4 评估聚类结果的标准参考资料 1. 时间序列聚类 时间序列的聚类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 225,923
精华内容 90,369
热门标签
关键字:

对应分析的可以对时间序列