Maison  >  Article  >  développement back-end  >  Explication détaillée de la demande IP réelle Pandas pour l'analyse des données Python

Explication détaillée de la demande IP réelle Pandas pour l'analyse des données Python

高洛峰
高洛峰original
2017-03-24 17:08:551657parcourir

Avant-propos

Pandas est un package d'analyse de données construit sur la base de Numpy qui contient des structures de données et des outils plus avancés. Semblable à Numpy, dont le cœur est ndarray, pandas s'articule également autour des deux structures de données de base de Series et. DataFrame. Series et DataFrame correspondent respectivement à une séquence unidimensionnelle et à une structure de table bidimensionnelle. La méthode d'importation conventionnelle des pandas est la suivante :

from pandas import Series,DataFrame
import pandas as pd


1.1 Étapes d'analyse des pandas

1. Charger les données du journal.

2. Chargez les données area_ip

3. Comptez le nombre de requêtes real_ip. Similaire au SQL suivant :

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 Code

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, &#39;r&#39;) 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], &#39;addr&#39;]
      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 = [&#39;real_ip&#39;] # 需要分组的列,只计算和显示该列
      
    # 直接统计次数
    url_req_grp = self.df[group_by_cols].groupby(
                   self.df[&#39;real_ip&#39;])
    return url_req_grp.agg([&#39;count&#39;])[&#39;real_ip&#39;].nlargest(top, &#39;count&#39;)
      
  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),
           &#39;addr&#39;,
           cnt_df.index.map(self._get_addr_by_ip))
    return cnt_df
      
  def load_ip_addr(self, path):
    """加载IP"""
    cols = [&#39;id&#39;, &#39;ip_start_num&#39;, &#39;ip_end_num&#39;,
        &#39;ip_start&#39;, &#39;ip_end&#39;, &#39;addr&#39;, &#39;operator&#39;]
    self.ip_addr_df = pd.read_csv(path, sep=&#39;\t&#39;, names=cols, index_col=&#39;id&#39;)
    return self.ip_addr_df
  
def main():
  file_pathes = [&#39;www.ttmark.com.access.log&#39;]
  
  pd_ng_log_stat = PDNgLogStat()
  pd_ng_log_stat.load_data(file_pathes)
  
  # 加载 ip 地址
  area_ip_path = &#39;area_ip.csv&#39;
  pd_ng_log_stat.load_ip_addr(area_ip_path)
  
  # 统计 用户真实 IP 访问量 和 地址
  print pd_ng_log_stat.uv_real_ip_addr()
  
if __name__ == &#39;__main__&#39;:
  main()


Statistiques d'exécution et résultats de sortie

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]
Résumé

Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article apportera des avantages. les études ou le travail de chacun. Aide, si vous avez des questions, vous pouvez laisser un message pour communiquer.

Pour des explications plus détaillées sur les requêtes IP réelles Pandas pour l'analyse des données Python et les articles connexes, veuillez faire attention au site Web PHP chinois !

Articles connexes :

Comment utiliser Pandas pour lire des fichiers CSV et les écrire sur MySQL en Python

Journaux Cdn via les pandas bibliothèque en Python Analyse détaillée

Tutoriel sur l'utilisation du framework pandas de Python pour manipuler des données dans des fichiers Excel

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn