Python §34 : pandas検討用のデータ準備(生成) | hitochan007のブログ(Pythonの勉強ブログ)

hitochan007のブログ(Pythonの勉強ブログ)

★Pythonの勉強記録を中心に●pomera DM200、●パソコン、●グルメ、●愛犬(トイプードル) などについてのブログです

【Python:目次】

■pandas検討用のデータ準備(生成)■
●1.データ設計
●2.データ置き場の生成
●3.データの生成
●4.データのファイル出力

pandasの勉強を進めていますが、そろそろ実践練習していきたいと思います。
まずはデータ処理をするための対象であるデータを準備します。

今回は、ファイルで提供するのではなく、pythonにてデータを生成してファイル化します。
その後、そのファイルを使って、pandasライブラリーを使ったデータ処理を進めていきます。


●1.データ設計


pythonを使ってデータ処理(データ解析)を行う対象のファイルは、様々なフォーマットがあると思いますが、一般的なのはテキストデータで構成している場合が多いと思います。もちろんバイナリーデータで代表的なのはエクセルファイルなどもありますが、ここでは、テキストデータを扱ってトレーニングしていきます。

テキストデータでもよく使われるのがCSV(Comma Separated Value)やTSV(Tab Separated Value)ファイルのようにカンマやTABコードを区切り文字として改行された行のかたまりのデータがよく使われると思います。

今回練習で使うデータを次のように構成することを考えました。

(1)最初にヘッダ行が数行存在する(ヘッダ行は最初に出てくるデータではない情報部分)
(2)ヘッダ行の中には必要な情報が存在する。(今回はデータ測定の開始日時情報としました)
(3)インデックスになり得るデータ列を3種類用意
(4)データ部分を4列分準備。数学関数で生成できるデータとしました。

以下が今回の生成するデータです。エクセルのデータを表示しています。

データ構成


それでは、順にデータの説明をしていきます。
1行目: ファイル名
2行目: データの名称
3行目: データ測定開始日時
4行目: データ数
5行目: 列名①一般的名称
6行目: 列名②関数名
7行以降:データ(25個)

No:0から始まるシーケンス番号
sec:60秒おき
x:-Πから+Πをデータ数で分割したデータ
sin(x):サインカーブ
cos(x):コサインカーブ
tan(x):タンジェントカーブ
x^2  :xを二乗した値

●2.データ置き場の生成


ファイルを出力する場所を指定することにします。スクリプト(本プログラム)のある場所を基準にその下にサブフォルダーを作成して、その下に入出力ファイルを設置することにします。

そのためのコードが以下のとおりです。

Path=WriteFilePath(Pathname='RW_Data')   #パスの設定
print('Path=',Path,'\n')
os.chdir(Path)


関数は以下のとおりです。

def WriteFilePath(Pathname='RW_Data'):     #ファイルの書き込み場所の指定 、基本はプログラムの下
writepath=os.path.join(ScriptPath()[2],Pathname)
if not os.path.isdir(writepath):
os.mkdir(writepath)
return writepath

def ScriptPath():
#ScriptPath()[0]:basename ScriptPath()[1]:pathname ScriptPath()[2]:fulpath D202
basename=os.path.basename((sys.argv[0]))
pathname=os.path.abspath(os.path.dirname(sys.argv[0]))
fullpath=sys.argv[0]
#txt = os.path.join(ScriptPath()[2], ScriptPath()[0]) #joinでフルパスを作る
return (basename,fullpath,pathname)


流れはWritePath関数を呼び出し、そこからScriptPath関数を呼び出し、カレントフォルダを設定します。

■WriteFilePath(Pathname='RW_Data')
①Pathnameは設定したいサブフォルダ名で、デフォルトはRW_Dataとなっています
②ScriptPathという関数でスクリプトの存在するパスをもらいます
③join関数で設定したパスをフルパスとして生成します
④もし、設定しようとしたパスが存在しない場合はフォルダを作成します
■ScriptPath()
①ベース名はスクリプトファイル名
②パス名はスクリプトファイルの存在するフォルダパス
③fullpathはフルパス名

ここでは、スクリプトファイルのあるフォルダの下にRW_Dataというフォルダを作成します。
(一度作成したあとは、何もしません)

os.chdir(Path)によって、カレントフォルダをこのRW_Dataに移しておきます。
こうしておくと、ファイル名のみの指定でファイルの入出力が行えるようになります。


