关闭

[置顶] 时间序列(一)

标签: 数学建模python时间序列
700人阅读 评论(1) 收藏 举报
分类:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 13 11:20:10 2017

@author: DaiPuWei
"""

'''
    时间序列简单平移法:以预测12月份的销售收入为例
'''

import math

def Forecast(profit,N,month):
    '''
        预测函数:profit为销售收入数据
        N为预测周期,month为需要预测的月份
    '''
    result = []
    if month >=1 and month <= 12:
        #预测值
        forecast= 0
        for i in range(month-N-1,month-1):
            forecast += profit[i]
        forecast = forecast / 4
        result.append(forecast)

        #标准误差
        error = 0
        for i in range(N,len(profit)):
            tmp = forecast - profit[i]
            error = error + tmp * tmp
        error = error / (len(profit) - N)
        error = math.sqrt(error)
        result.append(error)
    else:
       print('月份不正确,请重新输入月份(1-12)')    
    return result

def run_main():
    '''
        这是组函数
    '''
    #销售收入
    profit = [553.8,574.6,606.9,649.8,705.1,772.0,816.4,892.7,963.9,1015.1,1102.7]

    #以4为预测周期的预测值
    forecast1 = Forecast(profit,4,12)

    #以4为预测周期的预测值
    forecast2 = Forecast(profit,5,12)

    if forecast1[1] < forecast2[1]:
        print('12月份的预测值为%g'%forecast1[0])
    else:
        print('12月份的预测值为%g'%forecast2[0])

if __name__ == '__main__':
    run_main()

这里写图片描述
这里写图片描述
Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 13 11:58:31 2017

@author: DaiPuWei
"""

'''
    时间序列加权移动平均法:以预测1989年原煤产量为例
'''

import pandas as pd

def Weighted_Forecast(data,weight,N):
    '''
        data是统计数据
        weight是权重
        N是预测周期
        index是要预测的下标
    '''

    #各个权重之和
    sum_weight = sum(weight)

    #预测值
    forecast  = 0
    length = len(data)

     #预测年份
    year = data.index[length-1]+1

    j = 0
    for i in range(length-N,length):
        forecast = forecast + weight[j] * data[data.columns[0]][data.index[i]]
        j = j + 1
    forecast = forecast / sum_weight
    print('%d年原煤产量未校对的预测值为:'%year)
    print(forecast)

    #data中数据的预测值
    forecast_data = []
    for i in range(N):
        forecast_data.append(data[data.columns[0]][data.index[i]])
    for i in range(N,length):
        tmp = 0
        k = 0
        for j in range(i-N,i):
            tmp = tmp + data[data.columns[0]][data.index[j]]*weight[k]
            k = k + 1
        forecast_data.append(tmp/sum_weight)
    print('所有的预测值为:')
    for i in range(length):
        print(data.index[i],forecast_data[i])

    #相对误差
    error_rate = []
    for i in range(length):
        error_rate.append(1-forecast_data[i]/data[data.columns[0]][data.index[i]])
    sum_error = sum(error_rate)
    sum_data = sum(data[data.columns[0]][data.index[N:]])
    avg_rate = 0

    #校正预测值
    forecast = forecast/(1-avg_rate)

    return forecast


def run_main():
    '''
        这是主函数
    '''

    #读取数据
    data = pd.read_excel('E:\\Program Files (x86)\\大学数学\\算法大全pdf\\第24章   时间序列模型\\原煤产量统计.xlsx')

    #周期数
    N = 3


    #权重
    weight = []
    for i in range(N):
        weight.append(i+1)

    forecast = Weighted_Forecast(data,weight,N)
    length = len(data)
    year = data.index[length-1]+1
    print('%d年的原煤产量预测值为:'%year)
    print(forecast)

if __name__ == '__main__':
    run_main()

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Jan 13 17:56:56 2017

