借網站日記分析~普及一下Pandas基礎

 

網站日記分析其實比較常見,今天模擬演示一下一些應用場景,也順便說說Pandas,圖示部分也簡單分析了下html

1.數據清洗

通常數據都不可能直接拿來用的,或多或少都得清理一下,我這邊就模擬一下清洗完的數據前端

In [1]:
%%time

import numpy as np
import pandas as pd
 
Wall time: 520 ms
In [2]:
%%time

# 生成一個2017年的全部時間點(分鐘爲單位)
datetime_index = pd.date_range("2017-01-01","2018-01-01",closed="left",freq="min")
 
Wall time: 4 ms
In [3]:
%%time

# 簡單查看一下
datetime_index # 若是你不想取到2018.01.01 00:00:00就設置~閉區間closed="left"
 
Wall time: 0 ns
Out[3]:
DatetimeIndex(['2017-01-01 00:00:00', '2017-01-01 00:01:00',
               '2017-01-01 00:02:00', '2017-01-01 00:03:00',
               '2017-01-01 00:04:00', '2017-01-01 00:05:00',
               '2017-01-01 00:06:00', '2017-01-01 00:07:00',
               '2017-01-01 00:08:00', '2017-01-01 00:09:00',
               ...
               '2017-12-31 23:50:00', '2017-12-31 23:51:00',
               '2017-12-31 23:52:00', '2017-12-31 23:53:00',
               '2017-12-31 23:54:00', '2017-12-31 23:55:00',
               '2017-12-31 23:56:00', '2017-12-31 23:57:00',
               '2017-12-31 23:58:00', '2017-12-31 23:59:00'],
              dtype='datetime64[ns]', length=525600, freq='T')
In [4]:
%%time

# 查看多少元素
datetime_index.size # 用len()也同樣
 
Wall time: 0 ns
Out[4]:
525600
In [5]:
%%time

# 建立一個DataFrame,以時間軸爲index
log_df = pd.DataFrame(index=datetime_index)
 
Wall time: 999 µs
In [6]:
%%time

# 隨機生成一波訪問人數
log_df["訪問人數"] = np.random.randint(10,50,size=datetime_index.size)

# 隨機生成一波註冊人數
log_df["註冊人數"] = np.random.randint(3,size=datetime_index.size)
 
Wall time: 31.2 ms
In [7]:
# 查看前10條
log_df.head(10)
Out[7]:
 
  訪問人數 註冊人數
2017-01-01 00:00:00 42 0
2017-01-01 00:01:00 31 0
2017-01-01 00:02:00 17 1
2017-01-01 00:03:00 46 0
2017-01-01 00:04:00 41 1
2017-01-01 00:05:00 49 1
2017-01-01 00:06:00 44 2
2017-01-01 00:07:00 27 2
2017-01-01 00:08:00 30 0
2017-01-01 00:09:00 36 1
In [8]:
# 查看後10條
log_df.tail(10)
Out[8]:
 
  訪問人數 註冊人數
2017-12-31 23:50:00 38 0
2017-12-31 23:51:00 31 2
2017-12-31 23:52:00 45 2
2017-12-31 23:53:00 44 0
2017-12-31 23:54:00 32 2
2017-12-31 23:55:00 31 2
2017-12-31 23:56:00 45 2
2017-12-31 23:57:00 18 2
2017-12-31 23:58:00 12 2
2017-12-31 23:59:00 17 0
 

2.粗略統計

In [9]:
# 查看有多少數據
log_df.size
Out[9]:
1051200
In [10]:
# 矩陣形狀
log_df.shape # 525601行,2列
Out[10]:
(525600, 2)
In [11]:
%%time

# 簡明摘要
log_df.info()
 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 525600 entries, 2017-01-01 00:00:00 to 2017-12-31 23:59:00
Freq: T
Data columns (total 2 columns):
訪問人數    525600 non-null int32
註冊人數    525600 non-null int32
dtypes: int32(2)
memory usage: 8.0 MB
Wall time: 12 ms
In [12]:
%%time

# 初略統計一下
log_df.describe()
 
Wall time: 62.5 ms
Out[12]:
 
  訪問人數 註冊人數
count 525600.000000 525600.000000
mean 29.498189 1.000936
std 11.547677 0.815972
min 10.000000 0.000000
25% 19.000000 0.000000
50% 29.000000 1.000000
75% 40.000000 2.000000
max 49.000000 2.000000
 

3.分析繪圖

來個簡單版,主要學會方法,數據用真實數據後顯示會更人性化,好比能夠看到哪幾個月份增加比較快,那幾個月比較慢python

而後還能夠運用於公司花錢弄推廣,之前是聽別的公司忽悠,可能找了不少殭屍用戶,數據貌似上去了,可是你作個年度統計,看看真實活躍的用戶就知道推廣的成效究竟幾何了服務器

 

某月份

In [13]:
%%time

from matplotlib import pyplot as plt
 
Wall time: 179 ms
In [14]:
%%time

