用Python复现R 时序预测相关函数

项目数据

PN_IB是2011-03-1到2019-10-01的数据,以月为分隔符
PN_usage是2011-06-25到2017-08-05的数据,以周为分割
long_term_pred_results 2014-10-04到2018-03-31,以周为间隔,预测的是IB量

项目结构

翻译原则:项目文件结构一致
文件名 文件功能
Demo_code.py 相当于main函数,做预处理,调用long_term_pred.py
Long_term_pred.py 长期预测函数,调用Anomaly_Detecion.py,outlier_replace.py
Anomaly_Detection.py 异常点检测函数,调用detect_anoms函数
Detect_anoms.py 具体的异常点检测算法,就是ESD算法
Outlier_replace.py 异常点替换函数,用卡尔曼滤波方法

基础语法

读取文件

usage = read.csv('data/TopmostPN_filter_weekly_consumption(change)/R31 1019 usage.csv',header = TRUE)
ib = read.csv('data/TopmostPN_ib_filter(change)/total topmost ib with new startpoint2.0.csv',header = FALSE)
usage = pd.read_csv('R31 1019 usage.csv')
ib = pd.read_csv('total topmost ib with new startpoint2.0.csv',header=None)

dataframe切片

数据格式

usage
TopmostPN date usage
1 04W0433 01/01/2011 6
2 04W4459 01/01/2011 1
3 13N7096 01/01/2011 3
4 41W1479 01/01/2011 1
5 42T0152 01/01/2011 3
6 42T0476 01/01/2011 1
7 42W3769 01/01/2011 1
8 42X4880 01/01/2011 1
9 42X5067 01/01/2011 1
10 43N8359 01/01/2011 1

R里面的计数是从1开始的,没有0。所以2:3代表第2列(包括)和第3列(包括)

pn='ABCDEF'
PN_usage = usage[usage[[1]] == pn,2:3]

Python里面的计数是从0开始的,包含0。所以1:3代表第2列(包括)和第3列(包括)

pn='ABCDEF'
PN_usage = usage[usage['TopmostPN']==pn].iloc[:,1:3]#截取PN符合pn的date和usage

日期类型处理

规范为日期格式

#mdy之前要library("lubridate")
PN_usage$date = mdy(PN_usage$date)#本来是月日年的形式,处理以后就变成了年月日
PN_usage = PN_usage[order(PN_usage$date),]#把PN_usage整个dateframe按日期升序排列
rownames(PN_usage) = 1:length(rownames(PN_usage))#相当于Python的df.reset_index()
PN_usage['date']=pd.to_datetime(PN_usage['date'],format='%m/%d/%Y')#把object类型转换为datetime64[ns]类型
PN_usage=PN_usage.sort_values(by='date')
PN_usage=PN_usage.reset_index()

空白日期对应数据填充为0

R:

#以下这段数据预处理代表,如果不是所有相邻日期都相差7天,代表日期有丢失,就在最小日期和最大日期区间内用range分隔,
if(!(all(diff(PN_usage[[1]])==7))){ #判断条件的意思是:如果不是所有相邻日期都相差7天
  #语法 :(默认)diff(x, lag = 1, differences = 1, …)
  #若x是一个数值向量,则表示后一项减前一项,即滞后一阶差分;
  time.min <- PN_usage[[1]][1]
  time.max <- PN_usage[[1]][length(PN_usage[[1]])]
  all.dates <- seq(time.min, time.max, by="week")#以时间最小为起点,时间最大为重点,周为间隔,生成时间序列
  all.dates.frame <- data.frame(list(date=all.dates))
  PN_usage <- merge(all.dates.frame, PN_usage, all=T)
  PN_usage[[2]][which(is.na(PN_usage[[2]]))] <- 0
}
#PN_usage相当于一个时间段内以周为间隔,每周的消耗量数据

python:

if not all(PN_usage['interval']>7):
    start = PN_usage['date'].min()
    end = PN_usage['date'].max()
    print("enter if")
    sevendayscnt=int(((end-start).days)/7+1)
    fulldate=[]
    for i in range(0,sevendayscnt):
        fulldate.append(start + datetime.timedelta(days=7* i) )

    fulldatedf=pd.DataFrame(fulldate)
    fulldatedf.columns=['date']
    result = pd.merge(fulldatedf, PN_usage, on='date',how='outer')#默认是inner join
    PN_usage=result[['date','usage']].fillna(0)

对dataframe求行数

tt <- nrow(PN_usage)
tt=len(PN_usage)

猜你喜欢

转载自blog.csdn.net/u011462357/article/details/80167986