Нахождение полосы дней в питоне - PullRequest
0 голосов
/ 01 июня 2018

Итак, у меня есть набор из 50 дат, которые я указал здесь, например,

df["CreatedDate"] = pd.DataFrame('09-08-16 0:00','22-08-16 0:00','23-08-16 0:00',28-08-16 0:00,'29-08-16 0:00','30-08-16 0:00','31-08-16 0:00')
df["CreatedDate"] = pd.to_datetime(df4.CreatedDate)
df4["DAY"] = df4.CreatedDate.dt.day

Как найти непрерывные дни, которые образуют диапазон штрихов [1-3], [4-7],[8-15], [> = 16]

 Streak Count 
 1-3     3    #(9),(22,23) are in range [1-3]
 4-7     1    #(28,29,30,31) are in range [4-7]
 8-15    0
 >=16    0

Скажем так: продукт (ручка) был запущен 2 года назад, мы берем набор данных за последние 10 месяцев с сегодняшнего дня и из того, что я хочуВыясните, что если люди покупают эту ручку непрерывно в течение 1 или 2 или 3 дней, и если да, поставьте счет [1-3] и если они покупают его постоянно в течение 4, 5, 6 или 7 дней, мы помещаем счет в[4-7] и т. Д. Для других диапазонов

Я не знаю, какое условие указать в соответствии с критериями

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вот попытка, биннинг такой же, как у @jezrael (за исключением последнего бина, который, я не уверен, должен быть ограничен 31 ... есть ли способ иметь открытые интервалы с pd.cut?)

import pandas as pd

df = pd.DataFrame({ "CreatedDate": ['09-08-16 0:00','22-08-16 0:00','23-08-16 0:00','28-08-16 0:00','29-08-16 0:00','30-08-16 0:00','31-08-16 0:00']})
df["CreatedDate"] = pd.to_datetime(df.CreatedDate)

# sort by date
df = df.sort_values("CreatedDate")

# group consecutive dates
oneday = pd.Timedelta("1 day")
df["groups"] = (df.diff() > oneday).cumsum()
counts = df.groupby("groups").count()["CreatedDate"]

# bin
streaks = (pd.cut(counts, bins=[0,3,7,15,1000000], labels=['1-3', '4-7','8-15', '>=16'])
           .value_counts()
           .rename_axis("streak")
           .reset_index(name="count"))

print(streaks)

  streak  count
0    1-3      2
1    4-7      1
2   >=16      0
3   8-15      0
0 голосов
/ 01 июня 2018

Мне кажется нужно:

df4 = pd.DataFrame({'CreatedDate':['09-08-16 0:00','22-08-16 0:00','23-08-16 0:00','28-08-16 0:00','29-08-16 0:00','30-08-16 0:00','31-08-16 0:00']})
df4["CreatedDate"] = pd.to_datetime(df4.CreatedDate)

df4 = df4.sort_values("CreatedDate")
count = df4.groupby((df4["CreatedDate"].diff().dt.days > 1).cumsum()).size()
print (count)
CreatedDate
0    2
1    4
2    1
dtype: int64

a = (pd.cut(count, bins=[0,3,7,15,31], labels=['1-3', '4-7','8-15', '>=16'])
       .value_counts()
       .sort_index()
       .rename_axis('Streak')
       .reset_index(name='Count'))
print (a)
  Streak  Count
0    1-3      2
1    4-7      1
2   8-15      0
3   >=16      0
...