У меня есть фрейм данных с 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
""")