Чтобы определить, какие каналы увеличиваются более чем на 10% по сравнению с данными прошлой недели

#python #pandas #numpy #data-analysis

#python #pandas #numpy #анализ данных

Вопрос:

У меня большой фрейм данных с разными временными метками. Вот моя попытка:

 all_data = []
for ws in wb.worksheets():
  rows=ws.get_all_values()
  df_all_data=pd.DataFrame.from_records(rows[1:],columns=rows[0])
  all_data.append(df_all_data)

data = pd.concat(all_data)
   

 
#Change data type
data['Year'] = pd.DatetimeIndex(data['Week']).year
data['Month'] = pd.DatetimeIndex(data['Week']).month
data['Week'] = pd.to_datetime(data['Week']).dt.date
data['Application'] = data['Application'].astype('str')
data['Function'] = data['Function'].astype('str')
data['Service'] = data['Service'].astype('str')
data['Channel'] = data['Channel'].astype('str')
data['Times of alarms'] = data['Times of alarms'].astype('int')

#Compare Channel values over weeks

subchannel_df = data.pivot_table('Times of alarms', index = 'Week', columns='Channel', aggfunc='sum').fillna(0)
subchannel_df = subchannel_df.sort_index(axis=1)
  

Фрейм данных, над которым я работаю

Чего я надеюсь достичь:

  1. добавьте процентную строку (последняя строка против предпоследней строки) в конце фрейма данных, исключая ситуации как таковые: деление на ноль и отрицательный процент
  2. покажите те каналы, которые увеличились более чем на 10% по сравнению с прошлой неделей.

Я пробовал разные методы для достижения этих результатов в течение нескольких дней. Однако мне бы это не удалось. Заранее благодарю вас.

Ответ №1:

Вы можете использовать функцию shift как эквивалент функции окна задержки в SQL для возврата значения прошлой недели, а затем выполнить вычисления на уровне строк. Чтобы избежать деления на ноль, вы можете использовать функцию numpy where, которая эквивалентна CASE WHEN в SQL. Допустим, значение вашего столбца, для которого вы выполняете вычисления, называется: «X»

 subchannel_df["XLag"] = subchannel_df["X"].shift(periods=1).fillna(0).astype('int')
subchannel_df["ChangePercentage"] = np.where(subchannel_df["XLag"] == 0, 0, (subchannel_df["X"]-subchannel_df["XLag"])/subchannel_df["XLag"])
subchannel_df["ChangePercentage"] = (subchannel_df["ChangePercentage"]*100).round().astype("int")
subchannel_df[subchannel_df["ChangePercentage"]>10]
  

Вывод:

 Channel     X   XLag  ChangePercentage
Week            
2020-06-12  12  5     140
2020-11-15  15  10    50
2020-11-22  20  15    33
2020-12-13  27  16    69
2020-12-20  100 27    270
  

Комментарии:

1. Я просто хочу рассчитать увеличение за последнюю неделю (последняя строка против предпоследней строки). Зачем вам использовать функцию сдвига в этом случае? возможно ли в этом случае добавить процент после индекса за последнюю неделю? Спасибо.

2. о, я понял. Это было в демонстрационных целях.

3. Предложенное мной решение дает вам возможность наблюдать эти изменения на каждом уровне строк, а не только на последних. Вы можете определить тенденцию во времени. Если это ответит на ваш вопрос, я буду признателен за принятие его в качестве ответа. @user14483865