プログラミング Tips

ITエンジニアの雑記ブログ。
IT関連ニュースの考察や、プログラミングに関するTipsの備忘録として…
育児や日常の雑記帳としても、記事を投稿していきます。

プログラミングと日常生活に関する情報を発信しています。

カテゴリ: 開発

Python で XMLをJSONへ変換をやってみた!

WEB APIを使っていると、jsonフォーマットのデータ受信が多いが、稀にXMLフォーマットで出力されることがある。

XMLパーサで解析していけばいいが、Jsonに比べて保存時のサイズが大きくなってしまったり、そもそも解析が面倒だったりする…

よって、XMLフォーマットで受け取ったら、それをjsonフォーマットへ一気に変換してくれないか?と思って調査&実験して見たのまとめ。



環境

  • MacOSX 10.13.3
  • Python 3.6.1

準備:"xmltodict" Pythonモジュールのインストール

PyPiからPythonパッケージをインストールする

pip install xmltodict

変換処理

結論からすると、一発変換は困難だったので辞書型を挟んで2ステップ構成となる

  1. XMLを辞書型へ変換
  2. 辞書型をJSONへ変換

1. XMLを辞書型へ変換

# サンプルXMLファイル:
<employees>
    <person>
        <name value="Alice"/>
    </person>
    <person>
        <name value="Bob"/>
    </person>
</employees>
# サンプルXMLファイル
xml = """
<employees>
    <person>
        <name value="Alice"/>
    </person>
    <person>
        <name value="Bob"/>
    </person>
</employees>
"""

dict = xmltodict.parse(xml)
# 辞書型へのアクセス方法

dict['emploees']
dict['emploees']['person']


2. 辞書型をJSONへ変換

import json

result = json.dumps(result, indent=2)
print(result)
# 出力結果
'{
    "employees": {
        "person": [
                {
                    "name": 
                {
                        "@value": "Alice"
                }
            },
            {
                "name": 
                {
                "@value": "Bob"
                }
            }
        ]
    }
}'

これで変換処理完了。



Python を使って RESAS APIを使ってみた!!

官民のビッグデータが、地域経済分析システム(RESAS)として、無償で公開されている。これを利活用するために、Python で使ってみたので、まとめてみた。



地域経済システム(RESAS)とは…

産業の構造や人の流れなどの官民ビッグデータを集約し、可視化するシステム。

このシステムは、地方創生のための様々な取り組みを情報面から支援するために、経済産業省と内閣官房「まち・ひと・しごと創世本部事務局」が提供している。

自治体職員のかたや、地域活性化に関心を持つ様々な分野の肩によって、効果的な施策の立案・実行・検証のためなどに広く利用されている。

RESAS本家のページはこちら

RESAS活用事例はこちら

APIを使って RESASデータをプログラムから活用する為に…

RESASデータをプログラムから取得するためには、APIを用いることになる。
プログラムを介さず、純粋にデータだけを取得することも可能である。

RESASによって、様々なデータがわかりやすく「見える化」されている一方、自分でデータを加工して独自サービスに組み込んだり、複数のデータを組み合わせて分析に活用したいという要望があがり、これを実現するためにAPIが提供されている。

提供されているAPIのドキュメントは、こちらに公開されている。

尚、この利用にはまず無料の利用登録が必須であり、この結果、API利用のための API KEY が発行される。

Python で API を利用してみた!!

APIを利用するための方法は、公式サイトに丁寧な説明が載っているので割愛する。

Python開発環境構築

今回も、virtualenv環境を用いて開発を行うこととし、環境構築方法に関しては以前の投稿に基づいて準備する。

必要モジュールのインストール

HTTPリクエストのために、下記モジュールをインストールする

pip install requests


APIを使って、都道府県一覧を取得!!

コードを以下に掲載

api_key は、無料利用登録から入手可能。
またAPIエンドポイントは、常に固定となり、取得したいデータに応じて

  • APIパス
  • パラメータ

をセットする。

import json
import requests

def resas_api_request():
    # 無料利用登録で入手できるKEY
    api_key = "xxxxxxxxxx"

    # RESAS API エンドポイント
    url  = "https://opendata.resas-portal.go.jp/"
    # APIパス
    url += "api/v1/prefectures"

    #APIレクエストヘッダー
    head={
            "Content-Type":"application/json",
            "X-API-KEY":api_key
        }

    # RESAS APIへのアクセス→取得
    req=requests.get(url, headers=head)

    # レスポンスの出力
    print(req)

    # json形式のレスポンスを読み取り&デコードして日本語変換
    json_obj=json.loads(req._content.decode('utf-8'))

    print(len(json_obj['result']))
    for i in json_obj['result']:
        print(i)

    return

if __name__=="__main__":
    resas_api_request()

以上で、SARESA データがAPIで取得される。

今回は都道府県コード取得のサンプルとしてが、APIパスやパラメータのセットを変更することで他のデータも取得可能になる。

またAPIで取得したデータを複数組み合わせることで、様々な分析が可能になる。

アイデアによっては、RESASアプリコンテストにエントリーして社会貢献することも意義がある活動になるかもしれない。



エクセルの株価チャートを出力のエラー解消する方法をまとめた!!

エクセルで株価チャートを作ろうとしたが、

この株価チャートを作成するには、出来高、高値、安値、終値の順でシートのデータを配置してください。ラベルには日付または銘柄を使用してください。

というエラーが出てきてかなり悩まされた…

色々調べたが、有効な解決策が見つからなかったので、自己解決した!!

