ある関数のデフォルト引数がある引数のみを、そのデフォルト引数とともに抜く
例えばここにこんな関数があったとする。
f <- function(x, y = 100, args = list()){ y }
そしてこの関数のデフォルト引数がある引数のみを、そのデフォルト引数とともに抜きたいと思うことがある、俺にはある。
こういう処理をしてくれる関数 get_default_args
が欲しいということだ
> get_default_args(f) $y [1] 100 $args list()
このような関数は以下のように実装することができる。 詳細はCodeコメントを読んで欲しい。
get_default_args <- function(func){ # formalsで引数とデフォルト引数をまとめてとれる。ただしpairlist型なので無理やりlistにする x <- as.list(formals(func)) # デフォルト引数のない引数(上のk名数fでいうx)はnameオブジェクトと判定されるので、それ以外(デフォルト引数ある引数)をもってくる has_default_value <- purrr::map_lgl(x, ~ !is.name(.x)) purrr::keep(x, has_default_value) }
各大グループにおいて、各小グループの値がどの程度の割合を占めているのかを出す
昔、 r-wakalangで教えてもらったがメモってなかった話なのでメモっておく。
こういうデータ df
があった時に
> df <- data.frame( + big_group=rep(letters[1:2], 30), + small_group=rep(1:3, 10), + value=runif(30) + ) > head(df, 10) big_group small_group value 1 a 1 0.44153360 2 b 2 0.85443783 3 a 3 0.70604936 4 b 1 0.76551800 5 a 2 0.42258650 6 b 3 0.07403564 7 a 1 0.41088446 8 b 2 0.61669153 9 a 3 0.57614474 10 b 1 0.57685482
このデータの「各大グループにおいて、各小グループの値がどの程度の割合を占めているのか」を出す場合には以下のようにかく。
一回 summarize
をかますとグルーピングが1個外れるってのがみそ(最終的には大グループでのみグルーピングされたデータになっている)。
> library(dplyr, warn.conflicts = FALSE) > df %>% + dplyr::group_by(big_group, small_group) %>% + dplyr::summarise(sum_value = sum(value)) %>% + dplyr::mutate(ratio_value = sum_value / sum(sum_value)) # A tibble: 6 x 4 # Groups: big_group [2] big_group small_group sum_value ratio_value <fct> <int> <dbl> <dbl> 1 a 1 3.93 0.307 2 a 2 4.82 0.376 3 a 3 4.06 0.317 4 b 1 5.91 0.385 5 b 2 6.37 0.416 6 b 3 3.05 0.199
データ増やした時の標準誤差の減り具合
掲題の件、これはふつー「1/√データ数」ですが、適当にデータとして0だけ突っ込んでいったらどうなるんじゃいと思ってやってみたら大体似たようなもんだった。 理論的な話はあとで考える。
> size_unit <- 10^3 > x <- c() > y <- c() > for (i in 0:9){ + size <- (i+1)*size_unit + x <- c(x, sd(c(rnorm(size_unit, mean=10), rep(0, size_unit)))/sqrt(size)) + y <- c(y, sd(rnorm(size, mean=10))/sqrt(size)) + } > matplot(1:10, cbind(x, y), type="l") > > (max(y)/min(y))^2 [1] 9.989593 > (max(x)/min(x))^2 [1] 10.18266
x(データ+ 残りは0突っ込み)が黒で、y(データ水増し)が赤
各Bin・Cellに同じ数だけデータが入っているHistgramを作る
調べた感じ引数ではやれなそうだったので、やむなく quantile
関数で対応することにした。
> x <- rnorm(1000) > tmp <- hist(x, breaks=quantile(x, c(0, 0.2, 0.4, 0.6, 0.8, 1))) > tmp $breaks 0% 20% 40% 60% 80% 100% -3.4892322 -0.9159784 -0.2651141 0.2529398 0.8138118 3.3227017 $counts [1] 200 200 200 200 200 $density 20% 40% 60% 80% 100% 0.07772261 0.30728371 0.38606024 0.35658757 0.07971653 $mids 20% 40% 60% 80% 100% -2.202605301 -0.590546246 -0.006087158 0.533375795 2.068256768 $xname [1] "x" $equidist [1] FALSE attr(,"class") [1] "histogram"
PythonのRequestsライブラリのデフォルトの証明書のパス
ここで
requests/utils.py at c501ec986daa4961cd9dee370b5d45ff2e524b37 · requests/requests · GitHub
設定されてて、こいつは調べると
requests/certs.py at c501ec986daa4961cd9dee370b5d45ff2e524b37 · requests/requests · GitHub
にあるように certifiに丸投げだった。
なんで、
import certifi
certifi.where()
で出てきたファイルに、自分が使いたい奴の公開鍵突っ込んでいけばいい。
参考
Advanced Usage — Requests 2.20.1 documentation stakiran.hatenablog.com
Spark DataFrameに新しい列を追加する
下記のようにUDF使うか, map
でDataFrameごと新しくするか、なのか?
import spark.implicits._ import org.apache.spark.sql.functions._ // Example data val df = Seq( (1, 2), (3, 4), (5, 6) ).toDF("x", "y") // Define function val hoge = udf({(x: Int, y: Int) => x + y }) val x = df.withColumn("z", hoge($"x", $"y")) x.show()
sum_{i=1}^{N}(標準正規分布×標準正規分布) = 標準正規分布×自由度Nのカイ分布
なんでこうなるかの数式の証明はまだ読み切れてないんだが、とりあえずコード書いて検算したのとLINKのメモ。確かにヒストグラムがほぼほぼ重なる…
#自由度とサンプルサイズ df <- 10 size <- 10^4 # 標準正規分布×自由度dfのカイ分布(カイ二乗分布に従う乱数の平方根) x <- rnorm(size)*sqrt(rchisq(size, df)) # sum(標準正規分布×標準正規分布)、df個だけ足す y <- purrr::map_dbl(seq_len(size), ~ sum(rnorm(df)*rnorm(df))) #ヒストグラムが重なるかのチェック ggplot2::ggplot(data.frame(x=c(x, y), type=rep(c("x", "y"), each=size)), ggplot2::aes(x = x, fill = type)) + ggplot2::geom_histogram(position = "identity", bins=sqrt(size), alpha = 0.5)