便利な言語 Python
ライブラリーとかが豊富だし、なにより、Jupyter Notebookという使いやすい実行環境があったり、BinderやGoogle Colabというクラウド上で無料で動かせる環境があったりするので、プログラミングを勉強するにはとてもいいと思います。
Binder Google Colabについては、こちらの記事で
この前、ゴミ出しの日をPythonで少しいじったのですが。。
今回は、CivicTech Forumで出会った稲城市で活動されている方が、「市の子育て情報がエクセルで、しかも。。エクセルをお絵描きのような使い方をしているのでデータを抜き出せない」という話をされていたので、少しデータ整形をしてみようかと。。
確かに。。お絵描きのように使っていますね。。
でも必要なデータは、取り出せそうな形をしていそうです(笑) 小平よりはいいような感じ(笑) ちなみに、うちのメンバーが小平市にPDFで出ている情報を、テキストでほしいと言ったら、「データが改ざんされる恐れがあるため、PDFで出している」とのこと(笑) おい!君たち、公共のデータは、二次利用されるためにあるんじゃないのか?(笑) 今度、子育て関係の市役所の人に、言ってみよう(笑)<ん?(笑)
で。。稲城市用ですが。。作ってみました。
ソースを全部見てもらえば、Jupyter-notebook形式で、コメントも入れているので。。わかるかと(笑)
カレンダーから、日時を指定すれば、場所とイベント内容が取り出せるようにしてあります。
PandasでExcelファイル開けます
こちらが、Google Colabで、実行できるファイルです。Jupyter-notebook形式です。
Githubにも乗せておきました。
で。。。ファイルを開く部分は、たったこれだけです。
import pandas as pd import urllib link = 'https://www.city.inagi.tokyo.jp/kosodate/kodomoshien_center/event/baby.files/201909yanokutiositate.xlsx' socket = urllib.request.urlopen(link) xls = pd.ExcelFile(socket) df = xls.parse(xls.sheet_names[0], header=None, index_col=None) df
Pandas というデータ分析用のライブラリを使います。urllibは、インターネット上のファイルなどを操作するのに必要なライブラリです。
たったこれだけで、エクセルファイルが、Dataframe形式で読み込まれます。
このQuitaの記事が、よくまとまっていると思います。
普通のリストに取り込み
Pythonの場合、文字列っていう概念が、配列そのものになっていたりするので、僕のようなおじさんの頭では、少し頭の切り替えが必要ですが。。Dataframe形式のものから一度、普通のリスト形式に取り込んでおくと、あとは文字列の切り取りだけで、いろいろやれるので、便利です(笑)
evlist=[] cc=df.loc[1] for i in range(2,7): dd=df.loc[i] for j inrange(7): ifstr(dd[j]) != 'nan': evlist.append(str(cc[j]) + " " + str(dd[j])) evlist
もとのファイルは、一週間分で、取り込んだDataframeから1行分を取り出して、日~土の文字列をとりだしています。そして、その次の行から1行づつ取り出し、今度は、その中で nanとなっている文字以外のものを取り出して、曜日を入れて、evlistという配列に追加しているだけです。そうすると、1日から月の終わりの日にちまでの配列evlistができています。
loc とか、ilocとかは、↑のQuitaの記事にも書かれていますね。
ちなみに、nanって何なんや???って思ったのですが、Numpyというデータ分析用のライブラリーでのNAと同じで、何も数字が入っていないよ!っていう意味だそうです。実は、これをif文で削除するのに、少し手間取りました(笑) まさか文字列にして出すと、そのままnanが出てくるとは思わなかったので、これは???なんなん?って(笑)
データの取り出し
配列の操作と、文字列の操作 を 調べるといいです。
ちなみに、「Python 文字列 操作」や 「Python 配列 操作」 などで検索するとQuitaなどの記事が出てくるので、それらを見るといいと思います。このあたりは、自分で調べてみると、勉強になるというか。。僕もいつも調べています(笑)
datedate=17 datedate=datedate-1 print(str(evlist[datedate]).replace('\u3000',' ').split()[1]+" 日") print(str(evlist[datedate]).replace('\u3000',' ').split()[0]+" 曜日") print(str(evlist[datedate]).replace('\u3000',' ').split('\n')[1::])
17日のイベントを取り出したい場合は、この一番下の行を見てみてください。
稲城市のファイルでは、改行(¥n)が、曜日 スペース 日 改行 場所 イベント 改行・・・という組み合わせで入っているので、一個目の¥n以降を取り出すと、場所 イベントの組み合わせで抽出できます。
これって何気に便利で、evlistの17番目(配列は0から始まるので、17日だと16なんですが)を取り出して、不要な文字\u3000(全角スペース)を取り除き、¥n(改行)で区切った2つ目以降を取り出す。っていう意味を、一行で書いています。
str(evlist[datedate]).replace('\u3000',' ').split('\n')[1::]
まぁ、普通の言語でいうと文法みたいなものですね。。
ひとつひとつ勉強してからやろうとすると、勉強するだけで挫折しちゃうかもしれないですが、こんな風に、やりたいことがあって、コピペでプログラミングから始められるのが、Pythonのいいところかもしれません。
イベント情報はiCal形式で出してほしい!!
Pythonからは外れますが、ゴミ出しにせよ、子育てのイベント情報にせよ。。二次利用できると、自分のスマホのカレンダーにコピーしておいたり、各種イベントを整理しているようなサイトなどが、紹介できたりと。。非常に便利になります。Pythonで取り出すなんてことしなくてもよくなる方法は、カレンダーのデータ形式です。iCal(iCalender)という形式があります。
この形式で出してほしいなぁ~~ そうすれば、Googleカレンダーや、iPhoneのカレンダーにすぐに読み込める。
イベントを作成する方は、きっと、多くの人に来てほしいんだと思うんです。
来てくれる方のカレンダーに、ぽちっとするだけで、取り込めるようにしておくといいと思うんですけどねぇ~~(笑)
世の中には、こんなサービスもあるってことは、やはりみんな使ってるのですよね(笑)
追記!!小平市のHPにカレンダーに登録ボタンがあった!!
市の広報室からのタレコミです(笑)<ちゃうか?
なんと!!!
カレンダーに登録ボタン がついていて、これがical形式(.icsファイル)です。Googleカレンダーや、Outlook、Macのカレンダーにも、ダウンロードで読み込めます!!
とってもいい!!
あと少し! ICS形式の中に LOCATION のデータが入っていません。せっかくイベントの詳細ページでは、場所も記入されているので、LOCATIONも入れるといいですね!
あと少し! ひとつづつのイベントで、ひとつのICSファイルになっています。これが、全部一括で読み込めると、いいですね。BEGIN:VEVENTから、END:VEVENTまで羅列して、その前後にBEGIN:VCALENDERとEND:VCALENDERを入れるだけなのに!おしい。
Google Spread Sheetでできないかやってみましたが、IMPORTXMLの数が多くなりすぎるのでその処理まではできませんでした。でも、全部の公開されているICSファイル名(URL)を取り出せるようにしておきました。参考にどうぞ! こちら
あと少し!これゴミのカレンダーもこの形式で出してくれるとありがたいなぁ~~
でも! 市役所の中の人でiCal形式のファイルがわかる人がいて。。ちょっとうれしい(笑)