投資において最近ちょっと前に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を覚えたいなと思います。
追記
列内の数値を分けるときにはreplace()とsplit()を使っています。
df['column_name'].replace('want_to_delete','') # これでいらん文字列が消える df['column_name'].split('split_point') #これで分けられる test = df['column_name'].split('(') #上場日と上場発表日を分けるとき