赞
踩
接上一篇文章,我们学校的计量经济学是按Eviews讲的,近期和老师一起探索用Python来写代码,原本这个实验是用Eviews中阿尔蒙多项式做的,但我在网上搜集资料时并没有看到直接进行阿尔蒙变化的函数,所以自己写了两段代码来实现。
- import pandas as pd
- import numpy as np
-
- df=pd.DataFrame(pd.read_excel("D:\\jl\\8-2数据.xlsx"))
- print(df)
-
- y=df["purchase"]
- x=df["inventory"]
- x1=x.shift(1)#整体向下移动一次,滞后一期
- x2=x.shift(2)
- x3=x.shift(3)
- print(x1)
- W0=x+x1+x2+x3#W0=Σ(0,j=3)X(t-j)
- W1=0*x+1*x1+2*x2+3*x3#W1=Σ(0,j=3)j*X(t-j)
- W2=0*x+1*x1+4*x2+9*x3#W2=Σ(0,j=3)j^2*X(t-j)
- print(W0)#由于之前的滞后操作,W0,W1,W2的前三个数均为Nan
-
- import statsmodels.formula.api as smf
- data=pd.DataFrame({"Y":y[3:],"W0":W0[3:],"W1":W1[3:],"W2":W2[3:]})#构建数据框,并给每一列命名,将Nan的数据清除
- model1=smf.ols("Y~W0+W1+W2",data)
- fit1=model1.fit()
- print(fit1.summary())
以上是为了完成实验内容,下面是我写的关于阿尔蒙变换的部分。
方法一:
- t=3#设置滞后期数
- X=[]
- for i in range(t,len(x)):#滞后t期,会导致数据前有t个数据缺失,python下标从0开始,所以从t开始循环,range函数不包括右侧,len(x)刚好
- m=[]
- a=0
- b=0#上一个时间戳的数据清除
- c=0
- d=0#j=3时
- for j in range(0,(t+1)):
- a=a+x[i-j]#计算W0,公式同上
- for j in range(0,(t+1)):
- b=b+j*x[i-j]#计算W1,公式同上
- for j in range(0,(t+1)):
- c=c+(j**2)*x[i-j]#计算W2,公式同上
- for j in range(0,(t+1)):
- d=d+(j**3)*x[i-j]#j=3时,计算W3
- m.append(a)
- m.append(b)#将时间戳为t时对应的W0,W1,W2放到同一个向量中
- m.append(c)
- m.append(d)#j=3时
- X.append(m)#将时间戳为t时的数据保存,进入下一个循环计算时间戳t+1对应的数据
-
- import statsmodels.api as sm
- X=sm.add_constant(X)#加常数项
- print(X)
- model=sm.OLS(y[t:],X)#由于滞后,t之前的时间戳会出现Nan,从t开始,保持y与X的一致,X在循环时已经处理,此时不需要再次处理
- fit2=model.fit()#把模型的结果赋值给fit2
- print(fit2.summary())
方法二:
- t=3#设置滞后期数
- W0=[]
- W1=[]
- W2=[]
- #W3=[]
- for i in range(t,len(x)):#滞后t期,会导致数据前有t个数据缺失,python下标从0开始,所以从t开始循环,range函数不包括右侧,len(x)刚好
- a=0
- b=0#上一个时间戳的数据清除
- c=0
- #d=0#j=3时
- for j in range(0,(t+1)):
- a=a+x[i-j]#计算W0,公式同上
- for j in range(0,(t+1)):
- b=b+j*x[i-j]#计算W1,公式同上
- for j in range(0,(t+1)):
- c=c+(j**2)*x[i-j]#计算W2,公式同上
- #for j in range(0,(t+1)):
- #d=d+(j**3)*x[i-j]#j=3时,计算W3
- W0.append(a)
- W1.append(b)#将时间戳为t时对应的W0,W1,W2放到同一个向量中
- W2.append(c)
- #W3.append(d)#j=3时
-
- import statsmodels.formula.api as smf
- data=pd.DataFrame({"Y":y[3:],"W0":W0,"W1":W1,"W2":W2})#构建数据框,并给每一列命名,使y的数据个数与W0,W1,W2保持一致
- model1=smf.ols("Y~W0+W1+W2",data)
- # data=pd.DataFrame({"Y":y[3:],"W0":W0,"W1":W1,"W2":W2,"W3":W3})#构建数据框,并给每一列命名,使y的数据个数与W0,W1,W2保持一致
- # model1=smf.ols("Y~W0+W1+W2+W3",data)
- fit1=model1.fit()
- print(fit1.summary())
方法一和方法二的逻辑上是差不多的,但现在这两段代码只是实现了基本功能,但并不智能,为了改变j(W0,W1~Wj)还需要手动调整。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。