从方程式自动填充df?

时间:2018-09-12 16:54:59

标签: python pandas

我有一些有效的代码,但我希望将其压缩:

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)

当我最初的问题沿着串联的路径前进时,这是否是错误的树状结构?我希望使它尽可能简洁(理想情况下是一行)。

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]