python学んだことまとめ

この記事は約10分で読めます。

東〇大学の講義を授業するので、Pythonで忘れていた部分、新しく学習した分を記載する記事を作成した。

関数系

zip関数

異なるリストを同時に取り出す処理

for one, two in zip([1, 2, 3], [11, 12, 13]):
    print(one, 'と', two)

無名関数(ラムダ)

(lambda a, b: a * b)(3, 10)
(lambda 入力:処理)(引数)のように記載する

map関数

list(map(calc_double, [1, 2, 3, 4]))
リストなどに関数を実行する時に使う。
map(関数,リストなど)
list(map(lambda x : x * 2, [1, 2, 3, 4]))

filter関数

リストなどの要素のうち、trueとなるものだけ返す
list(filter(lambda x: abs(x) > 5, [-1, 3, -5, 7, -9]))

numpy

配列操作

data = np.array([9, 2, 3, 4, 10, 6, 7, 8, 1, 5])

データ型はint,uint(符号無し整数),float,boolで設定。data.dtype で型の確認可能

data.sort() :昇順、data[::-1].sort():降順

最大 はdata.min() 、最小データ data.max()、積み上げはdata.cumsum() と計算できる

乱数

import numpy.random as random

正規分布(平均0、分散1)の乱数を10個発生
rnd_data = random.randn(10)

データ列からランダム抽出 random.choiceをつかう
引数は(配列,取り出す数,オプション→重複を許すか)
random.choice(data, 10) 重複あり(復元抽出と呼ばれる)
print(random.choice(data, 10, replace = False)) 重複なし(非復元抽出)

行列

np.arangeで連続した数を作成
np.arange(9)
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

配列を行列に分解
array1 = np.arange(9).reshape(3,3)
[[0 1 2]
[3 4 5]
[6 7 8]]

行列のみ取得方法
[行範囲:列範囲]で表示。それぞれは開始場所,終了場所で指定
1行目取得 array1[0,:]
array([0, 1, 2])
一列目取得 array1[:,0]
array([0, 3, 6])

行列の積:np.dot(行列,行列)
行列の要素の掛け合わせ: 行列1 * 行列2

要素が0,1の行列作成
np.zeros(,)とnp.ones(,)を使う

インデックス参照

コピーを使おう

一部分をスライスし、値を変更すると、もとの行列へ影響を与えてしまう。コピーでは無く参照を行っているから

sample_array_copy = np.copy(sample_array)
コピーを利用すると参照もコピーになるので、もとデータが変更されない

ブールインデックス参照

sample_names = np.array([‘a’,’b’,’c’,’d’,’a’])
print(sample_names == ‘a’)
array([ True, False, False, False, True])

つまり配列を条件に当てはまるか、True,Falseにする

print(data)
[ 1.764 0.4 0.979 2.241 1.868]
[-0.977 0.95 -0.151 -0.103 0.411]
[ 0.144 1.454 0.761 0.122 0.444]
[ 0.334 1.494 -0.205 0.313 -0.854]
[-2.553 0.654 0.864 -0.742 2.27 ]]

data[sample_names == ‘a’] とすると、
array([[ 1.764, 0.4 , 0.979, 2.241, 1.868],
[-2.553, 0.654, 0.864, -0.742, 2.27 ]])
このように取得される。

条件制御
numpy.where(条件の配列, Xのデータ, Yのデータ)
条件の配列がTrueのときはXのデータ、そうでなければYのデータが取り出される。

重複の削除
np.unique(np.array([True,True,False,False,True]))
print(np.unique(cond_data))
[False True]

ユニバーサル関数
全ての要素に関数を適用する機能
np.sqrt(行列),np.exp(行列)など

真偽値判定
行列.any() 一つでもTrueがあれがTrue
行列.all() 全てTrueならTrue
行列>5.sum() 5より多い行列要素の個数

対角成分 : np.diag(行列名)
対角成分の和 : np.trace(行列名)

# 行方向に結合。パラメータのaxisに0を指定
np.concatenate([sample_array3,sample_array4],axis=0)
array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])


# 列方向に結合
np.concatenate([sample_array3,sample_array4],axis=1)
array([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])

配列の分割

# sample_array_vstackを3つに分割し、first、seocnd、thirdという3つの変数に代入
a,bとすると、x1<a,a<=x2<b,b<=x3
first,second,third=np.split(sample_array_vstack,[1,3])

pandas

seriesの使い方

pd.Series(配列,キー名の配列←なければ0からの配列になる)
.valueで値を、.indexでキーを取り出せる

sample_pandas_index_data = pd.Series( [0, 10,20,30,40,50,60,70,80,90], index=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’])

