實戰:戰狼2票房資料分析——(3)資料讀取及分析

實戰:戰狼2票房資料分析——(3)資料讀取及分析

前言

前面我們已經成功的把資料從網站上抓取下來並存入了csv檔案當中,那麼本章就演練將資料從csv中讀取出來,並作相應的分析


資料讀取

可以使用pandas的函式read_csv來讀取資料,預設情況下csv檔案的資料都是以逗號分隔的。

比如我們將前面的CSV檔案用記事本開啟,看到的結果如下

這裡寫圖片描述

我們直接在命令視窗對檔案進行讀取,並顯示前三行

In [190]: df = pd.read_csv('data\out.csv')
In [191]: df[:3]
Out[191]: 
Unnamed: 0   name       box  boxRatio  playRatio  attendance
0  2017-08-01    戰狼2  29249.43      86.3       56.4        42.4
1  2017-08-01   建軍大業   3248.29       9.6       22.3        19.3
2  2017-08-01  神偷奶爸3    464.67       1.4        4.7        13.7

read_csv函式中有很多引數,例如通過設定sep引數可以修改預設的分隔符

df = pd.read_csv('data\out.csv', sep=';')
df[:3]
Out[198]: 
,name,box,boxRatio,playRatio,attendance
0  2017-08-01,戰狼2,29249.43,86.3,56.4,42.4
1   2017-08-01,建軍大業,3248.29,9.6,22.3,19.3
2    2017-08-01,神偷奶爸3,464.67,1.4,4.7,13.7

我們發現讀取出來的資料就變成每行只有一條資料了,因為資料中沒有;分隔符

通過name引數,修改DataFrame的索引,以下示例將name列改為索引

df = pd.read_csv('data\out.csv', index_col='name')
df[:3]
Out[202]: 
Unnamed: 0       box  boxRatio  playRatio  attendance
name                                                        
戰狼2    2017-08-01  29249.43      86.3       56.4        42.4
建軍大業   2017-08-01   3248.29       9.6       22.3        19.3
神偷奶爸3  2017-08-01    464.67       1.4        4.7        13.7

通過encoding引數,修改編碼格式。預設值為utf8

df = pd.read_csv('data\out.csv', encoding='latin1')
df[:3]
Out[213]: 
Unnamed: 0           name       box  boxRatio  playRatio  attendance
0  2017-08-01        战狼2  29249.43      86.3       56.4        42.4
1  2017-08-01   建军大业   3248.29       9.6       22.3        19.3
2  2017-08-01  神偷奶爸3    464.67       1.4        4.7        13.7

先把資料,按照日期為索引的方式讀取出來,日期我們並沒有命名,從前面的讀取結果可以看到,他的名字為0


In [222]: df = pd.read_csv('data\out.csv', index_col=0, parse_dates=[0], dayfirst=True)
In [223]: df[:3]
Out[223]: 
name       box  boxRatio  playRatio  attendance
2017-08-01    戰狼2  29249.43      86.3       56.4        42.4
2017-08-01   建軍大業   3248.29       9.6       22.3        19.3
2017-08-01  神偷奶爸3    464.67       1.4        4.7        13.7

列選擇

讀取出來的資料型別是DataFrame,可以像從字典中獲取元素一樣,來獲取某一列的資料

In [224]: df['box'][:3]
Out[224]: 
2017-08-01    29249.43
2017-08-01     3248.29
2017-08-01      464.67
Name: box, dtype: float64

對列資料進行繪圖

只需要在取出來的列後面加上.plot()方法就行,So easy。

In [225]: df['box'].plot()
Out[225]: <matplotlib.axes._subplots.AxesSubplot at 0x10a2b5b0>

這裡寫圖片描述

從圖表中我們可以看出2017-08-05到2017-08-06的票房最高,我猜測這幾天肯定是週末。翻看日曆一看,果然是週六和週日。

我們也可以很容易的畫出所有列。我們讓圖變大一點。

In [226]: df.plot(figsize=(15, 10))
Out[226]: <matplotlib.axes._subplots.AxesSubplot at 0x10f6f110>

這裡寫圖片描述

由於票房資料的數值太大,所以其他資料都看不見了。


資料分析

