ipoデータを取引所のページから作る

 投資において最近ちょっと前にipoした銘柄が気になるようになりました。そこでipoのデータを日本取引所様のページから頂きます。pandasにはread_htmlという素晴らしいメソッドがあり、スクレイピングを頑張ってやらなくてもテーブルデータがとれます。

df = pd.read_html('http://www.jpx.co.jp/listing/stocks/new/00-archives-01.html')[0]

これだけでテーブルは取れます。でも、サイトを見ても分かるようにこれだけでは2行に情報が分かれたデータフレームが出てきてしまいます。

df.head(10)
上場日(上場承認日) 会社名(注3) コード 会社概要(注5) 確認書(注7) 仮条件(円) 公募(千株) 売買単位 市場区分(注4) Iの部(注6) CG報告書 公募・売出価格(円) 売出(千株)(注8) 決算短信(注9)
0 2016/12/27 (2016/11/21) (株)ティビィシィ・スキヤツト 代表者インタビュー 3974 NaN NaN 1,300~1,400 140 100.0 NaN NaN NaN NaN NaN NaN
1 JQスタンダード NaN NaN 1400 80(OA30) NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 2016/12/22 (2016/11/17) フォーライフ(株) 3477 NaN NaN 2,180~2,280 65 100.0 NaN NaN NaN NaN NaN NaN
3 マザーズ NaN NaN 2280 173(OA35) NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 2016/12/22 (2016/11/18) (株)エイトレッド 代表者インタビュー 3969 NaN NaN 1,700~1,800 200 100.0 NaN NaN NaN NaN NaN NaN
5 マザーズ NaN NaN 1800 400(OA90) NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 2016/12/21 (2016/11/15) セグエグループ(株) 代表者インタビュー 3968 NaN NaN 1,600~1,700 180 100.0 NaN NaN NaN NaN NaN NaN
7 JQスタンダード NaN NaN 1700 30(OA31.5) NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 2016/12/21 (2016/11/18) (株)イノベーション 代表者インタビュー 3970 NaN NaN 2,570~2,770 153.6 100.0 NaN NaN NaN NaN NaN NaN
9 マザーズ NaN NaN 2770 45(OA29.7) NaN NaN NaN NaN NaN NaN NaN NaN NaN

なので、取り敢えず偶数と奇数で行列を分け、いるところだけ取り出しその後pd.concat()します。偶数は格好良く使いこなしたい(けど出来ない)lambdaで取ります。

even = list(filter(lambda x: x%2==0, range(len(df.index))))
df1 = df[df.index.isin(even)]

奇数を取るのにはnot isin()という形でとっています。この際には前に~をつければ出来ます。 その後、インデックス名が奇数になっていますので、df1とこのあとpd.concat()するために整数に変更しているところで、また格好良く使いたいと思っているlambdaを使っています。

df2 = df[~df.index.isin(even)]
df2 = df2.ix[:,:5]
df2.columns = ['market', 'del_1','del_2','price','uridashi_1000']
df2 = df2[['market','price', 'uridashi_1000']]
df2.index = list(map(lambda x : x, range(len(df2.index))))

で整えます。全部見せると見苦しいので一部だけにします。で上場日と上場発表日のデータだけ分けたのが下に掲載しています。あとやりたいのは、仮条件の分割と、売出しの分割です。数字自体はsplitで分割できるようになったのですが、それをデータフレームにするときに新規上々でない銘柄の'-‘が邪魔でデータフレーム化出来ません。これを除いたデータフレームを作ろうとしても出来ず、ちょっと中途半端な形で記事を書いています。 あと、はてなcsvアップできないので、取り敢えず、今サイトから取れる2013年までのデータがアップできるところを探したいというのと、データを扱うために、SQLを覚えたいなと思います。

f:id:mazarimono:20170128234745p:plain

追記

列内の数値を分けるときにはreplace()とsplit()を使っています。

df['column_name'].replace('want_to_delete','') # これでいらん文字列が消える
df['column_name'].split('split_point') #これで分けられる
test = df['column_name'].split('(') #上場日と上場発表日を分けるとき