正在查找唯一成员的和#x27;在python中,付款是基于某些日期是否介于某个时间之间

正在查找唯一成员的和#x27;在python中,付款是基于某些日期是否介于某个时间之间,python,pandas,numpy,loops,group-by,Python,Pandas,Numpy,Loops,Group By,这是我第一次询问社区,尽管我过去曾广泛使用该网站寻求帮助。我无法找到解决这个特定问题的方法,而且我相当精通python,因此很难将逻辑放入代码中,尽管我认为逻辑足够清晰。为此,我通过谷歌colab使用python,并在最后共享了一个包含数据的谷歌工作表 在我的场景中,我们有一个开始月、时间长度和支付月。可以通过长度计算结束月份。一个人可以是多个组的一部分,因此可以有多个开始、结束和支付月份 我们的目标是找出一个会员在今天休息时预计要支付多少钱 eg集团于2020年1月开始,为期10个月,将于20

这是我第一次询问社区,尽管我过去曾广泛使用该网站寻求帮助。我无法找到解决这个特定问题的方法,而且我相当精通python,因此很难将逻辑放入代码中,尽管我认为逻辑足够清晰。为此,我通过谷歌colab使用python,并在最后共享了一个包含数据的谷歌工作表

在我的场景中,我们有一个开始月、时间长度和支付月。可以通过长度计算结束月份。一个人可以是多个组的一部分,因此可以有多个开始、结束和支付月份

我们的目标是找出一个会员在今天休息时预计要支付多少钱

eg集团于2020年1月开始,为期10个月,将于2020年10月结束。每月捐款5千元。付款月份是2020年3月。虽然从技术上讲,我们应该得到10笔付款(10个月组),但我们预计只有9笔付款,即45k,因为当付款月到来时,会员不需要支付该月的费用。如果说该集团于2020年12月成立,时间为10个月,那么截至今天,我们预计只需支付5笔款项(12月至4月21日)

例如,当一名成员是3个组的一部分时,这些场景变得复杂,因此有3个开始日期、3个结束日期和3个付款日期,可能还有3个不同的分期付款金额。假设开始日期为1月20日、2月20日、3月20日,所有组均为10个月。我们也可以说在4月20日有一笔支出。在4月20日,所有组都将处于活动状态(月末尚未到达),因此在4月20日(付款月),我们预计所有组都不会付款

这意味着,如果有3个组,并且在任何组的开始和结束月份之间有一笔付款,那么我们将不会期望该组在该月得到付款。如果有两次付款在小组开始和结束月份之间,那么我们预计该月不会有6次付款,每组2次,依此类推。如果说3个组和1个付款介于2个组的日期之间,那么我们将不希望只为这两个组分期付款(这些组的分期付款是什么)

下面的google工作表有一些示例数据。 组ID列是完全唯一的,没有DUP(您可以将其视为发票,因为所有发票都是唯一的)。由于成员可以有多个组,因此成员代码列可以有重复项。不要担心日期中的日子,重要的是月份和年份。我们有开始月、团体长度和支付月。我们还知道该团体的成员每月所欠的金额。

任何帮助或建议都会很好

编辑->我尝试了以下操作,但出现了一个错误:(我对月份进行了编码,即2020年1月=1,2020年2月=2,依此类推,这样我就不必乱搞日期了)

deal\u list=df['Group ID'].tolist()
def分期付款(交易清单):
对于df['member Code'].unique()中的成员:
如果df['code payont']>=df['code Start Month']和df['code
付款月']=组['code Start Month'])。任意()

&(row['Coded Payout Month']我找到了一种解决方法。基本上,我没有尝试遍历所有的行,而是首先通过转置和过滤将我的数据转换为长格式(我对一个成员的所有付款月份进行了筛选,并将结果转换为行。然后我将其推送到colab中,并通过pd.melt将数据转换回每笔交易中唯一的行,并根据需要进行额外的付款。然后运行该条件就足够简单,并最终求和所有真值

我可以解释任何人需要的更多一点。 我从这里得到了灵感:

欢迎来到SO。虽然这不是明确的指南@的一部分,但通常SO问题的期望是简介要简洁。以下是“”原理也适用于博览会。考虑编辑,过滤掉那些对理解你的问题不重要的信息,并把你尝试过的代码整合到你的问题中。
deal_list = df['Group ID'].tolist()

def instalment(deal_list):
  for member in df['Member Code'].unique():
    if df['Coded Payout Month']>=df['Coded Start Month'] and df['Coded 
Payout Month']<=df['Coded End Month']: 
  count_months = count_months + 1
  return count_months * df['Instalment']

instalment(deal_list)

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
grouped = df.groupby('Member Code')

for g_idx, group in grouped:
    for r_idx, row in group.iterrows():
        if (((row['Coded Payout Month'] >= group['Coded Start Month']).any())
         & (row['Coded Payout Month'] <= group['Coded End Month']).any()):
              df.loc[r_idx, 'payout_cut'] =+ 1


print(df)