*頁アーカイブ*
 ②

       

*②頁目 目次*
 11.ライブラリ(pandas)の使い方① / 12.ライブラリ(pandas)の使い方② /
 13.ライブラリ(pandas)の使い方③ / 14.ライブラリ(pandas)の使い方④ /
 15.ライブラリ(pandas)の使い方⑤ / 16.ライブラリ余談 / 17.余談① / 18.PDFから文字起こし① /
 19.PDFから文字起こし② / 20.PDFから文字起こし③

         
  

【第11回】 ライブラリ(pandas)の使い方①

漫画11こんにちは!

さてさて、間に番外編を挟みましたがPythonもインストール出来たことだし
今度は私が実際によく使っているライブラリについて紹介するよー!

基本的に私が普段仕事で使うデータの形式は “.csv” です

扱うファイルが1つや2つで、中身のデータ行列も少ないならExcelで充分なんやけど水質を始め、対象を機械的に測定している場合、
データは1ファイルにつき数十列×
数百行なんて当たり前
になってきます。

そんな膨大なデータを扱う際、Pythonpandasってライブラリを使うと
データの扱いがとっても楽になります
🌟

超人でもないと細かい数字何個も何個も見てられないからね!!


あ!一応補足するけど表を作りたいとか特定のデータ値に色つけたいとかはExcelか他のソフトでやってね。

ここで話すのはたくさんのデータの中から必要な要素を取り出したり、
扱いやすくする方法
です。
表にしたり、グラフで可視化するための前処理だと思ってください。


以下にコード例を紹介します。


1.初めに

pandasに限らずライブラリを使うときは必ずインポートしましょう
インポートしてからじゃないと使えません。



なので
import 〇〇○ (←ライブラリ名)
最初にこれを記述しましょう。

また、import 〇〇○ as △△△ とすると、
△△△という名前で〇〇○を読み込んだことになります。

  
インポートする
2行目3行目の実行結果が“>>>”以降に表示されますが、どちらも問題なさそうですね。

これでpandasが使えるようになりました。
(ちなみに、importがImportになってるとエラーが返される・笑)


あとここで言っておきたいポイントが1つあって、
プログラムの最初に #coding: utf-8 とありますよね。
これを記載しておくと日本語が文字化けしてしまう!なんてことが防げます。

コード中に日本語が出てこない場合必要ないけど、私はそうじゃないので毎回記載してるよ☺


・・・さて、話を戻します。


漫画122.データ読み込み

次に、読み込むファイル(ここでは『arr_date.csv』)はこのような1000行12列の数値データとします。




pandasにはtxtファイルやその他のファイル形式についても対応できるようツールが用意されていますが、今回使うのはcsvファイルなので、次に入力するのは

pd.read_csv() もしくはpandas.read_csv()

()の中には開きたいファイルのパスを入力してくださいね!
その際パスの最初と最後に「‘」を付け加えるのを忘れずに。
‘テキスト’と囲うことでPythonがテキストを文字列と認識してくれます。
また、パス中に「」があれば「/」に変更してくださいね。


3.結果出力

結果こんな感じ↓

実行結果

見やすくなりましたね~😋

Pandasで読み込んだデータはDataFrameという形で扱うことが出来ます。
私は初めて見たときExcelのセルが無いバージョンだと感じました(笑)

pd.read_csv(‘パス’,header=0,index_col=0)
ここでパスの後ろ、コンマ以降に記述しているのはread_csvのパラメーターです。
指定しているのは項目行と見出し列。
パラメーターを指定することで細かい調整をしてくれます。

さて、今回はここまで。

次回は読み込んだデータを使って簡単な操作をしてみようと思いますkai


  

***⑫へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る
0701**20200521


【第12回】 ライブラリ(pandas)の使い方②ーPrint参照

  

漫画12前回pandasを使って下の図のようにcsvファイルの読み込みができました。

今日はその続きとして簡単なデータ操作を行いたいと思います。

実行結果

1.変数化

まずは6行目

pd.read_csv(‘C:/Users/・・・’) これを
df= pd.read_csv(‘C:/Users/・・・’) に直してください。

このdfというのは任意の変数です。
dfじゃなくdateでもdでも何でもOK。

