gpt4 book ai didi

python - 通过 python 优化 pandas group

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:44 25 4
gpt4 key购买 nike

我有一个包含产品契约(Contract)的数据框(带有Product_ID)。这些合约在特定日期 (StartDate) 开仓,并在特定时刻 (CloseDate) 关闭。也有可能合约此时处于活跃状态,因此没有 CloseDate。

有多个客户端拥有契约(Contract),由 ID 引用。这些客户在特定时刻填写调查,该时刻由日期 (Key_Date) 表示。

我想要计算的是多个功能,但在这个示例中,我将重点关注独特产品的数量。我想知道某个客户在填写调查问卷时有多少种独特的产品。

我们有一个数据框df_result,其中包含客户的 ID 以及他们填写调查的日期。在此数据框中,我们还将附加计算出的特征:

import pandas as pd
import numpy as np
np.random.seed(256)
df_result = pd.DataFrame({'ID' : np.random.randint(3, size=(10)),
'Key_Date' : pd.date_range(start=pd.datetime(2015, 5, 21), periods=10, freq='m')})
df_result.head()

ID Key_Date
0 0 2015-05-31
1 2 2015-06-30
2 1 2015-07-31
3 0 2015-08-31
4 1 2015-09-30

我们还有一个包含不同契约(Contract)/产品的数据框,名为df_products:

np.random.seed(321)
df_products = pd.DataFrame({'ID' : np.random.randint(5, size=(10)),
'Product_ID' : np.random.randint(low = 101, high = 104, size=10),
'StartDate' : pd.date_range(start=pd.datetime(2015, 3, 1), periods=10, freq='m'),
'CloseDate' : pd.date_range(start=pd.datetime(2016, 1, 1), periods=10, freq='m')})
df_products.head()

CloseDate StartDate ID Product_ID
0 2016-01-31 2015-03-31 4 102
1 2016-02-29 2015-04-30 2 101
2 2016-03-31 2015-05-31 4 102
3 2016-04-30 2015-06-30 1 102
4 2016-05-31 2015-07-31 0 103

我创建了一个函数来计算填写调查的客户的独特产品,其中契约(Contract)在填写时仍然有效,key_date(因此契约(Contract)的开始日期(StartDate) 在此日期之前,结束日期 (CloseDate) 在此日期之后。我还希望能够在填写日期之前给出一个范围,例如去年活跃的所有独特产品。因此,即使是 11 个月前关闭的契约(Contract)也将包括在内。我通过提供一个额外的参数timeperiod来实现这一点,我减去填充的日期(创建一个新日期:low_date)。然后,CloseDate 必须晚于 low_date,而不是 key_date

def unique_products(df,timeperiod,ID,key_date):
low_date = key_date - relativedelta(months=timeperiod)
data = df.loc[(df['StartDate'] <= key_date) &
(df['CloseDate'] >= low_date) &
(df['ID'] == ID)].groupby(['ID'], as_index = False)['Product_ID'].nunique().reset_index()
if 'Product_ID' in list(data):
try:
return float(data['Product_ID'])
except:
return np.nan

此后,我将这些值附加到 df_result 中名为 unique_products 的新列中:

df_result['unique_products'] = df_result.apply(lambda row: unique_products(df_products, 3, row['ID'], row['Key_Date']), axis=1)
df_result.head()


ID Key_Date unique_products
0 0 2015-05-31 NaN
1 2 2015-06-30 1.0
2 1 2015-07-31 1.0
3 0 2015-08-31 1.0
4 1 2015-09-30 2.0

但是,当将此应用于我的整个日期集时,由于必须评估每个调查行(因为它们具有不同的时间)这一事实,它变得非常慢。有什么办法可以改善这个问题吗?

感谢您的任何意见:)

最佳答案

您需要使用合并。

merged = pd.merged(df_products,df_results,how='left',on='ID')

现在合并将包含 df_products 的所有列以及“关键日期”,如果为空,则该人尚未填写调查。

filled_survey = merged.loc[~(merged['Key Date'].isnull())]

现在您可以通过减去相关日期来找到时间增量并进行相应的过滤。

关于python - 通过 python 优化 pandas group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45302034/

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