人生ゲーム,ルーレット5,職業:エンジニア

Python, 電気電子,料理にいそしむ

GCP+Wordpressを使ってホームページを作ることになった.

サークルのホームページを作ることになってしまって,GCPWORDPRESSを使って作ることにした.

今回は,それに用いた参考文献リストである.

stpost.net

webird-programming.tech

yongjinkim.com

qiita.com

qiita.com

qiita.com

クラス 'numpy.bool_' に騙された話

今日も今日とてPython の些細なところに丁寧に躓いていく.

今回は,「'bool'型って1種類じゃないの!?」っていう話である.

そう,1種類ではなかったのである.

標準クラスの'bool'型と,numpyにおいて定義されている’bool’型(正確には 'numpy.bool_' 型)の2種類が存在する.

そのため, 'numpy.bool_' 型の 'False' を 次のように条件判定しても意味がないのである.

import numpy as np
data = np.array([1, 2, -1])
result = data[data > 0].any()
# data[data > 0] = [True, True, False]
# .any() は呼び出し元の配列型インスタンスの要素内に一つでも True が含まれていた場合にTrueを返す.
# この場合は,Trueが返却される.
if result is True:    # numpy.bool 型オブジェクトとbool型オブジェクトの一致判定をしているので,当然一致しているという判定はされない.
print(True)
else:
print(False)

出力結果

False

このようにして条件判定させたいときには,キャストを行うことによって 'numpy.bool_' 型を 'bool' 型に変換する必要がある.

PandasのDataFrameに対してiterrows()メソッドで一つずつ要素を呼び出して,ラベルが存在するかどうかを確かめようとしてエラーに引っかかった話

題名を読んで,わかっている人からすると「何を当たり前のことを書いているんだ」と言われてしまいそうだが,自分がこれで結構引っかかったので一応メモ.

先ず,pandas の DataFrame 配列において

あるラベル名のカラムが存在するのかどうかを確かめたいという時がある.

そんな時には,DataFrame配列の有しているcolumnsという変数を参照することによってその確認を行うことができる.

まず,次の DataFrame配列を用意する.

import pandas as pd
test = [
["Taro", "Tokyo"],
["Jiro", "Osaka"],
["Sinya", "Aichi"],
["Haruki", "Hokkaido"]
]
index = ["user", "address"]
# DataFrame
testpd = pd.DataFrame(test, columns = index)
testpd

f:id:makutsueeken5:20190218151354j:plain

そして,columnsという変数を参照して,特定のラベル名のカラムが存在するかどうかを確かめることができる.

if "address" in testpd.columns:
print(True)
else:
print(False)

出力結果

True

また,DataFrame配列の中身を一つ一つ取り出したくなる時がある.

そんな時には,DataFrame配列の有するメソッドであるiterrows()を用いることによって実現することができる.

ここからが本題であるが,iterrows()を用いて一つ一つ取り出したアイテムに対して,columnsという変数を参照して,特定のラベル名のカラムが存在するかどうかを確かめようとすると,

for index, item in testpd.iterrows():
# index は 'int' type
# item は 'pandas.Series' type
print("************************************")
print(item)
# 'pandas.Series' type に対して,DataFrame型の時と同様に ".columns" を呼び出してみる
if "address" in item.columns:
print(True)
else:
print(False)

出力結果

True
************************************
user        Taro
address    Tokyo
Name: 0, dtype: object
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-27-555c8ebbccf2> in <module>()
8     # 'pandas.Series' type に対して,DataFrame型の時と同様に ".columns" を呼び出してみる
9     try:
---> 10         if "address" in item.columns:
11             print(True)
12         else:
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
4366         if (name in self._internal_names_set or name in self._metadata or
4367                 name in self._accessors):
-> 4368             return object.__getattribute__(self, name)
4369         else:
4370             if self._info_axis._can_hold_identifiers_and_holds_name(name):
AttributeError: 'Series' object has no attribute 'columns'

このようにAttributeErrorを食らってしまう.

というのも,公式リファレンスを参照したところ

pandas.DataFrame.iterrows — pandas 0.24.1 documentation

iterrows()メソッドによって渡される値は'DataFrame'オブジェクトではなく,'Series'オブジェクトとして渡されるためである.

Seriesオブジェクトは,columnの無いDataFrameオブジェクト・一次元のDataFrameオブジェクトのようなものであるため,columnsを参照することができないのである.

その代わりに,Seriesオブジェクトはその行(index)のラベルを.keys()メソッドによって参照することができるのである.

