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 深入理解yield
Sep 06 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
Python3读取Excel数据存入MySQL的方法
May 04 Python
python射线法判断一个点在图形区域内外
Jun 28 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
pandas分组聚合详解
Apr 10 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
JavaScript对象模型-执行模型
2008/04/28 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
python操作CouchDB的方法
2014/10/08 Python
python 字典(dict)按键和值排序
2016/06/28 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
tensorflow的计算图总结
2020/01/12 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
python算的上脚本语言吗
2020/06/22 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
自我评价正确写法范文
2013/12/10 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
倡议书格式范文
2014/04/14 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python