首页 > 解决方案 > 如何在python中动态创建列本身的总和

问题描述

我的原始数据是:

def f_ST(ST,F,T):
    a=ST/F-1-np.log(ST/F)
    return 2*a/T

df=pd.DataFrame(range(50,140,5),columns=['K'])
df['f(K0)']=df.apply(lambda x: f_ST(x.K,100,0.25),axis=1)
df['f(K1)']=df['f(K0)'].shift(-1)
df['dK']=df['K'].diff(1)

我想做的是:我有一个函数 f(k)

f(k)= (k-100)/100 - ln(k/100)

我想计算 w,它遵循以下步骤

  1. 得到 f(k) 的 1 周期前向值,然后计算
tmp(k)=f1_f(k)-f(k)/dk
  1. w 计算为
w[0]=tmpw[0]

w[n]-tmpw[n]-(w[0]+w[1]+...w[n-1])

结果看起来像

nbr date        k   f(k)        f1_f(k)     d_k   tmpw       w
10  2019-02-19  100 0.000000    0.009679    5.0   0.001936   0.001936
11  2019-02-19  105 0.009679    0.037519    5.0   0.005568   0.003632
12  2019-02-19  110 0.037519    0.081904    5.0   0.008877   0.003309
13  2019-02-19  115 0.081904    0.141428    5.0   ...    
14  2019-02-19  120 0.141428    0.214852    5.0   ...
15  2019-02-19  125 0.214852    0.301086    5.0 
16  2019-02-19  130 0.301086    0.399163    5.0 

问题:任何人都可以在不使用循环的情况下帮助推导出一个快速代码(不是数学上的)吗?

非常感谢!

标签: pythondataframedynamicsumaverage

解决方案


我不完全理解你的问题,对我来说所有这些符号都有点混乱。

如果我得到了您想要的正确结果,那么对于每一行,您都希望获得所有先前行的累积值。此行的另一列的值将基于此累积值计算。

在这种情况下,我更喜欢一些东西,先计算一个累积的列,然后再使用它。

例如:请注意,您需要调用 list(range()) 而不是 list,因此您的示例会引发错误

import pandas as pd
import numpy as np
def f_ST(ST,F,T):
    a=ST/F-1-np.log(ST/F)
    return 2*a/T

df=pd.DataFrame(list(range(50,140,5)),columns=['K'])
df['f(K0)']=df.apply(lambda x: f_ST(x.K,100,0.25),axis=1)
df['f(K1)']=df['f(K0)'].shift(-1)
df['dK']=df['K'].diff(1)
df['accumulate'] = df['K'].shift(1).cumsum() 
df['currentVal-accumulated'] = df['K'] - df['accumulate'] 
print(df)

印刷:

      K     f(K0)           ...            accumulate  currentVal-accumulated
0    50  1.545177           ...                   NaN                     NaN
1    55  1.182696           ...                  50.0                     5.0
2    60  0.886605           ...                 105.0                   -45.0
3    65  0.646263           ...                 165.0                  -100.0
4    70  0.453400           ...                 230.0                  -160.0
5    75  0.301457           ...                 300.0                  -225.0
6    80  0.185148           ...                 375.0                  -295.0
7    85  0.100151           ...                 455.0                  -370.0
8    90  0.042884           ...                 540.0                  -450.0
9    95  0.010346           ...                 630.0                  -535.0
10  100  0.000000           ...                 725.0                  -625.0
11  105  0.009679           ...                 825.0                  -720.0
12  110  0.037519           ...                 930.0                  -820.0
13  115  0.081904           ...                1040.0                  -925.0
14  120  0.141428           ...                1155.0                 -1035.0
15  125  0.214852           ...                1275.0                 -1150.0
16  130  0.301086           ...                1400.0                 -1270.0
17  135  0.399163           ...                1530.0                 -1395.0

[18 rows x 6 columns]


推荐阅读