データ読み込みにpd.read…と、長ったらしく書きましたが、変数にすることで以下2文字で済みます
この作業はプログラムを書くときの基本ですが、コードをスッキリ見やすくして間違いを減らすことにも繋がりますので是非慣れて下さい(*´ω`*)


2.print() 参照

im10
先程変数に代入したデータ値は
Python3.6なら print(変数) のコマンドで中身の確認ができます。
私はめんどくさいので dfとそのまま打ってますがこれも大丈夫みたいです。
(3.6以前のバージョンだと、すこしコマンドが違うらしい・・・)

print(df)だとdfの全体が確認できます。
中身のデータの数が多い場合は「…」と間の部分が省略されてしまいますが(笑)

そして参考までに他の参照方法を挙げると

df.head()
df.tail()


などのコマンドがあり、head()は先頭、tail()は末尾を参照します。
また、()の中に数字を入れると参照する行数が指定できます。デフォルト参照数は5行です。

とっても簡単ですね!

次回は見たいデータを行・列を指定して参照する方法を紹介します。

ではでは!

     

***⑬へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る
0701**20200604

       

【第13回】 ライブラリ(pandas)の使い方③ー列を指定して抽出

漫画13今回はDataFrame (df)から行・列を指定して見たいデータを取り出すよ。

1.列抽出

先にコマンドを言ってしまうと、df.列名 や df[‘列名’] で抽出可能です。
ただ、前者が使えるのは列名が文字列のときらしく、
以下一番初めの列を指定していますが、赤文字部分で構文エラーが出ています^^;

■ df.列名↓


気を取り直して今度は列名を
[‘0’,‘1’,‘2’,‘3’・・・・] から [‘a’,‘b’,‘c’,‘d’・・・・] とアルファベットに直して再度取り出します。



このとき列名を一括で変更する方法ですが、df.columns で指定してやると簡単
実際の列数と[ ]の中身の個数が一致するように記載しましょう。(df[‘列名’]①↓)
今度はdf.aで最初の列の抽出が出来ました。

また、df[‘列名‘]を使うと数字でも文字列でも関係なく抽出できます。(df[‘列名’]②↓)

•df[‘列名’]①↓


•df[‘列名’]②↓


こんな感じで多少の規制はあるものの簡単に抽出できました(^o^)


2.行抽出

dfから範囲を指定して取り出す場合

■ df[行番号:行番号]↓


次に1行だけ抽出したい場合や複数行指定したい場合は行(列)番号を指定するilocを使います。

■ df.iloc[行番号]↓



さて、ここで皆さんに問題です。

問題:
ilocを使ってindexの2行目と3行目を取り出すには
どうすればいいでしょうか???



答えは次回載せます(*´ω`*)

     

***⑭へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る
0701**20200618

       

【第14回】 ライブラリ(pandas)の使い方④―ilocを使った抽出

漫画14 今回は前回出した問題、
 『ilocを使ってdfから2行目と3行目を取り出すには???』

 この答と間違い例を紹介します。

 今回は2行目と3行目だけなので範囲指定する方法と復数行を指定する方法が
 使えます。


□正解↓




■間違い例↓

im18


以下に正解と間違いを比べながらちょっとだけ解説しますね。

※前回書き忘れてましたが、Pythonで配列を扱う場合スタートは1ではなく0始まりです。
 (繰り返し構文を書くときや、配列生成するときにも共通します)
 なので、任意のindexが1からスタートしている場合でも抽出の際、行番号は0と指定します。


 行番号  index
 0 ・・・1行目
 1 ・・・2行目
 2 ・・・3行目
 3 ・・・4行目
 ︙


 ■解説1

 範囲指定して抽出する方法について
 なぜ正解がdf.iloc[2:4]でdf.iloc[2:3]が間違いなのか?

 iloc[2:3] の意味は2行目から3行目までではなく、行番号で数えて2行目から3行目未満です。

 なので

 iloc[2:3]2行目から3行目未満の意味間違い
 iloc[2:4]2行目から4行目未満の意味正解○


 ■解説2

 行列指定して抽出する場合
 iloc[行番号,列番号] とコンマで区切って指定します。


 今回のように複数行抽出したい場合は
 iloc[[行番号,行番号],列番号] と行番号のスペースを更に括弧で括って記載します。
 (複数列の場合も同じ)


 ということで

 iloc[2,3]2行目、3列目→        間違い✕
 iloc[[2,3],:]2行目と3列目、すべての列正解○

 と、まあこんな感じなんですが

 正直私もよくあやふやになってエラー表示くらうことがあるので、実際にコーディングしていく中で徐々に
 覚えていくのが一番いいんじゃないかなーと思う!

     

***⑮へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る
0701**20200702

       

【第15回】 ライブラリ(pandas)の使い方⑤―locを使った抽出

