【问题标题】:Calculate MRR in Python Pandas dataframe在 Python Pandas 数据框中计算 MRR
【发布时间】:2021-03-25 01:18:43
【问题描述】:

我有一个包含以下列的 Pandas 数据框

date | months | price

我计算了一些基本的 BI 指标。我通过对日期的数据框进行分组并总结价格来计算净收入:

df = df[["Date", "Price"]].groupby(df['Date'])["Price"].sum().reset_index()

现在,我想找到与净收入类似的 MRR,但如果列月份超过 1 个月,则价格应平均“移动”到下个月。而且,它是按月而不是按天分组的。

例如,如果我在 2016 年 1 月,我有 3 个月的行,价格为 30 美元,我应该将 10 美元加到 1 月,10 美元到 2 月,10 美元到 3 月。

我的第一个想法是遍历数据框,跟踪月份和我应该在下个月“移动”的价格金额,并手动创建一个新的数据框。

但是,首先,Pandas 中是否有任何 Pythonic 方式可以做到这一点?

重现数据框的数据:

import pandas as pd
df = pd.DataFrame({'date': ['01-01-2016', '05-01-2016', '10-01-2016','04-02-2016'], 
                   'months': [1, 3, 1, 6],
                   'price': [40, 60, 20, 60]})

想要的结果:

Date         | MRR
January 2016 | 80
February 2016| 30
March 2016   | 10
April 2016   | 10
May 2016     | 10
June 2016    | 10
July 2016    | 10

每一行的计算结果都是这样的

January 2016 = 40 + 20 + 20 + 0
February 2016 = 0 + 20 + 0 + 10
March 2016 = 0 + 0 + 0 + 10
April 2016 = 0 + 0 + 0 + 10
May 2016 = 0 + 0 + 0 + 10
June 2016 = 0 + 0 + 0 + 10
July 2016 = 0 + 0 + 0 + 10

【问题讨论】:

  • 您可以通过提供一些玩具数据使这个问题变得更好。这有助于人们在发布之前快速尝试他们的答案。
  • 谢谢两位,我添加了一些数据,如果这些不再起作用,我会添加更多。
  • 感谢您的样品 - 什么是所需的输出?
  • @jezrael 现在好点了吗?我还添加了计算 MRR 的数学方法

标签: python pandas dataframe business-intelligence


【解决方案1】:

我不知道如何使用循环。不过,我可以建议一种使代码非常干净和高效的方法。

首先,让我们加载您在问题文本中提供的示例数据:

df = pd.DataFrame({'date': ['01-01-2016', '05-01-2016', '10-01-2016','04-02-2016'], 
                   'months': [1, 3, 1, 6],
                   'price': [40, 60, 20, 60]})

为了使用 Panda 的日期功能(例如按月份分组),我们将使用 date 列作为索引。一个DateTimeIndex其实:

df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y')
df = df.set_index('date')

现在,例如通过使用 resample 函数来查看逐月摘要真的很容易,该函数的工作原理与您已经知道的 groupby 函数类似,但使用时间段:

df.resample('M').sum()

现在在多个月内“展开”months 列 > 1 的行。我的方法是为每一行生成一个新的DataFrame

dfs = []
for date, values in df.iterrows():
    months, price = values
    dfs.append(
        pd.DataFrame(
            # Compute the price for each month, and repeat this value
            data={'price': [price / months] * months},
            # The index is a date range for the requested number of months
            index=pd.date_range(date, periods=months, freq='M')
        )
    )

现在我们可以将DataFrames 的列表连接起来,重新采样到月份并求和:

pd.concat(dfs).resample('M').sum()

输出:

            price
2016-01-31     80
2016-02-29     30
2016-03-31     30
2016-04-30     10
2016-05-31     10
2016-06-30     10
2016-07-31     10

请参阅http://pandas.pydata.org/pandas-docs/stable/timeseries.html,了解 Panda 在时间方面可以做的所有酷事。例如,要准确产生您想要的输出,您可以这样做:

output.index = output.index.strftime('%B %Y')

结果如下:

               price
January 2016      80
February 2016     30
March 2016        30
April 2016        10
May 2016          10
June 2016         10
July 2016         10

【讨论】:

  • 尝试了几次,但它总是返回一个值,而不是包含月份和价格总和的数据框。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多