AIっておもしろい?

離職者等再就職訓練でAIを勉強するブログです

JRAにはガッカリだ

本日の授業は、

午前は、前回のおさらいと辞書の続き。

午後は、所用のため早退。

 授業は粛々と進んでいきます。

 

なんとなくpythonの読み方が掴めてきたので、

予告通り、webスクレイピングにチャレンジしてみました。

 

 

ご利用は計画的に

まずはプランをたてます。

①ゴールの設定

②サンプルの検索

③目的サイトの解析

④コーディング

 

 

① ゴールの設定

素材としてまず頭に浮かんだのは競馬!

ターゲットはJRAです。

 

過去のレースデータを収集し、傾向を探る

 

といったところをゴールとしましょう。

 

 

② サンプルの検索

続いて、お手本探しです。

まだゼロから書き上げることはできないので、

JRAのサイトをスクレイピングしたよ」

というサイトを探して、サンプルとします。

 

いくつかのサイトをざっと読んでみて、

・標準ライブラリを使っている

・自前クラスを作っている

というサイトが一番勉強になりそうだったので、参考にさせていただきます。

※リンクを貼っていいのかよくわからないので、省略します

 

③ 目的サイトの解析

レース結果のサイトを解析します。

 

ここで問題発生。

同じレースなのに、URL内の番号が年毎に微妙に違う。。

しかもランダム(多分、その年のレース開催順とかなのかな?)。。。

例えばURLの末尾が

 2019年は「2019/015」

 2018年は「2018/014」

 2017年は「2019/014」

みたいに。

 

さらに、2019年から、テーブルのレイアウトが変わってる。

「コーナー通過順位」とか、急に増やさないで!

 

これらを考慮して数年分のデータを収集するとなると、

取得条件がめんどくさいことになりそう。

 

というわけで、

 

目的変更

ゴールを少し変えてみます。

 

当日のレース結果を10分単位で読み込んで、次のレースの予想を立てる

 

これならURLもレイアウトも変わらないはず!

 

が、

当日のレース結果のページは、javaScriptの「doAction」を使ってリクエストする形式になっていて、

URL直叩きじゃアクセスできないっぽい。

 

ハードルが一つ上がったよ。。。

 

チョロっと調べてみましたが、

まだワタクシめには難しいようです。

JRAめ!

おぼえてろ!!

 

 

次回予告

競馬がダメならtotoがあるじゃないか!

次回はtotoのサイトから試合結果をスクレイピングします。

本当にできたのか、乞うご期待。

 

 

気が付いたら今週終わり

週の半ばに休みがあると、一週間が早いですね。
あっという間でした。

今日は、半分が復習、
もう半分で「タプル」「ディクショナリ」と進みます。
順調に、淡々とコレクションの説明が続きます。

「要は慣れ」
なので、100%理解できていない気がしますが、
何度も繰り返して習得することにします。

あ、そうそう。
席替えがありました。
ドラマチックな席になったわけでもないので、
とりあえず、報告のみとさせていただきます。
残念。

週末の目標

ぼちぼち復習もしてゆくつもりですが、
それだけでは面白くないので、
週末を利用して、何かやってみようと思います。

第一候補はWebスクレイピング
これは、特にモジュールを追加しなくても、何とかなりそうな予感。
問題は、
どのサイトを
どういう風にスクレイピングして
どんな結果を出力するか。

まずは、どこかのサンプル改造からですかね。


え?
自然言語処理はどうなったかって?
あれは・・・その・・・
挫折ということで。。。

次回予告

週末に果たしてプログラミングしている余裕があるのか?
そして、ブログを更新できるのか?
あしたは、どっちだ?

もりもり過ぎです

本日、授業で出てきたキーワード的なものを並べてみたいと思います。

・リスト名.append( 値 )
・リスト名.insert( 値 )
・del リスト名[ index ]
・リスト名.remove( 値 )
・リストの代入
・list( リスト名 )でインスタンス生成
・copy( リスト名 )
・リストの連結
・スライス リスト名[ 開始値 : 停止値 : 間隔 ]
・スライスによる逆順処理 リスト名[ : :-1]
・reversed( リスト名 )
・リスト名.reverse()
iter( リスト名 )
・next( イテレータ )
・zip( リスト名1, リスト名2 )
・emurate( リスト名 )
・アンパック
・リスト内包表記 [ 式 for 変数 in リスト名 if 条件 ]
・max( リスト名 )
・min( リスト名 )
・sum( リスト名 )
・sorted( リスト名, reverse=True/False )
・リスト名.sort( reverse=True/False )
・多次元リスト リスト名[ [ 値1, 値2, …], [ 値a, 値b, …], [ 値ア, 値イ, …] ]

