精华内容
下载资源
问答
  • 待处理数据为间隔一秒的时间序列,但是其中有时间缺失,怎样把丢失时间补齐并赋值为零并按天为单位进行reshape. 萌新一枚,首次提问还望大佬们赐教:)
  • 时间序列数据的预处理 3.指数平滑法 4.自回归模型 提 纲 5. ARIMA模型 6.周期性分解 7.本章小结 时间序列分析概述 时间序列分析是多元统计分析的一项重要内容。时间序列是指按时间顺序排列的随机变量的一组实测值。...

    时间序列分析 电子工业出版社 提 纲 1.时间序列分析概述 2.时间序列数据的预处理 3.指数平滑法 4.自回归模型 提 纲 5. ARIMA模型 6.周期性分解 7.本章小结 时间序列分析概述 时间序列分析是多元统计分析的一项重要内容。时间序列是指按时间顺序排列的随机变量的一组实测值。分析时间序列图,可以从运动的角度认识事物的本质,如几个时间序列之间的差别、一个较长时间序列的周期性,或对未来的情况进行预测。 时间序列分析概述 所谓时间序列,是指一个依时间顺序组成的观察数据集合。很多数据以时间序列形式呈现,如货运码头的逐月吞吐量,公路交通事故次数周度报告,城市空气污染物的日均值序列,医院每日门诊接诊人数序列,城市电网每日输电量,地区工业总产值的年度数据序列,逐年人口统计资料等。时间序列区别于普通资料的本质特征是相邻观测值之间的依赖性或称相关性,这种特征使得时间序列资料的统计分析方法区别于一般数据的统计分析方法。事实上,有关时间序列分析的特殊技巧,几乎都是基于对自相关性处理的技巧。 时间序列分析概述 时间序列分析按分析目的不同,可以划分为时域分析和频域分析两个类别,前者将序列的观察值视为历史值的函数,重点分析事物随时间发展变迁的趋势,常用于人口、经济、气象等研究领域;后者将序列看成不同频率的正弦或余弦波叠加的结果,重点分析其频率特征,常用于电力、工程等方面。本章重点介绍时间序列和时域分析方法。 时间序列分析概述 移动平均法、指数平滑法是早期时间序列分析的主流方法。在20世纪70年代后期,由于Box和Jenkins的工作及电子计算机的逐渐普及,ARIMA(求和自回归滑动平均模型)被大量用于时间序列资料的分析,一般提到的时间序列模型,都是指ARIMA模型或它的某种表述形式。 预测是时间序列分析的重要内容,几乎所有的时域分析方法,首先都用于预测。主流时间序列分析方法对数据资料要求严格,不允许有缺失值,所以,缺失值填补也是时间序列分析的内容之一,且缺失值填补也是基于预测的。 时间序列数据的预处理 时间序列数据和普通数据不同,它有严格的顺序,并且需要定义时间变量让软件读懂其时间顺序,特别是季节性模型,必须使用SPSS软件内部的时间变量。一些时间序列分析方法(如自回归模型)要求数据没有缺失值,通常在时间序列分析前需要对数据填补缺失值。另外,根据时间序列的顺序特定,可以产生移动平均序列、滞后或领先序列,这些都属于时间序列资料的预处理工作。 时间序列数据的预处理 定义日期变量 依次单击菜单“数据→定义日期”命令可以得到“定义日期”对话框 时间序列数据的预处理 创建时间序列 依次单击菜单“转换→创建时间序列”命令可以得到该对话框 时间序列数据的预处理 填补缺失数据 填补缺失数据是时间序列资料分析的重要环节。时间序列分析的参数模型,如 模型等,都不允许有缺失值存在,在有缺失值的情况下,系统会用默认的方式填补后分析。SPSS提供了缺失值填补模块,数据分析者可以选择填补缺失数据的方式。 指数平滑法 指数平滑法的思想来源于对移动平均法预测方法的改进。用当前值和历史值预测未来值时,移动平均法(Point Moving Average)有两个难题:其一是当前值和历史值同等权重不合理,一般而言,未来值总是和邻近时点的值关系更密切;其二是无法令人信服地确定窗宽,使用5日移动平均数还是15日这一类难有定论,而且,如果使用5日移动平均数,那么5日之前的观察值等于赋予权重0,而5日内的观察值均有相等权重0.2,这也和实际情况相悖。 指数平滑法 依次单击菜单“分析→预测→指数平滑”命令,打开“指数平滑”对话框 指数平滑法 指数平滑:自定义模型 指数平滑法 指数平滑:参数 自回归模型 在做线性回归分析时,有一个前提条件就是要模型残差相互独立。一些按时间顺序搜集的资料往往存在自相关性,表现为模型的残差间存在自相关现象。这类资料可以使用自回归模型(Autoregression Model)进行分析。 自回归模型 依次单击菜单“分析→预测→自回归”命令,打开“自回归”对话框 自回归模型 自回归:保存 自回归模型 自回归:选项 ARIMA模型 ARIMA建模实际上包括3个步骤,即模型识别阶段、参数估计和检验阶段以及预测应用阶段,其中,前两个阶段可能需要反复进行。 ARIMA过程提供建立Box-Jenkins的时间序列模型,本过程可以对带ARIMA误差的回归方程建模。本过程也可用于建立乘积型季节性模型。 ARIMA模型 单击菜单“分析→预测→ARIMA模型。 周期性分解 周期性分解模型具有等价的ARIMA(p,d,q)×(P,D,Q)s表示形式,并有相应的参数估计和假设检验方法。SPSS的周期性分解过程比较

    展开全文
  • 版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享...1 数据的预处理时间序列数据生成 import pandas as pdimport numpy as npdate_range:可以指定开始时间与...

    版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

    1 数据的预处理

    时间序列数据生成 import pandas as pd

    import numpy as np

    date_range:

    可以指定开始时间与周期

    H:小时

    D:天

    M:月

    # TIMES #2016 Jul 1 7/1/2016 1/7/2016 2016-07-01 2016/07/01

    rng = pd.date_range('2016-07-01', periods = 10, freq = '3D')

    rng

    DatetimeIndex(['2016-07-01', '2016-07-04', '2016-07-07', '2016-07-10',

    '2016-07-13', '2016-07-16', '2016-07-19', '2016-07-22',

    '2016-07-25', '2016-07-28'],

    dtype='datetime64[ns]', freq='3D')

    time=pd.Series(np.random.randn(20),

    index=pd.date_range(dt.datetime(2016,1,1),periods=20))

    print(time)

    2016-01-01 -0.129379

    2016-01-02 0.164480

    2016-01-03 -0.639117

    2016-01-04 -0.427224

    2016-01-05 2.055133

    2016-01-06 1.116075

    2016-01-07 0.357426

    2016-01-08 0.274249

    2016-01-09 0.834405

    2016-01-10 -0.005444

    2016-01-11 -0.134409

    2016-01-12 0.249318

    2016-01-13 -0.297842

    2016-01-14 -0.128514

    2016-01-15 0.063690

    2016-01-16 -2.246031

    2016-01-17 0.359552

    2016-01-18 0.383030

    2016-01-19 0.402717

    2016-01-20 -0.694068

    Freq: D, dtype: float64

    复制代码

    truncate过滤 time.truncate(before='2016-1-10')

    2016-01-10 -0.005444

    2016-01-11 -0.134409

    2016-01-12 0.249318

    2016-01-13 -0.297842

    2016-01-14 -0.128514

    2016-01-15 0.063690

    2016-01-16 -2.246031

    2016-01-17 0.359552

    2016-01-18 0.383030

    2016-01-19 0.402717

    2016-01-20 -0.694068

    Freq: D, dtype: float64

    time.truncate(after='2016-1-10')

    2016-01-01 -0.129379

    2016-01-02 0.164480

    2016-01-03 -0.639117

    2016-01-04 -0.427224

    2016-01-05 2.055133

    2016-01-06 1.116075

    2016-01-07 0.357426

    2016-01-08 0.274249

    2016-01-09 0.834405

    2016-01-10 -0.005444

    Freq: D, dtype: float64

    print(time['2016-01-15':'2016-01-20'])

    2016-01-15 0.063690

    2016-01-16 -2.246031

    2016-01-17 0.359552

    2016-01-18 0.383030

    2016-01-19 0.402717

    2016-01-20 -0.694068

    Freq: D, dtype: float64

    data=pd.date_range('2010-01-01','2011-01-01',freq='M')

    print(data)

    DatetimeIndex(['2010-01-31', '2010-02-28', '2010-03-31', '2010-04-30',

    '2010-05-31', '2010-06-30', '2010-07-31', '2010-08-31',

    '2010-09-30', '2010-10-31', '2010-11-30', '2010-12-31'],

    dtype='datetime64[ns]', freq='M')

    # 指定索引

    rng = pd.date_range('2016 Jul 1', periods = 10, freq = 'D')

    rng

    pd.Series(range(len(rng)), index = rng)

    2016-07-01 0

    2016-07-02 1

    2016-07-03 2

    2016-07-04 3

    2016-07-05 4

    2016-07-06 5

    2016-07-07 6

    2016-07-08 7

    2016-07-09 8

    2016-07-10 9

    Freq: D, dtype: int32

    复制代码

    指定索引 periods = [pd.Period('2016-01'), pd.Period('2016-02'), pd.Period('2016-03')]

    ts = pd.Series(np.random.randn(len(periods)), index = periods)

    ts

    2016-07-01 0

    2016-07-02 1

    2016-07-03 2

    2016-07-04 3

    2016-07-05 4

    2016-07-06 5

    2016-07-07 6

    2016-07-08 7

    2016-07-09 8

    2016-07-10 9

    Freq: D, dtype: int32

    复制代码

    时间戳和时间周期可以转换 ts = pd.Series(range(10), pd.date_range('07-10-16 8:00', periods = 10, freq = 'H'))

    ts

    2016-07-10 08:00:00 0

    2016-07-10 09:00:00 1

    2016-07-10 10:00:00 2

    2016-07-10 11:00:00 3

    2016-07-10 12:00:00 4

    2016-07-10 13:00:00 5

    2016-07-10 14:00:00 6

    2016-07-10 15:00:00 7

    2016-07-10 16:00:00 8

    2016-07-10 17:00:00 9

    Freq: H, dtype: int32

    ts_period = ts.to_period()

    ts_period

    2016-07-10 08:00 0

    2016-07-10 09:00 1

    2016-07-10 10:00 2

    2016-07-10 11:00 3

    2016-07-10 12:00 4

    2016-07-10 13:00 5

    2016-07-10 14:00 6

    2016-07-10 15:00 7

    2016-07-10 16:00 8

    2016-07-10 17:00 9

    Freq: H, dtype: int32

    ts_period['2016-07-10 08:30':'2016-07-10 11:45']

    2016-07-10 08:00 0

    2016-07-10 09:00 1

    2016-07-10 10:00 2

    2016-07-10 11:00 3

    Freq: H, dtype: int32

    ts['2016-07-10 08:30':'2016-07-10 11:45']

    2016-07-10 09:00:00 1

    2016-07-10 10:00:00 2

    2016-07-10 11:00:00 3

    Freq: H, dtype: int32

    复制代码

    2 数据重采样

    时间数据由一个频率转换到另一个频率

    降采样

    升采样 rng = pd.date_range('1/1/2011', periods=90, freq='D')

    ts = pd.Series(np.random.randn(len(rng)), index=rng)

    ts.head()

    2011-01-01 -1.025562

    2011-01-02 0.410895

    2011-01-03 0.660311

    2011-01-04 0.710293

    2011-01-05 0.444985

    Freq: D, dtype: float64

    ts.resample('M').sum()

    2011-01-31 2.510102

    2011-02-28 0.583209

    2011-03-31 2.749411

    Freq: M, dtype: float64

    ts.resample('3D').sum()

    2011-01-01 0.045643

    2011-01-04 -2.255206

    2011-01-07 0.571142

    2011-01-10 0.835032

    2011-01-13 -0.396766

    2011-01-16 -1.156253

    2011-01-19 -1.286884

    2011-01-22 2.883952

    2011-01-25 1.566908

    2011-01-28 1.435563

    2011-01-31 0.311565

    2011-02-03 -2.541235

    2011-02-06 0.317075

    2011-02-09 1.598877

    2011-02-12 -1.950509

    2011-02-15 2.928312

    2011-02-18 -0.733715

    2011-02-21 1.674817

    2011-02-24 -2.078872

    2011-02-27 2.172320

    2011-03-02 -2.022104

    2011-03-05 -0.070356

    2011-03-08 1.276671

    2011-03-11 -2.835132

    2011-03-14 -1.384113

    2011-03-17 1.517565

    2011-03-20 -0.550406

    2011-03-23 0.773430

    2011-03-26 2.244319

    2011-03-29 2.951082

    Freq: 3D, dtype: float64

    day3Ts = ts.resample('3D').mean()

    day3Ts

    2011-01-01 0.015214

    2011-01-04 -0.751735

    2011-01-07 0.190381

    2011-01-10 0.278344

    2011-01-13 -0.132255

    2011-01-16 -0.385418

    2011-01-19 -0.428961

    2011-01-22 0.961317

    2011-01-25 0.522303

    2011-01-28 0.478521

    2011-01-31 0.103855

    2011-02-03 -0.847078

    2011-02-06 0.105692

    2011-02-09 0.532959

    2011-02-12 -0.650170

    2011-02-15 0.976104

    2011-02-18 -0.244572

    2011-02-21 0.558272

    2011-02-24 -0.692957

    2011-02-27 0.724107

    2011-03-02 -0.674035

    2011-03-05 -0.023452

    2011-03-08 0.425557

    2011-03-11 -0.945044

    2011-03-14 -0.461371

    2011-03-17 0.505855

    2011-03-20 -0.183469

    2011-03-23 0.257810

    2011-03-26 0.748106

    2011-03-29 0.983694

    Freq: 3D, dtype: float64

    ## 下采样

    print(day3Ts.resample('D').asfreq())

    2011-01-01 0.015214

    2011-01-02 NaN

    2011-01-03 NaN

    2011-01-04 -0.751735

    2011-01-05 NaN

    2011-01-06 NaN

    2011-01-07 0.190381

    2011-01-08 NaN

    2011-01-09 NaN

    2011-01-10 0.278344

    2011-01-11 NaN

    2011-01-12 NaN

    2011-01-13 -0.132255

    2011-01-14 NaN

    2011-01-15 NaN

    2011-01-16 -0.385418

    2011-01-17 NaN

    2011-01-18 NaN

    2011-01-19 -0.428961

    2011-01-20 NaN

    2011-01-21 NaN

    2011-01-22 0.961317

    Freq: D, Length: 88, dtype: float64

    复制代码

    ffill 空值取前面的值

    bfill 空值取后面的值

    interpolate 线性取值 day3Ts.resample('D').ffill(1)

    2011-01-01 0.015214

    2011-01-02 0.015214

    2011-01-03 NaN

    2011-01-04 -0.751735

    2011-01-05 -0.751735

    2011-01-06 NaN

    2011-01-07 0.190381

    2011-01-08 0.190381

    2011-01-09 NaN

    2011-01-10 0.278344

    2011-01-11 0.278344

    day3Ts.resample('D').bfill(1)

    2011-01-01 0.015214

    2011-01-02 NaN

    2011-01-03 -0.751735

    2011-01-04 -0.751735

    2011-01-05 NaN

    2011-01-06 0.190381

    2011-01-07 0.190381

    2011-01-08 NaN

    2011-01-09 0.278344

    2011-01-10 0.278344

    2011-01-11 NaN

    2011-01-12 -0.132255

    2011-01-13 -0.132255

    day3Ts.resample('D').interpolate('linear')

    2011-01-01 0.015214

    2011-01-02 -0.240435

    2011-01-03 -0.496085

    2011-01-04 -0.751735

    2011-01-05 -0.437697

    2011-01-06 -0.123658

    2011-01-07 0.190381

    2011-01-08 0.219702

    2011-01-09 0.249023

    2011-01-10 0.278344

    2011-01-11 0.141478

    2011-01-12 0.004611

    2011-01-13 -0.132255

    2011-01-14 -0.216643

    2011-01-15 -0.301030

    复制代码

    3 滑动窗

    滑动窗计算 %matplotlib inline

    import matplotlib.pylab

    import numpy as np

    import pandas as pd

    df = pd.Series(np.random.randn(600), index = pd.date_range('7/1/2016', freq = 'D', periods = 600))

    df.head()

    2016-07-01 -0.192140

    2016-07-02 0.357953

    2016-07-03 -0.201847

    2016-07-04 -0.372230

    2016-07-05 1.414753

    Freq: D, dtype: float64

    r = df.rolling(window = 10)

    #r.max, r.median, r.std, r.skew, r.sum, r.var

    print(r.mean())

    016-07-01 NaN

    2016-07-02 NaN

    2016-07-03 NaN

    2016-07-04 NaN

    2016-07-05 NaN

    2016-07-06 NaN

    2016-07-07 NaN

    2016-07-08 NaN

    2016-07-09 NaN

    2016-07-10 0.300133

    2016-07-11 0.284780

    2016-07-12 0.252831

    2016-07-13 0.220699

    2016-07-14 0.167137

    2016-07-15 0.018593

    2016-07-16 -0.061414

    2016-07-17 -0.134593

    2016-07-18 -0.153333

    2016-07-19 -0.218928

    2016-07-20 -0.169426

    2016-07-21 -0.219747

    2016-07-22 -0.181266

    2016-07-23 -0.173674

    2016-07-24 -0.130629

    2016-07-25 -0.166730

    2016-07-26 -0.233044

    2016-07-27 -0.256642

    2016-07-28 -0.280738

    2016-07-29 -0.289893

    2016-07-30 -0.379625

    ...

    2018-01-22 -0.211467

    2018-01-23 0.034996

    2018-01-24 -0.105910

    2018-01-25 -0.145774

    2018-01-26 -0.089320

    2018-01-27 -0.164370

    2018-01-28 -0.110892

    2018-01-29 -0.205786

    2018-01-30 -0.101162

    2018-01-31 -0.034760

    2018-02-01 0.229333

    2018-02-02 0.043741

    2018-02-03 0.052837

    2018-02-04 0.057746

    2018-02-05 -0.071401

    2018-02-06 -0.011153

    2018-02-07 -0.045737

    2018-02-08 -0.021983

    2018-02-09 -0.196715

    2018-02-10 -0.063721

    2018-02-11 -0.289452

    2018-02-12 -0.050946

    2018-02-13 -0.047014

    2018-02-14 0.048754

    2018-02-15 0.143949

    2018-02-16 0.424823

    2018-02-17 0.361878

    2018-02-18 0.363235

    2018-02-19 0.517436

    2018-02-20 0.368020

    Freq: D, Length: 600, dtype: float64

    复制代码

    可视化 import matplotlib.pyplot as plt

    %matplotlib inline

    plt.figure(figsize=(15, 5))

    df.plot(style='r--')

    df.rolling(window=10).mean().plot(style='b')

    复制代码

    4 ARIMA预测

    数据的预处理 import pandas_datareader

    import datetime

    import matplotlib.pylab as plt

    import seaborn as sns

    from matplotlib.pylab import style

    from statsmodels.tsa.arima_model import ARIMA

    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

    style.use('ggplot')

    plt.rcParams['font.sans-serif'] = ['SimHei']

    plt.rcParams['axes.unicode_minus'] = False

    stockFile = 'data/T10yr.csv'

    stock = pd.read_csv(stockFile, index_col=0, parse_dates=[0])

    stock.head(10)

    复制代码

    stock_week = stock['Close'].resample('W-MON').mean()

    stock_train = stock_week['2000':'2015']

    stock_train.plot(figsize=(12,8))

    plt.legend(bbox_to_anchor=(1.25, 0.5))

    plt.title("Stock Close")

    sns.despine()

    复制代码

    stock_diff = stock_train.diff()

    stock_diff = stock_diff.dropna()

    plt.figure()

    plt.plot(stock_diff)

    plt.title('一阶差分')

    plt.show()

    复制代码

    acf = plot_acf(stock_diff, lags=20)

    plt.title("ACF")

    acf.show()

    复制代码

    pacf = plot_pacf(stock_diff, lags=20)

    plt.title("PACF")

    pacf.show()

    复制代码

    model = ARIMA(stock_train, order=(1, 1, 1),freq='W-MON')

    result = model.fit()

    #print(result.summary())

    pred = result.predict('20140609', '20160701',dynamic=True, typ='levels')

    print (pred)

    2014-06-09 2.463559

    2014-06-16 2.455539

    2014-06-23 2.449569

    2014-06-30 2.444183

    2014-07-07 2.438962

    2014-07-14 2.433788

    2014-07-21 2.428627

    2014-07-28 2.423470

    2014-08-04 2.418315

    2014-08-11 2.413159

    2014-08-18 2.408004

    2014-08-25 2.402849

    2014-09-01 2.397693

    2014-09-08 2.392538

    2014-09-15 2.387383

    plt.figure(figsize=(6, 6))

    plt.xticks(rotation=45)

    plt.plot(pred)

    plt.plot(stock_train)

    复制代码

    展开全文
  • 版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业...1 数据的预处理 时间序列数据生成 import pandas as pd import numpy as np da...

    版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

    1 数据的预处理

    • 时间序列数据生成

        import pandas as pd
        import numpy as np
        
        
        date_range:
        可以指定开始时间与周期
        H:小时
        D:天
        M:月
        
        # TIMES #2016 Jul 1 7/1/2016 1/7/2016 2016-07-01 2016/07/01
        rng = pd.date_range('2016-07-01', periods = 10, freq = '3D')
        rng
        
        DatetimeIndex(['2016-07-01', '2016-07-04', '2016-07-07', '2016-07-10',
               '2016-07-13', '2016-07-16', '2016-07-19', '2016-07-22',
               '2016-07-25', '2016-07-28'],
              dtype='datetime64[ns]', freq='3D')
              
      
         time=pd.Series(np.random.randn(20),
               index=pd.date_range(dt.datetime(2016,1,1),periods=20))
         print(time)
         
        2016-01-01   -0.129379
        2016-01-02    0.164480
        2016-01-03   -0.639117
        2016-01-04   -0.427224
        2016-01-05    2.055133
        2016-01-06    1.116075
        2016-01-07    0.357426
        2016-01-08    0.274249
        2016-01-09    0.834405
        2016-01-10   -0.005444
        2016-01-11   -0.134409
        2016-01-12    0.249318
        2016-01-13   -0.297842
        2016-01-14   -0.128514
        2016-01-15    0.063690
        2016-01-16   -2.246031
        2016-01-17    0.359552
        2016-01-18    0.383030
        2016-01-19    0.402717
        2016-01-20   -0.694068
        Freq: D, dtype: float64
      
    • truncate过滤

        time.truncate(before='2016-1-10')
        2016-01-10   -0.005444
        2016-01-11   -0.134409
        2016-01-12    0.249318
        2016-01-13   -0.297842
        2016-01-14   -0.128514
        2016-01-15    0.063690
        2016-01-16   -2.246031
        2016-01-17    0.359552
        2016-01-18    0.383030
        2016-01-19    0.402717
        2016-01-20   -0.694068
        Freq: D, dtype: float64
        
        time.truncate(after='2016-1-10')
        2016-01-01   -0.129379
        2016-01-02    0.164480
        2016-01-03   -0.639117
        2016-01-04   -0.427224
        2016-01-05    2.055133
        2016-01-06    1.116075
        2016-01-07    0.357426
        2016-01-08    0.274249
        2016-01-09    0.834405
        2016-01-10   -0.005444
        Freq: D, dtype: float64
        
        print(time['2016-01-15':'2016-01-20'])
        2016-01-15    0.063690
        2016-01-16   -2.246031
        2016-01-17    0.359552
        2016-01-18    0.383030
        2016-01-19    0.402717
        2016-01-20   -0.694068
        Freq: D, dtype: float64
        
        data=pd.date_range('2010-01-01','2011-01-01',freq='M')
        print(data)
        
        DatetimeIndex(['2010-01-31', '2010-02-28', '2010-03-31', '2010-04-30',
               '2010-05-31', '2010-06-30', '2010-07-31', '2010-08-31',
               '2010-09-30', '2010-10-31', '2010-11-30', '2010-12-31'],
              dtype='datetime64[ns]', freq='M')
              
              
        # 指定索引
        rng = pd.date_range('2016 Jul 1', periods = 10, freq = 'D')
        rng
        pd.Series(range(len(rng)), index = rng)
        
        2016-07-01    0
        2016-07-02    1
        2016-07-03    2
        2016-07-04    3
        2016-07-05    4
        2016-07-06    5
        2016-07-07    6
        2016-07-08    7
        2016-07-09    8
        2016-07-10    9
        Freq: D, dtype: int32
      
    • 指定索引

        periods = [pd.Period('2016-01'), pd.Period('2016-02'), pd.Period('2016-03')]
        ts = pd.Series(np.random.randn(len(periods)), index = periods)
        ts
        
        2016-07-01    0
        2016-07-02    1
        2016-07-03    2
        2016-07-04    3
        2016-07-05    4
        2016-07-06    5
        2016-07-07    6
        2016-07-08    7
        2016-07-09    8
        2016-07-10    9
        Freq: D, dtype: int32
      
    • 时间戳和时间周期可以转换

        ts = pd.Series(range(10), pd.date_range('07-10-16 8:00', periods = 10, freq = 'H'))
        ts
        
        2016-07-10 08:00:00    0
        2016-07-10 09:00:00    1
        2016-07-10 10:00:00    2
        2016-07-10 11:00:00    3
        2016-07-10 12:00:00    4
        2016-07-10 13:00:00    5
        2016-07-10 14:00:00    6
        2016-07-10 15:00:00    7
        2016-07-10 16:00:00    8
        2016-07-10 17:00:00    9
        Freq: H, dtype: int32
      
        ts_period = ts.to_period()
        ts_period
        
        2016-07-10 08:00    0
        2016-07-10 09:00    1
        2016-07-10 10:00    2
        2016-07-10 11:00    3
        2016-07-10 12:00    4
        2016-07-10 13:00    5
        2016-07-10 14:00    6
        2016-07-10 15:00    7
        2016-07-10 16:00    8
        2016-07-10 17:00    9
        Freq: H, dtype: int32
        
        ts_period['2016-07-10 08:30':'2016-07-10 11:45']
        
        2016-07-10 08:00    0
        2016-07-10 09:00    1
        2016-07-10 10:00    2
        2016-07-10 11:00    3
        Freq: H, dtype: int32
        
        ts['2016-07-10 08:30':'2016-07-10 11:45']
        
        2016-07-10 09:00:00    1
        2016-07-10 10:00:00    2
        2016-07-10 11:00:00    3
        Freq: H, dtype: int32
      

    2 数据重采样

    • 时间数据由一个频率转换到另一个频率

    • 降采样

    • 升采样

        rng = pd.date_range('1/1/2011', periods=90, freq='D')
        ts = pd.Series(np.random.randn(len(rng)), index=rng)
        ts.head()
        
        2011-01-01   -1.025562
        2011-01-02    0.410895
        2011-01-03    0.660311
        2011-01-04    0.710293
        2011-01-05    0.444985
        Freq: D, dtype: float64
        
        ts.resample('M').sum()
        
        2011-01-31    2.510102
        2011-02-28    0.583209
        2011-03-31    2.749411
        Freq: M, dtype: float64
        
        ts.resample('3D').sum()
        
        2011-01-01    0.045643
        2011-01-04   -2.255206
        2011-01-07    0.571142
        2011-01-10    0.835032
        2011-01-13   -0.396766
        2011-01-16   -1.156253
        2011-01-19   -1.286884
        2011-01-22    2.883952
        2011-01-25    1.566908
        2011-01-28    1.435563
        2011-01-31    0.311565
        2011-02-03   -2.541235
        2011-02-06    0.317075
        2011-02-09    1.598877
        2011-02-12   -1.950509
        2011-02-15    2.928312
        2011-02-18   -0.733715
        2011-02-21    1.674817
        2011-02-24   -2.078872
        2011-02-27    2.172320
        2011-03-02   -2.022104
        2011-03-05   -0.070356
        2011-03-08    1.276671
        2011-03-11   -2.835132
        2011-03-14   -1.384113
        2011-03-17    1.517565
        2011-03-20   -0.550406
        2011-03-23    0.773430
        2011-03-26    2.244319
        2011-03-29    2.951082
        Freq: 3D, dtype: float64
      
        day3Ts = ts.resample('3D').mean()
        day3Ts
        
        2011-01-01    0.015214
        2011-01-04   -0.751735
        2011-01-07    0.190381
        2011-01-10    0.278344
        2011-01-13   -0.132255
        2011-01-16   -0.385418
        2011-01-19   -0.428961
        2011-01-22    0.961317
        2011-01-25    0.522303
        2011-01-28    0.478521
        2011-01-31    0.103855
        2011-02-03   -0.847078
        2011-02-06    0.105692
        2011-02-09    0.532959
        2011-02-12   -0.650170
        2011-02-15    0.976104
        2011-02-18   -0.244572
        2011-02-21    0.558272
        2011-02-24   -0.692957
        2011-02-27    0.724107
        2011-03-02   -0.674035
        2011-03-05   -0.023452
        2011-03-08    0.425557
        2011-03-11   -0.945044
        2011-03-14   -0.461371
        2011-03-17    0.505855
        2011-03-20   -0.183469
        2011-03-23    0.257810
        2011-03-26    0.748106
        2011-03-29    0.983694
        Freq: 3D, dtype: float64
        
        ## 下采样
        print(day3Ts.resample('D').asfreq())
        
        2011-01-01    0.015214
        2011-01-02         NaN
        2011-01-03         NaN
        2011-01-04   -0.751735
        2011-01-05         NaN
        2011-01-06         NaN
        2011-01-07    0.190381
        2011-01-08         NaN
        2011-01-09         NaN
        2011-01-10    0.278344
        2011-01-11         NaN
        2011-01-12         NaN
        2011-01-13   -0.132255
        2011-01-14         NaN
        2011-01-15         NaN
        2011-01-16   -0.385418
        2011-01-17         NaN
        2011-01-18         NaN
        2011-01-19   -0.428961
        2011-01-20         NaN
        2011-01-21         NaN
        2011-01-22    0.961317
        Freq: D, Length: 88, dtype: float64
      
    • ffill 空值取前面的值

    • bfill 空值取后面的值

    • interpolate 线性取值

       day3Ts.resample('D').ffill(1)
       
        2011-01-01    0.015214
        2011-01-02    0.015214
        2011-01-03         NaN
        2011-01-04   -0.751735
        2011-01-05   -0.751735
        2011-01-06         NaN
        2011-01-07    0.190381
        2011-01-08    0.190381
        2011-01-09         NaN
        2011-01-10    0.278344
        2011-01-11    0.278344
        
        day3Ts.resample('D').bfill(1)
        2011-01-01    0.015214
        2011-01-02         NaN
        2011-01-03   -0.751735
        2011-01-04   -0.751735
        2011-01-05         NaN
        2011-01-06    0.190381
        2011-01-07    0.190381
        2011-01-08         NaN
        2011-01-09    0.278344
        2011-01-10    0.278344
        2011-01-11         NaN
        2011-01-12   -0.132255
        2011-01-13   -0.132255
      
       day3Ts.resample('D').interpolate('linear')
       2011-01-01    0.015214
        2011-01-02   -0.240435
        2011-01-03   -0.496085
        2011-01-04   -0.751735
        2011-01-05   -0.437697
        2011-01-06   -0.123658
        2011-01-07    0.190381
        2011-01-08    0.219702
        2011-01-09    0.249023
        2011-01-10    0.278344
        2011-01-11    0.141478
        2011-01-12    0.004611
        2011-01-13   -0.132255
        2011-01-14   -0.216643
        2011-01-15   -0.301030
      

    3 滑动窗

    • 滑动窗计算

        %matplotlib inline 
        import matplotlib.pylab
        import numpy as np
        import pandas as pd
        
        df = pd.Series(np.random.randn(600), index = pd.date_range('7/1/2016', freq = 'D', periods = 600))
        df.head()
        
        2016-07-01   -0.192140
        2016-07-02    0.357953
        2016-07-03   -0.201847
        2016-07-04   -0.372230
        2016-07-05    1.414753
        Freq: D, dtype: float64
      
        r = df.rolling(window = 10)
        #r.max, r.median, r.std, r.skew, r.sum, r.var
        print(r.mean())
        
        016-07-01         NaN
        2016-07-02         NaN
        2016-07-03         NaN
        2016-07-04         NaN
        2016-07-05         NaN
        2016-07-06         NaN
        2016-07-07         NaN
        2016-07-08         NaN
        2016-07-09         NaN
        2016-07-10    0.300133
        2016-07-11    0.284780
        2016-07-12    0.252831
        2016-07-13    0.220699
        2016-07-14    0.167137
        2016-07-15    0.018593
        2016-07-16   -0.061414
        2016-07-17   -0.134593
        2016-07-18   -0.153333
        2016-07-19   -0.218928
        2016-07-20   -0.169426
        2016-07-21   -0.219747
        2016-07-22   -0.181266
        2016-07-23   -0.173674
        2016-07-24   -0.130629
        2016-07-25   -0.166730
        2016-07-26   -0.233044
        2016-07-27   -0.256642
        2016-07-28   -0.280738
        2016-07-29   -0.289893
        2016-07-30   -0.379625
                        ...   
        2018-01-22   -0.211467
        2018-01-23    0.034996
        2018-01-24   -0.105910
        2018-01-25   -0.145774
        2018-01-26   -0.089320
        2018-01-27   -0.164370
        2018-01-28   -0.110892
        2018-01-29   -0.205786
        2018-01-30   -0.101162
        2018-01-31   -0.034760
        2018-02-01    0.229333
        2018-02-02    0.043741
        2018-02-03    0.052837
        2018-02-04    0.057746
        2018-02-05   -0.071401
        2018-02-06   -0.011153
        2018-02-07   -0.045737
        2018-02-08   -0.021983
        2018-02-09   -0.196715
        2018-02-10   -0.063721
        2018-02-11   -0.289452
        2018-02-12   -0.050946
        2018-02-13   -0.047014
        2018-02-14    0.048754
        2018-02-15    0.143949
        2018-02-16    0.424823
        2018-02-17    0.361878
        2018-02-18    0.363235
        2018-02-19    0.517436
        2018-02-20    0.368020
        Freq: D, Length: 600, dtype: float64
      
    • 可视化

        import matplotlib.pyplot as plt
        %matplotlib inline
        
        plt.figure(figsize=(15, 5))
        
        df.plot(style='r--')
        df.rolling(window=10).mean().plot(style='b')
      

    4 ARIMA预测

    • 数据的预处理

        import pandas_datareader
        import datetime
        import matplotlib.pylab as plt
        import seaborn as sns
        from matplotlib.pylab import style
        from statsmodels.tsa.arima_model import ARIMA
        from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
        
        style.use('ggplot')    
        plt.rcParams['font.sans-serif'] = ['SimHei'] 
        plt.rcParams['axes.unicode_minus'] = False  
        stockFile = 'data/T10yr.csv'
        stock = pd.read_csv(stockFile, index_col=0, parse_dates=[0])
        stock.head(10)
      

        stock_week = stock['Close'].resample('W-MON').mean()
        stock_train = stock_week['2000':'2015'] 
        stock_train.plot(figsize=(12,8))
        plt.legend(bbox_to_anchor=(1.25, 0.5))
        plt.title("Stock Close")
        sns.despine()
    

        stock_diff = stock_train.diff()
        stock_diff = stock_diff.dropna()
        
        plt.figure()
        plt.plot(stock_diff)
        plt.title('一阶差分')
        plt.show()
    

    acf = plot_acf(stock_diff, lags=20)
    plt.title("ACF")
    acf.show()
    

        pacf = plot_pacf(stock_diff, lags=20)
        plt.title("PACF")
        pacf.show()
    

        model = ARIMA(stock_train, order=(1, 1, 1),freq='W-MON')
        result = model.fit()
        #print(result.summary())
        pred = result.predict('20140609', '20160701',dynamic=True, typ='levels')
        print (pred)
        
        2014-06-09    2.463559
        2014-06-16    2.455539
        2014-06-23    2.449569
        2014-06-30    2.444183
        2014-07-07    2.438962
        2014-07-14    2.433788
        2014-07-21    2.428627
        2014-07-28    2.423470
        2014-08-04    2.418315
        2014-08-11    2.413159
        2014-08-18    2.408004
        2014-08-25    2.402849
        2014-09-01    2.397693
        2014-09-08    2.392538
        2014-09-15    2.387383
        
        plt.figure(figsize=(6, 6))
        plt.xticks(rotation=45)
        plt.plot(pred)
        plt.plot(stock_train)
    

    5 总结

    方便复习,整成笔记,内容粗略,勿怪

    版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

    秦凯新 于深圳 20181211049

    展开全文
  • 版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业...1 数据的预处理 时间序列数据生成 import pandas as pd import numpy as np da...

    版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

    1 数据的预处理

    • 时间序列数据生成

        import pandas as pd
        import numpy as np
        
        
        date_range:
        可以指定开始时间与周期
        H:小时
        D:天
        M:月
        
        # TIMES #2016 Jul 1 7/1/2016 1/7/2016 2016-07-01 2016/07/01
        rng = pd.date_range('2016-07-01', periods = 10, freq = '3D')
        rng
        
        DatetimeIndex(['2016-07-01', '2016-07-04', '2016-07-07', '2016-07-10',
               '2016-07-13', '2016-07-16', '2016-07-19', '2016-07-22',
               '2016-07-25', '2016-07-28'],
              dtype='datetime64[ns]', freq='3D')
              
      
         time=pd.Series(np.random.randn(20),
               index=pd.date_range(dt.datetime(2016,1,1),periods=20))
         print(time)
         
        2016-01-01   -0.129379
        2016-01-02    0.164480
        2016-01-03   -0.639117
        2016-01-04   -0.427224
        2016-01-05    2.055133
        2016-01-06    1.116075
        2016-01-07    0.357426
        2016-01-08    0.274249
        2016-01-09    0.834405
        2016-01-10   -0.005444
        2016-01-11   -0.134409
        2016-01-12    0.249318
        2016-01-13   -0.297842
        2016-01-14   -0.128514
        2016-01-15    0.063690
        2016-01-16   -2.246031
        2016-01-17    0.359552
        2016-01-18    0.383030
        2016-01-19    0.402717
        2016-01-20   -0.694068
        Freq: D, dtype: float64
      复制代码
    • truncate过滤

        time.truncate(before='2016-1-10')
        2016-01-10   -0.005444
        2016-01-11   -0.134409
        2016-01-12    0.249318
        2016-01-13   -0.297842
        2016-01-14   -0.128514
        2016-01-15    0.063690
        2016-01-16   -2.246031
        2016-01-17    0.359552
        2016-01-18    0.383030
        2016-01-19    0.402717
        2016-01-20   -0.694068
        Freq: D, dtype: float64
        
        time.truncate(after='2016-1-10')
        2016-01-01   -0.129379
        2016-01-02    0.164480
        2016-01-03   -0.639117
        2016-01-04   -0.427224
        2016-01-05    2.055133
        2016-01-06    1.116075
        2016-01-07    0.357426
        2016-01-08    0.274249
        2016-01-09    0.834405
        2016-01-10   -0.005444
        Freq: D, dtype: float64
        
        print(time['2016-01-15':'2016-01-20'])
        2016-01-15    0.063690
        2016-01-16   -2.246031
        2016-01-17    0.359552
        2016-01-18    0.383030
        2016-01-19    0.402717
        2016-01-20   -0.694068
        Freq: D, dtype: float64
        
        data=pd.date_range('2010-01-01','2011-01-01',freq='M')
        print(data)
        
        DatetimeIndex(['2010-01-31', '2010-02-28', '2010-03-31', '2010-04-30',
               '2010-05-31', '2010-06-30', '2010-07-31', '2010-08-31',
               '2010-09-30', '2010-10-31', '2010-11-30', '2010-12-31'],
              dtype='datetime64[ns]', freq='M')
              
              
        # 指定索引
        rng = pd.date_range('2016 Jul 1', periods = 10, freq = 'D')
        rng
        pd.Series(range(len(rng)), index = rng)
        
        2016-07-01    0
        2016-07-02    1
        2016-07-03    2
        2016-07-04    3
        2016-07-05    4
        2016-07-06    5
        2016-07-07    6
        2016-07-08    7
        2016-07-09    8
        2016-07-10    9
        Freq: D, dtype: int32
      复制代码
    • 指定索引

        periods = [pd.Period('2016-01'), pd.Period('2016-02'), pd.Period('2016-03')]
        ts = pd.Series(np.random.randn(len(periods)), index = periods)
        ts
        
        2016-07-01    0
        2016-07-02    1
        2016-07-03    2
        2016-07-04    3
        2016-07-05    4
        2016-07-06    5
        2016-07-07    6
        2016-07-08    7
        2016-07-09    8
        2016-07-10    9
        Freq: D, dtype: int32
      复制代码
    • 时间戳和时间周期可以转换

        ts = pd.Series(range(10), pd.date_range('07-10-16 8:00', periods = 10, freq = 'H'))
        ts
        
        2016-07-10 08:00:00    0
        2016-07-10 09:00:00    1
        2016-07-10 10:00:00    2
        2016-07-10 11:00:00    3
        2016-07-10 12:00:00    4
        2016-07-10 13:00:00    5
        2016-07-10 14:00:00    6
        2016-07-10 15:00:00    7
        2016-07-10 16:00:00    8
        2016-07-10 17:00:00    9
        Freq: H, dtype: int32
      
        ts_period = ts.to_period()
        ts_period
        
        2016-07-10 08:00    0
        2016-07-10 09:00    1
        2016-07-10 10:00    2
        2016-07-10 11:00    3
        2016-07-10 12:00    4
        2016-07-10 13:00    5
        2016-07-10 14:00    6
        2016-07-10 15:00    7
        2016-07-10 16:00    8
        2016-07-10 17:00    9
        Freq: H, dtype: int32
        
        ts_period['2016-07-10 08:30':'2016-07-10 11:45']
        
        2016-07-10 08:00    0
        2016-07-10 09:00    1
        2016-07-10 10:00    2
        2016-07-10 11:00    3
        Freq: H, dtype: int32
        
        ts['2016-07-10 08:30':'2016-07-10 11:45']
        
        2016-07-10 09:00:00    1
        2016-07-10 10:00:00    2
        2016-07-10 11:00:00    3
        Freq: H, dtype: int32
      复制代码

    2 数据重采样

    • 时间数据由一个频率转换到另一个频率

    • 降采样

    • 升采样

        rng = pd.date_range('1/1/2011', periods=90, freq='D')
        ts = pd.Series(np.random.randn(len(rng)), index=rng)
        ts.head()
        
        2011-01-01   -1.025562
        2011-01-02    0.410895
        2011-01-03    0.660311
        2011-01-04    0.710293
        2011-01-05    0.444985
        Freq: D, dtype: float64
        
        ts.resample('M').sum()
        
        2011-01-31    2.510102
        2011-02-28    0.583209
        2011-03-31    2.749411
        Freq: M, dtype: float64
        
        ts.resample('3D').sum()
        
        2011-01-01    0.045643
        2011-01-04   -2.255206
        2011-01-07    0.571142
        2011-01-10    0.835032
        2011-01-13   -0.396766
        2011-01-16   -1.156253
        2011-01-19   -1.286884
        2011-01-22    2.883952
        2011-01-25    1.566908
        2011-01-28    1.435563
        2011-01-31    0.311565
        2011-02-03   -2.541235
        2011-02-06    0.317075
        2011-02-09    1.598877
        2011-02-12   -1.950509
        2011-02-15    2.928312
        2011-02-18   -0.733715
        2011-02-21    1.674817
        2011-02-24   -2.078872
        2011-02-27    2.172320
        2011-03-02   -2.022104
        2011-03-05   -0.070356
        2011-03-08    1.276671
        2011-03-11   -2.835132
        2011-03-14   -1.384113
        2011-03-17    1.517565
        2011-03-20   -0.550406
        2011-03-23    0.773430
        2011-03-26    2.244319
        2011-03-29    2.951082
        Freq: 3D, dtype: float64
      
        day3Ts = ts.resample('3D').mean()
        day3Ts
        
        2011-01-01    0.015214
        2011-01-04   -0.751735
        2011-01-07    0.190381
        2011-01-10    0.278344
        2011-01-13   -0.132255
        2011-01-16   -0.385418
        2011-01-19   -0.428961
        2011-01-22    0.961317
        2011-01-25    0.522303
        2011-01-28    0.478521
        2011-01-31    0.103855
        2011-02-03   -0.847078
        2011-02-06    0.105692
        2011-02-09    0.532959
        2011-02-12   -0.650170
        2011-02-15    0.976104
        2011-02-18   -0.244572
        2011-02-21    0.558272
        2011-02-24   -0.692957
        2011-02-27    0.724107
        2011-03-02   -0.674035
        2011-03-05   -0.023452
        2011-03-08    0.425557
        2011-03-11   -0.945044
        2011-03-14   -0.461371
        2011-03-17    0.505855
        2011-03-20   -0.183469
        2011-03-23    0.257810
        2011-03-26    0.748106
        2011-03-29    0.983694
        Freq: 3D, dtype: float64
        
        ## 下采样
        print(day3Ts.resample('D').asfreq())
        
        2011-01-01    0.015214
        2011-01-02         NaN
        2011-01-03         NaN
        2011-01-04   -0.751735
        2011-01-05         NaN
        2011-01-06         NaN
        2011-01-07    0.190381
        2011-01-08         NaN
        2011-01-09         NaN
        2011-01-10    0.278344
        2011-01-11         NaN
        2011-01-12         NaN
        2011-01-13   -0.132255
        2011-01-14         NaN
        2011-01-15         NaN
        2011-01-16   -0.385418
        2011-01-17         NaN
        2011-01-18         NaN
        2011-01-19   -0.428961
        2011-01-20         NaN
        2011-01-21         NaN
        2011-01-22    0.961317
        Freq: D, Length: 88, dtype: float64
      复制代码
    • ffill 空值取前面的值

    • bfill 空值取后面的值

    • interpolate 线性取值

       day3Ts.resample('D').ffill(1)
       
        2011-01-01    0.015214
        2011-01-02    0.015214
        2011-01-03         NaN
        2011-01-04   -0.751735
        2011-01-05   -0.751735
        2011-01-06         NaN
        2011-01-07    0.190381
        2011-01-08    0.190381
        2011-01-09         NaN
        2011-01-10    0.278344
        2011-01-11    0.278344
        
        day3Ts.resample('D').bfill(1)
        2011-01-01    0.015214
        2011-01-02         NaN
        2011-01-03   -0.751735
        2011-01-04   -0.751735
        2011-01-05         NaN
        2011-01-06    0.190381
        2011-01-07    0.190381
        2011-01-08         NaN
        2011-01-09    0.278344
        2011-01-10    0.278344
        2011-01-11         NaN
        2011-01-12   -0.132255
        2011-01-13   -0.132255
      
       day3Ts.resample('D').interpolate('linear')
       2011-01-01    0.015214
        2011-01-02   -0.240435
        2011-01-03   -0.496085
        2011-01-04   -0.751735
        2011-01-05   -0.437697
        2011-01-06   -0.123658
        2011-01-07    0.190381
        2011-01-08    0.219702
        2011-01-09    0.249023
        2011-01-10    0.278344
        2011-01-11    0.141478
        2011-01-12    0.004611
        2011-01-13   -0.132255
        2011-01-14   -0.216643
        2011-01-15   -0.301030
      复制代码

    3 滑动窗

    • 滑动窗计算

        %matplotlib inline 
        import matplotlib.pylab
        import numpy as np
        import pandas as pd
        
        df = pd.Series(np.random.randn(600), index = pd.date_range('7/1/2016', freq = 'D', periods = 600))
        df.head()
        
        2016-07-01   -0.192140
        2016-07-02    0.357953
        2016-07-03   -0.201847
        2016-07-04   -0.372230
        2016-07-05    1.414753
        Freq: D, dtype: float64
      
        r = df.rolling(window = 10)
        #r.max, r.median, r.std, r.skew, r.sum, r.var
        print(r.mean())
        
        016-07-01         NaN
        2016-07-02         NaN
        2016-07-03         NaN
        2016-07-04         NaN
        2016-07-05         NaN
        2016-07-06         NaN
        2016-07-07         NaN
        2016-07-08         NaN
        2016-07-09         NaN
        2016-07-10    0.300133
        2016-07-11    0.284780
        2016-07-12    0.252831
        2016-07-13    0.220699
        2016-07-14    0.167137
        2016-07-15    0.018593
        2016-07-16   -0.061414
        2016-07-17   -0.134593
        2016-07-18   -0.153333
        2016-07-19   -0.218928
        2016-07-20   -0.169426
        2016-07-21   -0.219747
        2016-07-22   -0.181266
        2016-07-23   -0.173674
        2016-07-24   -0.130629
        2016-07-25   -0.166730
        2016-07-26   -0.233044
        2016-07-27   -0.256642
        2016-07-28   -0.280738
        2016-07-29   -0.289893
        2016-07-30   -0.379625
                        ...   
        2018-01-22   -0.211467
        2018-01-23    0.034996
        2018-01-24   -0.105910
        2018-01-25   -0.145774
        2018-01-26   -0.089320
        2018-01-27   -0.164370
        2018-01-28   -0.110892
        2018-01-29   -0.205786
        2018-01-30   -0.101162
        2018-01-31   -0.034760
        2018-02-01    0.229333
        2018-02-02    0.043741
        2018-02-03    0.052837
        2018-02-04    0.057746
        2018-02-05   -0.071401
        2018-02-06   -0.011153
        2018-02-07   -0.045737
        2018-02-08   -0.021983
        2018-02-09   -0.196715
        2018-02-10   -0.063721
        2018-02-11   -0.289452
        2018-02-12   -0.050946
        2018-02-13   -0.047014
        2018-02-14    0.048754
        2018-02-15    0.143949
        2018-02-16    0.424823
        2018-02-17    0.361878
        2018-02-18    0.363235
        2018-02-19    0.517436
        2018-02-20    0.368020
        Freq: D, Length: 600, dtype: float64
      复制代码
    • 可视化

        import matplotlib.pyplot as plt
        %matplotlib inline
        
        plt.figure(figsize=(15, 5))
        
        df.plot(style='r--')
        df.rolling(window=10).mean().plot(style='b')
      复制代码

    4 ARIMA预测

    • 数据的预处理

        import pandas_datareader
        import datetime
        import matplotlib.pylab as plt
        import seaborn as sns
        from matplotlib.pylab import style
        from statsmodels.tsa.arima_model import ARIMA
        from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
        
        style.use('ggplot')    
        plt.rcParams['font.sans-serif'] = ['SimHei'] 
        plt.rcParams['axes.unicode_minus'] = False  
        stockFile = 'data/T10yr.csv'
        stock = pd.read_csv(stockFile, index_col=0, parse_dates=[0])
        stock.head(10)
      复制代码

        stock_week = stock['Close'].resample('W-MON').mean()
        stock_train = stock_week['2000':'2015'] 
        stock_train.plot(figsize=(12,8))
        plt.legend(bbox_to_anchor=(1.25, 0.5))
        plt.title("Stock Close")
        sns.despine()
    复制代码

        stock_diff = stock_train.diff()
        stock_diff = stock_diff.dropna()
        
        plt.figure()
        plt.plot(stock_diff)
        plt.title('一阶差分')
        plt.show()
    复制代码

    acf = plot_acf(stock_diff, lags=20)
    plt.title("ACF")
    acf.show()
    复制代码

        pacf = plot_pacf(stock_diff, lags=20)
        plt.title("PACF")
        pacf.show()
    复制代码

        model = ARIMA(stock_train, order=(1, 1, 1),freq='W-MON')
        result = model.fit()
        #print(result.summary())
        pred = result.predict('20140609', '20160701',dynamic=True, typ='levels')
        print (pred)
        
        2014-06-09    2.463559
        2014-06-16    2.455539
        2014-06-23    2.449569
        2014-06-30    2.444183
        2014-07-07    2.438962
        2014-07-14    2.433788
        2014-07-21    2.428627
        2014-07-28    2.423470
        2014-08-04    2.418315
        2014-08-11    2.413159
        2014-08-18    2.408004
        2014-08-25    2.402849
        2014-09-01    2.397693
        2014-09-08    2.392538
        2014-09-15    2.387383
        
        plt.figure(figsize=(6, 6))
        plt.xticks(rotation=45)
        plt.plot(pred)
        plt.plot(stock_train)
    复制代码

    5 总结

    方便复习,整成笔记,内容粗略,勿怪

    版权声明:本套技术专栏是作者(秦凯新)平时工作的总结和升华,通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,如有任何学术交流,可随时联系。

    展开全文
  • Jupyter中时间序列预处理工作室:Jupyter笔记本中的时间序列数据预处理Studio
  • 应用时间序列分析实验报告实验名称第二章时间序列的预处理一、上机练习2.4.1绘制时序图dataexample2_1;inputprice1price2;time=intnx('month','01jul2004'd,_n_-1);formattimedate.;cards;12.8515.2113.2914.2312....
  • 数据挖掘——时间序列的预处理前言一、平稳非白噪声序列1、平稳时间序列的定义2、平稳性检验二、...时间序列根据数据的分布可以分为纯随机序列和平稳非白噪声序列、非平稳序列。 一、平稳非白噪声序列 对于平稳非白...
  • 类似于图片的时间序列数据,这是我EXCEL处理完毕。 拿到数据之后需要做三件事,第一件,检查数据缺失情况,序列是每周一个数据,如果发现上下两个数据之间缺少一周数据,...
  • 时间序列分析:数据预处理步骤引言:什么是时间序列分析一.平稳时间序列1.什么是平稳时间序列2.平稳时间序列的意义3.时间序列的特征统计量二.时间序列的平稳性检验1.导入数据(以分析某公司2000年--2003年每月销售...
  • 文本预处理文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:读入文本分词建立字典,将每个词映射到一个唯一的索引(index)将文本从词的...
  • 时间序列分析之预处理(一)

    万次阅读 2017-04-16 22:49:44
    该笔记基于《时间序列分析-基于R》 时间序列分析是非常有价值应用最广统计分析方法也是最难一种统计分析方法, 在对时间序列进行分析之前必须对数据进行预分析处理,如:平稳性检验与纯随机性检验 。一、时间...
  • 原标题:Python 序列中的时间类型数据处理丨数析学院日期或时间,是我们生活中常见的数据类型之一,本节将向大家介绍时间类型数据的生成、转换以及时间数据序列的一系列处理方法。通过 datetime 库中的 datetime ...
  • 时间序列预处理

    2020-12-19 21:43:55
           ...时间序列预处理流程图(侵删) 下面来详细介绍每个阶段处理 数据预处理流程图 数据预处理-平稳性检验        
  • 简单的数据预处理时间序列分析 spss数据预处理时间序列分析 (一)安装及数据导入 小白一枚,近期学习了spss时间序列分析,网上资源都是零散,特此整理并自己完成了一份时间序列分析操作方法小教程,只是最...
  • 概率分布概率分布意义随机... 这些原因导致我们很少直接使用联合概率分布进行时间序列分析时间序列概率看法为了研究时间序列数据,就要使用科学工具和方法,主要是概率和统计,利用概率构建时间序列直观,...
  • 简单的数据预处理时间序列分析 spss数据预处理时间序列分析 (二)时间变量生成及绘制散点图 时隔这么久终于又和大家见面了( ̄▽ ̄)~*,咱们继续我们内容 在完成数据导入
  • SigNorm是一个Web应用程序,允许用户使用易于使用,无代码且类似于文件转换器界面预处理时间序列数据文件(.csv)。 要使用该应用程序,请访问 。 用户可以简单地上传多个文件,从下拉菜单中选择预处理步骤,然后...
  • 时间序列预测(一)—— 数据预处理

    千次阅读 多人点赞 2019-05-20 15:20:56
      这是一个系列文章,主要从代码角度分析问题(争取做到代码片段随用随取),不涉及太多模型原理(我会尽可能讲一下自己理解),本系列文章包含了数据预处理和基本时间序列分析预测模型: (一)数据...
  • 时间序列预处理流程

    2019-09-11 09:30:33
    时间序列分析之前,需要进行序列的预处理,包括纯随机性和平稳性检验,通过计算序列的四个特征统计量,根据检验结果可以将序列分为不同的类型,然后采取不同的分析方法。 四个特征统计量 1.均值 2.方差 3.自协方差...
  • 简单的数据预处理时间序列分析 spss数据预处理时间序列分析 (二)产生设定新变量及画散点图相关操作 时隔这么久,终于又和大家见面了,在数据导入spss以后就可以快乐开始了,(~ ̄▽ ̄)~ 那么下面直入正题!...
  • 简单的数据预处理时间序列分析 spss数据预处理时间序列分析 (四)曲线拟合 在数据插补之前一定要找找数据的变化趋势,通常数据拟合就是一个较好的方案。 散点进行曲线拟合的方法 根据前面所画散点图,选择可能...
  • 时间序列分析之一:数据预处理

    千次阅读 2013-12-02 23:50:53
    时间序列分析拾运用概率与统计理论与方法分析随机数据序列,并建立数学模型、定阶和参数估计学科,它主要应用在预测、控制、滤波、金融(如股票价格)等方面。  我们常见的时间序列模型是状态平稳、正态分布、...
  • ARIMA建模分析分析步骤数据可视化,识别平稳性对非平稳的时间序列数据,做平稳性处理,得到平稳序列根据偏自相关系数和自相关系数选择模型模型阶数在确定之后,对模型进行参数估计判断(诊断)残差序列是否为白...
  • 时间序列数据结构特殊性 可列多个随机变量,而每个变量只有一个样本观察值 平稳性重大意义 极大地减少了随机变量个数,并增加了待估变量样本容量 极大地简化了时序分析难度,同时也提高了对特征统计量...
  • 数据进行预处理,建立ARIMA时间序列模型,做平稳性检验,并作一阶差分,通过模型识别与定阶,建立ARIMA(1,1,0)模型,最后应用选定的时间序列方法预测未来餐厅菜品销售量。我们预测出,未来五天餐厅菜品...
  • 数据预处理

    2020-11-03 23:06:19
    数据类型不同–文字、数字、时间序列 数据质量不行–噪声、异常、缺失、数据出错、量纲不一、重复、数据是偏态、数据量太大太小 特征工程 降低计算成本、提升模型上限 特征之间相关性 特征和标签无关 特征太多太...
  • spss入门——简单的数据预处理时间序列分析系列(声明!!!!!!!) 伙伴们,鉴于本人课业原因,此系列后续内容只能等待放寒假时候(2020年寒假)再跟进了,对所有爱学习伙伴们致敬!!! ...
  • 在对时间序列数据(如信号数据或股票价格数据)进行统计分析时,往往需要对数据进行平滑处理,本次主要介绍smooth函数、smoothts函数和medfilt1函数用法 1.smooth函数 smooth函数调用格式如下: 1) yy=smooth(y) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431
精华内容 172
关键字:

时间序列数据的预处理