借网站日记分析~普及一下Pandas基础
对网站日记分析其实比较常见,今天模拟演示一下一些应用场景,也顺便说说Pandas,图示部分也简单分析了下
1.数据清洗¶
一般数据都不可能直接拿来用的,或多或少都得清理一下,我这边就模拟一下清洗完的数据
%%time import numpy as np
import pandas as pd
Wall time: 520 ms
%%time # 生成一个2017年的所有时间点(分钟为单位)
datetime_index = pd.date_range("2017-01-01","2018-01-01",closed="left",freq="min")
Wall time: 4 ms
%%time # 简单查看一下
datetime_index # 如果你不想取到2018.01.01 00:00:00就设置~闭区间closed="left"
Wall time: 0 ns
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')
%%time # 查看多少元素
datetime_index.size # 用len()也一样
Wall time: 0 ns
525600
%%time # 创建一个DataFrame,以时间轴为index
log_df = pd.DataFrame(index=datetime_index)
Wall time: 999 µs
%%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
# 查看前10条
log_df.head(10)
访问人数 | 注册人数 | |
---|---|---|
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 |
# 查看后10条
log_df.tail(10)
访问人数 | 注册人数 | |
---|---|---|
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.粗略统计¶
# 查看有多少数据
log_df.size
1051200
# 矩阵形状
log_df.shape # 525601行,2列
(525600, 2)
%%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
%%time # 初略统计一下
log_df.describe()
Wall time: 62.5 ms
访问人数 | 注册人数 | |
---|---|---|
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.分析绘图¶
来个简单版,主要学会方法,数据用真实数据后显示会更人性化,比如可以看到哪几个月份增长比较快,那几个月比较慢
然后还可以运用于公司花钱弄推广,以前是听别的公司忽悠,可能找了很多僵尸用户,数据貌似上去了,但是你做个年度统计,看看真实活跃的用户就知道推广的成效究竟几何了
某月份¶
%%time from matplotlib import pyplot as plt
Wall time: 179 ms
%%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
day_df.head(10)
访问人数 | 注册人数 | |
---|---|---|
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年1月份的统计
day_df["2017-01"]
访问人数 | 注册人数 | |
---|---|---|
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 |
day_df["2017-01"].index
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')
# 比如绘制一份1月份的访问人数一览表
plt.plot(day_df["2017-01"].index,day_df["2017-01"]["访问人数"])
plt.show()
" alt="" />
按照图看,15号这天用户数陡然增加,然后第二天用户骤降。
可以看看是不是被DDOS了,或者有没有用户恶意刷单 or 是不是爬虫,这时候可以采取对应的措施
# 比如绘制一份1月份的注册人数一览表
plt.plot(day_df["2017-01"].index,day_df["2017-01"]["注册人数"])
plt.show()
" alt="" />
%%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
month_df.tail(10)
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 |
# 具体项你可以指定
plt.plot(month_df.index,month_df["visitors"])
plt.show() # 图中3月是低谷
" alt="" />
%%time # 默认是折线图
month_df.plot() # 密度图
month_df.plot.density() # 柱形图(叠图,可以计算百分比)
month_df.plot.bar(stacked=True) # 水平柱形图
month_df.plot.barh() # stacked=True # 显示一下
plt.show()
" alt="" />
" alt="" />
" alt="" />
" alt="" />
Wall time: 720 ms
某季度¶
%%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
# 饼状图
quarter_df.plot.pie(subplots=True,labels=["Spr","Sum","Aut","Win"])
plt.show()
" alt="" />
从图片来看,基本均匀的
借网站日记分析~普及一下Pandas基础的更多相关文章
- Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析
网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...
- pandas 基础操作 更新
创建一个Series,同时让pandas自动生成索引列 创建一个DataFrame数据框 查看数据 数据的简单统计 数据的排序 选择数据(类似于数据库中sql语句) 另外可以使用标签来选择 通过位置获 ...
- Pandas 基础(1) - 初识及安装 yupyter
Hello, 大家好, 昨天说了我会再更新一个关于 Pandas 基础知识的教程, 这里就是啦......Pandas 被广泛应用于数据分析领域, 是一个很好的分析工具, 也是我们后面学习 machi ...
- 网站UI分析
本次网站UI分析我选择的是我们石家庄铁道大学的网站,首先对于网站的分析建立在我经常使用鼠须的基础上,我可以很好的站在用户的角度来进行分析,否则对于你不熟悉的网站你可能是不能很好地体验到他的 结构. U ...
- 利用Python进行数据分析(12) pandas基础: 数据合并
pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...
- 利用Python进行数据分析(9) pandas基础: 汇总统计和计算
pandas 对象拥有一些常用的数学和统计方法. 例如,sum() 方法,进行列小计: sum() 方法传入 axis=1 指定为横向汇总,即行小计: idxmax() 获取最大值对应的索 ...
- 利用Python进行数据分析(8) pandas基础: Series和DataFrame的基本操作
一.reindex() 方法:重新索引 针对 Series 重新索引指的是根据index参数重新进行排序. 如果传入的索引值在数据里不存在,则不会报错,而是添加缺失值的新行. 不想用缺失值,可以用 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍
网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...
随机推荐
- asp.net core2.0中异常的处理
最近在开发中遇到一些关于如何抛出异常的困惑,在qq群里进行了讨论,有些人认为抛出异常是有理由的,可以对业务流程进行控制,而有些认为抛出异常会导致程序性能低下,我写一些自己的心得吧. 异常的全局处理 a ...
- [转帖]nginx服务器安装及配置文件详解
nginx服务器安装及配置文件详解 http://seanlook.com/2015/05/17/nginx-install-and-config/ 发表于 2015-05-17 | 更新于: 2 ...
- MyBaits全局配置文件的各项标签2
▲typeHandlers 类型处理器,它架起数据库和JavaBean一一映射的桥梁,这里需要注意一下,java在JDK1.8之前,日期处理函数并不丰富,但在JDK1.8之后引入JSR-310标准,这 ...
- switch-case和if-else可互换时
当switch-case和if-else可互换时,应当优先采用switch-case.因为switch-case的效率更高(详情下回分解).
- Linux 系统命令行入门基础
Linux 命令行组成结构 打包及压缩命令 tar 解压压缩包:
- Python基础知识2-内置数据结构(上)
分类 数值型 用浮点型的时候注意别和"=="一起使用. 数字的处理函数 注意round()函数的特殊:四舍六入五取偶 类型判断 列表list 列表list定义 初始化 列表索引访 ...
- python爬虫scrapy之如何同时执行多个scrapy爬行任务
背景: 刚开始学习scrapy爬虫框架的时候,就在想如果我在服务器上执行一个爬虫任务的话,还说的过去.但是我不能每个爬虫任务就新建一个项目吧.例如我建立了一个知乎的爬行任务,但是我在这个爬行任务中,写 ...
- TField OnValidate 事件
Occurs just before the data is written to the record buffer. Write an OnValidate event handler to va ...
- Clover file list
/Volumes/EFI//EFI: total 4 drwxrwxrwx 1 jianweiliu staff 512 Apr 20 12:17 APPLE drwxrwxrwx@ 1 jianwe ...
- caffemodel模型
resnet18 https://github.com/HolmesShuan/ResNet-18-Caffemodel-on-ImageNet