0. はじめに
たまには小ネタ記事を。
よくテレビとかで出てくる「ある地点の**を100としたときに」っていうグラフがあります。
これファンチャートって言うらしいんですが、これをPandasのMap関数等でどう作成すればいいか?にお恥ずかしながら30分くらい工数かかってしまったので、どこかの誰かの為に残しておきます。
「pandas ファンチャート」でググってもHitしませんでした
ので・・(Excelは多かったけど)
参考:ファンチャートとは?
1. サンプルデータ作成
サンプルとして適当なデータを作成します
※この程度なら実際はごり押しでもできますが、カラム数がうん千だときついですよね。。
import pandas as pd
df = pd.DataFrame({ 'A' : [1, 2, 3, 4, 5],
'B' : [10, 20, 30, 40, 50],
'C' : [500, 400, 300, 200, 100]
})
display(df.head())
display(df.plot())

2. ファンチャート作成
今回は0行目を「100」としてPandasのMAP関数を使用して処理していく。
数式は簡単で 変換後の値 = (*行目の要素 × 100) ÷ 0行目の要素
となるわけだが、個人的に詰まったのはMAP関数でどうやって0行目の要素っていうのを処理すればいいか?
に関してです。
結論から言うと**functools.partial()
を使用すれば部分的に変数を固定にできます。**
from functools import partial
def fanchart(x, y):
"""計算関数"""
return (x*100)/y
"""
・各カラムにMAP関数+partial関数を適応(for使わなくてもできるかもですが。。)
・y=df[i][0]で関数内の引数yを0行目の要素で固定している
"""
for i in df.columns:
df[i + '_fan'] = list(map(partial(fanchart, y=df[i][0]), df[i]))
display(df.head())
display(df.plot(y=['A_fan', 'B_fan', 'C_fan']))

3.さいごに
Pandasも業務やプライベートで結構使ってるので、ようやく慣れてきたかなぁ・・・と思ってたけど全然そんなことなかったですね。
いつも小難しい記事ばかり書いてたので、たまにはと思って小ネタを今回は書かせていただきました。
おっ、ちょうど困ってて参考になった!という人は私の30分との等価交換(笑)でぜひLGTMお願いします!
4.追記
コメントにご指摘いただきましたが、これわざわざMAP関数使わなくても以下で簡単に実現できましたね。。
まだまだ精進します。。
df*100/df.loc[0]