Python 与外汇交易匹配的组合

Python 与外汇交易匹配的组合,python,pandas,algorithm,combinations,Python,Pandas,Algorithm,Combinations,嗨,我正在尝试解决一个匹配外汇交易的问题。如上所述,第一行购买50000瑞士法郎,可通过合并第二和第三笔交易或第二和第六笔交易进行对账。贸易4可以与贸易5相协调。希望你们能明白 到目前为止,我得出的结论是: 尝试在“买入”列中选择唯一的货币,并检查它们是否存在于“卖出”列中[我在df['Buy Currency']中代表我。如果我在df['Sell Currency']中代表我,则为唯一的()。唯一的()] 检查Buy是否只有一种货币类型。如果为true,则继续下一个循环断言len(set(d

嗨,我正在尝试解决一个匹配外汇交易的问题。如上所述,第一行购买50000瑞士法郎,可通过合并第二和第三笔交易或第二和第六笔交易进行对账。贸易4可以与贸易5相协调。希望你们能明白

到目前为止,我得出的结论是:

  • 尝试在“买入”列中选择唯一的货币,并检查它们是否存在于“卖出”列中<代码>[我在df['Buy Currency']中代表我。如果我在df['Sell Currency']中代表我,则为唯一的()。唯一的()]
  • 检查Buy是否只有一种货币类型。如果为true,则继续下一个循环<代码>断言len(set(df[‘购买货币’])!=1
  • 检查买入金额和卖出金额是否完全匹配。在这种情况下,400出现在两列中,因此很容易找到。
    [以df为单位的金额['Buy Amount'].astype(int).tolist()(如果以df为单位的金额['Sell Amount'])。astype(int).tolist()][/code>
我陷入困境的部分是将1次买入交易与1次以上卖出交易相匹配。此外,可以有一种以上的方法,如第一个交易中所示。还尝试使用
itertools.compositions
,如中所示 ,但我无法验证这些组合是否是相同的外汇对


非常感谢您的帮助

解决方案是用所有有效的外汇对组合填充一些列表。然后,您可以使用现有的方法来查找具有给定和的数字列表的所有组合

例如,如果选择交易#1:

  • 抓住卖出的货币,美元
  • 填写购买货币为美元的所有交易的列表
  • 找到该列表的组合,其总和为我们的原始销售货币

  • 您可以在Buy ccy和Sell ccy上分组并合并数据帧

    如果您想要精确匹配(即,而不是更大),可以使用以下代码段:

       Buy Currency Sell Currency Buy Amount Sell Amount
    1. CHF          USD           50000      61000
    2. USD          CHF           20999      20000     
    3. USD          CHF           34000      30000
    4. CHF          AUD           400        356
    5. AUD          CHF           378        400
    6. USD          CHF           34000      30000
    
    输出将是:

    from itertools import chain, combinations
    
    
    def match(row):
        res1 = []
        res2 = []
        def all_subsets(ss):
            return chain(*map(lambda x: combinations(ss, x), range(0, len(ss) + 1)))
        for subset in all_subsets(row[0]):
            res1.append(sum(subset))
        for subset in all_subsets(row[1]):
            res2.append(sum(subset))
        common = set(res1) & set(res2)
        return common
        
    
    df_buy = df.groupby('Buy Currency')['Buy Amount'].unique().reset_index()
    df_sell = df.groupby('Sell Currency')['Sell Amount'].unique().reset_index()
    results = df_buy.merge(df_sell, left_on='Buy Currency', right_on='Sell Currency', how='outer')
    results['match'] = results[[u'Buy Amount', u'Sell Amount']].apply(match, axis=1)
    
    “匹配”列将提供可能的精确匹配,0表示没有精确匹配

    Buy Currency      Buy Amount Sell Currency          Sell Amount  \
    0          AUD           [378]           AUD                [356]   
    1          CHF    [50000, 400]           CHF  [20000, 30000, 400]   
    2          USD  [20999, 34000]           USD              [61000]   
                        match  
    0                     {0}  
    1  {0, 50000, 400, 50400}  
    2                     {0}