計23個

覚えられません。

まず、数が多い。
そして、似たようなスペルで、似たような効果、でも使い方が違う処理がいっぱい。。。
硬化し始めた脳みそでは、なかなか咀嚼できないボリュームです。

このままだと受験生の丸暗記になりそうなので、
とりあえず、整理・分類してみましょう。

大分類

大きく分けて、以下に分けられるようです。
・「list」自体を操作するメソッド・関数
・コレクション「list」の特徴からくる機能・操作

まずは数の多いメソッド・関数に注目してみたいと思います。

リストの関数

最初に目につくのは「リスト名.xxx」という形式です。
調べてみると、これらはリスト固有の関数ということがわかりました。

リスト固有の関数は、「dir( list )」で確認できます。

f:id:papaOro4:20200213211751p:plain
listの関数一覧

上図の中で"__"のついていない、後半部分が固有関数(メソッド)です。
上述した、授業で出てきたもののほかにもいろいろあるようです。

各メソッド毎の処理内容はそれぞれのスペルからおおよそ推測できるとして、
以下の共通する特徴が見えます。
・基本書式:リスト名.メソッド名( 値 )
・listそのものに編集を行う

組み込み関数

続いて、「xxx( リスト名 )」という形式が目立ちます。
これらは組み込み関数といわれるシリーズのようです。

組み込み関数については、以下のサイトに一覧がありました。
docs.python.org

ここにも習っていないものがいくつもありますが、ぼちぼち覚えてゆくとして
以下の共通する特徴が見受けられます。
・基本書式:組み込み関数名( リスト名 )
・リストそのものは編集しない。別のオブジェクトやイテレータを返却する

いわゆる list の機能

「list( リスト名 )でインスタンス生成」「リストの代入」「多次元リスト」
このあたりは、JavaやCの配列、Javaの<List>と似てます。
めんどくさい部分ではありますが、個人的には受け入れやすい感じです。

python の list特有の機能

「リストの連結」「スライス」「アンパック」
このあたりは、pythonのリスト特有の機能と考えられます。
Javaなどと比べて、pythonの自由度が高いといわれる所以でしょう。
個人的には感覚をつかむのに少し苦労しそうです。
(逆に、これに慣れちゃうと、Javaとかでミスりそうで怖いです)

その他①

「del リスト名[ index ]」
こいつは上記まででは分類不能です。
調べてみると”pass”、”assert”、”return” と同類の、単純文といわれるものでした。
単純文とは
「単一の論理行内に収められる文」
とのことで、詳しくは以下に記載されています。
docs.python.org

その他②

「リスト内包表記」
こいつは、上記までの機能とは違い、条件分岐などを駆使した特殊記法といっていいでしょう。
個人的には読みにくいので、パスしたいところですが、
性能もよろしいとのことで、よく使われるとのことです。

ぼちぼち書いて慣れるしかないですね。

次回予告

さて、今回は復習もかねてちょっと真面目に整理してみました。
なかなかハードな状況になってきましたが、このペースでいかないと、
今月中に教科書『やさしいpython』は終わらない気がします。

あしたもこのペースを維持するのか?
それとも、復習回となるのか?
たのしみだなぁ。

習得するためには手を動かすのです

子供のころ
「漢字は書いて覚えろ」
「たくさん本を読んで読解力を上げろ」
と、教えられました。
ノート一冊、まるまる漢字の書き取りをやった、苦い記憶があります。

当時は、アナログだと否定していましたが、
意外と、今になってその正しさを実感しています。

『漢字は書けなくなったけど、プログラムは書けるようになりましたよ、先生』


本日の授業は、ほぼほぼ復習でした。
練習問題の解説、
これまでの教科書の読み返し、
紙ベースのテスト、
テストの解説。

基礎は、手を動かして習得するのです。
わかってる、うん、わかってるよ。



それでも、新しいことがしたいんです!!!



そんなわけで、授業の裏側でpythonで何ができるか、何をしたいかを
ずっと考えていました。
ゴメンナサイ。。。

自然言語処理ってどうなの?

pythonでなにができるのか?
を念頭にネットサーフィンしていると、
自然言語処理」という単語に行きつきました。

自然言語処理とは、
『人間が日常で書いたり話したりする言語を自然言語といいます。
 つまり日本語や英語などが、自然言語に含まれます。
 その自然言語で書かれたテキストデータをコンピューターで扱うための技術を自然言語処理といいます』
(以下より抜粋)
『Pythonで動かして学ぶ 自然言語処理入門』から自然言語処理の概要を紹介:CodeZine(コードジン)

これを発展させたら、自動的に小説とか書けないかな?
売れてる『なろう小説』を機械学習させて、新作を書かせて、一発大儲けできないかな?

などと、安直な妄想をしてみます。

まぁ、一気にそこまでいかないまでも、
自然言語処理でなにができるのかは、
初学者として試してみる価値がありそうです。

自然言語処理導入のハードルは高い

自然言語処理のモジュールはMeCabが良さそうです。
通称名「めかぶ」。
Linux用のubuntu「うぶんつ」といい、pythonの関連名称は変なのが多いです。

授業終わりに、講師に相談したところ、
「重いからおすすめしない」
とのこと。
むむ・・・。

参考になりそうなサイトを漁っていると
「pip install ipykernel
 を実行してね」
あれ?
たしか、pipはcondaとリポジトリが違うから、環境が壊れるの説明が。
むむむ・・・。

自宅環境はPCパワーもストレージも貧弱だし、
授業用の環境を壊すわけにいかないし、
さてどうしたものか。

導入以前につまずいてしまった。

参考)
qiita.com

次回予告

今日の最終コマからコレクションに突入しました。
まずは、Listから。
まだ、障りだから大したことありませんが、
ここからが本番です。
苦手なバブルソートとか、やるのでしょうか?
楽しみだなぁ。

飛び石連休は物忘れに注意

土曜、日曜と休んで、月曜授業からの、祝日の火曜。
となると、いろんなものを忘れてしまいます。

たとえば、ブログとかね。。。
申し訳ございません。


勉強のほうはできるだけ忘れないように、
時間が許す限りプログラムを書いています。

昨日の授業は、物忘れを考慮してあまり進捗させず、
振り返りや練習問題がメインでした。


今回は、
「どんな問題を解いたか」
を記していきたいと思います。

問題1

for文のみを使って1から10までの偶数を表示しましょう。

解説

学習の目的は、for文とrange関数の仕様理解です。
range関数の仕様である
『range(開始位置, 停止位置, 間隔)』
をうまく使います。

解答
for num in range(2, 11, 2) :
    print(num)

出力結果)
2
4
6
8
10

ポイント

開始位置を'2'とすることで、'2'から表示します
停止位置を'11’としないと、'9'までしかカウントが回らないので注意です
間隔を'2'とすることで、偶数のみ'num’に設定します

問題2

以下の図形を出力してください
図)
*-*-*
-*-*-
*-*-*
-*-*-
*-*-*

解説

学習の目的はfor文のネストです。
行単位に処理をするfor文と
文字単位に処理をするfor文の
二重構造で記載することができます。

解答
v = False
for i in range(5) :
    for j in range(5) :
        if v is False  :
            print("*", end="")
            v = True
        else :
            print("-", end="")
            v = False
    print()
ポイント

1行目:フラグを使って状態を管理します
5、8行目:『end=""』とすることで、print文の末尾にデフォルトで入る改行コードを消します
10行目:print文の末尾にデフォルトで入る改行コードを利用して、行単位で処理をするfor文の最後に改行を入れます。

発展

このコードをもっと短くすると、こんな感じ

v = False
for i in range(5) :
    for j in range(5) :
        print(("-" if v else "*"), end="")
        v = not v
    print()
ポイント

4行目:判定式と判定結果を三項演算子を使用して、1行にしています
5行目:『not』を使用することで、bool型(TrueとFalse)を切り替えています

ちなみに、Javaで書くと、こんなカンジでしょうか。
※実行していないので保証しません

boolean v = False ;

for( int i=0 : i < 5 : i++ ){
    for( int j=0 : j < 5 : j++){
        System.out.print( v ? "-" : "*" ) ;
        v = !v ;
    }
    System.out.println() ;
}

次回予告

ついにリストに入ります。
JavaやCでいう、配列というやつです。
下読みしたカンジ、pythonのリストはJavaのListクラスに近い印象です。
ぐんと複雑になる予感がします。
楽しみだなぁ。

演習プログラム

今日で初週が終わります。
授業もだんだん軌道に乗ってきたように思います。
メンバーのキャラクターも、目立つ人はわかるようになってきました。

復習の時間だ

昨日の授業のスピードはやはり早かったようで、
前半はほぼ昨日のおさらいでした。

2進数とか言われても、
いきなりは理解できないですよね。
かくいうワタシもわかっていないところが多いです。
一番わからないのが、使いどころ。
Javaですら使いどころが見えないのに。
C言語なら、ビット演算とかあるので、使いどころが見えるんですけどね。


