接上一篇文章,我们学校的计量经济学是按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)还需要手动调整。