漫画15 皆さんハロー
 今まで抽出方法を散々紹介してきましたが今回で一旦一区切りにしたいと
 思います。
 この手のコマンドはたくさんあってキリがないから…

 さて、前回はilocを使って抽出を行いました。
 今回は、行番号で指定するilocに対して文字列で指定するlocがあるので
 そっちの紹介をするよ!

 今までdfを例に使ってきたけど、インデックスと列名が数値じゃ
 都合悪いので新しく作ったdf2(↓)を使って抽出作業を行います。


 このdf2の作り方を一応載せとくね。


 ■DataFrame生成

 df2=pd.DataFrame(np.random.randint(0, 200, (5, 2)),
 index=['A','B','C','D','E'],columns={'Alice','Tom'} )

 ※乱数生成にnumpyっていう計算用のライブラリを利用してるんだけど、ここで説明すると趣旨がずれるので
  興味がある人はWEBへ(笑)



 まずはA行の抽出
 ■df.loc[‘行名’](↓



 今度は行列を指定して抽出
 ■df.loc[‘行名’,’列名’](↑

 最後に複数行、複数列を指定して抽出
 ■df.loc[[‘行名’,’行名’],’列名’](↑

 以上―!

 今回の抽出に関してはとにかく行列の記載順だったり、複数指定の場合は括弧でくくったり
 「:」で範囲指定したり
…がポイントですね!

 あとは練習あるのみ。

 これまで紹介した以外にもquery()比較演算子で条件を指定して抽出する方法もあるので、気になる人は調べてみてね。

     

***⑯へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20200716


【第16回】 ライブラリ余談ーモジュール化

漫画16 こんにちは!もとちゃんです

今日は基本的な操作そっちのけでモジュール化について簡単に方法を書こうと思います。
思い立ったが吉日です。

最近処理工程の多いプログラムを作っていると、一つのスクリプトに
収まりきらないんですよね~。
行数さえ気にしなければ収まるっちゃ収まるんですが…

Pythonインデントを揃えましょう!」というルールがありますから、
for文(繰り返し)やif文(条件分岐)、def関数が多いと、おのずと字下げも
多くなりますし、後々プログラムの調整をしている際に誤ってインデントを
無くしてしまうとそれだけでプログラムが正常に動いてくれないのです。
(繊細です)

行数の多い大きなプログラムというのは、この調整のしづらさと、
ごちゃごちゃして見づらいのがネックなんですね~。

さて、本題ですが今回の目標は
• 後の作業を楽にする
• 後から見直しても分かりやすくする

この2点です。

以下では例としてユーザーからの入力データ(数字)を適当な配列にして、
可視化を行います。


メインプロジェクト:test_mj.py
サブプロジェクト:test_a.py

test_mj.pyは入力データから乱数を生成し、それをtest_aの図化関数を使って可視化します。
test_a.pyには図化の関数が記述されています。


• test_a.py


4行目:まず図化に必要なmatplotlibをインポート。
5行目:次にinput()というのはユーザーから入力を受け取るためのツールです。
ここでは任意のグラフタイトル(アルファベット)を入力させます。

7行目:def pltfig(xval,yval,title): は任意の関数を定義しています。
各引数は、
xval=X軸データ
yval=Y軸データ
title=図のタイトル名 を想定しています。
タイトル名以外はtest_mj.pyで受け取った値を代入します。
def関数の宣言をしたら、次の行目からはインデントを揃えて記述します。
これが冒頭で言ったルールですね(・ω・)


• test_mj.py


こちらのメインプロジェクトでは先程のpltfig関数を使って図化を行います。
別のプログラム(test_a.py)の関数を使って処理を行いたいので、このプログラムのシステムにパスを
通してあげます。

2行目:まずosとsysをインポートします。
(osは必要であればインポート)
5行目:次に、sys.path.append() で()の中に開きたい
プログラムがあるフォルダパスを指定します。
             今回はこんな階層構造→

()の中にはプログラムtest_a.pyのフォルダまでのパス(フルパス)を記述しました。
C:/…/hebikano_code_sample/test_mj/test_a /test_a.py

参考として、開きたいプログラムが同じ階層にあったり、1つ上の階層にある場合
直接 importファイル名(.pyは不要) でインポートできる場合や
sys.path.append(os.path.join(os.path.dirname(‘__file__’),’..’)) などど書いて
パスを通すこともできます。
これは今開いているプロジェクトファイル(__file__)からひとつ外側の領域パスを追加するという意味です。
確か
(今回何故かこの方法ができなかったのでos使わずフルパスにしました(;´д`))

7行目:パスを通し終わったら次にインポートします。
モジュールとしてインポートするときは

同じ階層にある場合

main
a.py (実行中)
b.py(呼出す側)
   )
main
a.py (実行中)
b.py(呼出す側)
)

import プログラム名(test_a)
としますが、test_a.pyはtest_aフォルダに格納されているのでエラーは返さないものの起動しません。


8行目:次に、
違う階層にある場合
test
main
a.py (実行中)
b.py(呼出す側)
)
test
main
a.py (実行中)
b.py(呼出す側)
)

import ファイル名(test_a).プログラム名(test_a)

from ファイル名(test_a) import プログラム名(test_a)

などと表記してインポートします。

こちらはタイトル名のインプット要求がされ、正常に起動しました。

これで無事test_a.pyをモジュールとしてインポートできたので、

13行目:val=float(input('数値を入力: ')) で任意の数字を入力し、
22行目:pltfig()を使って図化します。

インポートしたモジュール名と関数名を「.」で区切って表記します。
a.pltfig(x,y,a.title)

見て分かる通り、関数だけでなく変数も「.」で区切れば参照することができます。
これを実行するとこのような図が展開されます。


今回はモジュール化したいプログラムとメインプロジェクトの階層構造によって適切にパスを追加してあげること、インポートの方法、関数の呼び出し方について説明しました。

     

***⑰へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20200806


【第17回】 余談①ーHPの話

漫画17今日はPythonの話からはちょっと逸れるんですが…

皆さん、うちのHPは見てくれていますか?
最近はWEBデザインにも力を入れているんですよ☆

例えば、初期のヘビカノブログは各話アーカイブ表示でしたが、
6月上旬頃、下部にサムネイルが追加されて見やすくなりましたよね♪

ヘビカノもそうですけど実は同時期、環境システムの方も事業内容など新しく更新されています!

そして今はまだ詳しいことは言えませんが、少し前にも
WEBコンテンツについて新しい案も出ましたし、
今後だんだんと賑やかになる予感…(*´∀`*)

制作してくれているCさんには本当いつもお世話になりっぱなしです(笑)
モトハシ一応プログラマーのくせにHTMLやCSSがイマイチ書けないポンコツなんですね(;´д`)
毎回なにかお手伝いできたら…と思いながら、結局4コマの仕上げとHP関係はCさんに全振りしております。
(いつか怒られるんじゃないかとヒヤヒヤしております)


さらに余談ですが、
プロのプログラマーといえば複数言語が使えて当然とよく耳にしますが、
ゲームの世界なら全属性の高位魔法を操るレベルMAXのウィザードといった
ところでしょうか。
……まだまだ先が長そう。

なにはともあれ今後も頑張っていくので皆様よろしくお願いしますm(_ _)m

     

***⑱へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20200820


【第18回】 PDFから文字起こし①ー(tabula)

漫画18こんにちは、皆さん! 今日は以前S家先生から頼まれた仕事で、
超―めんどくさくて悪戦苦闘した1件をつらつら書いていこうと思います(笑)

あるとき先生から渡されたもの…
それは数年分の表データ。

頼まれた内容はこの表をPDF形式からエクセルに変換するというものでした。
イメージとしてはこんな感じ。


内容公開できない為、文字や詳細は伏せています。(実際はもうちょっときれいです 笑)
ざっと45行13列以上ある不揃いなデータです。


ご覧の通り罫線と数字がひっついてて超絶見づらい。
手作業で打ち込めば見間違いと打ち間違い必至です!
当然Pythonをつかって変換しようと、
最初はtabula というライブラリでPDFからcsv形式に変換するプログラムを
試していたのですが……


上記のコードでPDFファイルのパスをfile_path、file_path2 という変数に
代入してから read_pdfで読み込みを行っています。

file_path は今回変換を頼まれたPDFファイルです。
file_path2 は以下、Excelで作った表をPDF化したテストデータです。

読み込んだ結果は、

 
df2のサンプルデータは表内のオブジェクトは読み取れています。
対してターゲットデータ(df)はなせか出力されません。

なんで!?と思って元のデータをよ~く見てみると、
プリンターのスキャナーで読み込んだ画像データであることが発覚!

そりゃダメだー(´・ω・`)

tabula を使うためには
talula-pyとjavaのJDKインストールが必要なので
(苦手な)環境設定もしたのにこの努力と時間は無駄でした(T_T)

別の方法を探すしかなさそう……

ちなみに標準で搭載されていないライブラリはコマンドプロンプト(ターミナル)
pip install ライブラリ名と打ち込むとインストールできますよ。


この続きは次回 (´;ω;`)

     

***⑲へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20200903


【第19回】 PDFから文字起こし②ー(tesseract)

漫画19tabulaを使った簡単な方法は通用しなかったので、
気を取り直して今度はPDFを一度画像データにしてから文字を読み取るという方法を試してみました。

今回はtesseractという日本語に対応した文字認識ソフトを使用します!

先のtabulaもそうですが、この手のソフトを使う場合インストールや準備工程に手間が掛かるのでここではその方法は書きません💦(←個人的にめんどくさいだけ)

また、このとき私が実際に使用したコードは複雑なので、
ここでは作業のポイントと以下の画像から文字起こしを行う簡単なコード例を記載しておきます。

プログラムで使用する画像(サンプル.png)はこちら↓


POINT1
Anacondaの標準パッケージにないライブラリのインストール。

• import pyocr
Python用のOCRツールラッパー(Pythonからtesseractを使う際に必要)

• PIL
画像処理用のライブラリ(Pillow)

これらをコマンドプロンプトからインストールして下さい。


POINT2
tesseractのインストールと実行方法

• WEBから「tesseract」というソフトをインストールし、Pythonで起動・実行できるように環境変数設定を行います。

• Pythonに以下のコードを入力します。

88:tool=pyocr.get_available_tools()[0] 
上記のコードではpyocrからtesseractを呼び出しています。
呼び出したときに使用できるツールが有ると推奨順にリスト形式で返ってくるので、末尾に[0]として最適なツールを指定します。



• Tesseractの呼び出しエラーの場合


ここでエラーが出た場合、下記のコードを追加してtesseractの実行ファイルの在り処を示してあげます。
pyocr.tesseract.TESSERACT_CMD ='C:/Program Files/Tesseract-OCR/tesseract.exe'


これでツールが返ってきましたね!
私が試した結果、/tesseract.exeまで指定しないとソフトが動きませんでした。

• image_to_string()で文字起こし

それでは画像から文字を抽出します!


106行目、image_to_string()の括弧内では開く画像のパスを指定。
107行目では言語の設定。
108行目ではtesseractのオプションを指定しています(ここではTextBuilder=文字列認識、tesseract_layout=レイアウトパターン)

• 結果


記号の後に誤認していますがテキストはうまく読み込むことができました!

次回、この方法を使った結果
先生から頼まれた例のPDFデータはうまく読み込むことができたのか発表します。

     

***⑳へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20200917


【第20回】 PDFから文字起こし③ーその後の話

漫画20以前の記事でtesseractを使った文字起こしについて紹介しましたが、
その後頼まれていたPDFファイルの変換は無事できたのかと言うと……

以下、前処理なしで元のデータをそのままtesseractにかけた結果です。


こんなんなりました…!!!!!!!

やば!文字化けしすぎやん!!!!!!

原因を色々と調べると、
最初に懸念していた通り、罫線に文字や数字が重なっていると
うまく読み込んでくれないみたいです。
また、スキャナーで取り込んだ際に角度や影がついていたりノイズがあると
正確に認識してくれないようでした(T_T)

絶望…

悪あがきで罫線除去やノイズ除去、エッジ検出をPython上で行ってから再度tesseractにかけてみると、
文字化けは軽減されましたが数値は誤認が多く、列もバラバラ。
左端の日付ですら順番になっていません(;´д`)
やっぱり精度がイマイチでした。


……もうこれは打つ手なし😔

こんな細かい数字から間違いだけを探して修正するのも逆に時間と注意力を使うので
諦めてコツコツExcelに打ち込むしかないのね…。

以上のように、今回かなりの時間を使って作業をしたのですが私ではこれが限界でした。


tesseractを再学習させるという手もあるらしいので、
jTessBoxEditorという専用ツールを使って試してみたのですが、
こちらは .txtからインプットした文字列を正しく認識させる仕様のようで、
フォントの違いや熟語の認識誤差はなくなりそう
ですが…
今回のように、
そもそも文字の一部が途切れていたり荒い画像から何の文字かを予測して出力する
という課題には適していませんでした。

きっと予測できないことは無いんでしょうけど、今回は期限に間に合わないので断念(*_*)

後日談ですが、
のちに有償のソフトで文字起こしを行うと上手くいきました 笑
やっぱり無料ソフトには限界があるようです(;・∀・)

     

***⑳へ続く***      このページ最初に戻るこのページ最初に戻る ヘビカノTOPに戻るヘビカノTOPに戻る 環境システムTOPに戻る

0701**20201001