L
o
a
d
i
n
g
.
.
.

ホーム

お知らせ

製品・ソリューション

サービス

導入事例・パートナー

EXEM Academy・ブログ

会社情報

採用情報

2023.04.10

Time Series 機械学習のためのPython必須ライブラリ、Pandas 2編

2.2  Time Series 機械学習のためのPython必須ライブラリ、Pandas 2編 

2.2.3 要素選択、索引付け

2.2.3.1 series索引付け
索引付けは、 [位置]または[‘索引名‘]で索引付けできます

In [7]:

2.2.3.2    Dataframe索引付け

1つの列を取得する方法は、データフレームでは2つあります。 代表的には dataframe 変数名 [‘列名’] (このとき 1 つの列を持ってきた結果は series 形), または, dataframe 変数名. 列名である。
Dataframeの場合、スライスするときの現在の方法では、最も基本的なインデックスに関するスライスだけが可能です。 行列の列に関する情報は、コロンを介したスライスにはインポートできません。

In [11]:

df = pd.DataFrame([[14,'남'],[17,'여'],[24,'남'],[20,'여'],[15,'남'],[21,'여']],
                  index = ['a','b','c','d','e','f'],
                  columns = [「年齢」、「性別」])

In [12]:

df

Out [13]:

    나이	성별
a	14	남
b	17	여
c	24	남
d	20	여
e	15	남
f	21	여

In [14]:

df[1:]

Out [15]:

	나이	성별	성인
b	17	여	False
c	24	남	True
d	20	여	False
e	15	남	False
f	21	여	True

2.2.4  データ索引付け、スライシング loc, iloc, at, iat

Dataframeを使うようになったときに最もよく使われる関数だ。 データの前処理をしたり、インデックス付けやスライシングに常に使用されるからだ。.

2.2.4.1 loc

Index名でrowの情報を抽出するときに使用される。

そのため、df.loc[‘a’]と言ったとき、dfのindexで‘a’という名前のデータを探して情報を抽出する。 さらにDataframe型で抽出したい場合はdf.loc[:, [‘col_name’]]とすればよい。

2.2.4.2 iloc

インデックス番号で行の情報を抽出するときに使用されます。

loc、ilocの違いを見てみましょう。

In [16]:

df

Out [17]:

   年齢 性別 大人
a	14	남	False
b	17	여	False
c	24	남	True
d	20	여	False
e	15	남	False
f	21	여	True

In [18]:

df['年齢']

Out [19]:

a    14
b    17
c    24
d    20
e    15
f    21
Name: 나이, dtype: int64

In [20]:

df.loc['a']

Out [21]:

年齢       14
性別       M 
大人    False
Name: a, dtype: object

In [22]:

df.iloc[0]

Out [23]:

年齢       14
性別       M
大人    False
Name: a, dtype: object

2.2.4.3  ファースト索引付け(at, iat)

処理速度は at と iat の場合が loc, iloc よりはるかに速いのは、理由は 1 つの要素値を選択するようになっているからだ。

大容量データを処理するときは、ファストインデックスを使用することをお勧めします。 at、iatの違いは、上記のようにインデックス名にしたり、インデックスを直接入れる形で同じである。

In [24]:

df.at['a','나이']

Out [25]:

14

In [26]:

df.iat[0,0]

Out [27]:

14

長所と短所があるので、状況に合わせて試してみることをお勧めします.

データ検索関数

2.2.5 算術演算

 Pandasの場合、算術演算は内部的に3段階のプロセスを経ます。

1.行/列インデックスに基づいてすべての要素をソートします。

2. 同じ位置にある元素同士で一対一で対応させる。

3. 一対一対応となる元素同士の演算を処理する。 このとき元素がなければNaNで処理することになる。

dataframeで見たときはcolumns間の演算は series演算である。

series間の演算は同じインデックスを持つ元素同士演算して新しい seriesを返す。 また、四則演算演算子も可能です。 (-、*、/、%)

In [20]:

df = pd.DataFrame(np.arange(12).reshape(3,4), columns = ['a','b','c', 'd'])

In [28]:

df

Out [29]:

a	b	c	d
0	0	1	2	3
1	4	5	6	7
2	8	9	10	11

In [30]:

