python - 对 groupby 对象执行更复杂的计算
问题描述
我目前正在寻找对大型期权数据集进行一些计算,我想首先根据执行价格和到期日拆分数据,然后对每个子组执行如下所示的一组计算。我已经能够分离数据groupby
来获得我想要的拆分,我还编写了我想要做的计算,当在子组上测试时它会起作用。我唯一的问题是将两者结合在一起。
这是我用来分组数据的代码:
grouped =df.groupby(['Expiry','Strike'])
我在线阅读,他们提到了该apply
函数的使用,但示例仅包括简单的函数,例如求和或平均值。
这是我想对每个子组数据执行的计算,其中x,y,z,u,R
每个子集中的列对于所有子组都相同:
def p(d, S, B, c):
return d * S + B - c
def b_t(r, b_old, S, d, d_old, t):
return np.exp(r * t) * b_old + S * (d_old - d)
def e_t(d_old, S, c, r, t, b_old):
return d_old * S - c + np.exp(r * t) * b_old
P_results = []
B_results = []
E_results = []
for i,(d,S,c,t,r) in enumerate(zip(x,y,z,u,R)):
B = b_t(r, b_old, S, d, d_old, t)
P = p(d, S, B, c)
E = e_t(d_old, S, c, r, t, b_old)
print('i={},P={},B={},E={}'.format(i,P,B,E))
B_results.append(B)
P_results.append(P)
E_results.append(E)
b_old = B
d_old = d
我想也许如果我可以将每个子集保存为一个新的变量数据框,那么它也许可以工作,但我无法做到这一点。
我希望这很清楚,我认为发布一些数据会有所帮助,但我不确定如何最好地在此处上传。
非常感谢您的帮助!
更新 1:找到了一个可行的解决方案
grouped =df.groupby(['Expiry','Strike'])
lg = list(grouped)
P_results = []
l_results =[]
B_results = []
E_results = []
for l in range(len(lg)):
df2=lg[l][1]
d_old = df2.iloc[0, 4]
S_old = df2.iloc[0, 8]
c_old = df2.iloc[0, 10]
b_old = c_old - d_old * S_old
x = df2.iloc[1:, 4]
y = df2.iloc[1:, 8]
z = df2.iloc[1:, 10]
u = df2.iloc[1:, 9]
R = df2.iloc[1:, 7]
for i, (d, S, c, t, r) in enumerate(zip(x, y, z, u, R)):
B = b_t(r, b_old, S, d, d_old, t)
P = p(d, S, B, c)
E = e_t(d_old, S, c, r, t, b_old)
print('i={},P={},B={},E={}'.format(i, P, B, E))
l_results.append(l)
B_results.append(B)
P_results.append(P)
E_results.append(E)
b_old = B
d_old = d
BB = pd.DataFrame(np.column_stack([l_results, P_results,
E_results,B_results]),columns=['l','P','E','B'])
我所做的只是转换grouped
成一个可调用列表,然后使用 for 循环调用每个部分,然后使用另一个 for 循环来执行计算。这不是最漂亮的输出,我放在l_results
那里是为了显示计算所指的组,但现在似乎已经足够了。如果有更好的方法请告诉我!
解决方案
推荐阅读
- javascript - 在 Angular JS 中过滤我的 JavaScript 中的未定义
- android - 如何在 Delphi Android 应用程序中调用本机相机?
- c# - 注册表设置值代理仅工作 1 次
- swift - Swift:如何访问字典数组中的字典数组?
- javascript - window.location 未替换但已连接
- c++ - Dlib 未在 kurento opencv 过滤器中检测到人脸
- amazon-web-services - 如何按日期删除所有 cloudwatch 日志组和流式传输?
- docker - dockerfiles 的 Gitlab lint 接口
- android - 将 Gradle 与 Kotlin 同步的问题
- javascript - 尝试在保持图片纵横比的同时旋转图像