首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在指定的Pandas日期范围内使用Python ()

在指定的Pandas日期范围内使用Python ()
EN

Stack Overflow用户
提问于 2020-11-14 18:17:21
回答 1查看 109关注 0票数 0

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

在Excel中,通过使用产品函数(基于最近更新日期的起点(在本例中为01/10/2020) ),只需将每个起点元素的产品功能总和乘以此产品功能,就可以得到当前更新日期的总和,并按元素值进行细分。

我想用Python编写这篇文章,但是除了Python3.8Python()的基本信息之外,我似乎没有任何可以在线找到的信息来解决/帮助我解决这个问题。

我有以下3种Pandas数据(我从Excel复制数据并粘贴在下面的链接中,以便于解释,但我已经将这些数据作为数据导入到我的测试代码中)。

数据以这种形式提供,需要整理在一起,按成员权利的不同元素细分的重估需要从开始日期(" StartDate ")到当前的“更新”日期(01/10/2020) --如果可能的话,还需要在StartDate到第一次更新日期(相当于Excel函数)之间按比例计算。

这3种数据格式如下:

  1. 具有某些基本信息的成员标识符。最重要的数据是‘StartDate’列,因为它是重新评估成员利益的点。它需要一个函数来计算,我在这里猜测,从TimeDelta (以月为单位)从StartDate到成员的第一次续约日期,这需要是一个比例的差异,例如,第一名成员开始于2016年01月02,所以第一次更新需要有一个8个月的比例。我还想设置一个布尔值,如果是True,则按比例计算,否则它不会

MemberID和StartDates列表

  1. 增加因素元素要么增加,要么保持水平(价值永远不会减少)

按年份分列的增长率(使用的指数是更新日期)

  1. 成员资产-通过成员标识符(MemberID)链接到(1)。这些不同的元素应该通过(2)中的增长因素而升级,而这些数字是StartDate中的元素。

StartDate元素

本质上,函数需要计算第一个更新日期在StartDate之后的时间,如果布尔值为True,则按比例递增,然后计算StartDate和最近更新日期之间的更新日期范围和增加因子,最后将产品应用于StartDate元素的此日期范围。

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

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

编辑:请看我正在使用的这个临时解决方案,但是它没有StartDate与第一次增长日期之间的第一次增长的比例:解决方案(不按比例计算)

  • 在本例中,MemberID函数应该会发现StartDate之后的第一次增长为01/10/2016 (DD/MM/YYYY)
  • 然后,该职能应检查2016年10月1日至2020年1月10日之间每一项更新日期的增加情况。Excel产品公式给出的元素分别为: 1.38823,1.20396和1.20462,元素1到3。
  • 最后,将来自StartDate的元素乘以每个部分的乘积总数,以获得当前值。
EN

Stack Overflow用户

回答已采纳

发布于 2020-11-14 21:43:46

我在这里做了一些应该给你一个入门的东西。第一个代码块只是重新创建数据。第二个块对每个成员进行迭代,获取适当的更新日期,然后在整个DataFrames中将获取的行相乘。

由于在成员it上使用显式的for-循环而不是广播,它的效率并不高,但它应该会让您开始工作。

代码语言:javascript
复制
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)

我的方法,你可以学习:

代码语言:javascript
复制
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)

无评论/印刷:

代码语言:javascript
复制
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') )

结果:

代码语言:javascript
复制
           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
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64837139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档