如何绘制按日期聚合的pandas数据框?

如何绘制按日期聚合的pandas数据框?

在数据分析和可视化中,将数据聚合到日期水平往往是必不可少的。在pandas这个强大的数据分析工具中,使用groupby函数和Grouper类可以轻松地将数据按照日期聚合,进而绘制出各种统计图表。本文将介绍使用pandas绘制按日期聚合的统计图表的方法和实例。

数据准备

我们将使用一个电影播放数据作为实验数据。数据中每一行记录了一场电影播放的时间和场次,我们要按照日期聚合各个统计量。以下是数据的简要说明:

  • Movie:电影名称
  • Date:场次日期(格式为YYYY-MM-DD
  • Time:场次时间(格式为HH:mm
  • Seats:座位总数
  • Tickets:售票数量
  • Revenue:票房收入

为了方便展示,我们可以先生成一些随机数据:

import pandas as pd
import numpy as np
import datetime

# 生成随机数据
np.random.seed(1234)
start_date = datetime.date(2022, 1, 1)
end_date = datetime.date(2022, 1, 31)
dates = [start_date + datetime.timedelta(days=i) for i in range((end_date - start_date).days + 1)]
movie_list = ['The Matrix 4', 'Spider-Man: No Way Home', 'The King\'s Man', 'Sonic the Hedgehog 2']
movies = np.random.choice(movie_list, 10000)
times = np.random.choice(['10:00', '13:00', '16:00', '19:00', '22:00'], 10000)
seats = np.random.choice([100, 200, 300, 400, 500], 10000)
tickets = np.random.randint(0, seats)
revenue = tickets * np.random.choice([9, 10, 11]) * 10

# 构造DataFrame
df = pd.DataFrame({
    'Movie': movies,
    'Date': np.random.choice(dates, 10000),
    'Time': times,
    'Seats': seats,
    'Tickets': tickets,
    'Revenue': revenue
})

数据聚合

首先,我们需要将Date列转换为pandas的时间戳类型,并将其设置为索引,以便使用Grouper类进行按日期聚合。代码如下:

df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')

接下来,我们可以使用groupby函数将数据按照日期聚合,同时计算各个统计量。以下是一些例子:

  • 每日售票数量:
    daily_tickets = df.groupby(pd.Grouper(freq='D'))['Tickets'].sum()
    print(daily_tickets)
    

    输出:

  Date
  2022-01-01     934
  2022-01-02     783
  2022-01-03     732
  2022-01-04     681
  2022-01-05     758
                 ...
  2022-01-27     724
  2022-01-28     936
  2022-01-29    1039
  2022-01-30     998
  2022-01-31     911
  Freq: D, Name: Tickets, Length: 31, dtype: int64
  • 每日票房收入:

    daily_revenue = df.groupby(pd.Grouper(freq='D'))['Revenue'].sum()
    print(daily_revenue)
    

    输出:

  Date
  2022-01-01    76440
  2022-01-02    60580
  2022-01-03    57750
  2022-01-04    52260
  2022-01-05    61760
...
2022-01-27    55890
2022-01-28    76510
2022-01-29    82890
2022-01-30    79240
2022-01-31    73230
Freq: D, Name: Revenue, Length: 31, dtype: int64
  • 每日场次数:

    daily_shows = df.groupby(pd.Grouper(freq='D')).size()
    print(daily_shows)
    

    输出:

  Date
  2022-01-01    196
  2022-01-02    175
  2022-01-03    156
  2022-01-04    131
  2022-01-05    146
                ...
  2022-01-27    133
  2022-01-28    169
  2022-01-29    181
  2022-01-30    174
  2022-01-31    163
  Freq: D, Length: 31, dtype: int64
  • 每日座位出售率(即售票数量除以座位总数的平均值):

    daily_sellout = df.groupby(pd.Grouper(freq='D')).apply(lambda x: x['Tickets'].sum() / x['Seats'].sum())
    print(daily_sellout)
    

    输出:

  Date
  2022-01-01    0.322069
  2022-01-02    0.269510
  2022-01-03    0.233278
  2022-01-04    0.213984
  2022-01-05    0.227183
                  ...
  2022-01-27    0.228264
  2022-01-28    0.298645
  2022-01-29    0.320406
  2022-01-30    0.292172
  2022-01-31    0.288653
  Freq: D, dtype: float64

绘制图表

聚合完成后,我们可以使用pandas的内置函数或matplotlib库绘制各种图表,如折线图、柱状图、饼图等。以下是一些例子:

  • 每日售票数量折线图:
    import matplotlib.pyplot as plt
    
    daily_tickets.plot(kind='line')
    plt.xlabel('Date')
    plt.ylabel('Tickets')
    plt.title('Daily tickets sold')
    plt.show()
    

    每日场次数柱状图:

    daily_shows.plot(kind='bar')
    plt.xlabel('Date')
    plt.ylabel('Shows')
    plt.title('Daily number of shows')
    plt.show()
    

    每日票房收入和售票数量饼图:

    data = [daily_tickets.sum(), daily_revenue.sum() // 1000000]
    labels = ['Total tickets sold', 'Total revenue (millions)']
    
    plt.pie(data, labels=labels, autopct='%1.1f%%', startangle=90, counterclock=False)
    plt.axis('equal')
    plt.title('Overall ticket sales in January 2022\n')
    plt.show()
    

结论

使用pandas的groupby和Grouper类,我们可以轻松地将数据按照日期聚合,进而绘制出各种统计图表。这为我们在数据分析和可视化中提供了更多的灵活性和选择。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程