にしもと.blog

色々してます。

Sublime Text3で言語ごとにsublime-settingsする

結論

Macpython用のセッティングをしたい場合、以下の場所に置く

~/Library/Application\ Support/Sublime\ Text\ 3/Packages/Python/python.sublime-settings

メモ

全言語共通の設定は以下に置いてあるが、そことは置くべきディレクトリが違う!!

~/Library/Application\ Support/Sublime\ Text\ 3/Packages/User/Preferences.sublime-settings

参考

qiita.com

pandasで新しい行を追加(合計値の行を追加)

ソースコード

import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [2, 4, 6],
    "C": [3, 6, 9]
}, index=["R1", "R2", "R3"])

series_mean = df.sum()
series_mean.name = "mean"

df.append(series_mean)

メモ

df.append(pd.Series())で行を足すことができる。 自分で定義したい場合は、for文で定義できるとよい。

series = pd.Series()
for col in df.columns:
    series[col] = "A"

Jekyllでbreadcrumbs(パンくずリスト)

概要

jekyllでのパンくずリストの設置方法をメモします。

基本的には以下を使用。

github.com

手順

・jekellのhome下にhttps://github.com/git-no/jekyll-breadcrumbs/tree/master/lib/_includesを置く

・載せたくないtopページなどはnoToc: true

・default.htmlに以下を記載

{% include nav-breadcrumbs.html %}
{{ content | toc_generate }}

・あとはURLに従ってパンくずリストを生成します。

以上。

PythonでKruskal-wallis検定とDunn検定

ソースコード

R

library("PMCMR")
require(stats)
data(InsectSprays)
attach(InsectSprays)
kruskal.test(count, spray)
posthoc.kruskal.dunn.test(count, spray, "none")

Python

a = [10, 7, 20, 14, 14, 12, 10, 23, 17, 20, 14, 13]
b = [11, 17, 21, 11, 16, 14, 17, 17, 19, 21, 7, 13]
c = [0, 1, 7, 2, 3, 1, 2, 1, 3, 0, 1, 4]
d = [3, 5, 12, 6, 4, 3, 5, 5, 5, 5, 2, 4]
e = [3, 5, 3, 5, 3, 6, 1, 1, 3, 2, 6, 4]
f = [11, 9, 15, 22, 15, 16, 13, 10, 26, 26, 24, 13]
l = [a, b, c, d, e, f]

def kw_dunn(l, r, names=None):
    fac_flatten = []
    val_flatten = []
    for i, sub_list in enumerate(l):
        val_flatten.extend(sub_list)
        fac_flatten.extend([i for _ in range(len(sub_list))])

    r.assign("vals", val_flatten)
    r.assign("facs", fac_flatten)
    r("vals <- unlist(vals)")
    r("facs <- unlist(facs)")
    r("pre <- kruskal.test(vals, facs)$p.value")
    r("post <- posthoc.kruskal.dunn.test(vals, facs, 'none')$p.value")
    r("post_rowname <- rownames(post)")
    r("post_colname <- colnames(post)")

    pre = r.get("pre")
    post = r.get("post")
    post_rowname = r.get("post_rowname")
    post_colname = r.get("post_colname")
    if names is not None:
        post_rowname = [names[int(val)] for val in post_rowname]
        post_colname = [names[int(val)] for val in post_colname]

    df_post = pd.DataFrame(post, columns=post_colname, index=post_rowname)
    return pre, df_post

def main():
    pre, df_post1 = kw_dunn(l, r, None)
    pre, df_post2 = kw_dunn(l, r, ["a", "b", "c", "d", "e", "f"])
    print(df_post2)

if __name__ == "__main__":
    main()

解説

2次元配列を投げてKruskal-wallis検定 && Dunn検定をやってくれるプログラムがほしかった。

引数3つ目は、dataframeに変数をassignするために付与した。

df_post1とdf_post2を出力すれば違いがわかると思います。

HomeCreditのopen-solutionを読んだので便利そうなところまとめ

前置き

Kaggleのコンペの1つであるHomeCreditに参加しているときに、neptune-ml社の人たちがgithub上で公開しているopen solutionというものを見つけたので読んでみました。
以下、参考になったところをまとめています。

