Python&R: DataHubの使い方とJSONファイル

以前にDataHubの使い方について書きました。

 

総合データサイトDatahubの使用法

 

画像を多く入れているので、われながら時間をかけたなと思います。わかりやす書けていると思いますが、スクリプトの理解が間違っていますので、改めてデータの取得方法を説明し、RとPythonの両方で簡単なグラフを描きます。

 

I.Rで大気中の二酸化炭素量の推移をグラフにする

 

データは次のページにあります。

 

Trends in Atmospheric Carbon Dioxide

 

Data FilesにCSVのrawページへのリンクがあります。ここで必要がデータを取得してグラフを描きます。ただし、クリックすると、コンピュータにダウンロードされる場合があります。ブラウザ側の問題だと思われますが、いまのところ原因は不明です。

rawへのリンクでもダウンロードしたファイルでも、tidyverseなら、read_csv(“”)で簡単にデータを取得できます。

 

 

冒頭にリンクした以前の書き込みでは、ページ末尾の次のスクリプトでデータを取得できると書きましたが、このスクリプトは取得データを順にRのコンソールに表示するものです。

ですから、dataで取得できるのはデータリストの最後のデータ1件のみです。

 

install.packages("jsonlite", repos="https://cran.rstudio.com/")
library("jsonlite")

json_file <- 'https://datahub.io/core/co2-ppm/datapackage.json'
json_data <- fromJSON(paste(readLines(json_file), collapse=""))

# get list of all resources:
print(json_data$resources$name)

# print all tabular data(if exists any)
for(i in 1:length(json_data$resources$datahub$type)){
  if(json_data$resources$datahub$type[i]=='derived/csv'){
    path_to_file = json_data$resources$path[i]
    data <- read.csv(url(path_to_file))
    print(data)
  }
}

 

上のスクリプトは、データのリストの中のCSVのデータのURLからデータを順に読み取って表示せよ、という意味です。

ですから、dataで取り出せるのは最後に読み取られたデータのみです。次にスクリプトの意味を説明します。

 

 

II.JSONファイル

 

Iのスクリプトを理解するためには、先に、JSONファイルの階層構造について理解しておく必要があります。

JSON (JavaScript Object Notation) は、JavaScriptをもとにしていますが、軽量で扱いやすいので、非常に幅広く使用されています。

データというと、これまでは、CSVやExcelファイルで配布されることが多かったですが、これらに比べてJSONは階層構造をもつデータをわかりやすく記述でき、軽量で特定の言語に依存しないことから広く使われるようになりました。

上で読み取ったJSONファイルの中身を見てみましょう。JSONのスクリプトとその階層構造を並べて表示するオンラインのサービスを使用します。

 

http://jsoneditoronline.org/?id=5ba23a9cabd44da1912dcfeccf12b497

 

左側のスクリプトを見ただけではわかりませんが、右側を見ると、いくつもの階層構造を持っているいることがわかります。

IのRのスクリプトの次の式で、このJSONファイルの階層から、typeがderived/csvであるデータを選び出しています。

 

json_data$resources$datahub$type[i]==’derived/csv’

 

選び出されたデータのpath、つまり、URLでデータを取得します。これを選び出したデータごとに繰り返し、Rのコンソールに表示します。ですからdataとして保存されるのは最後のデータ1件です。

 

 

III.Rのtidyverseでグラフを描く

 

tidyverseでデータを縦長にして、ggplot2でグラフを描きます。

縦長といっても列数は変わりませんが、Data列にデータ名をまとめると、ggplot2で色分けや凡例(はんれい)の表示が簡単です。

 

library(tidyverse)
df0 <- read_csv("https://datahub.io/core/co2-ppm/r/co2-mm-mlo.csv")
df0
df0 %>% # df0の
select(Date, Interpolated, Trend) %>% 3行を選んで
gather(key = "Data", value ="Value", -Date) -> df1 # DataとValueにまとめて
# create a mulitple chart
ggplot(df1, aes(x=Date, y=Value, colour=Data)) +
geom_line() +
ggtitle("Trends in Atmospheric Carbon Dioxide")
 

 

 

IV.Pythonでグラフを描く

 

Rと同じグラフを描きます。

Rと同じようにデータを縦長にして、seabornを使用しました。横長のまま、Matplotlibで描画したほうが簡単かもしれません。

Date列は、time seriesに変換します。変換しないとX軸の目盛りにすべての日付が表示されるので、真っ黒になります。time seriesにすると適当に調整されます。

time seriesに変換しても表としては同じですが、データ名.info()でデータ情報をみると、Date列は、次のように表示され、time seriesに変換されていることがわかります。

 

Date 1454 non-null datetime64[ns]

 

全スクリプトは次です。

 

import pandas as pd # handling dataframes
import numpy as np # for time series
import seaborn as sns # creating graphs
# load the data
df0 = pd.read_csv("https://datahub.io/core/co2-ppm/r/co2-mm-mlo.csv")
df0.head()
# drop the three columns
df0_dropped = df0.drop(['Decimal Date', 'Average', 'Number of Days'], axis=1)
df0_dropped.head()
# drop the three columns
df0_dropped = df0.drop(['Decimal Date', 'Average', 'Number of Days'], axis=1)
df0_dropped.head()
# shape from wide to long with melt function in pandas
df0_dropped_long = pd.melt(df0_dropped, id_vars=['Date'],
var_name='Data', value_name='Values')
df0_dropped_long.head()
# convert a "Date" to a datetime column
df0_dropped_long["Date"] = pd.to_datetime(df0_dropped_long['Date'])
# show info
df0_dropped_long.info()
ax = sns.lineplot(x="Date", y="Values", hue="Data", data=df0_dropped_long)

 

 

Please follow and like us:
error

About shibatau

I was born and grown up in Kyoto. I studied western philosophy at the University and specialized in analytic philosophy, especially Ludwig Wittgenstein at the postgraduate school. I'm interested in new technology, especially machine learning and have been learning R language for two years and began to learn Python last summer. Listening toParamore, Sia, Amazarashi and MIyuki Nakajima. Favorite movies I've recently seen: "FREEHELD". Favorite actors and actresses: Anthony Hopkins, Denzel Washington, Ellen Page, Meryl Streep, Mia Wasikowska and Robert DeNiro. Favorite books: Fyodor Mikhailovich Dostoyevsky, "The Karamazov Brothers", Shinran, "Lamentations of Divergences". Favorite phrase: Salvation by Faith. Twitter: @shibatau

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.