月別アーカイブ: 2022年5月

JSONとは?

JSONというものをときどき、いや、しばしば見かけるのですが、これが何者なのかがよくわかりませんでした。

JSONとは

下の記事が、完全な初心者には優しい解説でした。とりあえず拒絶反応が起きないようにする効果があります。

表形式では表現が困難な構造のデータを、人間に対するある程度の可読性を残しつつ、コンピュータに対しても伝達できるような記法、その1つがJSONです。(非エンジニアに贈る「具体例でさらっと学ぶJSON」 2015年05月28日 classmethod.jp

JSONは多くのプログラミング言語で利用可能である。例えば、ActionScript, C, C++, C#, ColdFusion, Common Lisp, Curl, D言語, Delphi, E, Erlang, Groovy, Haskell, Java, JavaScript (ECMAScript), Lisp, Lua, ML, Objective-C, Objective CAML, Perl, PHP, Python, R, Rebol, Ruby, Scala, Squeakなど。(JavaScript Object Notation ウィキペディア)

 

PythonによるJSONの取り扱い

わかりやすい説明。

JSON ファイルを扱うには、まず JSON ファイルからデータを読み込む必要があります。
JSON ファイルを読み込む手順は
(1)JSON ファイルを開く
(2)開いたファイルを JSON として読み込む
の 2 ステップです。具体的には、以下のように記述します。(qiita.com

配列の要素で、ある条件を満たす要素のみを抽出する方法【Python勉強ノート】

『東京大学の データサイエンティスト育成講座』という本の第2章の章末問題に、モンテカルロ法により円周率を求めてみようというものがありました。0から1までの範囲で一様な乱数を2個発生させ(x,y)、原点からの距離が1未満になる個数の割合から、円周率を求めるという原理です。4点(0,0),(1,0),(1,1),(0,1)がつくる正方形の面積は1で、4分の1の円の面積(半径=1)は、円周率x1×1/4 なので、上記の割合が面積の割合になることから、円周率が求まります。

numpy配列の要素のうち、ある条件を満たす要素のみを抽出する方法がわからなくてあれこれ調べてみたら、配列aからの要素の抽出は、

a[条件]

という書式でいけることがわかりました。たとえば、乱数を発生させて0.5未満のみ選びたければ、下のようになります。

x = np.random.uniform(0.0, 1.0, 10)
print(x)
x1=x[x<0.5]
print(x1)

実行結果の出力は、

[0.3476324  0.30311298 0.61869065 0.29137365 0.82916676 0.16149072
 0.02440774 0.36505252 0.2109926  0.72545332]
[0.3476324  0.30311298 0.29137365 0.16149072 0.02440774 0.36505252
 0.2109926 ]

という具合です。(x,y)の原点からの距離は、np.hypot(x,y)で求められます(npはnumpy)。math.hypot(x,y)を使った場合には、エラーになりました。

TypeError: only size-1 arrays can be converted to Python scalars

np.hypot(x,y)だとこのエラーは回避できました。(x、y)の点の描画は、点の形状が「小さな円」なら、’o’、「点」は、’.’(ピリオド)、「ピクセル」は’,’(カンマ))で指定して描けます。これらの知識を使って『東京大学の データサイエンティスト育成講座』第2章の章末問題やってみると、

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

n = 10000
x = np.random.uniform(0.0, 1.0, n)
y = np.random.uniform(0.0, 1.0, n)
d = np.hypot(x,y)
plt.figure(figsize = (5,5))

plt.plot(x[d<1], y[d<1],’,’, color=’red’)
plt.plot(x[d>=1],y[d>=1],’,’,color=’blue’)
print(‘円周率:’,4*sum(d<1)/n)

この方法で計算した円周率は、n = 10000 でも、例えば円周率: 3.1384などとなり、あまり正確ではありませんでした。もっと数を増やさないといけないようです。n = 10000000 にしたら、計算に15秒くらいかかりましたが、円周率: 3.1414896 と正確さが増しました。

pythonで2つのリストの重複する要素の重複を無くしたうえで1つにする方法

pythonで2つのリスト[‘太郎’,’花子’,’ひろし’]と[‘ひろし’,’春子’,’夏子’]とがあったときに、重複する要素の重複を無くしたうえで2つのリストを合わせて1つにするにはどうすればよいでしょうか?listでやる方法はわかりませんが、ListをDictionaryに変換し、さらにDataFrameに変換してやると、drop_duplicates()というメソッドが使えます。

list1 = ['太郎','花子','ひろし']
list2 = ['ひろし','春子','夏子']

dic1 = { '名前' : list1 }
dic2 = { '名前' : list2 }

df1 = pd.DataFrame(dic1)
df2 = pd.DataFrame(dic2)

df3 = pd.concat([df1,df2]).drop_duplicates()

print(df1,'\n\n',df2,'\n\n',df3)

上のコードを実行した結果は、

名前
0 太郎
1 花子
2 ひろし

名前
0 ひろし
1 春子
2 夏子

名前
0 太郎
1 花子
2 ひろし
1 春子
2 夏子

となりました。

ちなみに、重複する部分を除去した残りのリストにするには、パラメータkeep=Falseをこのように指定してやります。

df3 = pd.concat([df1,df2]).drop_duplicates(keep=False)

するとdf3は、

名前
0 太郎
1 花子
1 春子
2 夏子

と、重複する要素を除いたものになります。

pythonでエクセルファイルをpandasのデータフレームとして読み込む方法

pythonでエクセルファイルを処理したいことが頻繁にありますが、pandasのデータフレームとして読み込むと、その後の処理がしやすいです。

pd.read_excel(ファイルのパス)

のようにして読み込むことができます。デフォルトでは一番上の行がカラムの名前と見なすしてしまうため、一番上の行からデータが始まる場合には、header = Noneと指定します。

自分は職場のウインドウズPCと家で使うウインドウズPCとの両方で同じpythonスクリプトが実行できるように、フォルダ(ディレクトリ)の構造を同じにしています。ただ、ユーザーネームが異なるため、それを読み取るようにしています。

import os
import pandas as pd

WindowsUserName = os.getlogin()
folder = 'C:\\Users\\'+WindowsUserName+'\\Desktop\\Python Scripts\\'
file = 'ファイル名.xlsx'

df = pd.read_excel(folder+file, header = None)

といった感じ。もちろん、ファイルのパスは、各自、自分のフォルダの構造に合わせる必要があります。

pythonで文字列が特定の語句から始まるかをチェックする方法

文字列を分析する際に、特定の語句から始まっているかを調べるには、startwith()というメソッドが使えます。

str = "そうだ 京都、行こう!"
print (str.startswith( 'そうだ' ))
print (str.startswith( '京都', 4))
print (str.startswith( '京都', 4, 6 ))
print (str.startswith( '京都', 4, 5 ))

startswith()は、何から始まるかのチェックに使えますが、「始まり」の位置を文字列のどこかを指定して判定することも可能です。4番目から調べたければ、str.startswith( '京都', 4)となります。2個目の数字は、判定をどの文字まででやめるか。5文字目(の手前)でやめてしまうと、京都という2文字が入りきらないので、結果は「偽」となります。

上記のコードの実行結果の出力は、

True
True
True
False

となりました。

pythonで2つのリストのうちひとつのリストにしかない要素を抽出する方法

 

#リスト1にあって、リスト2にはない要素の抽出
list1 = ['太郎', '花子', '二郎', 'まるこ','三郎']
list2 = ['花子','まるこ','しずか']

list_difference = []
for item in list1:
if item not in list2:
list_difference.append(item)

print(list_difference)

上のコードを実行すると、出力は、

['太郎', '二郎', '三郎']

Anaconda 3 (Python 3.7 Version) のインストール

Pythonを使う環境としてAnacondaを利用していたのですが、自分がインストールしたものがAnaconda2で、Pythonのバージョンが2.7だということに気付きました。そこで、Python3も使えるようにするためにAnaconda3をインストールします。Anacondaというのは、「The Most Popular Python Data Science Platform」(もっとも人気の高いPythonでデータサイエンスを行うためのプラットフォーム)(anaconda.com)だそうです。

リナックスでのAnaconda3の起動方法

インストールできたと思ったのですが、アイコンがデスクトップに出てくるわけでもなく、画面端にもなく、どこにもダブルクリックすべきアナコンダ3のアイコンが見当たりません。一体どうやってAnaconda3を起動させればよいのやら。

端末でcondaと入力したら、ごにょごにょ表示されたので、インストールはできているようです。conda -Vと入力したら、バージョンが表示されて、conda 4.8.2 というメッセージになっていました。

 

Anacondaのダウンロード

→ ANACONDAのダウンロードサイト(マック、ウインドウズ、リナックス)

→ ANACONDAのダウンロード(ウインドウズ)(Python3.7 あるいは Python 2.7)

 

AnacondaのウインドウズPCへのインストール

自分の場合はウインドウズPCなので、ダウンロードした実行ファイルAnaconda3-2018.12-Windows-x86_64をクリックしてインストールを実行します。無事完了し、ANACONDA NAVIGATORを立ち上げるとEnvironmentsの画面でbase(root)とanaconda2の2つがリストされていました。Anaconda3をインストールする前はAnaconda2だったのでここにはbase(root)しか表示されていませんでしたが、2と3はこうやって併存できるようです。

 

Anaconda3のリナックスPCへのインストール

リナックスPCを買ったのでAnaconda3をインストールしました。http://www.anaconda.com/products/individualからAnaconda InstallersのセクションのLinuxのPython3.7のところにある522MBのインストーラーをLINUX PCにダウンロードしました。ダウンロードフォルダ内にAnaconda3-2020.02-Linux-x86_64.shというファイルがダウンロードできたのはいいのですが、これをダブルクリックしても、テキストファイルとして開かれるだけで何もインストールが始まりません。ウインドウズならインストーラーファイルをダブルクリックするだけで全てが勝手に進行してくれるというのに。

【初心者向け】.shファイルをLinuxで実行する方法(https://linuxfan.info/post-1486)

というウェブ記事を見つけました。インストールはターミナルウインドウから行うのがリナックスの常識みたいです。リナックスのデスクトップの画面で左上にあるアイコンをクリックして検索窓にtermと入れたら、端末のアイコンが現れましたのでそれをダブルクリックしたら、端末(ターミナル)のアプリケーションが起動しました。ここに見よう見まねで

sudo bash Anaconda3-2020.02-Linux-x86_64.sh

と入力してリターンキーを押したのですが、何度やっても何かしらミスタイプが生じて、なかなかうまくいきませんでした。ようやく、動いて、あとは聞かれるままにyesと入力していったら、

Thank you for installing Anaconda3!

というメッセージが出たので、あっさりとインストールが完了したようです。

 

JupyterノートブックでPythonプログラミング

JupyterLabというのをLaunchすると、ウェブブラウザ上に「ノートブック」が現れて、そこでPythonのコードを書いたり実行したりできます。Jupyter Notebookでも同じみたいで、自分には違いがわかりません。とりあえずこれでPython2.7 でも、Python3.7でも勉強できる環境が整いました。

 

Pythonでワードプレスブログに自動投稿する方法

いちいちワードプレスのブログにアクセスしてユーザーネームとキーワードを入力して、記事を書いて投稿しなくても、プログラム的に記事を投稿できないかと思ったら、Pythonを使って投稿する方法がいくつか紹介されていたので試してみました。

警告・免責事項

以下のやり方を試したら、自分の場合、ワードプレスのコントロールパネルに入れなくなりました。どうしても解決方法が見つからず、テストサイトだったのでワードプレスのインストールからやり直しました。バックアップを取っておいてからやらないと、あとでトラブルったときに致命的です。長年育ててきたサイトでやるのは、大変危険です。

この記事の内容に関しては、自己責任で参考になさってください。自分のための忘備録として残しておきます。

 

Python2.7でワードプレスに記事をテスト投稿

Python Code for adding posts to WordPress remotely gistfile1.py (github.com)

上のリンク先のコードはPython2.7を使っています。Anaconda(Python2.7)のJupyterノートブックにコードをコピペして、URLなどは自分のものに変えて、実行してみました。すると、ImportError: No module named wordpress_xmlrpcというエラーに。wordpress_xmlrpcという名前のモジュールがないためのエラーでした。AnacondaではどうやってPythonのモジュールをインストールすればよいのかよくわかりませんでしたが、Anaconda Promptのコマンドウインドウで、

>pip install wordpress_xmlrpc としてみましたが、
Could not find a version that satisfies the requirement wordpress_xmlrpc (from versions: )
No matching distribution found for wordpress_xmlrpc
と返されてしまいました。またPIPのバージョンが古いよというメッセージも出てきて、
You are using pip version 10.0.1, however version 18.1 is available.
You should consider upgrading via the ‘python -m pip install –upgrade pip’ command.
新しくしなさいというので、指示に従ってそのコマンドを打ったら、PIPのバージョンは無事アップグレードしてくれました。ネットでいろいろ調べて、https://go-journey.club/archives/6977を参考にして
pip install python-wordpress-xmlrpc
としてみたら、無事モジュールがインストールできました。で上のgistfile1.pyというコードは実行できて、サイトによっては投稿がうまくいきました。ただし、別のサイトでは
ExpatError: no element found: line 1, column 0
というエラーになってうまくいきませんでした。これは未解決。

【Python】【WordPress】XML-RPC で Python プログラムで WordPress に自動投稿する(go-journey.club)

上のサイトにもサンプルコードがあったので走らせてみました。Pythonのバージョンは2.7です。これもサイトによってはうまくいきませんでしたが、うまくいったサイトもありました。原因不明ですが。

上の2つのサンプルコードはPython2.7でしたが、Python3のサンプルコードもありました。

 

Python3.7でワードプレスに記事をテスト投稿

Pythonでwordpressに自動で投稿する(python-wordpress-xmlrpc) (2018年8月15日 バラ十字の道 awesome-rainbow-colors.com)

ANACONDA PROMPTの画面で

pip install python-wordpress-xmlrpc

として必要なモジュールをインストールしました。

Successfully installed python-wordpress-xmlrpc-2.3 というメッセージが出て無事インストール。これで上のサンプルコードも動きました。

記事投稿を普段手作業で行っている自分にしてみれば、それがプログラムから実行できてしまうというのは凄いことだと思います。これで記事内容まで自動生成できれば、自分の手間が省けてよいのですが。

 

参考(ワードプレス自動投稿のPythonサンプルコード)

  1. Python Code for adding posts to WordPress remotely gistfile1.py (github.com)(Python2)
  2. 【Python】【WordPress】XML-RPC で Python プログラムで WordPress に自動投稿する(go-journey.club)(Python2)
  3. Pythonでwordpressに自動で投稿する(python-wordpress-xmlrpc) (2018年8月15日 バラ十字の道 awesome-rainbow-colors.com)(Python3)

 

 

データサイエンス、機械学習、深層学習をPythonで学ぶための入門書

データ処理と可視化をPythonで行いたい場合に、どんな入門書があるのでしょうか?また、ディープラーニングに興味がある場合に、どんな本から入ればよいのでしょうか?良さげに思える本を主観で選んで紹介します。洋書はPDFがネット上にあるので、中身を確認できます。

Pythonデータサイエンスハンドブック

著者は、Jake VanderPlas氏で、原書のタイトルは、Python Data Science Handbookで副題が、Essential Tools for Working with Dataです。邦訳タイトル『Pythonデータサイエンスハンドブック』。副題として、「Jupyter, NumPy,pandas, Matplotlib, scikit-learnを使ったデータ分析、機械学習」とあります。VanderPlasさんは、ワシントン大学で博士号取得を取得し、ワシントン大学にて天文学の研究および研究者に対するコンサルティングを行っているそうです(参考:本書の著者紹介欄)。目次は、第一章がIPython, 第二章NumPy、第3章pandas、第4章Matplotlib、第5章機械学習というトピックで構成されています。本書は「Python3対応」として書かれていますが、Python2への配慮もなされています。本書は、Pythonの入門書でもなく、プログラミングの入門書でもなく、データサイエンスの入門書でもないようです。前書きによれば、Pythonに入門したい人は、A Whirlwind Tour of the Python Languageを読んでくださいと言っています。Pythonで用意されているさまざまなライブラリ(NumPy, pandas, Matplotlib, scikit-learn)をどのように使って機械学習を実現させるかの解説書です。しかし、Pythonや機械学習に関してそれほど詳しくない段階であっても、行う習うより慣れよでPythonで機械学習を行えるようになるのには、良い本かと思います。執筆の動機がそもそも、ネット上に散在するさまざまなチュートリアルをかき集めて勉強しなくても、これ一冊で全部網羅してますというものを作りたかったそうなので、実際、機械学習のトピックを見ても典型的な手法が一通りカバーされています。第五章の章立てを紹介すると、ハイパーパラメータとモデルの検証、特徴量エンジニアリング、ナイーブベイズ分類、線形回帰、サポートベクターマシン、決定木とランダムフォレスト、主成分分析、多様体学習、k平均法クラスタリング、ガウス混合モデル、カーネル密度推定、HOG特徴量と顔検出などの解説が並んでいます。

紙質が良く、印刷はカラーなので、可視化された結果が興味深いグラフとして表示されているのを眺めているだけでも楽しくて、勉強意欲が掻き立てられます。

 

Pythonによるデータ分析入門 第2版

Wes McKinney著『Pythonによるデータ分析入門 第2版―NumPy、pandasを使ったデータ処理』。原書タイトルは、Python for Data Analysis, 2nd Edition。初版がPython2.7対応で書かれていたのに対し、この第2版はPython3.6対応で書かれています。原書のPDF版がインターネット上で入手できるようなので、紙の本を買うか決めるために、内容の確認ができます。

 

ゼロから作るDeep Learning

斎藤康毅(さいとうこうき)著『ゼロから作るDeep Learning』。副題が、「Pythonで学ぶディープラーニングの理論と実装」。この本は今更紹介する必要がないのではないかと思えるくらいに、書店でも山積みされておりベストセラーになっていると思います。ディープラーニングのフレームワーク(Caffe, TensorFlow, Chainerなど)は使わず、GPUも使わず、画像認識を題材にしてディープラーニング(深層学習)をゼロから学ぼうというコンセプトです。ディープラーニングの理論と、Pythonによる実装を同時に学びたいという人のための本。深層学習というブラックボックスの中身を理解したい人向けです。Pythonが初めてで、ニューラルネットワークも初めてという人であってもついてこれるように非常に親切に書かれた、稀有な本ではないかと思います。

 

scikit-learnとTensorFlowによる実践機械学習

Aurélien Géron著『scikit-learnとTensorFlowによる実践機械学習』。原書は、Hands-On Machine Learning with Scikit-Learn & TensorFlow —- CONCEPTS, TOOLS, AND TECHNIQUES TO BUILD INTELLIGENT SYSTEMS by Aurélien Géron。パートIが機械学習の話題で、パートIIがニューラルネットワークと深層学習に当てられています。

 

参考(データサイエンス、Pythonの本)

勉強の便宜を計るためには紙の本を手元に置いておきたいものですが、内容がわからないと買うべきかどうかが決められません。原書でよければPDFがネット上にありますので内容を確認する上で参考になります。

  1. Python Data Science Handbook by Jake VanderPlas (PDF at allitebooks.com)
  2. Python for Data Analysis, 2nd Edition by Wes McKinney (PDF at allitebooks.com)
  3. Introduction to Machine Learning with Python by Andreas C. Mueller and Sarah Guido (PDF at allitebooks.com)
  4. Think Python — HOW TO THINK LIKE A COMPUTER SCIENTIST by Allen B. Downey (PDF at allitebooks.com)
  5. Fluent Python by Luciano Ramalho (PDF at allitebooks.com)
  6. Learn Python 3 the Hard Way by Zed A. Shaw (allitebooks.com)

 

参考(データサイエンス、データサイエンティスト)

  1. データサイエンティストが生き残るために必要なのは「本質を見抜く力」|小川卓氏x尾崎隆氏対談 レバテックキャリアスペシャルインタビュー levtech.jp

Anaconda3へのSeleniumのインストール

Seleniumとは

人間の手でウェブサイトにアクセスする代わりに、Pythonのプログラムによってウェブサイトにアクセスすると、必要な情報を自動的に取得することも可能になるので、便利です。Pytyonプログラム内からウェブブラウザーを開いて、ウェブサイトを閲覧するための便利なモジュールとしてSeleniumというものがあります。すでに自分のPCにはAnaconda3がインストールされていますが、

Seleniumのインストール

Seleniumをまだ入れていなかったので入れることにしました。Anaconda Navigatorのコントロールパネルで、Environmentsを選び、プルダウンメニューでAllかNot installedを指定して、検索窓にSeleniumと入れてやると、Seleniumが表示されました。そのままApplyボタンを押してイントール。この操作でうまくSeleniumuがインストールできたPCもありましたが、別の機会に別のPCで同じことをやろうとしたときに、Multiple errors encounteredというエラーが出てしまい、うまくいきませんでした。そこで、base(rood)という文字の横の三角形(矢頭)をクリックするとOpen terminalが選ぶのでそれを選んで、ターミナルウインドウを起動します。そして、ウェブ記事https://anaconda.org/conda-forge/seleniumを参考に、

conda install -c conda-forge selenium

としてやると、セレニウムのモジュールがちゃんとアナコンダにインストールされました。めでたし、めでたし。

 

ウェブブラウザに合ったドライバーの必要性

Seleniumuを使うときはブラウザと連動させる必要がありますが、自分の場合グーグルクロームを普段使うブラウザにしていますので、https://chromedriver.chromium.org/downloads のウェブサイトで現在使っているブラウザのバージョンに合わせたドライバーをダウンロードしてきました(バージョンが違うとドライバーは動きませんでした)。また、拾ってきたchromedriverは、正しいPathに置く必要があります。実行したいjupyterノートブックのファイルがあるフォルダにおいてやると、うまく動きました。

 

Seleniumの実行

環境が整ったところでJupyterのノートブックで例えば下のサンプルコードを実行すると、ウェブブラウザが新たに立ち上がり、入力しておいたURLのウェブページが自動的に開きます。

from selenium import webdriver
browser = webdriver.Chrome()
browser.get(‘http://scienceandtechnology.jp/archives/33913’)