Объединение нескольких столбцов с использованием двух столбцов groupby-ed pandas

У меня есть таблица сырой, как показано ниже:

Объектштатпродолжительность_часыинтервал_часы
А10,060
А10,8734
А11,580
А2180
Б170
С10,30
С230
С2412

Схема таблиц:

  1. Объект: Автомобиль Объект
  2. Состояние: плановое или внеплановое техническое обслуживание (1 – плановое, 2 – внеплановое)
  3. duration_hours: Сколько времени заняло запланированное или незапланированное обслуживание.
  4. interval_hours: Какова разница между первым и следующим обслуживанием. (Первый интервал для каждого состояния объекта всегда будет равен 0)

Вопрос

Как я могу:

  1. Создайте объект за бинов и состояние для duration_hours и interval_hours
  2. Рассчитать выборки и вероятность попадания в бин за объекта и состояния.

Ожидаемый результат:

enter image description hereПояснение к выходной таблице:

  1. Размер, мин., макс. корзины настраивается.

  2. Каждый Объект имеет состояние, ячейки, выборку данных и вероятность.

  3. Для состояния каждый у нас есть бины, сформированные из duration_hours и interval_hours.

  4. Пример: Для объекта A, состояние 1, мы имеем:

    а. Два бина для duration_hours и два бина для interval_hours.

    б. Поскольку есть 2 выборки данных между [0,1) для duration_hours, у нас есть 2 выборки данных и вероятность (2/3) = 0,67, аналогично для интервальных часов у нас есть 2 выборки данных между [-1,50), мы имеем 2 вывод data_sample и prob = 2/3.

Любая помощь искренне приветствуется.

как задается диапазон бинов? кажутся разными для каждого состояния объекта

enke 09.04.2022 17:11

Для приведенного выше примера мы можем взять диапазон ячеек для часов продолжительности между [0,20) с интервалом 1. т.е. [0,1), [1,2) ... и диапазон ячеек для интервальных часов варьируется между [- 1100) с интервалом 50. (Но в реальных данных диапазон/размер ячейки вводится пользователем). Надеюсь, это имеет смысл

Pranav Arora 09.04.2022 17:25
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, что это именно то, что вы хотите, но, возможно, вы могли бы использовать его части.

Если ваш базовый фрейм данных называется df, вы можете начать с использования pd.cut() для объединения столбцов duration_hours и interval_hours:

bins = range(int(df.duration_hours.max()) + 2)
df["dur"] = pd.cut(df.duration_hours, bins, right=False)
bins = range(0, int(df.interval_hours.max()) + 51, 50)
df["int"] = pd.cut(df.interval_hours, bins, right=False)

Затем .melt() результат в новый фрейм данных df_res

df_res = df.melt(
    id_vars=["Object", "state"], value_vars=["dur", "int"],
    value_name="Bins", var_name="Variable", 
)

и groupby() и .sum() по большей части, чтобы получить столбец Sample

group = ["Object", "state", "Variable", "Bins"]
df_res = (
    df_res[group].assign(Sample=1).groupby(group, observed=True).sum()
)

и используйте его для построения столбца Prob (по .groupby()-transform().sum() по первым трем уровням индекса):

df_res["Prob"] = (
    df_res.Sample / df_res.groupby(level=[0, 1, 2]).Sample.transform('sum')
)

Результат для

df = 
  Object  state  duration_hours  interval_hours
0      A      1            0.06               0
1      A      1            0.87              34
2      A      1            1.50              80
3      A      2           18.00               0
4      B      1            7.00               0
5      C      1            0.30               0
6      C      2            3.00               0
7      C      2            4.00              12

является

                                 Sample      Prob
Object state Variable Bins                        
A      1     dur      [0, 1)          2  0.666667
                      [1, 2)          1  0.333333
             int      [0, 50)         2  0.666667
                      [50, 100)       1  0.333333
       2     dur      [18, 19)        1  1.000000
             int      [0, 50)         1  1.000000
B      1     dur      [7, 8)          1  1.000000
             int      [0, 50)         1  1.000000
C      1     dur      [0, 1)          1  1.000000
             int      [0, 50)         1  1.000000
       2     dur      [3, 4)          1  0.500000
                      [4, 5)          1  0.500000
             int      [0, 50)         2  1.000000

Другие вопросы по теме