我們現在的資料集不夠多,我們從新執行命令,來獲取50天的資料。(一次性獲取太多資料或太頻繁的獲取,貓眼會讓你輸入驗證碼)

由於之間的時間方法是選定一個時間,再設定往後多少天,不太方便。我們將其改為往前多少天,即獲取從今天開始,前50天的資料。

很簡單,只需要將timedelta的days引數改為-1就行

def buildDates(start, days):
day = timedelta(days=-1)
for i in range(days):
yield start   day*i

獲取50天的資料

if __name__ == "__main__":
df = getData(2017, 8, 11, 50)
writeToCSV(df, 'data\out.csv')
df = pd.read_csv('data\out.csv')

plot繪圖中文顯示

預設情況下,使用matplotlib進行繪圖,如果有中文會顯示不出來,這是因為matplotlib包預設只支援ASCII碼,不支援unicode碼。

解決方法,就是需要將 matplotlib 的安裝目錄下, matplotlibrc 配置檔案修改一下,將font.family 部分註釋去掉,並且在 font.serif 和 font.sans-serif 支援字型加上一個中文字型,如 SimHei。matplotlibrc檔案的預設位置在C:\Python27\Lib\site-packages\matplotlib\mpl-data :

font.family         : sans-serif
font.style          : normal
font.variant        : normal
font.weight         : medium
font.stretch        : normal
# note that font.size controls default text sizes.  To configure
# special text sizes tick labels, axes, labels, title, etc, see the rc
# settings for axes and ticks. Special text sizes can be defined
# relative to font.size, using the following values: xx-small, x-small,
# small, medium, large, x-large, xx-large, larger, or smaller
#font.size           : 12.0
font.serif          : SimHei, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
font.sans-serif     : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

檢視戰狼2上映後的票房走勢

In [23]: df = pd.read_csv('data\out.csv', index_col=0)
In [24]: df[df.name == '戰狼2']['box'].sort_index().plot()
Out[24]: <matplotlib.axes._subplots.AxesSubplot at 0x111ffb30>

這裡寫圖片描述

票房佔比趨勢

In [25]: df[df.name == '戰狼2']['boxRatio'].sort_index().plot()
Out[25]: <matplotlib.axes._subplots.AxesSubplot at 0x10ca3770>

這裡寫圖片描述

檢視戰狼2現有票房

In [51]: sum(df[df.name == '戰狼2']['box'])
Out[51]: 405248.93000000005

已經突破40E了?查了下,果然突破40E了,恭喜恭喜。

檢視歷史總票房排名

將票房資料按照片名進行加總,並根據票房進行倒敘排列,再取出前10名

df2 = df.groupby(['name']).sum().sort('box', ascending=False)
df2[:10]
Out[74]: 
box  boxRatio  playRatio  attendance
name                                                   
戰狼2          405248.93    1200.2      789.8      1052.0
變形金剛5:最後的騎士  150792.95     865.1      756.3       497.2
神偷奶爸3        102270.50     644.9      527.8       695.2
悟空傳           69202.04     514.9      409.2       491.0
三生三世十里桃花      51162.79     130.3      209.2       167.6
建軍大業          36883.16     117.5      245.9       634.9
繡春刀II:修羅戰場    26366.93     238.9      237.3       634.9
京城81號II       21849.87     154.6      173.6       491.5
逆時營救          20115.38     173.2      190.5       429.0
父子雄兵          12449.89     109.1      132.8      1023.5

沒有美人魚是因為我們獲取的資料是從2017年8月11日至前50天的,資料不夠多啊 🙁

In [87]: df2[:10].plot(kind='bar')
Out[87]: <matplotlib.axes._subplots.AxesSubplot at 0x207c5e70>

這裡寫圖片描述

票房前10出席率

In [88]: df2['attendance'][:10].plot(kind='bar')
Out[88]: <matplotlib.axes._subplots.AxesSubplot at 0x20968d70>

這裡寫圖片描述

票房前10排片率

In [89]: df2['playRatio'][:10].plot(kind='bar')
Out[89]: <matplotlib.axes._subplots.AxesSubplot at 0x2094cd70>

這裡寫圖片描述

最後

再次祝賀戰狼2,票房突破40E

這裡寫圖片描述