一。Dataframe的分组。
再网页表格数据 的分析中,可以使用以下语句进行爬取表格。
res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin') ### 返回的是一个列表 列表中是当前页面的所有表格数据
read_html可以爬取表格,取出其中所需要的表格进行处理:
champion = res[0] champion.columns = champion.iloc[0] #### 将第一行的数据 赋值给 列名 champion.drop([0], inplace=True) #### 将第一行数据 删除掉
对于这段数据需要进行分组。分组之后进行计数即可。
champion.groupby('冠军').groups champion.groupby('冠军').size().sort_values(ascending=False)
如果需要统计其他数据,只需要再groupbt中添加列表。
champion.groupby(['冠军', 'FMVP']).size()
二。DataFrame的时间数据处理。
处理时间需要导入一个模块。
import dateutil
将时间格式转化成元组
dateutil.parser.parse("2019 Jan 2nd") datetime.datetime(2019, 1, 2, 0, 0)
转化列表时间
pd.to_datetime(['2018-01-01', '2019-02-02']) DatetimeIndex(['2018-01-01', '2019-02-02'], dtype='datetime64[ns]', freq=None)
生成时间序列
pd.date_range("2019-1-1","2019-2-2", freq='M') DatetimeIndex(['2019-01-31'], dtype='datetime64[ns]', freq='M')
三。matplotlib
首先导入这个模块
import numpy as np import pandas as pd import matplotlib.pyplot as plt
将表格支持中文:
#### windows下好使 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
1.折线图
首先需要生成一个plot画布
a = [3,1,10,6] ### 默认显示Y轴的值 plt.plot(a) #### plot()画折现图的函数 plt.show() #### 显示画的图表
需要将一个列表放入该画布展示。
如果需要同时键入x轴和y轴,可以输入两个:
plt.plot(x, y, color='k', marker='D', linestyle=':') ### 画图
plt.show() ### 显示
如果需要设置画布大小可以使用以下语句:
x = [2,5,7,10] y = [1,2,3,4] plt.figure(figsize=(10,6)) #### 设置画布大小
可以设置图的标签和x轴y轴
plt.title('title标题', fontsize=20, color='red') #### 设置图表的标题 plt.xlabel('x轴', fontsize=20) #### 设置x轴的值 plt.ylabel('y轴', fontsize=20) #### 设置y轴的值
其中设置的点数可以通过color,marker,linestyle进行设置。也可以通过plot?进行查询。
2.柱状图
首先获取数据:
df = pd.read_csv('./douban_movie.csv') df.head()
将获取到的数据进行处理:
res = df.groupby('产地').size().sort_values(ascending=False)
再生成一个bar柱状图,进行个性化设计
x = res.index y = res.values plt.figure(figsize=(20,6)) plt.title('每个国家或者地区的电影数量', fontsize=20) plt.xticks(rotation=90, fontsize=15, color='red') ##### 设置x轴字体的大小和颜色 plt.xlabel('产地', fontsize=20) plt.yticks(fontsize=15) plt.ylabel('数量', fontsize=20)
如果需要在每个柱状上显示数字,需要进行xy轴的定位
for a, b in zip(x,y): # plt.text? plt.text(a, b+100, b, horizontalalignment='center', fontsize=13) plt.bar(x, y) # plt.savefig? plt.show()
3.曲线图
绘制曲线图数据处理:
res = df.groupby(['年代']).size().sort_index() ### sort_values 按照值进行排序 sort_index 按照索引进行排序 res = res[:-2]
曲线图主要是plot,数据比较多的情况:
x = res.index y = res.values plt.figure(figsize=(10,6)) plt.title('历年电影上映数量', fontsize=20, color='red') plt.xlabel('年代', fontsize=15) plt.xticks(fontsize=13, color='green') plt.ylabel('数量', fontsize=20, color='blue') plt.yticks(color='blue', fontsize=13) plt.plot(x, y) plt.show()
4.绘制饼图:
饼图中的重点在于使用cut
cut中传入两个参数,返回值会根据第二个参数切分区域,并将第一个参数中的数值匹配这些区域,如果匹配不上就返回nan。
pd.cut(np.array([1, 7, 5, 4, 6, 3]), [1,3,5]) [NaN, NaN, (3.0, 5.0], (3.0, 5.0], NaN, (1.0, 3.0]] Categories (2, interval[int64]): [(1, 3] < (3, 5]]
所以,需要将数据获取,放入其中进行切分:
df_res = df['时长'] res = pd.cut(df_res, [0,60,90,120, 140, 1000]) ### df_res 是待分割的源数据 [0,60,90,120, 140, 1000] 是区间 左开右闭
输出的值是所有电影的归类,这个时候需要对其value_count获取值计数。
res = res.value_counts() (90, 120] 16578 (0, 60] 10324 (60, 90] 7727 (120, 140] 2718 (140, 1000] 1386
最后对数据进行个性化设置:
x = res.index y = res.values plt.title('电影时长分布饼图', fontsize=20) patch, l_text, p_text = plt.pie(y, labels = x, autopct='%.2f%%') for p in p_text: p.set_size(15) p.set_color('white') for l in l_text: l.set_size(13) l.set_color('r') plt.show()
hist:直方图。
画图工具:
echarts 和 highcharts 。