Pythonメモ

# 個人的Pythonメモ
Pythonの基本的な操作を学んでいく中で個人的に気になった、あるいはつまづいたところをメモしておきます。

## Dataframe操作(pandas)
* 1つのカラムだけを指定し、取り出したい場合は```data['hoge']```と記述しました。
* 複数のカラムを指定し取り出したい場合は、```data[['hoge','huga',...]]```のように、二重角括弧になるので注意

* **```pandas```を使ったデータ読み込み**
    * ```pd.read_csv('データ名.csv', encoding='cp932', index_col='列名', usecols=['column1','column2',...])```
    * 特定の列をインデックスとして読み込むためには、引数```index_col```に列名または列の位置番号を指定します。
    * 引数```usecols```に列名のリストを指定することで列名を絞って読み込むことができます

* データの表示
    * 各列のユニークな要素のリストを表示したい場合は、```unique``` 関数を用います。
    * ユニークな要素の値とその出現回数を表示したい場合は、```value_counts```関数で得ることができます。
    * DataFrameから1列もしくは1行のデータを取り出す場合のデータ型はSeries型、複数列もしくは複数行のデータを取り出す場合のデータ型はDataFrame型となります。

### 基本的な関数

**Pandasによるデータ加工/確認**
> 行ユニオン（縦に結合する、concat自体は横結合も可能）：pd.concat([df1, df2])
> 列ジョイン（SQLで言うところの表JOIN。内部結合と外部結合もできる）：pd.merge(df_ab, df_ac)
> 列合計：df['列名'].sum()
> 欠損値（NULL値）があるかの確認：df.isnull()
> 各種統計量の表示：df.describe()
> 日付型への変更：df.to_datetime()
> グループ化：df.groupby()
> クロス集計：pd.pivot_table(df)



* ```df.loc[index, "columns"]```
条件によって抽出したレコードの値の代入を行う際に用い、第1引数に行名(インデックスラベル)、第2引数に列名(カラムラベル)を指定します。
* ```df.iloc[index, index]```
行と列ともに番号(インデックス)を指定します。スライス表記可(負のインデックス)。


* ```astypeメソッド```
データ型の変更に用い、引数として変更をかけたいカラム名と変更後のデータ型を辞書形式で指定します。

* ```df.map()```
pandasの各々のレコードに定義した関数の処理を行うために用います。mapを用いることで各々のレコードに対して、個別に処理を行うことなく前処理を行うことが可能となります。

* ```df.str.contains```
文字列の要素に対してある文字列を含むデータを抽出することもできます。検索したい列に対してを用いてデータを抽出することができます。
* ```~```を用いてその条件を満たさない（条件の否定）データの抽出ができます。

* ```df.values.tolist()```
DataFrame, Seriesをndarrayのリストに変換します。


## 文字列加工（strオブジェクトのメソッド）
* ```'間に挿入する文字列'.join関数```
リスト内の要素を全て連結し、一つの文字列することもできます。split関数同様、区切り文字を指定することができ、引数には分割されたリストを用意します。 
用法 : ```'区切り文字'.join( リスト名 )```

* ```str.replace(old, new, count)```
    * 引数：old　置換元の文字列
    * 引数：new　置換後の文字列
    * 引数：count　置換を行う回数（省略時は、元の文字列に含まれる全てのoldがnewに置換される）
戻り値：元の文字列内にある「置換元の文字列」を「置換後の文字列」で置き換えた新しい文字列


* ```str.isupper()```
文字が大文字かどうか判定を行います。
* ```str.swapcase()```
戻り値：元の文字列の大文字／小文字を入れ替えた新しい文字列
* ```str.title()```
戻り値：元の文字列に含まれている単語の先頭文字だけを大文字にした新しい文字列を作成
* ```str.lower()```
戻り値：文字列内の全ての英字を小文字にした文字列を新しい作成
* ```str.upper()```
戻り値：文字列内の全ての英字を大文字にした文字列を新しい作成
* ```str.startswith(検索する文字列)```
戻り値：文字列が指定した引数の検索する文字列で始まっていればtrueを返し、そうでない場合はfalseを返す



* pandas基本操作おすすめ記事


https://toukei-lab.com/python-pandas#dfhead
    

https://qiita.com/yasuoyasuo/items/fec5ed4d7afc1627dc4d




### 覚えるべきこと
- for文を用いる際に使う ```enumerate()```
enumerateの引数にリストなどのイテラブルオブジェクトを指定することで```インデックス番号(index), 要素(item)```を同時に取り出す事が可能となります。
```Python
for index,item in enumerate(リスト):
    print('インデックス番号', index)
    print('要素', item)
```
- 関数とメソッドの違い
- 自作関数と無名関数の使い分け


* 可変長引数
関数宣言をするときに、値をいくつ渡されるか分からない場合があります。
そのときは可変長引数というものを使用し、何個の値が渡されたとしても全て受け取ることができるようにします。
可変長引数は下のような２種類の記述方法があります。
```
def 関数(*引数):   タプル(tuple)
    # 処理
``` 
```  
def 関数(**引数):  辞書型(dict)
    # 処理
```


### 欠損データ処理
* 欠損値を確認する方法(isnull関数 + sum関数)
```Dataframe.isnull().sum()```
* 欠損を含む行を削除する方法(dropna関数)
```Dataframe.dropna()```
* 欠損を他の値で置換する方法(fillna関数)
```Dataframe.fillna(置き換え値)```
    * 平均値や最頻値、0で置き換える

### 変数間の相関
* ```Dataframe.corr()```
* ```seaborn``` で可視化する
    * 量的データ×量的データ → 散布図
    * 量的データ×質的データ → 箱ひげ図


## scikit-learn
* scikit-learnではデータ適応を行う際に.fit()とすることが多くあるのでぜひ覚えておきましょう。
* データ適応させたインスタンスに対して、.transform()としてデータを指定すると標準化を行なったデータが返ってきます。
* データ適用.fit()した際のインスタンス.classes_とすることで置換後のクラスを確認することができます。
* 予測結果はpandasのDataFrameではなく、numpyの配列を表すndarrayというデータ型で返ってくることも覚えておくと良い。



## 情報の可視化(Matplotlib)
* 実績値と予測値を綺麗に可視化する為に下記ステップを行う必要があります。
    a. グラフのサイズを指定し、グラフの大きさを正方形になるように設定する
    b. 横軸を実測値、縦軸を予測値として、散布図を描く
    c. 値域を揃える為に、y_test、y_pred_testの両方を見た上での最小値と最大値を求める
    d. 最小値と最大値を使い、x軸およびy軸の値域を指定する
    e. 対角線を描く
* 対角線を引く
    * ```plt.plot([min_value,max_value],[min_value,max_value])```
## 参考文献
* https://biz.quest.signate.jp/courses/10068