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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

pandas

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

Q&A

解決済

1回答

3250閲覧

定義した関数を別ファイルで読み込む際、.ipynbと.pyで挙動が違う&読み込めない

8960

総合スコア108

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

pandas

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

0グッド

0クリップ

投稿2022/02/10 12:29

編集2022/02/10 13:58

前提・実現したいこと

データフレームを作成する作業を関数化して、別ファイルで簡易的に読み込めるようにしたいです。

まずデータフレームを作成する関数を定義するファイルを.ipynbで作成していましたが、完成したのちに、後で読み込むときに.ipynbファイルで定義した関数は読み込めない(読み込めるがハードルが高い?)ことがわかり、同じものを.pyファイルでも作成しました。

よっしゃと思い、test_function.pyで定義した関数をtest_import.ipynb内で読み込もうとしましたが、ファイル自体は読み込むものの関数の読み込みでエラーが発生しました(NameError: name 'test' is not defined)。
原因は何でしょうか?.py→.ipynbの読み込みはできないのでしょうか?

また、関数を定義したファイル内で同様のことを行うと.ipynbではうまくいきますが、.pyではエラーが発生します(NameError: name 'df' is not defined)。この違いは何なのでしょうか?

3つのファイルは同じディレクトリ内にあります。

ご教授の程、よろしくお願いします。

追記:
test_import.ipynbでのインポートの件、解決しました。
import test_function
df = test_function.test()
print(df)

test()の前にtest_functionを入れるの怠っておりました。

.pyと.ipynbでの挙動が違う件は解決しておりません。

test_function.ipynb

Python

1#test function 2def test(): 3 import pandas as pd 4 import numpy as np 5 pd.options.display.float_format="{:.1f}".format 6 start,end = "2021/4/1","2021/4/30" 7 dates = pd.date_range(start=start,end=end,freq="D") 8 players = [f"Player{i}"for i in range(1,6)] 9 10 N = 200 11 dates = np.random.choice(dates,size=N) 12 dates.sort() 13 players=np.random.choice(players,size=N) 14 15 df = pd.DataFrame({ 16 "Date": dates, 17 "Player": players, 18 "Speed": np.random.sample(N) * 100.0, 19 "Angle": np.random.sample(N) * 40.0 - 20.0, 20 "Efficiency": np.random.sample(N) * 100.0, 21 }) 22 23 dfx = df.groupby(["Player"]).agg({ 24 "Player":"count", 25 "Speed":[np.mean], 26 "Angle":[np.mean,np.std], 27 "Efficiency":[np.mean] 28 }) 29 30 #Join columns name 31 dfx.columns = [" ".join(pair) for pair in dfx.columns] 32 33 return dfx 34 35df = test() 36print(df) 37

結果

Player count Speed mean Angle mean Angle std Efficiency mean Player Player1 29 44.4 -2.4 9.9 49.1 Player2 35 46.9 -0.6 12.6 57.7 Player3 52 44.1 -0.4 12.1 52.9 Player4 45 52.7 -1.6 12.2 57.1 Player5 39 48.4 -4.2 11.9 56.0

test_function.py

Python

1#test function 2def test(): 3 import pandas as pd 4 import numpy as np 5 pd.options.display.float_format="{:.1f}".format 6 start,end = "2021/4/1","2021/4/30" 7 dates = pd.date_range(start=start,end=end,freq="D") 8 players = [f"Player{i}"for i in range(1,6)] 9 10 N = 200 11 dates = np.random.choice(dates,size=N) 12 dates.sort() 13 players=np.random.choice(players,size=N) 14 15 df = pd.DataFrame({ 16 "Date": dates, 17 "Player": players, 18 "Speed": np.random.sample(N) * 100.0, 19 "Angle": np.random.sample(N) * 40.0 - 20.0, 20 "Efficiency": np.random.sample(N) * 100.0, 21 }) 22 23 dfx = df.groupby(["Player"]).agg({ 24 "Player":"count", 25 "Speed":[np.mean], 26 "Angle":[np.mean,np.std], 27 "Efficiency":[np.mean] 28 }) 29 30 #Join columns name 31 dfx.columns = [" ".join(pair) for pair in dfx.columns] 32 33 return dfx 34 35df = test() 36print(df) 37

結果

NameError: name 'df' is not defined

test_import.ipynb

Python

1import test_function 2df = test() 3print(df)

結果

NameError: name 'df' is not defined

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

VSCode、python3.9

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

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

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

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

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

y_waiwai

2022/02/10 15:07

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください
8960

2022/02/10 23:21 編集

以下、test_function.pyをデバックしたときのPythonターミナルに表示された分です。 Warning: This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load. To activate this environment please see https://conda.io/activation Type "help", "copyright", "credits" or "license" for more information. >>> print(df) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'df' is not defined です。警告部分は問題ないと認識していましたがどうでしょうか?
TakaiY

2022/02/11 05:56

それは、「関数を定義したファイル内で同様のことを行うと.ipynbではうまくいきますが、.pyではエラーが発生します(NameError: name 'df' is not defined)」の内容ですか? であれば、pyファイルの実行のしかたが間違えています。
8960

2022/02/11 07:31

ご指摘の通り、実行の方法が間違ってました。 VSCodeにて.pyファイルも.ipynbの時と同じように、Shift+enterで実行していました。 「実行とデバッグ」のボタンをクリックしたら正しく表示されました。 .pyファイルの扱い、しっかり勉強していきたいと思います。 みなさま、ありがとうございました。
guest

回答1

0

自己解決

.pyと.ipynbの挙動の違い
→.pyファイルの実行方法の誤り

importした関数が実行できない
→モジュール名の欠損

投稿2022/02/11 07:36

8960

総合スコア108

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問