1.选题的背景
我本次的主题是泉州二手房房价的调查分析。
首先通过爬虫采集链家网上所有二手房的房源数据,并对采集到的数据进行清洗;然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的规律;将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们进行购房决策。
2 需求分析
随着越来越多的城市二手住房成交量超越新房,诸多一、二线城市迎来“存量”住宅交易时代,承接绝大多数购房需求释放。另一方面,自去年上半年以来,新房供应持续短缺也给二手住房交易不断“复苏”创造空间,更多购房需求主动“转移”至存量市场。数据表现为今年以来重点城市挂牌量的持续小幅减少,二手房住宅成交量的触底回升以及重点城市如广州、重庆、武汉等,一、二手房住宅价格持续“倒挂”,都预示二手房市场正以卖方为主导。
二、主题式网络爬虫设计方案
1. 主题页面的结构与特征分析
2.Htmls 页面解析
四、网络爬虫程序设计
1.数据爬取与采集
1 import requests 2 from bs4 import BeautifulSoup 3 import pandas as pd 4 import time 5 6 def getUrls(): 7 urls = [] # 列表 8 baseUrl = "https://quanzhou.lianjia.com/ershoufang/fengzequ1/" 9 for i in range(1, 100): # 限制 100页 101 10 url = "{}pg{}".format(baseUrl, i) 11 urls.append(url) # 把生成好的 url 添加到列表 urls 当中方便返回 12 return urls 13 14 15 def gethtmltext(url): 16 try: 17 r = requests.get(url, timeout=30) # 发送请求 18 r.raise_for_status() 19 return r.text 20 except: 21 return "" 22 23 24 def ParsePage(html): 25 soup = BeautifulSoup(html, features="html.parser") 26 title = soup.select(".title a[data-el]") 27 positionInfo = soup.select(".positionInfo") # 处理 28 houseInfo = soup.select(".houseInfo") # 处理 29 followInfo = soup.select(".followInfo") # 处理 30 totalPrice = soup.select(".totalPrice") # 处理 万 31 unitPrice = soup.select(".unitPrice") # 单价 xx 元/平米 32 tag = soup.find_all("div", attrs={"class": "tag"}) # 标签 33 count = len(title) # 获取数据行 34 # 定义一个列表 用于存储一页的数据 35 data = [] 36 # 格式打印 37 for i in range(count): 38 # 1.位置信息 根据 - 进行拆分 39 name = "" 40 region = "" 41 pos = str(positionInfo[i].text).split("-") 42 if len(pos) == 2: # 小区名称,区域 43 name = pos[0] 44 region = pos[1] 45 # 2. 房屋的基本信息 houseInfo 46 info = str(houseInfo[i].text).split("|") 47 if len(info) != 6: 48 break 49 # 面积 50 info[1] = float(info[1].replace("平米", "").strip()) 51 # 3. followInfo 52 focus_num = "" # 关注人数 53 publish_time = "" # 发布时间 54 f_info = str(followInfo[i].text).split("/") 55 if len(f_info) == 2: 56 focus_num = f_info[0] 57 publish_time = f_info[1] 58 # 4.万 59 total = str(totalPrice[i].text) 60 total = float(total.replace("万", "").strip()) 61 # 5.单价 xx 元/平米 62 unit = str(unitPrice[i].text) 63 unit = unit.replace(",", "") 64 unit = str(unit.replace("单价", "").replace("元/平米", "").strip()) 65 # 5. 标签 不定长标签 66 tag1 = tag[i].find_all("span") 67 tags = "" 68 for t in tag1: 69 tags += t.text + " " 70 data.append([title[i].text, name, region, 71 info[0], info[1], info[2], info[3], info[4], info[5], 72 focus_num, publish_time, 73 total, unit, tags]) 74 return data 75 # 添加一个标题行 76 head = [] 77 df = pd.DataFrame(head, columns=["标题", "名称", "区域", "户型", "面积", "朝向", "装修", "楼层", "结构", "关注", "时间", "总价", "单价", "标签"]) 78 df.to_csv("data.csv", mode="a", header=True, index=False, encoding="utf-8") 79 x = getUrls() # 返回值是一个列表 80 count = 1 81 for i in x: # i 是每一个链接 82 html = gethtmltext(i) # 用 html 保存获取到的网页的所有信息 83 # 解析每一页的数据 84 pagedata = ParsePage(html) # 解析每一页 pagedata 存放的是一页的数据 85 # 把每一页数据写入文件 86 # 学习一个新的库 pandas 专门用来做数据处理 数据分析 87 # 把数据写入文件 88 df = pd.DataFrame(pagedata) # DataFrame 数据帧 二维表格结构 89 df.to_csv("data.csv", mode="a", index=False, header=False, encoding="utf-8_sig") # 追加 90 print("第{}页写入完毕!".format(count)) 91 # print(html) 92 time.sleep(2) # 延时等待两秒 93 count += 1
数据清洗
1 import pandas as pd 2 3 df = pd.read_csv("data.csv") 4 print(df.shape) 5 df =df.dropna() 6 df = df.drop_duplicates() 7 print(df.shape) 8 print(df.describe())
关于面积
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 #读进来是一个二维表格结构 DataFrame 4 5 df = pd.read_csv("data.csv") 6 df =df.dropna() 7 df =df.drop_duplicates() 8 #统计 9 counts = df.groupby(by="区域").count() 10 plt.rcParams['font.sans-serif'] = 'SimHei' 11 ## 设置正常显示符号 12 13 plt.rcParams['axes.unicode_minus'] = Falseplt.title("各个区域的房源数量分析") 14 plt.bar(counts.index,counts["标题"],label="数量") 15 plt.xticks(rotation=45) 16 plt.ylabel("数量") 17 plt.legend() 18 for a,b in zip(counts.index, counts["标题"]) : 19 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="red") 20 plt.show()
户型线形图
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 df = pd.read_csv("data.csv") #读进来是一个二维表格结构 DataFrame 4 df =df.dropna() 5 df =df.drop_duplicates() 6 counts = df.groupby(by="户型").count() #统计 7 plt.figure(facecolor='pink') 8 plt.rcParams['font.sans-serif'] = 'SimHei' 9 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 10 plt.title("各种户型数量分析") 11 plt.plot(counts.index,counts["标题"],label="数量") 12 plt.xticks(rotation=45) 13 plt.ylabel("数量") 14 plt.legend() 15 for a,b in zip(counts.index, counts["标题"]) : 16 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="green") 17 plt.show()
户型柱状图
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 df = pd.read_csv("data.csv") 5 df = df.dropna() 6 df = df.drop_duplicates() 7 8 counts = df["户型"].value_counts().sort_index() 9 10 plt.figure(figsize=(10, 6)) 11 plt.bar(counts.index, counts.values, color="#b3c6ff") 12 plt.xlabel("户型") 13 plt.ylabel("数量") 14 plt.title("户型统计") 15 plt.xticks(rotation=45) 16 plt.grid(axis="y") 17 plt.show()
朝向
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 df = pd.read_csv("data.csv") #读进来是一个二维表格结构 DataFrame 4 df =df.dropna() 5 df =df.drop_duplicates() 6 counts = df.groupby(by="朝向").count() #统计 7 print(counts) 8 plt.rcParams['font.sans-serif'] = 'SimHei' 9 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 10 plt.title("朝向统计") 11 plt.bar(counts.index,counts["标题"],label="数量") 12 plt.xticks(rotation=90) 13 plt.ylabel("数量") 14 plt.legend() 15 for a,b in zip(counts.index, counts["标题"]) : 16 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="red") 17 plt.show()
双图共轴
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 df = pd.read_csv("data.csv") 5 df = df.dropna() 6 df = df.drop_duplicates() 7 8 df["单价"] = pd.to_numeric(df["单价"], errors='coerce') 9 df["总价"] = pd.to_numeric(df["总价"], errors='coerce') 10 11 counts = df["单价"].groupby(df["区域"]).median() # 统计 12 plt.rcParams['font.sans-serif'] = 'SimHei' 13 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 14 fig = plt.figure() 15 ax = fig.add_subplot(111) 16 ax.bar(counts.index, counts.values, label="平均单价(元/平米)", color="#b3c6ff") 17 18 ax2 = ax.twinx() 19 counts = df["总价"].groupby(df["区域"]).median() # 统计 20 ax2.plot(counts.index, counts.values, label="总价(万)", color="red") 21 fig.legend(loc=1, bbox_to_anchor=(1,1), bbox_transform=ax.transAxes) #防止图例变形 22 plt.show()
面积饼图
1 import matplotlib.pyplot as plt 2 import pandas as pd 3 # 读取数据文件 4 df = pd.read_csv("data.csv") 5 df = df.dropna() 6 df = df.drop_duplicates() 7 df.isnull().any() 8 # 分割面积数据为不同的区间 9 divide=[0,30,50,70,90,120,140,160,1200] 10 # 获取面积列数据 11 cut= pd.cut(list(df["面积"]),divide) 12 data= cut.describe() 13 # print(data.columns) 14 # print(data.counts,data.freqs) 15 explode = (0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0) 16 # 调整为与x的长度相同 17 18 # 绘制扇形图 19 plt.pie(x=data.freqs, explode=explode, labels=data.index, autopct="%1.2f%%", startangle=45, radius=1) 20 plt.rcParams['font.sans-serif'] = 'SimHei' 21 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 22 plt.legend(loc='best') 23 plt.title("面积占比分析") 24 plt.show()
各个区域关注的人员统计全部代码
1 import matplotlib.pyplot as plt 2 import pandas as pd 3 df = pd.read_csv("data.csv") # 读进来是一个二维表格结构 DataFrame 4 df = df.dropna() 5 df = df.drop_duplicates() 6 def parse(x): 7 if "人关注" in x: 8 return int(x.replace("人关注","").strip()) 9 else: 10 return -1 11 df["关注"] = df["关注"].apply(lambda x : parse(x) ) 12 df = df.drop( df[df["关注"]==-1 ].index ) 13 plt.rcParams['font.sans-serif'] = 'SimHei' 14 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 15 res =df["关注"].groupby(df["区域"]).sum() 16 plt.title("各个区域关注人数统计") 17 plt.xticks(rotation=45 ) 18 plt.bar(res.index,res.values) 19 for a,b in zip(res.index, res.values) : 20 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10) 21 plt.show()
全部代码
1 import requests 2 from bs4 import BeautifulSoup 3 import pandas as pd 4 import time 5 6 def getUrls(): 7 urls = [] # 列表 8 baseUrl = "https://quanzhou.lianjia.com/ershoufang/fengzequ1/" 9 for i in range(1, 100): # 限制 100页 101 10 url = "{}pg{}".format(baseUrl, i) 11 urls.append(url) # 把生成好的 url 添加到列表 urls 当中方便返回 12 return urls 13 14 15 def gethtmltext(url): 16 try: 17 r = requests.get(url, timeout=30) # 发送请求 18 r.raise_for_status() 19 return r.text 20 except: 21 return "" 22 23 24 def ParsePage(html): 25 soup = BeautifulSoup(html, features="html.parser") 26 title = soup.select(".title a[data-el]") 27 positionInfo = soup.select(".positionInfo") # 处理 28 houseInfo = soup.select(".houseInfo") # 处理 29 followInfo = soup.select(".followInfo") # 处理 30 totalPrice = soup.select(".totalPrice") # 处理 万 31 unitPrice = soup.select(".unitPrice") # 单价 xx 元/平米 32 tag = soup.find_all("div", attrs={"class": "tag"}) # 标签 33 count = len(title) # 获取数据行 34 # 定义一个列表 用于存储一页的数据 35 data = [] 36 # 格式打印 37 for i in range(count): 38 # 1.位置信息 根据 - 进行拆分 39 name = "" 40 region = "" 41 pos = str(positionInfo[i].text).split("-") 42 if len(pos) == 2: # 小区名称,区域 43 name = pos[0] 44 region = pos[1] 45 # 2. 房屋的基本信息 houseInfo 46 info = str(houseInfo[i].text).split("|") 47 if len(info) != 6: 48 break 49 # 面积 50 info[1] = float(info[1].replace("平米", "").strip()) 51 # 3. followInfo 52 focus_num = "" # 关注人数 53 publish_time = "" # 发布时间 54 f_info = str(followInfo[i].text).split("/") 55 if len(f_info) == 2: 56 focus_num = f_info[0] 57 publish_time = f_info[1] 58 # 4.万 59 total = str(totalPrice[i].text) 60 total = float(total.replace("万", "").strip()) 61 # 5.单价 xx 元/平米 62 unit = str(unitPrice[i].text) 63 unit = unit.replace(",", "") 64 unit = str(unit.replace("单价", "").replace("元/平米", "").strip()) 65 # 5. 标签 不定长标签 66 tag1 = tag[i].find_all("span") 67 tags = "" 68 for t in tag1: 69 tags += t.text + " " 70 data.append([title[i].text, name, region, 71 info[0], info[1], info[2], info[3], info[4], info[5], 72 focus_num, publish_time, 73 total, unit, tags]) 74 return data 75 # 添加一个标题行 76 head = [] 77 df = pd.DataFrame(head, columns=["标题", "名称", "区域", "户型", "面积", "朝向", "装修", "楼层", "结构", "关注", "时间", "总价", "单价", "标签"]) 78 df.to_csv("data.csv", mode="a", header=True, index=False, encoding="utf-8") 79 x = getUrls() # 返回值是一个列表 80 count = 1 81 for i in x: # i 是每一个链接 82 html = gethtmltext(i) # 用 html 保存获取到的网页的所有信息 83 # 解析每一页的数据 84 pagedata = ParsePage(html) # 解析每一页 pagedata 存放的是一页的数据 85 # 把每一页数据写入文件 86 # 学习一个新的库 pandas 专门用来做数据处理 数据分析 87 # 把数据写入文件 88 df = pd.DataFrame(pagedata) # DataFrame 数据帧 二维表格结构 89 df.to_csv("data.csv", mode="a", index=False, header=False, encoding="utf-8_sig") # 追加 90 print("第{}页写入完毕!".format(count)) 91 # print(html) 92 time.sleep(2) # 延时等待两秒 93 count += 1 94 import pandas as pd 95 96 df = pd.read_csv("data.csv") 97 print(df.shape) 98 df =df.dropna() 99 df = df.drop_duplicates() 100 print(df.shape) 101 print(df.describe()) 102 import pandas as pd 103 import matplotlib.pyplot as plt 104 105 df = pd.read_csv("data.csv") #读进来是一个二维表格结构 DataFrame 106 df =df.dropna() 107 df =df.drop_duplicates() 108 counts = df.groupby(by="区域").count() #统计 109 plt.rcParams['font.sans-serif'] = 'SimHei' 110 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 111 plt.title("各个区域的房源数量分析") 112 plt.bar(counts.index,counts["标题"],label="数量") 113 plt.xticks(rotation=45) 114 plt.ylabel("数量") 115 plt.legend() 116 for a,b in zip(counts.index, counts["标题"]) : 117 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="red") 118 plt.show() 119 import matplotlib.pyplot as plt 120 import pandas as pd 121 df = pd.read_csv("data.csv") # 读进来是一个二维表格结构 DataFrame 122 df = df.dropna() 123 df = df.drop_duplicates() 124 def parse(x): 125 if "人关注" in x: 126 return int(x.replace("人关注","").strip()) 127 else: 128 return -1 129 df["关注"] = df["关注"].apply(lambda x : parse(x) ) 130 df = df.drop( df[df["关注"]==-1 ].index ) 131 plt.rcParams['font.sans-serif'] = 'SimHei' 132 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 133 res =df["关注"].groupby(df["区域"]).sum() 134 plt.title("各个区域关注人数统计") 135 plt.xticks(rotation=45 ) 136 plt.bar(res.index,res.values) 137 for a,b in zip(res.index, res.values) : 138 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10) 139 plt.show() 140 import pandas as pd 141 import matplotlib.pyplot as plt 142 df = pd.read_csv("data.csv") #读进来是一个二维表格结构 DataFrame 143 df =df.dropna() 144 df =df.drop_duplicates() 145 counts = df.groupby(by="户型").count() #统计 146 plt.figure(facecolor='pink') 147 plt.rcParams['font.sans-serif'] = 'SimHei' 148 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 149 plt.title("各种户型数量分析") 150 plt.plot(counts.index,counts["标题"],label="数量") 151 plt.xticks(rotation=45) 152 plt.ylabel("数量") 153 plt.legend() 154 for a,b in zip(counts.index, counts["标题"]) : 155 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="green") 156 plt.show() 157 import matplotlib.pyplot as plt 158 from wordcloud import WordCloud,ImageColorGenerator 159 text = open('data.csv', "r",encoding="utf-8").read()# 读取语料数据文件 160 background_img = plt.imread("bg.jpg")# 读取背景图 161 wc = WordCloud(font_path="吉祥宋.ttf", background_color="white", mask=background_img) 162 wc.generate(text)# 生成词云 163 image_color = ImageColorGenerator(background_img) # 从背景图片生成颜色值 164 wc.recolor(color_func=image_color)#对生成的图重新着色 165 wc.to_file("cloud.png")# 存储到文件 166 plt.imshow(wc)# 展示词云结果 167 plt.axis("off") 168 plt.show() 169 170 import pandas as pd 171 import matplotlib.pyplot as plt 172 df = pd.read_csv("data.csv") #读进来是一个二维表格结构 DataFrame 173 df =df.dropna() 174 df =df.drop_duplicates() 175 counts = df.groupby(by="朝向").count() #统计 176 print(counts) 177 plt.rcParams['font.sans-serif'] = 'SimHei' 178 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 179 plt.title("朝向统计") 180 plt.bar(counts.index,counts["标题"],label="数量") 181 plt.xticks(rotation=90) 182 plt.ylabel("数量") 183 plt.legend() 184 for a,b in zip(counts.index, counts["标题"]) : 185 plt.text(a,b+0.05,b, ha="center",va="bottom",fontsize=10,color="red") 186 plt.show() 187 import pandas as pd 188 import matplotlib.pyplot as plt 189 190 df = pd.read_csv("data.csv") 191 df = df.dropna() 192 df = df.drop_duplicates() 193 194 df["单价"] = pd.to_numeric(df["单价"], errors='coerce') 195 df["总价"] = pd.to_numeric(df["总价"], errors='coerce') 196 197 counts = df["单价"].groupby(df["区域"]).median() # 统计 198 plt.rcParams['font.sans-serif'] = 'SimHei' 199 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 200 fig = plt.figure() 201 ax = fig.add_subplot(111) 202 ax.bar(counts.index, counts.values, label="平均单价(元/平米)", color="#b3c6ff") 203 204 ax2 = ax.twinx() 205 counts = df["总价"].groupby(df["区域"]).median() # 统计 206 ax2.plot(counts.index, counts.values, label="总价(万)", color="red") 207 fig.legend(loc=1, bbox_to_anchor=(1,1), bbox_transform=ax.transAxes) #防止图例变形 208 plt.show() 209 import matplotlib.pyplot as plt 210 import pandas as pd 211 # 读取数据文件 212 df = pd.read_csv("data.csv") 213 df = df.dropna() 214 df = df.drop_duplicates() 215 df.isnull().any() 216 # 分割面积数据为不同的区间 217 divide=[0,30,50,70,90,120,140,160,1200] 218 # 获取面积列数据 219 cut= pd.cut(list(df["面积"]),divide) 220 data= cut.describe() 221 # print(data.columns) 222 # print(data.counts,data.freqs) 223 explode = (0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0) 224 # 调整为与x的长度相同 225 226 # 绘制扇形图 227 plt.pie(x=data.freqs, explode=explode, labels=data.index, autopct="%1.2f%%", startangle=45, radius=1) 228 plt.rcParams['font.sans-serif'] = 'SimHei' 229 plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号 230 plt.legend(loc='best') 231 plt.title("面积占比分析") 232 plt.show() 233 import pandas as pd 234 import matplotlib.pyplot as plt 235 236 df = pd.read_csv("data.csv") 237 df = df.dropna() 238 df = df.drop_duplicates() 239 240 counts = df["户型"].value_counts().sort_index() 241 242 plt.figure(figsize=(10, 6)) 243 plt.bar(counts.index, counts.values, color="#b3c6ff") 244 plt.xlabel("户型") 245 plt.ylabel("数量") 246 plt.title("户型统计") 247 plt.xticks(rotation=45) 248 plt.grid(axis="y") 249 plt.show() 250 import pandas as pd 251 import matplotlib.pyplot as plt 252 253 # 读取数据文件 254 df = pd.read_csv("data.csv", encoding="utf-8") 255 # 获取面积列数据 256 area = df["面积"].dropna().astype(float) 257 258 # 分割面积数据为不同的区间 259 divide = [0, 30, 50, 70, 90, 120, 140, 160, 1200] 260 cut = pd.cut(area, divide) 261 262 # 统计各区间的数量 263 area_counts = cut.value_counts() 264 265 # 绘制扇形图 266 plt.pie(area_counts, labels=area_counts.index, autopct="%1.2f%%", startangle=45) 267 plt.axis("equal") # 设置横纵轴相等,使扇形图为正圆形 268 plt.title("面积分布") 269 plt.show() 270 import pandas as pd 271 import matplotlib.pyplot as plt 272 273 # 读取数据文件 274 df = pd.read_csv("data.csv", encoding="utf-8") 275 # 获取装修列数据 276 decoration = df["装修"].dropna().astype(str) 277 # 统计各装修类型的数量 278 decoration_counts = decoration.value_counts() 279 280 # 绘制柱状图 281 plt.bar(decoration_counts.index, decoration_counts.values) 282 plt.xlabel("装修类型") 283 plt.ylabel("数量") 284 plt.title("装修类型统计") 285 plt.xticks(rotation=45) # 旋转x轴刻度标签,避免重叠 286 plt.show()
五.总结
感谢我们专业课老师的悉心教导,是他在我们感到困惑的时候一遍又一遍给我们耐心的讲解,这让我们学到很多专业知识。
此次我的项目收集了泉州市二手房信息,在收集数据的时候我采用了python网络爬虫技术、python数据分析技术。数据分析的流程是需求分析,然后是数据获取,对获取的数据进行数据预处理。首先我采用统计分析的方法对数据进行初步分析,大致了解整体二手房的情况,交易量分析,区域特征分析,户型分析,装修方面分析,房屋朝向分析,房价分布及其影响因素;随后调用百度地图API,编程实现数据地图可视化,并获取了具体的地址和重要的距离数据。
我们要的不是数据,而是数据告诉我们的事实。大多数人面临这样一个挑战:我们认识到数据可视化的必要性,但缺乏数据可视化方面的专业技能。部分原因可以归结于,数据可视化只是数据分析过程中的一个环节,数据分析师可能将精力花在获取数据、清洗整理数据、分析数据、建立模型。
大多数时候我们汇报工作就是要做好解释性分析的工作。一个完整的数据可视化过程,主要包括以下4个步骤:确定数据可视化的主题;提炼可视化主题的数据;根据数据关系确定图表;进行可视化布局及设计。
标签:plt,Python,爬虫,爬取,df,pd,import,counts,csv From: https://www.cnblogs.com/sgg0/p/17461625.html