Python入門 =================================== .. s6:: styles h1: (fontSize:'100%', textAlign:'center',margin:'30% autogenerated') .. image:: python-logo.png 本日のテーマ ---------------------- - とにかくPythonを触ってみよう。 - あまり細かいことは気にせずに このドキュメントについて ---------------------- * Python製ドキュメント作成ツール *sphinx* で作成しました。 .. figure:: sphinx.png .. s6:: styles 'div/img' : {width: 60%, height:60%,opacity:0,9}, 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の設計思想をまとめたもの。公式な解釈はありません。 - 醜いより美しいほうがいい。 - 暗示するより明示するほうがいい。 - 難解であるよりは平易であるほうがいい。 - 複雑であるよりは難解であるほうがいい。 - ネストよりフラットなほうがいい。 - 密集しているよりは隙間があるほうがいい。 - 読みやすいことは善である。 - 特殊であることはルールを破る理由にならない。 - しかし、実用性を求めると自然さが失われることがある。 - エラーは隠すな、無視するな - ただし、わざと隠されているのなら見逃せ。 - 曖昧なものに出逢ったら、その意味を適当に推測してはいけない。 - たったひとつの冴えたやりかたがあるはずだ。 - そのやり方は一目見ただけではわかりにくいかもしれない。オランダ人にだけわかりやすいかもしれない。 - ずっとやらないでいるよりは、今やれ。 - でも、今"すぐ"にやるよりはやらないほうがマシなことが多い。 - コードの内容を説明するのが難しいのなら、それは悪い実装である。 - コードの内容を容易に説明できるのなら、おそらくそれはよい実装である。 - 名前空間は優れたアイデアであるため、積極的に利用すべきである。 .. s6:: styles 'ul/li': {fontSize:'50%'} Pythonの基本 ---------------------- * インタプリタ型の言語 * ブロック構造はインデントで表現 * コメントは **#** * 対話型実行ができる まずは動かしてみる ---------------------- プリントしてみる .. code-block:: python print( 'Hello Python') 計算してみる .. code-block:: python print(1+3) 変数 ---------------------- 変数を使用する時は、型は意識する必要はありません。 Pythonは変数の型を宣言しない、「動的型付け言語」です。 .. code-block:: python num1 = 10 num2 = 20 num3 = num1 + num2 print( num3 ) インデント ---------------------- - ブロック構造はインデントで表す - インデントしないとエラーとなる - 可読性を重視している 分岐処理 ---------------------- if文で分岐が処理が実現できます。 .. code-block:: python num1 = 10 if num1 % 2 == 0: print( '偶数です') else: print( '奇数です') Pythonはswitch文はありません 繰り返し処理 ---------------------- for文で分岐が処理が実現できます。 .. code-block:: python for num in range(30): if num % 2 == 0: print (num) 複数値を扱うデータ型 ---------------------- Pythonでは複数のデータを扱うのに - リスト - タプル - 辞書 - Set があります。 リスト ---------------------- 配列と同じようなもの .. code-block:: python array = [100,200,300] for data in array: print( array ) タプル ---------------------- タプルとは不変配列のこと。 .. code-block:: python tupple = (100,'abc',300) for data in tupple: print( array ) リストは変更を考慮するため、生成コストが大きいので、実行効率が タプルより劣る。基本的にタプルで事が足りる場合は、タプルを利用 した方が効率の良いプログラムになると言えます。 辞書 ---------------------- キーと値を保持するオブジェクト。Java的に言うとMapです。 .. code-block:: python a = { 'yamada': 10, 'ito' :30 ,'sato' : 50 } print(a['yamada']) モジュール ---------------------- :: 便利なライブラリなどが纏められたファイルこのと 取り込むには、import 命令が必要です。 一番基本的な、数値計算を提供している mathライブラリを使ってみましょう。 2次方程式を解く ---------------------- 2字方程式を解いてみます。 .. image:: ex1.png .. code-block:: python 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次方程式を解いてみます。 .. code-block:: python 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次方程式も直ちに解くことができます。 .. image:: ex22.png .. image:: ex3.png NumPy ---------------------- Pythonで最も有名な数値計算ライブラリ - 高速な配列の操作 - 多次元配列での行列演算 テスト結果を集計する Part1 ---------------------- テストの結果を集計してみましょう。 テストの点数をNumpyを使って、平均や最高点、最低点、標準偏差を計算してみます。 .. code-block:: python 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と呼ばれるパッケージを利用します。 .. code-block:: python 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) 実行結果 .. image:: histfigure_1.png 潮位データをグラフ化する ---------------------- 気象庁が発表している、潮位の変動データをグラフ化してみます。 気象庁のオリジナルデータは扱いが難しいので、JSONデータに加工したもの利用します。 .. code-block:: python 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() 実行結果 .. image:: tide1.png .. 気象庁の予測データは1時間毎のデータなので、 グラフ化すると少し角張った感じになります。 これを滑らから曲線にするには、数学的には 補間と呼ばれる計算をするとこで、曲線の数式が 得られます。 コンピュータグラフィックスでも良く利用されている、 スプライン補間を使い、 滑らかな曲線にしてみます。 pythonでは補間を行う機能はscipyに含まれています。 簡単です。 .. code-block:: python 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() 実行結果 .. image:: tide2.png 人口統計を分析する ---------------------- つい最近発表された日本の人口を分析してみましょう。 国勢調査のデータをグラフ化してみます。 人口の推移は、国政調査の結果から、CSVファイルとして用意します。 .. code-block:: python 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 .. code-block:: python 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') 実行結果 .. image:: popfigure_1.png 人口の減少を予測する 2 ---------------------- 2つのデータ間での関係を分析する手法、回帰分析という 手法で人口の減少を予測してみます。今回は回帰分析の中でも 単純な、線形回帰分析手法を使ってみます。 pythonには、統計計算を行うライブラリsimpyが用意されている ので回帰分析も容易に行うことができます。 popview2.py .. code-block:: python 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') 実行結果 .. image:: popfigure_2.png 株価を表示する ---------------------- 日経平均のグラフを描画してみましょう。 データ分析pandasパッケージを使えば、インターネット上に ある株価のデータを自動的に取得してくれる機能があります。 pandasはYahoo Finaceから株価のデータを取得します。 stock.py .. code-block:: python 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() 実行結果 .. image:: stock1.png Pythonに興味を持った方 ---------------------- http://booklog.jp/users/mikankun?category_id=2757539&display=front Pythonの今後 ---------------------- - AI,機械学習分野で利用が広がる - IoTによるデータ種集 Pythonエンジニアとなるには ---------------------- - 数学・統計学の知識 - データベースの知識 - ネットワークなどインフラ知識