提问人:PracticingPython 提问时间:3/11/2022 最后编辑:PracticingPython 更新时间:3/11/2022 访问量:113
使用 pandas 生成趋势数据
Generating trend data using pandas
问:
我正在尝试使用 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
编辑:
答:
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,您应该将该数据作为文本发布。人们不想从图像中手动输入数据。
评论