我有一些有效的代码,但我希望将其压缩:
temps = pd.DataFrame()
temps['T'] = beststns['ave']
temps['T2'] = np.square(temps['T'])
temps['T3'] = temps['T2']*temps['T']
temps['T(t-1)'] = temps['T'].shift(1)
temps['T2(t-1)'] = np.square(temps['T(t-1)'])
temps['T3(t-1)'] = temps['T2(t-1)']*temps['T(t-1)']
temps['T(t-2)'] = temps['T(t-1)'].shift(1)
temps['T2(t-2)'] = np.square(temps['T(t-2)'])
temps['T3(t-2)'] = temps['T2(t-2)']*temps['T(t-2)']
我想用上面的每个变量(T,T ^ 2和T ^ 3,然后使用相同的观察值(t-1),(t-2),...来填充我的数据框。 (.tn))。我已经手动获得它,但是理想情况下,我想压缩代码,以便我可以键入应该为“ n”的值(以表示模型中包含的温度滞后的数量)。
有什么想法可以浓缩吗?
*编辑: 我想在数据框中看到的是这样的:
T T2 T3 T(t-1) T2(t-1) T3(t-1)
0 45.125 2036.265625 91886.486328 0.000 0.000000 0.000000
1 45.250 2047.562500 92652.203125 45.125 2036.265625 91886.486328
2 44.625 1991.390625 88865.806641 45.250 2047.562500 92652.203125
我从一个看起来像这样的df开始:
T
0 45.125
1 45.250
2 44.625
使用以下代码:
l = 1
pd.concat([temps,temps['T'].shift(l).add_suffix('(t-'+str(l)+')')])
我得到以下输出:
T T2 T3 0
0 43.0 1849.0 79507.0 NaN
1 41.0 1681.0 68921.0 NaN
2 40.0 1600.0 64000.0 NaN
... ... ... ... ...
35034(t-1) NaN NaN NaN 54.0
35035(t-1) NaN NaN NaN 55.0
35036(t-1) NaN NaN NaN 54.0
再说一次,我的解释不正确(我以为是这样的形式
pd.concat([df1, df4], axis=1)
?)
并且我没有将后缀正确添加到列名中。理想情况下,我想到达这样的地方:
pd.concat([temps,(temps['T'].shift(l).add_suffix('(t-'+str(l)+')') for l in lag),1])
更新:
感谢劳纳克,这项工作有效:
T = 'T(t-'
T2 = 'T2(t-'
T3 = 'T3(t-'
for i in lag:
t = T + str(i) + ')'
t2 = T2 + str(i) + ')'
t3 = T3 + str(i) + ')'
temps[t] = temps.iloc[:,-3].shift(1)
temps[t2] = temps.iloc[:,-3].shift(1)
temps[t3] = temps.iloc[:,-3].shift(1)
当我最初的问题沿着串联的路径前进时,这是否是错误的树状结构?我希望使它尽可能简洁(理想情况下是一行)。
答案 0 :(得分:0)
temps['T'] = beststns['ave']
temps['T2'] = np.square(temps['T'])
temps['T3'] = temps['T2']*temps['T']
a = 'T(t-'
b = 'T2(t-'
c = 'T3(t-'
for i in range(1, n+1):
val = str(i) + ')'
a = a + val
b = b + val
c = c + val
temps[a] = temps.iloc[:,-3].shift(i)
temps[b] = np.square(temps.iloc[:,-1])
temps[c] = temps.iloc[:,-2] * temps.iloc[:,-2]