- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下交易 DF。日期格式为年/月/日
print(df)
customer_id shop date_of_transaction
0 John McDonalds 2020-02-03
1 John McDonalds 2020-02-04
2 John McDonalds 2020-02-05
3 John KFC 2020-02-06
4 John KFC 2020-02-07
5 John KFC 2020-02-08
6 Mary McDonalds 2020-02-09
7 Mary McDonalds 2020-02-10
8 Mary McDonalds 2020-02-11
9 Mary KFC 2020-02-12
10 Mary KFC 2020-02-13
11 Joe KFC 2020-02-14
12 Joe McDonalds 2020-02-15
13 Joe McDonalds 2020-02-16
14 Joe McDonalds 2020-02-17
15 Joe KFC 2020-02-18
16 Joe KFC 2020-02-19
17 Joe KFC 2020-02-20
18 Joe MCDonalds 2020-02-21
我想获得每家商店的平均交易频率。
例如,乔在 2 月 15 日至 2 月 21 日期间去了 4 次麦当劳。他的第一次交易和最后一次交易之间相隔 6 天。所以他每 1.5 天就会去一次麦当劳。
我想用这个信息创建一个新的数据框。所以我试试这个:
df.groupby(['customer_id','shop'])['date_of_transaction'].apply(lambda x: (max(x) - min (x))/len(x))
customer_id shop
Joe KFC 1 days 12:00:00
McDonalds 1 days 12:00:00
John KFC 0 days 16:00:00
McDonalds 0 days 16:00:00
Mary KFC 0 days 12:00:00
McDonalds 0 days 16:00:00
Joe 在这里麦当劳的平均频率是 1 天
。应该是 1.5 天。
如果我删除除法,我们得到:
df.groupby(['customer_id','shop'])['date_of_transaction'].apply(lambda x:(max(x) - min (x)))
customer_id shop
Joe KFC 6 days
McDonalds 6 days
John KFC 2 days
McDonalds 2 days
Mary KFC 1 days
McDonalds 2 days
只是当我试图用它除以每个人在每个商店的访问次数时,它不起作用。
我尝试将 astype(int)
添加到 (max(x) - min (x))
但它不起作用。我知道这是 timedelta 对象的问题,但我无法将其转换为 int。我还添加了 .dt.days
到 timedelta 对象,但没有成功。
理想情况下,我想以这样的数据框结束(注意 - 频率数字是虚构的):
customer_id McDonalds Frequency KFC Frequency
0 John 1 2
1 Mary 3 4
2 Joe 5 6
我的练习 df。如果加载 df,则可以使用 dayfirst
转换日期:
df['date_of_transaction'] = pd.to_datetime(df['date_of_transaction'],dayfirst=True)
df.to_dict()
{'customer_id': {0: 'John', 1: 'John', 2: 'John', 3: 'John', 4: 'John', 5: 'John', 6: 'Mary', 7: 'Mary', 8: 'Mary', 9: 'Mary', 10: 'Mary', 11: 'Joe', 12: 'Joe', 13: 'Joe', 14: 'Joe', 15: 'Joe', 16: 'Joe', 17: 'Joe', 18: 'Joe'}, 'shop': {0: 'McDonalds', 1: 'McDonalds', 2: 'McDonalds', 3: 'KFC', 4: 'KFC', 5: 'KFC', 6: 'McDonalds', 7: 'McDonalds', 8: 'McDonalds', 9: 'KFC', 10: 'KFC', 11: 'KFC', 12: 'McDonalds', 13: 'McDonalds', 14: 'McDonalds', 15: 'KFC', 16: 'KFC', 17: 'KFC', 18: 'McDonalds'}, 'date_of_transaction': {0: Timestamp('2020-02-03 00:00:00'), 1: Timestamp('2020-02-04 00:00:00'), 2: Timestamp('2020-02-05 00:00:00'), 3: Timestamp('2020-02-06 00:00:00'), 4: Timestamp('2020-02-07 00:00:00'), 5: Timestamp('2020-02-08 00:00:00'), 6: Timestamp('2020-02-09 00:00:00'), 7: Timestamp('2020-02-10 00:00:00'), 8: Timestamp('2020-02-11 00:00:00'), 9: Timestamp('2020-02-12 00:00:00'), 10: Timestamp('2020-02-13 00:00:00'), 11: Timestamp('2020-02-14 00:00:00'), 12: Timestamp('2020-02-15 00:00:00'), 13: Timestamp('2020-02-16 00:00:00'), 14: Timestamp('2020-02-17 00:00:00'), 15: Timestamp('2020-02-18 00:00:00'), 16: Timestamp('2020-02-19 00:00:00'), 17: Timestamp('2020-02-20 00:00:00'), 18: Timestamp('2020-02-21 00:00:00')}}
最佳答案
这里的问题是您将返回值视为一个日期,而实际上它是一个时间增量,1 天 12:00:00
是 1.5
天一天 12 小时过去了。
让我们使用 aggregated
groupby
稍微 reshape 您的数据,然后我们可以使用 np.timedelta64
编辑您的时间增量:
df1 = df.groupby(['customer_id','shop']).agg(mind=('date_of_transaction','min'),
maxd=('date_of_transaction','max'),
no_visits=('customer_id','count')).reset_index(0)
print(df1)
mind maxd no_visits
customer_id shop
Joe KFC 2020-02-20 2020-02-14 4
McDonalds 2020-02-21 2020-02-15 4
John KFC 2020-02-08 2020-02-06 3
McDonalds 2020-02-05 2020-02-03 3
Mary KFC 2020-02-13 2020-02-12 2
McDonalds 2020-02-11 2020-02-09 3
df1['timedelta'] = ((df1['maxd'] - df1['mind']) / df1['no_visits']) / np.timedelta64(1,'D')
mind maxd no_visits timedelta
customer_id shop
Joe KFC 2020-02-20 2020-02-14 4 1.500000
McDonalds 2020-02-21 2020-02-15 4 1.500000
John KFC 2020-02-08 2020-02-06 3 0.666667
McDonalds 2020-02-05 2020-02-03 3 0.666667
Mary KFC 2020-02-13 2020-02-12 2 0.500000
McDonalds 2020-02-11 2020-02-09 3 0.666667
然后我们使用交叉表:
df2 = (
pd.crosstab(df1["customer_id"], df1.index, df1["timedelta"], aggfunc="first")
.add_suffix("_visits")
.reset_index(0)
)
print(df2)
col_0 customer_id KFC_visits McDonalds_visits
0 Joe 1.500000 1.500000
1 John 0.666667 0.666667
2 Mary 0.500000 0.666667
或我们常驻大师的精彩台词 Scott Boston
df.groupby(["customer_id", "shop"])["date_of_transaction"].agg(
lambda x: (np.ptp(x) / np.timedelta64(1, "D")) / x.count()
).unstack(1).add_suffix('_visits')
shop KFC_visits McDonalds_visits
customer_id
Joe 1.500000 1.500000
John 0.666667 0.666667
Mary 0.500000 0.666667
关于python - Groupby 客户和商店 - 获得平均交易频率。日期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64123587/
我听过很多次公司喜欢HBase的强一致性。我阅读了 HBase 并喜欢它。然后我想到了mongodb write和那时候的区别。查了一下MongoDB似乎也有很强的一致性。但它是一致的吗?看起来 HB
区块链入门 ③ - 交易 交易 概述 比特币交易本质上包含交易参与者价值转移的相关信息数据结构。比特币区块链是一本全球复式记账总账簿,每笔交易都是在比特币区块链上的一个公开记录.
我有以下情况: 我正在迭代我的Affiliate 实体,对于每个实体,我需要在一个唯一的事务中保存和更新数据。因此,我有一个服务,其方法用 Spring @Transactional 注释(其中创建和
我无法理解 DaoManager 的默认行为。 DaoManager.createDao(connectionSource, theClass); 这需要一个 connectionSource - 而
我是 Spring 新手,有一个关于事务的问题。 我知道对于每个 http 请求都有一个 servlet 线程,它有自己的堆栈。据我所知,所有局部变量和方法都驻留在堆栈上。因此,如果我有一个方法 pu
我想设计一个简单的应用程序(没有 j2ee 和 jms),可以处理大量消息(比如在交易系统中) 我创建了一个服务,可以接收消息并将它们放入队列中,这样系统就不会在过载时卡住。 然后我创建了一个包装队列
如果使用 PDO 事务,是否需要锁定表? 如果用户 a 有 50 笔钱,将 50 笔转给用户 b,PDO 交易是否会确保它们都无误地执行? 另外,如果说我有一个 if 语句, if ($user['m
我正在实现一个方法,它会做类似的事情: ... try { myPojo.setProperty("foo"); myService.execute(myPojo); } catch (E
我正在尝试使用 ActiveRecord::Base.transaction。我认为使用 Rails 1.2.6 和 mysql 5.0 默认情况下回滚不起作用。多玩一点我发现 autocommit
我在我的网站上使用嵌入式支付,支付交易直接从买家到卖家发起,服务充当 API 调用方。商品价格由卖家以美元设定,以简化国际贸易。 当发件人和收件人都是俄罗斯居民时,发件人会收到错误消息: The pa
如果我删除我的应用程序中的数据,然后重新购买一些我知道该帐户已经拥有的托管 IAP,iOS 会给我原生的“您确定要重新购买该项目吗?您不会被收取费用”对话框。这符合预期。 当购买返回到我的应用程序时,
我一直在阅读 transactions & jooq但我很难看到如何在实践中实现它。 假设我为 JOOQ 提供了一个自定义 ConnectionProvider,它恰好使用了一个自动提交设置为 fal
我们正在使用 Entity Framework 并在事务范围内运行单元测试。我们最初在标题中遇到错误。 我已经设法将问题隔离开来。 using (TransactionScope scope1 = n
我有一个注册页面,基本上我需要将数据插入到 4 个表中。我是 PDO 的新手,对某些事情感到困惑。 基本上,如果任何插入失败,我不想向数据库中添加任何内容,这看起来很简单。 我的困惑是,我需要首先在我
我使用枢轴点进行交易。我在屏幕指示器上使用以下指标“CM_Pivots_Filtered”、“Pivots”、“CD_PivotR”和“CM_Gaps_Intra-Day_V2.1”。这些枢轴工作得很
我正在努力解决 Sonar 问题: squid:S2229 "Methods should not call same-class methods with incompatible "@Transa
在我的 Controller 中,我有一些类似的代码... ... if user.save something = Something.where("thing = ?", thing)
我使用 StoreKit 进行应用内购买。我发现当用户按下“取消”按钮时,API 的行为很奇怪。 例如,如果我在“确认您的应用内购买”屏幕上按“取消”,我会收到一个带有 error.code == S
AppStore 在自动续订自动续订订阅时是否会发出交易?如果是这样,如果应用程序将自己设置为观察者,那么下次应用程序加载时是否可以可靠地检测到它: [[SKPaymentQueue defaultQ
我正在研究 EMV 技术,并寻找终端和发行者之间的通信(请求/响应)以进行授权/在线 PIN 检查。 我知道离线数据验证仅在终端上进行检查,然后终端将数据发送给发行者。我想知道授权过程需要发送哪些数据
我是一名优秀的程序员,十分优秀!