print(‘データの値:’, sample_pandas_index_data.values)
print(‘インデックスの値:’, sample_pandas_index_data.index)
データの値: [ 0 10 20 30 40 50 60 70 80 90]
インデックスの値: Index([‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’], dtype=’object’)

DataFrameの使い方

DataFrameは二次元配列

attri_data1 = {'ID':['100','101','102','103','104'],
               'City':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
               'Birth_year':[1990,1989,1992,1997,1982],
               'Name':['Hiroshi','Akiko','Yuki','Satoru','Steve']}

attri_data_frame1 = DataFrame(attri_data1)
ここからの話は全てデータフレームの話だよ

転置は、データ.T
列の抽出は、データ.列名
複数列の抽出はデータ.[列名1,列名2]

データの抽出方法
attri_data_frame1[attri_data_frame1[‘City’] == ‘Tokyo’]
つまり条件がTrueの要素のみを返している

複数のデータの抽出方法
attri_data_frame1[attri_data_frame1[‘City’].isin([‘Tokyo’,’Osaka’])]

列や行の削除
attri_data_frame1.drop([‘Birth_year’], axis = 1)
axis=0が行」「axis=1が列」

データの結合
pd.merge(attri_data_frame1,attri_data_frame2)

グループ集計
attri_data_frame2.groupby(‘Sex’)[‘Math’].mean()
性別のグループ分け→グループ内の属性Mathの平均を求める

インデクスの宣言
普段インデックスは0,1,2…となるが、自由に宣言することができる
attri_data_frame_index2 = DataFrame(attri_data2,index=[‘e’,’b’,’a’,’d’,’c’])

ソートについて

インデックスのソート
attri_data_frame_index2.sort_index()

値によるソート
attri_data_frame_index2.Birth_year.sort_values()
データ.列名.sort_values()
降順にするには sort_values(ascending=False)とする。

欠損値 np.nan
欠損値ならtrue attri_data_frame_index2.isnull()

データ結合の方法

遥か彼方に学びましたね。
内部結合(INNER JOIN)→これは両方にキーがある時に結合する
全結合(FULL JOIN)→どちらかにキーがある時結合する
左外部結合(LEFT JOIN)→左側にあるデータキーがある時結合する

内部結合
pd.merge(df1, df2, on = ‘id’)

全結合
pd.merge(df1, df2, how = ‘outer’)
全部結合するからキーを指定しない。ないものはNaNになる

左外部結合
pd.merge(df1, df2, how = ‘left’)

縦結合
concat_data = pd.concat([df1,df3])

データ操作と変換

ピボット操作
行を列に、列を行にする操作
モデリングの前処理に使うよ!←あまり理解できていない

重複判定
判定方法 TRUE FALSEで返す
dupli_data.duplicated()
重複した要素の削除
dupli_data.drop_duplicates()

マッピング処理

共通のキーとなるデータに対し、一方(参照)テーブルからキーに対応するデータを引っ張ってくる関数

例 東京→関東,大阪→関西,京都→関西

# もし対応するデータがなかったら、NaNになる。

df1[‘region’] = df1[‘city’].map(city_map)
df1[新しい属性] = df1[元のデータ].map(変更法方法)
リージョンを追加する。cityをcity_map(市と地域で紐づけ)

df1[‘up_two_num’] = df1[‘birth_year’].map(lambda x: str(x)[0:3])
こんな感じで、labda関数を入れることも出来る

びん分割

離散的な範囲のデータに分割したい時に使う。5年ごとなど
分割粒度を定義
pd.cut(分割するデータ,分割する境界値)
birth_year_cut_data = pd.cut(df1.birth_year, birth_year_bins)
pd.value_counts(birth_year_cut_data)

分割数を指定可能
時間を等分に分ける
pd.cut(df1.birth_year, 2)

同じボリュームで分ける
pd.value_counts(pd.qcut(df1.birth_year, 2))

groupbyメッソッドにはイテレータと呼ぶ反復的に値を取り出す機能がある

Matplotlib

x = np.linspace(-10, 10,100)
x = np.arange(-10, 10)

ヒストグラム
plt.hist(対象データ,ビンの数,範囲)

plt.figure(figsize = (20, 6))
plt.hist(np.random.randn(10 ** 5) * 10 + 50, bins = 60, range = (20, 80))
plt.grid(True)

棒グラフ
plt.bar(x, y, align=’center’, width = 0.5)
棒グラフのラベル設定
plt.xticks(x, [‘A Class’, ‘B Class’, ‘C Class’])
x,yのラベルを設定
plt.xlabel(‘Class’), plt.ylabel(‘Score’)

コメント

タイトルとURLをコピーしました