python熊猫弹幕_Pandas+Matplotlib:视频弹幕统计分析
彈幕[dàn mù] (danmaku),中文流行詞語,指的是在網絡上觀看視頻時彈出的評論性字幕。源自日本彈幕視頻分享網站(niconico動畫),國內首先引進為Acfun以及后來的嗶哩嗶哩網站。
大量吐槽評論從屏幕飄過時效果看上去像是飛行射擊游戲里的彈幕,所以NICO網民將這種有大量的吐槽評論出現時的效果做彈幕。
在中國,本來只有大量評論同時出現才能叫彈幕,但是隨著誤用單條評論也能叫彈幕了。
想法:彈幕量與視頻中的高曝光片段出現時間段是否有關?彈幕量與自然時間之間是否有一定關聯性?
數據:從嗶哩嗶哩網站上爬下來的彈幕數據
分析過程:爬下來的Excel數據文件,里面是啥樣的?數據是否完整?如何通過視頻時間和自然時間分別統計彈幕量?如何以可視化的形式表達?
上述就是整個分析流程,下面開始一步步進行
任務一:對于 '熱點事件.xlsx' 文件的Sheet3表單而言,需要統計視頻時間中每秒內彈幕的數量并可視化展示
import pandas as pd
import matplotlib.pyplot as plt
①讀入數據
fpath = './datas/熱點事件.xlsx'
df = pd.read_excel(fpath,sheet_name='Sheet3')
這里,我已知分析所用數據在Sheet3表單中,所以直接調用了。
其實在不知情的情況下,應該先對Excel文件進行“結構性”讀取(自己理解的)。
如何“結構性”讀取,在后面會用到。
②查看數據的“樣子”
df.head()
一看,有用的就前兩列,第一列是彈幕發送的視頻時間,第二列是數量。
df.shape # 結果為(1048575, 6)
好大的數據量啊,有問題!EXCEL表格文件最多就只有1048575行。
df.dropna(axis="index", how='all', inplace=True)
先刪除全部為空值的行試試。
df.shape # 結果為(501, 6)
這里一看,好家伙,全是空值.....還好進行了空值處理。最終需要處理的總共501行數據。
其實這里回頭想,少了一步,我們看了開頭的五行數據,其實也可以看看結尾的五行數據是啥樣子的。
后面重新做的時候我發現,在原始表格第1048575行的數據是統計了有多少行數據= =|||,這里應該是人為操作失誤。
③按照視頻時間的每秒進行彈幕量統計
df.loc[(0 <= df['時間']) & (df['時間'] < 1),'數量'].sum() # 運行結果為8.0
由于"時間"列中均是精確到秒后三位小數,這里利用df.loc進行區域限定,然后借助"數量"列進行求和。
這樣就統計出了0至1秒,也就是1秒內的彈幕量,如法炮制,求出每秒的彈幕量。
# 基于上述方法,寫一個for循環,解決戰斗
for i in range(501):
count = df.loc[(i <= df['時間']) & (df['時間'] < i+1),'數量'].sum()
print('第{}秒內共有{}條彈幕'.format(i, count))
運行結果如下圖所示。
通過上述代碼運行結果會發現,在109秒后出現的都是0條彈幕。
為啥是這樣?因為雖然是501條,但是要計算每1秒內的彈幕量,這樣累加之后,總行數就遠遠低于501行了。
這樣看來,欠考慮。應該基于最后一條彈幕的秒數,給range()里面的參數賦值。
# 按照前面所想,可以看出以秒為單位的時間段最終為109.420秒
# 因此,給range()賦值110即可,為啥不是109?因為range()里面是左閉右開區間,取110意味著[0,110)
for i in range(110):
count = df.loc[(i <= df['時間']) & (df['時間'] < i+1),'數量'].sum()
print('第{}秒內共有{}條彈幕'.format(i, count))
為啥做上述的優化?
其實是我做到可視化部分發現的問題,回過頭來在這里優化了。
④可視化展示
# 最后用柱狀圖可視化展示
# 這里要注意plt.bar()函數默認顏色循環使用,如果這里不指定一個顏色,柱狀圖會變得五顏六色
for i in range(110):
count = df.loc[(i <= df['時間']) & (df['時間'] < i+1),'數量'].sum()
#print('第{}秒內共有{}條彈幕'.format(i, count))
plt.bar(i, count, color='#008B8B')
plt.show() # 這里相當于在一塊畫布上每次畫一條柱狀圖,直到for循環結束,輸出結果
看看每5秒統計一次的結果。
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 最后,以5秒為一個間隔,看看彈幕的分布情況(有時候精細未必是好事,擴大間隔有助于分析問題)
for i in range(0, 110, 5):
count = df.loc[(i <= df['時間']) & (df['時間'] < i+5),'數量'].sum()
plt.bar(i, count, width=1, color='#008B8B') # 給定個寬度,出圖看的緊湊些
plt.xlabel('彈幕時間(秒)', fontsize=12)
plt.ylabel('彈幕量(條)', fontsize=12)
plt.savefig('fix11.svg', dpi=500) # 保存
plt.show() # 這里相當于在一塊畫布上每次畫一條柱狀圖,直到for循環結束,輸出結果
從上圖上就能很明顯看出:
在視頻時間10至25秒、65至75秒、90至95秒以及最后時刻,彈幕量較為集中。
再次觀看視頻發現,這些彈幕集中的某些視頻時間段剛好對應視頻中的高潮片段,符合觀眾觀看行為。
任務二:對于 '熱點事件.xlsx' 文件的原數據表單而言,需要統計以自然時間每天的彈幕數量并可視化展示
這里,假設我們不清楚拿到的Excel文件內部啥樣子,你可以這樣打開觀察。
先看看文件中有多少個sheet(表單)。
但是按照以往讀取Excel文件,你會發現,只能讀取到第一個表單的數據(默認的)。
import pandas as pd
import matplotlib.pyplot as plt
file_path = './datas/熱點事件.xlsx'
xx = pd.read_excel(file_path)
有同學說,你可以加上表單名稱參數啊。但是剛說過了,我們假設拿到的數據,你完全不知道里面啥樣。怎么辦?
這時候可以用另一種Excel文件讀取方式:pd.ExcelFile( )
data = pd.ExcelFile(file_path)
data.sheet_names
這樣就可以將讀取Excel數據的所有表單名稱打印出來了,如下圖。
假設我需要的數據在表單名為‘原數據’中,則通過如下代碼:
df = data.parse('Sheet5')
這樣就回到了我們之前的DataFrame的操作流程上來了。
如上圖所示,又出現了新問題。讀取時,原文件開始有空行,所以造成讀取后,原本的列標簽變成了數據。這里只需要設定指定一行為索引即可,代碼如下:
df = data.parse('Sheet5', header=1)
完美解決,開始數據分析。
①首先將第一列(日期)作為標簽列
df = df.set_index('行標簽') # 將“行標簽”設置為index
這時又發現,其中columns的值為‘以下項目的計數:數量’,太繞口,寫起來太麻煩。
利用rename( )修改列名,以字典的形式傳入值,進行修改,代碼如下:
df_clearn = df.rename(columns={'以下項目的計數:數量':'counts'})
②以天為單位進行統計
df_clearn.resample('d').sum()['counts']
如果只統計2018年全年的,可以使用如下代碼:
df_day = df_clearn.resample('d').sum()['counts']
df_2018 = df_day['2018']
③可視化展示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10,4))
plt.plot(df_2018.index, df_2018, color='#008B8B')
plt.xlabel('自然時間(天)',fontsize=12)
plt.ylabel('彈幕量(條)',fontsize=12)
plt.savefig('picture.svg', dpi=500)
plt.show()
從上圖上就能很明顯看出:
隨著自然時間的推移,熱點事件的評論熱度會慢慢降低直至“冷卻”,符合常理。
今天的分享到這里就結束了,我最近收獲最大的就是拿到一個簡單的實際問題,通過自己所學,查漏補缺,這樣進步會很快,我還是不建議類似于A到Z的背單詞方法,其實背作文何嘗不是一種背單詞的方法呢?
哈哈,隱喻,自行理解~
END
總結
以上是生活随笔為你收集整理的python熊猫弹幕_Pandas+Matplotlib:视频弹幕统计分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: odoo centos 安装odoo14
- 下一篇: 菜鸟对APP界面设计的一些心得小结