Python 実践 データ加工/可視化 100本ノック に挑戦 ノック91 ノック92

Python 実践 データ加工/可視化 100本ノック」を購入したので、

一通りやっているところです。今日はノック91 ノック92を行います。

資料は以下から入手できます。

Python実践 データ加工/可視化 100本ノック|サポート|秀和システム

 

ノック91 : 大容量CSVデータを扱ってみよう

 

CSVファイルのデータを読み込みデータを分割して再度保存します。

使用するデータはサンプルにあるperson_count_out_0001_202111509.csvファイルです。

import pandas as pd
df = pd.read_csv('data/person_count_out_0001_2021011509.csv')
print(df)

 

 

実行結果

        id  place             receive_time  sensor_num  in1  out1  state1  in2  out2  state2
0        0      1  2021-01-15 09:00:00.144           2  508    73       0   73   508       0
1        1      1  2021-01-15 09:00:01.146           2  508    73       0   73   508       0
2        2      1  2021-01-15 09:00:02.161           2  508    73       0   73   508       0
3        3      1  2021-01-15 09:00:03.176           2  508    73       0   73   508       0
4        4      1  2021-01-15 09:00:04.192           2  508    73       0   73   508       0
...    ...    ...                      ...         ...  ...   ...     ...  ...   ...     ...
3535  3535      1  2021-01-15 09:59:55.054           2  782   156       0  156   782       0
3536  3536      1   2021-01-15 09:59:56.07           2  782   156       0  156   782       0
3537  3537      1  2021-01-15 09:59:57.085           2  782   156       0  156   782       0
3538  3538      1  2021-01-15 09:59:58.101           2  782   156       0  156   782       0
3539  3539      1  2021-01-15 09:59:59.116           2  782   156       0  156   782       0

[3540 rows x 10 columns]

 

全部で3540行のデータです。

このデータを512行ごとに読み取り、別ファイルに保存します。

i = 0
for df in pd.read_csv('data/person_count_out_0001_2021011509.csv',chunksize=512):
    print(df.shape)
    df['processed_per_chunk'] = True
    df.to_csv('data/processed_big_data.csv',mode='a',index=False,header=i==0)
    i += 1

 

header=i==0 とすることで、i==0のときにheader=1となり、ヘッダーが付加され、

それ以外の行のときはheader=0となり、ヘッダーが付加されません。

512ぎょうずつ読み込んでprocessed_big_data.csvファイルに追加上書きをしているので、最初のperson_count_out_0001_202111509.csvと同様のファイルが生成されます。

 

 

 

ノック92: Json形式のファイルを扱ってみよう

JsonファイルはJavaScript Object Notationの略で、JavaScript用のドキュメントの規格です。

JsonファイルはPandasのread_jsonで読み込むことができます。

 

import pandas as pd

j_data= pd.read_json('data/column_oriented.json')
print(j_data)

 

実行結果

  id  value
0   1      1
1   2     10
2   3    100

 

出力されるデータからフォーマットはrowとcolumnがあるcsvファイルと同様に見えます。

実際のjsonファイルの中身は、以下のように記述されています。

(テキストでディタでcolumn_oriented.jsonファイルを開いた場合)

{"id":{"0":1,"1":2,"2":3},"value":{"0":1,"1":10,"2":100}}

 

サンプルとして用意されているもう一つのindex_oriented.jsonファイルの中身を

確認すると、以下のようになっています。

{"0":{"id":1,"value":1},"1":{"id":2,"value":10},"2":{"id":3,"value":100}}

 

読み込んで表示してみます。

j_data= pd.read_json('data/index_oriented.json')
print(j_data)

 

実行結果

       0   1    2
id     1   2    3
value  1  10  100

 

最初に表示したデータと比較すると、行と列が入れ替わっていることが確認できます。

read_jsonの引数にorient='index'を追加すると最初の表示と同じになります。

j_data= pd.read_json('data/index_oriented.json',orient='index')
print(j_data)

 

実行結果

   id  value
0   1      1
1   2     10
2   3    100

 

列ごとにデータが記述されている場合は、引数無し、またはorient='column'です。

各indexにカラム名:値、カラム名:値の場合はorient='index’を使用します。

 

以下のように行ごとに書かれていても表示できます。

[{"id":"1", "value":"1"},{"id":"2", "value":"10"},{"id":"3", "value":"100"}]

実行結果

   id  value
0   1      1
1   2     10
2   3    100

 

サンプルにあるテーブル型のjsonファイルを読み込んで表示します。

{"schema":{"fields":[{"name":"index","type":"integer"},{"name":"id","type":"integer"},{"name":"value","type":"integer"}],"primaryKey":["index"],"pandas_version":"0.20.0"},"data":[{"index":0,"id":1,"value":1},{"index":1,"id":2,"value":10},{"index":2,"id":3,"value":100}]}

 


j_data= pd.read_json('data/table_oriented.json',orient='table')
print(j_data)

 

実行結果

   id  value
0   1      1
1   2     10
2   3    100

 

その他にorient='split'というものがあります。これは行と列とデータ全てがそれぞれ記述されているフォーマット形式です。

{"index":["0","1","2"]
,"columns":["id","value"]
,"data":[
["1","1"]
,["2","10"]
,["3","100"]
]
}

 

上記フォーマットを例えばsplit_oriented.jsonという名で保存して読み込むと

同様の出力が得られることが確認できます。

 

j_data= pd.read_json('data/split_oriented.json',orient='split')
print(j_data)

 

実行結果

   id  value
0   1      1
1   2     10
2   3    100

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/* -----codeの行番号----- */