pandas 如何获得前几年的季度、月环比值

fhg3lkii  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(90)

我有一个包含各种项目季度值的图表,我需要创建一个列,显示每个项目上一年的季度值(例如:项目A的2021_Q1值将与2020_Q1进行比较,其他项目依此类推)。
下面是我的复制品。

df = pd.DataFrame({'item':['A','A','A','A','A','A','B','B','B','B','B','B','C','C','C','C','C','C'],
                  'quarter':['FY20_Q1','FY20_Q2','FY20_Q3','FY20_Q4','FY21_Q1','FY21_Q2',
                         'FY20_Q1','FY20_Q2','FY20_Q3','FY20_Q4','FY21_Q1','FY21_Q2',
                         'FY20_Q1','FY20_Q2','FY20_Q3','FY20_Q4','FY21_Q1','FY21_Q2'],
                  'value':[100,150,120,135,128,160,230,210,240,220,250,230,125,230,162,111,134,135]})

字符串
我对值进行了排序,并使用了groupbyshift,但我没有得到想要的结果。

df['value_prev'] = df.sort_values(by=['item','quarter']).groupby(['item'])['value'].shift()


这给了我下面的结果,这显然是比较前一季度的价值,而不是一年。

item    quarter    value    value_prev
0  A      FY20_Q1     100       NaN
1  A      FY20_Q2     150       100
2  A      FY20_Q3     120       150
3  A      FY20_Q4     135       120
4  A      FY21_Q1     128       135
5  A      FY21_Q2     160       128
...


我的预期结果如下。有没有什么方法可以用来得到这个。

item    quarter    value    value_prev
0  A       FY20_Q1    100       NaN
1  A       FY20_Q2    150       NaN
2  A       FY20_Q3    120       NaN
3  A       FY20_Q4    135       NaN
4  A       FY21_Q1    128       100
5  A       FY21_Q2    160       150

vyu0f0g1

vyu0f0g11#

尝试:

# convert the "Quarter" to PeriodIndex
df["current"] = df["quarter"].str.replace(r"FY(\d+)_Q(\d+)", r"20\1-Q\2", regex=True)
df["current"] = pd.PeriodIndex(df["current"], freq="Q")
df["next"] = df["current"] + 4

out = df.merge(
    df,
    how="left",
    left_on=["item", "current"],
    right_on=["item", "next"],
)
print(
    out[["item", "quarter_x", "value_x", "value_y"]].rename(
        columns={"quarter_x": "quarter", "value_x": "value", "value_y": "value_prev"}
    )
)

字符串
印刷品:

item  quarter  value  value_prev
0     A  FY20_Q1    100         NaN
1     A  FY20_Q2    150         NaN
2     A  FY20_Q3    120         NaN
3     A  FY20_Q4    135         NaN
4     A  FY21_Q1    128       100.0
5     A  FY21_Q2    160       150.0
6     B  FY20_Q1    230         NaN
7     B  FY20_Q2    210         NaN
8     B  FY20_Q3    240         NaN
9     B  FY20_Q4    220         NaN
10    B  FY21_Q1    250       230.0
11    B  FY21_Q2    230       210.0
12    C  FY20_Q1    125         NaN
13    C  FY20_Q2    230         NaN
14    C  FY20_Q3    162         NaN
15    C  FY20_Q4    111         NaN
16    C  FY21_Q1    134       125.0
17    C  FY21_Q2    135       230.0

m3eecexj

m3eecexj2#

你正面临着一个挑战,因为你的“季度”列实际上包含两条信息.季度和年度。
让我们将该列分解,构建一个数据透视表,这样就可以做任何需要的分析了,而且在某些记录丢失的情况下,这也保证不起作用。
第一步:将复杂的列分成两个(这里的代码适用于你的虚拟数据--也许你所有的生产数据都需要一个更复杂的处理异常的函数。但是你必须把这两个维度分开!)

df['year'] = df['quarter'].str[0:4]
df['quarter'] = df['quarter'].str[-2:]

字符串
第二步:让我们将年份和季度重新排列成行和列(这显然是2个不同的维度,您希望运行不同的分析,例如,比较季度与季度将是行操作,而比较年份与年份将是列操作)-请仅对1个产品或所有产品执行此操作

sorted_df = df.pivot_table(index='year', columns=['quarter', 'item'])


第3步:选择你现在想做的任何分析。比如说,对于所有产品,看看几年来“Q1”的“价值”:

sorted_df['value']['Q1']

5uzkadbs

5uzkadbs3#

另一种可能的解决方案是提取年份并减去1,用减去的年份列创建一个新的嵌套框(d),与初始嵌套框(df)合并以获得与调整后的年份对应的值,最后,将dvalue列添加为dfvalue_prev列:

cols = ['quarter', 'item']
y = df['quarter'].str.extract('FY(\d+)_.*').astype(int).sub(1)[0]
q, item = df['quarter'].str.extract('.*_(.*)')[0], df['item']

d = (pd.DataFrame(
     [[f'FY{x[0]}_{x[1]}', x[2]] for x in zip(y, q, item)], columns=cols)
     .merge(df, on=cols, how='left'))

df['value_prev'] = d['value']

字符串
输出量:

item  quarter  value  value_prev
0     A  FY20_Q1    100         NaN
1     A  FY20_Q2    150         NaN
2     A  FY20_Q3    120         NaN
3     A  FY20_Q4    135         NaN
4     A  FY21_Q1    128       100.0
5     A  FY21_Q2    160       150.0
6     B  FY20_Q1    230         NaN
7     B  FY20_Q2    210         NaN
8     B  FY20_Q3    240         NaN
9     B  FY20_Q4    220         NaN
10    B  FY21_Q1    250       230.0
11    B  FY21_Q2    230       210.0
12    C  FY20_Q1    125         NaN
13    C  FY20_Q2    230         NaN
14    C  FY20_Q3    162         NaN
15    C  FY20_Q4    111         NaN
16    C  FY21_Q1    134       125.0
17    C  FY21_Q2    135       230.0

相关问题