gpt4 book ai didi

pandas - 使用开始日期/结束日期在 Pandas 中构建时间序列数据框

转载 作者:行者123 更新时间:2023-12-02 04:49:47 24 4
gpt4 key购买 nike

我正在尝试在 pandas 中完成队列分析。我希望能够查看用户在第 1 个月、第 2 个月、第 n 个月的事件,并根据用户注册的时间对其进行分组。您可以使用 groupby 来完成此操作,但如果用户在特定月份不活跃,则他们实际上不会显示在该月的数据中。

理想情况下,这是我要构建的 dataframe:

| UserID | SignUpDate | VisitMonth | Visits |
|--------|------------|------------|--------|
| 1 | 2014-03 | 2014-03 | 2 |
| 1 | 2014-03 | 2014-04 | 1 |
| 1 | 2014-03 | 2014-05 | 0 |
| 1 | 2014-03 | 2014-06 | 0 |
| 1 | 2014-03 | 2014-07 | 0 |
| 1 | 2014-03 | 2014-08 | 0 |
| 1 | 2014-03 | 2014-09 | 0 |
| 1 | 2014-03 | 2014-10 | 1 |
| 1 | 2014-03 | 2014-11 | 0 |
| 1 | 2014-03 | 2014-12 | 0 |
| 1 | 2014-03 | 2015-01 | 2 |
| 1 | 2014-03 | 2015-02 | 1 |
| 1 | 2014-03 | 2015-03 | 0 |
| 2 | 2015-01 | 2015-01 | 2 |
| 2 | 2015-01 | 2015-02 | 0 |
| 2 | 2015-01 | 2015-03 | 2 |

这是一些示例数据:

#Sample of users
users = [{'UserID': 'U1', 'SignUpDate': '2014-03-15'}, {'UserID': 'U2', 'SignUpDate': '2015-01-10'}]

#Create dataframe with users
usersDF = pd.DataFrame(data=users)

#Convert SignUpDate from Object to date
usersDF['SignUpDate'] = pd.to_datetime(usersDF['SignUpDate'])

#Add new column to build the month-only
usersDF['SignUpMonth'] = usersDF['SignUpDate'].dt.to_period('M')

#Sample of visits
visits =[{'UserID': 'U1', 'VisitDate': '2014-03-15'}, {'UserID': 'U1', 'VisitDate': '2014-03-28'}, {'UserID': 'U1', 'VisitDate': '2014-04-10'}, {'UserID': 'U1', 'VisitDate': '2014-10-28'}, {'UserID': 'U1', 'VisitDate': '2015-01-02'}, {'UserID': 'U2', 'VisitDate': '2015-01-10'}, {'UserID': 'U2', 'VisitDate': '2015-01-11'}, {'UserID': 'U1', 'VisitDate': '2014-01-20'}, {'UserID': 'U1', 'VisitDate': '2014-02-15'}, {'UserID': 'U2', 'VisitDate': '2015-03-01'}, {'UserID': 'U2', 'VisitDate': '2015-03-18'}]

#Create dataframe of visits
visitDF = pd.DataFrame(data=visits)

#Convert VisitDate from object to date
visitDF['VisitDate'] = pd.to_datetime(visitDF['VisitDate'])

#Add new column to build the month-only
visitDF['VisitMonth'] = visitDF['VisitDate'].dt.to_period('M')

#Group by to get the visits by user by month
visits_grouped = visitDF.groupby(['UserID', 'VisitMonth']).agg(['count'])

#Remove the index on UserID so can `merge`
visits_grouped.reset_index(inplace=True)

#Grouped by dataframe
cohortDF = visits_grouped.merge(usersDF[['UserID', 'SignUpMonth']], on='UserID', how='left')

这个 groupby/merge 只在有访问的地方构建一个数据框,因为我希望能够聚合其他字段,而不管是否有访问。

分组DF输出:

  UserID VisitMonth VisitDate
count
0 U1 2014-01 1
1 U1 2014-02 1
2 U1 2014-03 2
3 U1 2014-04 1
4 U1 2014-10 1
5 U1 2015-01 1
6 U2 2015-01 2
7 U2 2015-03 2

我是如何尝试解决这个问题的

我认为 for 循环 可以解决这个问题,但我在分解 DF/DF 的数据类型时遇到了问题。这是我对此的想法的一些粗略(根本不起作用)代码:

注意:此代码不起作用

for user in range(0, len(usersDF)):
TheUserID = usersDF['UserID'][user]
TheSignUpMonth = usersDF['SignUpMonth'][user]
AnalysisMonth = pd.to_datetime(datetime.datetime(2015,03,31)).to_period('M')
numperiods = AnalysisMonth - TheSignUpMonth
months = pd.date_range(TheSignUpMonth, periods=numperiods, freq='M')
for month in months:
df.append([TheUserID, TheSignUpMonth, month])

这种方法存在一些问题。

  1. 对我来说,使用 for 循环似乎不是很“ Pandas 式”。
  2. numperiods 部分不起作用。我知道 datetime 有一些方法可以确定两个日期之间的天数/月数等,但是尝试计算月份系列之间的差异是行不通的。
  3. 逐渐构建数据框(每个 UserID,每月)给我带来了一些问题,因为我们正在处理字符串和 Pandas 时间序列对象。

我如何构建我正在寻找的数据框?

最佳答案

下面是使用示例 dataframe 的方法:

添加辅助列以进行聚合(需要,因为所有其他列都用于数据透视表的索引中)

visitDF['counter'] = 1

然后创建一个数据透视表,使 VisitDate 列本身在索引中,其他维度在另一个中。

df =pd.pivot_table(visitDF,index = 'VisitDate', columns=['VisitMonth','UserID'],\
values='counter', aggfunc='sum').

然后将索引重新采样到day。这会为没有值的日子创建 NAN

df =df.resample('D',how='sum')

然后拆开框架,重置索引并将NAN填充为0以获得您需要的框架。

df.unstack().reset_index().fillna(0)

关于pandas - 使用开始日期/结束日期在 Pandas 中构建时间序列数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com