使用 pandas 生成趋势数据

Generating trend data using pandas

提问人:PracticingPython 提问时间:3/11/2022 最后编辑:PracticingPython 更新时间:3/11/2022 访问量:113

问:

我正在尝试使用 pandas 为我正在处理的数据集开发一些趋势数据。该套装由产品编号、会计年度和售出的单位数量组成。我想创建第四个“趋势”列,按财政年度(特别是前一年)将每个产品与自身进行比较。每个产品的第一个趋势应始终为 0,因为没有上一年的数据。如果该产品的值自上一年以来有所上升,则趋势只是一个“+”,如果相反,则趋势只是一个“-”。我以为这很简单,但显然我忽略了一些东西。

data_out.sort_values(['product_number','fiscal_year'], inplace = True)
trend = []
for n, units in enumerate(data_out.Units_Sold):
    if n == 0:
        trend.append(0)
    elif data_out.Units_Sold[i-1]>=units and data_out.product_number.loc[i] == data_out.product_number.loc[i-1]:
        trend.append(0)

    elif data_out.Num_Contrs[i-1]<units and data_out.product_number.loc[i] == data_out.product_number.loc[i-1]:
        trend.append(0.08)

data_out.Trend = trend

编辑:

enter image description here

熊猫

评论


答:

1赞 Matthew Borish 3/11/2022 #1

使用 pct_change() 和 np.where() 怎么样?这是一个玩具的例子。请注意,由于洗牌,pct change 列在末尾乱序,但趋势变化是正确的。只是为了理解逻辑而留下的。此外,索引已被修改,因此请注意这一点并根据需要按 idx 排序。

import numpy as np
import pandas as pd

df = pd.DataFrame({'Fiscal Year': {0: 2020, 1: 2019, 2: 2021, 3: 2020, 4: 2022},
 'Product Num': {0: 'widget', 1: 'doodad', 2: "widget", 3: 'doodad', 4: 'widget'},
 'Value': {0: 1000, 1: 1100, 2: 900, 3: 1300, 4: 800}})

# sort by year and prod so we can calc percent change
df=df.sort_values(by=['Fiscal Year', 'Product Num'])

df['pct_change'] = df['Value'].pct_change()

df['trend'] = np.where(df['pct_change'] > 0, '+', '-')
# find the idx values of first year so we can overwrite them
first_year = df.groupby('Product Num').agg({'Fiscal Year':'idxmin'})

first_year_idxs = first_year['Fiscal Year'].tolist()

df['trend'] = np.where(df.index.isin(first_year_idxs), ' ', df['trend'])

输出 df:

    Fiscal Year Product Num Value   pct_change  trend
1   2019        doodad  1100        NaN 
3   2020        doodad  1300        0.181818    +
0   2020        widget  1000        -0.230769   
2   2021        widget  900         -0.100000   -
4   2022        widget  800         -0.111111   -

评论

0赞 PracticingPython 3/11/2022
在 OP 中添加了数据示例。 谢谢!
0赞 Paul H 3/11/2022
@PracticingPython,您应该将该数据作为文本发布。人们不想从图像中手动输入数据。