個人的に忘備したい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)
コメント