Панды - получить значения на графике с использованием квантиля

У меня есть это df_players:

 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   TableIndex      739 non-null    object 
 1   PlayerID        739 non-null    int64  
 2   GameWeek        739 non-null    int64  
 3   Date            739 non-null    object 
 4   Points          739 non-null    int64  
 5   Price           739 non-null    float64
 6   BPS             739 non-null    int64  
 7   SelectedBy      739 non-null    int64  
 8   NetTransfersIn  739 non-null    int64  
 9   MinutesPlayed   739 non-null    float64
 10  CleanSheet      739 non-null    float64
 11  Saves           739 non-null    float64
 12  PlayersBasicID  739 non-null    int64  
 13  PlayerCode      739 non-null    object 
 14  FirstName       739 non-null    object 
 15  WebName         739 non-null    object 
 16  Team            739 non-null    object 
 17  Position        739 non-null    object 
 18  CommentName     739 non-null    object 

И я использую эту функцию с quantile() (значение, переданное переменной 'cut'), чтобы построить распределение игроков:

def jointplot(X, Y, week=None, title=None,
              positions=None, height=6,
              xlim=None, ylim=None, cut=0.015,
              color=CB91_Blue, levels=30, bw=0.5, top_rows=100000):

    if positions == None:
        positions = ['GKP','DEF','MID','FWD']

    #Check if week is given as a list
    if week == None:
        week = list(range(max(df_players['GameWeek'])))

    if type(week)!=list:
        week = [week]

    df_played = df_players.loc[(df_players['MinutesPlayed']>=45)
                              &(df_players['GameWeek'].isin(week))
                              &(df_players['Position'].isin(positions))].head(top_rows)   

    if xlim == None:
        xlim = (df_played[X].quantile(cut),
                df_played[X].quantile(1-cut))

    if ylim == None:
        ylim = (df_played[Y].quantile(cut),
                df_played[Y].quantile(1-cut))

    sns.jointplot(X, Y, data=df_played,
                  kind="kde", xlim=xlim, ylim=ylim,
                  color=color, n_levels=levels,
                  height=height, bw=bw);

    plt.suptitle(title,fontsize=18);
    plt.show()

вызов:

jointplot('Price', 'Points', positions=['FWD'],
          color=color_list[3], title='Forwards')

это сюжеты:

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

куда:

xlim = (4.5, 11.892999999999995)
ylim = (1.0, 13.0)

Насколько я понимаю, эти пределы x и y позволяют мне, используя диапазон значений квантиля (cut),(1-cut), увеличить область точек данных.


ВОПРОС

Теперь я хотел бы получить «WebName» игрока для игроков в определенной области, например:

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

После построения графика я могу выбрать целевую область выше и примерно определить диапазон, передав значения xlim и ylim:

jointplot('Price', 'Points', positions=['FWD'], 
          xlim=(5.5, 7.0), ylim=(11.5, 13.0),
          color=color_list[3], title='Forwards')

который увеличивает область, выделенную красным цветом выше.

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


Но как я могу получить имена игроков в этой области?


person 8-Bit Borges    schedule 23.05.2020    source источник
comment
нельзя просто отфильтровать df_players по цене и по пунктам? Или я что-то пропустил в вашем вопросе?   -  person Michael Delgado    schedule 24.05.2020
comment
нет, вы ничего не упускаете. Вы можете просто ответить...   -  person 8-Bit Borges    schedule 24.05.2020


Ответы (1)


Вы можете просто выбрать часть кадра данных игроков на основе границ на графике:

selected = df_players[
    (df_players.Points >= points_lbound)
    & (df_players.Points <= points_ubound)
    & (df_players.Price >= price_lbound)
    & (df_players.Price <= price_ubound)
]

Тогда список веб-имен будет selected.WebNames

person Michael Delgado    schedule 23.05.2020
comment
благодарю вас. вы ввели новые переменные. не могли бы вы немного расширить информацию о lboud и ubound? они такие же, как xlim и ylim в приведенном выше коде? - person 8-Bit Borges; 24.05.2020
comment
Да, извините, вы можете выбрать любые значения для этих границ. Например, если вы используете xlim=(5.5, 7.0), ylim=(11.5, 13.0), вы можете использовать 5.5, 7.0, 11.5, 13.0 вместо price_lbound, price_ubound, points_lbound, points_ubound. - person Michael Delgado; 24.05.2020
comment
понятно. для ясности я думаю, что использование selected = df_players[ (df_players.Points >= ylim[0]) & (df_players.Points <= ylim[1]) & (df_players.Price >= xlim[0]) & (df_players.Price <= xlim[1]) ] было бы понятнее. - person 8-Bit Borges; 24.05.2020