目錄
一、課題說明
1.1、設(shè)計原因:
1.2、設(shè)計目標(biāo):
1.3、開發(fā)環(huán)境:
1.4、爬取網(wǎng)站鏈接
二、準(zhǔn)備工作
2.1、數(shù)據(jù)獲?。?/p>
2.2、爬取的數(shù)據(jù)說明:
2.3、爬蟲程序設(shè)計的思路:
三、詳細(xì)設(shè)計
3.1、導(dǎo)入庫的模塊:
3.2、對數(shù)據(jù)先進(jìn)行讀?。?/p>
3.2.1、顯示前5條記錄
3.2.2、查看數(shù)據(jù)的規(guī)模:行數(shù)和列數(shù)
3.2.3、利用info()查看數(shù)據(jù)的維度、字段名及類型等
3.2.4、利用describe()查看數(shù)據(jù)初步統(tǒng)計信息
3.3、對數(shù)據(jù)整體進(jìn)行清洗:
3.3.1、查看數(shù)據(jù)是否有缺失值或者重復(fù)值
3.3.2、查看各元素是否為空值
3.4、對數(shù)據(jù)進(jìn)行統(tǒng)計:
3.4.1、查看規(guī)格列包含具體種類
3.4.2、查看規(guī)格列各種類出現(xiàn)的次數(shù)
3.5、對蔬菜數(shù)據(jù)分析
3.5.1、查看每一列的數(shù)據(jù)類型
3.5.2、查看價格的相關(guān)情況
3.5.3、隨機抽取10條數(shù)據(jù):
3.6數(shù)據(jù)可視化展示:
3.6.1、#繪制每個屬性的直方圖,來快速了解數(shù)據(jù)
3.6.2、對平均價做對應(yīng)的直方圖與密度圖的集合、加陰影的圖以及小細(xì)線圖
3.6.3、對產(chǎn)地以及品名做計數(shù)圖
3.6.4、對產(chǎn)地的最高價繪制散點圖
3.6.5、對蔬菜信息表的前70條數(shù)據(jù)產(chǎn)地的平均價繪制箱線圖
3.6.6、對蔬菜信息表的前100條數(shù)據(jù)繪制最高價與最低價繪制多面板圖
3.6.7、對蔬菜信息表第10條到20條數(shù)據(jù)繪制分組關(guān)系圖
3.6.8、對于蔬菜信息表的最高價、最低價、平均價特征進(jìn)行兩兩對比
3.6.9、繪制蔬菜信息表100到300條數(shù)據(jù)品名次數(shù)分布的散點圖
3.6.10、蔬菜規(guī)格展示圖
3.6.11、按照產(chǎn)地繪制柱狀圖
3.6.12、分析最高價與最低價以及平均價之間的箱線圖
3.6.13、查看魯?shù)氐母魇卟似骄鶅r的分布情況餅圖展示
3.6.14、繪制產(chǎn)地的詞云
3.6.15、紅尖椒與線椒的最高價、最低價、平均價隨日期的變化趨勢
3.6.16、繪制最高價前40的品名的散點圖
3.6.17“紅尖椒”的最高價在全部時間的分布情況餅圖展示
3.6.18、“番茄”的最高價在全部時間的變化情況折線圖展示
3.6.19、產(chǎn)地信息第200到1000條數(shù)據(jù)的蔬菜分布圖
3.6.20、最低價排序第300到500條數(shù)據(jù)的蔬菜分布圖
3.6.21、查看規(guī)格列各種類出現(xiàn)的次數(shù),并且繪制節(jié)點圖
3.6.22、部分蔬菜產(chǎn)地路線和數(shù)量圖
四、設(shè)計遇到的問題以及難點:
4.1關(guān)鍵技術(shù)與難點:
4.2 處理數(shù)據(jù)與繪制圖像
五、設(shè)計的總結(jié)與體會
一、課題說明
1.1、設(shè)計原因:
參考數(shù)據(jù)可視化課程內(nèi)容,結(jié)合已學(xué)習(xí)的課程知識,對新發(fā)地官網(wǎng)的蔬菜價格數(shù)據(jù)進(jìn)行“爬取—清洗—存儲—可視化—結(jié)論性分析”的工作。
1.2、設(shè)計目標(biāo):
通過對上述數(shù)據(jù)的爬取和分析,實現(xiàn)對數(shù)據(jù)的整體評價或預(yù)測,并對一些數(shù)據(jù)進(jìn)行可視化展示。
1.3、開發(fā)環(huán)境:
主要是Jupyter Notebook
1.4、爬取網(wǎng)站鏈接
http://www.xinfadi.com.cn/priceDetail.html
二、準(zhǔn)備工作
2.1、數(shù)據(jù)獲取:
爬取的代碼:
import json
import requests
import threading
import pandas as pd
# 頁數(shù)
page = 1
# 商品總列表
count = []
# json列表
jsons = []
# 解析網(wǎng)頁函數(shù)
def url_parse(page):
??? # 請求地址
??? url = 'http://www.xinfadi.com.cn/getPriceData.html'
??? headers = {
??????? "Accept": "*/*",
??????? "Accept-Encoding": "gzip, deflate",
??????? "Accept-Language": "zh-CN,zh;q=0.9",
??????? "Cache-Control": "no-cache",
??????? "Connection": "keep-alive",
??????? "Content-Length": "89",
??????? "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
??????? "Host": "www.xinfadi.com.cn",
??????? "Origin": "http://www.xinfadi.com.cn",
??????? "Pragma": "no-cache",
??????? "Referer": "http://www.xinfadi.com.cn/priceDetail.html",
??????? "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
??????? "X-Requested-With": "XMLHttpRequest",
??? }
??? data = {
??????? "limit": "20",
??????? "current": page,
??????? "pubDateStartTime": "",
??????? "pubDateEndTime": "",
? ??????"prodPcatid": "1186",? # 商品類id
??????? "prodCatid": "",
??????? "prodName": "",
??? }
??? response = requests.post(url=url, headers=headers, data=data).text
??? # 獲取商品信息
??? response = json.loads(response)['list']
??? # 生成線程鎖對象
??? lock = threading.RLock()
??? # 上鎖
??? lock.acquire()
??? # 添加到j(luò)son列表中
??? jsons.append(response)
??? # 解鎖
??? lock.release()
# 解析json函數(shù)
def json_parse(product):
??? lock = threading.RLock()
??? lock.acquire()
??? dic = {'品名': product['prodName'], "最低價": product['lowPrice'], '最高價': product['highPrice'],
?????????? '平均價': product['avgPrice'], '規(guī)格': product['specInfo'], '產(chǎn)地': product['place'],
?????????? '單位': product['unitInfo'],
?????????? '發(fā)布日期': product['pubDate']}
??? print(dic)
??? # 將商品信息添加到商品總列表中
??? count.append(dic)
??? lock.release()
if __name__ == '__main__':
??? num = int(input('請輸入爬取頁數(shù):'))
??? # 多進(jìn)程解析網(wǎng)頁
??? for i in range(1, num + 1):
??????? x = threading.Thread(target=url_parse, args=(i,))
??????? x.start()
??? x.join()
??? # 多進(jìn)程解析json
??? for i in jsons:
??????? for product in i:
??????????? y = threading.Thread(target=json_parse, args=(product,))
??????????? y.start()
??? y.join()
??? # 生成excel
??? data = pd.DataFrame(count)
??? data.to_excel('爬取蔬菜相關(guān)信息.xlsx', index=None)
2.2、爬取的數(shù)據(jù)說明:
本次爬蟲從2022-11-07到2022-11-22開始爬取,共爬取了100頁,1741條數(shù)據(jù),八列分別為品名、最低價、最高價、平均價、規(guī)格、產(chǎn)地、單位、發(fā)布日期、等,其中無重復(fù)值,產(chǎn)地有409個缺失值,規(guī)格有1188個缺失值,缺失值過多不能直接刪除,這兩個變量在后續(xù)研究中只看比較關(guān)系,無需填充,所以不用進(jìn)行缺失值處理。數(shù)據(jù)類型有兩類,object類型的數(shù)據(jù)有產(chǎn)地、單位、發(fā)布日期、品名、規(guī)格等,float64類型的數(shù)據(jù)包括平均價、最低價、最高價等。
2.3、爬蟲程序設(shè)計的思路:
向HTML網(wǎng)頁提交POST請求的方法,對應(yīng)于HTTP的POST,找到蔬菜信息頁面,然后進(jìn)行翻頁,發(fā)現(xiàn)頁面的url沒有發(fā)生改變,所有蔬菜信息是通過接口數(shù)據(jù)動態(tài)獲取的,是動態(tài)數(shù)據(jù)。進(jìn)行chrom調(diào)試抓包,找到每個頁面信息所在的url,發(fā)現(xiàn)每個信息的url都相同,post請求,formdata不同。通過修改提交的data來獲取不同頁面的蔬菜信息。
三、詳細(xì)設(shè)計
3.1、導(dǎo)入庫的模塊:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import jieba
from tkinter import _flatten
import wordcloud
import warnings#引入警告信息庫
warnings.filterwarnings('ignore')#過濾警告信息
import pandas as pd
from matplotlib.font_manager import FontProperties
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
%matplotlib inline
3.2、對數(shù)據(jù)先進(jìn)行讀?。?/h3>
3.2.1、顯示前5條記錄
df1 = pd.read_excel(r'爬取蔬菜相關(guān)信息.xlsx')
df1
df1.head()
df1 = pd.read_excel(r'爬取蔬菜相關(guān)信息.xlsx')
df1
df1.head()
查詢結(jié)果:
3.2.2、查看數(shù)據(jù)的規(guī)模:行數(shù)和列數(shù)
print(df1.shape)? #查看維度
print(df1.index.size) #獲得行數(shù)
print(df1.columns.size)? #獲得列數(shù)
查詢結(jié)果:
(1740, 8)
1740
8
3.2.3、利用info()查看數(shù)據(jù)的維度、字段名及類型等
df1.info()
查詢結(jié)果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1740 entries, 0 to 1739
Data columns (total 8 columns):
#?? Column? Non-Null Count? Dtype?
---? ------? --------------? -----?
?0?? 品名????? 1740 non-null?? object
?1?? 最低價???? 1740 non-null?? float64
2?? 最高價???? 1740 non-null?? float64
3?? 平均價???? 1740 non-null?? float64
4?? 規(guī)格????? 552 non-null??? object
?5?? 產(chǎn)地????? 1331 non-null?? object
?6?? 單位????? 1740 non-null?? object
?7?? 發(fā)布日期??? 1740 non-null?? object
dtypes: float64(3), object(5)
memory usage: 108.9+ KB
3.2.4、利用describe()查看數(shù)據(jù)初步統(tǒng)計信息
df1.describe()
查詢結(jié)果:
3.3、對數(shù)據(jù)整體進(jìn)行清洗:
3.3.1、查看數(shù)據(jù)是否有缺失值或者重復(fù)值
#查看是否存在重復(fù)行
df1.duplicated()
#查看重復(fù)行與非重復(fù)行的數(shù)量
cf = df1.duplicated()
cf.value_counts()
查詢結(jié)果:
False??? 1740
dtype: int64
3.3.2、查看各元素是否為空值
df1.isnull()
df1.isnull().any()
#各列含空值的具體數(shù)目
df1.isnull().sum()
查詢結(jié)果:
品名???????? 0
最低價??????? 0
最高價??????? 0
平均價??????? 0
規(guī)格????? 1188
產(chǎn)地?????? 409
單位???????? 0
發(fā)布日期?????? 0
dtype: int64
可以得到該數(shù)據(jù)集中產(chǎn)地有409個缺失值,規(guī)格有1188個缺失值,缺失值過多不能直接刪除,這兩個變量在后續(xù)研究中只看比較關(guān)系,所以無需填充
3.4、對數(shù)據(jù)進(jìn)行統(tǒng)計:
3.4.1、查看規(guī)格列包含具體種類
p1 = df1['規(guī)格'].drop_duplicates()
ww = []
for i in p1:
??? ww.append(i)
ww
查詢結(jié)果:
[nan, '大', '白球\\凈', '毛\\箱', '大\\小', '紅\\黃', '泥\\洗', '洗', '脆', '黃', '麻', '泥', '紅', '鐵棍', '龍薯九', '西瓜紅\\煙薯', '濕\\干', '黏\\甜', '長\\短', '箱', '袋\\箱', '黑框', '紙箱\\泡沫箱', '白框', '鮮干花', '旱\\荷蘭', '吊', '地', '長\\小', '姜頭\\整', '機剝\\手工', '凈', '毛', '新', '小葉']
3.4.2、查看規(guī)格列各種類出現(xiàn)的次數(shù)
from collections import Counter
Counter(df1['規(guī)格'])
查詢結(jié)果:
Counter({nan: 1188,
???????? '大': 17,
???????? '白球\\凈': 15,
???????? '毛\\箱': 15,
???????? '大\\小': 15,
???????? '紅\\黃': 16,
???????? '泥\\洗': 29,
???????? '洗': 31,
???????? '脆': 15,
???????? '黃': 15,
???????? '麻': 14,
???????? '泥': 16,
???????? '紅': 15,
???????? '鐵棍': 14,
???????? '龍薯九': 14,
???????? '西瓜紅\\煙薯': 14,
???????? '濕\\干': 12,
???????? '黏\\甜': 13,
???????? '長\\短': 13,
???????? '箱': 13,
???????? '袋\\箱': 56,
???????? '黑框': 15,
???????? '紙箱\\泡沫箱': 15,
???????? '白框': 15,
???????? '鮮干花': 14,
???????? '旱\\荷蘭': 14,
???????? '吊': 14,
???????? '地': 14,
???????? '長\\小': 14,
???????? '姜頭\\整': 14,
???????? '機剝\\手工': 14,
???????? '凈': 14,
???????? '毛': 14,
???????? '新': 14,
???????? '小葉': 5})
可以看到規(guī)格為'袋\箱'的較多,出現(xiàn)了56次,其次依次是'洗'31次,’泥\洗’29,'大'17次,'等,'小葉'出現(xiàn)較少,僅有5次,規(guī)格列缺失較多,但我們只需對已有的值進(jìn)行分析,.缺失值不影響比較結(jié)果,所以不對其進(jìn)行處理
3.5、對蔬菜數(shù)據(jù)分析
3.5.1、查看每一列的數(shù)據(jù)類型
df1.dtypes
查詢結(jié)果:
品名?????? object
最低價???? float64
最高價???? float64
平均價???? float64
規(guī)格?????? object
產(chǎn)地?????? object
單位?????? object
發(fā)布日期???? object
dtype: object
3.5.2、查看價格的相關(guān)情況
#最高價的平均值
pj1 = df1['最高價'].mean()
print("最高價的平均值是{}".format(pj1))
#最高價的眾數(shù):
zs1 = df1['最高價'].mode()
print("最高價的眾數(shù)是:{}".format(zs1))
#最高價的方差:
fc1 = df1['最高價'].var()
print("最高價的方差是:{}".format(fc1))
查詢結(jié)果:
最高價的平均值是3.1683333333333357
最高價的眾數(shù)是:0??? 2.0
Name: 最高價, dtype: float64
最高價的方差是:12.062323270078608
#最低價的平均值
pj2 = df1['最低價'].mean()
print("最低價的平均值是{}".format(pj2))
#最低價的眾數(shù):
zs2 = df1['最低價'].mode()
print("最低價的眾數(shù)是:{}".format(zs2))
#最低價的方差:
fc2 = df1['最低價'].var()
print("最低價的方差是:{}".format(fc2))
查詢結(jié)果:
最低價的平均值是2.454327586206895
最低價的眾數(shù)是:0??? 1.5
Name: 最低價, dtype: float64
最低價的方差是:10.684754061688226
#平均價的平均值
pj3 = df1['平均價'].mean()
print("平均價的平均值是{}".format(pj3))
#平均價的眾數(shù):
zs3 = df1['平均價'].mode()
print("平均價的眾數(shù)是:{}".format(zs3))
#平均價的方差:
fc3 = df1['平均價'].var()
print("平均價的方差是:{}".format(fc3))
查詢結(jié)果:
平均價的平均值是2.8115000000000028
平均價的眾數(shù)是:0??? 1.25
Name: 平均價, dtype: float64
平均價的方差是:11.286187455434195
對最高價、最低價以及平均價做成圖表:
data = {'平均值':[pj1,pj2,pj3],'眾數(shù)':[zs1,zs2,zs3],'方差':[fc1,fc2,fc3]}
w = pd.DataFrame(data,index=['最高價','最低價','平均價'])
w
3.5.3、隨機抽取10條數(shù)據(jù):
sj = df1.sample(10)
sj
3.6數(shù)據(jù)可視化展示:
3.6.1、#繪制每個屬性的直方圖,來快速了解數(shù)據(jù)
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
df1.hist(bins=100,figsize=(20,20))
plt.show()
?
3.6.2、對平均價做對應(yīng)的直方圖與密度圖的集合、加陰影的圖以及小細(xì)線圖
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
fig,axes = plt.subplots(1,3)
sns.distplot(df_sc['平均價'].head(80),ax = axes[0],kde = True,rug = True)
sns.kdeplot(df_sc['平均價'].head(80),ax = axes[1],shade = True)#陰影
sns.rugplot(df_sc['平均價'].head(80),ax = axes[2])
plt.show()
?
3.6.3、對產(chǎn)地以及品名做計數(shù)圖
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
sns.countplot(x = "產(chǎn)地",hue = "品名",data = df_sc.head(20))
?
3.6.4、對產(chǎn)地的最高價繪制散點圖
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
sns.swarmplot(x=df_sc['最高價'][200:400],y=df_sc['產(chǎn)地'][200:250],data=df_sc['最高價'][200:400])#產(chǎn)地上面最高價的數(shù)量
?
3.6.5、對蔬菜信息表的前70條數(shù)據(jù)產(chǎn)地的平均價繪制箱線圖
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
sns.boxplot(x = df_sc['產(chǎn)地'].head(70),y = df_sc['平均價'][40:100])#箱線圖
plt.show()
?
3.6.6、對蔬菜信息表的前100條數(shù)據(jù)繪制最高價與最低價繪制多面板圖
sns.jointplot(kind = "hex",x = '最高價',y = '最低價',data = df_sc.head(100))
#繪圖多變量分布關(guān)系
plt.show()
?
3.6.7、對蔬菜信息表第10條到20條數(shù)據(jù)繪制分組關(guān)系圖
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
sns.factorplot(x = "最低價",col = "產(chǎn)地",col_wrap = 4,data = df_sc[10:20],kind = "count",size = 2.5,aspect = 1)
?
3.6.8、對于蔬菜信息表的最高價、最低價、平均價特征進(jìn)行兩兩對比
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei']# 添加中文字體支持
plt.rcParams['font.serif'] = ['simhei']
sns.pairplot(df_sc[['最高價','最低價','平均價']],diag_kind = 'auto')
?
3.6.9、繪制蔬菜信息表100到300條數(shù)據(jù)品名次數(shù)分布的散點圖
from pyecharts.charts import Scatter
w2 = data1.sort_values('品名',ascending=True)[100:300]
y = []??
x = []
for i in w2['品名'].value_counts().index:
??? x.append(i)
for i in w2['品名'].value_counts():
??? y.append(i)
c = Scatter(opts.InitOpts(width = '660px',height = "380px"))
c.add_xaxis(x)#x軸
c.add_yaxis("品名次數(shù)",y)#加入與前面的一一對應(yīng)
c.set_global_opts(title_opts = opts.TitleOpts(title = "品名出現(xiàn)次數(shù)的散點圖"))
c.render_notebook()
?
3.6.10、蔬菜規(guī)格展示圖
from pyecharts import options as opts
from pyecharts.charts import Pie
www = df1['規(guī)格'].value_counts().index
cc = df1['規(guī)格'].value_counts()
c = (Pie().add("", [list(z) for z in zip(www,cc)],center=["80%", "40%"],radius=["30%", "60%"],)
??? .set_global_opts(title_opts=opts.TitleOpts(title="蔬菜規(guī)格"),
????????? ???????????legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="0%"),)
??? .set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}")))
c.render_notebook()
?
3.6.11、按照產(chǎn)地繪制柱狀圖
w2 = data1.sort_values('產(chǎn)地',ascending=True)
y = []??
x = []
for i in w2['產(chǎn)地'].value_counts().index:
??? x.append(i)
for i in w2['產(chǎn)地'].value_counts():
??? y.append(i)
bar1 = (Bar().add_xaxis(x).add_yaxis('個數(shù)', y)
?????? .set_global_opts(title_opts=opts.TitleOpts("產(chǎn)地信息的蔬菜分布圖"),
??????????????????????? yaxis_opts=opts.AxisOpts(name="個數(shù)"),??
??????????????????????? xaxis_opts=opts.AxisOpts(name="產(chǎn)地"))
)
bar1.render_notebook()
?
3.6.12、分析最高價與最低價以及平均價之間的箱線圖
corr = df1[['最高價','最低價','平均價']].corr()
corr
sns.heatmap(corr,xticklabels = corr.columns,yticklabels = corr.columns)
?
3.6.13、查看魯?shù)氐母魇卟似骄鶅r的分布情況餅圖展示
data1 = pd.read_excel(r'爬取蔬菜相關(guān)信息.xlsx')
d1 = data1[data1['產(chǎn)地'] == "魯"]
from pyecharts.charts import *
from pyecharts import options as opts
num = d1['平均價'].value_counts()
c = Pie(init_opts=opts.InitOpts(theme='light',width='1000px',height='600px'))
c.add("", [list(z) for z in zip(num.index, num)])
c.set_global_opts(title_opts=opts.TitleOpts(title="魯?shù)氐母魇卟似骄鶅r的分布情況餅圖"),
????????????????? legend_opts=opts.LegendOpts(type_="scroll", pos_left="90%", orient="vertical"))
c.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
c.set_series_opts(label_opts=opts.LabelOpts(position='top',
????????????????????????????????? color='red', font_family='Arial',
????????????????????????????????? font_size=12,font_style='italic',
????????????????????????????????? interval=1,formatter=':{c}, 占比n5n3t3z%'))
c.render_notebook()
?
3.6.14、繪制產(chǎn)地的詞云
import jieba
from tkinter import _flatten
import wordcloud
data1 = pd.read_excel(r'爬取蔬菜相關(guān)信息.xlsx').astype(str)
comment =data1[~data1['產(chǎn)地'].isin(["nan"])]
comment_cut = comment['產(chǎn)地'].apply(jieba.lcut)
comment_last = [] #一維列表,存放分詞結(jié)果
for i in comment_cut:
??? for j in i:
??????? comment_last.append(j)
counts = {}
for word in comment_last:
??? if len(word) > 1:
??????? counts[word] = counts.get(word, 0) + 1
pic = plt.imread(r'tx5.jpg')
w = wordcloud.WordCloud(
??? mask = pic, #背景圖片
??? background_color = 'white',#詞云背景顏色
??? font_path='C:/Windows/Fonts/simhei.TTF' #設(shè)置為中文字體,否則無法正常顯示
)
w.fit_words(counts)#傳入詞頻為字典類型,dic為上述字典
plt.imshow(w) #轉(zhuǎn)為plt圖形數(shù)據(jù)
plt.axis('off')#取消顯示x-y軸
plt.show()#展示圖形
w.to_file(r'產(chǎn)地5.jpg')
?
3.6.15、紅尖椒與線椒的最高價、最低價、平均價隨日期的變化趨勢
yj = df1[df1['產(chǎn)地']=='魯冀']
yj['規(guī)格'].value_counts()
yj['品名'].value_counts()
x=[]
for i in yj['發(fā)布日期'].sort_values().drop_duplicates():#.drop_duplicates去重
??? x.append(i[4:20])
print(x)
r1 = yj[yj['品名']=='紅尖椒']['最高價']
r2 = yj[yj['品名']=='紅尖椒']['最低價']
r3 = yj[yj['品名']=='紅尖椒']['平均價']
r4 = yj[yj['品名']=='線椒']['最高價']
r5 = yj[yj['品名']=='線椒']['最低價']
r6 = yj[yj['品名']=='線椒']['平均價']
from pyecharts.charts import Line
from pyecharts.globals import ThemeType
c=(Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis(x)
??? .add_yaxis("紅尖椒最高價",r1,is_smooth=True)#is_smooth平滑曲線
??? .add_yaxis("紅尖椒最低價",r2,is_smooth=True)?????????
??? .add_yaxis("紅尖椒平均價",r3,is_smooth=True)
??? .add_yaxis("線椒最高價",r4,is_smooth=True)?????????
??? .add_yaxis("線椒最低價",r5,is_smooth=True)
??? .add_yaxis("線椒平均價",r6,is_smooth=True)?????????
??? .set_global_opts(title_opts=opts.TitleOpts(title="紅尖椒和線椒的最高價、最低價、平均價隨日期的變化趨勢",pos_left="center",pos_top="3%")))
c.render_notebook()
?
3.6.16、繪制最高價前40的品名的散點圖
from pyecharts.charts import Scatter
data2 = pd.read_excel(r'爬取蔬菜相關(guān)信息.xlsx').astype(str)
w1 = data2.sort_values('最高價',ascending=False).head(40)
comment =w1['品名']
y = []
x = []
for i in comment.value_counts().index:
??? x.append(i)
for i in comment.value_counts():
??? y.append(i)
c = Scatter(opts.InitOpts(width = '660px',height = "380px"))
c.add_xaxis(x)#x軸
c.add_yaxis("品名",[list(z) for z in zip(y, x)],symbol_size=20)#加入與前面的一一對應(yīng)
c.set_global_opts(title_opts=opts.TitleOpts(title="最高價前40的品名散點圖"))
c.render_notebook()
?
3.6.17“紅尖椒”的最高價在全部時間的分布情況餅圖展示
d3 = data1[data1['品名']=="紅尖椒"]
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
d3['最高價'].value_counts()
a1=[]
for i in d3['最高價'].value_counts().index:
??? a1.append(i)
c = Pie(opts.InitOpts(width = '800px',height = '380px'))
c.add("",[list(z) for z in zip(a1,d3['最高價'].value_counts())],
??????? rosetype="radius",radius=["20%", "40%"],center=["35%", "40%"],
??????? label_opts=opts.LabelOpts(is_show=False),)
c.add("",[list(z) for z in zip(a1,d3['最高價'].value_counts())],
??????? rosetype="area",radius=["20%", "40%"], center=["73%", "40%"])
c.set_global_opts(title_opts=opts.TitleOpts(title="紅尖椒的最高價在全部時間的分布情況玫瑰圖示"),
??????????????? legend_opts=opts.LegendOpts(orient="vertical", pos_top="30%", pos_left="2%"))
#設(shè)置數(shù)據(jù)標(biāo)簽格式
c.set_series_opts(label_opts=opts.LabelOpts(formatter=": {c},占比:n5n3t3z%"))
c.render_notebook()
?
3.6.18、“番茄”的最高價在全部時間的變化情況折線圖展示
d3 = data1[data1['品名']=="番茄"]
d4 = d3[d3['產(chǎn)地']=='蒙冀魯'].sort_values('發(fā)布日期')
d5 = d3[d3['產(chǎn)地']=='蒙'].sort_values('發(fā)布日期')
a=[]
for i in d4['發(fā)布日期']:
??? a.append(i[5:10])
print(a)
b = d4['最高價']
e = d5['最高價']
y1=[]
for i in b:
??? y1.append(i)
y2=[]
for i in e:
??? y2.append(i)
from pyecharts.charts import Bar, Grid, Line
bar = ( Bar().add_xaxis(a).add_yaxis("蒙冀魯",y1).add_yaxis("蒙",y2)
??? .set_global_opts(title_opts=opts.TitleOpts(title="番茄最高價隨時間變化情況直方圖展示")))
line = (Line().add_xaxis(a).add_yaxis("蒙", b).add_yaxis("蒙冀魯", e)
??? .set_global_opts(title_opts=opts.TitleOpts(title="番茄最高價隨時間變化情況折線圖展示", pos_top="48%"),
??????? legend_opts=opts.LegendOpts(pos_top="48%"),))
grid = (Grid().add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
.add(line, grid_opts=opts.GridOpts(pos_top="60%"))
)
grid.render_notebook()
?
3.6.19、產(chǎn)地信息第200到1000條數(shù)據(jù)的蔬菜分布圖
w2 = data1.sort_values('最低價',ascending=True).head(100)[200:1000]
y = []??
x = []
for i in w2['品名'].value_counts().index:
??? x.append(i)
for i in w2['品名'].value_counts():
??? y.append(i)
bar1 = (Bar().add_xaxis(x).add_yaxis('個數(shù)', y)
?????? .set_global_opts(title_opts=opts.TitleOpts("最低價排序前100的蔬菜分布圖"),
??????????????????????? yaxis_opts=opts.AxisOpts(name="個數(shù)"),??
??????????????????????? xaxis_opts=opts.AxisOpts(name="品名"))
)
bar1.render_notebook()
?
3.6.20、最低價排序第300到500條數(shù)據(jù)的蔬菜分布圖
from pyecharts.charts import Funnel
w3 = data1.sort_values('最高價',ascending=True)[300:500]
y = []??
x = []
for i in w3['產(chǎn)地'].value_counts().index:
??? x.append(i)
for i in w3['產(chǎn)地'].value_counts():
??? y.append(i)
wf = Funnel()
wf.add('產(chǎn)地最高價分布圖',[list(z) for z in zip(x,y)],is_selected = True)
wf.render_notebook()
?
3.6.21、查看規(guī)格列各種類出現(xiàn)的次數(shù),并且繪制節(jié)點圖
from collections import Counter
Counter(df1['產(chǎn)地'])
#繪制各省份蔬菜產(chǎn)地之間的關(guān)聯(lián)關(guān)系
from pyecharts.charts import Graph
nodes_data = [
??? opts.GraphNode(name = '遼',symbol_size = 18),
??? opts.GraphNode(name = '京',symbol_size = 20),
??? opts.GraphNode(name = '冀',symbol_size = 15),
??? opts.GraphNode(name = '魯',symbol_size = 30),
??? opts.GraphNode(name = '豫',symbol_size = 25),
??? opts.GraphNode(name = '云',symbol_size = 15),
??? opts.GraphNode(name = '蒙',symbol_size = 35),
??? opts.GraphNode(name = '蘇',symbol_size = 20),
??? opts.GraphNode(name = '浙',symbol_size = 13),
]
links_data = [
??? opts.GraphLink(source = '遼',target = '魯',value = 28),
??? opts.GraphLink(source = '遼',target = '冀',value = 13),
??? opts.GraphLink(source = '遼',target = '云',value = 15),
??? opts.GraphLink(source = '魯',target = '遼',value = 14),
??? opts.GraphLink(source = '遼',target = '京',value = 11),
??? opts.GraphLink(source = '魯',target = '京',value = 15),
??? opts.GraphLink(source = '京',target = '冀',value = 5),
??? opts.GraphLink(source = '京',target = '豫',value = 3),???
??? opts.GraphLink(source = '冀',target = '遼',value = 44),???
??? opts.GraphLink(source = '冀',target = '京',value = 45),
??? opts.GraphLink(source = '冀',target = '云',value = 18),
??? opts.GraphLink(source = '蒙',target = '冀',value = 16),
??? opts.GraphLink(source = '冀',target = '浙',value = 11),
??? opts.GraphLink(source = '魯',target = '云',value = 25),
??? opts.GraphLink(source = '魯',target = '遼',value = 14),
??? opts.GraphLink(source = '魯',target = '冀',value = 13),
??? opts.GraphLink(source = '豫',target = '蘇',value = 14),
??? opts.GraphLink(source = '云',target = '魯',value = 10),
??? opts.GraphLink(source = '蒙',target = '冀',value = 16),
??? opts.GraphLink(source = '蒙',target = '魯',value = 20),
]
c = Graph(init_opts = opts.InitOpts(width = '600px',height = '400px'))
c.add("",nodes_data,links_data,repulsion = 4500)
c.set_global_opts(title_opts = opts.TitleOpts(title = "Graph - Example"))
c.render_notebook()
?
3.6.22、部分蔬菜產(chǎn)地路線和數(shù)量圖
from pyecharts.charts import Geo
from pyecharts.globals import ChartType,SymbolType
c = (Geo(init_opts = opts.InitOpts(width = '600px',height = '400px'))
??? .add_schema(maptype = "china")#類型是中國
??? .add("蔬菜產(chǎn)地",[("山東",28),("天津",3),("北京",45),("云南",18),
???????????????? ("山東",58),("河南",14),("浙江",11),("遼寧",13)],
??????? type_ = ChartType.EFFECT_SCATTER,color = "green")
??? .add("地方",[("遼寧","山東"),("云南","天津"),("河北","北京"),
?????????????? ("河北","云南"),("河北","山東"),("河北","河南"),
?????????????? ("河北","浙江"),("河北","遼寧")],
??????? type_ = ChartType.LINES,
??????? effect_opts = opts.EffectOpts(symbol = SymbolType.ARROW,symbol_size = 6,color = "blue"),
??????? linestyle_opts = opts.LineStyleOpts(curve = 0.2))#設(shè)置曲度
??? .set_series_opts(label_opts = opts.LabelOpts(is_show = False))#去掉主要航線標(biāo)簽
??? .set_global_opts(title_opts = opts.TitleOpts(title = "部分蔬菜產(chǎn)地路線和數(shù)量")))
c.render_notebook()
?
四、設(shè)計遇到的問題以及難點:
4.1關(guān)鍵技術(shù)與難點:
(1)、如何爬取大量數(shù)據(jù)且保證數(shù)據(jù)的有效性
(2)、數(shù)據(jù)處理的方法,相關(guān)函數(shù)的應(yīng)用,圖像的制作
(3)、選定所要制作圖像的數(shù)據(jù)
(4)、對所得結(jié)果的綜合性分析
4.2 處理數(shù)據(jù)與繪制圖像
(1)、有些數(shù)據(jù)在使用時出來的圖像效果不明顯
解決方法:選擇合適的數(shù)據(jù)進(jìn)行分析
(2)、對一些方法的使用不夠熟練,導(dǎo)致設(shè)計的程序一直不過
解決方法:在前面學(xué)習(xí)過的知識進(jìn)行深入理解,在網(wǎng)絡(luò)上查看博主寫的相關(guān)函數(shù)參數(shù)介紹,正確使用之后程序調(diào)試通過
(3)、前期對于繪制怎樣的圖像沒有頭緒
解決方法:參考網(wǎng)絡(luò)上博主的圖形分析,以及所學(xué)繪圖知識,慢慢搭建起自己的圖形
(4)、最后完成數(shù)據(jù)分析之后,依舊覺得自己爬取分析的數(shù)據(jù)量有點少,應(yīng)該在設(shè)計之前再多參考一下網(wǎng)上可以爬取的數(shù)據(jù)。
五、設(shè)計的總結(jié)與體會
在這次的課程設(shè)計當(dāng)中,讓我對于數(shù)據(jù)可視化這門課程有了更加深入的認(rèn)識與理解,也真正體會到了數(shù)據(jù)可視化在生活當(dāng)中的應(yīng)用,真正體會到了什么是“一圖勝千言”。用我們目前掌握的繪圖庫,可以繪制出來多種多樣的圖,讓我影響深刻的圖是漏斗圖,餅圖,詞云,?;鶊D,玫瑰圖,節(jié)點圖,以及價格變化圖,每張圖都能一目了然的反映數(shù)據(jù)不能直接反映的問題。文章來源:http://www.zghlxwxcb.cn/news/detail-480330.html
這次課程設(shè)計主要運用了我們本學(xué)期在數(shù)據(jù)可視化上學(xué)到的繪圖與數(shù)據(jù)分析等模塊,對于學(xué)到的知識應(yīng)該學(xué)以致用,要不斷的訓(xùn)練,才能更好地學(xué)習(xí)和掌握它。通過本次的課程設(shè)計,我也發(fā)現(xiàn)我還有許多不足之處。首先對一些函數(shù)的參數(shù)使用不熟練,以及數(shù)據(jù)的繪圖方面還有一些欠缺的地方。我相信,通過這次的課程設(shè)計,我對于自己的欠缺知識有了更多的發(fā)現(xiàn),我會在以后的學(xué)習(xí)中不斷完善自己的編程能力。文章來源地址http://www.zghlxwxcb.cn/news/detail-480330.html
到了這里,關(guān)于數(shù)據(jù)可視化課程設(shè)計——北京新發(fā)地官網(wǎng)數(shù)據(jù)分析與可視化展示【內(nèi)容在jupyter notebook里面展示】包含數(shù)據(jù)爬取與可視化分析詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!