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 list 合并连接字符串的方法
Mar 09 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
python 把列表转化为字符串的方法
Oct 23 Python
Python中遍历列表的方法总结
Jun 27 Python
详解python和matlab的优势与区别
Jun 28 Python
python爬虫 正则表达式解析
Sep 28 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
python安装后的目录在哪里
Jun 21 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
python 发送邮件的四种方法汇总
Dec 02 Python
python中PyQuery库用法分享
Jan 15 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
May 20 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循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
php文件下载处理方法分析
2015/04/22 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
php json相关函数用法示例
2017/03/28 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
python统计cpu利用率的方法
2015/06/02 Python
python 字符串追加实例
2019/07/20 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
canvas线条的属性详解
2018/03/27 HTML / CSS
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
生物化学研究助理员求职信
2013/10/09 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
办理房产过户的委托书
2014/09/14 职场文书
离婚协议书的范本
2015/01/27 职场文书
公路施工安全责任书
2015/05/08 职场文书
经费申请报告范文
2015/05/18 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python