Отсутствуют данные из вычислений фрейма данных - PullRequest
1 голос
/ 10 июля 2020

В основном у меня есть клиенты с платежными привычками, и я делаю статистику c вероятности оплаты по их характеристикам express в кадре данных df2. Затем я получаю новый список клиентов и пытаюсь оценить их общую сумму платежей.

import pandas as pd
import numpy as np

d = {'City': ['Tokyo','Tokyo','Lisbon','Tokyo','Tokyo','Lisbon','Lisbon','Lisbon','Tokyo','Lisbon','Tokyo','Tokyo','Tokyo','Lisbon','Tokyo','Tokyo','Lisbon','Lisbon','Lisbon','Tokyo','Lisbon','Tokyo'], 
     'Card': ['Visa','Visa','Master Card','Master Card','Visa','Master Card','Visa','Visa','Master Card','Visa','Master Card','Visa','Visa','Master Card','Master Card','Visa','Master Card','Visa','Visa','Master Card','Visa','Master Card'],
     'Colateral':['Yes','Yes','Yes','No','Yes','No','No','Yes','Yes','Yes','Yes','Yes','Yes','Yes','No','Yes','No','Yes','Yes','No','No','No'],
     'Client Number':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],
     'DebtPaid':[0.8,0.1,0.5,0.30,0,0.2,0.4,1,0.60,1,0.5,0.2,0,0.3,0,0,0.2,0,0.1,0.70,0.5,0.1]}

df = pd.DataFrame(data=d)

d = {'City': ['Tokyo','Tokyo','Lisbon','Tokyo','Tokyo','Lisbon','Lisbon','Lisbon','Tokyo','Lisbon','Tokyo','Tokyo','Tokyo','Lisbon','Tokyo','Tokyo','Lisbon','Lisbon','Lisbon','Tokyo','Lisbon','Tokyo','Tokyo'], 
     'Card': ['Visa','Visa','Master Card','Master Card','Visa','Master Card','Visa','Visa','Master Card','Visa','Master Card','Visa','Visa','Master Card','Master Card','Visa','Master Card','Visa','Visa','Master Card','Visa','Master Card','Bitcoin'],
     'Colateral':['Yes','No','Yes','No','No','No','No','Yes','Yes','No','Yes','Yes','No','Yes','No','No','No','Yes','Yes','No','No','No','Yes'],
     'Client Number':[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],
     'Total Debt':[100,240,200,1000,500,20,345,100,600,40,50,20,1000,300,1000,600,200,200,150,700,50,120,145]}

df3 = pd.DataFrame(data=d)


df2=df.groupby(['City','Card','Colateral'])['DebtPaid'].\
           value_counts(bins=[-0.001,0,0.25,0.5,0.75,1,1.001,2],normalize=True)

Это результат df2

enter image description here

df_out = df2.rename('Prob').reset_index().merge(df3, on=['City', 'Card', 'Colateral'])
df_out['lower'] = [x.left for x in df_out['DebtPaid']]
df_out['upper'] = [x.right for x in df_out['DebtPaid']]

df_out['l_partial'] = df_out[['lower', 'Prob', 'Total Debt']].prod(axis=1)
df_out['u_partial'] = df_out[['upper', 'Prob', 'Total Debt']].prod(axis=1)

final = df_out.groupby('Client Number')[['l_partial', 'u_partial']]\
      .agg(lower_price=('l_partial', 'sum'),
           upper_price=('u_partial', 'sum')).clip(0,np.inf)

введите описание изображения здесь

Как видите, отсутствуют клиенты (24,27,35,38,45). Причина в том, что нет данных по клиентам с характеристиками Tokyo-Visa-Yes. Когда это происходит, я перехожу с sh до go вверх «в последний» и применяю статистику Tokyo-Visa или только Токио, если у клиента есть другой метод карты.

Любые мысли о том, как это сделать решить это?

1 Ответ

0 голосов
/ 10 июля 2020

Формат списка при группировке. Обновите его со всеми объединенными мультииндексами, заменив пустые места на fill_value'. Places without a value are replaced with fill_value '. Результирующий фрейм данных возвращается в длинный формат с explode(). В этом состоянии вы должны иметь возможность агрегировать данные по своему усмотрению.

df1 = df.groupby(['City','Card','Colateral'])['DebtPaid'].agg(list).reset_index()
df1.set_index(['City','Card','Colateral'],inplace=True)
cols = [df['City'].unique(),df['Card'].unique(),df['Colateral'].unique()]
p = pd.MultiIndex.from_product(cols, names=['City','Card','Colateral'])
df1.reindex(p, fill_value=0)
            DebtPaid
City    Card    Colateral   
Tokyo   Visa    Yes [0.8, 0.1, 0.0, 0.2, 0.0, 0.0]
                No  0
Master Card     Yes [0.6, 0.5]
                No  [0.3, 0.0, 0.7, 0.1]
Lisbon  Visa    Yes [1.0, 1.0, 0.0, 0.1]
                No  [0.4, 0.5]
Master Card     Yes [0.5, 0.3]
                No  [0.2, 0.2]

df1.explode('DebtPaid')

print(df1.explode('DebtPaid').to_markdown())
|                                  |   DebtPaid |
|:---------------------------------|-----------:|
| ('Tokyo', 'Visa', 'Yes')         |        0.8 |
| ('Tokyo', 'Visa', 'Yes')         |        0.1 |
| ('Tokyo', 'Visa', 'Yes')         |        0   |
| ('Tokyo', 'Visa', 'Yes')         |        0.2 |
| ('Tokyo', 'Visa', 'Yes')         |        0   |
| ('Tokyo', 'Visa', 'Yes')         |        0   |
| ('Tokyo', 'Visa', 'No')          |        0   |
| ('Tokyo', 'Master Card', 'Yes')  |        0.6 |
| ('Tokyo', 'Master Card', 'Yes')  |        0.5 |
| ('Tokyo', 'Master Card', 'No')   |        0.3 |
| ('Tokyo', 'Master Card', 'No')   |        0   |
| ('Tokyo', 'Master Card', 'No')   |        0.7 |
| ('Tokyo', 'Master Card', 'No')   |        0.1 |
| ('Lisbon', 'Visa', 'Yes')        |        1   |
| ('Lisbon', 'Visa', 'Yes')        |        1   |
| ('Lisbon', 'Visa', 'Yes')        |        0   |
| ('Lisbon', 'Visa', 'Yes')        |        0.1 |
| ('Lisbon', 'Visa', 'No')         |        0.4 |
| ('Lisbon', 'Visa', 'No')         |        0.5 |
| ('Lisbon', 'Master Card', 'Yes') |        0.5 |
| ('Lisbon', 'Master Card', 'Yes') |        0.3 |
| ('Lisbon', 'Master Card', 'No')  |        0.2 |
| ('Lisbon', 'Master Card', 'No')  |        0.2 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...