You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
6.5 KiB

6 months ago
from pyecharts import options as opts
from pyecharts.charts import Bar,Page,Line,Timeline
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
from pyecharts.charts import Pie
6 months ago
import sql
6 months ago
from pyecharts.faker import Faker
6 months ago
# from main import book_list_data
6 months ago
from collections import Counter
6 months ago
class Book:
def __init__(self, name, url, star, star_people, author, translater, publisher, pub_year, price, comment):
self.name = name
self.url = url
self.star = star
self.star_people = star_people
self.author = author
self.translater = translater
self.publisher = publisher
self.pub_year = pub_year
self.price = price
self.comment = comment
db = sql.BookDatabase(host='localhost', user='root', password='123456', database='xiaosuo', table_name='books')
db.initialize_table()
def show():
data = db.get_book_list()
book_list_data = []
for book in data:
book_list_data.append(
Book(book["name"], book["url"], book["star"], book["star_people"], book["author"], book["translater"],
book["publisher"], book["pub_year"], book["price"], book["comment"]))
book_list_data_sortBystart = sorted(book_list_data, key=lambda x: (x.star, x.star_people), reverse=True)
book_list_data_sortBystart = book_list_data_sortBystart[:10]
book_list_data_sortBystart = book_list_data_sortBystart[::-1]
# 从book_list_data中提取书籍名称和评分数据
book_names = [book.name for book in book_list_data_sortBystart]
book_stars = [book.star for book in book_list_data_sortBystart]
x_data = list(range(1, len(book_names) + 1))
# 创建柱状图
bar = (
Bar(init_opts=opts.InitOpts(theme="shine", width="850px", height='400px'))
.add_xaxis(book_names)
.add_yaxis("评分", book_stars, color="red")
.reversal_axis() # 实现旋转
.set_global_opts(
title_opts=opts.TitleOpts(title="评分前10榜", pos_bottom="bottom", pos_left="center"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45))
)
# .render("bar_datazoom_slider.html")
6 months ago
)
6 months ago
publisher_list = [book.publisher for book in book_list_data]
# 使用Counter来计算每个出版商的数量
publisher_counter = Counter(publisher_list)
publisher_names = list(publisher_counter.keys())
publisher_counts = list(publisher_counter.values())
colors = [
"#5470c6", "#91cc75", "#fac858", "#ee6666", "#73c0de",
"#3ba272", "#fc8452", "#9a60b4", "#ea7ccc", "#bb60b4",
"#8B008B", "#FF1493", "#1E90FF", "#20B2AA", "#2E8B57",
"#B22222", "#FF4500", "#4682B4", "#DAA520", "#32CD32"
]
# 使用Pyecharts创建饼图
pie = (
Pie()
.add("", [list(z) for z in zip(publisher_names, publisher_counts)])
.set_colors(colors) # 设置颜色
.set_global_opts(title_opts=opts.TitleOpts(title="出版商分布饼图", pos_left="center", pos_bottom="bottom"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
6 months ago
)
6 months ago
prices = [float(book.price) for book in book_list_data]
print(prices)
# 将价格分组到不同的区间
price_intervals = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, float('inf')] # 设置价格区间
price_counts = [0] * (len(price_intervals) - 1) # 初始化每个区间的计数为0
prices_intervalsStr = ["0-50", "50-100", "100-150", "150-200", "200-250", "250-300", "300-350", "350-400",
"400-450", "450-500", "500以上"]
# 统计每个价格区间的数量
for price in prices:
for i in range(len(price_intervals) - 1):
if price >= 500:
price_counts[len(price_intervals) - 1] += 1
break
if price_intervals[i] <= price and price < price_intervals[i + 1]:
price_counts[i] += 1
break
# print(price_counts)
# 生成价格区间与书籍数量折线图
line = (
Line()
.add_xaxis([str(interval) for interval in prices_intervalsStr[:-1]]) # X轴标签为价格区间
.add_yaxis("书籍数量", price_counts, symbol="circle", is_smooth=True,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
.set_global_opts(
title_opts=opts.TitleOpts(title="价格区间与书籍数量折线图", pos_left="center", pos_bottom="bottom"),
xaxis_opts=opts.AxisOpts(name="价格区间"),
yaxis_opts=opts.AxisOpts(name="书籍数量"),
datazoom_opts=opts.DataZoomOpts(range_start=0, range_end=100), )
6 months ago
)
6 months ago
# 生成时间与书籍数量折线图# 假设您的书籍数据保存在book_list_data中
# 提取每本书的出版年份
publish_dates = [int(book.pub_year.replace('-', '.').split('.')[0]) for book in book_list_data]
print(publish_dates)
# 使用Counter来计算每年出版的书的数量
publish_year_counter = Counter(publish_dates)
print(publish_year_counter)
# 确保结果包含连续的年份范围,并且将缺失的年份对应的数量设为 0
full_year_range = range(min(publish_dates), max(publish_dates) + 1)
print(full_year_range)
pub_year_counts = [(year, publish_year_counter[year]) for year in full_year_range]
# 提取年份和对应的书籍数量
years = [str(year) for year, count in pub_year_counts]
counts = [count for year, count in pub_year_counts]
print(pub_year_counts)
line_year_count = (
Line()
.add_xaxis(years)
.add_yaxis(
series_name="出版书籍数量",
y_axis=counts,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值")]),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值")]),
)
.set_global_opts(title_opts=opts.TitleOpts(title="年份与出版书籍数量变化"),
xaxis_opts=opts.AxisOpts(name="年份"),
yaxis_opts=opts.AxisOpts(name="书籍数量"),
)
)
6 months ago
6 months ago
# 创建一个页面
page = Page()
# 将柱状图和饼图添加到页面中
page.add(line_year_count)
page.add(bar)
page.add(pie)
page.add(line)
# 生成HTML文件
page.render("book_analysis.html")