Python数据分析之真实IP请求Pandas详解


Posted in Python onNovember 18, 2016

前言

pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据结构展开的 。Series 和 DataFrame 分别对应于一维的序列和二维的表结构。pandas 约定俗成的导入方法如下:

from pandas import Series,DataFrame
import pandas as pd

1.1. Pandas分析步骤

    1、载入日志数据

    2、载入area_ip数据

    3、将 real_ip 请求数 进行 COUNT。类似如下SQL:

SELECT inet_aton(l.real_ip),
  count(*),
  a.addr
FROM log AS l
INNER JOIN area_ip AS a
  ON a.start_ip_num <= inet_aton(l.real_ip)
  AND a.end_ip_num >= inet_aton(l.real_ip)
GROUP BY real_ip
ORDER BY count(*)
LIMIT 0, 100;

1.2. 代码

cat pd_ng_log_stat.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
 
from ng_line_parser import NgLineParser
 
import pandas as pd
import socket
import struct
 
class PDNgLogStat(object):
 
  def __init__(self):
    self.ng_line_parser = NgLineParser()
 
  def _log_line_iter(self, pathes):
    """解析文件中的每一行并生成一个迭代器"""
    for path in pathes:
      with open(path, 'r') as f:
        for index, line in enumerate(f):
          self.ng_line_parser.parse(line)
          yield self.ng_line_parser.to_dict()
 
  def _ip2num(self, ip):
    """用于IP转化为数字"""
    ip_num = -1
    try:
      # 将IP转化成INT/LONG 数字
      ip_num = socket.ntohl(struct.unpack("I",socket.inet_aton(str(ip)))[0])
    except:
      pass
    finally:
      return ip_num
 
  def _get_addr_by_ip(self, ip):
    """通过给的IP获得地址"""
    ip_num = self._ip2num(ip)
 
    try:
      addr_df = self.ip_addr_df[(self.ip_addr_df.ip_start_num <= ip_num) & 
                   (ip_num <= self.ip_addr_df.ip_end_num)]
      addr = addr_df.at[addr_df.index.tolist()[0], 'addr']
      return addr
    except:
      return None
           
  def load_data(self, path):
    """通过给的文件路径加载数据生成 DataFrame"""
    self.df = pd.DataFrame(self._log_line_iter(path))
 
 
  def uv_real_ip(self, top = 100):
    """统计cdn ip量"""
    group_by_cols = ['real_ip'] # 需要分组的列,只计算和显示该列
     
    # 直接统计次数
    url_req_grp = self.df[group_by_cols].groupby(
                   self.df['real_ip'])
    return url_req_grp.agg(['count'])['real_ip'].nlargest(top, 'count')
     
  def uv_real_ip_addr(self, top = 100):
    """统计real ip 地址量"""
    cnt_df = self.uv_real_ip(top)
 
    # 添加 ip 地址 列
    cnt_df.insert(len(cnt_df.columns),
           'addr',
           cnt_df.index.map(self._get_addr_by_ip))
    return cnt_df
     
  def load_ip_addr(self, path):
    """加载IP"""
    cols = ['id', 'ip_start_num', 'ip_end_num',
        'ip_start', 'ip_end', 'addr', 'operator']
    self.ip_addr_df = pd.read_csv(path, sep='\t', names=cols, index_col='id')
    return self.ip_addr_df
 
def main():
  file_pathes = ['www.ttmark.com.access.log']
 
  pd_ng_log_stat = PDNgLogStat()
  pd_ng_log_stat.load_data(file_pathes)
 
  # 加载 ip 地址
  area_ip_path = 'area_ip.csv'
  pd_ng_log_stat.load_ip_addr(area_ip_path)
 
  # 统计 用户真实 IP 访问量 和 地址
  print pd_ng_log_stat.uv_real_ip_addr()
 
if __name__ == '__main__':
  main()

运行统计和输出结果

python pd_ng_log_stat.py
 
         count  addr
real_ip            
60.191.123.80  101013 浙江省杭州市
-        32691  None
218.30.118.79  22523   北京市
......
136.243.152.18   889   德国
157.55.39.219   889   美国
66.249.65.170   888   美国
 
[100 rows x 2 columns]

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python实现大文件排序的方法
Jul 10 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
用django设置session过期时间的方法解析
Aug 05 Python
Django对models里的objects的使用详解
Aug 17 Python
Python Subprocess模块原理及实例
Aug 26 Python
python打印异常信息的两种实现方式
Dec 24 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 Python
pandas数值排序的实现实例
Jul 25 Python
Python切换pip安装源的方法详解
Nov 18 #Python
Python max内置函数详细介绍
Nov 17 #Python
Python中的日期时间处理详解
Nov 17 #Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
Nov 16 #Python
Python进阶篇之字典操作总结
Nov 16 #Python
Python极简代码实现杨辉三角示例代码
Nov 15 #Python
Python实现将不规范的英文名字首字母大写
Nov 15 #Python
You might like
生成静态页面的PHP类
2006/07/15 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
Python的logging模块基本用法
2020/12/24 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
小学防溺水制度
2014/01/29 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
任命书模板
2014/06/04 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
盗窃案辩护词
2015/05/21 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
sql字段解析器的实现示例
2021/06/23 SQL Server
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP