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获得文件创建时间和修改时间的方法
Jun 30 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
May 31 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
python获取txt文件词向量过程详解
Jul 05 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
tensorflow 实现自定义梯度反向传播代码
Feb 10 Python
Python extract及contains方法代码实例
Sep 11 Python
Python实现哲学家就餐问题实例代码
Nov 09 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/06/07 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
Python之eval()函数危险性浅析
2014/07/03 Python
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
python画图的函数用法以及技巧
2019/06/28 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
python SocketServer源码深入解读
2019/09/17 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
护理职业生涯规划书
2014/01/24 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
关于运动会的口号
2014/06/07 职场文书
护士工作失误检讨书
2014/09/14 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
golang操作rocketmq的示例代码
2022/04/06 Golang
Python如何使用循环结构和分支结构
2022/04/13 Python
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript