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中如何优雅的合并两个字典(dict)方法示例
Aug 09 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
python实现梯度下降算法
Mar 24 Python
python 文件查找及内容匹配方法
Oct 25 Python
对python产生随机的二维数组实例详解
Dec 13 Python
Python3内置模块random随机方法小结
Jul 13 Python
Python读写压缩文件的方法
Jul 30 Python
Python tkinter制作单机五子棋游戏
Sep 14 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
Python的轻量级ORM框架peewee使用教程
Feb 05 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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
prototype 学习笔记整理
2009/07/17 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
vue复合组件实现注册表单功能
2017/11/06 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python重试装饰器示例
2014/02/11 Python
Python读写unicode文件的方法
2015/07/10 Python
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python如何制作英文字典
2019/06/25 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
教师节演讲稿
2014/05/06 职场文书
学前班语言教学计划
2015/01/20 职场文书
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS