python - 如何根据某些条件迭代 Pandas DataFrame 以创建新的 DateFrame
问题描述
我已将 csv 文件导入到带有销售管道数据的 Pandas DataFrame。每条线代表一个机会,包括潜在客户名称、产品信息、管道阶段、概率、预期交易规模、预期结束日期、持续时间等。
现在我想将其转换为销售预测,我想通过将交易规模除以持续时间乘以概率来计算每个时期的平均收入。然后根据预期的结束日期和持续时间为所有可能的期间创建一条线。
我创建了一个简化的示例来支持我的问题:
import pandas as pd
pipeline_data = [{'Client': 'A', 'Stage': 'suspect', 'Probability': '0.25', 'Dealsize': '1200', 'Duration': 6, 'Start_period': '2020-08'}, {'Client': 'B', 'Stage': 'prospect', 'Probability': '0.60', 'Dealsize': '1000', 'Duration': 4, 'Start_period': '2020-10'}]
df = pd.DataFrame(pipeline_data)
df
输出:
Client Stage Probability Dealsize Duration Start_period
0 A suspect 0.25 1200 6 2020-08
1 B prospect 0.60 1000 4 2020-10
因此,客户每月的平均收入为 1200 / 6 * 0.25 = 50。收入将在 2020 年 8 月至 2021 年 1 月期间下降(即从 2020 年 8 月到 2021 年 1 月)。
首选输出是:
Client Stage Probability Dealsize Duration Start_period Weighted_revenue Period
0 A suspect 0.25 1200 6 2020-08 50 2020-08
1 A suspect 0.25 1200 6 2020-08 50 2020-09
2 A suspect 0.25 1200 6 2020-08 50 2020-10
3 A suspect 0.25 1200 6 2020-08 50 2020-11
4 A suspect 0.25 1200 6 2020-08 50 2020-12
5 A suspect 0.25 1200 6 2020-08 50 2021-01
6 B prospect 0.60 1000 4 2020-10 150 2020-10
7 B prospect 0.60 1000 4 2020-10 150 2020-11
8 B prospect 0.60 1000 4 2020-10 150 2020-12
9 B prospect 0.60 1000 4 2020-10 150 2021-01
我已经将 Start_period 转换为 Period 类型,因此它可以用于计算/迭代。
我对编码很陌生。我试图在这个网站和其他网站上找到答案,但到目前为止还没有成功。我可以想象使用某种嵌套循环和附加函数来解决这个问题,但我不知道如何在 Pandas 中使用它......
任何帮助将不胜感激!
解决方案
您可以尝试使用列表理解,pd.date_range
并且explode
df['Weighted_revenue']=(df['Dealsize'].astype(float)/df['Duration'].astype(float))*df['Probability'].astype(float)
df['Period']=[pd.date_range(x, periods=y, freq="M").strftime('%Y-%m') for x,y in zip(df["Start_period"], df["Duration"])]
df=df.explode('Period')
输出:
df
Client Stage Probability Dealsize Duration Start_period Weighted_revenue Period
0 A suspect 0.25 1200 6 2020-08 50.0 2020-08
0 A suspect 0.25 1200 6 2020-08 50.0 2020-09
0 A suspect 0.25 1200 6 2020-08 50.0 2020-10
0 A suspect 0.25 1200 6 2020-08 50.0 2020-11
0 A suspect 0.25 1200 6 2020-08 50.0 2020-12
0 A suspect 0.25 1200 6 2020-08 50.0 2021-01
1 B prospect 0.60 1000 4 2020-10 150.0 2020-10
1 B prospect 0.60 1000 4 2020-10 150.0 2020-11
1 B prospect 0.60 1000 4 2020-10 150.0 2020-12
1 B prospect 0.60 1000 4 2020-10 150.0 2021-01
细节:
首先,我们'Weighted_revenue'
使用您描述的公式创建列:
df['Weighted_revenue']=(df['Dealsize'].astype(float)/df['Duration'].astype(float))*df['Probability'].astype(float)
df
Client Stage Probability Dealsize Duration Start_period Weighted_revenue
0 A suspect 0.25 1200 6 2020-08 50.0
1 B prospect 0.60 1000 4 2020-10 150.0
然后,我们使用列表推导式 ,zip
来创建基于'Start_period'
和'Duration'
列的日期范围
df['Period']=[pd.date_range(x, periods=y, freq="M").strftime('%Y-%m') for x,y in zip(df["Start_period"], df["Duration"])]
df
Client Stage Probability Dealsize Duration Start_period Weighted_revenue Period
0 A suspect 0.25 1200 6 2020-08 50.0 [2020-08, 2020-09, 2020-10, 2020-11, 2020-12, 2021-01]
1 B prospect 0.60 1000 4 2020-10 150.0 [2020-10, 2020-11, 2020-12, 2021-01]
最后我们explode
用来扩展列表:
df=df.explode('Period')
df
Client Stage Probability Dealsize Duration Start_period Weighted_revenue Period
0 A suspect 0.25 1200 6 2020-08 50.0 2020-08
0 A suspect 0.25 1200 6 2020-08 50.0 2020-09
0 A suspect 0.25 1200 6 2020-08 50.0 2020-10
0 A suspect 0.25 1200 6 2020-08 50.0 2020-11
0 A suspect 0.25 1200 6 2020-08 50.0 2020-12
0 A suspect 0.25 1200 6 2020-08 50.0 2021-01
1 B prospect 0.60 1000 4 2020-10 150.0 2020-10
1 B prospect 0.60 1000 4 2020-10 150.0 2020-11
1 B prospect 0.60 1000 4 2020-10 150.0 2020-12
1 B prospect 0.60 1000 4 2020-10 150.0 2021-01
推荐阅读
- ssis - 如何增加 SSIS 脚本任务的超时时间
- python - 较小子集中数据帧中基于标签的索引不分配值
- ruby-on-rails - 连接到用户帐户
- python - 如何将数据从views.py连续发送到Django中的html模板?
- azure-devops - azuredevops rest api:获取推送的提交总是返回 0
- python - Django DRF api 不返回任何值
- python - 如何处理'NoneType'对象在python中不可下标
- c# - Xamarin/SQLite/C# - 如何使用菜单项删除从列表视图和 SQLite 表中删除一行
- deep-learning - 为什么注意力层需要“value”、“key”和“query”?
- android - 三星屏幕镜像启动以编程方式无法在 Galaxy Tab A7 (SM-T500) 上运行