需要帮助来统计数字,与不同的合约进行匹配并解决小数问题

问题描述 投票:0回答:1

`我将附上我的代码片段以供参考

首先,我是编码方面的新手,我正在尝试使用 python 来帮助我将销售和采购合同与实际的货物收集和交付相匹配。 S&P 合同的规模与货物的实际 C&D 不同,因此手动匹配可能会很繁琐,因为需要匹配产品类型、买方和供应商信息、价格、合同月份等因素。所以我现在面临两个问题。

  1. 首先,已经撮合的合约(例如:初始大小10吨,我之前已经撮合过,净仓位为0)仍然被撮合多次。 enter image description here 从图中你可以看到合同号 30831 已被匹配,总大小为 6.17,所以按理说它不应该再次匹配。

  2. 数字到小数点都是正确的,但小数点后的数字经常不正确

感谢并感谢您的帮助

下面是代码。让我知道我应该修改哪一部分。

https://drive.google.com/file/d/1CjJdIhertbNeDF4qBEzD6_9nrHnJvKzF/view?usp=sharing

pandas dataframe
1个回答
0
投票

这可能是一个解决方案的指针,基于具有许多重复金额的虚构数据。

# Note that these two modules are imported
import pandas as pd
import numpy as np

假设您有一个包含到期日期和到期金额的账户数据框(df)

    Date due  Acct  Due
 0 2024-01-01  1001  100
 1 2024-02-01  1001  100
 2 2024-03-01  1001  100
 3 2024-04-01  1001  100
 4 2024-05-01  1001  100
 5 2024-01-01  1002   90
 6 2024-02-01  1002   90
 7 2024-03-01  1002   90
 8 2024-04-01  1002   90
 9 2024-05-01  1002   90

以及订单已结算的数据框(df1)

    Date       Acct    Settled
 0 2024-01-15  1001      100
 1 2024-02-15  1001      100
 2 2024-03-15  1001      100
 3 2024-04-15  1001      100
 4 2024-01-03  1002      120
 5 2024-02-03  1002      120
 6 2024-03-03  1002      120
 7 2024-04-03  1002      120

选项 1(在账户级别获取余额):

df_sum = df.groupby(["Acct"]).sum().reset_index()
df1_sum = df1.groupby(["Acct"]).sum().reset_index()
df_sum = df_sum.merge(df1_sum, how = 'left')
df_sum["Bal"] = df_sum["Due"] - df_sum["Settled"]
df_sum

    Acct    Due Settled Bal
0   1001    500 400     100
1   1002    450 480     -30

选项2:在交易层面获取余额

df['CS'] = df.groupby(['Acct'])['Due'].cumsum()
df = df.merge(df1_sum, how = 'left')
df["LineSettled"] = np.where(df["CS"] <= df["Settled"], "Y", "N")
df

    Date due    Acct    Due CS  Settled LineSettled
0   2024-01-01  1001    100 100 400      Y
1   2024-02-01  1001    100 200 400      Y
2   2024-03-01  1001    100 300 400      Y
3   2024-04-01  1001    100 400 400      Y
4   2024-05-01  1001    100 500 400      N
5   2024-01-01  1002    90  90  480      Y
6   2024-02-01  1002    90  180 480      Y
7   2024-03-01  1002    90  270 480      Y
8   2024-04-01  1002    90  360 480      Y
9   2024-05-01  1002    90  450 480      Y
© www.soinside.com 2019 - 2024. All rights reserved.