Node.jsでexcelからデータ抽出してjsonにするプログラムかいてみた
どうもこんにちは.
最近冷やし中華ばかりたべている管理人です.
今日は,Node.jsでexcel操作するライブラリxlsx - npm でexcelから抽出したデータをjson形式に書くプログラムをかいてみたのでメモとして残しておきます.
1.目的
次のような,excelシートsample.xlsx
から各行をjson形式で取得して, test.xlsxに保存する
プログラムを作成します.
firstname | lastname |
---|---|
Takeshi | Goda |
Shizuka | Minamoto |
Honeo | Sunekawa |
javascriptコード
'use strict';
let ParseExcel = function() {
this.methods = {};
this.table = [];
};
ParseExcel.prototype = {
/**
* Excelから取得するデータのフィールド名と取得する関数
* @param {string} fieldName
* @param {function getField(index, worksheet) {}}
*/
setMethods:function(fieldName, getField) {
this.methods[fieldName] = getField;
return this;
},
/**
* worksheet
* @param {Array} rows worksheetからデータ取得する行番号
* @param {*} worksheet ワークシート
*/
setTable:function(rows, worksheet) {
rows.forEach((index) => {
let record = {};
Object.keys(this.methods).forEach((field) => {
record[field] = this.methods[field](index, worksheet);
});
this.table.push(record);
});
return this;
},
/**
* 取得したデータの取得
*/
getTable:function() {
return this.table;
}
};
let parseExcel = new ParseExcel();
/** フィールドと取得関数を設定 */
parseExcel.setMethods('firstName', (index, worksheet) => {
let cell = worksheet[`A${index}`];
return !cell ? undefined : cell.v;
}).setMethods('lastName', (index, worksheet) => {
let cell = worksheet[`B${index}`];
return !cell ? undefined : cell.v;
})
const XLSX = require("xlsx");
// Workbookの読み込みや
const book = XLSX.readFile(__dirname + "/sample.xlsx");
// Sheet1を読み込むんや
const sheet1 = book.Sheets["Sheet1"];
//末端行を取得するで
let rowMax = XLSX.utils.decode_range(sheet1['!ref']).e.r
//sheet1の内容を取得するんや
let table = parseExcel.setTable(
[...Array(rowMax).keys()].map((i) => i+2), sheet1)
.getTable()
console.log(table);
//新規ワークブックや
let wb = XLSX.utils.book_new()
let sheetNew = XLSX.utils.json_to_sheet(table,
{header:['firstName','lastName'], skipHeader:false})
//newシートに保存するで
XLSX.utils.book_append_sheet(wb, sheetNew, "new")
//test.xlsxに保存するんや
XLSX.writeFile(wb, "test.xlsx")
2.動作確認
nodeで実行してみると次のようになります.
[ { firstName: 'Takeshi', lastName: 'Goda' }, { firstName: 'Shizuka', lastName: 'Minamoto' }, { firstName: 'Honeo', lastName: 'Sunekawa' } ]
3.最後に
実は今回利用したsample.xlsxのように普通の形をした表データの整形なら
XLSX.utils.sheet_to_json
とか使えば良いと思いますが,取得したいセルの位置
が飛び飛びであるみたいなにも対応できるように実装しました.今後ももう少しxlsxライブラリの練習をしていきたいと思います...
Poisson過程とGamma分布
Poisson過程
をパラメータとし,が次の条件で与えられるPoisoon過程であるとします.
i.
ii.独立増分性( independent increment) 任意のに対して は独立である.
iii. 任意のに対して
が次の事前分布に従うとします,
ただしここではガンマ分布でその確率密度関数は
です.
この場合,の事後分布は次のようになります.
(導出)
よってがわかります.
tr(AB) = tr(BA)を世界一回りくどく証明する方法
どうもこんにちは.今回の記事の内容は線形代数についての記事です.
線形代数で,次の公式は大体の教科書に載っていると思います.
を次正方行列とするとき
今回の記事では,この公式の可換図式を使った回りくどい証明を紹介します(笑)
トレースを思い出す
を体,を上有限次元の線形空間とする.
-線形写像
を
]
で定義する.が上有限次元のとき,は上同型になる.
また,-線形写像を
で定義する.
定義 トレース(跡)を
で定義する.
以下,次を証明します
とするとき,
ふつう教科書では,の基底を取って計算する証明が多いと思うけど,そうではない方法を紹介しましょう.
証明
補題Iの証明
とするとき,
より示せた.
補題II
次の可換図式が存在する.
補題IIの証明
とすると,
より示せた.
補題III 次の可換図式が存在する.
補題IIIの証明
とすると,
より示せた.
以上で準備がととのいました.
命題
とくに,
命題の証明
よって示せました.
VSCodeで始めるSpringBoot(2) ~ 簡単なREST apiつくってみた
SpringBoot + SQLServer2017で簡単なREST apiを作ってみました.
GitHub - gradus-AP/springboot-simple-REST-api
SpringBootってなんやねんって方は,前回記事もご参考までに...
環境
api概要
今回作ったのは,DBのCRUD操作をRESTサービスで提供するapiです.各CRUD操作とapi側の HTTPメソッドは次のように対応付けられます.
DB側 | api側(HTTPメソッド) | 操作の内容 |
---|---|---|
Create | POST | リソースの新規作成 |
Read | GET | リソースの取得 |
Update | PUT | リソースの更新 |
Delete | DELETE | リソースの削除 |
DB
DB側では次のようなusers
テーブルを用意しました.
フィールド名 | 型 | 制約 |
---|---|---|
id | INT IDENTITY(1, 1) | PRIMARY KEY |
name | VARCHAR(255) |
ここでid列のIDENTITY(1, 1)は,このフィールドの値を初期値1, 増分1で自動採番を行うというSQLServerのオプションです. 今回は,
apiの仕様
HTTPメソッド | URL | jsonリクエスト | 処理を内容 |
---|---|---|---|
POST | /api/users/ | {name:{name} } |
名前が{name} のユーザを新規作成 |
GET | /api/users/ | - | usersテーブルの全レコード取得 |
GET | /api/users/{id} |
- | idが{id} であるユーザ名取得 |
PUT | /api/users/{id} |
{name:{name} } |
idが{id} であるユーザ名を{name} へ変更 |
DELETE | /api/users/{id} |
- | idが{id} であるユーザを削除 |
動作確認script(PowerShell)
PowerShellターミナルからコマンドInvoke-WebRequest
をたたいてHTTPリクエストを送ろう.
#POST user 'Yukichi Fukuzawa'を作成 Invoke-WebRequest -Method Post -Body @{name='Yukichi Fukuzawa'} http://localhost:8080/api/users/ #GET user 'Yukichi Fukuzawa'が返される Invoke-WebRequest http://localhost:8080/api/users/ #GET user 'Yukichi Fukuzawa'が返される Invoke-WebRequest http://localhost:8080/api/users/1 #PUT user 'Yukichi Fukuzawa'が'Hideyo Noguchi'に変更 Invoke-WebRequest -Method PUT -Body {name='Hideyo Noguchi'} http://localhost:8080/users/api/1 #DELETE user 'Hideyo Noguchi'が削除される Invoke-WebRequest -Method DELETE http://localhost:8080/users/api/1 #GET userは1件も登録されていない Invoke-WebRequest http://localhost:8080/api/users/
参考
VSCodeで始めるSpringBoot(1)
案件の関係で勉強しはじめたSpring Bootのめも.
目次
Spting Boot
Spring Bootは,Webフレームワークのひとつ.Javaで書ける.
環境
環境
OS:Windows 10
JDK: 1.8.0_211
Apache Maven 3.6.1
あとVSCodeの拡張機能
SpringBoot Extension Pack
Spring Initializr Java Support
を導入しておいた.
とりあえずHello World!まで
ここでは,httpリクエストに対してHello World!するだけの極小webアプリケーションを作ってみましょう. 公式のgitレポジトリから,git cloneすればソースは手に入ります.
1.プロジェクト作成
Spring Initializr Java Supportを使えば,プロジェクトの作成をすることが出来る.
手順
1. VSCodeを開き,Ctrl + Shift +p
で出てきた検索窓でSpring Initializr generate a Maven Project
を選択.
2.ウィザードに従って進む.途中で依存パッケージを選ぶところがあるが,とりあえずWEB
だけ選択しておく.
3.完了
2.coding
プロジェクト作成時のGroup Id, artifactがそれぞれcom.example, demoの場合(デフォルト),src/main/java/com/example/demoにDemoApplicationクラスがつくられている.
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
さて,「httpリクエストに対してHello World!を返す」という処理を次のように書く.こうして@RequestMapping("リクエストurl")
というアノテーションを付与したメソッドが,クライアントからのhttpリクエスト時の処理に紐づけされる.
package com.example.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController class HelloWorld { @RequestMapping("/") String index() { return "Hello World!"; } }
3.ビルドとデプロイ
mvnでビルドする.
C:\Workspace\demo> mvn compile
コンパイルが通ったら,デプロイする.
C:\Workspace\demo> mvn spring-boot:run
ローカル起動の場合http://localhost:8080にアクセスすれば,画面にHello World!
と表示される.
かなり寂しい画面だ.
基本情報技術者試験まであと一週間を切りました
(この行を消して、ここに「迷い」と「決断」について書いてください)
Sponsored by イーアイデム
基本情報技術者試験とは
基本情報技術者試験とは,情報処理に関する知識を有することを示す国家資格です.毎年2回(4月と10月)開催される試験であり,この試験に合格すると 日曜日の朝に早起きできる能力 を客観的に示すことが出来ます.
合格率の推移
基本情報技術者試験の合格率は,大体20%~30%の間で推移しています. (基本情報技術者試験ドットコムより,統計を拝借しました) 以下,直近14回の応募者, 受験者, 合格者の情報です.
開催 | 応募者 | 受験者 | 合格者 |
---|---|---|---|
24年春期 | 75,085人 | 52,582人 | 12,437人 |
24年秋期 | 79,674人 | 58,905人 | 15,987人 |
25年春期 | 66,667人 | 46,416人 | 10,674人 |
25年秋期 | 76,020人 | 55,426人 | 12,274人 |
26年春期 | 65,141人 | 46,005人 | 11,003人 |
26年秋期 | 74,577人 | 54,874人 | 12,950人 |
27年春期 | 65,570人 | 46,874人 | 12,174人 |
27年秋期 | 73,221人 | 54,347人 | 13,935人 |
28年春期 | 61,281人 | 44,184人 | 13,418人 |
28年秋期 | 75,095人 | 55,815人 | 13,173人 |
29年春期 | 67,784人 | 48,875人 | 10,975人 |
29年秋期 | 76,717人 | 56,377人 | 12,313人 |
30年春期 | 73,581人 | 51,377人 | 14,829人 |
30年秋期 | 82,347人 | 60,004人 | 13,723人 |
次回の合格率をブラウン運動モデル予測してみる
合格率をモデリングしてみます. 回目の合格率をとして,これが次のようなモデルで表されるとします.
ただし,ここでとおいた.
要は ブラウン運動 ですね.
以下Rパッケージの{dlm}
で推定するコードです.
FE_stats_csv <- read.csv('FE_stats.csv', encoding = 'utf-8')
View(FE_stats_csv)
開催 <- paste("H",gsub("年秋期", "-10", gsub("年春期", "-04",FE_stats_csv$開催)))
受験者 <- as.numeric(gsub(",", "",gsub("人", "", FE_stats_csv$受験者)))
合格者 <- as.numeric(gsub(",", "",gsub("人", "", FE_stats_csv$合格者)))
FE_stats <- data.frame(開催 = 開催, 受験者 = 受験者, 合格者 = 合格者)
df <- data.frame(t = FE_stats$開催,success_rate = FE_stats$合格者 / FE_stats$受験者)
g <- ggplot(df, aes(x = t, y = success_rate, group = 1))+
geom_line(colour = 'darkblue')+
ylim(0.10, 0.40)
plot(g)
lgt <- function(p) {
return(log(p/(1-p)))
}
invlgt <- function(x) {
return(exp(x) / (1 + exp(x)))
}
lgt_suc_rat <- data.frame(t = FE_stats$開催, val = lgt(df$success_rate))
g <- ggplot(lgt_suc_rat, aes(x = t, y = val, group = 1))+
geom_line(colour = 'darkorange')+
ylim(-2.0, -0.0)
plot(g)
#autp correlation plot
lgt_suc_rat_acf <- acf(lgt_suc_rat$val, plot = FALSE)
acf_data <- data.frame(lag = lgt_suc_rat_acf$lag, acf = lgt_suc_rat_acf$acf)
acf_plot <- ggplot(acf_data, aes(x = lag, y = acf))+
geom_hline(aes(yintercept = 0))+
geom_segment(mapping = aes(xend = lag, yend = 0))
plot(acf_plot)
#Brown_motion_fitting###########################################################
#Brownian Motion
brownian_motion <- function(theta) {
dlmModPoly(order = 1, dV = 0
,dW = exp(theta[1]), m0 = theta[2], C0 = exp(theta[3]))
}
fit_Brown_motion <- function(path, model) {
fit <- dlmMLE(path, parm = rep(0, 3), build=model)
llik <- - dlmLL(path, brownian_motion(fit$par))
return(list(fit = fit, llik = llik))
}
fit.brown_motion <- fit_Brown_motion(lgt_suc_rat$val, brownian_motion)
mod.brown_motion <- brownian_motion(fit.brown_motion$fit$par)
#smoothing
smooth.brown_motion <- dlmSmooth(lgt_suc_rat$val, mod.brown_motion)
#forecast
T_Ahead <- 3
forecast <- dlmForecast(mod.brown_motion, nAhead = T_Ahead)
forecast.val <- append(dropFirst(smooth.brown_motion$s), forecast$a)
forecast.sd <- append(rep(0, 14), sqrt(as.numeric(forecast$R)))
#lower & upper bound of 90% C.I.
q <- qnorm(0.90)
upper_bd <- forecast.val + forecast.sd * q
lower_bd <- forecast.val - forecast.sd * q
df_forecast <- data.frame(t = seq(1, 17, length = 17)
, observed = append(lgt_suc_rat$val, forecast$a)
, val = forecast.val
, upper_CI = upper_bd
, lower_CI = lower_bd)
plot_forecast <- ggplot(df_forecast, aes(x = t)) +
geom_line(aes(y=val), colour="darkblue") +
geom_ribbon(aes(ymin=lower_CI, ymax=upper_CI), alpha=0.3)
plot(plot_forecast)
#inv_logit
df_forecast_sucrat <- data.frame(t = append(開催, c("H 31-04", "R 1-10", "R 1-10"))
, sucrat = invlgt(forecast.val)
, upper_CI = invlgt(upper_bd)
, lower_CI = invlgt(lower_bd))
#次回(H 31 -04)合格率の予測値
df_forecast_sucrat$sucrat[15]
#0.2365265
#19.4%~28%(0.90CI)
plot_forecast_sucrat <- ggplot(df_forecast_sucrat, aes(x = t, group = 1)) +
geom_line(aes(y=sucrat), colour="darkblue") +
geom_ribbon(aes(ymin=lower_CI, ymax=upper_CI), alpha=0.3)
plot(plot_forecast_sucrat)
平成最後の基本情報技術者試験の合格率推定結果は...
0.2365265 (= 23.6%)となりました.(ただ,90%Confidence Intervalは19.4%~28%とだいぶ幅がありますね.)以下は,推定結果のプロットです(灰色の部分は90%Confidence Interval).
最後に
基本情報技術者試験を今回受ける方,頑張ってください╭( ・ㅂ・)و ̑̑ グッ
もうggらない{dplyr}
目次
- {dplyr}パッケージ
- 使用例(データフレーム)
- 行抽出は
filter()
- 集計関数は
summarise()
- グループ化は
group_by()
- ソートは
arrange()
- 行抽出は
{dplyr}パッケージ
Rパッケージ{dplyr}でデータ整形に使えるパッケージです.毎回ggるのが面倒なのでまとめてみます.github
https://github.com/tidyverse/dplyr も参照(ブラウザ上で公式チートシートからコピペしたい...).
使用例(データフレーム)
R標準で使えるデータセットirisを使います.散布図で様子を確認しましょう.
#散布図 >library('ggplot2') >library('dplyr') >plot<- iris %>% ggplot( aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + geom_point() >plot(plot)
行抽出はfilter()
行の抽出を行うには,filter([dataframe], [condition])
を使う.
#filterの中に条件式を書く >setosa <- iris %>% dplyr::filter(Species == 'setosa') #species列がsetosaの行(50行)が抽出される
集計関数はsummarise()
集計を行うにはsummarise([dataframe], [max | min | mean ...])
を使う.
#集計結果はlistで返される >summary <-iris %>% dplyr::summarise(Sepal_length_max = max(Sepal.Length) , Sepal_length_mim = min(Sepal.Length), ,Sepal_length_mean = mean(Sepal.Length) , Sepal_length_sd = sd(Sepal.Length) ) >summary
結果は以下の通り.
Sepal_length_max | Sepal_length_mim | Sepal_length_mean | Sepal_length_sd | |
---|---|---|---|---|
1 | 7.9 | 4.3 | 5.843333 | 0.8280661 |
グループ化はgroup_by()
group_by([dataframe],[列名])
で指定した列に関するグループ化ができる.
#Species列でグループ化 >summary_btw_spcies <- iris %>% dplyr::group_by(Species) %>% dplyr::summarise(Sepal_length_max = max(Sepal.Length) , Sepal_length_mim = min(Sepal.Length) , Sepal_length_mean = mean(Sepal.Length)) >summary_btw_spcies
結果は以下の通り.
Species | Sepal_length_max | Sepal_length_mim | Sepal_length_mean | |
---|---|---|---|---|
1 | setosa | 5.8 | 4.3 | 5.01 |
2 | versicolor | 7 | 4.9 | 5.94 |
3 | virginica | 7.9 | 4.9 | 6.59 |
ソートはarrange()
arrange([dataframe], [列名])
で列名ソートができます.(デフォルトは昇順.)
#昇順ソート iris_asc <- iris %>% dplyr::arrange(Sepal.Length) #Sepal.Lengthが最も小さい3行 iris_asc %>% head(n = 3) #降順ソート iris_desc <- iris %>% dplyr::arrange(desc(Sepal.Length)) #Sepal.Lengthが最も大きい3行 iris_desc %>% head(n = 3)