我正在努力编写一个函数来计算两个选定年份(2019、2020)之间总收入的相对差异.

以下是我的数据:

order_id | price | quantity| date|
1            30       2      20-03-2022
2            50       4      21-04-2020
3            45       3      20-03-2020
4            200      4      21-04-2019
5            54       2      04-03-2020
6            200      4      15-04-2019

这就是我所做的,但任务是编写一个能够做到这一点的函数.(例如def dif():"

df['year'] = pd.DatetimeIndex(df['date']).year 
df['revenue']=df.price*order.quantity   #calculates revenue for each line of df
total_revenue = df.groupby(['year'])['revenue'].sum() #this gives me revenue by each year
rev2019 = total_revenue.loc[total_revenue["year"] = 2019 ]
rev2020 = total_revenue.loc[total_revenue["year"] = 2020 ]
dif=(rev2019/rev2020)-1

我想把所有这些都放在一个功能下.如果我想要将"年份"更改为不同的数字,如果此函数可以重复使用,也会很有帮助.

推荐答案

您可以使用带有多个条件的numpy.where,然后使用.sum(),如下所示:

np.where((df.date >= start) & (df.date <= end), df.price*df.quantity, 0).sum()

作为一项功能:

def total_revenue(df, start, end):
    return np.where((df.date >= start) & (df.date <= end), df.price*df.quantity, 0).sum()

df = pd.DataFrame({'order_id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6}, 'price': {0: 30, 1: 50, 2: 45, 3: 200, 4: 54, 5: 200}, 'quantity': {0: 2, 1: 4, 2: 3, 3: 4, 4: 2, 5: 4}, 'date': {0: '20-03-2022', 1: '21-04-2020', 2: '20-03-2020', 3: '21-04-2019', 4: '04-03-2020', 5: '15-04-2019'}})
df.date = pd.to_datetime(df.date, format="%d-%m-%Y")

total_revenue(df, "2019", "2020")  # 1600

您也可以使用DateTime对象来获取某一时间段的总收入,而不是字符串形式的2019.

from datetime import datetime
total_revenue(df, datetime(2019, 4, 20), datetime(2020, 5, 1))  # 1243

编辑:

def dif(df: pd.DataFrame, start: int, end: int) -> float:
    return df[(df.date.dt.year >= start) & (df.date.dt.year <= end)] \  
            .assign(revenue=df.price*df.quantity) \
            .groupby(df.date.dt.year) \
            .revenue.sum().pct_change().loc[end]

dif(df, 2019, 2020)  # -0.7231
dif(df, 2020, 2022)  # -0.8646

Python相关问答推荐

polars:有效的方法来应用函数过滤列的字符串

比Pandas 更好的 Select

从嵌套极轴列的列表中删除元素

如何从比较函数生成ngroup?

如何在验证文本列表时使正则表达式无序?

python的文件. truncate()意外地没有截断'

设置索引值每隔17行左右更改的索引

Django更新视图未更新

将时间序列附加到数据帧

是否将列表分割为2?

如何在开始迭代自定义迭代器类时重置索引属性?

3.我无法找到制作这种三角形图案的方法

为什么任何一个HTML页面在保存到文件后都会变大6个字节?

我应该使用哪一个来判断python中枚举值的唯一性?

通过外键Django创建从一个字段到其他字段的 Select 列表

使用裸变量和TypeDicts时的不同Mypy行为

Django按字段上的子字符串分组

在所有任务完成之前完成Python事件循环

支持向量机模型突出错误的数据点作为支持向量

解析类型的字符串表示形式以获取子项的类型