【问题标题】:How to plot continous data that depends on column value如何绘制取决于列值的连续数据
【发布时间】:2021-09-16 12:12:35
【问题描述】:

我想要什么

我需要用下面的数据框绘制这样的图表:

0 购买 2021-06-15 0:00:00 60 1 销售 2021-06-17 0:00:00 11 2 销售 2021-06-17 0:00:00 4 3 销售 2021-06-17 0:00:00 2 4 销售 2021-06-18 0:00:00 1 5 销售 2021-06-18 0:00:00 2 6 销售 2021-06-19 0:00:00 1 7 销售 2021-06-21 0:00:00 1 8 销售 2021-06-22 0:00:00 1 9 销售 2021-06-23 0:00:00 1 10 销售 2021-06-25 0:00:00 3 11 销售 2021-06-30 0:00:00 3 12 购买 2021-06-30 0:00:00 50 13 销售 2021-07-01 0:00:00 2 14 销售 2021-07-01 0:00:00 6 15 销售 2021-07-02 0:00:00 1 16 销售 2021-07-02 0:00:00 3 17 销售 2021-07-03 0:00:00 1 18 销售 2021-07-03 0:00:00 2

我试图用cumsum() 进行绘图,但我需要先将带有“销售”的行转换为负值才能做到这一点。

有没有更好的办法?

【问题讨论】:

    标签: pandas dataframe matplotlib


    【解决方案1】:

    让我们尝试一下:

    # Convert to datetime
    df['datetime'] = pd.to_datetime(df['datetime'])
    # Negate Sale rows
    df.loc[df['action'].eq('Sale'), 'amt'] *= -1
    # Calculate the total amount
    df['total_amt'] = df['amt'].cumsum()
    # Plot datetime vs total_amt
    ax = df.plot(x='datetime', y='total_amt', ylabel='Qty', xlabel='Date')
    plt.show()
    

    DataFrame 和导入:

    import pandas as pd
    from matplotlib import pyplot as plt
    
    df = pd.DataFrame({
        'action': ['Buy', 'Sale', 'Sale', 'Sale', 'Sale', 'Sale', 'Sale', 'Sale',
                   'Sale', 'Sale', 'Sale', 'Sale', 'Buy', 'Sale', 'Sale', 'Sale',
                   'Sale', 'Sale', 'Sale'],
        'datetime': ['2021-06-15 0:00:00', '2021-06-17 0:00:00',
                     '2021-06-17 0:00:00', '2021-06-17 0:00:00',
                     '2021-06-18 0:00:00', '2021-06-18 0:00:00',
                     '2021-06-19 0:00:00', '2021-06-21 0:00:00',
                     '2021-06-22 0:00:00', '2021-06-23 0:00:00',
                     '2021-06-25 0:00:00', '2021-06-30 0:00:00',
                     '2021-06-30 0:00:00', '2021-07-01 0:00:00',
                     '2021-07-01 0:00:00', '2021-07-02 0:00:00',
                     '2021-07-02 0:00:00', '2021-07-03 0:00:00',
                     '2021-07-03 0:00:00'],
        'amt': [60, 11, 4, 2, 1, 2, 1, 1, 1, 1, 3, 3, 50, 2, 6, 1, 3, 1, 2]
    })
    

    *列标题被省略,所以我添加了一些。

    df.head():

      action            datetime  amt
    0    Buy  2021-06-15 0:00:00   60
    1   Sale  2021-06-17 0:00:00   11
    2   Sale  2021-06-17 0:00:00    4
    3   Sale  2021-06-17 0:00:00    2
    4   Sale  2021-06-18 0:00:00    1
    

    1. 转换日期列to_datetime
    df['datetime'] = pd.to_datetime(df['datetime'])
    

    这将使 xaxis 刻度更易于使用。

    1. 否定“action”等于“sales”的行:
    df.loc[df['action'].eq('Sale'), 'amt'] *= -1
    

    df.head():

      action   datetime  amt
    0    Buy 2021-06-15   60
    1   Sale 2021-06-17  -11
    2   Sale 2021-06-17   -4
    3   Sale 2021-06-17   -2
    4   Sale 2021-06-18   -1
    
    1. cumsum计算累计总数:
    df['total_amt'] = df['amt'].cumsum()
    
      action   datetime  amt  total_amt
    0    Buy 2021-06-15   60         60
    1   Sale 2021-06-17  -11         49
    2   Sale 2021-06-17   -4         45
    3   Sale 2021-06-17   -2         43
    4   Sale 2021-06-18   -1         42
    
    1. 然后是DataFrame.plot,x 轴为“datetime”,y 轴为“total_amt”:
    ax = df.plot(x='datetime', y='total_amt', ylabel='Qty', xlabel='Date')
    

    另一个可选步骤是使用groupby last 仅绘制每天的结束总数:

    # Convert to datetime
    df['datetime'] = pd.to_datetime(df['datetime'])
    # Negate Sale rows
    df.loc[df['action'].eq('Sale'), 'amt'] *= -1
    # Calculate the total amount
    df['total_amt'] = df['amt'].cumsum()
    # Get only the Ending Daily Total
    daily_df = df.groupby(df['datetime'].dt.date)[['datetime', 'total_amt']].last()
    ax = daily_df.plot(x='datetime', y='total_amt', ylabel='Qty', xlabel='Date')
    plt.show()
    

    daily_df.head():

                 datetime  total_amt
    datetime                        
    2021-06-15 2021-06-15         60
    2021-06-17 2021-06-17         43
    2021-06-18 2021-06-18         40
    2021-06-19 2021-06-19         39
    2021-06-21 2021-06-21         38
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2017-09-02
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多