【pandas】 DataFrame.describe()について

DataFrame.describe()はDataFrameに格納されているそれぞれの特徴量(横軸)に対して
数値データならcount, mean, std, min, 25%, 50%, 75%, maxを計算,
カテゴリデータならcount, unique(カテゴリの種類), top(先頭), freq(最頻値)を計算してくれる便利な機能

【参考】
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.describe.html

【pandas】 CSVの読み込み

csvファイルをpandas.DataFrameに格納する方法

# 読み込み
csv_path = "./data.csv"
data = pd.read_csv(csv_path)

# データの表示(Jupyter notebookなどで)
# .head()メソッドを使えば,先頭から5行が表示される
data.head()

# 特徴量の名前をリストとして取得する(特徴量は基本的に横軸にセットされる)
# インスタンス変数columnsとして取得できる
col = data.columns

# データフレームの特徴量の一つを抽出(ラベルなど)
# 特徴量の名前"name_of_feature"に対して
y = data.name_of_feature

【Python】 集合についての操作

# 集合の宣言
a = set([1,2,3])
b = set([3,4,5])

# 和集合
> a | b
{1,2,3,4,5}

# 積集合
> a & b 
{3}

# 集合の差(A-B = A-(A∩B)
> a - b
{1,2}

# 対象差(AもしくはBにのみ含まれる A+B-(A∩B)
> a ^ b
{1,2,4,5}

# 部分集合の判定
> a <= b
False
>{3,4} <= b
True

【注意】
部分集合の判定で{3} in {3,4,5}とやってもFalseとなる.
 3 \in \{3,4,5\}だが \{3\} \not \in \{3,4,5\}だからだ.

リスト型では + は連結として定義されている. -,^,&は定義されていない.<=は定義されている.

【参考】
https://qiita.com/Tocyuki/items/0bc783daab382ef7a0ec

【python】集合型について

集合型set()について

# 集合の宣言(1)
a = set([1,2,3])
# 集合の宣言(2)
a = {1,2,3}
# 空集合の宣言
> a = set()
# 追加
> a.add(1)
# 削除
> a.remove(1)
# 無い要素を削除するとエラー
> a.remove(2)
Traceback (most recent call last):
  File "<sttdin>", line 1, in <module>
KeyError: 2
# discardによるエラーを発生させない削除
> a.discard(100)

つまり集合から要素を削除する際にremove()メソッドを使うと例外処理をする必要がある.
discard()メソッドを使うとエラー処理せずに済む.

# 集合から偶数を除く操作
a = set([1,6,7])
for i in range(0,10,2):
   try:
      a.remove(i)
   except:
      pass

b = set([1,6,7])
for i in range(0,10,2):
    b.discard(i)

【参考】
https://www.sejuku.net/blog/21923#addset

【ギャラリー】 k-meansによる画像減色

元画像
f:id:umashika5555:20171103122400j:plain
k=3
f:id:umashika5555:20171103122417p:plain
k=5
f:id:umashika5555:20171103122422p:plain
k=7
f:id:umashika5555:20171103122425p:plain
k=10
f:id:umashika5555:20171103122557p:plain
k=12
f:id:umashika5555:20171103122608p:plain
k=20
f:id:umashika5555:20171103122624p:plain

なお画像が大きいためサーバーで実行したのだが, OpenCVが入っていなかったのでPILで書きなおした.
この際に画素のRGB値を書き換えた(OpenCVはGBRの順で紛らわしい)のだが, 混乱して正しく書き換えられているか分からない.
もっと保守性高く書きたいものだ(;_;)

【python】 proxy下でデータセットをダウンロードする

以下の設定を書く.

import urllib.request
# proxy の設定
proxy_support = urllib.request.ProxyHandler({'http' : 'http://***.***.***:port',
                                             'https': 'https://***.***.***:port'})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)

これを事前に書けば

# CIFAR-10データセットをロード
from keras.datasets import cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

でエラーを起こさない.

【pandas】 DataFrameから特定の列の取り出し方

f:id:umashika5555:20171031091054p:plain

取り出したい項目["color", "size", price"]を指定して

X = df[["color", "size", "price"]]

のようにして取り出す.

一列の場合なら

df.color

df["color"]

によって"color"の列が取り出せる.

行を取り出すには

#先頭から3行目まで
df[:3]

のようにリストのように扱う.

その他にも条件を指定して抽出したり, 位置を指定して抽出する方法があるらしい.

【参考】
http://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA

【python】 辞書のキーと値を逆にする操作

辞書型のキーと値の順番を変更した辞書をつくる.
順序特徴量でL, M, Sという文字列の値がある場合, 数値として扱うために
class_mapping = {"L":3, "M":2, "S":1}
のような辞書を定義し, 文字列を数値にする.
これを再び元の形に戻したい場合はinv_class_mapping = {v:k for k,v in class_mapping.items()}
のようにキーと値の順番を入れ替えて同じ操作をすればよい.

class_mapping = {"L":3, "M":2, "S":1}
df["size"] = df["size"].map(class_mapping)
inv_class_mapping = {v:k for k,v in dictionary.items()}
df["size"] = df["size"].map(inv_class_mapping)