首页 > 解决方案 > 找到最小营业额账户

问题描述

我的客户在 Excel 中有许多不同的经纪账户。对于每个帐户,它都有一个帐户名称、帐户类型、股票名称和每个股票的分配。每个帐户中的股票数量各不相同。该文件如下所示:

Account Name  Account Type   Stock Name  Stock Allocation     
MN001         #1             ABC         40%    
MN001         #1             ABD         60%

MN002         #2             ABC         50%    
MN002         #2             ABD         40%    
MN002         #2             EFG         10%    

MN003         #3             ABC         20%    
MN003         #3             ABD         40%    
MN003         #3             EFG         40%    

MN004         #4             ABC         30%    
MN004         #4             ABD         70%    

我们希望从账户类型 #1 (MN001) 移动到其他账户类型(MN002、MN003 或 MN004)。标准是找到最小营业额的账户。例如,MN001 和 MN002 之间的营业额是 ABC(0.1) + ABD(0.2) + EFG(0.1) = 0.4。MN001 和 MN003 之间的营业额是 ABC (0.2) + ABD(0.2) + EFG(0.4) = 0.8。MN001 和 MN004 之间的营业额是 ABC (0.1) + ABD(0.1)= 0.2。MN004 的营业额最低。

因此,所需的输出:

From Account/Account Type    To Account/Account Type    Minimum TurnOver
MN001        #1              MN004      #4              0.2 

MN002        #2              MN001      #1              0.4

在 Excel 中似乎很难做到这一点。可以用 Python 完成吗?非常感谢您的帮助!

标签: python

解决方案


是的,它可以在 Python 中完成,它可能看起来像这样。

accounts = [{'ABC':0.4, 'ABD':0.6}, {'ABC':0.5, 'ABD':0.4, 'EFG':0.1}]

这是您的帐户,MN001 是accounts[0],MN002 是accounts[1]等等..

def compute_turnover(first_account, second_account):
    turnover = 0

    for stock_name, stock_allocation in first_account.items():
        other_allocation = second_account.get(stock_name) 
        if other_allocation is not None:
            turnover += abs(stock_allocation - second_account[stock_name])
        else:
            turnover += stock_allocation

    for stock_name, stock_allocation in second_account.items():
        other_allocation = first_account.get(stock_name) 
        if other_allocation is None:
            turnover += stock_allocation

    return turnover

如上定义一个 compute_turnover 函数,你用 MN001 和 MN002 调用它,你会得到预期的结果

>>> compute_turnover(accounts[0], accounts[1])
0.4

现在让我们假设您有一个list1需要转移的帐户和一个list2目标帐户。你可以只需要转换python字典中的两个列表,然后迭代如下

list1 = [{'ABC':0.4, 'ABD':0.6}, {'ABC':0.5, 'ABD':0.4, 'EFG':0.1}]
list2 = [{'ABC':0.4, 'ABD':0.6}, {'ABC':0.5, 'ABD':0.4, 'EFG':0.1}]

turnover_accounts = []
for account in list1:
    min_turnover = 1e9
    turnover_account = None

    for target_account in list2:
        if compute_turnover(account, target_account) < min_turnover:
            min_turnover = compute_turnover(account, target_account)
            turnover_account = target_account

    turnover_accounts.append(turnover_account)

您的turnover_accounts列表将包含最低营业额的目标账户索引。


推荐阅读