Python 3.x 在指定的日期范围内使用Python math.prod()

Python 3.x 在指定的日期范围内使用Python math.prod(),python-3.x,pandas,dataframe,python-datetime,Python 3.x,Pandas,Dataframe,Python Datetime,我对Python比较陌生,但我有一个复杂的问题,我认为需要几个不同的函数,但我不知道从哪里开始 在Excel中,使用产品函数非常简单,它基于最新续订日期之前的起始点(在本例中为2020年10月1日),简单地乘以每个起始点元素的产品函数总数,得到当前续订日期总数,并按元素值细分 我想用Python写这篇文章,但是除了关于Python3.8 math.prod()的基本信息外,我似乎没有其他东西可以在网上找到来解决/帮助我解决这个问题 我有以下3个数据帧(为了便于解释,我从Excel复制了数据并粘贴

我对Python比较陌生,但我有一个复杂的问题,我认为需要几个不同的函数,但我不知道从哪里开始

在Excel中,使用产品函数非常简单,它基于最新续订日期之前的起始点(在本例中为2020年10月1日),简单地乘以每个起始点元素的产品函数总数,得到当前续订日期总数,并按元素值细分

我想用Python写这篇文章,但是除了关于Python3.8 math.prod()的基本信息外,我似乎没有其他东西可以在网上找到来解决/帮助我解决这个问题

我有以下3个数据帧(为了便于解释,我从Excel复制了数据并粘贴在下面的链接中,但我已经在测试代码中将它们作为数据帧导入)

数据以这种形式出现,需要将其整理在一起,并根据成员权利的不同要素进行重新估价,需要从开始日期(“起始日期”)到当前“续约”日期(2020年10月1日)-如果可能,从开始日期到第一个续约日期(相当于Excel YEARFRAC函数),还需要在完整的月份内按比例完成

这3个数据帧是:

  • 具有某些基本信息的成员标识符。最重要的数据是“StartDate”列,因为它是重新评估会员从中受益的点。我猜它需要有一个函数来计算从开始日期到会员第一次续约日期的时间增量(以月为单位),该时间增量需要是差额的比例,例如,第一个会员于2016年2月1日开始,因此第一次续约需要8个月的比例。我还想设置一个布尔值,如果为True,则按比例发生,否则不发生
  • 增加因素。元素将增加或保持水平(值从不减少)
  • 成员资产-通过成员标识符(MemberID)链接到(1)。这些不同的要素应按(2)中的增加系数递增,这些数字为起始日期的要素
  • 本质上,函数需要计算第一个续订日期何时在StartDate之后,如果布尔值为True,则按比例增加,然后计算续订日期范围和StartDate与最新续订日期之间的增加系数,最后将此日期范围的积数应用于StartDate元素

    这是我的第一篇帖子,如果它的格式与您可能期望的格式不符,或者与任何Python代码不符,我深表歉意,因为我对Python和StackOverflow非常陌生(他们甚至不允许我直接发布表,仅作为图像链接)。由于数据保护的原因,我提供的数据是虚拟日期,但相对地基于实际数据

    如果您有任何问题,我很乐意提供更多信息。提前谢谢你的帮助

    编辑: 请查看我正在使用的临时解决方案,但它没有从开始日期到第一个增加日期之间的第一次增加的比例:

    • 示例中的MemberID,Python函数应该在2016年10月1日(DD/MM/YYYY)开始日期之后找到第一次增加
    • 然后,职能部门应检查2016年10月1日至2020年10月1日的最新续约日期之间各要素的续约日期增加情况。Excel乘积公式给出的元素增量为:元素1到3分别为1.38823、1.20396和1.20462
    • 最后,StartDate中的元素乘以每个批次的产品总数,得到当前值

    我在这里加了一个东西,应该给你一个入门的。第一个代码块只是重新创建数据。第二个块迭代每个成员,获取适当的续订日期,然后将获取的行与数据帧相乘

    由于使用显式for loop-over成员ID而不是广播,它的效率可能不如使用显式for loop-over成员ID那样高,但它应该可以让您开始使用

    将熊猫作为pd导入
    df_startDate=pd.DataFrame({
    “开始日期”:pd.截止日期时间(2016年2月1日、2017年4月10日、2018年9月29日、2018年11月5日),
    },索引=['90000001','9000023','9004561','9007910'])
    df_续订=pd.DataFrame({
    “要素1”:[1.05,1.04,1.06,1.10,1.08,1.06],
    “要素2”:[1.03,1.02,1.07,1.05,1.03,1.02],
    “要素3”:[1.04,1.04,1.05,1.03,1.02,1.05],
    },index=pd.to_datetime(['01/10/'+str(i)表示范围内的i(2015、2021)])
    df_assets=pd.DataFrame({
    “元素1”:[1000150020001750],
    ‘要素2’:[15002000250020000],
    “要素3”:[2000、2500、3000、2250],
    },索引=['90000001','9000023','9004561','9007910'])
    打印(df_开始日期)
    打印(df_更新)
    打印(df_资产)
    
    你可以学习我的方法:

    results=pd.DataFrame(列=['Element 1','Element 2','Element 3']
    对于df_startDate.index中的成员id:
    打印(“*******”)
    打印(成员id)
    #获取StartDate和当前日期之间的行
    df_factors=df_renewals.loc[df_startDate['startDate'].loc[member_id]:pd.Timestamp.now()]
    打印(df_因子,结束='\n\n')
    #将行相乘得到总因子
    产品系数=df系数。产品(轴=指数)
    打印(prod_factors.to_frame().T,end='\n\n')
    #将因子与基值相乘
    results.loc[member\u id]=df\u assets.loc[member\u id].mul(生产因素)
    打印(results.loc[member\u id]。到\u frame().T,end='\n\n')
    打印(结果)
    
    无注释/打印:

    results=pd.DataFrame(列=['Element 1','Element 2','Element 3']
    对于df_startDate.index中的成员id:
    df_factors=df_renewals.loc[df_startDate['startDate'].loc[member_id]:pd.Timestamp.now()]
    results.loc[member\u id]=df\u assets.loc[member\u id].mul(df\u factors.product(axis='index'