for index, item in testpd.iterrows():
# index は 'int' type
# item は 'pandas.Series' type
print("************************************")
print(item)
# 'pandas.Series' type に対して メソッド ".keys()" を呼び出してみる
if "address" in item.keys():
print(True)
else:
print(False)

出力結果

************************************
user        Taro
address    Tokyo
Name: 0, dtype: object
True
************************************
user        Jiro
address    Osaka
Name: 1, dtype: object
True
************************************
user       Sinya
address    Aichi
Name: 2, dtype: object
True
************************************
user         Haruki
address    Hokkaido
Name: 3, dtype: object
True

このようにして,indexを参照することができた.

並行処理を実現するアイディアを実装してみた.- Idea for data persistence in Pararell Processing

並行処理を実現するアイディアを実装してみた.- Idea for data persistence in Pararell Processing

未だに本ブログにおいて自分が作成したメインプログラムの解説を行っていないのだが(笑)

私はNYTimesの記事をスクレイピングするプログラムを作成した.本日はそれにまつわる内容だ(笑)

で,NYTimesは1996年?以降の記事に関しては積極的にオンライン掲載を行ってきたのであるが,それ以前の記事はアーカイブとして管理されている.

アーカイブの記事のうち,1960年代とか割と最近の記事に関してはその内容をデジタルテキストとして同様に掲載してくれている.

だが,それ以前の記事に関してはPDF画像として公開しているものが多い.

そのため,PDF画像として公開している記事の文章を取得したい場合には一筋縄では行かない.

そこで,私はOCRを用いてテキストデータに変換して取得するという方針にして,そのプログラムを作成したのである.

その概念図は次のようになっており,番号が振られているように3つの過程で分割され,それぞれの過程の処理を行うためのメインプログラム?的なものをそれぞれ作成した.

f:id:makutsueeken5:20190216143110j:plain

作成したプログラムを実行してみたところ,約5年分のデータに対して

ステップ1の実行速度が5時間だとすると,

ステップ2の実行速度は約1日から1日半程度

ステップ3の実行速度は約2週間程度

となっており,仕方ないことだがステップ3にとてつもなく時間がかかる.

この問題を何とかするために,次の2つの方法を思いついた.

  1. ステップ1を実行している最中に,別のターミナルでステップ2やステップ3を実行して,若干逐次的なイメージでデータを処理していく.
  2. 最終的にステップ2が終了して,ステップ3のみが残っているという状態に陥る.その時に,複数のターミナルでステップ3を実行する.要するに,同時に3つぐらいのファイルにOCRの処理をかけているという状態を実現する.

だが,これをやっていく上で問題になってくるのがpersistenceやログ的な問題である.

あるターミナルでステップ1の処理のループの一つを終えて,一旦データファイルを保存して(更新して)から次のループを処理しているとする.その直後に同様に一部のループ処理を終えたステップ2の方でデータファイルを保存して更新したとする.

このステップ2の更新後のデータファイルには,きちんとステップ1の処理による更新内容が引き継がれていなければならないのである.

こういった類の問題のことをどのような名前で読んでいるのかがわからないのでくどくどと長い説明になってしまったが,今回はこの対策案について考えた結果をここに記す.

DataFrameを使うようにプログラムを改修大作戦

makutsueeken5.hatenablog.com

この記事にも書いていたように,

パーシステンスの実現のためにこれまではlistオブジェクトをpickleファイルとして保存して,という方法をとっていた.

しかし,この方法は何とも「車輪の再開発」感があふれる方法であった.というのも,リストを読み込んでソートしてサーチするためのプログラムを作成したり, リストを分割するためのプログラムを作ったりという手間がかかっていたからだ.まあ,ある意味勉強になった部分もあったが,何とも運用コストが高すぎる方法論であった.

それに,どっちみち今後何らかの形でデータベースを扱う機会が出てくるであろうから,データベースを扱ういいチャンスだと思って,Pandasに手を出してみることにした.

ということで,Pandas の DataFrame を用いて,これまでlistで扱っていたデータをDataFrameに移行していく.

だから,この記事は誰かに読んでもらうためというよりかは,自分の進捗をメモしておくための進捗ログのようなものである.

以下ログ


  • 2/20

Digitalized_article_collecting.py

改善終了

一応これで全てのメインプログラムの改修作業が終了した.

Digitalized_article_collectingとGetting_pdfpagelink_service.pyを結合するとかしないとかの話はまた余力のある時に.

<展望>

GUI

・pyinstallとかいうパッケージを使うことによって実行ファイル化することができる.

  • 2/16

Dataframe_handle_service.py

追加

Converting_pdftotext_service.py

改善終了

Download_pdfarticle_service.py

改善終了

参考文献

qiita.com

