• Как правильно пользоваться индексами pandas?

    rudieduddie
    @rudieduddie Автор вопроса
    import pandas as pd
    import random
    import numpy as np
    
    from typing import Tuple
    
    """
    Write the function to detect the winner of votes winner_votes(df),
    which get as an input pandas df and returns as a result tuple 
    (list in () instead of []) like ('winner name', votes). 
    The voting is by majority for the state 
    (if equal votes assume the alphabetical order prevails).
    """
    
    
    def winner_votes(df_in: pd.DataFrame) -> Tuple[str, int]:
        # здесь мы группируем данные по штатам, поскольку
        # electors будут мешать мне определить максимальные значения
        # не придумал ничего лучше, кроме как добавить в группу
        df = df_in.groupby(['state', 'electors'], sort=False).first()
        # затем я сортирую кандидатов по имени
        # в задании есть пунтк, что мне нужно выбирать победителей в штатах
        # в алфавитном порядке при равных значениях
        df.sort_index(axis=1, inplace=True)
        # затем в колонку winner я добавляю имя кандидата
        df['winner'] = df.idxmax(axis=1)
        # после этого я попытался сгруппировать данные по этой колонке
        # но получилось достаточно странно и мне не понятно, как с ними работать дальше
        """                    Arya Stark  Deineris Targarien  Tyrion Lannister
    winner                                                              
    Arya Stark                 0.6                 0.1               0.3
    Deineris Targarien         0.3                 0.5               0.2
        """
        return df.groupby('winner').first()
    
    
    
    
    df = pd.DataFrame([['Winterfell', 3, 0.6, 0.3, 0.1],
     ['Riverrun', 5, 0.3, 0.2, 0.5],
     ['Vaes Dothrak', 2, 0.2, 0.3, 0.5]], columns=['state', 'electors', 
                                                   'Arya Stark', 
                                                   'Tyrion Lannister', 
                                                   'Deineris Targarien'])
    
    assert winner_votes(df) == ("Deineris Targarien", 7)
    
    def mktable(seed):
        states = ['Florida', 'Connecticut', 'Georgia', 'Texas', 'Vermont', 
                  'New Mexico', 'Illinois', 'Kentucky', 'Iowa', 'Alaska', 
                  'New York', 'Massachusetts', 'Arkansas', 'Missouri', 'Kansas', 
                  'Idaho', 'Wisconsin', 'Mississippi', 'Washington', 'Oklahoma', 
                  'California', 'South Carolina', 'Hawaii', 'Maryland', 'Arizona', 
                  'Montana', 'Ohio', 'Oregon', 'Rhode Island', 'South Dakota', 
                  'Alabama', 'North Dakota', 'Virginia', 'New Jersey', 'Wyoming', 
                  'Maine', 'D.C.', 'Tennessee', 'Pennsylvania', 'Nebraska', 
                  'Delaware', 'Michigan', 'New Hampshire', 'Indiana', 
                  'North Carolina', 'Colorado', 'West Virginia', 'Utah', 
                  'Minnesota', 'Louisiana', 'Nevada']
        candidates = ['Clinton', 'Trump', 'Johnson', 'Stein', 'Castle', 
                      'McMullin']
        random.seed(seed)
        np.random.seed(seed)
        states_ = random.sample(states, random.randrange(1, len(states)))
        candidates_ = random.sample(candidates, 
                                    random.randrange(1, len(candidates)))
        results = np.random.uniform(size=(len(candidates_), len(states_)))
        results = (results / results.sum(axis=0)).T
        electors = np.random.randint(1, 20, size=len(states_))
        return pd.concat([pd.Series(states_, name='state'),
                          pd.Series(electors, name='electors'), 
                          pd.DataFrame(results,
                                       columns=candidates_)], axis=1)
    
    for i, result in enumerate([('Stein', 107), ('Clinton', 48), ('Castle', 18), 
                                ('Trump', 63), ('Johnson', 88), ('Johnson', 196), 
                                ('Johnson', 88), ('McMullin', 62), ('Trump', 51), 
                                ('Johnson', 295), ('Johnson', 79), ('Stein', 84), 
                                ('Clinton', 285), ('Trump', 84), ('Stein', 55), 
                                ('McMullin', 59), ('Clinton', 110), 
                                ('McMullin', 162), ('Johnson', 45), 
                                ('Clinton', 165), ('Castle', 156), 
                                ('Johnson', 47), ('Trump', 83), ('Trump', 287), 
                                ('Stein', 268), ('Castle', 275), ('Clinton', 235), 
                                ('Trump', 434), ('Stein', 24), ('Castle', 135), 
                                ('Trump', 99), ('Stein', 17), ('Clinton', 23), 
                                ('Clinton', 133), ('Trump', 159), ('Trump', 88), 
                                ('McMullin', 77), ('Johnson', 436), 
                                ('Stein', 211), ('Johnson', 158), ('Trump', 114), 
                                ('Castle', 259), ('Johnson', 431), 
                                ('Johnson', 19), ('Castle', 304), ('Trump', 118), 
                                ('Castle', 18), ('McMullin', 141), 
                                ('Clinton', 197), ('McMullin', 14), 
                                ('Trump', 259), ('Castle', 87), ('Trump', 171), 
                                ('Castle', 120), ('Johnson', 48), ('Stein', 54), 
                                ('Trump', 382), ('Trump', 30), ('Trump', 134), 
                                ('McMullin', 77), ('Trump', 72), ('Stein', 114), 
                                ('Clinton', 152), ('McMullin', 105), 
                                ('Clinton', 279), ('Trump', 241), ('Castle', 23), 
                                ('McMullin', 27), ('Stein', 148), ('Trump', 420), 
                                ('Castle', 42), ('Clinton', 114), ('Stein', 23), 
                                ('Castle', 68), ('Clinton', 328), 
                                ('Johnson', 149), ('Trump', 97), ('Trump', 91), 
                                ('Trump', 51), ('McMullin', 45), ('Johnson', 56), 
                                ('McMullin', 167), ('Stein', 57), ('Castle', 111), 
                                ('Stein', 477), ('McMullin', 82), 
                                ('Clinton', 173), ('Clinton', 77), ('Trump', 273), 
                                ('Trump', 43), ('Trump', 68), ('Stein', 34), 
                                ('McMullin', 185), ('Clinton', 293), 
                                ('Johnson', 138), ('Stein', 261), 
                                ('Johnson', 131), ('Johnson', 58), 
                                ('Trump', 85), ('McMullin', 283)]):
        assert winner_votes(mktable(i)) == result, "Something wrong "\
                                                   "with table\n" + \
                                                str(mktable(i)) + "\nExpected " +\
                                                str(result) + "\nObtained: " + \
                                                str(winner_votes(mktable(i)))
  • Как правильно пользоваться индексами pandas?

    rudieduddie
    @rudieduddie Автор вопроса
    dmshar, к сожалению, ответ ниже не помог. Если у вас есть сегодня 15 свободных минут, пожалуйста напишите мне в телеграм @rudie_duddie
    Я действительно застрял с этой задачей, но мне очень важно понять, как она должна быть решена, я буду рад оплатить помощь. Надеюсь, что не нарушаю условия площадки
  • Как правильно пользоваться индексами pandas?

    rudieduddie
    @rudieduddie Автор вопроса
    К сожалению получаю ['Deineris Targarien', 5] вместо ['Deineris Targarien', 7]
    Очень сложная задача с моим уровнем знаний Pandas, спасибо, что помогаете мне.
    Я убрал ограничение на 5 индексов, т.к. количество кандидатов и штатов будет варьироваться

    Я понимаю, почему сейчас я получаю неверный ответ - строчка gdf.loc[gdf['electors'].idxmax()].to_list() возвращает штат с наибольшим количеством избирателей. Мне же необходимо найти сумму всех избирателей в тех штатах, в которых победил кандидат, но я не понимаю, как сделать это используя Pandas

    import pandas as pd
    def winner_votes(df):
        gdf = df.groupby(df.iloc[:,2:].idxmax(axis=1)).sum()['electors'].reset_index()
        return gdf.loc[gdf['electors'].idxmax()].to_list()
    
    df_in = pd.DataFrame([['Winterfell', 3, 0.6, 0.3, 0.1],
     ['Riverrun', 5, 0.3, 0.2, 0.5],
     ['Vaes Dothrak', 2, 0.2, 0.5, 0.5]], columns=['state', 'electors', 
                                                   'Arya Stark', 
                                                   'Tyrion Lannister', 
                                                   'Deineris Targarien'])
    
    print(winner_votes(df_in))
    # expected - ["Deineris Targarien", 7]
    # got - ['Deineris Targarien', 5]
  • Как правильно пользоваться индексами pandas?

    rudieduddie
    @rudieduddie Автор вопроса
    Спасибо за ответ!

    Скажите, зная победителя, как я могу найти голоса отданные за него?
    Я пробую нечто подобное

    winner = df_in.groupby(df_in.iloc[:,2:999].idxmax(axis=1)).sum()['electors'].idxmax()
    return df_in[df_in[winner] == df_in.max()]['electors'].sum()


    Но получаю ValueError: Can only compare identically-labeled Series objects

    У меня сейчас такие входные данные для тестирования:

    df = pd.DataFrame([['Winterfell', 3, 0.6, 0.3, 0.1],
     ['Riverrun', 5, 0.3, 0.2, 0.5],
     ['Vaes Dothrak', 2, 0.2, 0.5, 0.5]], columns=['state', 'electors', 
                                                   'Arya Stark', 
                                                   'Tyrion Lannister', 
                                                   'Deineris Targarien'])
  • Как правильно пользоваться индексами pandas?

    rudieduddie
    @rudieduddie Автор вопроса
    Большое спасибо за ответ! Извините за неточные формулировки. Дело в том, что я сейчас не понимаю, как получить доступ к electors после группировки. Я попробовал сгруппировать по winner, вот, что получается сейчас

    def winner_votes(df_in):
        df = df_in.groupby(['state', 'electors'], sort=False).first()
        df.sort_index(axis=1, inplace=True)
        df['winner'] = df.idxmax(axis=1)
        return df.groupby('winner').first()
    
    df = pd.DataFrame([['Winterfell', 3, 0.6, 0.3, 0.1],
     ['Riverrun', 5, 0.3, 0.2, 0.5],
     ['Vaes Dothrak', 2, 0.2, 0.5, 0.5]], columns=['state', 'electors', 
                                                   'Arya Stark', 
                                                   'Tyrion Lannister', 
                                                   'Deineris Targarien'])
    
    print(winner_votes(df))


    5fb7dc1fbaa26093833728.png

    Я предполагаю, что мне нужно использовать нечто вроде df.groupby('winner').agg({'electors': np.sum}), но получаю KeyError
  • Как найти t-критерий Стьюдента, используя python?

    rudieduddie
    @rudieduddie Автор вопроса
    Большое спасибо за ответ! Используя ваше предложение, у меня получилось уравнять ответы. Конечное выражение выглядит так:

    ctrl = df[df['group'] == 'A']['converted'] # pandas Series, control group
    test = df[df['group'] == 'B']['converted'] # pandas Series, test group
    t = (np.mean(ctrl) - np.mean(test)) / np.sqrt(
        np.std(ctrl, ddof = 1) ** 2 / ctrl.size + (np.std(test, ddof = 1) ** 2) / test.size
    )


    -1.6123875817242772 - ответ через решение выше
    -1.6123875817242772 - ответ полученный через ttest_ind(ctrl, test, equal_var=False)
  • Как реализовать регистронезависимый поиск в python?

    rudieduddie
    @rudieduddie Автор вопроса
    Всё верно. Я решил проблему тем, что продублировал поля по которым ведётся поиск. В поле (условно) description я помещал текст, который покажется пользователю, а в поле description_l помещал тот же текст в нижнем регистре.

    Затем команды поиска выглядела как

    description_l = "%{}%".format( text.lower() )
    results = await db.execute("SELECT description FROM articles WHERE description_l LIKE ?",[description_l])