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中sets模块的用法实例
Sep 30 Python
pandas.DataFrame.to_json按行转json的方法
Jun 05 Python
Python 串口读写的实现方法
Jun 12 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
利用Python如何实时检测自身内存占用
May 09 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
Django限制API访问频率常用方法解析
Oct 12 Python
如何在Python中创建二叉树
Mar 30 Python
Pytorch中的数据集划分&正则化方法
May 27 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的简单跳转提示的实现详解
2019/03/14 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
详解vue axios二次封装
2018/07/22 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
python中删除某个元素的方法解析
2019/11/05 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
Python如何合并多个字典或映射
2020/07/24 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
英语商务邀请函范文
2014/01/16 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
给国外客户的邀请函
2014/01/30 职场文书
学雷锋宣传标语
2014/06/25 职场文书
会议欢迎标语
2014/06/30 职场文书
室内趣味活动方案
2014/08/24 职场文书
义诊活动通知
2015/04/24 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL