Python入門¶
本日のテーマ¶
- とにかくPythonを触ってみよう。
- あまり細かいことは気にせずに
Pythonの誕生¶
1991年にオランダのグイド・ヴァン・ロッサム氏によって
開発されたプログラム言語です。
名前の由来は、イギリスのテレビ局BBCが制作した、
コメディ番組「空飛ぶモンティ・パイソン」です。
海外での人気は高く、日本では最近注目されるようになりました。
Pythonの特徴¶
- インタプリタ型の言語
- ライブラリが非常に豊富
- 教育用プログラミング言語にも最適
- 文法がシンプル
- Raspbery Piにも採用されている
Pythonのバージョン¶
バージョン2系と、3系がありますが、Javaのように後方互換はありません。
つい最近までは、つい買いたいライブラリが3系に対応していない場合は、
2系を選択するなどしていました。今現在は、ほとんどの主要なライブラリが
3系に対応しています。
今から始めるなら、3系を選択してください。
Python環境構築¶
- Windows
- Pythonはインストールされていません。新たにインストールが必要です。
- MacOS
- Pythonプリインストールされています。
- Linux
- CentOS,Ubuntuなど主要ディストリビューションにはPythonはプリインストールされています。
異なるバージョンを混在させたい場合や、
ライブラリ管理などは実は面倒な事が色々とあります。
最近では、「 Anaconda 」と呼ばれる
Pythonディストリビューションをインストール
することで、色々と面倒なとを解決してくれます。
Pythonの禅( パート1)¶
「Pythonの禅」とは、Pythonの設計思想をまとめたもの。公式な解釈はありません。
- 醜いより美しいほうがいい。
- 暗示するより明示するほうがいい。
- 難解であるよりは平易であるほうがいい。
- 複雑であるよりは難解であるほうがいい。
- ネストよりフラットなほうがいい。
- 密集しているよりは隙間があるほうがいい。
- 読みやすいことは善である。
- 特殊であることはルールを破る理由にならない。
- しかし、実用性を求めると自然さが失われることがある。
- エラーは隠すな、無視するな
- ただし、わざと隠されているのなら見逃せ。
- 曖昧なものに出逢ったら、その意味を適当に推測してはいけない。
- たったひとつの冴えたやりかたがあるはずだ。
- そのやり方は一目見ただけではわかりにくいかもしれない。オランダ人にだけわかりやすいかもしれない。
- ずっとやらないでいるよりは、今やれ。
- でも、今”すぐ”にやるよりはやらないほうがマシなことが多い。
- コードの内容を説明するのが難しいのなら、それは悪い実装である。
- コードの内容を容易に説明できるのなら、おそらくそれはよい実装である。
- 名前空間は優れたアイデアであるため、積極的に利用すべきである。
Pythonの基本¶
- インタプリタ型の言語
- ブロック構造はインデントで表現
- コメントは #
- 対話型実行ができる
変数¶
変数を使用する時は、型は意識する必要はありません。
Pythonは変数の型を宣言しない、「動的型付け言語」です。
num1 = 10
num2 = 20
num3 = num1 + num2
print( num3 )
インデント¶
- ブロック構造はインデントで表す
- インデントしないとエラーとなる
- 可読性を重視している
分岐処理¶
if文で分岐が処理が実現できます。
num1 = 10
if num1 % 2 == 0:
print( '偶数です')
else:
print( '奇数です')
Pythonはswitch文はありません
タプル¶
タプルとは不変配列のこと。
tupple = (100,'abc',300)
for data in tupple:
print( array )
リストは変更を考慮するため、生成コストが大きいので、実行効率が タプルより劣る。基本的にタプルで事が足りる場合は、タプルを利用 した方が効率の良いプログラムになると言えます。
モジュール¶
便利なライブラリなどが纏められたファイルこのと
取り込むには、import 命令が必要です。
一番基本的な、数値計算を提供している
mathライブラリを使ってみましょう。
2次方程式を解く¶
2字方程式を解いてみます。
import math
a = 1.0
b = 3.0
c = 2.0
x1 = (-b + math.sqrt(b**2 - 4*a*c)) / (2*a)
x2 = (-b - math.sqrt(b**2 - 4*a*c)) / (2*a)
print("x = {}, {}".format(x1, x2))
数式を表現できるSympy¶
数式自体を表現できるパッケージSympyを使って 2次方程式を解いてみます。
from sympy import *
init_printing(use_latex=True)
x=Symbol('x')
x**2+3*x+2
solve(x**2+3*x+2)
連立1次方程式を解く¶
Symyを使えば連立1次方程式も直ちに解くことができます。
テスト結果を集計する Part1¶
テストの結果を集計してみましょう。 テストの点数をNumpyを使って、平均や最高点、最低点、標準偏差を計算してみます。
import numpy as np
x = np.array([44,10,30,23,23,35,35,40,41,42,50,51,52,55,60,61,62,63,64,65,70,70,65,80,34,65,76,85,92])
print('受験者数={}'.format(np.count_nonzero(x)))
print('最高点={}'.format(np.max(x)))
print('最低点={}'.format(np.min(x)))
print('平均点={}'.format(np.average(x)))
print('標準偏差={}'.format(np.std(x)))
テスト結果を集計する Part2¶
テストの結果を可視化してみます。グラフ化するためのパッケージは matplotlibと呼ばれるパッケージを利用します。
import numpy as np
import matplotlib.pyplot as plt
x = np.array([44,10,30,23,23,35,35,40,41,42,50,51,52,55,60,61,62,63,64,65,70,70,65,80,34,65,76,85,92])
print('受験者数={}'.format(np.count_nonzero(x)))
print('最高点={}'.format(np.max(x)))
print('最低点={}'.format(np.min(x)))
print('平均点={}'.format(np.average(x)))
print('標準偏差={}'.format(np.std(x)))
plt.hist(x,bins=10)
実行結果
潮位データをグラフ化する¶
気象庁が発表している、潮位の変動データをグラフ化してみます。 気象庁のオリジナルデータは扱いが難しいので、JSONデータに加工したもの利用します。
import numpy as np
import matplotlib.pyplot as plt
import urllib.request
import json
url = 'http://153.126.137.238/tide/yokohama/pred/20161103'
f = urllib.request.urlopen(url)
jsonData = json.loads(f.read().decode('utf-8'))
print (jsonData)
x = np.arange(24)
y = []
for data in jsonData['data']:
y.append(data['level'])
plt.xlim(25)
plt.ylim(200)
plt.grid()
plt.plot(x,y,color="w",marker="o")
plt.plot(y)
plt.show()
実行結果
気象庁の予測データは1時間毎のデータなので、 グラフ化すると少し角張った感じになります。 これを滑らから曲線にするには、数学的には 補間と呼ばれる計算をするとこで、曲線の数式が 得られます。
コンピュータグラフィックスでも良く利用されている、 スプライン補間を使い、 滑らかな曲線にしてみます。
pythonでは補間を行う機能はscipyに含まれています。 簡単です。
import numpy as np
import matplotlib.pyplot as plt
import urllib.request
import json
from scipy.interpolate import interp1d
url = 'http://153.126.137.238/tide/yokohama/pred/20161103'
f = urllib.request.urlopen(url)
jsonData = json.loads(f.read().decode('utf-8'))
print (jsonData)
x = np.arange(24)
y = []
for data in jsonData['data']:
y.append(data['level'])
f = interp1d(x, y, kind='cubic') # 3次スプライン補間
xnew = np.linspace(1, 23, num=51)
plt.xlim(25)
plt.ylim(200)
plt.grid()
plt.plot(x,y,color="w",marker="o")
plt.plot(xnew, f(xnew), '-')
plt.show()
実行結果
人口統計を分析する¶
つい最近発表された日本の人口を分析してみましょう。 国勢調査のデータをグラフ化してみます。
人口の推移は、国政調査の結果から、CSVファイルとして用意します。
17,127768
18,127901
19,128033
20,128084
21,128032
22,128057
23,127799
24,127515
25,127298
26,127083
27,127110
28,126930
popview.py
import numpy as np
import matplotlib.pyplot as plt
data = np.genfromtxt('/home/student/python/pop.csv',delimiter=',',dtype={'names':('year','population'),'formats':('f','f')})
print(data)
plt.grid()
plt.plot(data['year'],data['population'],'ro')
実行結果
人口の減少を予測する 2¶
2つのデータ間での関係を分析する手法、回帰分析という 手法で人口の減少を予測してみます。今回は回帰分析の中でも 単純な、線形回帰分析手法を使ってみます。
pythonには、統計計算を行うライブラリsimpyが用意されている ので回帰分析も容易に行うことができます。
popview2.py
import numpy as np
import matplotlib.pyplot as plt
data = np.genfromtxt('/home/student/python/pop.csv',delimiter=',',dtype={'names':('year','population'),'formats':('f','f')})
print(data)
import scipy.stats as stats
slope,intercept,r_value,p_value,std_err = stats.linregress(data['year'],data['population'])
print(slope,intercept)
x = np.arange(20,40,1)
plt.grid()
plt.plot(x, slope * x + intercept)
plt.plot(data['year'],data['population'],'ro')
実行結果
株価を表示する¶
日経平均のグラフを描画してみましょう。 データ分析pandasパッケージを使えば、インターネット上に ある株価のデータを自動的に取得してくれる機能があります。 pandasはYahoo Finaceから株価のデータを取得します。
stock.py
import pandas.io.data as web
import matplotlib.pyplot as plt
import datetime
# 取得する日の範囲を指定する
start = datetime.datetime(2016, 1, 1)
end = datetime.datetime(2016, 10, 31)
# Yahoo ファイナンスから、 ^N225 (日経平均株価指数) を
# とってくる。
f = web.DataReader('^N225', 'yahoo', start, end)
plt.title('日経平均')
# fill_between でその日の最高値と最低値をプロットする
plt.fill_between(f.index, f['Low'], f['High'], color="b", alpha=0.2)
f['Open'].plot()
print( f[:10] )
plt.show()
実行結果
Pythonの今後¶
- AI,機械学習分野で利用が広がる
- IoTによるデータ種集
Pythonエンジニアとなるには¶
- 数学・統計学の知識
- データベースの知識
- ネットワークなどインフラ知識