Python入門

_images/python-logo.png

本日のテーマ

  • とにかくPythonを触ってみよう。
  • あまり細かいことは気にせずに

このドキュメントについて

  • Python製ドキュメント作成ツール sphinx で作成しました。
_images/sphinx.png

Pythonの誕生

1991年にオランダのグイド・ヴァン・ロッサム氏によって
開発されたプログラム言語です。
名前の由来は、イギリスのテレビ局BBCが制作した、
コメディ番組「空飛ぶモンティ・パイソン」です。

海外での人気は高く、日本では最近注目されるようになりました。

Pythonの特徴

  • インタプリタ型の言語
  • ライブラリが非常に豊富
  • 教育用プログラミング言語にも最適
  • 文法がシンプル
  • Raspbery Piにも採用されている

Pythonの用途

  • 科学技術計算
  • データ分析
  • 機械学習(AI)
  • 画像処理
  • Webシステム
  • GUIプログラミング

など多様な用途でPythonが利用されています。

Pythonのバージョン

バージョン2系と、3系がありますが、Javaのように後方互換はありません。
つい最近までは、つい買いたいライブラリが3系に対応していない場合は、
2系を選択するなどしていました。今現在は、ほとんどの主要なライブラリが
3系に対応しています。

今から始めるなら、3系を選択してください。

Python環境構築

Windows
Pythonはインストールされていません。新たにインストールが必要です。
MacOS
Pythonプリインストールされています。
Linux
CentOS,Ubuntuなど主要ディストリビューションにはPythonはプリインストールされています。
異なるバージョンを混在させたい場合や、
ライブラリ管理などは実は面倒な事が色々とあります。
最近では、「 Anaconda 」と呼ばれる
Pythonディストリビューションをインストール
することで、色々と面倒なとを解決してくれます。

Python開発のツール

  • テキストエディタ
  • Eclipse
  • PyCharm (有料)
  • Spyder

など多種あります。今回はSpyderを使用します。

Pythonの禅( パート1)

「Pythonの禅」とは、Pythonの設計思想をまとめたもの。公式な解釈はありません。

  • 醜いより美しいほうがいい。
  • 暗示するより明示するほうがいい。
  • 難解であるよりは平易であるほうがいい。
  • 複雑であるよりは難解であるほうがいい。
  • ネストよりフラットなほうがいい。
  • 密集しているよりは隙間があるほうがいい。
  • 読みやすいことは善である。
  • 特殊であることはルールを破る理由にならない。
  • しかし、実用性を求めると自然さが失われることがある。
  • エラーは隠すな、無視するな
  • ただし、わざと隠されているのなら見逃せ。
  • 曖昧なものに出逢ったら、その意味を適当に推測してはいけない。
  • たったひとつの冴えたやりかたがあるはずだ。
  • そのやり方は一目見ただけではわかりにくいかもしれない。オランダ人にだけわかりやすいかもしれない。
  • ずっとやらないでいるよりは、今やれ。
  • でも、今”すぐ”にやるよりはやらないほうがマシなことが多い。
  • コードの内容を説明するのが難しいのなら、それは悪い実装である。
  • コードの内容を容易に説明できるのなら、おそらくそれはよい実装である。
  • 名前空間は優れたアイデアであるため、積極的に利用すべきである。

Pythonの基本

  • インタプリタ型の言語
  • ブロック構造はインデントで表現
  • コメントは #
  • 対話型実行ができる

まずは動かしてみる

プリントしてみる

print( 'Hello Python')

計算してみる

print(1+3)

変数

変数を使用する時は、型は意識する必要はありません。

Pythonは変数の型を宣言しない、「動的型付け言語」です。

num1 = 10
num2 = 20
num3 = num1 + num2
print( num3 )

インデント

  • ブロック構造はインデントで表す
  • インデントしないとエラーとなる
  • 可読性を重視している

分岐処理

if文で分岐が処理が実現できます。

num1 = 10
if num1 % 2 == 0:
        print( '偶数です')
else:
        print( '奇数です')

Pythonはswitch文はありません

繰り返し処理

for文で分岐が処理が実現できます。

for num in range(30):
        if num % 2 == 0:
                print (num)

複数値を扱うデータ型

Pythonでは複数のデータを扱うのに

  • リスト
  • タプル
  • 辞書
  • Set

があります。

リスト

配列と同じようなもの

array = [100,200,300]
for data in array:
        print( array )

タプル

タプルとは不変配列のこと。

tupple = (100,'abc',300)
for data in tupple:
        print( array )

リストは変更を考慮するため、生成コストが大きいので、実行効率が タプルより劣る。基本的にタプルで事が足りる場合は、タプルを利用 した方が効率の良いプログラムになると言えます。

辞書

キーと値を保持するオブジェクト。Java的に言うとMapです。

a = { 'yamada': 10, 'ito' :30 ,'sato' : 50 }
print(a['yamada'])

モジュール

便利なライブラリなどが纏められたファイルこのと
取り込むには、import 命令が必要です。

一番基本的な、数値計算を提供している
mathライブラリを使ってみましょう。

2次方程式を解く

2字方程式を解いてみます。

_images/ex1.png
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次方程式も直ちに解くことができます。

_images/ex22.png _images/ex3.png

NumPy

Pythonで最も有名な数値計算ライブラリ

  • 高速な配列の操作
  • 多次元配列での行列演算

テスト結果を集計する 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)

実行結果

_images/histfigure_1.png

潮位データをグラフ化する

気象庁が発表している、潮位の変動データをグラフ化してみます。 気象庁のオリジナルデータは扱いが難しいので、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()

実行結果

_images/tide1.png

気象庁の予測データは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()

実行結果

_images/tide2.png

人口統計を分析する

つい最近発表された日本の人口を分析してみましょう。 国勢調査のデータをグラフ化してみます。

人口の推移は、国政調査の結果から、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')

実行結果

_images/popfigure_1.png

人口の減少を予測する 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')

実行結果

_images/popfigure_2.png

株価を表示する

日経平均のグラフを描画してみましょう。 データ分析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()

実行結果

_images/stock1.png

Pythonの今後

  • AI,機械学習分野で利用が広がる
  • IoTによるデータ種集

Pythonエンジニアとなるには

  • 数学・統計学の知識
  • データベースの知識
  • ネットワークなどインフラ知識