構造化プログラミング
「if」とか「for」とか関数とか。
やっとプログラミングらしい単語が出てきましたよ。
変数とか文字列も、
一般では使わないし、プログラミングらしくないとは言いませんが、条件分岐やループをしないプログラミングなんて、
「素材の味だけで勝負」
みたいなもんですよ。

さて、改めてJavaと比較すると、ちょっとおもしろいです。
さらっと気が付いた点だけで、以下のようなものがありました。





Java

Python

if

if( 条件式 ){

処理1

} else {

処理2

}

→"{}"でブロックを構成

if 条件式 :

処理1

else :

処理2

}

→インデントでブロックを構成

switch

あり

なし

for

2パターンあり

①一般的なパターン

for( i=0 ; 条件式 : i++ ){

繰り返し処理

}

②いわゆるfor each

for( 型名 変数名 : コレクション名 ){

繰り返し処理

}



Javaでいうfor eachのみ

for 変数 in 繰り返しオブジェクト

繰り返し処理

→インクリメント(i++とか)なし

doWhile

時々使う

なし

全体的に、シンプルになった印象です。

今日の演習の時間には、
以下のようなものを書いて遊んでました。
遊んではいましたが、ちゃんと要素は外してませんよ(笑

#『女子高生好き』

#入力
jen = input("性別を入力してください:")
age = int(input("年齢を入力してください:"))

#判定
if jen == "女" and 14 < age < 18 :
    print("女子高生ですね")
elif jen == "女" and age >=18 :
    print("年増には興味がありません")
elif jen == "女" and age <=14 :
    print("子供には興味がありません")
else :
    print("女以外には興味がありません")
    
#終了処理    
print("処理終了")

次回予告

週末は家の環境をちょっといじりたいです。
息子が許してくれるか、そこがポイントです。
書けることがあったら、ブログも更新したいと思います。

すごいスピード

今日は、ある意味初めてのフル授業。

すごい勢いで、ビュンビュン飛ばします。

ページ数にして40ページぐらい。

 

序盤の基礎で、コードも短いから、

難しくはありませんが、

知らないことがいっぱい。

これは、初学者さんキツかったんじゃないかな?



pythonの基礎

まずは、文字です。

数値と文字列や、進数、エスケープシーケンスなどのキーワードが踊ります。

個人的に興味深かったのは、

「ファイルのパーミッションは8進数」

という話。

言われてみれば、

0, 0, 0

とか

7, 7, 7

だ。

16進数はよく使うし、イメージわくけど、

8進数がこんなところに使われてたとは!

 

 

変数と式

変数関連でも発見多し。

 

pythonでは、変数もオブジェクト扱いで、値が変わる毎にオブジェクトIDが新たにふられる」

属性情報とかを持った別オブジェクト(インスタンス)が生成されて、

ある程度使われなかったら、ガベッジコレクタが回収。

Cのアドレスとはまた違うらしい。

ややこしいな。

 

pythonは型推測です。定義はしません」

つまり、いきなり、何者かわからない奴が、変数として現れるわけ。

厄介な。

同じ変数に、int入れて、str入れて、float入れてとかもできる。

型推測はVBと一緒だから、理解できるけど、

VBも結局は型定義してたけどな。

こんがらがったりしないのかな?

 

あと

doubleがなかったり、

インクリメントがなかったり、

Javaとは違うんだぜ、Javaとは!」

って感じ。

未知の言語って、ワクワクしますね。



おまけ

実践ということで、こんなコード書いてました。

教科書にある練習問題をちょっとアレンジ。

そのため、もうちょっと先で習うことも入ってるけど、

気にしない気にしない(笑

【変数と演算子エスケープシーケンスの演習】

# 入力
tall = float(input("身長を入力してください(cm):\n"))
wait = float(input("体重を入力してください(kg):\n"))

# 判定
bmi = wait/((tall/100)**2)
best = ((tall/100)**2)*22

if bmi < 18.5:
    hantei = "やせ型"
elif bmi < 25:
    hantei = "普通体重"
elif bmi < 30:
    hantei = "肥満(1度)"
elif bmi < 35:
    hantei = "肥満(2度)"
elif bmi < 40:
    hantei = "肥満(3度)"
else:
    hantei = "肥満(4度)"

# 出力
print("\nBMI値は {0:.1f} ".format(bmi) + "【" + hantei + "】"  + "です")
print("ベスト体重は {0:.1f} kgです".format(best))

次回予告

教科書は続くよ、どこまでも。

でも、このペースはどこまで続くのか?

また、

「昨日の復習」

で、半日潰れるのか?

明日も楽しみだなぁ。