Как рассчитать общую разницу в миллисекундах по условию?

У меня есть следующий фрейм данных pandas df:

отметка времениверсиядействительныйпред
2022-01-19 11:00:00.600100
2022-01-19 11:00:00.800101
2022-01-19 11:00:01.200110
2022-01-19 11:00:01.800100
2022-01-19 11:00:02.200211
2022-01-19 11:00:02.600200
2022-01-19 11:00:03.200301
2022-01-19 11:00:03.600300
2022-01-19 11:00:03.800310
2022-01-19 11:00:03.600400
2022-01-19 11:00:03.800401

Мне нужно рассчитать общее расстояние в миллисекундах между значениями 1 в actual и pred, сгруппированными по version.

Ожидаемый ответ: 1000 мс

  • версия 1: (2022-01-19 11:00:01.200 - 2022-01-19 11:00:00.600) = 400 мс
  • версия 2: (2022-01-19 11:00:02.200 - 2022-01-19 11:00:02.200) = 0 мс
  • версия 3: (2022-01-19 11:00:03.800 - 2022-01-19 11:00:03.200) = 600 мс
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Предполагая, что существует одно «фактическое» и одно «предварительное» значения для каждой «версии», мы могли бы просто вычесть значения. Другими словами, если каждая «версия» имеет ровно 1 «фактическое» и ровно 1 «предварительное» значение, то df['actual'].eq(1) будет иметь значение «Истина» ровно для одного значения на «версию»; то же самое для df['pred'].eq(1). Поскольку данные сортируются по «версии», версии совпадают.

df['timestamp'] = pd.to_datetime(df['timestamp'])
out = ((df.loc[df['actual'].eq(1), 'timestamp'].to_numpy() - 
        df.loc[df['pred'].eq(1), 'timestamp'].to_numpy())
       .astype('timedelta64[ms]').sum())

Если не во всех версиях есть 1 в «фактическом» или «предварительном», мы все равно можем отфильтровать значения «фактического» и «предварительного»; затем объедините «версию» (чтобы каждая «версия» имела «фактическое» и «предварительное» значение); затем найдите разницу и sum:

df['timestamp'] = pd.to_datetime(df['timestamp'])
merged = (df.loc[df['actual'].eq(1), ['version', 'timestamp']]
          .merge(df.loc[df['pred'].eq(1), ['version', 'timestamp']], 
                 on='version', suffixes=('_actual', '_pred')))

out = (merged['timestamp_actual'] - merged['timestamp_pred']).astype('timedelta64[ms]').sum()

Выход:

1000

Спасибо. Не могли бы вы уточнить, как группировка по version работает в предложенном вами решении?

Fluxy 21.03.2022 14:33

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

Fluxy 21.03.2022 14:34

В моем реальном наборе данных данные не сортируются по version, потому что version это строка. Также иногда для одного и того же version могут быть все нули actual или pred. Мои искренние извинения за это обновление. Я просто не учел его важность.

Fluxy 21.03.2022 14:39

@Fluxy, но в каждой версии будет не более одной 1, верно?

enke 21.03.2022 14:41

Да все верно.

Fluxy 21.03.2022 14:45

@Fluxy Я отредактировал версию, которая должна работать в этом случае.

enke 21.03.2022 14:45

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