本文中测验需要的文件夹下载链接: https://pan.baidu.com/s/1OqFM2TNY75iOST6fBlm6jw 密码: rmbt 下载压缩包后解压如下图所示:
image.png
首先将5题的文件复制形成副本,如下图所示:
image.png
在资源管理器的路径中输入cmd,如下图所示:
image.png
在上图中输入后,按Enter键运行进入cmd窗口。 在cmd窗口中输入并运行命令:jupyter notebook,如下图所示:
image.png
在上图中输入后,按Enter键运行自动打开浏览器并且进入jupyter notebook编程界面。 在jupyter notebook中,点击第一题,ipynb和第一题-副本.ipynb。 浏览器会新建两个标签页,如下图所示:
image.png
在两个标签页中,读者可以对照题目要求完成做题。 下面是5道题目作者的答案和解析。
最后2行代码可以使作图时不出现编码错误,分别用来正常显示中文标签和正常显示负号。
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
csv文件默认的分隔符是逗号,pd.read_csv方法中sep关键字参数的默认值也为逗号,所以可以不写sep关键字。 显示前十行数据用chipo.head(10)即可。
chipo = pd.read_csv('datasets/chipo.csv')
chipo.head(10)
给出的答案示例是购买次数排名第2-6名的商品的作图结果。 chipo.item_name.value_counts()是对商品购买次数进行统计,返回的结果降序排列,数据类型为Series。 plt.xticks()方法中可以填入1个参数或者多个参数,下面代码中采用的是填入3个参数。 x_list是x轴标记点,数据类型为列表;xticks_list是x轴标记点显示值,数据类型为列表; rotation设置为90,是x轴标记点显示值以右边为轴逆时针旋转90度。 plt.bar方法中指定每根柱子的颜色,这样才可以画出示例答案的效果。
mostOrder_list = chipo.item_name.value_counts().iloc[5:0:-1]
xticks_list = mostOrder_list.index
x_list = range(len(xticks_list))
y_list = mostOrder_list.values
plt.bar(x_list, y_list, width=0.5, color=['b', 'orange', 'g', 'r', 'purple'])
plt.xticks(x_list, xticks_list, rotation=90)
plt.title('购买次数最多的商品排名')
plt.xlabel('商品名称')
plt.ylabel('出现的订单次数')
plt.show()
上面这段代码的运行结果如:
柱形图.png
先将chipo这个变量深度拷贝给c变量,这样可以避免影响原数据,使代码每次都能成功运行。 item_price这个单词是一个条目的价格,不是单个商品的单价。 我们平时超市购物的单子的最后price那一列也是算的这一个条目的价格,比如2个相同的商品算1个条目。
c = chipo.copy()
c.quantity = c.quantity.astype('int')
c.item_price = c.item_price.str.strip('$').astype('float')
order_group = c.groupby('order_id')
x_list = order_group.item_price.sum()
y_list = order_group.quantity.sum()
plt.scatter(x_list, y_list, color='g')
plt.xlabel('订单总价')
plt.ylabel('商品总数')
plt.title('每笔订单总金融和购买商品数量关系')
plt.show()
上面这段代码的运行结果如下:
散点图.png
最后2行代码可以使作图时不出现编码错误,分别用来正常显示中文标签和正常显示负号。
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
csv文件默认的分隔符是逗号,pd.read_csv方法中sep关键字参数的默认值也为逗号,所以可以不写sep关键字。 显示前五行数据用chipo.head()即可。
top250 = pd.read_csv('datasets/special_top250.csv')
top250.head()
x_series = top250.movie_duration
y_series = top250.num
plt.figure(figsize=(14,6))
plt.subplot(121)
plt.scatter(x_series, y_series)
plt.xlabel('电影时长')
plt.ylabel('电影排名')
plt.gca().invert_yaxis()
plt.subplot(122)
plt.hist(x_series,bins=50)
plt.show()
上面一段代码的运行结果如下:
image.png
bins = [0,80,120,140,180,1000]
tags = ['偏短','标准','正常','偏长','超长']
在pandas官网中查询pandas.cut函数中的参数,其中参数bins是数据区间分割值,参数labels是数据按照区间分类后的标签,如下图所示。如果参数bins和labels都是可迭代对象,则bins比labels长度大1。
pandas.cut用法官方文档.png
将电影时长分类后赋值给duration_labeled_series变量,数据类型为Series。查看其中的值,如下图所示:
image.png
对duration_labeled_series变量统计每个分类出现的次数,使用value_counts方法。
duration_series = top250.movie_duration
duration_labeled_series = pd.cut(duration_series, bins=bins, labels=tags)
duration_labeled_series.value_counts()
duration_stat_series = duration_labeled_series.value_counts(sort=False)
duration_stat_series.plot(kind='bar')
plt.show()
上面一段代码的运行结果如下:
image.png
最后2行代码可以使作图时不出现编码错误,分别用来正常显示中文标签和正常显示负号。
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
csv文件默认的分隔符是逗号,pd.read_csv方法中sep关键字参数的默认值也为逗号,所以可以不写sep关键字。 显示前五行数据用chipo.head()即可。
tip_df = pd.read_csv('datasets/tips.csv')
tip_df.head()
plt.hist方法中参数bins用来指定出现多少根柱子,参数width用来指定每根柱子的宽度。
plt.hist(tip_df.total_bill, bins=10, width=4)
plt.xlabel('消费总金额')
plt.ylabel('频率')
plt.show()
上面一段代码的运行结果如下图所示:
直方图.png
利用plt.scatter方法画出散点图
plt.scatter(tip_df.total_bill, tip_df.tip)
plt.xlabel('总消费金额')
plt.ylabel('小费金额')
plt.show()
上面一段代码的运行结果如下:
散点图.png
观察示例答案中左右两幅图,不同的地方有:处于画板的位置、标题、散点颜色。 定义函数drawScatter用于绘制散点图,传入4个参数:数据group、处于画板的位置subplot、标题title、散点颜色。
def drawScatter(group, subplot, title, color):
plt.subplot(subplot)
plt.xlabel('消费总金额')
plt.ylabel('小费金额')
plt.title(title)
plt.scatter(group.total_bill, group.tip, color=color)
plt.figure(figsize=(12,6))
for name,group in tip_df.groupby('smoker'):
if name == 'Yes':
drawScatter(group, 121, '吸烟顾客', 'green')
else:
drawScatter(group, 122, '不吸烟顾客', 'blue')
plt.show()
上面一段代码的运行结果如下:
组合散点图.png
在有2组散点的散点图当中,第1组散点默认为橘黄色,第2组散点默认为天蓝色。
def drawScatter2(df, subplot, title, sex):
plt.subplot(subplot)
plt.title(title)
for name, group in df.groupby('smoker'):
if name == 'Yes':
plt.scatter(group.total_bill, group.tip,
label=sex+'吸烟顾客')
else:
plt.scatter(group.total_bill, group.tip,
label=sex+'不吸烟顾客')
plt.legend()
plt.figure(figsize=(12,6))
for name,group in tip_df.groupby('sex'):
if name == 'Male':
drawScatter2(group, 121, 'sex=Male', '男性')
else:
drawScatter2(group, 122, 'sex=Female', '女性')
plt.show()
上面一段代码的运行结果如下图所示:
组合散点图.png
import os
import re
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
df = pd.read_csv("nlp/labeledTrainData.tsv", sep='\t', escapechar='\\')
print('记录数: {}'.format(len(df)))
df.head()
def display(text, title):
print(title)
print("\n----------我是分割线-------------\n")
print(text)
text1 = df.iloc[1]['review']
display(text1, '原始数据')
text2 = BeautifulSoup(text1, 'lxml').text
display(text2, '去掉HTML标签的数据')
text3 = re.sub('[^\w\s]', '',text2)
display(text3, '去掉标点的数据')
text4 = text3.lower()
word_list = text4.split(' ')
display(word_list, '纯词列表数据')
with open('nlp/stopwords.txt') as file:
stopword_list = [k.strip() for k in file.readlines()]
new_word_list = [k for k in word_list if k not in stopword_list]
display(new_word_list, '去掉停用词数据')
stopword_list = list(set(stopword_list))
这个函数就是对前面零散步骤的总结,所以前面的大部分代码可以直接复制过来。
with open('nlp/stopwords.txt') as file:
stopword_list = [k.strip() for k in file.readlines()]
stopword_list = list(set(stopword_list))
def clean_text(text1):
text2 = BeautifulSoup(text1, 'lxml').text
text3 = re.sub('[^\w\s]', '',text2)
text4 = text3.lower()
word_list = text4.split(' ')
new_word_list = [k for k in word_list if k not in stopword_list]
return ' '.join(new_word_list)
df['clean_review'] = df.review.apply(clean_text)
df.head()
上面一段代码的运行结果如下图所示:
第4题最终结果.png
最后2行代码可以使作图时不出现编码错误,分别用来正常显示中文标签和正常显示负号。
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
baby_df = pd.read_csv('datasets/US_Baby_names_right.csv')
baby_df.info()
new_df = baby_df.drop(['Unnamed: 0', 'Id'], axis=1)
# del baby_df['Unnamed: 0']
# del baby_df['Id']
new_df.head()
baby_df.Gender.value_counts()
names = new_df.groupby('Name').sum()
names.head()
sorted_names = names.sort_values(by='Count', ascending=False)
sorted_names.head()
第1种方法:
len(baby_df.Name.unique())
第2种方法:
len(names)
第3种方法:
baby_df.Name.value_counts().count()
min_count = sorted_names.iloc[-1]['Count']
len(names[names.Count == min_count])
names.drop('Year', axis=1).describe()