参考①:Kagggleの公式ページ
参考②:OpenSolutionのページ

データの前処理は各クラスのtransform関数に任せる

例えば、Bureauのデータのcleaningには、こんな感じで対応している。

class BureauCleaning(BaseTransformer):
    def __init__(self, fill_missing=False, fill_value=0, **kwargs):
        self.fill_missing = fill_missing
        self.fill_value = fill_value

    def transform(self, bureau):
        bureau['DAYS_CREDIT_ENDDATE'][bureau['DAYS_CREDIT_ENDDATE'] < -40000] = np.nan
        bureau['DAYS_CREDIT_UPDATE'][bureau['DAYS_CREDIT_UPDATE'] < -40000] = np.nan
        bureau['DAYS_ENDDATE_FACT'][bureau['DAYS_ENDDATE_FACT'] < -40000] = np.nan

        if self.fill_missing:
            bureau.fillna(self.fill_value, inplace=True)

        bureau['AMT_CREDIT_SUM'].fillna(self.fill_value, inplace=True)
        bureau['AMT_CREDIT_SUM_DEBT'].fillna(self.fill_value, inplace=True)
        bureau['AMT_CREDIT_SUM_OVERDUE'].fillna(self.fill_value, inplace=True)
        bureau['CNT_CREDIT_PROLONG'].fillna(self.fill_value, inplace=True)

        return {'bureau': bureau}

https://github.com/neptune-ml/open-solution-home-credit/blob/master/src/data_cleaning.py

scikit-learnと同様のtranformでデータの整形を行うことで、各前処理のIFを共通化しています

便利な関数はutils.pyにまとめる

会社とかで使うコードは違うまとめ方をしていたが、utils.pyにまとめる方が便利そう

ディレクトリ構造が参考になる

https://github.com/neptune-ml/open-solution-home-credit/tree/master/

main.py
src
 |- data_cleaning.py         # 前処理1
 |- feature_extraction.py    # 前処理2
 |- hyperparameter_tuning.py # ハイパラチューニング
 |- models.py                # 機械学習モデルを若干カスタマイズして返す
 |- pipeline_blocks.py       # pipelineのより詳細なブロック。
 |- pipeline_config.py       # pipelineのconfig(設定)を扱う
 |- pipelines_manager.py     # pipeline全体の管理(main.pyから呼ばれるのはここ)
 |- pipeline.py              # 機械学習モデルを返す?
 |- utils.py                 # 便利な関数などはここへ

実業務だともう少し荒い精度でまとめてもよいが、
データ処理の流れと、実データ処理は別々に分けるべきだと思いました。

Rのrainbowの色を確認するスクリプト

Rのrainbow(10) ってどんな色になる?というのを簡易に確認するスクリプト

ソースコード

結果

f:id:no-ku-ma:20181212102124p:plain
Rのrainbowの色を簡易に確認した結果

感想

久しぶりにR書いたが、R書くのつらい

Slackのバッククオートで囲むやつをCSSで再現する

こんなやつ

この↓のソース囲んでいる灰色の箱をHTMLで再現したかった。

ソースコード

css部分だけ。

div.slack_block {
    display: block;
    background: #f9f9f9;
    padding: .5rem;
    border: 1px solid rgba(0,0,0,.15);
    white-space: pre-wrap; 
    border-radius: 4px;
}

サンプルコード

<html>
<head>
    <title></title>
</head>
<body>
    <style type="text/css" media="screen">
        /*
            white-space: pre-wrap があるとテキストの折返しが有効になる
            https://developer.mozilla.org/ja/docs/Web/CSS/white-space
        */
        div.slack_block {
            display: block;
            background: #f9f9f9;
            padding: .5rem;
            border: 1px solid rgba(0,0,0,.15);
            white-space: pre-wrap; 
            border-radius: 4px;
        }

    </style>    

<div class="slack_block">1行目はここにかかないと駄目です
2行目もスペース空いていると駄目です
インデントがごちゃごちゃになるのが難点…
</div>

</body>
</html>

よくわかんなかったところ

white-space: pre-wrap があるとテキストの折返しが有効になるらしい https://developer.mozilla.org/ja/docs/Web/CSS/white-space