(要求:结合借阅记录数据,实现数据分析任务,要求任务至少有5个,能够体现一定的复杂性和结果价值。相关结果要附全部可以运行的代码和运行结果。)
1.找出总借阅量最高的20本书,并按照年份对这20本书借阅量进行动态绘制。清晰地展示出每年借阅量的动态变化情况。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
plt.rcParams['font.sans-serif'] = ['SimHei'] ?# 设置中文字体为黑体
# 读取数据文件并创建DataFrame对象
data = pd.read_csv('lending.dat')
# 对书籍进行分组并计算每本书的总借阅量
book_counts = data['title'].value_counts()
# 找出总借阅量最高的20本书
top_20_books = book_counts.head(20).index.tolist()
# 添加"year"列来提取每个借阅记录的年份
data['year'] = pd.to_datetime(data['date']).dt.year
#按照年份对数据进行排序
data=data.sort_values('year')
# 创建动态图
fig, ax = plt.subplots()
#生成20种不同的颜色
colors = ['#' + ''.join(random.choices('0123456789ABCDEF', k=6)) for _ in range(20)]
# 设置背景颜色
ax.set_facecolor('#F0F0F0')
def animate(year):
????ax.clear()
????year_data = data[data['year'] <= year]
????book_counts = year_data[year_data['title'].isin(top_20_books)]['title'].value_counts()
????book_counts = book_counts.reindex(top_20_books).sort_values(ascending=True)
????y_pos = range(len(book_counts))
????# 设置边框样式
????ax.spines['left'].set_visible(False)
????ax.spines['right'].set_visible(False)
????ax.spines['top'].set_visible(False)
????ax.spines['bottom'].set_visible(False)
????ax.barh(y_pos, book_counts.values,color=colors)
????ax.set_xlabel('Number of Borrowings')
????ax.set_ylabel('Book Title')
????ax.set_title('Top 20 Books Borrowing Trend ({})'.format(year))
????ax.set_yticks(y_pos)
????ax.set_yticklabels(book_counts.index)
ani = animation.FuncAnimation(fig, animate, frames=data['year'].unique(), interval=1000)
plt.tight_layout()
plt.show()
?
2.按照月份进行分类,绘制出每月借阅量最高数目的三维图。直观展示每个月借阅量最高的书目的书名和借阅量
import pandas as pd
import plotly.graph_objects as go
# 读取数据
data = pd.read_csv('lending.dat')
# 将日期列转换为日期时间格式
data['date'] = pd.to_datetime(data['date'])
# 提取月份作为新的列
data['month'] = data['date'].dt.month
# 按月份和书籍进行分组,并计算每个组的计数
grouped_data = data.groupby(['month', 'title']).size().reset_index(name='count')
# 找到每个月份借阅量最高的书籍
max_books_per_month = grouped_data.groupby('month')['count'].idxmax()
top_books = grouped_data.loc[max_books_per_month]
# 创建三维柱状图
fig = go.Figure(data=[
????go.Scatter3d(
????????x=top_books['month'],
????????y=top_books['title'],
????????z=top_books['count'],
????????text=top_books['title'],
????????mode='markers',
????????marker=dict(
????????????size=12,
????????????color=top_books['count'],
????????????colorscale='Blues',
????????????opacity=0.8,
????????????colorbar=dict(
????????????????title='借阅量',
????????????????thickness=15
????????????),
????????????showscale=True
????????)
????)
])
# 设置图形布局
fig.update_layout(
????scene=dict(
????????xaxis=dict(title='月份'),
????????yaxis=dict(title='书籍'),
????????zaxis=dict(title='借阅量'),
????????xaxis_tickangle=-45
????),
????title='每个月借阅量最高的书籍',
????height=600,
????margin=dict(l=0, r=0, b=0, t=80),
????scene_camera=dict(
????????eye=dict(x=1.5, y=-1.5, z=1)
????)
)
# 显示图形
fig.show()
3.分析借阅模式
通过绘制散点图,可视化用户的借阅模式。某些用户可能倾向于在特定时间段内集中借阅大量图书,而其他用户可能更喜欢均匀分散地借阅。这种了解可以为图书馆提供更好的资源分配和库存管理策略。
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据集
df = pd.read_csv('lending.dat')
# 按借阅量倒序排列并取前20位
top_20_users = df.groupby('uid')['bid'].count().reset_index().\
????sort_values(by='bid', ascending=False).head(8)
# 记录每个用户每个月的借书本数
user_monthly_borrow = {}
for user in top_20_users['uid']:
????borrow_data = df[df['uid'] == user][['date', 'bid']]
????borrow_data['date'] = pd.to_datetime(borrow_data['date'])
????borrow_data.set_index('date', inplace=True)
????monthly_borrow = borrow_data.resample('M')['bid'].count().reset_index()
????monthly_borrow['uid'] = user
????user_monthly_borrow[user] = monthly_borrow
# 为每4个用户生成一张散点图
fig, axs = plt.subplots(len(top_20_users )//2, 2, figsize=(20, 40))
for i, user in enumerate(top_20_users['uid']):
????ax = axs[ i//2, i% 2]
????df = user_monthly_borrow[user]
????ax.scatter(df['date'], df['bid'], c=[i] * len(df))
? # ax.set_title(f"user_{user}")
??# ax.set_xlabel('Month')
????ax.set_ylabel('Borrow Amount')
????ax.legend([f"user_{user}"])
plt.show()
4.绘制词云图,直观展示每年的借阅书目,用于图书馆的推荐书目机制。也是分年份展示
#按照年份进行分类绘制动态词云图,展示每年的借阅量数据
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from wordcloud import WordCloud
import jieba
# 读取数据文件并创建DataFrame对象
data = pd.read_csv('lending.dat')
# 设置中文字体
plt.rcParams['font.family'] = ['SimHei']
font_path='C:/Windows/Fonts/simhei.ttf'
# 创建词云对象
wordcloud = WordCloud(width=800, height=400, background_color='white',font_path=font_path)
# 将日期列转换为日期时间格式
data['date'] = pd.to_datetime(data['date'])
# 提取月份作为新的列
data['year'] = data['date'].dt.year
# 按年份分组统计借阅标题的词频
grouped_data = data.groupby('year')['title'].apply(lambda x: " ".join(x)).reset_index()
# 创建动态图
fig, ax = plt.subplots(figsize=(6, 6))
plt.tight_layout()
def update(frame):
????# 清空当前图像
????ax.clear()
????# 获取当前年份的借阅数据
????year_data = grouped_data[grouped_data['year'] == frame]
????# 生成词云图数据
????wordcloud.generate(year_data['title'].values[0])
????# 绘制词云图
????ax.imshow(wordcloud, interpolation='bilinear')
????ax.axis('off')
????ax.set_title('Year: {}'.format(frame))
# 设置图像背景和边框样式
fig.patch.set_facecolor('white')
fig.patch.set_edgecolor('black')
# 创建动画
animation = FuncAnimation(fig, update, frames=grouped_data['year'].unique(), interval=1000)
plt.show()
5.绘制折线图,展现八位用户的结束情况分布,分析用户群体。为个性化推荐和定制化服务提供依据
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据集
df = pd.read_csv('lending.dat')
# 按借阅量倒序排列并取前20位
top_20_users = df.groupby('uid')['bid'].count().reset_index().\
????sort_values(by='bid', ascending=False).head(8)
# 记录每个用户每个月的借书本数
user_monthly_borrow = {}
for user in top_20_users['uid']:
????borrow_data = df[df['uid'] == user][['date', 'bid']]
????borrow_data['date'] = pd.to_datetime(borrow_data['date'])
????borrow_data.set_index('date', inplace=True)
????monthly_borrow = borrow_data.resample('M')['bid'].count().reset_index()
????monthly_borrow['uid'] = user
????user_monthly_borrow[user] = monthly_borrow
# 画折线图
plt.figure(figsize=(15, 10))
for user in user_monthly_borrow.keys():
????df = user_monthly_borrow[user]
????plt.plot(df['date'], df['bid'], label=f"user_{user}")
plt.xticks(rotation=45)
plt.xlabel('Month')
plt.ylabel('Borrow Amount')
plt.title('Monthly Borrow Amount Top 8 Users')
plt.legend()
plt.show()
(要求:到网上搜索了解各类新颖的可视化工具包,并利用可视化工具包完成对上述分析结果的有效展示,要求展示效果好、新颖性好。相关结果要附全部可以运行的代码和截图。)
1.绘制动态图,动图的运行结果在压缩文件夹
2.绘制动态图使用plotly工具包,通过python实现在网页端绘制图表
3.使用matplotlib工具包
?
?
4.绘制词云图
?
5.绘制折线图,展现八位用户的结束情况分布,分析用户群体。