Source code for pymarket.transactions.processing

"""
Some processing functions to deal with transactions
"""

import pandas as pd

from pymarket.transactions.transactions import TransactionManager


[docs]def split_transactions_merged_players(transactions, bids, maping, fees=None): """ Splits the transactions of a market that used merged bids into the original bids Uses a proportional split, based on the offered (or asked) quantity by each player. Parameters ---------- transactions: TransactionManager the transactions manager returned by the mechanism. bids: pandas dataframe the original bid dataframe where some players might be repeated maping: pandas dataframe A maping between the bids in the transaction dataframe and the original bids. Returns -------- transactions_splited: pandas dataframe the result of splitting each merged bid in the transactions dataframe fees: dict or None dictionary obtained by splitting the fees equal to the transactions Examples ----------- >>> bm = pm.BidManager() >>> tm = pm.TransactionManager() >>> bm.add_bid(1, 1, 0) 0 >>> bm.add_bid(2, 1, 1) 1 >>> tm.add_transaction(0, 1, 1, -1, False) 0 >>> tm_2 = split_transactions_merged_players(tm, bm.get_df(), {0:[0,1]}) >>> tm_2.get_df() bid quantity price source active 0 0 0.333333 1 -1 False 1 1 0.666667 1 -1 False """ trans = TransactionManager() new_rows = [] for i, t in transactions.get_df().iterrows(): rows = maping[t.bid] if True: # TODO make more options available perc = bids.iloc[rows, :] / bids.iloc[rows, :].quantity.sum() perc = perc.quantity if len(rows) > 1 and fees is not None: fee = fees.pop(t.user, None) for r in rows: #t_ = pd.DataFrame(t).copy().T # print(r) t_ = t.copy().values # print(t_) t_[0] = r t_[1] *= perc[r] if len(rows) > 1 and fees is not None and fee is not None: fees[bids.iloc[r, :].user] = fee * perc[r] #t_.iloc[0, 0] = r #t_.iloc[0, 1] *= perc[r] # new_rows.append(t_) trans.add_transaction(*t_) #transactions_splited = pd.concat(new_rows) if fees is not None: return trans, fees else: return trans