質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

628閲覧

自作関数の戻り値を自作関数に代入するコードがわかりません

Azzukky

総合スコア9

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/06/03 07:52

編集2020/06/04 05:23

前提・実現したいこと

netkeibaから出走馬の情報をスクレイピングしようと試みています。
自作した関数で得た戻り値(リスト)を、さらに2つの自作した関数に代入したいのです。
3つの関数を1つにまとめてるのもやってみたいです。

発生している問題・エラーメッセージ

関数3は動くようになりましたが、1頭分のデータしか返ってきません。 どこがおかしいのでしょうか?

該当のソースコード

#関数1 import requests import re from bs4 import BeautifulSoup def syusso_list(): #出走する馬のIDを抽出する x = input('Enter race number (1~12):') url = 'https://race.netkeiba.com/race/shutuba.html?race_id=2020050212' + str(x.zfill(2)) html = requests.get(url) html.encoding = 'EUC-JP' soup = BeautifulSoup(html.text, "html.parser") syusso = soup.find('table').find_all('a', attrs = {'href': re.compile('^https://db.netkeiba.com/horse/')}) syusso_list = [] for uma in syusso: horse_id = re.findall(r'\d+', uma['href']) syusso_list.append(horse_id[0]) return syusso_list #関数2 import pandas as pd def scrape_horse_results(syusso_list): horse_results = {} for horse_id in syusso_list: url = 'https://db.netkeiba.com/horse/result/' + horse_id horse_results[horse_id] = pd.read_html(url)[0] return horse_results #関数3 from datetime import datetime as dt def preprocessing(horse_results): processed_horse_results = {} #加工したデータも辞書に格納するようにした for horse_id, df in horse_results.items(): # t_obaraさんにご回答いただいたコード df['レース名2'] = df['レース名'].str.split('(', expand = True)[0] df['レースクラス'] = df['レース名'].str.split('(', expand = True)[1].str[:-1] df['日付2'] = [dt.strptime(i, "%Y/%m/%d") for i in df['日付']] df['コース'] = df['距離'].map(lambda x:str(x)[0]) df['距離2'] = df['距離'].map(lambda x:str(x)[1:]).astype(int) df.drop(['天気', '映像', '頭数', '枠番', 'タイム指数', '通過', 'ペース', '上り','騎手', 'R', '馬場指数', '斤量', 'オッズ', '人気', '馬体重',\ '厩舎コメント', '備考', '賞金', '勝ち馬(2着馬)', 'レース名', '日付', '距離', '馬番'], axis = 1, inplace = True) processed_horse_results[horse_id] = df #horse_idをキーとして辞書に入れる return processed_horse_results

試したこと

関数2(関数1)を実行して、出走馬の戦績を辞書に格納することはできてます。
関数3は t_obara さんに教えていただいたコードに変更しました。

processed_horse_results[horse_id] = {}を作って、辞書にデータを格納するようにしましたが、1頭分しか返ってきません

補足情報(FW/ツールのバージョンなど)

Jupyter Labを使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/03 07:57

ふつーにそう記述したらどうなるんでしょうか
Lhankor_Mhy

2020/06/03 08:00

関数3(関数2(関数1))という書き方で問題ないかと思いますが、どのような問題が起きていますか?
Azzukky

2020/06/03 08:28

関数3に df = horse_results[horse_id] と加筆して、関数3(関数2(関数1))を実行すると、name 'horse_id' is not definedというエラーが出ます。
y_waiwai

2020/06/03 08:30

そのコードを質問に追記してくれませんか
Azzukky

2020/06/03 08:32

y_waiwai様 追記しました。
t_obara

2020/06/03 09:46

「horse_idをどうにかしないとダメです」と言うエラーなのは理解しているのですか? globalや、他の方法で参照する際に工夫してあげてください。
Azzukky

2020/06/03 10:29

そこは理解しています。horse_resultsに馬のIDをキーとして格納したデータを、1頭毎にデータフレームにするにはどうすればよいのかがわからないのです。
t_obara

2020/06/04 02:17

質問から、「1頭毎にデータフレームにするにはどうすればよいのか」を読み取れません。また、それを実現するために、関数3(関数2(関数1))でなければいけないのですか?他の実現方法でも良いのでしょうか。
Azzukky