@author: DaiPuWei
"""

'''
    时间序列趋势移动平均法,以1965-1985年发电总量为数据集合预测1986年与1987年
    的发电总量
'''

import pandas as pd

def Forecast(data,N):
    '''
        预测函数:data为销售收入数据
        N为预测周期,
    '''
    forecast_data = [] 
    length = len(data)
    for i in range(N,length):
        tmp = 0
        for j in range(i-N,i):
            tmp = tmp + data[j]
        tmp = tmp / N
        forecast_data.append(tmp)
    result = forecast_data[len(forecast_data)-1]

    return result,forecast_data

def Model(data,N,year,init):
    '''
        模型为:y(t+T) = a + b * T
        a = 2 * M1 - M2
        b = 2* (M1 - M2) / (N - 2)
    '''

    #一次移动平均的预测值以及预测数据
    M1,first_forecast = Forecast(data,N)

    #二次移动平均的预测值以及预测数据
    M2,Second_forecast = Forecast(first_forecast,N)

    #趋势移动平均模型参数a,b
    a = 2 * M1 - M2
    b = 2 *(M1 - M2) / (N - 2)
    print('预测模型为:y(T) = ',a,'+',b,'*(T-',init,')')

    #预测值
    forecast = a + b * (year -init)

    return forecast

def run_main():
    '''
        这是主函数
    '''

    #读取数据集
    sample = pd.read_excel('E:\\Program Files (x86)\\大学数学\\算法大全pdf\\第24章   时间序列模型\\1965-1985年发电总量统计.xlsx')
    data = sample['发电总量']

    #预测周期
    N = 6

    #初始年份
    init = sample['年份'][len(sample)-1]

    #1986年预测值
    forecast_1986 = Model(data,N,1986,init)
    print('1986年发电总量的预测值为:%f'%forecast_1986)

    #1987年预测值
    forecast_1987 = Model(data,N,1987,init)
    print('1987年发电总量的预测值为:%f'%forecast_1987)

if __name__ == '__main__':
    run_main()

这里写图片描述

1
0
查看评论

数学建模高级方法(十):时间序列模型

//2014年9月9日 //这篇论文把时间序列用在
  • u013599826
  • u013599826
  • 2014-09-09 18:14
  • 745

时间序列的归一化方法

在机器学习、模式识别的模型训练之前,通常需要对数据进行预处理工作,在哪种情况下选用哪种预处理方法,仍然是很多工作人员比较头疼的事情。本人前面的两篇博客总结了一些比较常用的数据归一化方法: 数据预处理之归一化 再谈机器学习中的归一化方法 这两篇博客介绍的都是针对非时间序列的数据进行的一些...
  • zbc1090549839
  • zbc1090549839
  • 2015-03-30 19:16
  • 5044

从时间序列到复杂网络:可见图算法

这篇文章实现的算法来源于PNAS杂志: 点击打开链接 # coding: utf-8 from itertools import combinations import networkx as nx def visibility_graph(series): g = nx.Graph() ...
  • huozi07
  • huozi07
  • 2015-06-01 20:43
  • 1214

时间序列(一)时间序列的生成

时间序列 时间戳(timestamp) 固定周期(period) 时间间隔(interval)date_range¶ 可以指定开始时间与周期 H:小时 D:天 M:月产生时间序列# TIMES #2016 Jul 1 7/1/2016 1/7/2016 2016-07-01 ...
  • kong1287988804
  • kong1287988804
  • 2017-12-11 15:29
  • 67

使用tensorflow的lstm网络进行时间序列预测

这篇文章将讲解如何使用lstm进行时间序列方面的预测,重点讲lstm的应用,原理部分可参考以下两篇文章: Understanding LSTM Networks       LSTM学习笔记 编程环境:python3.5,tensorflow 1.0 本文所用...
  • Flying_sfeng
  • Flying_sfeng
  • 2017-12-20 14:25
  • 2383

R语言时间序列分析之ARIMA模型预测

R语言时间序列分析之ARIMA模型预测   今天学习ARIMA预测时间序列。  指数平滑法对于预测来说是非常有帮助的,而且它对时间序列上面连续的值之间相关性没有要求。但是,如果你想使用指数平滑法计算出预测区间, 那么预测误差必须是不相关的, 而且必须是服...
  • NIeson2012
  • NIeson2012
  • 2015-11-10 22:48
  • 4250

时间序列预测全攻略(附带Python代码)

http://www.36dsj.com/archives/44065 介绍 时间序列(简称TS)被认为是分析领域比较少人知道的技能。(我也是几天前才知道它)。但是你一定知道最近的小型编程马拉松就是基于时间序列发展起来的,我参加了这项活动去学习了解决时间序列问题的基本步骤,在这儿我要...
  • Goldxwang
  • Goldxwang
  • 2017-06-16 21:29
  • 4197

时间序列数据挖掘

来自:http://blog.sciencenet.cn/blog-34250-287173.html
  • fennvde007
  • fennvde007
  • 2014-10-10 17:16
  • 4083

深度学习进行时间序列模式识别

思路:将时间序列转化为图像类似的格式,然后进行CNN识别。 http://danielnouri.org/notes/2014/01/10/using-deep-learning-to-listen-for-whales/ Using deep learning to listen fo...
  • wa2003
  • wa2003
  • 2016-03-13 19:56
  • 4524

时间序列实战(一)

导入数据,并转化为时间序列#coding:utf-8 import numpy as np import pandas as pd from datetime import datetime import matplotlib.pylab as plt plt.rcParams['font....
  • duxu24
  • duxu24
  • 2016-07-31 18:12
  • 4732
    个人资料
    • 访问:155592次
    • 积分:4930
    • 等级:
    • 排名:第6843名
    • 原创:329篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论