前提・実現したいこと
データフレームを作成する作業を関数化して、別ファイルで簡易的に読み込めるようにしたいです。
まずデータフレームを作成する関数を定義するファイルを.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

回答1件
あなたの回答
tips
プレビュー