2020/06/04 02:38

関数1で出走馬のIDをリストとして取り出せます。関数2では、そのIDをキーとして、過去の戦績を辞書に格納しています。 関数3では、それぞれの馬の戦績を、私が使いたいデータのみにスクレイピングして、新たなデータにしようと試みています。 最終的に、各馬のID毎にスクレイピングするコードが書ければ、どんなコードでも結構です。 よろしくお願いいたします。
Lhankor_Mhy

2020/06/04 02:42

horse_id には何が入っている想定なのですか? 1頭だけのデータが取り出せればいい、と読みましたが合っていますか?
Azzukky

2020/06/04 02:50

df = horse_results[horse_id]で想定したのは、関数2で辞書に格納した馬の戦績データです。ここで、一頭ずつデータを取り出して、スクレイピングしたいのです。for文で回せばよいのでしょうか。
Lhankor_Mhy

2020/06/04 03:18

そういうことになるかと思います。
Lhankor_Mhy

2020/06/04 05:24

>#Lhankor_Mhyさんにご回答いただいたコード わたしではないです♪
Azzukky

2020/06/04 05:25

修正しました。
Lhankor_Mhy

2020/06/04 05:44

当方で実行してみたところ、エラーが出ました。 df['レース名'].str.split('(', expand = True)[1] の部分ですが、データを見ると、「3歳未勝利」などが入っており、spilitできていないように見えます。
Azzukky

2020/06/04 05:47

Lhankor_Mhy様 ご協力いただきありがとうございます。 私はレース番号に12を入力してますが、12ですとエラーはでていません。
Lhankor_Mhy

2020/06/04 05:50

なるほど。 早く言って欲しかったですね。
Lhankor_Mhy

2020/06/04 05:53

「1頭分しか返ってきません」は再現しませんでした。 {'2015105008': 開催 着順 馬場 タイム 着差 レース名2 レースクラス 日付2 コース 距離2 0 2東京12 15 良 2:31.8 2.2 目黒記念 G2 2020-05-31 芝 2500 ... 25 2小倉10 6 良 2:04.2 0.6 2歳新馬 None 2017-08-27 芝 2000, '2013102360': 開催 着順 馬場 タイム 着差 レース名2 レースクラス 日付2 コース 距離2 0 2東京12 4 良 2:30.1 0.5 目黒記念 G2 2020-05-31 芝 2500 のように、複数のhorse_idの出力を得ています。
Azzukky

2020/06/04 06:12

Lhankor_Mhy 様 レース番号、もっと早くお伝えすべきでした。申し訳ございません。 上記の戻り値を望んでいたので、コードは問題ないということですね。 私も先ほど画面を見ていて気付いたのですが、一度間違ったコードで関数3を実行したのに、関数2を再実行したりしたために、元のデータが失われていたようです。 お時間いただきましてありがとうございました。
Lhankor_Mhy

2020/06/04 06:36

ご解決されて何よりです。 BAを選出するか、自己解決の手続きをお願いします。
guest

回答2

0

ベストアンサー

手っ取り早くは、

python

1def preprocessing(horse_results): 2 3 df = horse_results[horse_id] 4

horse_resultsは辞書なので、itemsを利用する等良いです。

python

1def preprocessing(horse_results): 2 3 for horse_id, df = in horse_results.items(): 4

投稿2020/06/04 02:56

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Azzukky

2020/06/04 05:25

t_obara 様 ご回答ありがとうございます。 for horse_id, df = in horse_results.items(): の上の行に、辞書で戻り値を受けれるようにコードを書いたのですが、1頭分しか返ってきません。どこがおかしいか、ご指摘いただけると幸いです。
guest

0

NameError: name 'horse_id' is not defined

horse_idという変数が定義されてない、というエラーです
この変数はなにが入っている(つもり)んでしょうか

#関数の呼び出しとは関係ないですね

投稿2020/06/03 08:39

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Azzukky

2020/06/03 10:26

hourse_idが定義されていないというエラーの意味は理解できているのですが、関数3でどう定義して良いのかがわかりません。 関数2で得た10頭以上の馬のデータを、1頭ごとにデータフレームとして処理したいのですが、キーをどう使えばよいのかがわからないのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問