Вычислить количество незавершенных событий с pandas - PullRequest
1 голос
/ 18 апреля 2020

У меня есть фрейм данных с 3 временными метками событий: e0, e1 и e2. Другие столбцы - это идентификатор строки и целевая переменная.

В качестве иллюстрации предположим, что это набор данных раздела электронной торговли и

  • e0: время, когда пользователь открывает веб-сайт
  • e1: время пользователь выбирает элемент
  • e2: время пользователь покупает элемент

Я хотел бы посчитать (или вычислить другую статистику) для каждого пользователя, сколько пользователей в настоящее время между событиями 1 и 2.

Мне удалось сделать это, используя pandasql, но не с нативными функциями pandas:

import pandas as pd
from pandas import Timestamp
from pandasql import sqldf

df = pd.DataFrame({'id': {0: 0, 1: 1, 2: 2, 3: 3, 5: 5, 4: 4, 6: 6, 7: 7},
 'e0': {0: Timestamp('2020-01-01 12:00:00'),
  1: Timestamp('2020-01-01 12:10:00'),
  2: Timestamp('2020-01-01 12:11:00'),
  3: Timestamp('2020-01-01 12:20:00'),
  5: Timestamp('2020-01-01 12:20:00'),
  4: Timestamp('2020-01-01 12:24:00'),
  6: Timestamp('2020-01-01 12:50:00'),
  7: Timestamp('2020-01-01 12:55:00')},
 'e1': {0: Timestamp('2020-01-01 12:20:00'),
  1: Timestamp('2020-01-01 12:55:00'),
  2: Timestamp('2020-01-01 12:31:00'),
  3: Timestamp('2020-01-01 12:40:00'),
  5: Timestamp('2020-01-01 12:50:00'),
  4: Timestamp('2020-01-01 12:54:00'),
  6: Timestamp('2020-01-01 13:03:00'),
  7: Timestamp('2020-01-01 13:00:00')},
 'e2': {0: Timestamp('2020-01-01 12:25:00'),
  1: Timestamp('2020-01-01 13:00:00'),
  2: Timestamp('2020-01-01 12:36:00'),
  3: Timestamp('2020-01-01 12:56:00'),
  5: Timestamp('2020-01-01 13:30:00'),
  4: Timestamp('2020-01-01 12:58:00'),
  6: Timestamp('2020-01-01 13:50:00'),
  7: Timestamp('2020-01-01 13:20:00')},
 'target': {0: '100',
  1: '120',
  2: '110',
  3: '105',
  5: '120',
  4: '140',
  6: '130',
  7: '200'}})


sqldf("""
SELECT df1.id, COUNT(df2.id)
FROM df df1
JOIN df df2 ON df1.e0 > df2.e1 AND df1.e0 < df2.e2
GROUP BY df1.id

""")

или, как я уже сказал, чтобы вычислить статистику:

sqldf("""

SELECT df1.id, AVG(df2.target)
FROM df df1
JOIN df df2 ON df1.e0 > df2.e1 AND df1.e0 < df2.e2
GROUP BY df1.id
""")

1 Ответ

2 голосов
/ 18 апреля 2020

Вы можете достичь тех же результатов в своих запросах с помощью операции df.merge и query в качестве фильтра.

Для вашего первого запроса:

res1 = df.assign(key=1).merge(
    df.assign(key=1),
    on="key",
    suffixes=["", "_2"]
).query(
    "e0 > e1_2 & e0 < e2_2"
).groupby("id").id_2.count()
print(res1)

id
4    1
6    1
7    3
Name: id_2, dtype: int64

Для вашего второго запроса:

df["target"] = df.target.astype(int)
res2 = df.assign(key=1).merge(
    df.assign(key=1),
    on="key",
    suffixes=["", "_2"]
).query(
    "e0 > e1_2 & e0 < e2_2"
).groupby("id").target_2.mean()
print(res2)

id
4    100.000000
6    105.000000
7    121.666667
Name: target_2, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...