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 相关文章推荐
Python3实现购物车功能
Apr 18 Python
python try except 捕获所有异常的实例
Oct 18 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
python中的反斜杠问题深入讲解
Aug 12 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
python tkinter组件摆放方式详解
Sep 16 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
Mar 19 Python
pycharm的python_stubs问题
Apr 08 Python
如何更换python默认编辑器的背景色
Aug 10 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 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中长文章分页显示实现代码
2012/09/29 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
[46:32]Fnatic vs OG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
python脚本定时发送邮件
2020/12/22 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
匡威德国官网:Converse德国
2019/01/26 全球购物
总经理助理岗位职责
2013/11/08 职场文书
项目考察欢迎辞
2014/01/17 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
礼仪培训心得体会
2016/01/22 职场文书
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技