Хорошо, ребята, это круто.
Предмет этого запроса основан на данных о мошенничестве, правилах и платежах - я думаю, что легче представить, что я пытаюсь сделать, с небольшим фоном.
У меня есть кадр данных, который состоит из счетов, сумм, дат, мошенничества и т. д. c. и один столбец называется правилом. Может быть много уникальных правил, которые срабатывают за учетную запись.
accountid amount date rule fraud
123 5 20191101 rule_1 fraud
123 10 20191102 rule_2 fraud
456 50 20191101 rule_1 nonfraud
456 50 20191101 rule_2 nonfraud
456 50 20191101 rule_3 nonfraud
456 50 20191101 rule_4 nonfraud
Моя цель состоит в том, чтобы создать функцию, которая перебирает каждую комбинацию из 2 правил (может быть, 3 позже), и иметь пару других столбцов, которые рассчитывают счета, подсчет количества случаев мошенничества и не мошенничества, мошенничество и т. д. c. результат выглядит так:
rule_combo count_acct count_fraud count_nonfraud fraudrate
rule_1,rule_2 5 3 2 .6
rule_2,rule_3 20 10 10 .5
rule_2,rule_4 50 10 40 .1
rule_1,rule_3 10 3 7 .3
У меня есть функция, которая выглядит следующим образом, которая будет делать то, что я хочу, но она использует столбцы (заголовки):
def combo_cols(df,agg,cols,n,minrate=0)
combos = list(itertools.combinations(cols,3))
num_cols = ['col1','col2','col3']
res = []
for combo in combos:
fr = fraudrate(df,agg,combo) #using another function
accounts = df.groupby(combo).apply(lambda df:list(df.accountid.unique()))
accounts.name = 'accounts'
accounts = accounts.to_frame()
fr = accounts.join(fr)
fr = fr.reset_index()
fr['naccts'] = fr.apply(lamda df: len(set(df.accounts)),axis=1)
fr.columns = num_cols + ['accounts','naccts','fraud','nonfraud','fraudrate','fpr']
fr = fr.assign(groupcols = ', '.join(combo))
fr = fr.loc[fr.fraudrate.gt(minrate)]
res.append(fr)
return pd.concat(res).sort_values(by='fraudrate',ascending=False)
Я не был в состоянии обернуть голову, как написать функцию, которая будет делать это для правил. Ценю любую помощь по этому вопросу.