python作业

一、数据分析任务

(要求:结合借阅记录数据,实现数据分析任务,要求任务至少有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.绘制折线图,展现八位用户的结束情况分布,分析用户群体。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值