おいしいブログ

python pandasの使い方メモ

統計だデータサイエンスだ機械学習だディープラーニングだと色々言われてもう結構経つわけですが、これまでそれなりに興味がありつつ都度調べたり本を読んだりしていました。ですがまぁ実際に仕事などで必要に迫られるわけでもなく、なんだかんだ目の前に積まれているやらなければいけない事に押し潰されてしまい、重要緊急の4象限でいう「重要だが緊急でない」ところに追いやられてしまっているうちに忘却の彼方に飛んでいくというやつを繰り返していました。この先、いきなり必要に迫られて慌てたり、表面的な事だけさらってやり過ごすなんてことにならないように、この「重要だが緊急でない」事にちゃんと時間を使わないといけないな〜ということで、今更ながらにこの手の事を残していこうかなと。大丈夫。まだ慌てるような時間じゃぁ〜ない。

ということで、データをこねるにしてもそのこねるツールが手に馴染んでいないとこねるにこねられないので、まずはこね方の基本を定着させていきます。

環境

Dockerの continuumio/anaconda3 を利用します。

continuumio/anaconda3 - Docker Hub

# docker-compose.yml

version: '3'
services:
  anaconda:
    image: continuumio/anaconda3
    container_name: pandas-memo
    volumes:
      - ./work:/work
    ports:
        - 8888:8888
    command: jupyter notebook --ip=0.0.0.0 --allow-root

# run
$ docker-compse up
# pip list
Package                            Version  
---------------------------------- ---------
-略-

jupyter                            1.0.0    
jupyter-client                     5.2.3    
jupyter-console                    5.2.0    
jupyter-core                       4.4.0    
jupyterlab                         0.32.1   
jupyterlab-launcher                0.10.5   

-略-

matplotlib                         2.2.2    

-略-

numpy                              1.14.3   

-略-

pandas                             0.23.0   

-略-

scikit-learn                       0.19.1   
scipy                              1.1.0    
seaborn                            0.8.1    

色々入っている中にpandasもあります。これ以降は、jupyter-notebook で動かしていきます。

http://localhost:8888

jupyter notebook ss

データセット

機械学習に使えるオープンデータセットベスト50

この中から今回こねるデータをひっぱってきます。今回は米国政府機関のデータを利用しようかと思います。

一般的データセット > 政府の公共データセット > Data.gov

Data.govの中にも色々ありそうですが、 American Fact Finder から Annual Estimates of the Resident Population: April 1, 2010 to July 1, 2017 というCSVを拝借してきました。

Annual Estimates of the Resident Population: April 1, 2010 to July 1, 2017

このデータセットをpandasで利用します。

CSVの読み込み

ヘッダ行が2行あるので、2行目をヘッダに指定。

import pandas as pd

df = pd.read_csv('data/PEP_2017_PEPANNRES.csv', header=1)
df.head

列名の取得

df.columns

行の件数

len(df)

列毎の件数

df.count()

行の抽出

df = df[0:50]
#df = df[df.Geography == 'Alabama']
df.head

欠損値の除外

df = df.dropna()

df.head

NaNが除外された

列の抽出

2014-2017を抽出

df = df[['Geography', 'Population Estimate (as of July 1) - 2014', 'Population Estimate (as of July 1) - 2015', 'Population Estimate (as of July 1) - 2016', 'Population Estimate (as of July 1) - 2017']]
df.columns

列の削除

2014年を削除

df = df.drop('Population Estimate (as of July 1) - 2014', axis=1)
df.columns

行の抽出(query)

df = df.query('Geography in ("New York", "California", "Washington")')
df.head

グラフの描画

%matplotlib inline

import matplotlib.pyplot as plt

y = df.drop('Geography', axis=1).T.values
#x = df.drop('Geography', axis=1).columns
x = pd.Series(['2015', '2016', '2017'])

plots = plt.plot(x, y)
plt.legend(plots, df.Geography,
           loc='best',
           framealpha=0.25,
           prop={'size': 'small', 'family': 'monospace'})
plt.grid(which='major',color='lightgray',linestyle='-')
#plt.yscale('log')
plt.show()

train用データとtest用データ分割

from sklearn.model_selection import train_test_split

train, test = train_test_split(df2, test_size=0.2)

(len(df2), len(train), len(test))

ひとまず

なんやかんや、CSVをいじれました。 こねたnotebookは以下に。

mylde/python-pandas-memo - GitHub