df['b'] + df['c']

Out [31]:

0     3
1    11
2    19
dtype: int32

2.2.5.1  Series 数値演算

Series と数値演算は series の個々の要素にそれぞれ演算して新しい series を返します。

In [32]:

df['d'] + 10

Out [33]:

0    13
1    17
2    21
Name: d, dtype: int32

2.2.5.2 欠測値(NaN)

Series 間の計算を行う際に一つのインデックスでもない場合、NaNが出力される。

In [32]:

df_2 = (pd.DataFrame(np.arange(9).reshape(3,3), columns = ['a','b','c']))

In [32]:

df + df_2

Out [33]:

          a	  b  	c	  d
0	0	2	4	NaN
1	7	9	11	NaN
2	14	16	18	NaN

2.5.5.3 演算メソッド

四則演算を直接してくれることもあり、軟関数も別に提供して可能である。 そしてNaNになる場合は、 fill_value オプションで値を置き換えることができる.

In [34]:

df.add(df_2, fill_value =0)

Out [35]:

        a       b        c      d
0	0	2	4	3.0
1	7	9	11	7.0
2	14	16	18	11.0

In [36]:

df.sub(df_2['a'], axis='index')

Out [37]:

	a	b	c	d
0	0	1	2	3
1	1	2	3	4
2	2	3	4	5

その他のメソッド算術演算に関連する関数

df.add(num), Dataframeに スカラー値を加算する
df.sub(num) Dataframeにスカラー値を減算する
df.mul(num), Dataframeにスカラー値を掛ける
df.div(num) Dataframeにスカラー値を分割する
df.pow(num) Dataframeエスカラー値 n乗

.

2.2.6関数マッピング

Numpyなど、個々の要素を特定の関数に1対1に対応できます。 (ufunc)そのため、自分で作成した関数やlambdaを適用できるので、for文や基本関数で処理するよりもはるかに効率的です。

apply() – > series個々の要素に関数を適用するときに使用され、データフレームでも可能です。

In [38]:

def add_10(n):
    return n + 10

In [39]:

df

Out [40]:

        a       b       c       d
0	0	1	2	3
1	4	5	6	7
2	8	9	10	11

In [41]:

df.apply(add_10)

Out [42]:

	a	b	c	d
0	10	11	12	13
1	14	15	16	17
2	18	19	20	21

マッピング関数も series か dataframe かによって可能かどうかが異なる。 場合を考えずに関数を作って使うとすれば apply が一番無難だ。

マッピング関数

2.2.7 照合

ソートは、必要なデータ値を取得したい場合は必ず必要です。 このとき、ソートは大きくcolumn、rowの2つの型をインデックスに基づいてソートすることができる。

2.2.7.1 Sort_index()

最も基本的なRowのインデックスに基づいてソートする方法だ。

 

In [43]:

df = pd.DataFrame([[11,21],[14,24],[12,22],[13,23],[10,20],[15,25]], index=[1,4,2,6,3,0], columns=['b','a'])

In [44]:

df

Out [45]:

	b	a
1	11	21
4	14	24
2	12	22
6	13	23
3	10	20
0	15	25

In [46]:

df.sort_index(ascending=False)

Out [47]:

	b	a
6	13	23
4	14	24
3	10	20
2	12	22
1	11	21
0	15	25

列に基づいて並べ替える

同様に、axisで軸を変更することでcolumns間でも整列が可能です。   

In [48]:

df.sort_index(axis=1)

Out [49]:

	a	b
1	21	11
4	24	14
2	22	12
6	23	13
3	20	10
0	25	15

値に基づいてソートする

Byオプションでソートすることができます。 つまり、基準となる列インデックスを入力しなければならず、2つを入力するようになれば、前にcolumn基準でソートをするようになり、次に来るcolumnをソートすることになる。

In [50]:

df.sort_values(by=['a','b'])

Out [51]:

	b	a
3	10	20
1	11	21
2	12	22
6	13	23
4	14	24
0	15	25

2.2.8 重複インデックスの確認と処理

普段扱うデータの場合、複数のファイルを一度に取り込んで合わせると、インデックスが重なる場合がある。 このような場合、索引付けをする際に重複するインデックスがあると、結果が変わる可能性があるため、重複処理をするのが良いと考えられる。 is_uniqueで簡単にインデックスの重複確認が可能です。

