Python Tips

プログラム

個人的に忘備したいPythonのTipsをまとめる

一般

メモリ専有状態を可視化

print("{}{: >25}{}{: >10}{}".format('|','Variable Name','|','Memory','|'))
print(" ------------------------------------ ")
memory_list = []
name_list = []
for var_name in dir():
    #if not var_name.startswith("_"):
    memory_list.append(sys.getsizeof(eval(var_name)))
    name_list.append(var_name)
    #print("{}{: >25}{}{: >10}{}".format('|',var_name,'|',sys.getsizeof(eval(var_name)),'|'))
        
for i in np.argsort(memory_list)[:-20:-1]:
    print("{}{: >25}{}{: >10}MBi{}".format('|',name_list[i],'|',memory_list[i]//(2**20),'|'))

Pandas

要素が欠けていても順序をそろえる (かけた要素はNaNになる)

df.reindex(index=[], columns=[])
# MultiIndexを使うとき
df.reindex(index=pd.MultiIndex.from_product([['a'], [1,2,3])) # L0に'a'をもち、L1に1,2,3の順番に並ぶように整列

pandas.plotのデフォルトの色を表示

plt.rcParams['axes.prop_cycle'].by_key()['color']

jupyter上で表示される際の上限を変更する

pd.set_option("display.max_columns", None) # データフレームを表示するときに、列数を制限しないようにする
pd.set_option("display.max_rows", 200) # データフレームを表示するときに、最大200行まで表示するようにする

Polars

ユーザ関数を追加する

@pl.api.register_expr_namespace('user')
class User:
    def __init__(self, expr,):
        self._expr = expr
    def replace(self, _d):
        '''
        _d : dict keyに前、valueに後の置換したい値を入れる。
        '''
        expr = None
        for f,t in _d.items():
            if expr is None:
                expr = pl.when(self._expr == f).then(t)
            else:
                expr = expr.when(self._expr == f).then(t)
        return expr.otherwise(self._expr)
    def cut(self, bins):
        '''
        bins に閾値列を挿入。binsは昇順である必要がある。
        '''
        expr = None
        for i in bins:
            if expr is None:
                expr = pl.when(self._expr <= i).then(i)
            else:
                expr = expr.when(self._expr <= i).then(i)
        return expr.otherwise(None)

# 使用例
n = 10
test_df = pl.DataFrame({
    'one': np.arange(n),
    'two': 2*np.arange(n),
    'three': 3*np.arange(n),
})
test_df.with_columns([
    pl.col('one').user.replace({i: 10*i for i in range(n) if i%5==0}).alias('one*10'),
    pl.col('two').user.replace({i*2: 10*i for i in range(n) if i%5==0}).alias('two*10'),
    pl.col('three').user.cut([-1, 3, 5, 10, 20, 30]).alias('cut_trhee'),
])

Matplotlib

棒グラフの頭に数値を追加

# axはmatplotlibのaxis
for p in ax.patches: # 数値の追加
    _x = p.get_x() + p.get_width() - 0.5
    _y = p.get_y() + p.get_height() + 0
    value = '{:.0f}'.format(p.get_height())
    ax.text(_x, _y, value, ha='left', fontsize=8)

日本語フォントを使用可能にする

# matplotlibの図に使用されるフォントを日本語フォントに変更
# for font_file in matplotlib.font_manager.findSystemFonts(fontpaths=['../data/游ゴシック']):
#     matplotlib.font_manager.fontManager.addfont(font_file)

# 使えるフォントを可視化
# import matplotlib
# fonts = set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
# plt.figure(figsize=(10, len(fonts)/4))
# for i, font in enumerate(fonts):
#     plt.text(0, i, f'日本語:{font}', fontname=font)
# plt.ylim(0, len(fonts))
# plt.axis('off')
# plt.show()

matplotlib.rc('font', family='IPAPGothic')

図の解像度を上げる

plt.rcParams["figure.dpi"] = 100

EXCEL

dataframeの書き出し

# with pd.ExcelWriter(f'hoge.xlsx', mode='a') as ex_writer: 追記時
with pd.ExcelWriter(f'hoge.xlsx', ) as ex_writer:
    for k in xlsx_out_df:
        xlsx_out_df[k].to_excel(ex_writer, sheet_name=f'{k}')
#ex_writer.close() # withを使用しない場合はこれで閉じる

図家の書き出し

xlsx_path = 'hoge.xlsx'
wb = openpyxl.Workbook() # openpyxl.load_workbook(xlsx_path) 追記時
sh = wb.create_sheet('sheet_name')
img = openpyxl.drawing.image.Image(NOTEBOOK_DIR/'image_name.png')
sh.add_image(img, 'A1')
wb.save(xlsx_path)

コメント

タイトルとURLをコピーしました