이상 기상시 모두 날씨계 API를 두드리는 설

19726 단어 날씨QiitaAPINode.js

배경



봄도 타케나와의 요즘입니다만, 양춘의 후·봄 난만의 후·꽃 차가운 후·춘면 아키타를 기억하지 말라고 합니다만 어떻습니까?



최근에는 봄을 휩쓸고 갑자기 여름이 된 것은 좋다.
다시 갑자기 덥다고 생각하면 다시 추워지거나 ...
그런 기후로 뉴스 같은 것도 되어 버리면, 그렇네요, 날씨계 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.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를 두드려 파일 작성 등을 할 수 있다면

역시 설을 보이게 한다고 즐겁네요, 앞으로도 개선해 나가면 좋겠다고 생각합니다.

좋은 웹페이지 즐겨찾기