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 03 Python
如何在Python中编写并发程序
Feb 27 Python
详解Python中的变量及其命名和打印
Mar 11 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
python numpy实现文件存取的示例代码
May 26 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
python操作excel让工作自动化
Aug 09 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
分享Python获取本机IP地址的几种方法
Mar 17 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
使用无限生命期Session的方法
2006/10/09 PHP
PHP详细彻底学习Smarty
2008/03/27 PHP
Memcache 在PHP中的使用技巧
2010/02/08 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python函数嵌套实例
2014/09/23 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
python类中super() 的使用解析
2019/12/19 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
详解如何修改python中字典的键和值
2020/09/29 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
Java基础面试题
2014/07/19 面试题
大学生社会实践方案
2014/05/11 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书