Dive into hoge

データ分析関連の備忘録

pandas操作②:arrayから変換、カラム名をコピーから作成

よく忘れるので備忘2。

arrayをDataFrameに変換したいとき

単純にDataFrameにつっこむだけ。

import numpy as np
import pandas as pd

a = np.array([[1,2,3],
              [4,5,6]])
df_a = pd.DataFrame(a)

一応記載すると、df_aは下記のようになる

	0	1	2
0	1	2	3
1	4	5	6

カラムを別のDataFrameからコピーしてきたい

カラムとインデックスがないので寂しい。大抵のブログ記事ではここで自分でカラム名を入力したりするが、実際にそんなことやらない。何かを流用したりするだろう、普通。というか私がやりたい。だが記載がないので下記で色々やってみる。まずコピー元のDataFrameを作ってみる。

df_b = pd.DataFrame({'A':[7,10],
                     'B':[8,11],
                     'C':[9,12]},
                   index = ['customer1','customer2'])

df_bのカラム名をdf_aにコピーしたいとき(インデックスがことなるので値を変えるのでなくカラム名だけ欲しいときとか)。素朴に下記でどうだろう?

df_a.rename(columns=df_b.columns)

下記エラーがでます。

TypeError: 'Index' object is not callable

では何を受け付けるのかと、ヘルプを見てみると"index, columns : scalar, list-like, dict-like or function"とあるので下記。

df_a.rename(columns=list(df_b.columns))

"TypeError: 'list' object is not callable"のエラーがでる。リスト受け付けるんじゃないの? list-likeだからリストそのものはダメなの? そこでふと思ったが、もっと素朴に下記はどうだろうか?

df_a.columns = df_b.columns

# 下記は出力
	A	B	C
0	1	2	3
1	4	5	6

うまくいった。なんだこれでよかったのか。。

ローカルでの処理結果をRedshiftに入れる

spark使わないでローカルで素朴にやる時の方法

sparkのpipeline使えば入出力は簡単だけど、まだ使い方がわからない…けどsklearn使えばローカル環境で色々できるんだオレは!というヒト向けに、下記のRedshiftに接続してデータ受け取ってPandasに入れるやつの続編。
http://blog.hatena.ne.jp/exotic_manifold/exotic-manifold.hatenablog.com/edit?entry=8599973812328031581

処理した結果…例えばクラスタリングした結果を元のテーブルにクラスタIDとして返して、教師ラベルとして活用したいというとき。
(手元でそのまま処理し続けられるならいいけど、Tableauとかで可視化したい、グリグリいじりたいというとき)

と言っても、スキーマを変えるような返し方はできないので、クラスタIDをいれるテーブルを作っておいて、元のテーブルとジョインすることになります、最終的には。

まずS3へ接続

# Connect to S3
import pandas_redshift as pr
pr.connect_to_s3(aws_access_key_id = 'AWSのアクセスキーIDを入れる',
                aws_secret_access_key = 'AWSのシークレットアクセスキーIDを入れる',
                bucket = 'データをいれたいS3のバケット名',
                subdirectory = '上記バケットのサブディレクトリ')

さらにRedshiftへ接続し、データを書き込む

# Write the DataFrame to S3 and then to redshift
pr.connect_to_redshift("データベース名", "URL", "ユーザ名", password="パスワード", port = ポート番号)
pr.pandas_to_redshift(data_frame = 書き込みたいデータ,
                      redshift_table_name = '書込先のテーブル名',
                      column_data_types =['varchar(16)', 'varchar(2)'])←これは例

redshiftからデータ読み込んでpandasのデータフレームに入れる

まずはRedshiftに接続する。

import psycopg2
import redshift_sqlalchemy
from sqlalchemy import create_engine

engine = create_engine('{dialect}+{driver}://{user}:{pwd}@{url}:{port}/{db}'.format(
    dialect = 'redshift',
    driver = 'psycopg2',
    user='ユーザー名',
    pwd ='パスワード',
    url='Redshiftのクラスター画面のエンドポイント',
    port=ポート番号(エンドポイントの最後についてるかも),
    db='Redshiftのクラスター画面のデータベース名'
))

Redshift接続先設定がわからない場合は下記参照。
f:id:exotic_manifold:20171222183459p:plain

接続したらデータフレームにいれる。
ちなみにメモリに乗り切らない量だとエラーになるので、limitでいけそうなレコード数を少しずつ試していく。
(chunksizeという引数もあるけど結局メモリに乗り切らないとアウトだからこれでいいかなと思っている)

import pandas as pd
data = pd.read_sql_query('SELECT * FROM redshiftテーブル名 limit 100;', engine)


<下記は参考>
www.blendo.co

qiita.com