仕事メモとか

仕事中に調べた情報とか知ったことをメモしています。
unixコマンド, vim, oracle, putty, postgresql, bash, EXCEL, python, SQL全般 など。
最近は tableau, movabletype とかも触ったりしています。
雑な読書感想とかはこちら


IntelliJ で、gitを何度も作るときに簡単にしたスタートコマンド

はい、gitになって管理が堅牢になったんですが、毎回ブランチ立てるのは面倒。
でも必要なことなので、ブランチ作るの簡単にしたコマンドを用意しました。

●git_startコマンド作成

#!/bin/sh
set -eu

PROG_ID="$1"
FEATURE="${2:-test_program}" #ブランチ名

# masterの最新を取得
git checkout master 1>/dev/null 2>/dev/null
git pull 1>/dev/null 2>/dev/null

# ブランチ名を自動作成してブランチ作成
BRANCH_NAME="feature/${PROG_ID}_${FEATURE}"
git checkout -b ${BRANCH_NAME}
git push --set-upstream origin ${BRANCH_NAME}

echo "created complete. ${BRANCH_NAME}"


●git_startコマンドを自分のbinのところに置く
${HOME}/bin
に、git_startを配置

●git_startに実行権限を付ける
chmod 775 git_start

●自分の作ったbinにPATHを通す
.bash_profile

export PATH="~~"に足す
その後、
source ~/.bash_profile で再読み込み

●IntelliJのターミナルで起動
source ~/.bash_profile でこちらでも再読み込み
git_start {プログラム番号} {プログラム名とか}


こうすることで「feature/」のスペルってなんだっけ? って毎回思わずに済みます。
(そして打たないので、またfeatureのスペルを忘れます)

pandasで、データフレームに対し、同様のフォーマットだったら全部置換したい、的な手法=applymap

はい、データフレーム使ってますか?
便利ですね、pandas。

ということで、今回の要件はこんな感じです。

要件:
データフレーム上では全てのデータをそのまま扱いたいが、
csvなどで出力するときは日付のフォーマットを全部固定差し替えしたい。

調べてみると、applymapというものが使えそうなんですが、これ指定の仕方がちょっと面白い。

df = df.applymap(function)

直接、function(関数)をぶっこみます。
ここで指定する関数はlambdaでも、defでもよいのですが、こんな感じになります。


def _format_date_time(value):
if isinstance(value, datetime):
return value.strftime('%Y/%m/%d')
else:
return value


formatted = {変換したいdf}.applymap(_format_date_time)

このようにすることで、内部関数「_format_date_time」をapplymapに突っ込んで、
変換したいdfの中身のうち、datetime型のものだけ出力を「YYYY/MM/DD」型に置換します。

慣れるとかなり強力です。


lnコマンドでディレクトリのシンボリックリンクを張り替え

はい、ディレクトリ構成を変更したので、
シンボリックリンクの向き先を変更するにはどうすればいいんだろう、と調べました。
一旦消して~とも思ったんですが、リンクを消すときに間違えてリンク先の実態が消えそうで
本当怖い。

なので向き先だけを変更すればいいのでは? と思って調べたら、ちょうどいいのありました。


ln -nfs {向き先} {リンク名}

オプションの意味
-n:ディレクトリでも指定OK
-f:リンクファイルと同名のファイルがあったら上書き
-s:シンボリックリンク作成

利用頻度が少なすぎて、あんまり覚えてられないのでメモ。


参考:
https://qiita.com/takeoverjp/items/bb1576e90a8a495db4b3
https://www.atmarkit.co.jp/ait/articles/1605/30/news022.html


pythonで指定した期間の毎月1日を取得

はい、複数月のデータを取るときに、SQL一発でやっていましたが、
月を指定してループで回す方が可読性あがるよね、ということで、
python側で月をループで取るようにしたサンプルです。


import datetime

def month_range(start_date: date, end_date: date):
m = start_date
while m < end_date:
yield m.replace(day=1)
m = (m.replace(day=1) + timedelta(31)).replace(day=1)


def main():

for m in month_range(datetime.date(2019, 1, 1), datetime.date.today()):
print m


こんな感じにすると、
・貰ったスタートの日付を一旦その月の1日に変換、yieldで返す
・次はそこに31日を足して、その月の1日に変換、yieldで返す
・・・

となります。

timedeltaは月の加算減産は出来ないそうで。
やりたいならサードパーティのライブラリを使う、という手もあるっポイです。
https://python.civic-apps.com/add-month-relativedelta/


参考:
https://www.sejuku.net/blog/23716
https://python.civic-apps.com/timedelta/


pandasの出力で、floatにすると、整数が「x.0」ってなるやつの対応方法

はい、pandas便利ですね。
データフレームにすると大体便利に扱えるので、これからの時代はpandasじゃないかな、
って思うんですが、ちょっとした落とし穴が。

数値データを取り扱うとfloatになるんですが、これのせいでデータが、

10

10.0

となります。小数値が欲しいときは良いんですが、整数として取り扱いたいときに、
csvで出力しようとすると、こうなります。

df.to_csv('outfile.csv', encoding='MS932', index=False,
header=['xxx', 'yyy', 'zzz'])

この時
float_formatでフォーマットを指定すると、色々出来ます。
こうすると、整数のときの「.0」が出ないようになります。

float_format='%g'

例)
df.to_csv('outfile.csv', encoding='MS932', index=False, float_format='%g',
header=['xxx', 'yyy', 'zzz'])


参考
https://note.nkmk.me/python-pandas-option-display/
https://pythondatascience.plavox.info/pandas/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B

↑このページのトップヘ