借网站日记分析~普及一下Pandas基础

 

网站日记分析其实比较常见,今天模拟演示一下一些应用场景,也顺便说说Pandas,图示部分也简单分析了下

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:00420
2017-01-01 00:01:00310
2017-01-01 00:02:00171
2017-01-01 00:03:00460
2017-01-01 00:04:00411
2017-01-01 00:05:00491
2017-01-01 00:06:00442
2017-01-01 00:07:00272
2017-01-01 00:08:00300
2017-01-01 00:09:00361
In [8]:
# 查看后10条
log_df.tail(10)
Out[8]:
 
 访问人数注册人数
2017-12-31 23:50:00380
2017-12-31 23:51:00312
2017-12-31 23:52:00452
2017-12-31 23:53:00440
2017-12-31 23:54:00322
2017-12-31 23:55:00312
2017-12-31 23:56:00452
2017-12-31 23:57:00182
2017-12-31 23:58:00122
2017-12-31 23:59:00170
 

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]:
 
 访问人数注册人数
count525600.000000525600.000000
mean29.4981891.000936
std11.5476770.815972
min10.0000000.000000
25%19.0000000.000000
50%29.0000001.000000
75%40.0000002.000000
max49.0000002.000000
 

3.分析绘图

来个简单版,主要学会方法,数据用真实数据后显示会更人性化,比如可以看到哪几个月份增长比较快,那几个月比较慢

然后还可以运用于公司花钱弄推广,以前是听别的公司忽悠,可能找了很多僵尸用户,数据貌似上去了,但是你做个年度统计,看看真实活跃的用户就知道推广的成效究竟几何了

 

某月份

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-01423191400
2017-01-02418201438
2017-01-03422561431
2017-01-04420971488
2017-01-05427341498
2017-01-06417331424
2017-01-07430161503
2017-01-08424801427
2017-01-09427911428
2017-01-10418381441
In [16]:
# 快速查看一下2017年1月份的统计
day_df["2017-01"]
Out[16]:
 
 访问人数注册人数
2017-01-01423191400
2017-01-02418201438
2017-01-03422561431
2017-01-04420971488
2017-01-05427341498
2017-01-06417331424
2017-01-07430161503
2017-01-08424801427
2017-01-09427911428
2017-01-10418381441
2017-01-11422561464
2017-01-12427661464
2017-01-13426881428
2017-01-14424361418
2017-01-15426391429
2017-01-16438621476
2017-01-17418761489
2017-01-18428211437
2017-01-19430001399
2017-01-20431581454
2017-01-21427221479
2017-01-22419851444
2017-01-23431271460
2017-01-24429491382
2017-01-25420441460
2017-01-26428091475
2017-01-27423871450
2017-01-28428951486
2017-01-29415651478
2017-01-30425231433
2017-01-31420271488
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号这天用户数陡然增加,然后第二天用户骤降。

可以看看是不是被DDOS了,或者有没有用户恶意刷单 or 是不是爬虫,这时候可以采取对应的措施

In [19]:
# 比如绘制一份1月份的注册人数一览表
plt.plot(day_df["2017-01"].index,day_df["2017-01"]["注册人数"])
plt.show() 
 
 

按照上图看,23号这天不正常,是否前端时间推广太疯狂用户反弹,或者说这天服务器出问题了


年度统计

这边直接使用Pandas提供的简单绘图方法

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]:
 
 visitorsregister
2017-03-31131489944706
2017-04-30127645143277
2017-05-31131677844447
2017-06-30127680042979
2017-07-31131900344382
2017-08-31131649844514
2017-09-30127509343299
2017-10-31131394244666
2017-11-30127113943599
2017-12-31131516844846
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()
 
 

从图片来看,基本均匀的

转载于:https://www.cnblogs.com/dotnetcrazy/p/9405485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值