如何绘制按日期聚合的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类,我们可以轻松地将数据按照日期聚合,进而绘制出各种统计图表。这为我们在数据分析和可视化中提供了更多的灵活性和选择。