#26414์์ ์ฐ๋ฆฌ๋ pandas ํ๋กํ ๋ชจ๋์ ๋ค๋ฅธ ๋ฐฑ์๋์ ํ์ฌ matplotlib ๋ฐฑ์๋๋ฅผ ํธ์ถํ ์ ์๋ ์ผ๋ฐ ํ๋กํ ํ๋ ์์ํฌ๋ก ๋ถํ ํ์ต๋๋ค. ์์ด๋์ด๋ ๋ค๋ฅธ ๋ฐฑ์๋๊ฐ ๋ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์๊ณ pandas ์ฌ์ฉ์๊ฐ ๊ณตํต API์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
ํ์ฌ matplotlib ๋ฐฑ์๋์ ์ํด ์ ์๋ API๋ ๋ค์์ ๋์ด๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ์ง๋ง ์ด API๋ ์๋ง๋ ๋จ์ํ๋ ์ ์์ต๋๋ค. ๋ค์์ ์ง๋ฌธ/์ ์ ๋ชฉ๋ก์ ๋๋ค.
API์ ๋ณด๊ดํ ๋
ผ์์ ์ฌ์ง๊ฐ ์๋ ๋ฐฉ๋ฒ( Series.plot(kind='line')
... ๊ธฐ๋ฅ ์ ๊ณต):
ํฌ๋์์ ์ ๊ณต๋๋ ํ๋กํ
๊ธฐ๋ฅ(์: pandas.plotting.andrews_curves(df)
)
๊ทธ๊ฒ๋ค์ API์ ์ผ๋ถ์ด๊ณ ๋ค๋ฅธ ๋ฐฑ์๋๋ ๊ตฌํํด์ผ ํฉ๋๊น? .plot
ํ์(์: DataFrame.plot(kind='autocorrelation')
...)์ผ๋ก ๋ณํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๊น? API๋ฅผ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ํ์ฌ ๋ชจ๋๋ก ์ด๋ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๊น?
์ ๊ฑฐํ ์ ์๋ ์ค๋ณต ๋ฐฉ๋ฒ:
boxplot
๊ฒฝ์ฐ ํ์ฌ ํ๋กฏ์ ์์ฑํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค(์ฃผ๋ก ๋์ผํ ์ฝ๋ ํธ์ถ).
DataFrame.plot.boxplot()
DataFrame.plot(kind='box')
DataFrame.boxplot()
pandas.plotting.boxplot(df)
๊ฐ์ธ์ ์ผ๋ก ๋๋ 4๋ฒ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๊ณ 3๋ฒ์ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ์ต์ํ ๋ฐฑ์๋์์ ๋ณ๋์ boxplot_frame
๋ฉ์๋๋ฅผ ํ์๋ก ํ์ง ์์ง๋ง BoxPlot
(3๋ฒ ๋๊ธ์ ๊ฒฝ์ฐ ๋์ผํ hist
)์ ์ ์ฉ๋ฉ๋๋ค.
boxplot_frame_groupby
๊ฒฝ์ฐ ์์ธํ ํ์ธํ์ง ์์์ง๋ง BoxPlot
์ฌ์ฌ์ฉํ ์ ์๋์ง ํ์คํ์ง ์์ต๋๊น?
๋ณํ๊ธฐ๋ฅผ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ:
๋ค๋ฅธ ๋ฐฑ์๋์๋ ์๋ฏธ๊ฐ ์์ต๋๊น?
pandas 0.23์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ์ ๊ฑฐ ์์ :
์ด๋ฌํ ๊ฐ ๊ธฐ๋ฅ์ด ์ค์ ๋ก ๋ฌด์์ ํ๋์ง ๋ณด๋ ค๋ฉด @liirusuk์ ์ด ๋ ธํธ๋ถ์ด ์ ์ฉํ ์ ์์ต๋๋ค. https://github.com/python-sprints/pandas_plotting_library/blob/master/AllPlottingExamples.ipynb
CC: @pandas-dev/pandas-core @tacaswell , @jakevdp , @philippjfr , @PatrikHlobil
๋๋ ์ค์ ๊ฐ๋ฅํ ๋ฐฑ์๋ API์์ ์๊ธฐ ์๊ด๊ณผ ๊ฐ์ ๊ฒ์ ์ ์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
df.boxplot ๋ฐ hist์ ๊ฐ์ ๊ฒ์ .plot API์ ์ฝ๊ฐ ๋ค๋ฅธ ๋์์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋จ๊ฒจ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐฑ์๋ API์ ์ผ๋ถ๋ก ๋ง๋๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
๋ค์์ ๋ช ๋ฌ ์ ์ ์ ์๋ ๋ฐฑ์๋ API์ ๋ํ ๋์ ์์์ ๋๋ค. https://github.com/TomAugspurger/pandas/commit/b07aba28a37b0291fd96a1f571848a7be2b6de8d
๋๋ ์ ์ด๋ hvplot
(๋๋จธ์ง๋ ํ์ธํ์ง ์์)๊ฐ ์ด๋ฏธ andrews_curves
, scatter_matrix
, lag_plot
์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๋ ์ ์ ์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ..
๋ชจ๋ ๋ฐฑ์๋๊ฐ ์ด๋ฅผ ๊ตฌํํ๋๋ก ๊ฐ์ ํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ ์ ํํ ๋ฐฑ์๋๊ฐ ์ด๋ฅผ ๊ตฌํํ๋์ง ํ์ธํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก matplotlib ํ๋กฏ์ ์ฌ์ฉํ ์ ์์ต๋๊น?
boxplot
๋ฐ hist
์ ํํ ๋์ผํ๊ฒ ๋์ํ๋ค๊ณ ๊ฐ์ ํ์ง๋ง Series.hist()
๋ํ ๋ฐ๋ก ๊ฐ๊ธฐ Series.plot.hist()
์์์ต๋๋ค. "๋ฐ๋ก ๊ฐ๊ธฐ"๋ ํ๋กฏ ๊ทธ๋ฆฌ๋๋ฅผ ํ์ํ์ง๋ง ๊ทธ ์ธ์๋ ์ฐจ์ด์ ์ ๋ณด์ง ๋ชปํ์ต๋๋ค.
IMO, ์ด ์ต์
์ ์ฃผ์ ๊ฐ์ .plot
๋ค์์คํ์ด์ค์
๋๋ค.
์ฌ์ฉ์๊ฐ hvplot์ Andrew's ๊ณก์ ํ๋กฏ์ ์ํ๋ฉด ํจ์๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
hvplot์์ ๋ฐ์ดํฐ ํ๋ ์์ ์ ๋ฌํ์ญ์์ค.
2019๋ 6์ 9์ผ ์ผ์์ผ ์ค์ 7์ 17๋ถ์ Marc Garcia [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋๋ ์ ์ด๋ hvplot(ํ์ธํ์ง ์์
๋๋จธ์ง)๋ ์ด๋ฏธ andrews_curves์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
scatter_matrix, lag_plot,...๋ชจ๋ ๋ฐฑ์๋๊ฐ ์ด๋ฅผ ๊ตฌํํ๋๋ก ๊ฐ์ ํ๊ณ ์ถ์ง ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
์ ํํ ๋ฐฑ์๋๊ฐ ์ด๋ฅผ ๊ตฌํํ๋์ง ํ์ธํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก
matplotlib ํ๋กฏ?๋๋ boxplot๊ณผ hist๊ฐ ์ ํํ ๋์ผํ๊ฒ ํ๋ํ๋ค๊ณ โโ๊ฐ์ ํ์ง๋ง,
Series.plot.hist()์ ๋ํ ๋ฐ๋ก ๊ฐ๊ธฐ Series.hist(). "๋ฐ๋ก ๊ฐ๊ธฐ"๋ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
ํ๋กฏ ๊ทธ๋ฆฌ๋, ํ์ง๋ง ๊ทธ ์ธ์๋ ์ฐจ์ด์ ์ ๋ณด์ง ๋ชปํ์ต๋๋ค.โ
์ธ๊ธ๋ ํ์ ์ํด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/pandas-dev/pandas/issues/26747?email_source=notifications&email_token=AAKAOIRLJHBMXMXKK2IG2NDPZTYFPA5CNFSM4HWIMEK2YYY3PNVWWissue3TUL52HS4DFVEXG43VMVBW63
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAKAOISDHL6H7PVOOJAQXELPZTYFPANCNFSM4HWIMEKQ
.
๊ทธ๊ฒ ๋ง์ด ๋๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ฉด pandas.plotting.andrews_curves
๋์ pandas.plotting.matplotlib.andrews_curves
๋ก ์ด๋ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@TomAugspurger ์ข ๋ ์์ธํ ํ์ธํด์ผ ํ๋๋ฐ https://github.com/TomAugspurger/pandas/commit/b07aba28a37b0291fd96a1f571848a7be2b6de8d ์์ ๊ตฌํํ API๊ฐ ๋ ๋ง์ด ๋๋ ๊ฒ ๊ฐ์์. #26753์ด ๋๋๋ฉด ์์
ํ๊ฒ ์ต๋๋ค. ๋ํ andrews_curves
, scatter_matrix
... ๋ฅผ .plot()
๊ตฌ๋ฌธ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง ์คํํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ์ฌ๋(์ ํฌ , ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ฌ์ฉ์).
ํ๋กํ ๊ธฐ๋ฅ์ ์ ๋ฌ๋ ์ถ๊ฐ kwargs์ ๋ํ ์๋๋ ๋ฌด์์ ๋๊น? ์ถ๊ฐ ๋ฐฑ์๋๊ฐ ๋ชจ๋ matplotlib ์คํ์ผ ํ๋กฏ ์ฌ์ฉ์ ์ ์ ๊ธฐ๋ฅ์ ๋ณต์ ํ๋ ค๊ณ ์๋ํด์ผ ํฉ๋๊น, ์๋๋ฉด ํน์ ๋ฐฑ์๋์์ ์ฌ์ฉํ๋ ํค์๋์ ํด๋นํ๋ ํค์๋๋ฅผ ์ ๋ฌํ๋๋ก ํ์ฉํด์ผ ํฉ๋๊น?
์ฒซ ๋ฒ์งธ ์ต์ ์ ์ด๋ก ์์ผ๋ก๋ ์ข์ง๋ง ๋ชจ๋ ๋น-matplotlib ํ๋กํ ๋ฐฑ์๋๊ฐ ๋ณธ์ง์ ์ผ๋ก ์์ ํ์ง ์์ ๊ธด ๊ผฌ๋ฆฌ์ ๋นํธํ์ฑ์ ๊ฐ์ง ์์ฒด matplotlib ๋ณํ ๋ ์ด์ด๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค(mpld3 ์์ฑ์ ์๋ํ ์ฌ๋์ผ๋ก์์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๋ช ๋ ์ ).
๋ ๋ฒ์งธ ์ต์ ์ ํธํ์ฑ์ ๊ด์ ์์ ๋ณผ ๋ ๊ทธ๋ค์ง ์ข์ง ์์ง๋ง ๋ณด๋ค ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋์น๋ฅผ ๊ฐ์ง๊ณ ๋ค๋ฅธ ๋ฐฑ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ๋ค์ ๊ฐ์ง๊ณ ๋ฌด์์ ํ๋๋๋ ๋ฐฑ์๋์ ๋ฌ๋ ค ์๋ค๊ณ ์๊ฐํฉ๋๋ค. 100% ๋ฌ์ฑ
๋ฐฑ์๋ ๊ฐ์ ํธํ์ฑ์ ์ค์ ๋ก ์คํ ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
๋ฐํ ์ ํ์ด ๋ ์ด์ matplotlib ์ถ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ
์ฐ๋ฆฌ๋ ๋ฐํ ์ ํ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ๋ฐฑ์๋๊ฐ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ๋ฅํ ๋ชจ๋ ํค์๋ ์ธ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค๋ก ๊ตฌ๋ถ๋ ค์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ํฌ๋๋ **kwargs
๊ฐ
๊ธฐ๋ณธ ํ๋กํ
์์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ์ํ๋ ๋๋ก ๋ฌด์์ด๋ ํ ์ ์์ต๋๋ค.
๊ทธ๋ค์.
2019๋
6์ 10์ผ ์์์ผ ์ค์ 10:42 Jake Vanderplas [email protected]
์ผ๋ค:
์๋ชจ์ ์ ๋ฌ๋ ์ถ๊ฐ kwargs์ ๋ํ ์๋๋ ๋ฌด์์ ๋๊น?
๊ธฐ๋ฅ? ์ถ๊ฐ ๋ฐฑ์๋๊ฐ ๋ณต์ ๋ฅผ ์๋ํด์ผ ํ๋ ๊ฒฝ์ฐ
๋ชจ๋ matplotlib ์คํ์ผ ํ๋กฏ ์ฌ์ฉ์ ์ ์์ ๊ธฐ๋ฅ, ๋๋
ํน์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ํค์๋์ ํด๋นํ๋ ํค์๋๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
๋ฐฑ์๋?์ฒซ ๋ฒ์งธ ์ต์ ์ ์ด๋ก ์ ์ผ๋ก๋ ์ข์ง๋ง ๋ชจ๋
๋ณธ์ง์ ์ผ๋ก ์์ฒด matplotlib๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๋น-matplotlib ํ๋กํ ๋ฐฑ์๋
๊ธด ๊ผฌ๋ฆฌ๋ฅผ ๊ฐ์ง ๋นํธํ์ฑ์ด ์๋ ๋ณํ ๋ ์ด์ด
๋ณธ์ง์ ์ผ๋ก ๊ฒฐ์ฝ ์์ ํ์ง ์๋ค(๋๊ตฐ๊ฐ๋ก์์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด
๋ช ๋ ์ ์ mpld3์ ๋ง๋ค๋ ค๊ณ ์๋ํ์ต๋๋ค).๋ ๋ฒ์งธ ์ต์ ์
ํธํ์ฑ์ด ์์ง๋ง ๋ค๋ฅธ ๋ฐฑ์๋๊ฐ ๋ ๋ง์
ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋์น.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/pandas-dev/pandas/issues/26747?email_source=notifications&email_token=AKAOIS3IBV4XSSY7BPSCF3PZZY5LA5CNFSM4HWIMEK2YY3PNVWWK3TUL52HS4DFVEXG43VMXVBW
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAKAOIQ3GYOGAPUZ4LSNK2DPZZY5LANCNFSM4HWIMEKQ
.
์ด๋ฆฌ์์ ์ง๋ฌธ์ด๋ผ๋ฉด ์ฃ์กํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ํต์กฐ๋ฆผ ํ๋กฏ ๊ทธ๋ฃน์ธ ํ๋กํ "API"๋ฅผ ์ ์ํ๋ฉด ๋ชจ๋ ๋ฐฑ์๋๊ฐ ๊ฑฐ์ ๋์ผํ ์ถ๋ ฅ์ ์์ฑํ์ง ์์๊น์? ์ด๊ฒ์ ์ด๋ค ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ฑํํ๊ธฐ ์ํ ๊ฒ์ ๋๊น? ๋ฒ ๊ฐ ์์ถ์ ์์๊ฒ ํ๋ค์ ๊ฐ์ ๊ฒ?
๋ชจ๋ ๋ฐฑ์๋๊ฐ ๊ฑฐ์ ๋์ผํ ์ถ๋ ฅ์ ์์ฑํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ณ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด, matplotlib๋ ์ ์ ์ฐจํธ์๋ ์ ๋ง ๋ฐ์ด๋์ง๋ง ์ด์ ๊ฐ๋ฅํ ๋ํํ ์ฐจํธ๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
ํํธ, ๋ณด์ผ(bokeh), ์ํ ์ด(altair) ๋ฑ. ๋ํํ ์ฐจํธ์๋ ํ๋ฅญํ์ง๋ง ์ ์ ์ฐจํธ์ ๋ํด์๋ matplotlib๋งํผ ์ฑ์ํ์ง ์์ต๋๋ค.
๋์ผํ API๋ก ๋ ๋ค ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ํฐ ์ฅ์ ์ด ๋ ๊ฒ์ ๋๋ค.
์ฒซ ๋ฒ์งธ ์ต์ ์ ์ด๋ก ์์ผ๋ก๋ ์ข์ง๋ง ๋ชจ๋ ๋น-matplotlib ํ๋กํ ๋ฐฑ์๋๊ฐ ๋ณธ์ง์ ์ผ๋ก ์์ ํ์ง ์์ ๊ธด ๊ผฌ๋ฆฌ์ ๋นํธํ์ฑ์ ๊ฐ์ง ์์ฒด matplotlib ๋ณํ ๋ ์ด์ด๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค(mpld3 ์์ฑ์ ์๋ํ ์ฌ๋์ผ๋ก์์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๋ช ๋ ์ ).
๋ํ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ Matplotlib๋ฅผ ๊ณ ์ ํฉ๋๋ค. ํฌ๋๊ฐ ๋
ธ์ถํ๊ณ ์ถ์ ์คํ์ผ ๋
ธ๋ธ๋ฅผ ์ ์ธํ๊ณ ๋ฐฑ์๋ ๊ตฌํ์ด ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ถ๋ฅํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋งน๋ชฉ์ ์ผ๋ก **kwargs
๋ฅผ ์ ๋ฌํ์ง _not_ ๋์ ๋ฐํ๋ ๊ฐ์ฒด๊ฐ ์ฃผ์ด์ง ๋ฐฑ์๋๊ฐ ์ฌํ ์คํ์ผ ์ฌ์ฉ์ ์ ์๋ฅผ ์ํํ ์ ์๋๋ก "์ฌ๋ฐ๋ฅธ ๊ฒ"์ธ์ง ํ์ธํ๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, matplotlib๋ ์ ์ ์ฐจํธ์๋ ์ ๋ง ๋ฐ์ด๋์ง๋ง ์ด์ ๊ฐ๋ฅํ ๋ํํ ์ฐจํธ๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
@jakevdp ๊ฐ์ฌ
์ด ํน์ ๊ธธ์ ๋๋ฌด ๋ฉ๋ฆฌ ๊ฐ๊ธฐ ์ ์ ๋์ ์๋ฃจ์ ์ด ์์ต๋๋ค.
์ด์ ํฌ๋ ํ๋กํ API๋ฅผ ์ฌ์์ผ๋ก ์ ์ธํ๊ณ ๋น์ฃผ์ผ๋ฆฌ์ ์ด์ ํจํค์ง์ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํํ๋๋ก ์์ฒญํ๋ ๋์ ํ๋กฏ์ ์ค๊ฐ ํํ(์: vega JSON ํ์ผ)์ ์์ฑํ๊ณ ๋ฐฑ์๋๊ฐ ์ด๋ฅผ ์ ๋ ฅ์ผ๋ก ๋์์ผ๋ก ์ง์ ํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Vega/Vega-lite ๋ ํ๋์ ์ด๊ณ ํ๋ฆฝ๋ ๊ฐ๋ฐฉํ JSON ๊ธฐ๋ฐ ๋น์ฃผ์ผ๋ฆฌ์ ์ด์ ์ฌ์ ์ธ์ด๋ก์ ๋ช ๋ ๋์ ์ค๊ณ ๋ฐ ๊ตฌํ์ ํฌ์ ํ์ผ๋ฉฐ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ๊ธฐ์กด ๋๊ตฌ๋ ์ด๋ฌํ ๋ชฉ์ ์ ์ํด ๋ช ์์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. . (๊ทธ๋ฅ ํ์ง ๋ง์ธ์ ).
frontend->IR->backend
์ปดํ์ผ๋ฌ์ฒ๋ผ ์ค๊ณ๋์์ต๋๋ค.
3๊ฐ ์ด์์ ํจํค์ง๊ฐ ์ด๋ฏธ API๋ฅผ ๊ตฌํํ๊ณ ์์ต๋๋ค. ํฌ๋๊ฐ ํด์ผ ํ ์ผ์ ๋ฐฑ์๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ฌ์ฉ์ ๋ฌธ์ํํ๋ ์ต์ ์ ์ ๊ณตํ๋ ๊ฒ๋ฟ์ ๋๋ค.
2019๋ 6์ 15์ผ 16:28์ pilkibun [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์๋ฅผ ๋ค์ด, matplotlib๋ ์ ์ ์ฐจํธ์๋ ์ ๋ง ๋ฐ์ด๋์ง๋ง ์ด์ ๊ฐ๋ฅํ ๋ํํ ์ฐจํธ๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
@jakevdp ๊ฐ์ฌ
์ด ํน์ ๊ธธ์ ๋๋ฌด ๋ฉ๋ฆฌ ๊ฐ๊ธฐ ์ ์ ๋์ ์๋ฃจ์ ์ด ์์ต๋๋ค.
์ด์ ํฌ๋ ํ๋กํ API๋ฅผ ์ฌ์์ผ๋ก ์ ์ธํ๊ณ ๋น์ฃผ์ผ๋ฆฌ์ ์ด์ ํจํค์ง์ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํํ๋๋ก ์์ฒญํ๋ ๋์ ํ๋กฏ์ ์ค๊ฐ ํํ(์: vega JSON ํ์ผ)์ ์์ฑํ๊ณ ๋ฐฑ์๋๊ฐ ์ด๋ฅผ ์ ๋ ฅ์ผ๋ก ๋์์ผ๋ก ์ง์ ํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์์ผ๋ก ์ค๊ณ๋์ง ์์ ๊ตฌ์ฒดํ๋ pandas API์ ํํ๋ ฅ์ ์ฝ๋งค์ด์ง ์์ต๋๋ค.
pandas๋ฅผ ์ง์ํ๊ธฐ ์ํด ํจํค์ง๋ฅผ ํ๋กํ ํ์ฌ ์ํํ ์์ ์ IR์ ์์ฑํ๋ ๋ค๋ฅธ pydata ํจํค์ง์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
pydata ๊ณต๊ฐ์์ ๊ตํ ์๊ฐํ๋ฅผ ์ํ ๊ณตํต ์ธ์ด ํ๋ณด
๋ณด๋ค ๊ด๋ฒ์ํ๊ฒ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๋๊ตฌ๋ฅผ ๋์ฑ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ญ๋๋ค.
์์ฑํ๋ ค๋ ๋ ธ๋ ฅ์ด ๋ ํฉ๋ฆฌ์ ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ผํฐ๋ธ๊ฐ ํฅ์๋์์ต๋๋ค.
Vega/Vega-lite๋ ํ๋์ ์ด๊ณ ํ๋ฆฝ๋ ๊ฐ๋ฐฉํ JSON ๊ธฐ๋ฐ ๋น์ฃผ์ผ๋ฆฌ์ ์ด์ ์ฌ์ ์ธ์ด๋ก์ ๋ช ๋ ๋์ ์ค๊ณ ๋ฐ ๊ตฌํ์ ํฌ์ ํ์ผ๋ฉฐ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ๊ธฐ์กด ๋๊ตฌ๋ ์ด๋ฌํ ๋ชฉ์ ์ ์ํด ๋ช ์์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. . (๊ทธ๋ฅ ํ์ง ๋ง์ธ์).์ปดํ์ผ๋ฌ์ฒ๋ผ ํ๋ก ํธ์๋->IR->๋ฐฑ์๋๊ฐ ์ค๊ณ๋์์ต๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ธ์.
์ด์ #26753์ ๋ณํฉํ์ผ๋ฉฐ ํ๋กํ
๋ฐฑ์๋๋ฅผ ํฌ๋์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. matplotlib ์ฝ๋๋ฅผ ๋ถํ ํ ๋ SeriesPlotMethods
๋ฐ FramePlotMethods
๋ฅผ pandas(matplotlib๊ฐ ์๋) ์ชฝ์ ๋จ๊ฒผ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฃผ๋ก pandas ์ธก์ ๋
์คํธ๋ง์ ๋จ๊ฒจ๋๋ ๊ฒ์ด์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฐฑ์๋๊ฐ ํด๋น ํด๋์ค๋ฅผ ๋ค์ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ๋ฐฑ์๋๋ ํ๋กฏ๋น ํ๋์ ํด๋์ค(์: LinePlot
, BarPlot
)๋ฅผ ๊ฐ์ง ๊ฒ์ผ๋ก ์์ํ์ง๋ง ๋์ ๋ฉ์๋๋น ํ๋กฏ์ด ์๋ ํด๋์ค๋ฅผ ๊ตฌํํฉ๋๋ค(์: hvPlot, or the same names as pandas for
pdvega `).
์ ์ด๋ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ผ๋ก์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ hvplot
๋ฐ pdvega
๊ฐ ํ๋ ๊ฒ์ฒ๋ผ API๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ๋ฐฑ์๋๊ฐ ์์ํ๋ pandas์์ ์ถ์ ํด๋์ค๋ฅผ ์์ฑํ ๊ฒ์
๋๋ค.
๊ทธ๊ฒ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ์๋ฏธ๊ฐ ์๋ค๋ฉด ์ถ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ pandas์ ์๋ matplotlib ๋ฐฑ์๋๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ผ๋ก ์์ํ๊ฒ ์ต๋๋ค. ์ด ์์
์ด ์๋ฃ๋๋ฉด hvplot
๋ฐ pdvega
(๋ณ๊ฒฝ ์ฌํญ ๊ฝค ์์์ผ ํจ).
์๊ฐ?
์ ์ด๋ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ผ๋ก์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ hvplot ๋ฐ pdvega๊ฐ ํ๋ ๊ฒ์ฒ๋ผ API๋ฅผ ๊ตฌํํ๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ๋ฐฑ์๋๊ฐ ์์ํ๋ pandas์์ ์ถ์ ํด๋์ค๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค.
๋๋ ๊ท ํ์ ์ผ๋ก ์ด ์ ๊ทผ ๋ฐฉ์์ด ๋ ๊นจ๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ํ๋กํ
๋ฐฑ์๋์ ๋ํด์๋ ๋งํ ์ ์์ง๋ง ์ ์ด๋ hvPlot์์ ๋ค๋ฅธ ํ๋กฏ ๋ฐฉ๋ฒ์ ์๋นํ ์์ ์ฝ๋๋ฅผ ๊ณต์ ํฉ๋๋ค(์: scatter
, line
๋ฐ area
๋ ๋์ฒด๋ก ์ ์ฌํ๋ฉฐ, ๋๋ ๊ทธ๋ค ์ฌ์ด์์ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ์๋ธํด๋์ฑ์ ์์กดํ์ง ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๋ํ ๋ค๋ฅธ ๋ฐฑ์๋์ ์ถ๊ฐ ํ๋กฏ ์ ํ์ ์ถ๊ฐํ๊ณ ์ด๋ฅผ ์ถ๊ฐ ๊ณต๊ฐ ๋ฉ์๋๋ก ๋
ธ์ถํ๋ ์ต์
์ด ์์ด์ผ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์์ฐ์ค๋ฌ์ด ์ ๊ทผ ๋ฐฉ์์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด I'd prefer not to rely on subclassing to share code between them
ํ๋ฉด class LinePlot(MPLPlot)
์ ๊ฐ์ด ํ๋ ๊ฒ์ด๊ฒ ์ฃ ? ๊ทธ๋ฆฌ๊ณ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์์ ์์ํ๋ ๊ฒ์ด ์ข์ง ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๊น?
๋๋ ๋ฐฑ์๋๊ฐ ํฌ๋๊ฐ ์๋ ํ๋กฏ ์ ํ์ ์ ์ํ๋๋ก ํ๋ ๊ฒ์ ๋ํด +1์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ์ง๊ธ ๋น์ฅ์ ์คํํ์ง ์์ ๊ฒ์
๋๋ค. 1์ฃผ์ผ ์ ๋ ํ์ ํ๋ค๋ฅผ ์ถ์ํ ์์ ์
๋๋ค. ์ฌ์ฉ์๊ฐ kind='foo'
๋ฅผ ์ ๊ณตํ๊ณ ๋ฐฑ์๋๊ฐ foo
๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ(์: ๋งค๊ฐ๋ณ์ ์ ํจ์ฑ ๊ฒ์ฌ, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ผ๋ถ kind
๋ ๋ฌธ์์ ์๊ณ ์ผ๋ถ๋ ๊ทธ๋ ์ง ์์).
์ดํด๋ฅผ ๋๊ธฐ ์ํด LinePlot(MPLPlot) ํด๋์ค์์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ์๋ธํด๋์ฑ์ ์์กดํ์ง ์๋ ๊ฒ์ ์ ํธํ๋ค๊ณ ๋งํ ๋ ๋ง์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์์ ์์ํ๋ ๊ฒ์ด ์ข์ง ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๊น?
๋ค, ๋ง์ต๋๋ค. ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋๋ ์ด๋ฐ ์ข ๋ฅ์ ์ผ์ํ์ง ์์๋๋๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
class MPL1dPlot(MPLPlot):
def _some_shared_method(self, ...):
...
class LinePlot(MPL1dPlot):
...
class AreaPlot(MPL1dPlot):
...
๋ช ํํ์ง ์์ ๊ฒฝ์ฐ ์ฃ์กํฉ๋๋ค.
https://github.com/pandas-dev/pandas/pull/27009 ์์ ํ์ฌ ์ ์๋ ํด๋์ค ๋์ ๋จ์ผ ๊ธฐ๋ฅ์ผ๋ก ๊ณต๊ฐ์ ์ผ๋ก ๋ ธ์ถ๋๋ ๋ ๊ฐ๋จํ API๋ฅผ ์ ํธ
๋ฐฑ์๋ ์ต์
์ด ํ์ฌ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์ผ๋ฐ์ ์ธ ์ง๋ฌธ/๋น๊ณ ์
๋๋ค. ๋ด๊ฐ pdvega
๊ฐ๋ฐ์๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ด ๋ฐฑ์๋๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋์ญ์์ค. ์ฆ, ์ฌ์ฉ์๊ฐ pd.options.plotting.backend = 'pdvega'
ํ๋ฉด pdvega
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์์ plot
ํจ์๊ฐ ์์ด์ผ ํ๋ค๋ ์๋ฏธ์
๋๊น?
1) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๋ก์ ๊ณต๊ฐ์ ์ผ๋ก ๋
ธ์ถํ๋ ค๋ ๊ธฐ๋ฅ์ด ๋ฐ๋์ ํ์ํ ๊ฒ์ ์๋๋๋ค(์ฆ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด์ ์์ ์ต์์ plot
๋ฉ์๋์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ํ๋ API๊ฐ ๋ฐ๋์ ํ์ํ ๊ฒ์ ์๋๋๋ค. ์ง์ ์ฌ์ฉ) ๋ฐ 2) ์ด ๊ฒฝ์ฐ ์ค์ ๋ก pd.options.plotting.backend = 'altair'
๋ฅผ ํ ์ ์๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๊น? (์ํ
์ด ๊ฐ๋ฐ์๊ฐ ๊ทธ๊ฑธ๋ก ๊ด์ฐฎ์ ๊ฒฝ์ฐ)
๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด ์ง๋ฌธ์: ๋ฐฑ์๋ ์ด๋ฆ์ ์ ํํ 1:1 ๋งคํ์ด ํ์ํ๊ณ ๋ฌด์์ ๊ฐ์ ธ์ค๋ ๊ฒ์
๋๊น? (์ด๊ฒ์ ์ ๊ณต๋ ๋ฐฑ์๋ ๋ฌธ์์ด์ ๋จ์ํ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ํ์ํฉ๋๋ค).
ํธ์ง: ์ค์ ๋ก ์ ์ฌํ ๊ฒ์ด PR #26753์์ ๋ ผ์๋์์์ ์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ํ๋ค๊ฐ ์ด๋ค ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋์ง/์ ํํ์ง ์๋๋ค๋ ๊ฒฐ์ ์ ๋ด๋ฆฐ๋ค๋ฉด(์ ๋ ๊ฒฐ์ ์ ์ฐฌ์ฑํฉ๋๋ค), ๋ฐฑ์๋์์ ์ด๋ป๊ฒ/๋ฌด์์ ํธ์ถํ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์์
ํ๊ณ ์๋ PR์์ ๊ตฌํ ๋ฐ ์ ์๋ ๊ฒ์ plotting.backend
์ต์
์ด ๋ชจ๋์ด๋ผ๋ ๊ฒ์
๋๋ค( pdvega
, altair
, altair.pandas
, ๋๋ ๋ฌด์์ด๋ ๊ฐ์), ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ชจ๋์๋ ์ฐ๋ฆฌ๊ฐ ํธ์ถํ ๊ณต๊ฐ plot
ํจ์๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ต์
์ด pdvega
๊ฒฝ์ฐ pdvega.pandas
๊ฐ์ ธ์ค๊ฑฐ๋ ํจ์ ์ด๋ฆ์ plot_pandas
์ง์ ํ ์ ์์ต๋๋ค. ์ ์ํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํ์ง๋ง, ๋ ํ๋นํ ๋ค๋ฅธ ์ ์์ด ์์ผ๋ฉด ๊ธฐ๊บผ์ด ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ ผ์๋ ์ฌ์ฉ์๊ฐ ๋ฐฑ์๋๋ฅผ ์๋์ผ๋ก ๊ฐ์ ธ์ค๋๋ก ๊ฐ์ ํ๋ ค๋ ๊ฒฝ์ฐ์ ๋๋ค.
import pandas
import hvplot
pandas.Series([1, 2, 3]).plot()
๊ทธ๋ ๊ฒ ํ๋ฉด ๋ชจ๋์ด ์ค์ค๋ก ๋ฑ๋กํ ์ ์๊ณ ๋ณ์นญ๋ ๋ฑ๋กํ ์ ์์ต๋๋ค(๊ทธ๋์ set_option
๋ ๋ชจ๋ ์ด๋ฆ ์ด์ธ์ ๋ค๋ฅธ ์ด๋ฆ์ ์ดํดํ ์ ์์). ๊ทธ๋ค์ ๋ํ ํน์ ๋ฐฑ์๋๋ก ํ๋กฏํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ ๊ธฐ๋ฅ์ด๋ ๊ธฐ๊ณ(์: ์ปจํ
์คํธ ๊ด๋ฆฌ์)๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ pandas.set_option('plotting.backend', 'bokeh')
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด์ผ์ ํ๋กฏํ๋ ๊ฒ์ด ์ข์ ์๋ ์์ง๋ง, ์ด๋ ์ ๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์ข์ํ์ง ์๋ ๋ ๊ฐ์ง๋ฅผ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
pandas.set_option('plotting.backend', 'bokeh')
๋ import pandas_bokeh
๊ฐ ํธ์ถ๋ ๊ฒฝ์ฐ์๋ง ์๋ํ๋ฉฐ ์ฌ์ฉ์์๊ฒ ํผ๋์ ์ค ๊ฒ์
๋๋ค.bokeh
์ ํ๋กฏํ ๋ชจ๋์ด ํ๋๋ง ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ฌ์ค์ผ ํ์๊ฐ ์์ผ๋ฉฐ ๋ณด์ผ์ ๋ํ ๋ฐฑ์๋๋ฅผ ํ๋กํ
ํ๋ ํฌ๋๊ฐ ์๋๋ผ ๋ณด์ผ๋ก ์ง์ ํ๋กํ
ํ๊ณ ์๋ค๋ ์๋ชป๋ ์ธ์์ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํฉ๋๋ค.@datapythonista ์์ธํ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ธฐ ๋ฆด๋ฆฌ์ค์์ ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค(๋ณ์นญ ๊ฐ๋ฅ์ฑ์ ๋์ค์ ํญ์ ์ถ๊ฐํ ์ ์์).
์ฌ์ฉ์๊ฐ hvplot์ Andrew's ๊ณก์ ํ๋กฏ์ ์ํ๋ฉด hvplot์์ ํจ์๋ฅผ ๊ฐ์ ธ์์ ๊ฑฐ๊ธฐ์ ๋ฐ์ดํฐ ํ๋ ์์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
+1, ๋ํ ๋ฐฑ์๋๋ฅผ ํตํด ๋ชจ๋ ์ถ๊ฐ ํ๋กํ ๊ธฐ๋ฅ์ ๋ ธ์ถํ์ง ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ pandas.plotting.matplotlib
๋ก ์ด๋ํ๋ ๊ฒ์ ๋์๊ฒ ๋ถํ์ํ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ์ค๋จ์ฒ๋ผ ๋ณด์
๋๋ค(๊ตฌํ์ ์ด๋ํ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ).
pandas.set_option('plotting.backend', 'bokeh')์ import pandas_bokeh๊ฐ ํธ์ถ๋ ๊ฒฝ์ฐ์๋ง ์๋ํ๋ฉฐ ์ฌ์ฉ์์๊ฒ ํผ๋์ ์ค ๊ฒ์ ๋๋ค.
ํ์ฅ์ ๋ฑ๋กํ๊ธฐ ์ํด ์ง์ ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐ๋์ ๊ทธ๋ด ํ์๋ ์์ต๋๋ค. ์์คํ ์ ํจํค์ง๋ฅผ ์ค์นํ๋ฉด ์ง์ ์ ์ ๋ฑ๋กํ๊ณ pandas์์ ๋ณผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๊ฒ์ด Altair๊ฐ ์ฌ์ฉ์๊ฐ ์ค์นํ์ ์ ์๋ ๋ค์ํ ๋ ๋๋ฌ๋ฅผ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋ํ ๊ฐ์น๊ฐ ์๋ ๋งํผ, ์ผ๋จ ์ด๊ฒ์ด ๋ค์ด๊ฐ๋ฉด ์๋ง pdvega๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ณ ๊ด๋ จ ์ฝ๋๋ฅผ pandas_altair
๋๋ ์ด์ ์ ์ฌํ ์ด๋ฆ์ ์ ํจํค์ง๋ก ์ฎ๊ธธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@datapythonista 0.25.0 ์ด์ ์ ํ๋กํ ๋ฐฑ์๋ API์ ๋ฒ์๋ฅผ ๊ฒฐ์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(RC๋ ์๋).
๊ธฐํ ํ๋กํ ๊ธฐ๋ฅ(๋ฟ๋ง ์๋๋ผ hist/boxplot)์ ์ ์งํ๋ ๋ฐ ์ฐฌ์ฑํ์ญ๋๊น?
@datapythonista ๋ PR์ ๋ณํฉํ ๋ ์ด๊ฒ์ ๋ซ์ต๋๊น?
@jreback ๋๋ API์ ๋์ํ ๋๊น์ง ์ด๊ฒ์ ์ด์ด๋ ๊ฒ์ ๋๋ค. @TomAugspurger ์ @jorisvandenbossche ๋ ์ ๊ทผ์ ํ๋กฏ์ ์ ์ธํ๊ณ ๋ ๋ฐฑ์๋์ ์ด๋ค ๊ฒ๋ ์์ํ๊ณ ์ถ์ง ์์ต๋๋ค.
ํ๋กํ ํฌ๋๋ฅผ ์ํด ๋ด๊ฐ ํ ์ผ์ - ๋ฐฑ์๋๊ฐ ๋ค์์ ๋๋ค.
๋ฆด๋ฆฌ์ค:
register_matplotlib_converters
์์ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.๋ค์ ๋ฆด๋ฆฌ์ค์ ๊ฒฝ์ฐ:
pandas.plotting.boxplot
, Series.hist
,...๋ฐฑ์๋ API์ ์ด๊ธฐ ๋ฆด๋ฆฌ์ค์ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ์ ํฌํจํ๊ธฐ๋ณด๋ค ๋ ธ์ถ๋๋ ๋ด์ฉ์ ๋ํด ๋ ๋ณด์์ ์ ๋๋ค. ์ ๊ฑฐํ๋ ๊ฒ๋ณด๋ค ๋์ค์ ์ถ๊ฐํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ๋ชจ๋ ๊ธฐํ ํ๋กฏ์ ์ ๊ทผ์๋ก ์ฎ๊ธฐ์ง ์์ ๊ฒ์ ๋๋ค(์ฐ๋ ํ๋ ฌ๊ณผ ๊ฐ์ ์ผ๋ถ ์์ธ๊ฐ ์์ ์ ์์), IMO andrew_curves ๋ฐ radviz ๋ฑ์ "๊ฐ์น ์๋" ๋ฉ์๋๊ฐ ์๋๋๋ค.
์ฆ, ๋ฐฑ์๋๊ฐ ์ถ๊ฐ "์ข
๋ฅ"๋ฅผ ๊ตฌํํ๋๋ก ํ์ฉํ์๊ฒ ์ต๋๊น? ๋ฐ๋ผ์ ํฌ๋๋ก์ ์ ํํ ์ด๋ค ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ๊ฒฐ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํน์ kind
ํ๊ฑฐ๋ ์์ฑ์ ์ก์ธ์คํ๋ ค๊ณ ํ๋ฉด ์ฌ์ฉ์ ์ ์ __getattribute__
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์๋ plot
์ ๋ฌํ ์ ์์ต๋๋ค.
์ํฉ์ด ์ง๊ธ๊ณผ ๊ฐ์ ์ด์ ๋ฅผ ์กฐ๊ธ ์ค๋ช ํ๊ธฐ ์ํด์์ ๋๋ค. ๋น์ ์ด ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌผ์ ๋ ธ์ถํ์ง ์๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ด๋ จ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ ์ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ํ ๋ก ์ ํ๋ถํ๊ฒ ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
์ฒซ ๋ฒ์งธ ๊ฒฐ์ ์ matplotlib๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ณ๋์ ๋ชจ๋( pandas.plotting._matplotlib
)๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ๊ทธ ๋ชจ๋์ ์ด๋ป๊ฒ๋ matplotlib ๋ฐฑ์๋๊ฐ ๋์์ต๋๋ค.
pandas.plotting
์์ ๊ณต๊ฐ๋ ๋ชจ๋ ํญ๋ชฉ์ด ๊ณต๊ฐ๋ก ์ ์ง๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํด ์ด๋ฌํ ๋ชจ๋ ํจ์๋ ์ผ๋จ ํธ์ถ๋๋ฉด ๋ฐฑ์๋๋ฅผ ๋ก๋ํ๊ณ ( _get_plot_backend
ํธ์ถ) ๊ฑฐ๊ธฐ์์ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ฌ์ฉ์๋ฅผ ์ํ ๊ณต๊ฐ API๋ ์ ํ ๋ณ๊ฒฝ๋์ง ์์์ผ๋ฉฐ ์ฌ์ฉ์๋ ์ฌ์ ํ ๋์ผํ ๋ฐฉ๋ฒ๊ณผ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ก์ด ๊ฒ์ ๋ ธ์ถํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์ดํดํ๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด andrew_curves
์ ๊ฐ์ ๊ธฐ์กด ํ๋กฏ์ด ๋ฐฑ์๋์ ์์๋์ง ์์๋ค๊ณ ๊ฒฐ์ ํ๋ฉด ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ ์ฌ์ฉ์๊ฐ ๋ฐฑ์๋๋ฅผ ์ ํํ๋ ๋์ ์ฌ์ ํ matplotlib ๋ฐฑ์๋๋ฅผ ์ ํํ๋ค๋ ๊ฒ์
๋๋ค. ์ ์ด๋ hvplot
๊ฐ ์ด๋ฏธ andrew_curves
๊ตฌํํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ฐ์ธ์ ์ผ๋ก ์์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ฌ์ฉ์๊ฐ andrew_curves
ํ๋กฏ์ ์ํ๋ค๋ฉด matplotlib์์ ๋ฐฑ์๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ๋งํผ ์ฝ์ต๋๋ค(๋๋ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ค์ ์ค์ ). ๋ฐ๋ผ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ฐ๋ฆฌ๋ ํฌ๋์ ๋ณต์ก์ฑ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์์ ์ถ์ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์
๋๋ค.
๋ฐฑ์๋ ๊ฐ๋ฐ์์๊ฒ ์น์ ํ๊ณ ์ฃผ๋ฅ๊ฐ ์๋ ํ๋กฏ์ ๊ตฌํํ๋๋ก ๊ฐ์ํ์ง ์์ผ๋ ค๋ฉด(์ด๊ฒ์ด ์ถ๋ก ์ค ํ๋์ธ๊ฐ?) ์ ํํ ๋ฐฑ์๋์์ ๋๋ฝ๋ ๋ชจ๋ ๊ฒ์ matplotlib ๋ฐฑ์๋๋ก ๊ธฐ๋ณธ ์ค์ ํ ์ ์์ต๋๋ค. ?
์ ์ ์๋ ์ข ๋ฅ์ ํ๋กฏ์ ๋ฐฑ์๋์ ์์ํ๋ ๊ฒ์ ๋ํด ์ง๊ธ ๋น์ฅ์ -1์ ๋๋ค. ํ์คํ ๊ทธ๊ฒ์ ๊ฒฐ๊ตญ ์๋ฏธ๊ฐ ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ค์ ์ฌ๋ฌ ์ข ๋ฅ์ ํ๋กฏ์ด ๋ฌธ์ํ๋์ด ์๊ณ ๋ฌธ์ํํ์ง ์์ ์ถ๊ฐ ํ๋กฏ์ด ์๋ค๋ ๊ฒ์ ์ฝ๊ฐ ํด์ปค์ฒ๋ผ ๋๊ปด์ง๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ํ ๋ฐฑ์๋๊ฐ ์ฌ์ฉ์๋ฅผ ์ํด ์๋ํ๋ ๋ฐฉ์์ ๋ํ ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์ธ๋ถ์ ์ผ๋ก ๋ ผ์ํ๊ณ ๋ถ์ํ ๋ ๋ง์ ์๊ฐ์ ๊ฐ๊ฒ ๋ ํ ๋ค์ ๋ฒ์ ์ ๊ธฐ๋ค๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ์ฉ์๊ฐ matplotlib์์ andrew_curves ํ๋กฏ์ ์ํ๋ ๊ฒฝ์ฐ ๋ฐฑ์๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ๋งํผ ์ฝ์ต๋๋ค(๋๋ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ค์ ์ค์ ). ๋ฐ๋ผ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ฐ๋ฆฌ๋ ํฌ๋์ ๋ณต์ก์ฑ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์์ ์ถ์ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉ์์ ์ถ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. pandas.plotting์์ ๊ฐ์ ธ์ค๋ ๋์ hvplot ๋ฒ์ ์ ์ํ๋ฉด ๊ฑฐ๊ธฐ์์ ๊ฐ๋จํ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ์ฒด์ ์ ์๋ DataFrame.plot ๋ฉ์๋์ ๋ํด ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค. ๋๋ฅผ ์ํด ๊ทธ๊ฒ์ด ๋ฐฑ์๋๋ฅผ ๊ณํํ๋ ์ฃผ๋ ์ด์ ์ ๋๋ค.
๋ฐฑ์๋ ๊ฐ๋ฐ์์๊ฒ ์น์ ํ๊ณ ์ฃผ๋ฅ๊ฐ ์๋ ํ๋กฏ์ ๊ตฌํํ๋๋ก ๊ฐ์ํ์ง ์์ผ๋ ค๋ฉด
๋์๊ฒ ๊ทธ๊ฒ์ ๋ฉ์ง๊ฑฐ๋ ๋ชจ๋ ๊ฒ์ ๊ตฌํํ๋ ๊ฒ์ด ํ์ํ๋ค๋ ๊ฒ์ด ์๋๋ผ(๋ฐฑ์๋๊ฐ ๋ชจ๋ ํ๋กํ
์ ํ, IMO๋ฅผ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์์ ํ ๊ด์ฐฎ์ต๋๋ค), ์คํ๋ ค ํ๋กํ
๋ฐฑ์๋ API์ ๋ถํ์ํ ํ์ฅ์ ๊ดํ ๊ฒ์
๋๋ค. .
ํฌ๋๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์์ํ๋ฉด ์ด๋ฌํ ๊ธฐํ ํ๋กํ
์ ํ์ด ํฌํจ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ๋กํ
๋ฐฑ์๋ API๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์ด๋ค ์์ผ๋ก๋ ์๋ก์ด ๊ฒ์ ์์ํ๊ณ ์์ต๋๋ค.
์ด์ ๋ํ ๋ค๋ฅธ ์๊ฒฌ์ด ์์ต๋๊น?
@jorisvandenbossche์ ๋์ํ์ต๋๋ค.
์ด๊ฒ์ด ์์ค๋์ง ์์๋์ง ํ์ธํ๊ธฐ ์ํด setuptool์ ์ง์ ์ ์ ์ฌ์ฉ ํ๋ผ๋ @jakevdp ์ ์ ์์ ์์ ์ฃผ๋ฌธ ๋ฑ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค: https://github.com/pandas-dev/pandas/issues/26747 # ์ด์
@jorisvandenbossche ์ฝ๋์์ ์ด๋ป๊ฒ ๋ฐ๊พธ์๊ฒ ์ต๋๊น? ํด๋น ๋ฉ์๋์ ๋ํ ์ค์ ์์ ์ ์๋ ๋ฐฑ์๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ matplotlib ๋ฐฑ์๋๋ฅผ ๊ฐ์ ธ์ค์๊ฒ ์ต๋๊น? ์ด๊ฒ์ ๊ฐ๋ ์ ์ผ๋ก ์๋ชป๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ํฉ์๊ฐ ์์ผ๋ฉด ๊ด์ฐฎ๋ค. ๋๋จธ์ง์์ matplotlib ์ฝ๋์ ๋ถ๋ฆฌ๋ฅผ ๋๋๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ -1์ ๋๋ค.
pandas์์ ์ฒ์๋ถํฐ ํด๋น ํ๋กฏ์ ํฌํจํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๊น? Series
๋๋ DataFrame
๋ฉ์๋๊ฐ ์๋ ๋ชจ๋ ํ๋กฏ์ ํ์ฌ ํจํค์ง๋ก ์ด๋ํ๋ ๋ฐ +1์
๋๋ค. ๋๋ ์ ์งํด์ผ ํ ๋งํผ ์ค์ํ ๊ฒ์ด ์์ผ๋ฉด .plot()
๋ก ํธ์ถ๋๋๋ก ์ด๋ํฉ๋๋ค.
๋๋ ํฌ๋์์ ๋นํ์ค ํ๋กฏ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ๊ฒ์
๋๋ค
์ธ๋ถ ํจํค์ง๋ก ์ด๋
Joris๋ ์ ์ ์คํ๋ผ์ธ ์ํ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ณผ๊ฑฐ์ ์ด๊ฒ์ ๋ ผ์ํ์ ๋ ๋ ผ๋ฌธ์ ๋ํ ๊ทธ์ ๋์ ์ ์ฅ์ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ด ๋ ๋๊น์ง ๊ทธ๋๋ก ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ฐ์ ํ์ด์ง์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฒ๊ณผ ํ ๋ก ์ํ์ ๋ํ ๋์ ์ดํด๋ฅผ ์์ฝํ ๊ฒ์ ๋๋ค.
Series
๋ฐ DataFrame
๋ฉ์๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋ค๋ฅธ ํ๋กฏ(๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ผ ํ๋์ง, matplotlib ๋ฐฑ์๋์ ์์ํด์ผ ํ๋์ง ๋๋ ์ ํํ ๋ฐฑ์๋์ ์์ํด์ผ ํ๋์ง ๋ ผ์ ์ค):
pandas.plotting
๊ธฐํ ๊ณต๊ฐ ํญ๋ชฉ(ํ ๋ก ์ค):
Other plots
์น์
์ ๊ฒฝ์ฐ ๊ฐ์ธ์ ์ผ๋ก ํ์์ ์์ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ํฌ๋ ๋ฐ์ผ๋ก ์ฎ๊ธฐ๋ ๋ฐ +1์ด๋ฉฐ 0.25์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๋ณํ๊ธฐ ๋ฐ ๊ธฐํ ํญ๋ชฉ์ ๊ฒฝ์ฐ register_matplotlib_converters
๊ฐ matplotlib๊ฐ ๋ ์ ์๋ ์ ํ๋ ํ๋กฏ์ ์์ํ๊ธฐ ๋๋ฌธ์ ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฒ์ ํ์คํ ์ ํํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํ ์ ์๋ ์ต์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
register_converters
/ deregister_converters
๋ก ๋ณ๊ฒฝํ๊ณ ํ์ฌ ํญ๋ชฉ์ ํ๊ธฐํ๊ณ ๋ฐฑ์๋์ ๊ณ์ ์์ํฉ๋๋ค.pandas.plotting
์์ pandas.plotting.matplotlib
์ด๋ํฉ๋๋ค.pandas.plotting
๋ฅผ ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค)๊ธฐํ ํ๋กฏ ์น์ ์ ๊ฒฝ์ฐ ๊ฐ์ธ์ ์ผ๋ก ํ์์ ์์ ์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ํฌ๋์์ ๊ทธ๊ฒ๋ค์ ์ฎ๊ธฐ๋ ๋ฐ +1์ด๋ฉฐ 0.25์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ ์ง ๊ด๋ฆฌ ๋ถ๋ด์ด ๋๋ "๊ธฐํ ๊ตฌํ"์ ์ด๋ป๊ฒ ์ฐพ์ต๋๊น? "๊ธฐํ" ํ๋กฏ์ ๋ํ ๊ธฐ๋ก์ ์ดํด๋ณด๋ฉด: https://github.com/pandas-dev/pandas/commits/0.24.x/pandas/plotting/_misc.py 2017๋ ์ดํ๋ก ~10-15๊ฐ์ ์ปค๋ฐ์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์ ์ ์ฉ๋๋ ์ ์ญ ์ ๋ฆฌ์ ๋๋ค(๊ทธ๋์ ์์ ํ๊ณ ๋ถ๋ด). ๋ฌธ์๋ฅผ ๋ณ๊ฒฝํ๋ ์ปค๋ฐ์ 1-2๊ฐ๋ง ํ์๋๊ณ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๋ ์ปค๋ฐ์ ์์ต๋๋ค.
๊ทธ๊ฒ๋ค์ ์ด๋ฆ์ register_converters/deregister_converters๋ก ๋ฐ๊พธ๊ณ , ํ์ฌ ๊ฒ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, ๋ฐฑ์๋์ ๊ณ์ ์์ํ์ญ์์ค.
๋๋ ์ด๊ฒ์ด ๋ง์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐํ๊ธฐ matplotlib๋ฅผ ์ํด
๊ทธ ํ๋กฏ์ด ์ง๋ ๋ช ๋ ๋์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ ์ ์ง ๊ด๋ฆฌ์ ์ ๋๋ฌธ์ ๋ถ๋ด์ด ๋๋ค๋ ์๋ฏธ๊ฐ ์๋๋ผ, ์ฌ์ฉ์๋ฅผ ์ํ ์ผ๊ด๋๊ณ ์ง๊ด์ ์ธ API์ ์ฐ์ํ ๋ชจ๋์์ ๊ฐ์ถ์๋ค๊ณ ๊ฐ์ ํ๋ ๋ฌธ์ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ฅผ ์ํ ์ฝ๋ ๋์์ธ.
๋ณํ๊ธฐ์ ๊ด๋ จํ์ฌ ๋ฐฑ์๋ ์์ฑ์๊ฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ matplotlib์ ํด๋นํ๋ ๊ฒ์ ๊ตฌํํ๋ ค๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ด๋ฉฐ ํด๋น ๊ธฐ๋ฅ์ ๋ค๋ฅธ ๋ฐฑ์๋์ ์ผ๋ถ ๋๋ ์ ์ฒด์ ๋ํด ์๋ฌด ๊ฒ๋ ํ์ง ์์ต๋๋ค. ๋๋ ๋ํ ์ต์ 2์ ๋ํด ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ๊น๋ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ์๋ฅผ ์ํ ์ผ๊ด๋๊ณ ์ง๊ด์ ์ธ API์ ์ฐ๋ฆฌ๋ฅผ ์ํ ์ฐ์ํ ๋ชจ๋์ ์ฝ๋ ๋์์ธ์ ๊ฐ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๋ ๋ฌธ์ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๋ค์ ์ด๋ฏธ DataFrame.plot๊ณผ ๋ค์ ์ผ์นํ์ง ์์ต๋๋ค. "๊ธฐํ"๋ผ๋ ์ด๋ฆ์ :) ์ค์ ๊ฐ๋ฅํ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฉ์ด ๋ ๋๋น ์ง๊น์? ์ฌ์ฉ์ ์ฝ๋๋ฅผ ๊ต์ฒดํ ๊ฐ์น๊ฐ ์๋ ์ ๋? ๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค.
๋ฐฑ์๋ ์์ฑ์๊ฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ matplotlib์ ํด๋นํ๋ ๊ฒ์ ๊ตฌํํ๊ณ ์ถ์ดํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค. ์ด๋ฌํ ๋ณํ๊ธฐ์ ์์ ์ matplotlib์ pandas ๊ฐ์ฒด์ ๋ํด ๊ฐ๋ฅด์น๋ ๊ฒ์ ๋๋ค. ๋ฐฑ์๋๋ฅผ ๊ตฌํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฏธ ํฌ๋์ ์์กดํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ฃผ๋ก ๋ณต์ก์ฑ ๊ด๋ฆฌ ์ธก๋ฉด์์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํฉ๋๋ค. ๋จ์ผ API๋ฅผ ํตํด ๋ฐฑ์๋์ ์์๋ ํ์ค ํ๋กํ
API๋ฅผ ์ฌ์ฉํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ์ต๋๋ค. ์ฌ์ฉ์์ ์ ์ง ๊ด๋ฆฌ์๋ kind
์ธ์๊ฐ ์๋ plot
ํจ์๊ฐ ์๊ณ ์ ํํ ๋ฐฑ์๋์์ ์คํ๋๋ค๋ ์ฌ์ค๋ง ์๋ฉด ๋ฉ๋๋ค.
๋ฐฑ์๋์ ๋์ผํ API๋ฅผ ๋ฐ๋ฅด์ง ์๋ ๊ฒ ์ธ์๋ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ค๋ฅธ ํ๋กฏ์ ๋ํด ์ ํ๋ ๊ฒ์ ์๋์ง๋ง Matplotlib๋ฅผ ์ฌ์ฉํ๋ ์ด๊ธฐ์ข ํ๋กฏ ์ธํธ๊ฐ ์์ผ๋ฉด ๋ชจ๋ IMHO์๊ฒ ๋๋ฌด ๋ง์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ์ฎ๊ธฐ๋ ๋ฐ ๋๋ ๋น์ฉ์ ๋์๊ฒ ์์ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ ์ถ์ธก์ผ๋ก๋ ์ฐ๋ฆฌ ์ฌ์ฉ์์ ๋ง์ ๋น์จ์ด ๊ทธ ํ๋กฏ์ ๋ํด ์์ง๋ ๋ชปํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ฌ๋์ ์ํด, ๊ทธ๋ค์ ๋จ์ง ์ฌ๋ถ์ CONDA ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์ฌ์ฉํด์ผํฉ๋๋ค import pandas_plotting; pandas_plotting.andrews_curves(df)
๋์ pandas.plotting.andrews_curves(df)
.
๋์๊ฒ ์ ์ ๋น์ฉ์ผ๋ก ๋ง์ ์น๋ฆฌ๋ฅผ ๊ฑฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ฌผ๋ก ๊ทธ๊ฒ์ ๋จ์ง ์๊ฒฌ์ผ ๋ฟ์ ๋๋ค.
๊ต์ฒด ๊ฐ๋ฅํ ๋ฐฑ์๋๊ฐ Series/DataFrame.plot ์ ์ฉ์์ ๋ฌธ์ํํ ์ ์์ต๋๊น? ์์ฃผ ๊ฐ๋จํ ๊ท์น์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋์๊ฒ ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๋ ํดํน์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ค๋ช ์์์ ์ค๋ช ํ๋ ๊ฒ์ด ์ง๊ด์ ์ด์ง ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด์จ๋ ํฐ ๋ฌธ์ ๋ ์๋๋๋ค. ๊ทธ๊ฒ์ด ์ ํธ๋๋ ์ต์ ์ด๋ผ๋ฉด ์ด๊ฒ์ด ๋ด๊ฐ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ต์ํ ์ฝ๋ ๋ณต์ก์ฑ์ ์ฆ๊ฐ๋ ์ต์ํ๋ฉ๋๋ค. #27432
์ง๊ธ ์ด๊ฒ์ ๋ ์์ธํ ์ดํด๋ณด๋ฉด: ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ํ๋กํ ๋ฐฑ์๋๊ฐ ์ค์ ๋๋ ๋ฐฉ์์ ๋ค์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
pd.set_option('plotting.backend', 'name_of_module')
๋ด ์ดํด๋ ๋ค์ ์์ ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ์ ๋๋ค.
pd.set_option('plotting.backend', 'altair')
๊ทธ๋ฐ ๋ค์ https://github.com/pandas-dev/pandas/blob/master/pandas/plotting/_core.py์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ์ํ๋ ค๋ฉด ์ต์์ altair ํจํค์ง๊ฐ ํ์ํฉ๋๋ค
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์ด๊ฒ์ matplotlib๊ฐ ํ์ฌ ํ๋ ์ฝ๋ฉ๋ ๋ฐฉ์์ผ๋ก pandas์์ altair ํจํค์ง๋ฅผ ํ๋ ์ฝ๋ฉํ์ง ์๊ณ ๋ pd.set_option('plotting.backend', 'altair')
์ฌ๋ฐ๋ฅด๊ฒ ์๋์ํฌ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ง์ต๋๊น?
๊ทธ๋ ๋ค๋ฉด ์ด API๊ฐ ํ์ฌ ํจํค์ง์ ๋ ธ์ถ๋๋ ๋ฐฉ๋ฒ์ ์ฌ๊ณ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ด๊ฐ ์ ์ํ ์๋ฃจ์
์ ์๋ฅผ ๋ค์ด API๋ฅผ ๊ตฌํํ๊ธฐ ์ํด altair
์ง์
์ ์ ๋ฑ๋กํ๋ altair_pandas
์ ๊ฐ์ ํจํค์ง๋ฅผ ๋ง๋ค ์ ์๋ ์ง์
์ ๊ธฐ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ฑํํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ฉ์๋ pd.set_option('plotting.backend', 'altair')
๊ฐ ์์ํ ๋๋ก ์๋ํ์ง ์๋๋ค๋ ์ฌ์ค์ ์์ํ ํผ๋์ค๋ฌ์ํ ๊ฒ์
๋๋ค.
๋์. ์ง์ ๋ก๊ฐ ๊ธธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ๋กํ ํ์ ์ ๋ง๋ค๊ฒ ์ต๋๋ค.
2019๋
7์ 19์ผ ๊ธ์์ผ ์คํ 1:16 Jake Vanderplas [email protected]
์ผ๋ค:
์ง๊ธ ์ด๊ฒ์ ๋ ์์ธํ ์ดํด๋ณด๋ฉด: ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด,
ํ๋กํ ๋ฐฑ์๋๋ ๋ค์์ ์ฌ์ฉํ์ฌ ์ค์ ๋ฉ๋๋ค.pd.set_option('plotting.backend', '์ด๋ฆ_of_module')
๋ด ์ดํด๋ ๋ค์ ์์ ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ์ ๋๋ค.
pd.set_option('plotting.backend', 'altair')
๋ชจ๋ ๊ธฐ๋ฅ์ ์ ์ํ๋ ค๋ฉด ์ต์์ ์ํ ์ด ํจํค์ง๊ฐ ํ์ํฉ๋๋ค.
~์
https://github.com/pandas-dev/pandas/blob/master/pandas/plotting/_core.py.
์ด ๋ชจ๋ ๊ฒ์ผ๋ก Altair์ ์ต์์ ๋ค์์คํ์ด์ค๋ฅผ ์ค์ผ์ํค์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ถ๊ฐ API. ์ฌ์ค, ๋๋ ์ํ ์ด์ ํ๋ค ํ์ฅ์ ์ ํธํฉ๋๋ค.
๋ณ๋์ ํจํค์ง๋ก ์ ๊ณต๋๋ฏ๋ก ์ถ์ ์ผ์ ์ ์ฝ๋งค์ด์ง ์์ต๋๋ค.
์ํ ์ด ๊ทธ ์์ฒด.๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด pd.set_option('plotting.backend',
'altair') pandas์์ altair ํจํค์ง๋ฅผ ํ๋ ์ฝ๋ฉํ์ง ์๊ณ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
matplotlib๊ฐ ํ์ฌ ํ๋ ์ฝ๋ฉ๋ ๋ฐฉ์์ด ๋ง์ต๋๊น?๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ด ์ด๋ป๊ฒ ํ์ฑํ๋์๋์ง ๋ค์ ์๊ฐํด ๋ณผ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ๊ณ ํฉ๋๋ค.
ํ์ฌ ํจํค์ง. ํนํ ์ง์ ์ ๊ธฐ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ฑํํ์ฌ
์ํ ์ด๋ฅผ ๋ฑ๋กํ๋ altair_pandas์ ๊ฐ์ ํจํค์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ง์ ์ง์ . ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ฉ์๋ pd.set_option('plotting.backend',
'altair')๋ ๊ทธ๋ค์ด ๊ธฐ๋ํ๋ ๋๋ก ํ์ง ์์ต๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/pandas-dev/pandas/issues/26747?email_source=notifications&email_token=AAKAOITQM7HH5X4SZ4IAPS3QAIAIBA5CNFSM4HWIMEK2YYY3PNVWWK3TUL52HS4DFVEXG43VMXVBW
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAKAOISFLHDGXLGQ3PUMNLDQAIAIBANCNFSM4HWIMEKQ
.
๋ง์ํ์ ๋ด์ฉ์ด ๋๋ถ๋ถ ๋ง์ ๋๋ ์์์ง๋ง, ์ด์ ๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
pandas.options.plotting.backend = 'altair'
๋ฅผ ์ํ๋ฉด 0.25์์๋ altair.plot()
ํจ์๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. ์ด๋ค ์์ ์์ ์ ๋ ๋จ์ํ plot
๋์ pandas_plot
ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ง ๋ฐฑ์๋์ ํน์ ํ์ง๋ง ๊ฒฐ๊ตญ ๋ณ๊ฒฝํ์ง ์์์ต๋๋ค.
์ํ
์ด์ ์ต์์ ๋ ๋ฒจ์์ plot
ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๋ฉด ์ฐจํ ๋ฒ์ ์์ ์ด๋ฆ์ ๋ฐ๊ฟ ์๋ ์๊ณ altair.pandas.plot
๋ ๊ฐ์ง ์ ์์ง๋ง ์ฌ์ฉ์๋ pandas.options.plotting.backend = 'altair.pandas'
๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค
์ฌ์ฉ์๊ฐ import altair
ํ๋ฉด ์ต์
์ ์ง์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ pandas.options.plotting.backend = 'altair'
๋ฅผ ํ๊ณ ์คํจํ๋ฉด ์ด์ ์ import altair
๋ฅผ ์์ด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์๊ฒ ํผ๋์ ์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ํ
์ด(๋๋ ๋ค๋ฅธ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ๋ํด ๋ ์ด์์ ํฌ๋ ๋ฐฑ์๋๋ฅผ ๊ตฌํํ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ์ญ์์ค. ๋ฐ๋ผ์ ์ ์๊ฒ ๋ฐฑ์๋ ์ด๋ฆ์ด altair
๊ฐ ์๋ ๊ฒ์ด ๋ฐ๋์ ๋์ ๊ฒ์ ์๋๋๋ค.
๋ค์์ ์ง์ ์ ๊ธฐ๋ฐ ๊ตฌํ์ ๋๋ค.
diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py
index 0610780ed..c8ac12901 100644
--- a/pandas/plotting/_core.py
+++ b/pandas/plotting/_core.py
@@ -1532,8 +1532,10 @@ class PlotAccessor(PandasObject):
return self(kind="hexbin", x=x, y=y, C=C, **kwargs)
+_backends = {}
-def _get_plot_backend(backend=None):
+
+def _get_plot_backend(backend="matplotlib"):
"""
Return the plotting backend to use (e.g. `pandas.plotting._matplotlib`).
@@ -1546,7 +1548,14 @@ def _get_plot_backend(backend=None):
The backend is imported lazily, as matplotlib is a soft dependency, and
pandas can be used without it being installed.
"""
- backend_str = backend or pandas.get_option("plotting.backend")
- if backend_str == "matplotlib":
- backend_str = "pandas.plotting._matplotlib"
- return importlib.import_module(backend_str)
+ import pkg_resources # slow import. Delay
+ if backend in _backends:
+ return _backends[backend]
+
+ for entry_point in pkg_resources.iter_entry_points("pandas_plotting_backends"):
+ _backends[entry_point.name] = entry_point.load()
+
+ try:
+ return _backends[backend]
+ except KeyError:
+ raise ValueError("No backend {}".format(backend))
diff --git a/setup.py b/setup.py
index 53e12da53..d2c6b18b8 100755
--- a/setup.py
+++ b/setup.py
@@ -830,5 +830,10 @@ setup(
"hypothesis>=3.58",
]
},
+ entry_points={
+ "pandas_plotting_backends": [
+ "matplotlib = pandas:plotting._matplotlib",
+ ],
+ },
**setuptools_kwargs
)
๊ฝค ์ข์ ๊ฒ ๊ฐ์์. ํ์ฌ ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ํฌํจํ๋๋ก setup.py(๋๋ pyproject.toml)๋ฅผ ์์ ํฉ๋๋ค.
entry_points={
"pandas_plotting_backends": ["altair = pdvega._pandas_plotting_backend"]
}
์ด๋ฆ ์ง์ ๊ณผ ๊ตฌํ ๊ฐ์ ๊ธด๋ฐํ ๊ฒฐํฉ์ ๊นจ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ง์ ์ ์ผ๋ก ์์ ํ์ง ์์์ต๋๋ค. Python ํ๊ฒฝ์ ์ ์ญ ๋ ์ง์คํธ๋ฆฌ์ ๊ฐ์๊ฐ์? ๊ทธ๋ค์๊ฒ ์๋กญ๊ธฐ ๋๋ฌธ์ ๋๋ ๊ทธ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง ์์ง๋ง, ๊ทธ๋ด ๋ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ฌ์ ํ ๋ ๊ฐ์ง ์ต์
์ ๋ชจ๋ ๊ฐ๊ณ ์ถ์ผ๋ฏ๋ก ์ฌ์ฉ์๊ฐ pandas.options.plottting.backend = 'my_own_project.my_custom_small_backend'
ํ๋ฉด ์๋ํ๋ฉฐ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ์ง์
์ ์ ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ง์ ์ ์ผ๋ก ์์ ํ์ง ์์์ต๋๋ค. Python ํ๊ฒฝ์ ์ ์ญ ๋ ์ง์คํธ๋ฆฌ์ ๊ฐ์๊ฐ์?
๋๋ ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ์ง ์์์ง๋ง ๊ทธ๊ฒ์ด ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ์ดํดํ ๋ฐ๋ก๋ setuptools์์ ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค(ํ์ง๋ง flit๊ณผ ๊ฐ์ ํจํค์ง๊ฐ ์ฐ๊ฒฐ๋์ด ์์ต๋๊น?). ๋ฐ๋ผ์ ๊ทธ๋ค์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ๊ฐ ์๋์ง๋ง setuptools๋ ์ด์จ๋ ๋ชจ๋ ์ฌ๋์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋๋ ์ฌ์ ํ ๋ ๊ฐ์ง ์ต์ ์ ๋ชจ๋ ๊ฐ๊ณ ์ถ๋ค
import_module(backend_name)
๋๋์๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์์ ์ง์ ์ ๊ธฐ๋ฐ ๊ตฌํ์ ๋๋ค.
๊ฝค ์ข์ ๊ฒ ๊ฐ์์. ํ์ฌ ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ํฌํจํ๋๋ก setup.py(๋๋ pyproject.toml)๋ฅผ ์์ ํฉ๋๋ค.
์ด๋ฆ ์ง์ ๊ณผ ๊ตฌํ ๊ฐ์ ๊ธด๋ฐํ ๊ฒฐํฉ์ ๊นจ๋ ๊ฒ์ด ์ข์ต๋๋ค.