Non-engineer memoblog

エンジニアではない人間のメモブログ(備忘録とアウトプット欲のために)

Pythonデータサイエンス入門以前のメモ(その1)

こちらの学習コンテンツを眺めながら自分用のメモを記していくことに。
www.udemy.com

Numpy入門以前

# 2行4列のリストの場合は、(2, 4)の感じでタプルを返す 
np.shpae() 

# こんな感じ「 dtype('int64') 」で格納されているデータの「データ型」を返す(Numpyは全て同じ型でなければならない)。
np.dtype() 

# array([0., 0., 0., 0., 0.,])
np.zeros(5)  

# 引数にタプルを渡すと、5行5列の1の2次元配列ができる
np.ones((5,5))  

#空っぽの3行4列の2次元配列を作れる。
np.empty((3, 4)) 

#Numpyのアライを返す。array([0, 1, 2, 3, 4])

np.arange(5) 

# Python2だと割り算が割れないので最初に記述する。
from __future__ import division 

'''
arrというアレイから、
 - slice_arr = arr
 - slice_arr[:] = 99 

をすると、もとの「arr」にも99が入ってしまいます。

その場合、
 - slice_arr = arr.copy() 
 - 引数なしで.copy()

をすれば、大元の「arr」の値は上書きされない。
'''

# arr[0, 1, 2, 3, 4, 5, 6, 7, 8] の配列を .reshape((3, 3)) とすると、3行3列の2次元配列にリシェイプされる。
np.reshape() 

# arr.Tとすると行と列を入れ替えできる。TはTranspose。arr.transpose()でも同じ結果。転置のティーと覚える。

# 平方根(√)を計算する。2なら「1.4142」、3なら「1.732050」
np.sqrt() 

# アレイA, アレイBのアレイ要素同士の足し算ができる
np.add(A, B) 

# アレイA, アレイBのそれぞれ大きい方の要素を返す(ごっちゃになる選抜)
np.maximum(A, B) 


# このように書くことでnotebook上にそのまま描画できるらしい
import matplotlib.pyplot as pyplot
%matplotlib inline

Numpyアレイ続き

A = np.array([1, 2, 3, 4])
B = np.array([1000, 2000, 3000, 4000])
condition = np.array([True, True, False, False])
anser = [(a if cond else b) for a,b,cond in zip(A,B,conditon)]
anser2 = np.where(condition, A, B)

#  [1, 2, 3000, 4000] をリストの形で返す。(ただしコレだと多次元アレイに対応できないらしい)。
「anser」 

# array([   1,   2, 3000, 4000]) をNumpyアレイの形で返す。(「np.where」は1次元のアレイだが多次元にも対応なのでコレの方が良い)。
「anser2」 

# アレイを足し算する(引数なしだと、全部の要素の合計)。
arr.sum() 

# 0を引数にとると、行方向に「列」の合計値を返す。
arr.sum(0)

# アレイの平均値
arr.mean() 

# アレイの標準偏差
arr.std()

# 分散値
arr.var()

# アレイの要素がソートされる(デフォルトでは小さい値順になる)。
np.any()
np.all()
np.sort()


# 「np.unique()」で重複しているものを省いたアレイを返す。
gorillas = np.array(['kiyo', 'syaba', 'anii', 'nene', 'kiyo' 'haoko', 'syaba'])
np.unique(gorillas)
 
# array(['kiyo', 'syaba', 'anii', 'nene', 'haoko'])
np.in1d() 

'''
1つ目の引数にとったアレイが、2つ目の引数に入っているかを個別に判定(bool値を返す)
'''

### Numpyアレイの保存

'''
arr = np.arange(5) で array([0, 1, 2, 3, 4]) の1次元アレイを作り、その後に、np.save('my_array', arr)とすることで、「.npy」の拡張子でNumpyアレイをファイルとして保存することができる。

np.load('my_array.npy')とすると保存したNumpyアレイを返すことができる。
'''

# ジップ形式でアレイを保存することが可能(拡張子は「.npz」)
np.savez('ziparrays.npz', x=arr1, y=arr2)

'''
「ziparrays.npz」というファイル名で、さらにXとして「arr1」をジップ保存、yとして「arr2」をジップ保存している。
zipArr = np.load('ziparrays.npz') とすれば読み込みできる。

さらに、zipArr['x'] とすることで、さきほど「x=arr1」としたarr1のアレイを返すことができる。
'''

# テキストでアレイを保存
arr = np.array([[1,2,3,4],[5,6,7,8]])

# 第3引数の「delimiter」で区切り文字を指定
np.savetxt('my_test_text.txt', arr, delimiter=',') 

# MacとLinuxなら「!」をつけるとコマンドが使える。
!cat my_test_text.txt  

# 以下のようにすることで読み込みする。
np.loadtxt('my_test_text', delimiter=',') 


'''
Pandasのシリーズについて
np.arrayとpd.Seriesの違いは、インデックスに番号(連番)が付いていること。ちなみに、pd.Series.valuesでシリーズのデータだけを取り出せて、中身は、Numpyのアレイが返ってくる。
'''

ww2_cas = Series([8700000,4300000,3000000,2100000,400000],
     index=['USSR','Germany','China','Japan','USA'])

# ww2_cas には以下が格納されている。
    USSR       8700000
    Germany    4300000
    China      3000000
    Japan      2100000
    USA         400000
    dtype: int64

# indexを数字から文字列に変更すれば、文字列のindex指定でアクセスできる。

# 400000が返ってくる
ww2_cas['USA']

# 以下のように4000000以上の数字のものを抽出もできる。
ww2_cas[ww2_cas>4000000] とすると以下が返ってくる。
    USSR       8700000
    Germany    4300000
    dtype: int64

### Pythonの辞書型に変換もできる。
# ww2_dict = ww2_cas.to_dict() とすると、ww2_dict には以下が格納されている。
        {'China': 3000000,
         'Germany': 4300000,
         'Japan': 2100000,
         'USA': 400000,
         'USSR': 8700000}

# 上記の辞書をもとに、PandasのSeriesを作ることができる。

# WW2_Series = Series(ww2_dict) とすると、

    # WW2_Seriesには以下が格納されている。
        China      3000000
        Germany    4300000
        Japan      2100000
        USA         400000
        USSR       8700000
        dtype: int64

## indexを追加することができる(Argentinaを追加)。

countries = ['China','Germany','Japan','USA','USSR','Argentina']
obj2 = Series(ww2_dict,index=countries)

    # obj2には以下が格納されている。
        China        3000000
        Germany      4300000
        Japan        2100000
        USA           400000
        USSR         8700000
        Argentina        NaN # アルゼンチンは死者数を入れていないため。
        dtype: float64

# ちなみにnullデータがあるかどうかを確認可能。 pd.isnull(obj2) とすると、nullがあればTrueが返ってくる。

### Pd.Seriesには、名前を付けらる。

obj2.name = '第二次世界大戦の死傷者'

    # obj2には以下が格納されている。
        China        3000000
        Germany      4300000
        Japan        2100000
        USA           400000
        USSR         8700000
        Argentina        NaN
        Name: 第二次世界大戦の死傷者, dtype: float64

# indexに名前を付けることも可能
obj2.index.name = 'Countries'

    # obj2には以下が格納されている。
        Countries
        China        3000000
        Germany      4300000
        Japan        2100000
        USA           400000
        USSR         8700000
        Argentina        NaN
        Name: 第二次世界大戦の死傷者, dtype: float64