代码之家  ›  专栏  ›  技术社区  ›  azro

如何绘制每个类别的滚动平均日期费用?

  •  0
  • azro  · 技术社区  · 10 月前

    球门

    我有代表开支的数据,包括日期和类别,我想绘制 一段时间内每个类别的滚动平均值


    来源

    我尝试过使用和组合以下内容,但没有成功


    尝试和MCVE

    使用第二个链接,我得到的最好的结果是

    import pandas as pd
    from matplotlib import pyplot as plt
    from random import randrange, seed
    from datetime import datetime
    
    seed(321)
    
    nb = 24
    df = pd.DataFrame({
        "date": [datetime(2023, 1 + i // 2, 5) for i in range(nb)],
        "category": [item for _ in range(nb // 2) for item in ["food", "wear"]],
        "value": [randrange(10, 120) for _ in range(nb)],
    })
    
    df.set_index("date", inplace=True)
    
    all_s = []
    for x in set(df["category"]):
        s = df.loc[df['category'] == x, "value"]
        s = s.groupby(pd.Grouper(freq="ME")).sum()
        all_s.append(s.rename(x))
    
    df = pd.concat(all_s, axis=1).fillna(0).asfreq("ME", fill_value=0)
    
    df.plot(style='.-', figsize=(15, 20), ylim=(0, 130))
    plt.show()
    

    在中渲染

    enter image description here


    预料

    我希望添加类似的内容 .rolling(window=3, min_periods=1) 在某个地方,在图上画一条平坦的线,避免峰值,只得到给定时间段的平均值

    1 回复  |  直到 10 月前
        1
  •  1
  •   e-motta    10 月前

    你快到了。您需要获得滚动窗口计算的平均值:

    df = df.rolling(window=3).mean()
    

    例如,这将导致以下数据帧:

                     wear       food
    date                            
    2023-01-31        NaN        NaN
    2023-02-28        NaN        NaN
    2023-03-31  61.000000  50.666667
    2023-04-30  75.000000  53.333333
    2023-05-31  85.000000  58.333333
    2023-06-30  84.333333  54.000000
    2023-07-31  82.000000  72.333333
    2023-08-31  75.666667  80.000000
    2023-09-30  58.000000  70.000000
    2023-10-31  51.333333  69.666667
    2023-11-30  50.333333  62.333333
    2023-12-31  66.333333  54.333333
    

    这个情节: rolling average plot