日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python熊猫弹幕_Pandas+Matplotlib:视频弹幕统计分析

發布時間:2023/12/20 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:视频弹幕统计分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。