Как найти 10 лучших значений производительности каждой недели в Python? - PullRequest
1 голос
/ 16 мая 2019

Я хотел бы вернуть 10 лучших (в среднем) переменных за каждую неделю в моем DataFrame. Это около 2 лет данных

Я использую Python, чтобы понять это, но, в конечном итоге, хотел бы сделать это в SQL.

Мне удалось создать код, который возвращает топ-10 за последнюю неделю, но хотел бы получить результаты для каждой недели

  • Создание df, который создает диапазон даты и времени
range_max = rtbinds['pricedate'].max()
range_min = range_max - datetime.timedelta(days=7)

sliced_df = rtbinds[(rtbinds['pricedate'] >= range_min) 
                    & (rtbinds['pricedate'] <= range_max)]
  • группировка по 'тени'
sliced_df.groupby(['pricedate','cons_name']).aggregate(np.mean)
         .sort_values('shadow').head(10)
  • возвращает данные за первую неделю.
    pricedate   cons_name       shadow
    2019-04-26  TEMP71_24753    -643.691
    2019-04-27  TMP175_24736    -508.062
    2019-04-25  TMP109_22593    -383.263
    2019-04-23  TEMP48_24759    -376.967
    2019-04-29  TEMP71_24753    -356.476
                TMP175_24736    -327.230
                TMP273_23483    -303.234
    2019-04-27  TEMP71_24753    -294.377
    2019-04-28  TMP175_24736    -272.603
                TMP109_22593    -270.887

Но я хотел бы получить список, который возвращает топ-10 за каждую неделю до самой ранней даты моих данных

1 Ответ

0 голосов
/ 17 мая 2019

heads pd.sort_values сортирует по умолчанию в порядке возрастания, поэтому, когда вы берете head(10), это на самом деле худшие 10, если мы рассмотрим естественное упорядочение действительных чисел.

Теперь для вашей проблемы, вот решение

Сначала нам нужно создать несколько столбцов для определения недели года (rtbins переименован в df):

df['year'] = df['pricedate'].apply(lambda x: x.year)
df['week'] = df['pricedate'].apply(lambda x: x.isocalendar()[1])

Затем мы сгруппируем данные по ['year', 'week', 'cons_name']:

df2 = df.groupby(['year', 'week', 'cons_name'], as_index=False).aggregate(np.mean)

Теперь вы должны получить фрейм данных, в котором для каждого (года, недели) у вас есть только одна запись имени cons_name со средней тенью.

Тогда мы возьмем топ-10 для каждого (год, неделя)

def udf(df):
    return df.sort_values('shadow').head(10)

df2.groupby(['year', 'week'], as_index=False).apply(udf)

Это должно дать вам желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...