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中的函数编程
Apr 13 Python
python下MySQLdb用法实例分析
Jun 08 Python
使用python生成杨辉三角形的示例代码
Aug 29 Python
解读python如何实现决策树算法
Oct 11 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 Python
pyinstaller参数介绍以及总结详解
Jul 12 Python
python线程中的同步问题及解决方法
Aug 29 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 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/10/09 PHP
收集的PHP中与数组相关的函数
2007/03/22 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
简单JS代码压缩器
2006/10/12 Javascript
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
微信小程序form表单组件示例代码
2018/07/15 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
python冒泡排序简单实现方法
2015/07/09 Python
Python中的__slots__示例详解
2017/07/06 Python
用python制作游戏外挂
2018/01/04 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
医学实习生自我鉴定
2013/12/12 职场文书
年终晚会活动方案
2014/08/21 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python
redis lua限流算法实现示例
2022/07/15 Redis