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转化成dictionary
Aug 15 Python
Tornado高并发处理方法实例代码
Jan 15 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
OpenCV模板匹配matchTemplate的实现
Oct 18 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
Jun 15 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
Python绘制组合图的示例
Sep 18 Python
Python requests HTTP验证登录实现流程
Nov 05 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
建站常用13种PHP开源CMS比较
2009/08/23 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
设定php简写功能的方法
2019/11/28 PHP
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
linecache模块加载和缓存文件内容详解
2018/01/11 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
电信专业毕业生推荐信
2013/11/18 职场文书
九年级科学教学反思
2014/01/29 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
小学优秀教师材料
2014/12/15 职场文书
会计人员岗位职责
2015/02/03 职场文书
员工旷工检讨书
2015/08/15 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python