解析と監査





アイデアから始めましょう。あなたが実際の監査人として、とりわけサードパーティのリソースを使用して、犬の飼育者の報告の調査を行いたいとしましょう。これを行うには、たとえば品種の名前だけを知っているブリーダーの子犬に関する体系化された情報を取得し、パンダでそれからテーブルを作成して、あらゆる性質のさらなる処理(あらゆる種類の統計調査、集計など)に適したものにします。しかし、データは抽象的なWebサイトの奥深くに保存されており、そこからアーカイブの形式でのみ取り出すことができます。アーカイブの形式では、複数の形式のドキュメントが積み重ねられ、その中にテキスト、写真、表があります。そして、子犬の品種がたくさんあり、それぞれにテーブル付きのpdfファイルが12個ある場合、そこからのすべての情報は必要ありません。また、たとえば、これらのテーブルや脚注の名前も必要ですか?プロジェクトにいくつかの関数を追加しましょう。次のタスクを解決します。データを含むアーカイブのアンロードとアンパック、アーカイブからのpdfファイルの検索と処理、受信したデータの分析。



まず、必要なものをすべてインポートしましょう。必要なライブラリをシステムライブラリに分割しましょう。



import os
import re
import glob
import csv
import shutil


およびインストールが必要な外部のもの(私が言ったように、pip install):



import requests as req
import pandas as pd
from zipfile import ZipFile
import tabula
import PyPDF2
from pdf2image import convert_from_path
from pytesseract import image_to_string
from PIL import Image, ImageDraw


今、あなたの子犬のそれぞれについて、私たちは彼の品種の名前でサイトを参照して、データを含む大きなアーカイブをダウンロードします:



def get_doquments_archive(breed):
            url = 'https://yourwebsite' + breed + '/document/download'
              with req.get(url, stream=True) as r:
                r.raise_for_status()
                with open('/Users/user/Desktop/' + breed + '.zip', 'wb') as f:
                         for chunk in r.iter_content(chunk_size=8192):
                                   f.write(chunk)


これで、デスクトップにアーカイブができました。それを開梱しましょう。このために必要なのは、アーカイブを含むファイルへのパスだけです。



def unzipper(zippath, cond = False):
 dirpath = zippath[:-4] + '_package'
 if os.path.exists(dirpath) and os.path.isdir(dirpath):
shutil.rmtree(dirpath)
os.mkdir(dirpath)
with ZipFile(zippath, 'r') as zipObj:
zipObj.extractall(path = dirpath)


このステップでは、pdf、csv、xls、pngなどの優れた機能を含むドキュメントを含むフォルダーを取得します。データを含むテーブルを含むいくつかのpdfファイルを処理するとします。しかし、それらをそこから取り除く方法は?まず、フォルダから必要な形式のドキュメントを選択しましょう。



all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')


優れた。これで、テキストとテーブルを含むファイルがたくさんあります。そこから情報を抽出しようとすると、特にテーブルが互いに接着されていて、タイトルや脚注が別々のテキストである場合、ツールがそのような混合を非常に曲がって認識していることがわかる場合があります。タブラが助けに来ます!しかし、最初に、各ドキュメントの最初のページから、表に含まれていない小さなテキストの説明を取り出しましょう(表のそのようなテキストは問題になる可能性があります)。最初のページにもテーブルを含めることができるので、フォーカスを使用しましょう。



def get_text_description(path):
pdfFileObj = open(path,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
pages = convert_from_path(declar, 0)
page = pages[0]
pname = '/Users/user/Desktop/text_description.png'
page.save(pname, 'JPEG')
text = image_to_string(Image.open('/Users/user/Desktop/text_description.png'),
                                          lang = 'rus')
text_file = open('res', "w")
text_file.write(text)
text_file.close()


それでは、テーブルの操作を始めましょう。運が良ければ、pdfの表が非常に読みやすい場合、tabulaはそれをcsv形式で正しくアップロードするため、情報を解析する必要はありません。



tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')


たとえば、選択した子犬のキャラクターに関するデータを簡単に取得できるようになりました。



data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']


しかし、テキストの作成者がテーブルを接着したり、行に異なる数の列を追加したり、テキストと混合したりした場合はどうなるでしょうか。次に、tabulaから受け取ったファイルを新しい形式に変換します。



def get_table_data(path):
 data = []
 with open(path) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
for val in row.values():
data.append(val)
data = str(data)
data = re.sub('\]|\[|,|\'', '', data)
data = data.replace("\\n", "")
return data


何のために?これにより、通常の式を使用して、必要な情報をすばやく簡単に検索できます。可能な品種の色のセットを見つけたいと思います。



def get_colors(data):
 res = re.search('^: (.*)', data).group(1)
 return res


これで、ファイルから1つずつ子犬に一定量の情報(文字、色、体重など)が蓄積されました。それを新しい行としてパンダデータフレームに追加しましょう:



def append_new_row(dataframe, breed, temperament, colors, weight):
  return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)


現在の







状況そこで、サイトからデータを含むアーカイブをアンロードし、解凍し、必要なドキュメントを取り出し、それらから重要な情報を抽出して、便利な形式にしました。これで、このデータを会社が提供するデータと比較したり、変換および分析したりすることができます。手動でダウンロードして書き出すよりもはるかに便利です。



def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')


あなたの行動が完全に合法であり続けることが重要です。サイトからデータを取得することはできますが、コンテンツを盗むことはできません。自動的にダウンロードできますが、サーバーを置くことはできません。研究の著作権とロシア連邦の刑法は、損害を与えません。



All Articles