Pandas: API: ํŒฌ๋” ํ”Œ๋กœํŒ… ๋ฐฑ์—”๋“œ์šฉ API ์ •์˜

์— ๋งŒ๋“  2019๋…„ 06์›” 09์ผ  ยท  44์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pandas-dev/pandas

#26414์—์„œ ์šฐ๋ฆฌ๋Š” pandas ํ”Œ๋กœํŒ… ๋ชจ๋“ˆ์„ ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ์™€ ํ˜„์žฌ matplotlib ๋ฐฑ์—”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ํ”Œ๋กœํŒ… ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋ถ„ํ• ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ๊ฐ€ ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ณ  pandas ์‚ฌ์šฉ์ž๊ฐ€ ๊ณตํ†ต API์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ matplotlib ๋ฐฑ์—”๋“œ์— ์˜ํ•ด ์ •์˜๋œ API๋Š” ๋‹ค์Œ์— ๋‚˜์—ด๋œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ ์ด API๋Š” ์•„๋งˆ๋„ ๋‹จ์ˆœํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์งˆ๋ฌธ/์ œ์•ˆ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

API์— ๋ณด๊ด€ํ•  ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋Š” ๋ฐฉ๋ฒ•( Series.plot(kind='line') ... ๊ธฐ๋Šฅ ์ œ๊ณต):

  • ๋ผ์ธํ”Œ๋กฏ
  • BarPlot
  • BarhPlot
  • ํžˆ์ŠคํŠธํ”Œ๋กฏ
  • ๋ฐ•์Šคํ”Œ๋กฏ
  • KdePlot
  • AreaPlot
  • ํŒŒ์ด ํ”Œ๋กฏ
  • ์‚ฐํฌ๋„
  • HexBinPlot

ํŒฌ๋”์—์„œ ์ œ๊ณต๋˜๋Š” ํ”Œ๋กœํŒ… ๊ธฐ๋Šฅ(์˜ˆ: pandas.plotting.andrews_curves(df) )

  • andrews_curves
  • ์ž๊ธฐ์ƒ๊ด€_ํ”Œ๋กฏ
  • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ_ํ”Œ๋กฏ
  • lag_plot
  • ํ‰ํ–‰ ์ขŒํ‘œ
  • ๋ผ๋“œ๋น„์ฆˆ
  • scatter_matrix
  • ํ…Œ์ด๋ธ”

๊ทธ๊ฒƒ๋“ค์€ API์˜ ์ผ๋ถ€์ด๊ณ  ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? .plot ํ˜•์‹(์˜ˆ: DataFrame.plot(kind='autocorrelation') ...)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ? API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํƒ€์‚ฌ ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ?

์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘๋ณต ๋ฐฉ๋ฒ•:

  • hist_series
  • hist_frame
  • ์ƒ์ž ๊ทธ๋ฆผ
  • boxplot_frame
  • boxplot_frame_groupby

boxplot ๊ฒฝ์šฐ ํ˜„์žฌ ํ”Œ๋กฏ์„ ์ƒ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ฃผ๋กœ ๋™์ผํ•œ ์ฝ”๋“œ ํ˜ธ์ถœ).

  1. DataFrame.plot.boxplot()
  2. DataFrame.plot(kind='box')
  3. DataFrame.boxplot()
  4. pandas.plotting.boxplot(df)

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” 4๋ฒˆ์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  3๋ฒˆ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๋ฐฑ์—”๋“œ์—์„œ ๋ณ„๋„์˜ boxplot_frame ๋ฉ”์†Œ๋“œ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์ง€๋งŒ BoxPlot (3๋ฒˆ ๋Œ“๊ธ€์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ hist )์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

boxplot_frame_groupby ๊ฒฝ์šฐ ์ž์„ธํžˆ ํ™•์ธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ BoxPlot ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋ณ€ํ™˜๊ธฐ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ๋Šฅ:

  • ๋“ฑ๋กํ•˜๋‹ค
  • ๋“ฑ๋ก ์ทจ์†Œ

๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ์—๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

pandas 0.23์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ œ๊ฑฐ ์˜ˆ์ •:

  • tsplot

์ด๋Ÿฌํ•œ ๊ฐ ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด @liirusuk์˜ ์ด ๋…ธํŠธ๋ถ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/python-sprints/pandas_plotting_library/blob/master/AllPlottingExamples.ipynb

CC: @pandas-dev/pandas-core @tacaswell , @jakevdp , @philippjfr , @PatrikHlobil

API Design Clean Needs Discussion Visualization

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค์Œ์€ ์ง„์ž…์  ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

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"]
}

์ด๋ฆ„ ์ง€์ •๊ณผ ๊ตฌํ˜„ ๊ฐ„์˜ ๊ธด๋ฐ€ํ•œ ๊ฒฐํ•ฉ์„ ๊นจ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  44 ๋Œ“๊ธ€

