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 tkinter事件高级用法实例
Jan 31 Python
Python requests发送post请求的一些疑点
May 20 Python
Python Series从0开始索引的方法
Nov 06 Python
Python3实现腾讯云OCR识别
Nov 27 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
python模拟斗地主发牌
Apr 22 Python
Python 日期与时间转换的方法
Aug 01 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
Pygame如何使用精灵和碰撞检测
Nov 17 Python
python数字图像处理之对比度与亮度调整示例
Jun 28 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
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
深入解析php中的foreach问题
2013/06/30 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
jcrop基本参数一览
2013/07/16 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python的常用模块之collections模块详解
2018/12/06 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
农村改厕实施方案
2014/03/22 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
小学英语复习计划
2015/01/19 职场文书
妈妈别哭观后感
2015/06/08 职场文书
李强感恩观后感
2015/06/17 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
远程教育培训心得体会
2016/01/09 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python