(头歌作业)—6.1 葡萄酒评论分析报告(project)
第1关:葡萄酒评论分析报告——国家列表和平均分
任务描述
本关任务:编写程序,多维度分析葡萄酒数据。
相关知识
葡萄酒评论分析报告描述
winemag-data.csv
文件 winemag-data.csv 包含 编号、国家、描述、评分、价格、省份 等 6列 和12974行葡萄酒评论的数据。数据格式如下所示:
number,country,description,points,price,province 30,France,"Red cherry fruit comes laced with....",86,15,Beaujolais 50,Italy,"This blend of Nero Avola and Syrah....",86,15,Sicily 100,US,"Fresh apple, lemon and pear flavors....",88,18,New York
通过分析这些数据,用户可以根据产地、评份、价格等挑选适合自己的葡萄酒,商家可以分析消费者的购买行为习惯,可以更加准确地提供适合市场的产品,精准定位客户。
请读取文件中的数据,完成以下任务:
输入 国家名列表 ,统计文件中出现的葡萄酒生产国家,输出不重复的国家名列表,按字母表升序排序, 若国家名数据缺失,略过该条数据,返回值中不包含空字符串元素
输入 平均分 ,计算每个国家的葡萄酒的平均得分( 保留最多 2 位小数),返回值为国家名和得分的列表
输入其他时,输出 输入错误
编程要求
根据提示,在右侧编辑器补充代码,完成葡萄酒评论分析报告代码编写。
测试说明
平台会对你编写的代码进行测试:
示例仅为格式展示,与测试用例无关
测试输入1:
国家名列表
预期输出1:
['Argentina', 'Armenia', ...... 'US', 'Ukraine', 'Uruguay']
测试输入2:
平均分
预期输出2:
[['Argentina', 86.72], ['Armenia', 87.0],...... ['Ukraine', 83.0], ['Uruguay', 88.0]]
开始你的任务吧,祝你成功!
import pandas as pd# 定义符号常量,用于索引,使之具有清晰的语义
COUNTRY = 1
POINTS = 3def csv_to_ls(file):"""接收文件名为参数,用pandas读取文件中的数据,数据部分转为二维列表类型,返回二维列表。"""wine_list = pd.read_csv(file).values.tolist()return wine_listdef country_ls(wine_list):"""接收列表格式的葡萄酒数据为参数,略过标题行,返回不重复的国家名列表,按字母表升序排序,若国家名数据缺失,略过该条数据,返回值中不包含空字符串元素。@参数 wine_list:葡萄酒数据,列表类型"""countries = []for line in wine_list[1:]:if line[COUNTRY]:countries.append(line[COUNTRY])countries = sorted(list(set(countries)))return countriesdef avg_point(wine_list, country):"""接收列表格式的葡萄酒数据和国家名列表为参数,计算每个国家的葡萄酒的平均得分,返回值为国家名和得分的列表。@参数 wine_list:葡萄酒数据,列表类型@参数 country:国家名,列表类型"""result = []for c in country:points = []for line in wine_list[1:]:if line[COUNTRY] == c:points.append(float(line[POINTS]))if points:avg = round(sum(points) / len(points), 2)result.append([c, avg])return resultdef judge(txt):"""接收一个字符串为参数,根据参数值调用不同函数完成任务"""filename = 'data/winemag-data.csv'wine = csv_to_ls(filename)country = country_ls(wine)if txt == '国家名列表':print(country)elif txt == '平均分':print(avg_point(wine, country)) # 每个国家的葡萄酒的平均得分else:print('输入错误')if __name__ == '__main__':text = input()judge(text)
第2关:葡萄酒评论分析报告——平均分排序和评
任务描述
本关任务:编写程序,多维度分析葡萄酒数据。
相关知识
葡萄酒评论分析报告描述
文件 winemag-data.csv 包含 编号、国家、描述、评分、价格、省份 等 6列 和12974行葡萄酒评论的数据。数据格式如下所示:
number,country,description,points,price,province 30,France,"Red cherry fruit comes laced with....",86,15,Beaujolais 50,Italy,"This blend of Nero Avola and Syrah....",86,15,Sicily 100,US,"Fresh apple, lemon and pear flavors....",88,18,New York
通过分析这些数据,用户可以根据产地、评份、价格等挑选适合自己的葡萄酒,商家可以分析消费者的购买行为习惯,可以更加准确地提供适合市场的产品,精准定位客户。
请读取文件中的数据,完成以下任务:
输入 平均分排序 ,计算每个国家的葡萄酒的平均得分,返回值为国家名和得分的列表, 按评分由高到低降序排列
输入 评分最高 ,输出评分最高的十款葡萄酒的编号、出产国、评分和价格,按评分降序输出
输入其他时,输出 输入错误
编程要求
根据提示,在右侧编辑器补充代码,完成葡萄酒评论分析报告代码编写。
测试说明
平台会对你编写的代码进行测试:
示例仅为格式展示,与测试用例无关
测试输入1:
平均分排序
预期输出1:
[['England', 91.33], ['Austria', 90.37], ['Morocco', 90.0], ...... ['Peru', 84.5], ['Lebanon', 83.0], ['Ukraine', 83.0]]
测试输入2:
评分最高
预期输出2:
[[60880, 'Italy', 99, 440.0], [82750, 'Italy', 99, 237.0],......[111760, 'France', 98, nan], [117140, 'US', 98, 55.0]]
开始你的任务吧,祝你成功!
import pandas as pd
import math# 定义符号常量,用于索引,使之具有清晰的语义
NUMBER = 0
COUNTRY = 1
DESCRIPTION = 2
POINTS = 3
PRICE = 4def csv_to_ls(file):"""接收文件名为参数,用pandas读取文件中的数据,数据部分转为二维列表类型,返回二维列表。"""wine_list = pd.read_csv(file).values.tolist()return wine_listdef country_ls(wine_list):"""接收列表格式的葡萄酒数据为参数,略过标题行,返回不重复的国家名列表,按字母表升序排序,若国家名数据缺失,略过该条数据,返回值中不包含空字符串元素。@参数 wine_list:葡萄酒数据,列表类型"""country_list = []for x in wine_list:if x[COUNTRY] not in country_list and x[COUNTRY]:country_list.append(x[COUNTRY])country_list.sort()return country_listdef avg_point_sort(wine_list, country):"""接收列表格式的葡萄酒数据和国家名列表为参数,计算每个国家的葡萄酒的平均得分,返回值为国家名和得分的列表,按评分由高到低降序排列。@参数 wine_list:葡萄酒数据,列表类型@参数 country:国家名,列表类型"""country_avg_points = []for c in country:points = []for wine in wine_list:if wine[COUNTRY] == c and not math.isnan(wine[POINTS]):points.append(wine[POINTS])if points:avg_point = round(sum(points) / len(points), 2)country_avg_points.append([c, avg_point])country_avg_points.sort(key=lambda x: x[1], reverse=True)return country_avg_pointsdef top_10_point(wine_list):"""接收列表格式的葡萄酒数据参数,返回评分最高的十款葡萄酒的编号、出产国、评分和价格,按评分降序输出。需要注意的是评分可能有缺失值,此时该数据为nanif math.isnan(x) == False可用于判定x的值是不是nannan的数据类型是float,不可以直接用字符串判定方法。@参数 wine_list:葡萄酒数据,列表类型"""filtered_wine_list = [wine for wine in wine_list if not math.isnan(wine[POINTS])]top_10_wines = sorted(filtered_wine_list, key=lambda x: x[POINTS], reverse=True)[:10]result = [[wine[NUMBER], wine[COUNTRY], wine[POINTS], wine[PRICE]] for wine in top_10_wines]return resultdef judge(txt):"""接收一个字符串为参数,根据参数值调用不同函数完成任务"""filename = 'data/winemag-data.csv'wine = csv_to_ls(filename)country = country_ls(wine)if txt == '平均分排序':print(avg_point_sort(wine, country)) # 每个国家的葡萄酒的平均得分降序输出elif txt == '评分最高':print(top_10_point(wine)) # 评分最高的十款葡萄酒的编号、出产国、评分和价格,按评分降序输出else:print('输入错误')if __name__ == '__main__':text = input()judge(text)
第3关:葡萄酒评论分析报告——价格最高和葡萄评分
任务描述
本关任务:编写程序,多维度分析葡萄酒数据。
相关知识
葡萄酒评论分析报告描述
文件 winemag-data.csv 包含 编号、国家、描述、评分、价格、省份 等 6列 和12974行葡萄酒评论的数据。数据格式如下所示:
number,country,description,points,price,province 30,France,"Red cherry fruit comes laced with....",86,15,Beaujolais 50,Italy,"This blend of Nero Avola and Syrah....",86,15,Sicily 100,US,"Fresh apple, lemon and pear flavors....",88,18,New York
通过分析这些数据,用户可以根据产地、评份、价格等挑选适合自己的葡萄酒,商家可以分析消费者的购买行为习惯,可以更加准确地提供适合市场的产品,精准定位客户。
请读取文件中的数据,完成以下任务:
输入 价格最高 ,略过价格缺失的数据,输出价格最高的二十款葡萄酒的编号、出产国、评分和价格,按价格降序输出
输入 葡萄酒评分 ,统计各个评分的葡萄酒数量是多少?按评分从低到高顺序输出各个评分的葡萄酒数量的列表;输出拥有葡萄酒数量最多的评分和数量;输出拥有葡萄酒数量最多的评分的葡萄酒的平均价格
输入其他时,输出 输入错误
编程要求
根据提示,在右侧编辑器补充代码,完成葡萄酒评论分析报告代码编写。
测试说明
平台会对你编写的代码进行测试:
示例仅为格式展示,与测试用例无关
测试输入1:
价格最高
预期输出1:
[[80290, 'France', 88, 3300.0], [15840, 'France', 96, 2500.0], ...... [69210, 'France', 93, 450.0], [21720, 'France', 95, 440.0]]
测试输入2:
葡萄酒评分
预期输出2:
[[80, 38], [81, 71], ...... [95, 140], [96, 50], [97, 26], [98, 8], [99, 3]]
[86, 1743]
31.02
开始你的任务吧,祝你成功!
import pandas as pd
import math# 定义符号常量,用于索引,使之具有清晰的语义
NUMBER = 0
COUNTRY = 1
POINTS = 3
PRICE = 4def csv_to_ls(file):"""接收文件名为参数,用pandas读取文件中的数据,数据部分转为二维列表类型,返回二维列表。"""wine_list = pd.read_csv(file).values.tolist()return wine_listdef top_20_price(wine_list):"""接收列表格式的葡萄酒数据参数,返回价格最高的二十款葡萄酒的编号、出产国、评分和价格,按价格降序输出。@参数 wine_list:葡萄酒数据,列表类型需要注意的是价格可能有缺失值,此时该数据为nanif math.isnan(x) == False可用于判定x的值是不是nannan的数据类型是float,不可以直接用字符串判定方法。"""valid_wine_list = [wine for wine in wine_list if not math.isnan(wine[PRICE])]sorted_wine_list = sorted(valid_wine_list, key=lambda x: x[PRICE], reverse=True)top_20 = sorted_wine_list[:20]result = [[wine[NUMBER], wine[COUNTRY], wine[POINTS], wine[PRICE]] for wine in top_20]return resultdef amount_of_point(wine_list):"""接收列表格式的葡萄酒数据参数,返回每个评分的葡萄酒数量,忽略没有评分的数据例如[...[84, 645], [85, 959],...]表示得分为84的葡萄酒645种,得分85的葡萄酒有959种。@参数 wine_list:葡萄酒数据,列表类型"""point_count = {}for wine in wine_list:if not math.isnan(wine[POINTS]):point = int(wine[POINTS])point_count[point] = point_count.get(point, 0) + 1result = [[k, v] for k, v in sorted(point_count.items())]return resultdef most_of_point(amount_of_points):"""接收每个评分的葡萄酒数量的列表为参数,返回获得该分数数量最多的评分和数量的列表。@参数 amount_of_points:每个评分的葡萄酒数量,列表类型"""max_count = 0max_point = Nonefor point, count in amount_of_points:if count > max_count:max_count = countmax_point = pointreturn [max_point, max_count]def avg_price_of_most_point(wine_list, most_of_points):"""接收列表格式的葡萄酒数据和获得最多的评分及数量的列表为参数忽略缺失价格的数据,返回这个分数的葡萄酒的平均价格,保留2位小数。@参数 wine_list:葡萄酒数据,列表类型@参数 most_of_points:获得最多的评分及数量,列表类型"""total_price = 0count = 0most_point = most_of_points[0]for wine in wine_list:if not math.isnan(wine[POINTS]) and not math.isnan(wine[PRICE]) and wine[POINTS] == most_point:total_price += wine[PRICE]count += 0 if math.isnan(wine[PRICE]) else 1return round(total_price / count, 2)def judge(txt):"""接收一个字符串为参数,根据参数值调用不同函数完成任务"""filename = 'data/winemag-data.csv'wine = csv_to_ls(filename)if txt == '价格最高':print(top_20_price(wine)) # 价格最高的二十款葡萄酒的编号、出产国、评分和价格,按价格降序输出elif txt == '葡萄酒评分':amount_point = amount_of_point(wine)most_point = most_of_point(amount_point)print(amount_point) # 各个评分的葡萄酒数量print(most_point) # 拥有葡萄酒数量最多的评分和数量print(avg_price_of_most_point(wine, most_point)) # 拥有葡萄酒数量最多的评分的葡萄酒的平均价格else:print('输入错误')if __name__ == '__main__':text = input()judge(text)