---
# System prepended metadata

title: Python実習

---

R環境構築
https://hackmd.io/bagaoBc9SGyPaxdJnSI79A?view
Python環境構築
https://hackmd.io/@KashiwaScienceCamp2020Kiryulab/python
スパコン演習
https://hackmd.io/@KashiwaScienceCamp2020Kiryulab/HGC


# Python実習
Pythonというプログラミング言語をインストールします。機械学習などでよく使われている言語です。
今回の実習では、Anacondaというデータサイエンス向けに作られたPythonのプラットフォームを使って実習を行います。Anacondaでは科学技術計算に必要なライブラリなどがまとめられているので、簡単に環境構築を行うことができます。

## Anacondaのインストール
[Anacondaの公式サイト](https://www.anaconda.com/distribution/)より**Python2.7**のWindows版のインストーラをダウンロードし、実行してください。
なお、今回の実習では解析の都合上、Python2を使用しますが、現在は多くのライブラリがPython3でも利用できるようになっています。またPython2は2020年の1月でサポートが終了しているので、自分でPythonを使ってみたい場合はPython3を利用することを強くお勧めします。
また、Python2とPython3の間で互換性は保証されていないので、注意が必要です。
インストールが終わったら、Windowsのメニューより、AnacondaフォルダのAnaconda Powershell Promptを開いてください。

## 環境構築
今回必要なパッケージはnumpy, matplotlib, networkxです。Anacondaの場合、これらのパッケージは既に含まれているのですが、networkxのバージョンが解析で使うものより新しくなっています。
今回はcondaで解析用の仮想環境を作ります。
Anaconda Powershell Promptで、
```
conda create -n PointCloudAnalysis python=2.7 matplotlib numpy
conda activate pointCloudAnalysis
conda install -c trentonoliphant networkx
```
と実行してください。
最初の行を実効すると仮想環境が構築されます。2番目のコマンドでその仮想環境に入っています。3行目で必要なバージョンのnetworkxを[ここ](https://anaconda.org/trentonoliphant/networkx)からインストールします。
環境構築が終わったら、`conda list networkx`と実行して、networkxのバージョンを確認してください。1.9.1になっているはずです。

## Python演習
公式の[チュートリアル](https://docs.python.org/ja/2.7/tutorial/index.html)が提供されています。今回はその中でもよく使うもののみを説明します。
Anaconda Powershell Promptで`python`と入力してください。Python2.7がインタラクティブモードで立ち上がります。インタラクティブモードでは実行したコードの結果がすぐに表示され、確認することができます。
### 出力
pythonで出力をするには`print`を使います
次のコードを試してみてください。
```
print "Hello, python2!"
```
"Hello, python2!"と表示されたと思います。なお、python3の場合は
```
print("Hello, python3!")
```
となります。

### コメントアウト
pythonでコメントアウトするには`#`を使います。自分が書いたコードについてメモを書きたいときなどに使います。
#から始まる行がコメントとして無視されます。行の途中から#を書いた場合は行のそれ以降がコメントとして無視されます。
```
# コメントとして無視されます
print("hello, world!") #コメントとして無視されます 
```


### 文字列
先ほど出力したときのように、文字列はダブルクオート(`"`)やシングルクオート（`'`）で囲んで表す必要があります。Pythonではシングルクオートでもダブルクオートでも同じように使えます。
文字列同士は`+`を使って連結できます。下の二つの行は同じ出力をします。
```
print "hello,"+"python!"
print "hello,python!"
```
### 四則演算
`+`,`-`,`/`,`*`を使って計算をします。
```
3+4
7-3
6/3
3*2
```
`%`を使うと、割り算のあまりが計算できます。
```
4%3
```
`**`は累乗を表します。
```
3**3
```

### 変数
データに名前をつけて、変数として扱うことができます。
```
x = 10
y = 2
x * y  #20
```
変数として扱えるのは数値だけではなく、様々なものを変数として扱えます。

### データ構造
Pythonではリスト、辞書型、タプル、セットなどのデータ構造が使えます。リスト、辞書について説明します。
#### リスト
リストは複数の値を保持することができるデータ構造です。Pythonのリストは異なる型のデータでも格納することができます。リストは`[]`で表現します。
```
l = [1,2,3]　#リストの作成
```
リストの要素へのアクセスは、インデックス（リストの何番目の要素か）を用いて、次のようにして行うことができます。
```
print l[0]
print l[1]
print l[2]
```
インデックスは0から始まるので注意してください。

#### 辞書型
辞書はキー(key)と値(value)の値の集合です。キーを用いて値にアクセスすることができます。重複するキーを保つことはできません。

```
dict={1:"one",2:"two",3:"three"}
dict[1] # one
```
要素の追加は次のようにして行えます。
```
dict[4]="four"
```

### 関数
操作をまとめて、関数を定義することができます。関数の定義は`def`を用いて次のように行います。
```
def test_func():
    print "test"
```
この関数を呼び出してみましょう。
```
test_func()
```
`test`と出力されるはずです。

Pythonではインデントが非常に重要です。インデントによってブロックを表します。
インデントはスペースキー4個がPEP8で推奨されています。(https://pep8-ja.readthedocs.io/ja/latest/)
この例では、関数の内部（この例では`print "test"`）の前にインデントが必要です。

インデントを間違えると全く異なる動作をします。`func1`と`func2`を次のように定義します。
```
def func1():
    print 1
print 2

def func2():
    print 1
    print 2
```
このとき、`func1`で出力されるのは1だけです。それに対し、`func2`では1と2が出力されます。
インタラクティブモードだと`func1`のようなインデントをしようとするとエラーが出ますが、ファイルにコードを書き込んでそれを実行する場合だとエラーが出ない場合があるので注意が必要です。
また、関数は引数をとることもできます。複数の引数を持たせることもできます。
```
def test(x):
    print x
def plus(x,y):
    print x+y
```
### if
`if`を用いると操作を分岐させることができます。
```
x=1
if x==1:
    print "1です"
else:
    print "1ではありません"
```
`else`節内部のコードはそれまでの条件式が全て一致しなかったときに呼び出されます。また、`elif`節を使って、さらに細かい分岐を作ることもできます。
```
x=1
if x==1:
    print "1です"
elif x==2:
    print "1です"
else:
    print "1、2ではありません"
```

### for
for文を使って、繰り返しを行うことができます。
1から10まで出力するコードは次のようになります。
```
for i in range(10):
    print i+1
```
range(10)は0から9までのリストを返すので、i+1として1から10まで出力するようにしています。

### 外部ライブラリの使用
numpy, matplotlib, networkxなどは外部ライブラリと呼ばれ、標準ではインポートされません。使用するには個別にインポートする必要があります。
```
import matplotlib.pyplot as plt
```
と実行してみましょう
`matplotlib`はプロットによく使われているライブラリです。試しに
```
plt.plot([1,2,3],[3,1,2])
plt.show()
```
と実行してみてください。プロットが表示されるはずです。matplotlibには様々な種類のプロットが用意されているので、興味があったら調べてみてください。


## 応用（時間が余ったら)
### 応用1
長さn(n>=3)のフィボナッチ数列を出力する関数を作ってみてください。
ヒント（必ずしもこのような形で書く必要はありません）
```
def fib(n):
    n1=1
    print n1
    n2=1
    print n2
    for i in range(n-2):
        [処理]
```
### 応用2
https://github.com/hmatsu1226/SCODE
これのdata1はscRNA-seqのデータから、転写因子100個のみを選択したものです。Pseudotimeの推定手法を考えて、実装してみてください。Monocleというpseudotime推定ソフトウェアによる値がtime_test.txtおよびtime_train.txtに書いてあります。この値と自分で考えた手法の結果を比較してみましょう。
このデータはSCODEという手法の提案論文で使われたもので、手法のバリデーションのためテストデータとトレーニングデータに分けてあります。一つにまとめたものをGitHubにおいておくので、こちらを使っても構いません。
https://github.com/kubotam-m/scicenceCamp2020