Python
YAML
pandas
データ分析

Pythonでコード中に楽にデータを入力したい

楽に入力したい

コード中に楽にデータを入力したいときってあるじゃないですか。
特に、ダブルクォーテーションの入力が嫌です。

import yaml
y = yaml.load('''
- [V1, A series, Func A, Yes]
- [V1, A series, Func B, No]
- [V1, B series, Func A, No]
- [V1, B series, Func B, Yes]
- [V2, A series, Func A, Yes]
- [V2, A series, Func B, Yes]
- [V2, B series, Func A, Yes]
- [V2, B series, Func B, Yes]
- [V3, A series, Func A, Yes]
- [V3, A series, Func B, Yes]
- [V3, B series, Func A, Yes]
- [V3, B series, Func B, Yes]
''')

これで配列になるし、

In [1]: y

Out[1]: 
[['V1', 'A series', 'Func A', True],
 ['V1', 'A series', 'Func B', False],
 ['V1', 'B series', 'Func A', False],
 ['V1', 'B series', 'Func B', True],
 ['V2', 'A series', 'Func A', True],
 ['V2', 'A series', 'Func B', True],
 ['V2', 'B series', 'Func A', True],
 ['V2', 'B series', 'Func B', True],
 ['V3', 'A series', 'Func A', True],
 ['V3', 'A series', 'Func B', True],
 ['V3', 'B series', 'Func A', True],
 ['V3', 'B series', 'Func B', True]]

これでpandasに流し込める。

In [2]: import pandas as pd
In [3]: df = pd.DataFrame(y, columns=['ver', 'series', 'func', 'is_supported'])
In [4]: df

Out[4]: 
   ver    series    func  is_supported
0   V1  A series  Func A          True
1   V1  A series  Func B         False
2   V1  B series  Func A         False
3   V1  B series  Func B          True
4   V2  A series  Func A          True
5   V2  A series  Func B          True
6   V2  B series  Func A          True
7   V2  B series  Func B          True
8   V3  A series  Func A          True
9   V3  A series  Func B          True
10  V3  B series  Func A          True
11  V3  B series  Func B          True

日報からグラフを作る

日報から集計やグラフを作るのって夢じゃないですか。
やってみました。

import yaml
y = yaml.load('''
開発:
  Aさん: [1, 製品A]
  Bさん: [1, 製品B]
  Cさん: [3, 製品C]

テスト:
  Dさん: [1, 製品A]
  Eさん: [1, 製品A]
  Fさん: [2, 製品D]
  Cさん: [3, 静的コード分析]

環境構築:
  Hさん: [1, ]

ドキュメント:
  Cさん: [3, ]
  Fさん: [1,  ]
  Iさん: [1,  ]

''')

dictionaryと配列のネストを作って、

In [3]: y

Out[3]: 
{'テスト': {'Cさん': [3, '静的コード分析'],
  'Dさん': [1, '製品A'],
  'Eさん': [1, '製品A'],
  'Fさん': [2, '製品D']},
 'ドキュメント': {'Cさん': [3], 'Fさん': [1], 'Iさん': [1]},
 '環境構築': {'Hさん': [1]},
 '開発': {'Aさん': [1, '製品A'], 'Bさん': [1, '製品B'], 'Cさん': [3, '製品C']}}

データリストに変換して、

In [4]: import pandas as pd
In [5]: data = []
   ...: for g_k, g_v in y.items():
   ...:     for k, v in g_v.items():
   ...:         tmp = []
   ...:         tmp.extend([g_k, k])
   ...:         try:
   ...:             tmp.extend([1/v[0], v[1]])
   ...:         except:
   ...:             tmp.extend([1/v[0], ''])
   ...:         data.append(tmp)
   ...: df = pd.DataFrame(data, columns=['group', 'name', 'effort', 'content'])
In [6]: df

Out[6]: 
     group name    effort  content
0     環境構築  Hさん  1.000000         
1       開発  Cさん  0.333333      製品C
2       開発  Bさん  1.000000      製品B
3       開発  Aさん  1.000000      製品A
4      テスト  Cさん  0.333333  静的コード分析
5      テスト  Dさん  1.000000      製品A
6      テスト  Eさん  1.000000      製品A
7      テスト  Fさん  0.500000      製品D
8   ドキュメント  Cさん  0.333333         
9   ドキュメント  Iさん  1.000000         
10  ドキュメント  Fさん  1.000000         

pivotテーブルで集計して、

In [7]: df_pivot = df.pivot_table(index='group', values='effort', aggfunc='sum')
In [8]: df_pivot

Out[8]: 
          effort
group           
テスト     2.833333
ドキュメント  2.333333
環境構築    1.000000
開発      2.333333

グラフにする。

In [9]: %matplotlib inline
   ...: import matplotlib
   ...: font = {'family' : 'AppleGothic'}
   ...: matplotlib.rc('font', **font)
   ...: df_pivot.plot.pie(x=['group'], y='effort', pctdistance=0.85,
   ...:        textprops={'color': "white", 'weight': "bold"}, autopct='%.0f%%')

ダウンロード.png

(グラフは手抜きですみません。。)

以上です。

環境

macbook 10.12
Python 3.5.1
PyYAML 3.12
pandas 0.22.0
ipython -V 6.2.1