mapreduce+mysql+python分析豆瓣读书top250,还要画图,想问下python的逻辑代码怎么写,就比如,找出当前评价人数最多的前100的小说,并以国籍为指标绘制饼状图,逻辑代码类似于这样要连接数据库,还有个run.py的启动文件
这里是一个简单的思路:
1. 连接MySQL数据库,查询出豆瓣读书top250的数据,包括书名、评分、评价人数、国籍等信息。
2. 在Map阶段,将每本书的信息映射为((国籍, 书名), 评价人数)这样的键值对。
3. 在Reduce阶段,对相同国籍的书进行评价人数的累加,得到((国籍, 总评价人数), [书名1, 书名2, ...])这样的结果。
4. 对Reduce结果再进行排序,选出评价人数最多的前100本书。
5. 根据国籍信息绘制饼图。
python代码如下:
python
import mysql.connector
from mrjob.job import MRJob
class BookTop250(MRJob):
def mapper(self, _, line):
line = line.strip().split('\t')
name, rating, votes, nationality = line[0], line[1], int(line[3]), line[6]
yield (nationality, name), votes
def reducer(self, key, values):
total_votes = sum(values)
book_names = [v for v in values]
yield key, (total_votes, book_names)
if __name__ == '__main__':
# 连接MySQL,查询top250数据
conn = mysql.connector.connect(host='localhost', user='root', password='password', database='douban')
cursor = conn.cursor()
cursor.execute('SELECT * FROM book_top250')
rows = cursor.fetchall()
# 写入本地数据文件
with open('top250.txt', 'w') as f:
for row in rows:
f.write('\t'.join(row) + '\n')
# 运行MapReduce作业
mr_job = BookTop250(args=['top250.txt'])
with mr_job.make_runner() as runner:
runner.run()
for key, value in mr_job.parse_output(runner.cat_output()):
# 这里对结果进行处理和绘制饼图
这是一个简单的思路,希望对您有所帮助。如果有任何问题,欢迎交流。
不知道你这个问题是否已经解决, 如果还没有解决的话:首先,我们需要爬取豆瓣读书Top250的数据,并将数据存储到MySQL数据库中。我们可以使用Python爬虫框架Scrapy来爬取数据,然后使用PyMySQL来连接MySQL数据库并插入数据。以下是Scrapy爬虫的基本结构:
scrapy startproject douban
scrapy genspider douban_book_spider book.douban.com
def parse(self, response):
book_list = response.xpath('//div[@class="article"]/div[@class="indent"]/table')
for book in book_list:
title = book.xpath('.//div[@class="pl2"]/a/@title').extract_first()
rating = book.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
# 省略其他字段
yield {
"title": title,
"rating": rating,
# 省略其他字段
}
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='password', db='douban')
cursor = conn.cursor()
for item in items:
sql = "INSERT INTO book (title, rating) VALUES (%s, %s)"
cursor.execute(sql, (item['title'], item['rating']))
conn.commit()
conn.close()
接下来,我们需要编写Python代码来分析数据并生成饼状图。我们可以使用Pandas和Matplotlib这两个常用的数据处理和可视化库。以下是实现逻辑:
import pandas as pd
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='password', db='douban')
df = pd.read_sql("SELECT * FROM book", conn)
conn.close()
df = df.sort_values(by='rating_num', ascending=False).head(100)
country_count = df.groupby('author_nationality').size()
import matplotlib.pyplot as plt
labels = country_count.index.tolist()
sizes = country_count.tolist()
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.axis('equal')
plt.show()
最后,我们需要在命令行中运行Python代码,如下所示:
python analysis.py
其中,analysis.py
是我们编写的Python逻辑代码文件。