이상 기상시 모두 날씨계 API를 두드리는 설
배경
봄도 타케나와의 요즘입니다만, 양춘의 후·봄 난만의 후·꽃 차가운 후·춘면 아키타를 기억하지 말라고 합니다만 어떻습니까?
즉
최근에는 봄을 휩쓸고 갑자기 여름이 된 것은 좋다.
다시 갑자기 덥다고 생각하면 다시 추워지거나 ...
그런 기후로 뉴스 같은 것도 되어 버리면, 그렇네요, 날씨계 API로 뭔가하고 싶어지네요.
그렇기 때문에, 이 기사에서는 예년과 멀어진 기온이거나, 전날과의 기온차가 격했을 때
모두 얼마나 날씨 API에서 무엇을하고 있는지를 보면 좋겠다고 생각하고 기사로했습니다.
정의
이상 기상이란 여기에서는 기상청에서 공개되고 있는 1981~2010년의 30년 평균치로부터 차분이 클수록 이상으로 합니다.
데이터가 있으므로 먼저 이것으로 시도합니다.
htps //w w. 했다. j. . jp/cp ぢふぉ/ㅇ mp/㎃ st/몬_jp응. HTML
날씨 시스템 API를 두드리는 것은 Qiita에서 "날씨"키워드의 검색 결과 수입니다.
사실 날씨 시스템 API 트래픽을 보면 좋겠습니다.
혹은 날씨계 API의 URL로 검색이라도 좋을지도. . .
음, 관심도라는 점에서
QiitaAPI는 여기를 참조했습니다.
htps : // 코 m/아피/v2/도 cs
예상 결과, 목적
최종적으로 엑셀로 그래프로 표시할까 생각합니다.
거기에서 인간의 눈으로 고찰합니다.
구현
환경
노드 v12.3.1
csv v5.1.1 (node 라이브러리)
샘플 코드
index.jsconst request = require("request");
const fs = require("fs");
const csvParse = require("csv-parse/lib/sync");
const csvStr = require("csv-stringify/lib/sync");
// 開発時用にapiからのデータをjsonで保存
// 1時間に60リクエストまでなので
// getQiitaItems("天気", function(data) {
// console.log(data.length);
// fs.writeFile("test.json", JSON.stringify(data));
// });
// return 0;
let outputCsv = [["年月", "平均気温", "Qiita投稿数"]];
// 気象庁からの気温データcsvファイルの読み込み
let tempData = csvParse(fs.readFileSync("temp.csv"));
// qiita記事の天気に関する記事読み込み
// 開発用にローカルjsonファイルの読み込み
let articleData = JSON.parse(fs.readFileSync("test.json"));
// api使用バージョン
// getQiitaItems("天気", function (articleData) {
// });
// 一番古い記事の日付取得
let date = new Date(articleData[articleData.length - 1].created_at);
// 今月まで回す
while (formatDate(date, "yyyy-MM") != "2019-05") {
let temp = getTemperature(date, tempData);
let articleNum = getArticleNum(date, articleData);
console.log(formatDate(date, "yyyy-MM") + " : " + temp + " : " + articleNum);
outputCsv.push([formatDate(date, "yyyy-MM"), temp, articleNum]);
// 次のループは翌月のデータ
date.setMonth(date.getMonth() + 1);
}
// csvファイル出力
fs.writeFileSync("output.csv", csvStr(outputCsv));
function getTemperature(date, tempData) {
// エラー処理したい
let row = tempData[date.getFullYear() - 1897];
return row[date.getMonth() + 1];
}
function getArticleNum(date, articleData) {
let num = 0;
for (let i = 0; i < articleData.length; i++) {
if (articleData[i].created_at.slice(0, 7) == formatDate(date, "yyyy-MM")) {
num++;
}
}
return num;
}
function getQiitaItems(query, cb) {
let resData = [];
let page = 1;
requestQiitaItems(page);
function requestQiitaItems(page) {
let uri =
"https://qiita.com/api/v2/items?page=" + page + "&per_page=100&query=";
uri += encodeURIComponent(query);
console.log("request " + page + "times : uri=" + uri);
request(uri, itemsCb);
}
function itemsCb(err, res, body) {
if (err) {
return err;
}
// console.log(res.headers.link);
const info = JSON.parse(body);
resData = resData.concat(info);
if (info.length < 100) {
cb(resData);
} else {
page++;
requestQiitaItems(page);
}
}
}
// date: 日付オブジェクト
// format: 書式フォーマット
function formatDate(date, format) {
format = format.replace(/yyyy/g, date.getFullYear());
format = format.replace(/MM/g, ("0" + (date.getMonth() + 1)).slice(-2));
format = format.replace(/dd/g, ("0" + date.getDate()).slice(-2));
format = format.replace(/HH/g, ("0" + date.getHours()).slice(-2));
format = format.replace(/mm/g, ("0" + date.getMinutes()).slice(-2));
format = format.replace(/ss/g, ("0" + date.getSeconds()).slice(-2));
format = format.replace(/SSS/g, ("00" + date.getMilliseconds()).slice(-3));
return format;
}
개발시 QiitaAPI를 너무 많이 실행하는 것이므로 첫 번째 댓글을 달고 한 번 JSON에 저장합니다.
날짜 형식 참고: htps : // 즈쿠코로. 이 m / 2017 / 04 / 그럼 ぁ sc pt - 엄청 t. HTML
결과
실행 후 출력되는 "output.csv"를 엑셀 등으로 열어 그래프로 해 보았습니다.
고찰
역시 어드벤트 캘린더의 영향일까요, 우선 눈에 띄는 것은 12월에 투고수가 상당히 증가하네요.
12월을 제외하면, 2017년 6월, 8월의 투고수가 증가하고 있습니다. (파란 막대 그래프) 그 전의 달 5월과 7월이 예년보다 달의 평균 기온이 높아지고 있습니다. (오렌지 선 그래프)
하지만, 2018년 3월도 만큼 평균 기온이 높은 반면에, 그만큼 투고수는 증가하고 있지 않습니다.
2018년 10월도 투고수는 증가하고 있습니다만, 특히 평균 기온은 예년에 가까운 수치입니다.
결과 상관은 별로 보이지 않는 것 같습니다.
좀 더 이런 일이 있었는데, 이것이 더 낫습니다.
이번은 월마다의 예년과의 평균 기온이었습니다만, 어쩌면 전날과의 기온차라도 볼 수 있을지도 모릅니다.
「날씨」의 키워드만이라고 약할까. 기상이라든지 여러가지 바꾸어 볼까(덧붙여서 날씨 태그도 있습니다만, 투고수가...)
Qiita 투고수보다 Twitter 투고수 쪽이. . . .
또, 상관계수도 내도록(듯이) 해 가면, 좀 더 객관적으로 될 수 있었을지도.
chartjs를 이용하면 엑셀 사용하지 않고 완결할 수 있었구나.
파이썬 사용해도 좋다. . .
JSON 파일도 쿼리 이름인지 뭔가 파일 가져 가서, 그 파일이 없으면 API를 두드려 파일 작성 등을 할 수 있다면
역시 설을 보이게 한다고 즐겁네요, 앞으로도 개선해 나가면 좋겠다고 생각합니다.
Reference
이 문제에 관하여(이상 기상시 모두 날씨계 API를 두드리는 설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tkyko13/items/be3ec485776b1e42c330
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
환경
노드 v12.3.1
csv v5.1.1 (node 라이브러리)
샘플 코드
index.js
const request = require("request");
const fs = require("fs");
const csvParse = require("csv-parse/lib/sync");
const csvStr = require("csv-stringify/lib/sync");
// 開発時用にapiからのデータをjsonで保存
// 1時間に60リクエストまでなので
// getQiitaItems("天気", function(data) {
// console.log(data.length);
// fs.writeFile("test.json", JSON.stringify(data));
// });
// return 0;
let outputCsv = [["年月", "平均気温", "Qiita投稿数"]];
// 気象庁からの気温データcsvファイルの読み込み
let tempData = csvParse(fs.readFileSync("temp.csv"));
// qiita記事の天気に関する記事読み込み
// 開発用にローカルjsonファイルの読み込み
let articleData = JSON.parse(fs.readFileSync("test.json"));
// api使用バージョン
// getQiitaItems("天気", function (articleData) {
// });
// 一番古い記事の日付取得
let date = new Date(articleData[articleData.length - 1].created_at);
// 今月まで回す
while (formatDate(date, "yyyy-MM") != "2019-05") {
let temp = getTemperature(date, tempData);
let articleNum = getArticleNum(date, articleData);
console.log(formatDate(date, "yyyy-MM") + " : " + temp + " : " + articleNum);
outputCsv.push([formatDate(date, "yyyy-MM"), temp, articleNum]);
// 次のループは翌月のデータ
date.setMonth(date.getMonth() + 1);
}
// csvファイル出力
fs.writeFileSync("output.csv", csvStr(outputCsv));
function getTemperature(date, tempData) {
// エラー処理したい
let row = tempData[date.getFullYear() - 1897];
return row[date.getMonth() + 1];
}
function getArticleNum(date, articleData) {
let num = 0;
for (let i = 0; i < articleData.length; i++) {
if (articleData[i].created_at.slice(0, 7) == formatDate(date, "yyyy-MM")) {
num++;
}
}
return num;
}
function getQiitaItems(query, cb) {
let resData = [];
let page = 1;
requestQiitaItems(page);
function requestQiitaItems(page) {
let uri =
"https://qiita.com/api/v2/items?page=" + page + "&per_page=100&query=";
uri += encodeURIComponent(query);
console.log("request " + page + "times : uri=" + uri);
request(uri, itemsCb);
}
function itemsCb(err, res, body) {
if (err) {
return err;
}
// console.log(res.headers.link);
const info = JSON.parse(body);
resData = resData.concat(info);
if (info.length < 100) {
cb(resData);
} else {
page++;
requestQiitaItems(page);
}
}
}
// date: 日付オブジェクト
// format: 書式フォーマット
function formatDate(date, format) {
format = format.replace(/yyyy/g, date.getFullYear());
format = format.replace(/MM/g, ("0" + (date.getMonth() + 1)).slice(-2));
format = format.replace(/dd/g, ("0" + date.getDate()).slice(-2));
format = format.replace(/HH/g, ("0" + date.getHours()).slice(-2));
format = format.replace(/mm/g, ("0" + date.getMinutes()).slice(-2));
format = format.replace(/ss/g, ("0" + date.getSeconds()).slice(-2));
format = format.replace(/SSS/g, ("00" + date.getMilliseconds()).slice(-3));
return format;
}
개발시 QiitaAPI를 너무 많이 실행하는 것이므로 첫 번째 댓글을 달고 한 번 JSON에 저장합니다.
날짜 형식 참고: htps : // 즈쿠코로. 이 m / 2017 / 04 / 그럼 ぁ sc pt - 엄청 t. HTML
결과
실행 후 출력되는 "output.csv"를 엑셀 등으로 열어 그래프로 해 보았습니다.
고찰
역시 어드벤트 캘린더의 영향일까요, 우선 눈에 띄는 것은 12월에 투고수가 상당히 증가하네요.
12월을 제외하면, 2017년 6월, 8월의 투고수가 증가하고 있습니다. (파란 막대 그래프) 그 전의 달 5월과 7월이 예년보다 달의 평균 기온이 높아지고 있습니다. (오렌지 선 그래프)
하지만, 2018년 3월도 만큼 평균 기온이 높은 반면에, 그만큼 투고수는 증가하고 있지 않습니다.
2018년 10월도 투고수는 증가하고 있습니다만, 특히 평균 기온은 예년에 가까운 수치입니다.
결과 상관은 별로 보이지 않는 것 같습니다.
좀 더 이런 일이 있었는데, 이것이 더 낫습니다.
이번은 월마다의 예년과의 평균 기온이었습니다만, 어쩌면 전날과의 기온차라도 볼 수 있을지도 모릅니다.
「날씨」의 키워드만이라고 약할까. 기상이라든지 여러가지 바꾸어 볼까(덧붙여서 날씨 태그도 있습니다만, 투고수가...)
Qiita 투고수보다 Twitter 투고수 쪽이. . . .
또, 상관계수도 내도록(듯이) 해 가면, 좀 더 객관적으로 될 수 있었을지도.
chartjs를 이용하면 엑셀 사용하지 않고 완결할 수 있었구나.
파이썬 사용해도 좋다. . .
JSON 파일도 쿼리 이름인지 뭔가 파일 가져 가서, 그 파일이 없으면 API를 두드려 파일 작성 등을 할 수 있다면
역시 설을 보이게 한다고 즐겁네요, 앞으로도 개선해 나가면 좋겠다고 생각합니다.
Reference
이 문제에 관하여(이상 기상시 모두 날씨계 API를 두드리는 설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tkyko13/items/be3ec485776b1e42c330
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(이상 기상시 모두 날씨계 API를 두드리는 설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tkyko13/items/be3ec485776b1e42c330텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)