接上一篇文章,我们学校的计量经济学是按Eviews讲的,近期和老师一起探索用Python来写代码,原本这个实验是用Eviews中阿尔蒙多项式做的,但我在网上搜集资料时并没有看到直接进行阿尔蒙变化的函数,所以自己写了两段代码来实现。
import pandas as pdimport numpy as npdf=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的前三个数均为Nanimport statsmodels.formula.api as smfdata=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 smX=sm.add_constant(X)#加常数项print(X)model=sm.OLS(y[t:],X)#由于滞后,t之前的时间戳会出现Nan,从t开始,保持y与X的一致,X在循环时已经处理,此时不需要再次处理fit2=model.fit()#把模型的结果赋值给fit2print(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 smfdata=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)还需要手动调整。