Python 数据帧中具有相关性的条件累积和
我试图计算一系列金融交易的两个累计金额。共有4种交易类型,每种类型都有交易金额: 存款 W-撤回 G增益 L-损失 数据帧是这样创建的Python 数据帧中具有相关性的条件累积和,python,pandas,dataframe,finance,Python,Pandas,Dataframe,Finance,我试图计算一系列金融交易的两个累计金额。共有4种交易类型,每种类型都有交易金额: 存款 W-撤回 G增益 L-损失 数据帧是这样创建的 import pandas as pd import numpy as np data = { 'Type': ['D', 'D', 'W', 'D', 'G', 'G', 'G', 'L', 'W', 'G', 'W', 'G', 'L' ], 'Amount': [10, 10, -5, 10, 5, 5, 5, -5, -10, 10,
import pandas as pd
import numpy as np
data = { 'Type': ['D', 'D', 'W', 'D', 'G', 'G', 'G', 'L', 'W', 'G', 'W', 'G', 'L' ],
'Amount': [10, 10, -5, 10, 5, 5, 5, -5, -10, 10, -25, 25, -30]
}
df = pd.DataFrame(data, columns = ['Type', 'Amount'])
使用cumsum()可以很容易地计算流动资金,它基本上包括所有交易
df['Capital'] = df['Amount'].cumsum()
我要计算的另一个实体是本金,它表示输入帐户的金额。这只考虑D和W类型的事务。我可以在这里使用以下方法进行简单筛选:
df['Principal'] = df.apply(lambda row : row['Amount'] if (row['Type'] == 'W' or row['Type'] == 'D') else 0, axis=1).cumsum()
然而,这有一个问题。当存在收益和提款时,提款需要在影响本金之前从收益中提款。上面的输出在下面的结果中有错误(第8行和第10行):
你可以做:
# calculate cumulative withdrawals
w = df['Amount'].where(df['Type'].eq('W')).cumsum()
# calculate cumulative deposits
d = df['Amount'].where(df['Type'].eq('D'), 0).cumsum()
# calculate cumulative gain & loss
g = df['Amount'].where(df['Type'].isin(['G', 'L']), 0).cumsum()
# calculate principal = deposit + net_withdrawal(if any)
df['Principal'] = d + (g + w).where(lambda x: x < 0).ffill().fillna(0)
你可以做:
# calculate cumulative withdrawals
w = df['Amount'].where(df['Type'].eq('W')).cumsum()
# calculate cumulative deposits
d = df['Amount'].where(df['Type'].eq('D'), 0).cumsum()
# calculate cumulative gain & loss
g = df['Amount'].where(df['Type'].isin(['G', 'L']), 0).cumsum()
# calculate principal = deposit + net_withdrawal(if any)
df['Principal'] = d + (g + w).where(lambda x: x < 0).ffill().fillna(0)
谢谢Shubham。看起来确实干净。你知道这方面的相对表现吗?似乎需要大量迭代来计算所有累积和?@phandinhlan我觉得这应该更快,因为
cumsum
操作本质上是在numpy中矢量化的。但是我想你可以在你的数据上测试一下,自己看看结果。我关心的是,与单个for循环相比,cumsum()
被调用了3次,而不是每个cumsum()
都不快。谢谢Shubham。看起来确实干净。你知道这方面的相对表现吗?似乎需要大量迭代来计算所有累积和?@phandinhlan我觉得这应该更快,因为cumsum
操作本质上是在numpy中矢量化的。但是我想你可以在你的数据上测试一下,自己看看结果。我关心的是,与单个for循环相比,cumsum()
被调用了3次,而不是每个cumsum()
都不快。
Type Amount Capital Principal
0 D 10 10 10
1 D 10 20 20
2 W -5 15 15
3 D 10 25 25
4 G 5 30 25
5 G 5 35 25
6 G 5 40 25
7 L -5 35 25
8 W -10 25 25
9 G 10 35 25
10 W -25 10 10
11 G 25 35 10
12 L -30 5 10
# calculate cumulative withdrawals
w = df['Amount'].where(df['Type'].eq('W')).cumsum()
# calculate cumulative deposits
d = df['Amount'].where(df['Type'].eq('D'), 0).cumsum()
# calculate cumulative gain & loss
g = df['Amount'].where(df['Type'].isin(['G', 'L']), 0).cumsum()
# calculate principal = deposit + net_withdrawal(if any)
df['Principal'] = d + (g + w).where(lambda x: x < 0).ffill().fillna(0)
Type Amount Capital Principal
0 D 10 10 10.0
1 D 10 20 20.0
2 W -5 15 15.0
3 D 10 25 25.0
4 G 5 30 25.0
5 G 5 35 25.0
6 G 5 40 25.0
7 L -5 35 25.0
8 W -10 25 25.0
9 G 10 35 25.0
10 W -25 10 10.0
11 G 25 35 10.0
12 L -30 5 10.0