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 代码性能优化技巧分享
Aug 07 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
带你认识Django
Jan 15 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
python系列 文件操作的代码
Oct 06 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 Python
django框架中间件原理与用法详解
Dec 10 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP实现文件下载详解
2014/11/27 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
python 多进程队列数据处理详解
2019/12/23 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
采购员岗位职责
2013/11/15 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
店铺转让协议书
2015/01/29 职场文书
小班下学期个人总结
2015/02/12 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
亲戚关系证明
2015/06/24 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