In [52]:

series = pd.Series(range(10), index=['a','b','c','c','d','e','e','f','g','i'])

In [53]:

series

Out [54]:

a    0
b    1
c    2
c    3
d    4
e    5
e    6
f    7
g    8
i    9
dtype: int64

In [55]:

series.index.is_unique

Out [56]:

False

唯一の値になっている場合

In [57]:

series_2 = pd.Series(range(3), index=['a','b','c'])

In [58]:

series_2.index.is_unique

Out [59]:

True

Dataframeの場合もindexとcolumnsを選択するときも同様.

In [60]:

df = pd.DataFrame(np.arange(36).reshape(6,6), index=[1,2,2,3,3,4], columns=['a','a','b','b','c','c'])

In [61]:

df

Out [62]:

	a	a	b	b	c	c
1	0	1	2	3	4	5
2	6	7	8	9	10	11
2	12	13	14	15	16	17
3	18	19	20	21	22	23
3	24	25	26	27	28	29
4	30	31	32	33	34	35

In [63]:

df['b']

Out [64]:

	b	b
1	2	3
2	8	9
2	14	15
3	20	21
3	26	27
4	32	33

In [65]:

df.loc[3,'b']

Out [66]:

	b	b
3	20	21
3	26	27

一次元 series に含まれた情報を抽出する unique() という関数も存在する。 そして、もし順序と唯一の値が必要なく、頻度数を確認したいなら、 value_counts() を使って確認が可能だ。

In [67]:

series = pd.Series(['a','b','c','c','d','e','e','f','g','i'])

In [68]:

series.unique()

Out [69]:

array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'i'], dtype=object)

In [70]:

series.value_counts()

Out [71]:

c    2
e    2
b    1
i    1
g    1
d    1
f    1
a    1
dtype: int64

追加のメソッド

df.isin([num..]) Seriesのそれぞれの要素が存在するか boolean に返す
df[‘col_name’].Unique() seriesで重複する値を削除し、唯一の値のみを含む配列を返す
df.[‘col_name’].Value_counts() sereisで唯一の値のインデックス付けと数を数える.


2.2.9 技術統計の計算と要約

それぞれの結果を見るための関数はいくつかありますが、全体的に見ることができる関数 df.describe() を活用してみましょう。

In [72]:

df = pd.DataFrame(np.arange(36).reshape(6,6), index=[1,2,3,4,5,6], columns=['a','b','c','d','e','f'])

In [73]:

df.describe()

Out [74]:

	a		b		c		d		e		f
count	6.000000	6.000000	6.000000	6.000000	6.000000	6.000000
mean	15.000000	16.000000	17.000000	18.000000	19.000000	20.000000
std	11.224972	11.224972	11.224972	11.224972	11.224972	11.224972
min	0.000000	1.000000	2.000000	3.000000	4.000000	5.000000
25%	7.500000	8.500000	9.500000	10.500000	11.500000	12.500000
50%	15.000000	16.000000	17.000000	18.000000	19.000000	20.000000
75%	22.500000	23.500000	24.500000	25.500000	26.500000	27.500000
max	30.000000	31.000000	32.000000	33.000000	34.000000	35.000000

統計関連メソッド

df.count() 行/列のNan以外の値の数を返す
df.min(), df.max() 行/列の最大最小値を返す
df.argmin(), df.argmax() 行/列の最大最小値のインデックスを返す
df.idxmin(), df.idxmax() 行/列の最大最小値を持つインデックスの値を返す
df.sum() 和戻り
df.mean() 平均戻り
df.median() 中間値(50%分位)を返す
df.mad() 平均値から平均絶対偏差を計算する
df.prod() すべての値の積
df.std() 標準偏差の値の計算
df.var() サンプル分散の値の計算
df.cumsum() 累積を計算
df.summin(), df.cummax() 累積最小値、最小値を計算する
df.cumprod() 累積積計算

今回のページでは、 dataframe をもう少し詳しく扱う方法を調べた。 次のページでは、データのロードと保存、欠損値処理、データフレーム処理のヒントなどを調べてみましょう。


PHP Code Snippets Powered By : XYZScripts.com