tonari-it.com

  • 2/15

Url_handler.py

Url_handler.pyの改善終了.

Getting_pdfpagelink_service.pyも改善終了.

因みに,この時点でのデータは

f:id:makutsueeken5:20190215143139j:plain

そして,ディレクトリ構造は,

--- PDFver_articles_collecting
|
------ INFO_DATA (記事のテキストデータ以外で扱うデータファイルを保存)
|
------ DATA_LIST (ダウンロード記事のurlリスト等を保存)
|
------ url_data_list_news_19710101-19650101.
|
------ CHROMEDRIVER_USERDATA_DLPDF (Google Chrome のユーザーデータを保存)
|
------ src (ソースコードを格納)
|
------ DATA (記事のテキストデータを保存)

PandasのDataFrameについての備忘録

PandasのDataFrameについての備忘録

パーシステンスの実現のためにこれまではlistオブジェクトをpickleファイルとして保存して,という方法をとっていた.

しかし,この方法は何とも「 車輪の再開発 」感があふれる方法であった.というのも,リストを読み込んでソートしてサーチするためのプログラムを作成したり, リストを分割するためのプログラムを作ったりという手間がかかっていたからだ.まあ,ある意味勉強になった部分もあったが,何とも運用コストが高すぎる方法論であった.

それに,どっちみち今後何らかの形でデータベースを扱う機会が出てくるであろうから,データベースを扱ういいチャンスだと思って,Pandasに手を出してみることにした.

三菱K ミラクル超硬エンドミル(1本) 1108158



了解いたしました。

tr-1107887
tr-1107879_1
メーカー名 三菱マテリアル(株)
ブランド名 三菱K
商品名 三菱K ミラクル超硬エンドミル
型式 VC4MCD1900
オレンジブック 2016年 1 0024ページ
発注コード 1108158

特長
□1本で生材から焼き入れ鋼まで幅広く使用できます。
□ミラクルコーティングの採用により、従来品に比べて大幅な寿命向上を実現します。

用途
□被削材:工具鋼?合金鋼(40HRCまで)、焼き入れ鋼(55HRCまで)、オーステナイトステンレス鋼、耐熱合金。

仕様
□刃径(mm):19.0
□刃長(mm):32
□全長(mm):100
□シャンク径(mm):20
□表面処理:ミラクルコーティング(VC)
□ねじれ角30°
□センターカット:付
□表面処理:ミラクルコーティング(VC)
□ねじれ角30°
□センターカット:付

材質
□極超微粒子超硬(UWC)

原産国 日本

●この商品はメーカー取寄せ品です
●この商品は複数店舗と在庫を共有しています
●不具合ある商品、配送中の破損、商品の瑕疵のみ、商品の返品をお受けしております



だが,なかなか一筋縄ではいかない.確かに速いし便利なことはわかるのだが,なかなかのひねくれものでもあるといった所感でもある. そこで,備忘録を作っておくことにした.随時追加していく予定.

ホイール DIY·工具 MOGU三菱K ミラクル超硬エンドミル(1本) 1108158:イチネンネット“ミラクルエンドミル”(4枚刃)

作成したDataFrameオブジェクトからの要素の抽出について.

import pandas as pdtest = 
"hatenauser", "password"
index = ["user", "pass"]testpd = pd.DataFrame(test, columns = index)print(list(testpd))print(list(testpd["user"]))print(list(testpd.iloc[0,:]))                    
工具,DIY,車,タイヤ,ホイール,ココテラス,cocoterrace,イチネンネット,後払い.com,スポットクーラー,物干しワイヤー,MOGU,Pid4m,sac-1800n,イチネン,タスコ,ミツトモ,,,,三菱K,ミラクル超硬エンドミル(1本),1108158花·ガーデン·DIY,DIY·工具,電動工具本体,研磨工具,ディスクサンダー

出力結果

: ['user', 'pass']: ['hatenauser']: ['hatenauser', 'password']            

“ミラクルエンドミル”(4枚刃)。三菱K ミラクル超硬エンドミル(1本) 1108158
DataFrameオブジェクトへ要素の追加をする方法

test = [["ha", "te", "hl"],["te", "na", "lk"]]testpd = pd.DataFrame(test, columns=["date", "url", "appendix"])testpd              

出力結果

f:id:makutsueeken5:20190214095304j:plain

