[落选]狗熊会人才计划第6期选拔作业
數(shù)據(jù)就不貼了,給個(gè)描述吧
# <class 'pandas.core.frame.DataFrame'> # RangeIndex: 4492 entries, 0 to 4491 # Data columns (total 7 columns): # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 標(biāo)題 4417 non-null object # 1 標(biāo)題鏈接 4492 non-null object # 2 brief 4483 non-null object # 3 keywords 3272 non-null object # 4 發(fā)布時(shí)間 3817 non-null object # 5 新聞?lì)悇e 4492 non-null object # 6 采集時(shí)的時(shí)間 4492 non-null object # dtypes: object(7) # memory usage: 245.8+ KB大概就是這7列,還需要預(yù)處理一下
先對(duì)發(fā)布時(shí)間處理,好奇這是什么時(shí)段的新聞
dataI0['發(fā)布時(shí)間'].sort_values() # Out[7]: # 2988 2020-10-08 # 2987 2020-10-09 # 2986 2020-10-09 # 2985 2020-10-10 # 2984 2020-10-10 # ... # 4356 NaN # 4357 NaN # 4358 NaN # 4359 NaN # 4360 NaN # Name: 發(fā)布時(shí)間, Length: 4492, dtype: object啊這…有缺失值來著,忘記處理了
dataI0['發(fā)布時(shí)間'].dropna().sort_values() # Out[8]: # 2988 2020-10-08 # 2987 2020-10-09 # 2986 2020-10-09 # 2985 2020-10-10 # 2984 2020-10-10 # ... # 2374 21-4-23 # 2373 21-4-23 # 2371 21-4-23 # 2369 21-4-23 # 2372 21-4-23 # Name: 發(fā)布時(shí)間, Length: 3817, dtype: object噢,數(shù)據(jù)格式還不統(tǒng)一。由于上面是排序后的結(jié)果,所以我們可以直接找到所有不合格式的數(shù)據(jù),它們排序后都在一塊兒
dataI0.loc[2369:2393,'發(fā)布時(shí)間'] # Out[10]: # 2369 21-4-23 # 2370 21-4-23 # 2371 21-4-23 # 2372 21-4-23 # 2373 21-4-23 # 2374 21-4-23 # 2375 21-4-23 # 2376 21-4-23 # 2377 21-4-22 # 2378 21-4-22 # 2379 21-4-22 # 2380 21-4-22 # 2381 21-4-22 # 2382 21-4-22 # 2383 21-4-22 # 2384 21-4-22 # 2385 21-4-22 # 2386 21-4-22 # 2387 21-4-22 # 2388 21-4-22 # 2389 21-4-21 # 2390 21-4-21 # 2391 21-4-21 # 2392 21-4-21 # 2393 21-4-21 # Name: 發(fā)布時(shí)間, dtype: object噢,這個(gè)需要找找資料1
tmpDF = dataI0.loc[2369:2393,'發(fā)布時(shí)間'] # 取出時(shí)間格式不同的這幾個(gè)樣本tmpDF = pd.to_datetime(tmpDF,format="%y-%m-%d") # 按照'兩位數(shù)年份-月份-天數(shù)'的格式進(jìn)行轉(zhuǎn)換讀入時(shí)間類型dataI0.loc[2369:2393,'發(fā)布時(shí)間'] = tmpDF.dt.strftime("%Y-%m-%d") # 按照'四位數(shù)年份-月份-天數(shù)'的格式從時(shí)間類型當(dāng)中輸出dataI0['發(fā)布時(shí)間'].dropna().sort_values() # 去除缺失值之后對(duì)數(shù)據(jù)進(jìn)行排序 # 可以看到新聞的發(fā)布時(shí)間為2020-10-08到2021-04-24# Out[47]: # 2988 2020-10-08 # 2987 2020-10-09 # 2986 2020-10-09 # 2985 2020-10-10 # 2984 2020-10-10 # ... # 1934 2021-04-24 # 1935 2021-04-24 # 1936 2021-04-24 # 828 2021-04-24 # 0 2021-04-24 # Name: 發(fā)布時(shí)間, Length: 3817, dtype: object這里是直接使用了pandas自帶的模塊處理,也還有其他方法,可以參考博文1
做完這個(gè)才想起來好像有點(diǎn)不對(duì)…考慮了缺失,沒考慮重復(fù),趕緊給去個(gè)重,按著新聞的鏈接作為唯一標(biāo)識(shí)。
dataI0 = dataI0.drop_duplicates(['標(biāo)題鏈接']) # 網(wǎng)址鏈接相當(dāng)于數(shù)據(jù)的id # 根據(jù)id對(duì)網(wǎng)址進(jìn)行去重接下來,嗯,考慮補(bǔ)全數(shù)據(jù)。我覺得這個(gè)思路就很混亂,處理缺失、去除重復(fù),應(yīng)該是一開始就要做的事情吧…上面是在干啥,咋突然處理了一波時(shí)間格式。
dataM0 = dataI0.loc[dataI0['標(biāo)題'].isnull(),['標(biāo)題鏈接','標(biāo)題']].reset_index(drop=True) # 先抽取出標(biāo)題缺失的數(shù)據(jù),拿到新聞的網(wǎng)址鏈接 import requests from lxml import etreefor i in range(0,dataM0.shape[0]):print(i,'-'*10)# 打印序號(hào)htmlT = requests.get(dataM0.iloc[i,0])# 打開鏈接htmlT.encoding = 'utf-8'# 使用utf-8編碼htmlT = etree.HTML(htmlT.text)# 取出其中的文本dataM0.iloc[i,1] = htmlT.xpath('/html/body/div[12]/div[1]/div[1]/h1/text()')[0]# 根據(jù)xpath取出新聞標(biāo)題,需要精確到text()print(dataM0.iloc[i,1],'\n')# 打印新聞標(biāo)題dataI0.loc[dataI0['標(biāo)題'].isnull(),'標(biāo)題'] = dataM0['標(biāo)題'].values # 直接使用數(shù)據(jù)框賦值不可取 # 應(yīng)當(dāng)將取values后再賦值 # 因?yàn)閿?shù)據(jù)框之間的賦值好像需要看index這里需要說一下,我之前習(xí)慣的都是selenium的爬蟲,但是這次不頂用了,所以換了個(gè)方式。但是etree搞下來的數(shù)據(jù),它的xpath竟然需要精確到text(),這是我沒有想到的。按selenium的經(jīng)驗(yàn),我只把路徑寫到了h1,然后怎么搞都拿不到文本,后來查了博文才知道2。這個(gè)事情說來神奇,當(dāng)時(shí)查的其他博文34,都寫著可以到h1,然后用i.text拿到文本,但我這里就是不行。另外,這里還需要注意編碼的問題,我調(diào)成htmlT.encoding = 'utf-8’才正常,主要參考了博文5。
至于selenium為啥不行呢,我感覺根本原因是我太菜了不會(huì)用,直接原因如下:
# from selenium import webdriver # # driver_path = "D:\Software\Anaconda3\msedgedriver.exe" # # msedgedriver.exe 的路徑 # # browser = webdriver.Edge(executable_path=driver_path) # # 打開瀏覽器 # # browser.get(dataM0.iloc[0,0]) # # 打開網(wǎng)頁 # # rowCount = browser.find_element_by_xpath("/html/body/div[12]/div[1]/div[1]/h1") # # 選擇表格 # # # /html/body/div[13]/div[1]/div[1]/h1 # # /html/body/div[12]/div[1]/div[1]/h1 # # 在第一次爬取的時(shí)候div是12,第二次打開網(wǎng)頁就是13 # # 可以每次循環(huán)都新打開瀏覽器,每次循環(huán)關(guān)閉瀏覽器 # # 這樣似乎有點(diǎn)浪費(fèi)資源,放棄selenium接著處理一下keywords。訪問了一下原網(wǎng)頁發(fā)現(xiàn),原網(wǎng)頁當(dāng)中沒有keywords,看來需要自己動(dòng)手。考慮用TF-IDF,使用jieba庫6。這里有一個(gè)神奇的點(diǎn),本來是打算從brief當(dāng)中抽取關(guān)鍵詞,畢竟文本信息更多。但brief里面竟然不僅僅有這條新聞的消息,還有其他的諸如推薦的新聞等的文本…于是放棄brief,改用標(biāo)題。
dataM0 = dataI0.loc[dataI0['keywords'].isnull(),['標(biāo)題','keywords']].reset_index(drop=True) # 抽取keyword缺失的行from jieba.analyse import extract_tags # from jieba.analyse import textrank# for keyword, weight in extract_tags(dataM0.iloc[0,0], withWeight=True): # print('%s %s' % (keyword, weight)) # for keyword, weight in textrank(dataM0.iloc[0,0], withWeight=True): # print('%s %s' % (keyword, weight))for i in range(0,dataM0.shape[0]):print(i, '-' * 10)# 打印序號(hào)keyW = extract_tags(dataM0.iloc[i,0])dataM0.iloc[i, 1] = ','.join(keyW[0:3])# 對(duì)關(guān)鍵詞進(jìn)行拼接print(dataM0.iloc[i, 1])dataI0.loc[dataI0['keywords'].isnull(),'keywords'] = dataM0['keywords'].values # 直接使用數(shù)據(jù)框賦值不可取 # 應(yīng)當(dāng)將取values后再賦值 # 因?yàn)閿?shù)據(jù)框之間的賦值好像需要看index然后發(fā)布時(shí)間的話,可以直接從網(wǎng)址里面提取,用split進(jìn)行文本處理就好
brief缺失的話,直接丟掉那些行吧,我印象缺失的行不到1%
下面開始進(jìn)行可視化分析吧,好像也沒其他預(yù)處理了
首先想做一個(gè)按天為單位的新聞發(fā)布量時(shí)序圖,然后就出問題了。天數(shù)太多,坐標(biāo)軸密密麻麻地重疊,這不行啊。查了查資料7,應(yīng)當(dāng)將坐標(biāo)軸刻度間隔調(diào)大。
import seaborn as sns import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocatorcountN = dataI0['發(fā)布時(shí)間'].value_counts() countN.sort_index(inplace=True) sns.lineplot(countN.index,countN.values) x_major_locator=MultipleLocator(100) #把x軸的刻度間隔設(shè)置為100,并存在變量里 ax=plt.gca() #ax為兩條坐標(biāo)軸的實(shí)例 ax.xaxis.set_major_locator(x_major_locator) #把x軸的主刻度設(shè)置為10的倍數(shù) plt.show() # 按天統(tǒng)計(jì)的發(fā)布趨勢(shì)圖其他的圖,大概如下:
- 新聞?lì)悇e統(tǒng)計(jì)條形圖
- 各類新聞在月的粒度上發(fā)布量時(shí)序圖
- 發(fā)布量最大那天的新聞?lì)悇e條形圖
- 發(fā)布量最大那天的新聞?lì)悇e餅圖
- 根據(jù)keyword繪制詞云
貼一下部分代碼吧
# 21年4月20日的新聞?lì)悇e餅圖 plt.pie(countN.values,startangle = 90,counterclock = False) plt.legend(countN.index, loc=0) plt.show()# 按照關(guān)鍵詞繪制詞云 from wordcloud import WordCloud #用來正常顯示中文 plt.rcParams["font.sans-serif"]=["SimHei"]wordK = dataI0['keywords'].values wordK = ','.join(wordK) wordK = wordK.replace(',',' ')from PIL import Image import numpy as npmask_pic = Image.open("pic.jpg") mask_pic_array = np.array(mask_pic)wc=WordCloud(font_path='C:\\Windows\\Font\\simkai.ttf',background_color="white",mask = mask_pic_array) wc.generate(wordK) plt.imshow(wc,interpolation="bilinear") plt.axis("off") plt.show() # 可惜并沒有按照?qǐng)D片顯示出來噢,對(duì)了,這個(gè)地方還需要調(diào)一下設(shè)置,要不然中文會(huì)亂碼
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來顯示中文標(biāo)簽 plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負(fù)號(hào)以上,大概就是我提交的報(bào)名作品,然后就沒過…嗯,只能去玩兒別的了
在以上的基礎(chǔ)上,還想過做一個(gè)情感分析,等于說每一條新聞增加一列數(shù)據(jù),然后再進(jìn)行一些分析。或者是做embedding去訓(xùn)練一個(gè)新聞分類的模型,但意義不大,數(shù)據(jù)量太小。
這份報(bào)告大概是從當(dāng)天中文的12:53開始做,然后在截止時(shí)間20:00的19:40完成,然后檢查檢查改了幾個(gè)小錯(cuò)誤,還是準(zhǔn)備的不夠啊。據(jù)說這個(gè)報(bào)名從06月初就開始了,到07月10日左右結(jié)束…而我是當(dāng)天才開始做的。
然后關(guān)于狗熊會(huì)的培訓(xùn)和選拔也有點(diǎn)迷惑。怎么說呢,就是,人才計(jì)劃貌似是培養(yǎng)數(shù)據(jù)分析能力的,是先想選題再去找數(shù)據(jù)?大概吧,我感覺選題在前。然后此次選拔呢,說的是,“根據(jù)附件提供的數(shù)據(jù)(news.csv),自行確定選題,完成一份數(shù)據(jù)分析報(bào)告。”,就有種數(shù)據(jù)在選題之前的感覺。當(dāng)然事實(shí)上,數(shù)據(jù)肯定在選題之前,我們必然是要根據(jù)數(shù)據(jù)做選題的。但是,真實(shí)情況下的數(shù)據(jù)遠(yuǎn)比選拔附件提供的數(shù)據(jù)豐富詳實(shí),從而能做更多的分析。或許考核的也有其他的一些考慮,例如對(duì)數(shù)據(jù)集的補(bǔ)充能力?先確定選題,然后自己去爬新聞數(shù)據(jù),大大擴(kuò)充數(shù)據(jù)集,然后再做分析?可能是我的思路太過于局限所給的數(shù)據(jù)集了,當(dāng)然也有時(shí)間不足的原因。
再貼一遍數(shù)據(jù)集的描述:
# <class 'pandas.core.frame.DataFrame'> # RangeIndex: 4492 entries, 0 to 4491 # Data columns (total 7 columns): # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 標(biāo)題 4417 non-null object # 1 標(biāo)題鏈接 4492 non-null object # 2 brief 4483 non-null object # 3 keywords 3272 non-null object # 4 發(fā)布時(shí)間 3817 non-null object # 5 新聞?lì)悇e 4492 non-null object # 6 采集時(shí)的時(shí)間 4492 non-null object # dtypes: object(7) # memory usage: 245.8+ KB縱觀全局,我好像只做了新聞?lì)悇e、發(fā)布時(shí)間這兩個(gè)特征的分析。拿標(biāo)題抽取了keyword,然后做了詞云,這倆特征就沒用了。標(biāo)題鏈接?作為標(biāo)識(shí)去了個(gè)重,然后拿它補(bǔ)充了標(biāo)題,沒了。采集時(shí)間?好像沒啥思路。主要是感覺沒意義吧,還要對(duì)采集人的行為做一做分析?或許選拔也有這方面的考慮吧,時(shí)間緊,沒有過多思考。
此外,“人才計(jì)劃的選拔,考察個(gè)人能力,而非團(tuán)隊(duì)合作能力。”,嗯,考察對(duì)指定數(shù)據(jù)集的分析能力?如果是這樣就好了。我提交的報(bào)告屬于探索性數(shù)據(jù)分析,開始做的時(shí)候是沒有選題的,但是探索之后有結(jié)論,極其囿于數(shù)據(jù)集本身。說起來,這選拔好像考核的是傳統(tǒng)的數(shù)據(jù)分析能力啊,要選題要匯報(bào)的那種,是帶著目的去分析數(shù)據(jù)…而我提交的是探索性數(shù)據(jù)分析報(bào)告,涼涼。其實(shí)一開始也想到了這個(gè)問題,但是想了想,這能選啥題?帶著啥目的去分析這個(gè)數(shù)據(jù)集?發(fā)布趨勢(shì)?那不一張時(shí)序圖就搞定了?類別分析?嗯…好像可以,哪個(gè)時(shí)段哪個(gè)類別發(fā)的最多,最多的類別又是怎樣的發(fā)布趨勢(shì)。但還是感覺不夠,太少了,兩張圖就搞定。事實(shí)上,我在探索性數(shù)據(jù)分析的報(bào)告中,做的也就是發(fā)布趨勢(shì)分析和類別分析。但是不是以明確選題的方式,而是混雜地統(tǒng)一扔進(jìn)了探索性數(shù)據(jù)分析。或者應(yīng)該叫數(shù)據(jù)挖掘,這或許就是區(qū)別了,某種程度上數(shù)據(jù)為先和選題為先的差別。
[python+pandas]數(shù)據(jù)預(yù)處理-時(shí)間格式轉(zhuǎn)換 ?? ??
爬蟲解析庫之xpath、Beautifulsoup的對(duì)比使用 ??
Python爬蟲之xpath的詳細(xì)使用(爬蟲) ??
爬取知乎熱榜標(biāo)題和連接 (python,requests,xpath) ??
Python request中文亂碼問題解決方案 ??
如何用Python提取中文關(guān)鍵詞? ??
Python設(shè)置matplotlib.plot的坐標(biāo)軸刻度間隔以及刻度范圍 ??
總結(jié)
以上是生活随笔為你收集整理的[落选]狗熊会人才计划第6期选拔作业的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【前端基础小案例】HTML+CSS实现酷
- 下一篇: pip install gym[box2