今後の備忘録として…
同じ問題で困っている人のために情報をまとめてみた。



環境

  • MacOSX 10.13.1
  • Excel for Mac 16.10

MacOSX環境で対応したが、WindowsベースのExcel上でも解決方法は変わらない

問題:エラーが出てグラフが出力されない

下記手順に従って、株価チャートを作成してみる

  1. Excelを開く
  2. 下記データを入力
  3. 入力データを全て選択
  4. メニューバーの"挿入" > "グラフの挿入" > "株価"を選択

入力データ

銘柄A
出来高 8000
高値 1000
安値 100
終値 500

下記エラーポップアップが表示される…

この株価チャートを作成するには、出来高、高値、安値、終値の順で
シートのデータを配置してください。ラベルには日付または銘柄を
使用してください。

エクセルのエラーメッセージ

全ての情報を指示通りに並べているにも関わらずのエラー
かなり不思議な現象…

解決策:データを4つ以上並べる!!

銘柄、高値、安値、終値を全て4つ以上入力することで解決できることがわかった。知る範囲では、ドキュメントのどこにも「4つ以上のデータを準備すること」の記載がなかったので理由は定かではないが…

よって、先ほどのデータ生成の部分を下記に修正する

銘柄A ダミーB ダミーC ダミーD
出来高 8000 1000 1000 1000
高値 1000 1000 1000 1000
安値 100 200 200 200
終値 500 500 500 500

この状態であれば、グラフが生成可能!!

最後に、表示されたグラフのプロパティ「データの選択」を開き、ダミーデータを削除する。一度グラフが生成されれば、データを削除しても問題ない!


Python で Redmine RestAPI をコントロール ~インストールと設定~

準備

  • Python 3.6.1
  • "python-redmine"モジュール

インストール

実施環境に、 virtualenv を用いる詳細はここを参照

pip install python-redmine

Redmine でRestAPIを有効にする

管理画面上で"Rest API"の有効チェックボックスをオンにして保存する

Python から Redmineサーバー へのつなぎこみ

Python へ "Python-Redmine" をimportすることでRedmineサーバーへのアクセス準備が整う

from redminelib import Redmine

Redmineサーバーへの繋ぎこみ

redmine = Redmine('https://redmineserver.url')

RedmineサーバーのURLを入力するだけで繋ぎこみは完了!!

Redmine サーバーへの認証

Rest API を用いるためには認証作業が必要
2通りの方法がある

  1. ID, Password
  2. API key
# ID, Pass
redmine = Redmine('https://redmine.url', username='name', password='pass')

# API key
redmine = Redmine('https://redmine.url', key='xxxxxx')

API key はRedmineページにログインして、個人の管理ページ右側ペインボタンをタップすると表示される

Django との親和性

Redmineサーバーへの繋ぎこみの為にコード上に、ID/PassやAPI keyを記述しておくことは推奨しない。例えばDjangoのようなフレームワークを用いた場合、Python-Redminesettings.pyファイルに記述しておくことを推奨する

# settings.py
REDMINE_URL = 'https://redmine.url'
REDMINE_KEY = 'xxxxxxxxxx'
# コード内
from django.conf import settings
from redminelib import Redmine

redmine = Redmine(settings.REDMINE_URL, key=settings.REDMINE_KEY)

次回は、Python-Redmine を用いて関数の使い方をまとめる


Python で日付・時間の間隔を計算してみた!!

Python の datetime モジュールを用いて色々実験してみた。
文字列から日付・時間を生成するとともに、2つの間隔(差)を計算する方法がわからなかったので、調べてみた

前提

  • Python 3.6.1
  • timedateモジュール:日付・時間の管理
  • dateutilモジュール:文字列から日付・時間へ変換

現在の日時を生成する

from datetime import

today = datetime.today()
now = datetime.now()

任意の日時を生成する

from datetime import datetime

d1 = datetime(2018, 1, 1)
d2 = datetime(2018, 2, 1, 12)
d3 = datetime(2018, 3, 1, 11, 15)
d4 = datetime(2018, 4, 1,  5, 30, 59)
d1
datetime.datetime(2018, 1, 1, 0, 0)
d2
datetime.datetime(2018, 2, 1, 12, 0)
d3
datetime.datetime(2018, 3, 1, 11, 15)
d4
datetime.datetime(2018, 4, 1, 5, 30, 59)

文字列を日付・時間に変換

datetimeモジュールのdatetime.strptime() 関数で変換できるが、あまり融通の利くものではないので、dateutilのサブモジュールparser.parser()関数を使う

from dateutil.parser import parse
parse("2017/3/16")
datetime.datetime(2017, 3, 16, 0, 0)

2つの日付・時間を比較

from datetime import datetime, date

d1 = datetime(2017, 12, 5, 8, 25, 10)
d2 = datetime(2016,  5, 11, 12, 10, 10) 

d1 == d2
False
d1 != d2
True
d1 < d2
False
d1 > d2
True

2つの日付・時間の間隔

from datetime import datetime, date

d1 = datetime(2017, 12, 5, 8, 25, 10)
d2 = datetime(2016,  5, 11, 12, 10, 10) 

d1 - d2
datetime.timedelta(572, 72900)

str(d1 - d2)
'572 days, 20:15:00'

# 年数、月数、日数…を個別に計算

from dateutil.relativedelta import relativedelta
delta = relativedelta(d1, d2)
delta
relativedelta(years=+1, months=+6, days=+23, hours=+20, minutes=+15)

delta.years
1

delta.months
6

delta.days
23

↑このページのトップヘ