Uボルト(鋼管用(ウィット ■材質(··) ■規格(1/4X20A) ■入数1100 03466939-001【03466939-001】[4525824111726]
トラスコ中山 TRUSCO 踏台 4段本体 階段片手すり天場三方 TSF4612TE6
【受注生産品】椿本チェイン(RS) [MZ30G-25]「直送」【代引不可·他メーカー同梱不可】 カムクラッチ MZ30G25
【送料無料】【メーカー取寄品(代引き決済時、要問合せ)】サカエ ツーリングワゴン(品番:EKR-31RBRC)『115433』ツーリング
クボタコンバイン用ゴムクローラー SR50 G1-459056SK 450x90x56 1本 送料無料!
[マーテック]マーテック チェーンスリングセット MG2-GBK8-2.8T 2m MG2GBK8 [物流保管用品 吊りクランプ·吊りベルト チェーンスリング マーテック(株)]【TC】【TN】
【代引不可】【個人宅配送不可】河村(カワムラ) 電灯分電盤 NSTC NSTC 2544K[KWD38619]
トラスコ イーグルワゴン 750×500 深型1段引出付 ウレタン ヤンググリーン EGW-973YU-YG
■サンコウ 塗装·ライニングの現場用膜厚計(2極式)〔品番:PRO-2〕[TR-8166678]【個人宅配送不可】
■TAIYO 油圧シリンダ〔品番:160H-12CA80BB50-AB〕[TR-5939429]【個人宅配送不可】
【直送品】 象印 電気トロリ結合式小型電気チェーンブロック αCM-049 揚程6m (490kg 一速型)
【代引不可】【メーカー直送】 TRUSCO トラスコ中山 【物品棚】 ステンレス製メッシュラック H1533XW1824XD457 4段 TSM5644 (2996553)【ラッピング不可】
三菱K ミラクル超硬エンドミル(1本) 1108158
【KTC】ソケット(12角タイプ)B50-80 【/ソケットレンチ】【TC】
【代引不可】【メーカー直送】 TRUSCO トラスコ中山 【物品棚】 ステンレス製メッシュラック H1228XW1205XD305 4段 TSM4434 (2996481)【ラッピング不可】
123 アブソーバ付ライフブロック LB-12a LB-12A
HM29162 プリント基板用コネクタ - CC 2,5/ 7-GFR-5,08P26THRR56 - 1956522 【330入】 【330個入】【ポイント10倍】
【P】【代引不可】【個人宅配送不可】河村(カワムラ) 電灯分電盤 ESR28 ESR28 0530NK[KWD22726]
【ポイント10倍】ANMO社 Dino‐Lite Premier2 S LWD DINOAD7013MTL 【DIY 工具 TRUSCO トラスコ 】【おしゃれ おすすめ】[CB99]
■TAIYO 高性能油圧シリンダ〔品番:70H-81FK50CB500-AB-T〕[TR-8441039]【個人宅配送不可】
ニューCSパールラックワゴン CSPRA-2114RI 幅1200×奥行450×高さ1623mm 直進安定金具標準装備
TRUSCO LEWP型作業台 1800X750XH740 3段キャビネット付 LEWP-1800UDK111 ▼467-0981 トラスコ中山(株) 【代引決済不可】
【ポイント10倍】 キトー トリプルスリング T-HM-HK 7mm リーチ1.5m 《キトーチェンスリング100【標準セット品】(アイタイプ)》
シールW(フッソ 材質(··) 規格(SUSW-3F) 入数(500)
■TAIYO 高性能油圧シリンダ〔品番:70H-81FC100BB300-AB-YL〕[TR-8438621]【個人宅配送不可】
川本 自吸タービンポンプ 2極 50Hz【GS405ME1.5】三相200V 1.5kW GS-M形

addtest = [["ha", "hl"],["na", "lk"]]addtestpd =pd.DataFrame(addtest, columns=["url", "appendix"])testpd = testpd.append(addtestpd, ignore_index=True) # データフレーム の結合 (元の行番号を無視)testpd             
【送料無料】ソフトプロテクター1521YL【代引不可】
送料無料 ゼノア ZENOAH チェーンソー プロソー GZ3950HEZ-R21RSP16 16インチ 21BPX チェンソー ヒーティングハンドル リプレーサブルスプロケットノーズバー 967038522
THEORY レディース ブラウス シャツ トップス ブラック
〔純正品〕 FUJITSU 富士通 現像剤/プリンター用品 〔0875210 F6761E/W〕
中古 Cランク (フレックスSR) ダンロップ XXIO PRIME(2019) 10.5° XXIO SP1000(ドライバー) SR 男性用 右利き ドライバー DR
ESQ エーエスキュー モバード メンズ 07301418 esq Excel tm ブラック PVD クロノグラフ 腕時計
ラック 〔両開きタイプ〕 背面ミラー2枚セット 高さ180 奥行39 ホワイト コレクションラック ワイド〔代引不可〕
三菱 コンパックスTATボラニット CBN TNP-CNGA120412G2 MB8025 10個 ▼680-0734 三菱マテリアル(株) MITSUBISHI
【関西、関東限定】取付サービス品【N-WGN JH1/2 | ムゲン】 N-WGN JH1/2 Styling Set カラード仕上げ プレミアムホワイト·パール NH624P
YKKAP窓サッシ 引き違い窓 フレミングJ[複層ガラス] 2枚建 半外付型[サッシ+網戸+窓枠セット品]:[幅1900mm×高1370mm] 【アルミサッシ】【サッシ窓】【引違い窓】【ペアガラス】
システムキッチン ステンレスキッチン リヴィエール RIVIERE I型 間口1500mm 右シンク(R) 2口ガスコンログリルなし プロパンガス(LP) パールモダングレー ステンレス キッチン リフォーム 【ナスラック】
215/50R17 91V TOYO TIRES トーヨータイヤ NANOENERGY3 PLUS ナノエナジー3 プラス SSR GTV03 SSR GTV03 サマータイヤホイール4本セット
ATS MIZAR BK 17インチ7.0J+48 5H112(PCD112) ベンツ専用/Aクラス(W169), Bクラス(W245/W246), Cクラス(W204/W205), CLAクラス(W117), GLAクラス(X156) 軽量ホイール4本セット
Tポイント15倍純国産 となりのトトロ い草ラグ 『はなび』 約176×230cm請求書·領収書
川島織物セルコン カーテン filo フィーロ レース▼ソフトウェーブ縫製 裾ウェイトテープ付 1.5倍ヒダ 片開き▼ Transparent ユッカルダ FF1202【幅201~266×高さ161~180cm】オフウェイドクラス4 夏エコランクB
【ケイブレイク】 コンプリート DAIHATSU TANTO L350系 【 エアロパーツ | COMPLETE - TANTO L350系 | リアバンパー(メッキモール·ダクトメッシュ付·リフレクター別売り) 】
日本製ウクライナ産グースダウン93% ロイヤルゴールドラベル羽毛掛け布団単品 Bloom ダブル アイボリー 代引不可
[PLZ-ERMP63SEK] 三菱 業務用エアコン 天井カセット4方向 ワイヤードリモコン 2.5馬力 P63 単相200V シングル スリムER 【送料無料】【メーカー直送のため代引不可】
ヘッドライト 2009-2012ダッジラム1500ハローLEDプロジェクターヘッドライト+ ABSメッシュフードグリルブラック 2009-2012 D
Tポイント15倍(まとめ)マルアイ ワンタッチ封筒 PKO-A4 角20 10枚〔×100セット〕請求書·領収書
TAIYO 高性能油圧シリンダ 140H-82FK50CB200-AB-Y
婚約指輪 ダイヤモンド プラチナリング 一粒 大粒 指輪 エンゲージリング 0.23ct プロポーズ用 レディース 人気 ダイヤ 刻印無料 12月 誕生石 ターコイズ セール
【まとめ買い10個セット品】 BR50片面 W90cmタイプ ホワイト オープンタイプ 本体 H150cm 【メーカー直送/代金引換決済不可】
東リ fuful フフル オーダーカーテン&シェード SUN SHADE TKF10517~10519 スタンダード縫製 約1.5倍ヒダ
AIMGAIN フーガ Y50 GT250/350 前期 GENERATION エアロ3点セット

出力結果

f:id:makutsueeken5:20190214095225j:plain

このように, .append メソッドを用いることによって リストを結合するかのようにデータフレームに行を追加することができる.

また, .append メソッドのオプションの引数を ignore_index=True と設定することによって, 元のデータフレームの行番号を無視してリストの結合を行うことができる.

ホイール DIY·工具 MOGU三菱K ミラクル超硬エンドミル(1本) 1108158:イチネンネット“ミラクルエンドミル”(4枚刃)

DataFrameに指定した名前のカラムが存在するのかどうかを確かめる方法.

三菱K ミラクル超硬エンドミル(1本) 1108158 こちらを参考にした. <Python, pandas> カラムがあるか? と カラムの追加の仕方。- ねこゆきのメモ

辞書型リストに指定したラベルが存在するかどうかを確かめるときに使う手法と基本的には同じなのであるが,DataFrameリストにおいては .columns によってメンバ変数を指定して呼び出す必要があるようだ.

if "dldate" in dataframe.columns:print("Exists")else:print("Not Found")            
研磨工具

6sakm9fa3j
l8puwi.maidenliness
fx9u
o78c27igk1.tattoo
uwyykc