p_s = log_df["訪問人數"].resample("D").sum() # 平都可以看mean()
r_s = log_df["註冊人數"].resample("D").sum()

day_df = pd.DataFrame()
day_df["訪問人數"] = p_s
day_df["註冊人數"] = r_s
 
Wall time: 49 ms
In [15]:
day_df.head(10)
Out[15]:
 
  訪問人數 註冊人數
2017-01-01 42319 1400
2017-01-02 41820 1438
2017-01-03 42256 1431
2017-01-04 42097 1488
2017-01-05 42734 1498
2017-01-06 41733 1424
2017-01-07 43016 1503
2017-01-08 42480 1427
2017-01-09 42791 1428
2017-01-10 41838 1441
In [16]:
# 快速查看一下2017年1月份的統計
day_df["2017-01"]
Out[16]:
 
  訪問人數 註冊人數
2017-01-01 42319 1400
2017-01-02 41820 1438
2017-01-03 42256 1431
2017-01-04 42097 1488
2017-01-05 42734 1498
2017-01-06 41733 1424
2017-01-07 43016 1503
2017-01-08 42480 1427
2017-01-09 42791 1428
2017-01-10 41838 1441
2017-01-11 42256 1464
2017-01-12 42766 1464
2017-01-13 42688 1428
2017-01-14 42436 1418
2017-01-15 42639 1429
2017-01-16 43862 1476
2017-01-17 41876 1489
2017-01-18 42821 1437
2017-01-19 43000 1399
2017-01-20 43158 1454
2017-01-21 42722 1479
2017-01-22 41985 1444
2017-01-23 43127 1460
2017-01-24 42949 1382
2017-01-25 42044 1460
2017-01-26 42809 1475
2017-01-27 42387 1450
2017-01-28 42895 1486
2017-01-29 41565 1478
2017-01-30 42523 1433
2017-01-31 42027 1488
In [17]:
day_df["2017-01"].index
Out[17]:
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10', '2017-01-11', '2017-01-12',
               '2017-01-13', '2017-01-14', '2017-01-15', '2017-01-16',
               '2017-01-17', '2017-01-18', '2017-01-19', '2017-01-20',
               '2017-01-21', '2017-01-22', '2017-01-23', '2017-01-24',
               '2017-01-25', '2017-01-26', '2017-01-27', '2017-01-28',
               '2017-01-29', '2017-01-30', '2017-01-31'],
              dtype='datetime64[ns]', freq='D')
In [18]:
# 好比繪製一份1月份的訪問人數一覽表
plt.plot(day_df["2017-01"].index,day_df["2017-01"]["訪問人數"])
plt.show()
 
 

按照圖看,15號這天用戶數陡然增長,而後次日用戶驟降。app

能夠看看是否是被DDOS了,或者有沒有用戶惡意刷單 or 是否是爬蟲,這時候能夠採起對應的措施dom

In [19]:
# 好比繪製一份1月份的註冊人數一覽表
plt.plot(day_df["2017-01"].index,day_df["2017-01"]["註冊人數"])
plt.show() 
 
 

按照上圖看,23號這天不正常,是否前端時間推廣太瘋狂用戶反彈,或者說這天服務器出問題了網站


年度統計

這邊直接使用Pandas提供的簡單繪圖方法spa

In [20]:
%%time

# 統計一下以月爲單位的人數信息
p_s = log_df["訪問人數"].resample("M").sum()
r_s = log_df["註冊人數"].resample("M").sum()

month_df = pd.DataFrame()
month_df["visitors"] = p_s
month_df["register"] = r_s
 
Wall time: 53 ms
In [21]:
month_df.tail(10)
Out[21]:
 
  visitors register
2017-03-31 1314899 44706
2017-04-30 1276451 43277
2017-05-31 1316778 44447
2017-06-30 1276800 42979
2017-07-31 1319003 44382
2017-08-31 1316498 44514
2017-09-30 1275093 43299
2017-10-31 1313942 44666
2017-11-30 1271139 43599
2017-12-31 1315168 44846
In [22]:
# 具體項你能夠指定
plt.plot(month_df.index,month_df["visitors"])
plt.show() # 圖中3月是低谷
 
In [23]:
%%time

# 默認是折線圖
month_df.plot()

# 密度圖
month_df.plot.density()

# 柱形圖(疊圖,能夠計算百分比)
month_df.plot.bar(stacked=True)

# 水平柱形圖
month_df.plot.barh() # stacked=True

# 顯示一下
plt.show()
 
 
 
 
 
Wall time: 720 ms
 

某季度

In [24]:
%%time

# 季度統計
quarter_df = pd.DataFrame()
quarter_df["visitors"] = log_df["訪問人數"].resample("Q").sum()
quarter_df["register"] = log_df["註冊人數"].resample("Q").sum()
 
Wall time: 44 ms
In [25]:
# 餅狀圖
quarter_df.plot.pie(subplots=True,labels=["Spr","Sum","Aut","Win"])
plt.show()
 
 

從圖片來看,基本均勻的code

相關文章
相關標籤/搜索