- タスクマネージャでjobsを停止させると途中の演算結果がTEMPフォルダに保存されっぱになる
- jobsの停止を何度もやっているとそのうちTEMPフォルダがパンパンになる
- なのでTEMPフォルダのお掃除が定期的に必要
- TEMPフォルダの中身は基本捨てても問題ない
- TEMPフォルダは大体以下のディレクトリにある
- C:\WINDOWS\Temp
- C:\Users\(ユーザ名)\AppData\Local\Temp
- TEMPフォルダの中身は全部削除しても大丈夫? - ぼくんちのTV 別館
japanmeshでメッシュコードから緯度経度を出す
japanmesh
でメッシュコードから緯度経度をだしたい- その作業を
tibble
でやりたいとき
data %>% mutate( latitude = map_dbl( .x = mesh_code, .f = ~ {jpgrid::grid_to_coords(jpgrid::grid_auto(.x))[[2]]} ), longitude = map_dbl( .x = mesh_code, .f = ~ {jpgrid::grid_to_coords(jpgrid::grid_auto(.x))[[1]]} ) ) data %>% mutate( latitude = map_dbl( .x = mesh_code_3rd, .f = ~ {japanmesh::mesh_to_XY(japanmesh::mesh_auto(.x))[[2]]} ), longitude = map_dbl( .x = mesh_code_3rd, .f = ~ {japanmesh::mesh_to_XY(japanmesh::mesh_auto(.x))[[1]]} ) )
ポアソン過程について
- 無限長の時間軸を用意
- サンプルサイズ
n
の点を時間軸上にランダム配置 - 時間軸を有限の長さの区間に分割し、ある区間について考える
- ある区間内に各点が含まれる確率を
p
とする - 区間内の点の個数が
k
のとき、k ~ Bionomial(N, p)
となるので、P(N = k)
は以下のように書ける。 P(N = k) = nCk * p^k * (1-p)^(n-k)
区間内の個数kの期待値は
np
であり、これをnp := λ
とするn→∞
、p→0
の極限をとってポアソンの極限定理を用いると、k ~ Poisson(λ)
となる- このとき
P(N = k)
は以下のように書けなおせる。 P(N = k) = exp(-λ) * λ^k / k!
maxentは生物の発見データがポアソン過程で生成されたときの個体数に関するモデル
- 時間軸を平面空間に拡張している
n→∞
、p→0
の極限は、対象生物の個体数が十分大きく、平面上の区間は十分小さいことに対応- となると、区間内の発見個体数はせいぜい0か1となるため、発見個体数はベルヌーイ試行だといえる
- となると、区間内の個体数の期待値は
p
になる(ベルヌーイ分布) - と同時に、区間内の個体数の期待値は
λ
でもある(ポアソン分布) - よって、在データのみから
λ
を推定して、これを生物の生息確率とみなしてよい - ただし、各発見点はポアソン過程から生成されると仮定できれば、の話。
住所を都道府県と市区町村で切り分けたいとき
zipangu::separate_address
を使うと便利- コードの例
fread('hogehoge.csv', encoding = 'UTF-8') %>% mutate(address = zipangu::separate_address(都道府県市区町村)) %>% mutate( pref = unlist(map(.x = address, .f = ~ {flatten(.x)[[1]]})), city = unlist(map(.x = address, .f = ~ {flatten(.x)[[2]]})) )
決定木とは
- データを特徴量空間上で矩形分割するモデル
- 分割は「ある特徴量がある値と一致するか」「ある特徴量がある値より大きいか小さい」などのルールに従って行う
- 分割ルール(分割対象となる特徴量と閾値の組)をどう見つけるかが大切
- 情報利得を目的関数とし、これを最大化する分割ルールを見つけることで、最適な決定木を構築
- 情報利得とは、親ノードでの不純度から子ノードの不純度の加重平均を引いたもの
- 情報利得が大きいことは、親ノードに比べて子ノード内のデータが「均一」になることを意味
不純度の種類
- 分類タスクだとジニ不純度やlogloss、回帰タスクだと平均誤差がよく用いられる
- (texで数式かきてえええ)
目的関数をどう計算するか
- 理想的な方法
- 考えられる全ての決定木をあらかじめ構築
- それら決定木の目的関数の値をすべて計算
- 目的関数が最大化される決定木を採用
- 特徴量の数やデータのサンプルサイズが大きくなると、この方法は現実的な時間で解けきれない
- 代替案として貪欲法を使う
- 決定木の根から一段階だけ葉を生やす
- 目的関数を計算して、最適な特徴量とルールの組を探す
- 2の決定木を採用して、ほかの決定木は捨てる
- さらに一段階だけ葉を生やす
- 2~4を繰り返す
- 貪欲法は全ての決定木をあらかじめ構築するのはあきらめて、逐次的に最適な決定木を見つけていこうやという方法
- 理想的な方法と貪欲法でそれぞれ求まる決定木は一致する保証がない(らしい)
- まあでも、現実的に解けるからええやんっていうスタンスなのかな?
地理空間データのwkt形式について
- 地理空間データの形式として
.shp
形式をよく利用してた .shp
はどうも重い?wkt
はオブジェクトとそのオブジェクトの頂点座標の集合を1つのデータセットとしてもつ形式- ファイルの形式そのものは
.csv
になる - あとでちゃんと調べよう
python基礎お勉強
ライブラリ
import pandas as pd import numpy as np
データロード
from sklearn.datasets import load_iris iris = load_iris() X = pd.DataFrame(iris.data, columns=iris.feature_names) y = pd.Series(iris.target) # X = pd.DataFrame(iris['data'], columns=iris['feature_names']) でも可 # y = pd.Series(iris['target']) でも可
データの確認
head
columns
keys
type
describe
をよく使うhead
tail
いわずもがなcolumns
keys
データの列名やキー名を表示type
データの型を表示describe
データの要約値を表示
列名変更
rename
とset_axis
があるrename
- 特定列だけ列名変更 する仕様
- 変更前と変更後の列名 を明示する必要アリ
X.rename(columns={'sepal length (cm)':'sepal_length'})
set_axis
- 全列で列名変更 する仕様
- 変更後の列名だけ を明示する必要アリ
- 注意点
labels
通りに列名変更されるため、columns
であらかじめ列順を確認せよ- 列名変更のほか行名変更もできてしまうので 、
axis=1
で列方向を指定せよ
X.set_axis(labels=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'], axis=1)
- 一部の列名だけ変更したいなら
rename
- まとめて全列名を変更したいなら
set_axis
列選択
[ ]
loc
iloc
drop
del
がある[ ]
- かっこ内で選択したい列名を記入
- 1つ変数を列選択する場合
data['row_name']
(Seriesとして出力)data[['row_name']]
(DataFrameとして出力)
- 2つ以上の列選択の場合
data[ ['row_names1', 'row_names2', etc] ]
(DataFrameとして出力)
x1 = x['sepal_length'] x2 = x[['sepal_length']] x3 = x[['sepal_length', 'sepal_width']] type(x1) type(x2) type(x3)
loc
- 行と列の両方で選択範囲を指定
- 行:行名 or 行番号で指定
- 行番号はスライス
start:end
で指定可能 - 行番号を
:
と書くと全行指定となる
- 行番号はスライス
- 列:列名で指定
- 列番号で指定できない
- `loc[:, ['column']] とするとSeriesとして出力
- `loc[:, 'column'] とするとData.Frameとして出力
- 行:行名 or 行番号で指定
- よくある書き間違い
- 行指定を忘れる
loc[]
ではなくloc()
と書いてしまう
- 行と列の両方で選択範囲を指定
x1 = x.loc[:, 'sepal_length'] x2 = x.loc[:, ['sepal_length']] x3 = x.loc[:, ['sepal_length', 'sepal_width']] type(x1) type(x2) type(x3)
iloc
loc
と違うのは、列番号で列選択する点のみ
drop
- 削除したい列を列名で選択
- 行番号で削除したいときは、
columns
を利用して削除したい列番号の列名を取り出す
X.drop(['sepal_length'], axis=1) X.drop(X.columns[[1]], axis=1)
del
- こいつはいったんパス
正規表現で列名選択は可能?
行選択
[ ]
query
loc
がある[ ]
- 条件式でブール値を返して、そのブール値で行選択
- 条件式間は
&
|
でつなぐ - between表現はないので、betweenと同等の条件式を書くしかない
X[X.sepal_length >= 5.0] x[(x.sepal_length >= 1) & (x.sepal_length <= 5)] X[(X.sepal_length >= 5.0) & (X.pelat_width> 2.0)]
query
- 条件式内は
==
!=
<
>
=
でつなぐ - 条件式間は
and
or
でつなぐ - between条件は
num < column < num
などの書き方でOK
- 条件式内は
X.query('sepal_length >= 5.0') X.query('1 <= sepal_length <= 5.0') X.query('sepal_length >= 5.0' and 'petal_width >= 2.0')
loc
- 条件式を行成分に書けばよい
- 条件式間は
&
|
でつなぐ - between表現はないので、betweenと同等の条件式を書くしかない
X.loc['sepal_length >= 5.0'] X.loc[('sepal_length' >= 5.0) & ('petal_width' >= 1)]
- 正規表現で文字列の行選択は可能?
- 欠損値のみ/以外の行選択は可能?
列追加
[ ]
とassign
がある[ ]
- data[colname] = 数式で新しい列を生成
x['new_col1'] = x['sepal_length']
assign
- 列名 = 数式 で新しい列を生成(dplyr::mutateとほどんど同じ)
- lamda式を数式に使用可能
- maskで処理の条件変化を数式に組込可能(dplyr::case_whenとほとんど同じ)
x.assign(new_col1=x.sepal_length, new_col2=lambda x: x.sepal_length.round(), new_col3=lambda x: x.sepal_length.mask(x.sepal_width < 1, np.nan))
- **
if_else
やcase_when
のFALSEのときに処理は? - 正規表現を用いた列追加は可能?
結合
concat
とmerge
があるconcat
merge
raw_data2 = pd.DataFrame( [[1, 2, 3], [3, 4, 5], [4, 5, 6]], columns = ['a', 'b', 'c'] ) d_assigned = raw_data2.assign(d = pd.Series([2, 3, 5])) print(tmp2)
raw_data1 = pd.DataFrame( [[1, 2, 3], [3, 4, 5], [4, 5, 6]], columns = ['a', 'b', 'c'] ) print(raw_data1) raw_data1['d'] = [2, 3, 5] print(raw_data1)
データの並べ替え
X.sort_values('sepal length (cm)', ascending=True) X.sort_values('sepal length (cm)', ascending=False)
データの結合
merge
のデフォルトはinner_join
- 引数
how
でleft
right
outer
指定可能
- 引数
# %% d_score = pd.DataFrame( { 'user':[1, 2, 3], 'score':[100, 20, 55] } ) d_user = pd.DataFrame( { 'user':[1, 2, 3, 4, 5], 'name':['a', 'b', 'c', 'd', 'e'], 'class':['A', 'A', 'A', 'B', 'B'] }, columns=['user', 'name', 'class'] ) d_score_user = pd.merge(d_score, d_user, on = 'user')
- joinするkeyがデータフレーム間で違う場合
- 引数
left_on
とright_on
でそれぞれのデータフレームのjoin keyを指定 - あらかじめ
rename
でjoin keyを同じ名前にしておく
- 引数
# %% d_score = pd.DataFrame( { 'user_id':[1, 2, 3], 'score':[100, 20, 55] } ) d_user = pd.DataFrame( { 'user':[1, 2, 3, 4, 5], 'name':['a', 'b', 'c', 'd', 'e'], 'class':['A', 'A', 'A', 'B', 'B'] }, columns=['user', 'name', 'class'] ) d_score_user_2 = pd.merge(d_score, d_user, left_on = 'user_id', right_on = 'user')
# %% d_score_rename = d_score.rename(columns={'user_id':'user'}) d_score_user_3 = pd.merge(d_score_rename, d_user, on = 'user')
グループごとで集計
# %% df = pd.concat([X, y], axis=1) df = df.rename(columns={0:'species_id'}) df.groupby('species_id').mean()