在指定的 Pandas 日期范围内使用 Python math.prod()
Using the Python math.prod() in a specified Pandas date range
我对 Python 比较陌生,但我遇到了一个复杂的问题,我认为它需要几个不同的函数,但我不知道从哪里开始。
在 Excel 中,通过使用 PRODUCT 函数,基于到最近续订日期(在本例中为 01/10/2020)的起点,并且只需将每个起点元素的此 Product 函数总计相乘,即可得出当前续订日期总计,按元素值细分。
我想在 Python 中写这个但是除了 Python 3.8 math.prod() 上的非常基本的信息之外,我似乎没有更多的东西可以找到在线与 resolve/assist 我联系。
我有以下 3 个 Pandas 数据帧(我从 Excel 复制数据并粘贴到下面的链接中以便于解释,但我在测试中将它们作为数据帧导入代码)。
数据以这种形式出现,需要整理在一起,重估按成员权利的不同要素细分,需要从开始日期(“开始日期”)到当前的“更新”日期 (01/10/2020) - 如果可能,还需要在 StartDate 到第一个更新日期之间的完整月份中按比例完成(相当于 Excel YEARFRAC 函数)。
3 个数据帧是:
- 具有一定基本信息的成员标识符。最重要的数据是“开始日期”列,因为它是重新评估会员利益的关键。它需要有一个函数来计算,我在这里猜测,从 StartDate 到会员的第一个续订日期的 TimeDelta(以月为单位),这需要按比例计算差异,例如第一位成员于 01/02/2016 开始,因此第一次续订需要按比例分配 8 个月。我还想设置一个布尔值,如果为真,则按比例发生,否则不会
List of MemberIDs and StartDates
- 增加因素。元素将增加或保持水平(从不减少值)
Increase rates by year (index used is the Renewal Date)
- 会员资产 - 通过会员标识符 (MemberID) 链接到 (1)。这些不同的元素应按 (2) 中的增加因子升级,这些数字是截至开始日期的元素。
StartDate elements
本质上,函数需要计算第一个续订日期晚于 StartDate 的时间,如果布尔值为 True,则应用按比例增加,然后计算出续订日期的范围和增加因子StartDate 和最新续订日期,最后在 StartDate 元素上应用此日期范围内的产品。
由于这是我的第一个 post,如果它不是您可能期望的格式或任何 Python 代码,我深表歉意,因为我是 Python 的新手和 Whosebug(他们甚至不允许我直接 post 表格,仅作为图像链接)。由于数据保护,我提供的数据是虚拟日期,但相对基于实际数据。
如有任何问题,我很乐意提供更多信息。提前感谢您的帮助!
编辑:
请参阅我正在使用的这个临时解决方案,但它没有从 StartDate 到第一次增加日期之间的第一次增加的比例:
Solution (without pro-rata)
- 示例中的MemberID,Python函数应该找到StartDate之后的第一个增加为01/10/2016 (DD/MM/YYYY)
- 然后该函数应检查续订日期在 01/10/2016 和最新续订日期 01/10/2020 之间按每个元素增加。 Excel PRODUCT 公式给出的元素增量为:元素 1 到 3 分别为 1.38823、1.20396 和 1.20462
- 最后,将 StartDate 中的元素乘以每个部分的 PRODUCT 总数,得到当前值
我在这里整理了一些内容,应该可以为您提供入门知识。第一个代码块只是重新创建您的数据。第二个块遍历每个成员,获取适当的更新日期,然后将获取的行乘以跨 DataFrame。
由于在成员 id 上使用显式 for 循环而不是广播,因此效率不高,但它应该可以帮助您入门。
import pandas as pd
df_startDate = pd.DataFrame({
'StartDate': pd.to_datetime(['01/02/2016', '10/04/2017', '29/09/2018', '05/11/2018']),
}, index=['9000001', '9000023', '9004561', '9007910'])
df_renewals = pd.DataFrame({
'Element 1': [1.05, 1.04, 1.06, 1.10, 1.08, 1.06],
'Element 2': [1.03, 1.02, 1.07, 1.05, 1.03, 1.02],
'Element 3': [1.04, 1.04, 1.05, 1.03, 1.02, 1.05],
}, index=pd.to_datetime(['01/10/'+str(i) for i in range(2015, 2021)]))
df_assets = pd.DataFrame({
'Element 1': [1000, 1500, 2000, 1750],
'Element 2': [1500, 2000, 2500, 2000],
'Element 3': [2000, 2500, 3000, 2250],
}, index=['9000001', '9000023', '9004561', '9007910'])
print(df_startDate)
print(df_renewals)
print(df_assets)
我的学习方法:
results = pd.DataFrame(columns=['Element 1', 'Element 2', 'Element 3'])
for member_id in df_startDate.index:
print('******')
print(member_id)
# Get rows between the StartDate and the current date
df_factors = df_renewals.loc[df_startDate['StartDate'].loc[member_id]: pd.Timestamp.now()]
print(df_factors, end='\n\n')
# Multiply rows together to get total factor
prod_factors = df_factors.product(axis='index')
print(prod_factors.to_frame().T, end='\n\n')
# Multiply factor with base value
results.loc[member_id] = df_assets.loc[member_id].mul(prod_factors)
print(results.loc[member_id].to_frame().T, end='\n\n')
print(results)
没有comments/printing:
results = pd.DataFrame(columns=['Element 1', 'Element 2', 'Element 3'])
for member_id in df_startDate.index:
df_factors = df_renewals.loc[df_startDate['StartDate'].loc[member_id]: pd.Timestamp.now()]
results.loc[member_id] = df_assets.loc[member_id].mul( df_factors.product(axis='index') )
结果:
Element 1 Element 2 Element 3
9000001 1388.230272 1805.934123 2409.23592
9000023 1888.920000 2206.260000 2757.82500
9004561 2289.600000 2626.500000 3213.00000
9007910 2003.400000 2101.200000 2409.75000
我对 Python 比较陌生,但我遇到了一个复杂的问题,我认为它需要几个不同的函数,但我不知道从哪里开始。
在 Excel 中,通过使用 PRODUCT 函数,基于到最近续订日期(在本例中为 01/10/2020)的起点,并且只需将每个起点元素的此 Product 函数总计相乘,即可得出当前续订日期总计,按元素值细分。
我想在 Python 中写这个但是除了 Python 3.8 math.prod() 上的非常基本的信息之外,我似乎没有更多的东西可以找到在线与 resolve/assist 我联系。
我有以下 3 个 Pandas 数据帧(我从 Excel 复制数据并粘贴到下面的链接中以便于解释,但我在测试中将它们作为数据帧导入代码)。
数据以这种形式出现,需要整理在一起,重估按成员权利的不同要素细分,需要从开始日期(“开始日期”)到当前的“更新”日期 (01/10/2020) - 如果可能,还需要在 StartDate 到第一个更新日期之间的完整月份中按比例完成(相当于 Excel YEARFRAC 函数)。
3 个数据帧是:
- 具有一定基本信息的成员标识符。最重要的数据是“开始日期”列,因为它是重新评估会员利益的关键。它需要有一个函数来计算,我在这里猜测,从 StartDate 到会员的第一个续订日期的 TimeDelta(以月为单位),这需要按比例计算差异,例如第一位成员于 01/02/2016 开始,因此第一次续订需要按比例分配 8 个月。我还想设置一个布尔值,如果为真,则按比例发生,否则不会
List of MemberIDs and StartDates
- 增加因素。元素将增加或保持水平(从不减少值)
Increase rates by year (index used is the Renewal Date)
- 会员资产 - 通过会员标识符 (MemberID) 链接到 (1)。这些不同的元素应按 (2) 中的增加因子升级,这些数字是截至开始日期的元素。
StartDate elements
本质上,函数需要计算第一个续订日期晚于 StartDate 的时间,如果布尔值为 True,则应用按比例增加,然后计算出续订日期的范围和增加因子StartDate 和最新续订日期,最后在 StartDate 元素上应用此日期范围内的产品。
由于这是我的第一个 post,如果它不是您可能期望的格式或任何 Python 代码,我深表歉意,因为我是 Python 的新手和 Whosebug(他们甚至不允许我直接 post 表格,仅作为图像链接)。由于数据保护,我提供的数据是虚拟日期,但相对基于实际数据。
如有任何问题,我很乐意提供更多信息。提前感谢您的帮助!
编辑: 请参阅我正在使用的这个临时解决方案,但它没有从 StartDate 到第一次增加日期之间的第一次增加的比例: Solution (without pro-rata)
- 示例中的MemberID,Python函数应该找到StartDate之后的第一个增加为01/10/2016 (DD/MM/YYYY)
- 然后该函数应检查续订日期在 01/10/2016 和最新续订日期 01/10/2020 之间按每个元素增加。 Excel PRODUCT 公式给出的元素增量为:元素 1 到 3 分别为 1.38823、1.20396 和 1.20462
- 最后,将 StartDate 中的元素乘以每个部分的 PRODUCT 总数,得到当前值
我在这里整理了一些内容,应该可以为您提供入门知识。第一个代码块只是重新创建您的数据。第二个块遍历每个成员,获取适当的更新日期,然后将获取的行乘以跨 DataFrame。
由于在成员 id 上使用显式 for 循环而不是广播,因此效率不高,但它应该可以帮助您入门。
import pandas as pd
df_startDate = pd.DataFrame({
'StartDate': pd.to_datetime(['01/02/2016', '10/04/2017', '29/09/2018', '05/11/2018']),
}, index=['9000001', '9000023', '9004561', '9007910'])
df_renewals = pd.DataFrame({
'Element 1': [1.05, 1.04, 1.06, 1.10, 1.08, 1.06],
'Element 2': [1.03, 1.02, 1.07, 1.05, 1.03, 1.02],
'Element 3': [1.04, 1.04, 1.05, 1.03, 1.02, 1.05],
}, index=pd.to_datetime(['01/10/'+str(i) for i in range(2015, 2021)]))
df_assets = pd.DataFrame({
'Element 1': [1000, 1500, 2000, 1750],
'Element 2': [1500, 2000, 2500, 2000],
'Element 3': [2000, 2500, 3000, 2250],
}, index=['9000001', '9000023', '9004561', '9007910'])
print(df_startDate)
print(df_renewals)
print(df_assets)
我的学习方法:
results = pd.DataFrame(columns=['Element 1', 'Element 2', 'Element 3'])
for member_id in df_startDate.index:
print('******')
print(member_id)
# Get rows between the StartDate and the current date
df_factors = df_renewals.loc[df_startDate['StartDate'].loc[member_id]: pd.Timestamp.now()]
print(df_factors, end='\n\n')
# Multiply rows together to get total factor
prod_factors = df_factors.product(axis='index')
print(prod_factors.to_frame().T, end='\n\n')
# Multiply factor with base value
results.loc[member_id] = df_assets.loc[member_id].mul(prod_factors)
print(results.loc[member_id].to_frame().T, end='\n\n')
print(results)
没有comments/printing:
results = pd.DataFrame(columns=['Element 1', 'Element 2', 'Element 3'])
for member_id in df_startDate.index:
df_factors = df_renewals.loc[df_startDate['StartDate'].loc[member_id]: pd.Timestamp.now()]
results.loc[member_id] = df_assets.loc[member_id].mul( df_factors.product(axis='index') )
结果:
Element 1 Element 2 Element 3
9000001 1388.230272 1805.934123 2409.23592
9000023 1888.920000 2206.260000 2757.82500
9004561 2289.600000 2626.500000 3213.00000
9007910 2003.400000 2101.200000 2409.75000