作者:手机用户2602921303_852 | 来源:互联网 | 2023-01-28 20:58
使用以下python pandas dataframe df:
Customer_ID | Transaction_ID
ABC 2016-05-06-1234
ABC 2017-06-08-3456
ABC 2017-07-12-5678
ABC 2017-12-20-6789
BCD 2016-08-23-7891
BCD 2016-09-21-2345
BCD 2017-10-23-4567
不幸的是,日期隐藏在transaction_id字符串中。我以这种方式编辑了数据框。
#year of transaction
df['year'] = df['Transaction_ID'].astype(str).str[:4]
#date of transaction
df['date'] = df['Transaction_ID'].astype(str).str[:10]
#format date
df['date']=pd.to_datetime(df['date'], format='%Y-%m-%d')
#calculate visit number per year
df['visit_nr_yr'] = df.groupby(['Customer_ID', 'year']).cumcount()+1
现在,df如下所示:
Customer_ID | Transaction_ID | year | date |visit_nr_yr
ABC 2016-05-06-1234 2016 2016-05-06 1
ABC 2017-06-08-3456 2017 2017-06-08 1
ABC 2017-07-12-5678 2017 2017-07-12 2
ABC 2017-12-20-6789 2017 2017-12-20 3
BCD 2016-08-23-7891 2016 2016-08-23 1
BCD 2016-09-21-2345 2016 2016-09-21 2
BCD 2017-10-23-4567 2017 2017-10-23 1
我需要计算以下内容:
每次访问之间的平均间隔时间是多少(因此1&2与2&3之间)
一般而言,两次造访之间的平均间隔时间是多少
首先,我想包括以下列“ days_between_visits_by year”(要由Customer_ID完成):
Customer_ID|Transaction_ID |year| date |visit_nr_yr|days_bw_visits_yr
ABC 2016-05-06-1234 2016 2016-05-06 1 NaN
ABC 2017-06-08-3456 2017 2017-06-08 1 NaN
ABC 2017-07-12-5678 2017 2017-07-12 2 34
ABC 2017-12-20-6789 2017 2017-12-20 3 161
BCD 2016-08-23-7891 2016 2016-08-23 1 NaN
BCD 2016-09-21-2345 2016 2016-09-21 2 29
BCD 2017-10-23-4567 2017 2017-10-23 1 NaN
请注意,如果有人在同一天进行两次访问,我会故意避免使用0并保留Nans。
接下来,我想按访问次数计算两次访问之间的平均天数(因此,一年内1&2与2&3之间)。寻找此输出:
avg_days_bw_visits_1_2 | avg_days_bw_visits_2_3
31.5 161
最后,我想计算一般的两次访问之间的平均天数:
output: 203.8
#the days between visits are 398,34,161,29,397 and the average of those
numbers is 203.8
我对如何创建“ days_bw_visits_yr”列感到困惑。Nans必须从数学中排除。
1> parasu..:
通过将“日期”列向下移动1,可以获取上次访问日期(按客户和年份分组):
df['previous_visit'] = df.groupby(['Customer_ID', 'year'])['date'].shift()
因此,每次访问之间的天数仅仅是不同的:
df['days_bw_visits'] = df['date'] - df['previous_visit']
要计算均值,请将日期增量对象转换为天:
df['days_bw_visits'] = df['days_bw_visits'].apply(lambda x: x.days)
平均造访天数:
df.groupby('visit_nr_yr')['days_bw_visits'].agg('mean')
df['days_bw_visits'].mean()