๋‚˜๋Š” ์Šค์™‘ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ 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 ํŒŒ์ผ)์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฑ์—”๋“œ๊ฐ€ ์ด๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์‚ฌ์–‘์œผ๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์€ ๊ตฌ์ฒดํ™”๋œ pandas API์˜ ํ‘œํ˜„๋ ฅ์— ์–ฝ๋งค์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. pandas๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€๋ฅผ ํ”Œ๋กœํŒ…ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์€ IR์„ ์ƒ์„ฑํ•˜๋Š” ๋‹ค๋ฅธ pydata ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. pydata ๊ณต๊ฐ„์—์„œ ๊ตํ™˜ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•œ ๊ณตํ†ต ์–ธ์–ด ํ™๋ณด
  4. ๋ณด๋‹ค ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๋„๊ตฌ๋ฅผ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  5. ์ž‘์„ฑํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์„ผํ‹ฐ๋ธŒ๊ฐ€ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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 ๋Š” ์ ‘๊ทผ์ž ํ”Œ๋กฏ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ฐฑ์—”๋“œ์— ์–ด๋–ค ๊ฒƒ๋„ ์œ„์ž„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”Œ๋กœํŒ… ํŒฌ๋”๋ฅผ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•  ์ผ์€ - ๋ฐฑ์—”๋“œ๊ฐ€ ๋‹ค์Œ์ž…๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค:

  • ๋ชจ๋“  ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋‘์‹ญ์‹œ์˜ค. hvplot์€ ์ ‘๊ทผ์ž์˜ ๋ชจ๋“  ํ”Œ๋กฏ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ํ”Œ๋กฏ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์€ ์ผ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์˜ register_converters์—์„œ ์ œ์™ธํ• ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ register_matplotlib_converters ์—์„œ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์˜ ๊ฒฝ์šฐ:

  • ๋ชจ๋“  ์ค‘๋ณต pandas.plotting.boxplot , Series.hist ,...
  • ์ ‘๊ทผ์ž(andrew_curves, radviz, parallel_curves,...)์—์„œ ํ˜ธ์ถœํ•  ๋ชจ๋“  ํ”Œ๋กฏ์„ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ 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 ๋ฉ”์†Œ๋“œ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ํ”Œ๋กฏ์•ก์„ธ์„œ
  • boxplot_frame
  • boxplot_frame_groupby
  • hist_frame
  • hist_series

๋‹ค๋ฅธ ํ”Œ๋กฏ(๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š”์ง€, matplotlib ๋ฐฑ์—”๋“œ์— ์œ„์ž„ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋˜๋Š” ์„ ํƒํ•œ ๋ฐฑ์—”๋“œ์— ์œ„์ž„ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋…ผ์˜ ์ค‘):

  • ์ƒ์ž ๊ทธ๋ฆผ
  • scatter_matrix
  • ๋ผ๋“œ๋น„์ฆˆ
  • andrews_curves
  • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ_ํ”Œ๋กฏ
  • ํ‰ํ–‰ ์ขŒํ‘œ
  • lag_plot
  • ์ž๊ธฐ์ƒ๊ด€_ํ”Œ๋กฏ
  • ํ…Œ์ด๋ธ”

pandas.plotting ๊ธฐํƒ€ ๊ณต๊ฐœ ํ•ญ๋ชฉ(ํ† ๋ก  ์ค‘):

  • plot_params
  • register_matplotlib_converters
  • deregister_matplotlib_converters

Other plots ์„น์…˜์˜ ๊ฒฝ์šฐ ๊ฐœ์ธ์ ์œผ๋กœ ํ˜„์‹œ์ ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ํŒฌ๋” ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐ +1์ด๋ฉฐ 0.25์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณ€ํ™˜๊ธฐ ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ register_matplotlib_converters ๊ฐ€ matplotlib๊ฐ€ ๋  ์ˆ˜ ์—†๋Š” ์„ ํƒ๋œ ํ”Œ๋กฏ์— ์œ„์ž„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์€ ํ™•์‹คํžˆ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฆ„์„ register_converters / deregister_converters ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํ˜„์žฌ ํ•ญ๋ชฉ์„ ํ๊ธฐํ•˜๊ณ  ๋ฐฑ์—”๋“œ์— ๊ณ„์† ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  • pandas.plotting ์—์„œ pandas.plotting.matplotlib ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์„ ํƒํ•œ ๋ฐฑ์—”๋“œ ๋Œ€์‹  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') ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™์‹œํ‚ฌ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

https://github.com/pandas-dev/pandas/blob/f1b9fc1fab93caa59aebcc738eed7813d9bd92ee/pandas/plotting/_core.py#L1550 -L1551

๊ทธ๋ ‡๋‹ค๋ฉด ์ด 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) ๋˜๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