■概略
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
IBMiのライブラリ毎の種類別オブジェクト数をjupyterで集計しました
SQL+pythonでループ+dataframeの使い方(合計追加と横持ち→縦持ち変換)です
■集計結果
OBJATTRIBUTE | CLP | DFU | DSPF | OTHER | PRTF | RPG | RPGLE | SAVF |
BKNLIB | 1444 | 207 | 1266 | 173 | 265 | 2495 | 228 | 0 |
BKNLIBF | 0 | 0 | 0 | 60 | 0 | 0 | 0 | 0 |
TOTAL | 2469 | 365 | 2136 | 360 | 414 | 4525 | 256 | 1 |
…続く(画面に入らないので左右に分割し上下に並べた)
OBJATTRIBUTE | LF | PF | QRY | TOTAL |
BKNLIB | 0 | 56 | 252 | 6386 |
BKNLIBF | 816 | 1046 | 5 | 1927 |
TOTAL | 3710 | 4986 | 650 | 19872 |
■集計コード
※jupyterのインストール、接続などの共通関数は
(分析1)jupyterでSQL設計とデータ分析に掲載している
使用しているSQLは上記の「オブジェクト名取得(DSPFD相当)」
# DB接続
conn = connect_dev()
df = pd.DataFrame()
LIBL = ['BKNLIB', 'BKNLIBF'] # 集計するライブラリの配列を指定する
for LIB in LIBL:
# (分析1)...の「オブジェクト名取得(DSPFD相当)」のSQLでライブラリ名を
# pythonのループで指定している
query = """
SELECT '{0}' as LIBID,OBJATTRIBUTE,count(*) as CNT
FROM TABLE(QSYS2.OBJECT_STATISTICS('{0}','*ALL'))
group by OBJATTRIBUTE
order by OBJATTRIBUTE
""".format(LIB)
df_tmp = pd.read_sql(sql=query, con=conn)
df_tmp = df_tmp.replace('', 'OTHER') # 空白はOTHERにする
# 1ライブラリにつき種類別行数の集計を結合する
df = pd.concat([df, df_tmp], ignore_index=True)
#display(df)
# 縦持ちを横持ちにする
pivot_df = df.pivot_table('CNT', index=['LIBID'], columns=['OBJATTRIBUTE'], aggfunc='sum')
pivot_df = pivot_df.fillna(0) # N/Aを0にする
pivot_df = pivot_df.astype(int) # 整数にする
pivot_df['TOTAL'] = pivot_df.sum(axis = 1,numeric_only=True) # 各行の合計
# 各列の合計
total_df = pivot_df.sum(axis = 0).to_frame().T
total_df.index=["TOTAL"]
pivot_df = pd.concat([pivot_df, total_df])
dt_now = datetime.datetime.now().strftime('%Y%m%d%H')
print("■as400dev({0})".format(dt_now))
display(pivot_df)
# CSVに出力する
pivot_df.to_csv('DSPOBJD@AS400DEV_{0}.csv'.format(dt_now))
◯縦持ちを横持ち変換(pivot)
pivot_table前のdataframeは以下の形になっている
BKNLIBで1行、BKNLIBFで1行にまとめたい=縦持ちを横持ちに変換したい
pivot_tableで変換を行う。詳しくはpandas.dataframeのpivot_tableを調べてください
LIBID | OBJATTRIBUTE | CNT | |
0 | BKNLIB | OTHER | 173 |
1 | BKNLIB | CLP | 1444 |
2 | BKNLIB | DFU | 207 |
3 | BKNLIB | DSPF | 1266 |
… |