●3.データの生成


まずヘッダ部分をdataリストに入れます。

#
data=[]
data.append(['file name:','pd_data.csv'])
data.append(['data name:','data for pandas testing'])
data.append(['start:','2015/03/24','08:47:12'])
data.append(['data number:','100'])
data.append(['No','sec','x','ch1','ch2','ch3','ch4'])
data.append(['No','sec','x','sin(x)','cos(x)','tan(x)','x^2'])



次にデータ部分を生成しますが、元になるシーケンス番号はnp.arangeで生成し、そのほかはnumpy配列を使っているのでそのまま配列を簡単に生成することができます。

#
Data_no=25 #データ数設定
x=np.arange(Data_no) #Data_no個分のシーケンシャル番号
x2=x*60 #60秒ごとのデータを設定
x3=np.linspace(-np.pi,np.pi,Data_no) #-Π~+ΠまでをData_no数で分割する
y1=np.sin(x3) #サインカーブ
y2=np.cos(x3) #コサインカーブ
y3=np.tan(x3) #タンジェント
y4=x3*x3 #二乗


次にさきほどのヘッダ情報に追加する方法を示します。
ヘッダを作ったときと同じようにapenndしますが、列データを並べた配列をappendします。
この操作をデータ行数分繰り返して、最後にnummpy配列化します。

#
for i in range(len(x)):
data.append([x[i],x2[i],x3[i],y1[i],y2[i],y3[i],y4[i]])
data=np.array(data)



●4.ファイルの出力


データの生成が終わると、データ配列をファイル名およびcsv用の定義情報とともにcsv_writeという関数に渡します。ふたつファイルを出力しているのはcsvファイルとtsvファイルを両方とも試したいので作っておくことにしました。

#
wfilename='pd_data.csv'
csv_write(wfilename,data,dialect='comma')

wfilename='pd_data.tsv'
csv_write(wfilename,data,dialect='tab')


dialectという定義については、以下のように記述します。(スクリプトファイルの上方に書きます)

#
csv.register_dialect('tab', delimiter='\t',quoting=csv.QUOTE_NONNUMERIC)
csv.register_dialect('comma', delimiter=',',quoting=csv.QUOTE_NONNUMERIC)


csv_writeという自前の関数のコードも示します。

def csv_write(wfilename,data,dialect='tab'):
#――――――――――――――――――――――――――――――――――――――――
# csv module でcsvファイルを読み込む
#――――――――――――――――――――――――――――――――――――――――
f = open(wfilename, 'wt')
try:
writer = csv.writer(f,
lineterminator='\n',dialect=dialect)
for x in range(len(data)):
writer.writerows([data[x]])
finally:
f.close()


以上で練習用のデータがふたつRW_Dataの下に出力されていると思います。






pandasトレーニング用のサンプルデータファイルを作りました。ここでは、pandasの関数は使わず、csvモジュールを使いました。これには理由があって、ヘッダ部分とデータ部分で列数が異なったり、データ種類(実数や文字列)など混在しているとpandasでは対処できないためです。(できるかもしれませんが、現時点では見つけられませんでした)

このことは、実は次のステップの「ファイル読み込み」でもはまりました。つまり、列数が異なるデータ行を扱うには、pandasでは難しいのです。csvモジュールで読み込んでからpandasのデータフレームに入力することが上策であることがわかりました。ヘッダ情報から必要な要素を取り出すときもこの二段階読み込み方式だとスムーズにいきます。これは、後述していきます。


→こちらがソースコードです。プログラム名:Group1のG1a




チェック データの置き場を作る関数を用意しておくと便利
チェック ヘッダ情報とデータ情報の列数がことなる場合は、csvモジュールを使ってファイル出力
チェック numpy配列でデータを生成すると配列まるごと関数に適用できる。
チェック データ生成するときにはappendを使うと楽
チェック CSVモジュールを使うときはdialect定義文を作っておくと便利





Python ブログランキングへ 
クリックしてね


新しいブログをはじめました。pythonの初級者から中級者まで、役に立つ記事を掲載していますので、ご覧ください。

特にカスタム関数(ユーザー定義関数)は、便利に使えると思います。

ぜひぜひこのリンクをクリックしてください 

 Pythonを勉強して株で儲けるブログ