python+pandasで大規模データを扱うときのメモ
MySQLからデータを取り出す
"""Get data from MySQL with pandas library.""" import MySQLdb import pandas.io.sql as psql con = MySQLdb.connect(db='work', user='root', passwd='') # DB接続 sql = """SELECT product_id, product_nm, product_features FROM electronics""" df = psql.read_sql(sql, con) # pandasのDataFrameの形でデータを取り出す con.close()
データからベクトルを作る1
大規模データを使ってクラスタリングなどのためのベクトルを作る際、メモリ消費を抑えるためにデータを削除しながら繰り返し処理を行う。
"""Delete rows while creating dataset.""" X = [] for index, row in df.iterrows(): # 行ごとに繰り返し処理 Xi = [row.col1, row.col2, row.col3] X.append(X) df = df.ix[index:] # メモリの消費を抑えるためにデータを削除しながらベクトルを作成
データからベクトルを作る2(速度改良)
1つめのやり方のではコードはきれいだが、繰り返しの速度が遅いという難点がある。 一度リストにするやり方の方が何倍も速い。
"""High speed row iteration in pandas DataFrame""" # データをコピーしてリストへ df_index, df_col1, df_col2, df_col3 = \ list(df.index), list(df.col1), list(df.col2), list(df.col3) del df # データを削除 for _ in df_index: # データを削除しながらイテレート col1, col2, col3 = df_col1.pop(), df_col2.pop(), df_col3.pop() Xi = [col1, col2, col3] X.append(Xi)