Files
pandas-ta/examples/Performance_Check.ipynb
T

1191 lines
40 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "3dbbe3ae-2e85-46a1-b4c7-5bc942978bb6",
"metadata": {},
"source": [
"# Indicator Performance Check\n",
"\n",
"This Notebook shows the **Indicator Performance** with and without TA Lib\n",
"* Results will vary if ```vectorbt``` or ```numba``` is installed.\n",
"* These values are based on a M1 Macbook with 16GB Memory."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "63c0934c-9bb3-4a3e-a65a-9f142aa346f9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Package Versions:\n",
"Pandas TA v0.3.32b0\n",
"Numba v0.55.1\n",
"talib v0.4.21\n"
]
}
],
"source": [
"from importlib.util import find_spec\n",
"\n",
"from numpy import version as numpy_version\n",
"from pandas import concat, IndexSlice\n",
"from pandas import IndexSlice as idx\n",
"import pandas_ta as ta\n",
"\n",
"print(\"Package Versions:\")\n",
"print(f\"Pandas TA v{ta.version}\")\n",
"\n",
"has_numba = find_spec(\"numba\") is not None\n",
"if has_numba:\n",
" from numba import __version__ as numba_version\n",
" print(f\"Numba v{numba_version}\")\n",
" \n",
"if find_spec(\"talib\") is not None:\n",
" from talib import __version__ as tal_version\n",
" print(f\"talib v{tal_version}\")\n",
"\n",
"from pandas import read_csv\n",
"from pandas import DatetimeIndex as dti\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"id": "68531949-cca4-47f5-89e7-00d77855e8a3",
"metadata": {},
"source": [
"### Fetch Sample Data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "efe05268-b2a1-4beb-9b7d-280e374d8d50",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[+] yf | SPY(1260, 7): 3380.2781 ms (3.3803 s)\n"
]
}
],
"source": [
"_df = ta.df.ta.ticker(\"SPY\", period=\"5y\", timed=True)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "3f7ad492-a70c-4367-a60e-92bd186f1afb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1260, 7)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = _df.copy()\n",
"df.shape"
]
},
{
"cell_type": "markdown",
"id": "ea75457d-9b95-41ae-9205-23b822c3a3d8",
"metadata": {},
"source": [
"### If ```numba``` installed, prep @njit"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "38176845-652e-43dc-b426-12eaa9952c5f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"============================================================\n",
" Slowest 10 Indicators [145]\n",
" Observations: 150\n",
"============================================================\n",
" secs ms\n",
"Indicator \n",
"alligator 1.45920 1459.2033\n",
"reflex 0.24182 241.8210\n",
"trendflex 0.16111 161.1101\n",
"td_seq 0.11252 112.5188\n",
"ssf 0.11095 110.9542\n",
"ssf3 0.09521 95.2070\n",
"qqe 0.02522 25.2180\n",
"psar 0.01386 13.8627\n",
"cdl_pattern 0.01341 13.4125\n",
"hilo 0.01055 10.5541\n",
"\n",
"============================================================\n",
"Time Stats:\n",
" secs ms\n",
"min 0.000020 0.023900\n",
"50% 0.001170 1.165000\n",
"mean 0.016922 16.921756\n",
"max 1.459200 1459.203300\n",
"total 2.453640 2453.654600\n",
"\n",
"============================================================\n",
"\n"
]
}
],
"source": [
"if has_numba:\n",
" ta.performance(df.iloc[-150:], top=10, talib=False)"
]
},
{
"cell_type": "markdown",
"id": "4ce3fb06-5ca6-44e2-a8f1-6c35af7c0c23",
"metadata": {},
"source": [
"## Performance **without** TA Lib"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "6404c4d7-3318-4749-a2b7-c5dd9c5e3f59",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"[+] aberration: 1.4722 ms (0.0015 s)\n",
"[+] accbands: 1.3315 ms (0.0013 s)\n",
"[+] ad: 1.0733 ms (0.0011 s)\n",
"[+] adosc: 1.8623 ms (0.0019 s)\n",
"[+] adx: 3.5369 ms (0.0035 s)\n",
"[+] alligator: 220.5254 ms (0.2205 s)\n",
"[+] alma: 0.6777 ms (0.0007 s)\n",
"[+] amat: 3.1196 ms (0.0031 s)\n",
"[+] ao: 0.5810 ms (0.0006 s)\n",
"[+] aobv: 6.0129 ms (0.0060 s)\n",
"[+] apo: 0.9975 ms (0.0010 s)\n",
"[+] aroon: 8.4711 ms (0.0085 s)\n",
"[+] atr: 1.6253 ms (0.0016 s)\n",
"[+] bbands: 1.6878 ms (0.0017 s)\n",
"[+] bias: 0.7043 ms (0.0007 s)\n",
"[+] bop: 0.9118 ms (0.0009 s)\n",
"[+] brar: 4.6133 ms (0.0046 s)\n",
"[+] cci: 16.5764 ms (0.0166 s)\n",
"[+] cdl_pattern: 11.0386 ms (0.0110 s)\n",
"[+] cdl_z: 1.8040 ms (0.0018 s)\n",
"[+] cfo: 0.4258 ms (0.0004 s)\n",
"[+] cg: 5.4734 ms (0.0055 s)\n",
"[+] chop: 1.6110 ms (0.0016 s)\n",
"[+] cksp: 1.4307 ms (0.0014 s)\n",
"[+] cmf: 1.2531 ms (0.0013 s)\n",
"[+] cmo: 2.4495 ms (0.0024 s)\n",
"[+] coppock: 0.3767 ms (0.0004 s)\n",
"[+] cti: 0.2171 ms (0.0002 s)\n",
"[+] cube: 0.6050 ms (0.0006 s)\n",
"[+] decay: 0.6650 ms (0.0007 s)\n",
"[+] decreasing: 0.3498 ms (0.0003 s)\n",
"[+] dema: 1.0834 ms (0.0011 s)\n",
"[+] dm: 2.4016 ms (0.0024 s)\n",
"[+] donchian: 1.0575 ms (0.0011 s)\n",
"[+] dpo: 0.5007 ms (0.0005 s)\n",
"[+] ebsw: 40.4991 ms (0.0405 s)\n",
"[+] efi: 0.4537 ms (0.0005 s)\n",
"[+] ema: 0.4947 ms (0.0005 s)\n",
"[+] entropy: 0.7234 ms (0.0007 s)\n",
"[+] eom: 1.0735 ms (0.0011 s)\n",
"[+] er: 0.7715 ms (0.0008 s)\n",
"[+] eri: 0.7635 ms (0.0008 s)\n",
"[+] fisher: 9.9180 ms (0.0099 s)\n",
"[+] fwma: 2.7818 ms (0.0028 s)\n",
"[+] ha: 77.3844 ms (0.0774 s)\n",
"[+] hilo: 84.6632 ms (0.0847 s)\n",
"[+] hl2: 0.3775 ms (0.0004 s)\n",
"[+] hlc3: 0.3831 ms (0.0004 s)\n",
"[+] hma: 0.4317 ms (0.0004 s)\n",
"[+] hwc: 8.5210 ms (0.0085 s)\n",
"[+] hwma: 6.6964 ms (0.0067 s)\n",
"[+] ifisher: 0.6250 ms (0.0006 s)\n",
"[+] increasing: 0.3676 ms (0.0004 s)\n",
"[+] inertia: 4.5042 ms (0.0045 s)\n",
"[+] jma: 28.7822 ms (0.0288 s)\n",
"[+] kama: 15.9558 ms (0.0160 s)\n",
"[+] kc: 0.9610 ms (0.0010 s)\n",
"[+] kdj: 1.6791 ms (0.0017 s)\n",
"[+] kst: 1.7736 ms (0.0018 s)\n",
"[+] kurtosis: 0.4567 ms (0.0005 s)\n",
"[+] kvo: 3.4107 ms (0.0034 s)\n",
"[+] linreg: 13.1770 ms (0.0132 s)\n",
"[+] log_return: 0.2290 ms (0.0002 s)\n",
"[+] long_run: 0.0252 ms (0.0000 s)\n",
"[+] macd: 2.7349 ms (0.0027 s)\n",
"[+] mad: 15.1011 ms (0.0151 s)\n",
"[+] massi: 1.3525 ms (0.0014 s)\n",
"[+] mcgd: 2.3523 ms (0.0024 s)\n",
"[+] median: 0.7421 ms (0.0007 s)\n",
"[+] mfi: 4.2362 ms (0.0042 s)\n",
"[+] midpoint: 0.6113 ms (0.0006 s)\n",
"[+] midprice: 0.7736 ms (0.0008 s)\n",
"[+] mom: 0.2211 ms (0.0002 s)\n",
"[+] natr: 1.8198 ms (0.0018 s)\n",
"[+] nvi: 2.7815 ms (0.0028 s)\n",
"[+] obv: 2.1530 ms (0.0022 s)\n",
"[+] ohlc4: 0.5163 ms (0.0005 s)\n",
"[+] pdist: 1.2728 ms (0.0013 s)\n",
"[+] percent_return: 0.2121 ms (0.0002 s)\n",
"[+] pgo: 0.6212 ms (0.0006 s)\n",
"[+] ppo: 1.6433 ms (0.0016 s)\n",
"[+] psar: 110.1239 ms (0.1101 s)\n",
"[+] psl: 1.8652 ms (0.0019 s)\n",
"[+] pvi: 2.9867 ms (0.0030 s)\n",
"[+] pvo: 0.7869 ms (0.0008 s)\n",
"[+] pvol: 0.3251 ms (0.0003 s)\n",
"[+] pvr: 1.4053 ms (0.0014 s)\n",
"[+] pvt: 0.4239 ms (0.0004 s)\n",
"[+] pwma: 2.2921 ms (0.0023 s)\n",
"[+] qqe: 202.4979 ms (0.2025 s)\n",
"[+] qstick: 0.5950 ms (0.0006 s)\n",
"[+] quantile: 0.8870 ms (0.0009 s)\n",
"[+] reflex: 0.2663 ms (0.0003 s)\n",
"[+] remap: 0.1999 ms (0.0002 s)\n",
"[+] rma: 0.3609 ms (0.0004 s)\n",
"[+] roc: 0.4297 ms (0.0004 s)\n",
"[+] rsi: 2.7048 ms (0.0027 s)\n",
"[+] rsx: 10.4901 ms (0.0105 s)\n",
"[+] rvgi: 8.2257 ms (0.0082 s)\n",
"[+] rvi: 4.5158 ms (0.0045 s)\n",
"[+] short_run: 0.0304 ms (0.0000 s)\n",
"[+] sinwma: 11.5249 ms (0.0115 s)\n",
"[+] skew: 0.3479 ms (0.0003 s)\n",
"[+] slope: 0.2849 ms (0.0003 s)\n",
"[+] sma: 0.4494 ms (0.0004 s)\n",
"[+] smi: 1.2362 ms (0.0012 s)\n",
"[+] smma: 72.9790 ms (0.0730 s)\n",
"[+] squeeze: 3.2773 ms (0.0033 s)\n",
"[+] squeeze_pro: 5.0077 ms (0.0050 s)\n",
"[+] ssf: 0.2083 ms (0.0002 s)\n",
"[+] ssf3: 0.1890 ms (0.0002 s)\n",
"[+] stc: 25.6936 ms (0.0257 s)\n",
"[+] stdev: 0.4910 ms (0.0005 s)\n",
"[+] stoch: 2.1889 ms (0.0022 s)\n",
"[+] stochf: 1.8831 ms (0.0019 s)\n",
"[+] stochrsi: 1.4041 ms (0.0014 s)\n",
"[+] supertrend: 55.8861 ms (0.0559 s)\n",
"[+] swma: 2.6545 ms (0.0027 s)\n",
"[+] t3: 2.6659 ms (0.0027 s)\n",
"[+] td_seq: 937.1583 ms (0.9372 s)\n",
"[+] tema: 1.8220 ms (0.0018 s)\n",
"[+] thermo: 1.6950 ms (0.0017 s)\n",
"[+] tos_stdevall: 3.3111 ms (0.0033 s)\n",
"[+] trendflex: 0.2563 ms (0.0003 s)\n",
"[+] trima: 0.7357 ms (0.0007 s)\n",
"[+] trix: 1.9558 ms (0.0020 s)\n",
"[+] true_range: 1.5495 ms (0.0015 s)\n",
"[+] tsi: 2.1724 ms (0.0022 s)\n",
"[+] tsignals: 0.0275 ms (0.0000 s)\n",
"[+] ttm_trend: 2.1432 ms (0.0021 s)\n",
"[+] ui: 1.4793 ms (0.0015 s)\n",
"[+] uo: 3.4682 ms (0.0035 s)\n",
"[+] variance: 0.4118 ms (0.0004 s)\n",
"[+] vhf: 1.1906 ms (0.0012 s)\n",
"[+] vidya: 51.9438 ms (0.0519 s)\n",
"[+] vortex: 1.8846 ms (0.0019 s)\n",
"[+] vwap: 2.2513 ms (0.0023 s)\n",
"[+] vwma: 0.4909 ms (0.0005 s)\n",
"[+] wb_tsv: 4.4283 ms (0.0044 s)\n",
"[+] wcp: 0.4215 ms (0.0004 s)\n",
"[+] willr: 1.0241 ms (0.0010 s)\n",
"[+] wma: 11.4104 ms (0.0114 s)\n",
"[+] xsignals: 0.0300 ms (0.0000 s)\n",
"[+] zlma: 0.7986 ms (0.0008 s)\n",
"[+] zscore: 1.0893 ms (0.0011 s)\n",
"\n",
"============================================================\n",
" Slowest 10 Indicators [145]\n",
" Observations: 1260\n",
"============================================================\n",
" secs ms\n",
"Indicator \n",
"td_seq 0.93716 937.1583\n",
"alligator 0.22053 220.5254\n",
"qqe 0.20250 202.4979\n",
"psar 0.11012 110.1239\n",
"hilo 0.08466 84.6632\n",
"ha 0.07738 77.3844\n",
"smma 0.07298 72.9790\n",
"supertrend 0.05589 55.8861\n",
"vidya 0.05194 51.9438\n",
"ebsw 0.04050 40.4991\n",
"\n",
"============================================================\n",
"Time Stats:\n",
" secs ms\n",
"min 0.000030 0.025200\n",
"50% 0.001470 1.472200\n",
"mean 0.015382 15.382661\n",
"max 0.937160 937.158300\n",
"total 2.230460 2230.485800\n",
"\n",
"============================================================\n",
"\n"
]
}
],
"source": [
"pta_speedsdf, pta_statsdf = ta.performance(df, top=10, talib=False, stats=True, gradient=True, verbose=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "b3a753e2-9634-4cc8-9544-5c28c92130a3",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style type=\"text/css\">\n",
"#T_93d3b_row0_col0, #T_93d3b_row0_col1 {\n",
" background-color: #ff0000;\n",
" color: #f1f1f1;\n",
"}\n",
"#T_93d3b_row1_col0, #T_93d3b_row1_col1 {\n",
" background-color: #ffcc00;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row2_col0, #T_93d3b_row2_col1 {\n",
" background-color: #ffd100;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row3_col0, #T_93d3b_row3_col1 {\n",
" background-color: #ffec00;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row4_col0, #T_93d3b_row4_col1 {\n",
" background-color: #fff300;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row5_col0, #T_93d3b_row5_col1 {\n",
" background-color: #fff500;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row6_col0, #T_93d3b_row6_col1 {\n",
" background-color: #fff600;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row7_col0, #T_93d3b_row7_col1 {\n",
" background-color: #fffb00;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row8_col0, #T_93d3b_row8_col1 {\n",
" background-color: #fffc00;\n",
" color: #000000;\n",
"}\n",
"#T_93d3b_row9_col0, #T_93d3b_row9_col1 {\n",
" background-color: #ffff00;\n",
" color: #000000;\n",
"}\n",
"</style>\n",
"<table id=\"T_93d3b_\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th class=\"col_heading level0 col0\" >secs</th>\n",
" <th class=\"col_heading level0 col1\" >ms</th>\n",
" </tr>\n",
" <tr>\n",
" <th class=\"index_name level0\" >Indicator</th>\n",
" <th class=\"blank col0\" >&nbsp;</th>\n",
" <th class=\"blank col1\" >&nbsp;</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row0\" class=\"row_heading level0 row0\" >td_seq</th>\n",
" <td id=\"T_93d3b_row0_col0\" class=\"data row0 col0\" >0.937160</td>\n",
" <td id=\"T_93d3b_row0_col1\" class=\"data row0 col1\" >937.158300</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row1\" class=\"row_heading level0 row1\" >alligator</th>\n",
" <td id=\"T_93d3b_row1_col0\" class=\"data row1 col0\" >0.220530</td>\n",
" <td id=\"T_93d3b_row1_col1\" class=\"data row1 col1\" >220.525400</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row2\" class=\"row_heading level0 row2\" >qqe</th>\n",
" <td id=\"T_93d3b_row2_col0\" class=\"data row2 col0\" >0.202500</td>\n",
" <td id=\"T_93d3b_row2_col1\" class=\"data row2 col1\" >202.497900</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row3\" class=\"row_heading level0 row3\" >psar</th>\n",
" <td id=\"T_93d3b_row3_col0\" class=\"data row3 col0\" >0.110120</td>\n",
" <td id=\"T_93d3b_row3_col1\" class=\"data row3 col1\" >110.123900</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row4\" class=\"row_heading level0 row4\" >hilo</th>\n",
" <td id=\"T_93d3b_row4_col0\" class=\"data row4 col0\" >0.084660</td>\n",
" <td id=\"T_93d3b_row4_col1\" class=\"data row4 col1\" >84.663200</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row5\" class=\"row_heading level0 row5\" >ha</th>\n",
" <td id=\"T_93d3b_row5_col0\" class=\"data row5 col0\" >0.077380</td>\n",
" <td id=\"T_93d3b_row5_col1\" class=\"data row5 col1\" >77.384400</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row6\" class=\"row_heading level0 row6\" >smma</th>\n",
" <td id=\"T_93d3b_row6_col0\" class=\"data row6 col0\" >0.072980</td>\n",
" <td id=\"T_93d3b_row6_col1\" class=\"data row6 col1\" >72.979000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row7\" class=\"row_heading level0 row7\" >supertrend</th>\n",
" <td id=\"T_93d3b_row7_col0\" class=\"data row7 col0\" >0.055890</td>\n",
" <td id=\"T_93d3b_row7_col1\" class=\"data row7 col1\" >55.886100</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row8\" class=\"row_heading level0 row8\" >vidya</th>\n",
" <td id=\"T_93d3b_row8_col0\" class=\"data row8 col0\" >0.051940</td>\n",
" <td id=\"T_93d3b_row8_col1\" class=\"data row8 col1\" >51.943800</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_93d3b_level0_row9\" class=\"row_heading level0 row9\" >ebsw</th>\n",
" <td id=\"T_93d3b_row9_col0\" class=\"data row9 col0\" >0.040500</td>\n",
" <td id=\"T_93d3b_row9_col1\" class=\"data row9 col1\" >40.499100</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x1512e5040>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pta_speedsdf"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "715520de-ad95-47a6-aa41-5f00d1b23eac",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>secs</th>\n",
" <th>ms</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000030</td>\n",
" <td>0.025200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>0.001470</td>\n",
" <td>1.472200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.015382</td>\n",
" <td>15.382661</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>0.937160</td>\n",
" <td>937.158300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>total</th>\n",
" <td>2.230460</td>\n",
" <td>2230.485800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" secs ms\n",
"min 0.000030 0.025200\n",
"50% 0.001470 1.472200\n",
"mean 0.015382 15.382661\n",
"max 0.937160 937.158300\n",
"total 2.230460 2230.485800"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pta_statsdf"
]
},
{
"cell_type": "markdown",
"id": "942e3b8a-e3d9-480f-82b4-75d311b54cfa",
"metadata": {},
"source": [
"## Performance **with** TA Lib"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b4757c9e-7a8f-4b82-93a9-8b3e4837a1d0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"[+] aberration: 1.6333 ms (0.0016 s)\n",
"[+] accbands: 2.0687 ms (0.0021 s)\n",
"[+] ad: 0.6342 ms (0.0006 s)\n",
"[+] adosc: 0.5248 ms (0.0005 s)\n",
"[+] adx: 3.4648 ms (0.0035 s)\n",
"[+] alligator: 225.9000 ms (0.2259 s)\n",
"[+] alma: 0.5783 ms (0.0006 s)\n",
"[+] amat: 2.2699 ms (0.0023 s)\n",
"[+] ao: 0.5630 ms (0.0006 s)\n",
"[+] aobv: 3.0264 ms (0.0030 s)\n",
"[+] apo: 0.2437 ms (0.0002 s)\n",
"[+] aroon: 0.6769 ms (0.0007 s)\n",
"[+] atr: 0.4435 ms (0.0004 s)\n",
"[+] bbands: 1.0109 ms (0.0010 s)\n",
"[+] bias: 0.3372 ms (0.0003 s)\n",
"[+] bop: 0.5036 ms (0.0005 s)\n",
"[+] brar: 4.3784 ms (0.0044 s)\n",
"[+] cci: 0.5048 ms (0.0005 s)\n",
"[+] cdl_pattern: 11.8356 ms (0.0118 s)\n",
"[+] cdl_z: 1.7994 ms (0.0018 s)\n",
"[+] cfo: 0.4170 ms (0.0004 s)\n",
"[+] cg: 5.3630 ms (0.0054 s)\n",
"[+] chop: 1.3467 ms (0.0013 s)\n",
"[+] cksp: 1.7165 ms (0.0017 s)\n",
"[+] cmf: 1.4513 ms (0.0015 s)\n",
"[+] cmo: 0.2392 ms (0.0002 s)\n",
"[+] coppock: 0.3602 ms (0.0004 s)\n",
"[+] cti: 0.2123 ms (0.0002 s)\n",
"[+] cube: 0.6690 ms (0.0007 s)\n",
"[+] decay: 0.7886 ms (0.0008 s)\n",
"[+] decreasing: 0.3615 ms (0.0004 s)\n",
"[+] dema: 0.2139 ms (0.0002 s)\n",
"[+] dm: 0.5525 ms (0.0006 s)\n",
"[+] donchian: 1.0676 ms (0.0011 s)\n",
"[+] dpo: 0.5136 ms (0.0005 s)\n",
"[+] ebsw: 40.0562 ms (0.0401 s)\n",
"[+] efi: 0.4580 ms (0.0005 s)\n",
"[+] ema: 0.1940 ms (0.0002 s)\n",
"[+] entropy: 0.9792 ms (0.0010 s)\n",
"[+] eom: 1.0946 ms (0.0011 s)\n",
"[+] er: 0.7109 ms (0.0007 s)\n",
"[+] eri: 0.7485 ms (0.0007 s)\n",
"[+] fisher: 10.0558 ms (0.0101 s)\n",
"[+] fwma: 2.4774 ms (0.0025 s)\n",
"[+] ha: 76.2901 ms (0.0763 s)\n",
"[+] hilo: 85.5753 ms (0.0856 s)\n",
"[+] hl2: 0.4205 ms (0.0004 s)\n",
"[+] hlc3: 0.4163 ms (0.0004 s)\n",
"[+] hma: 0.4381 ms (0.0004 s)\n",
"[+] hwc: 8.7005 ms (0.0087 s)\n",
"[+] hwma: 6.8465 ms (0.0068 s)\n",
"[+] ifisher: 0.9197 ms (0.0009 s)\n",
"[+] increasing: 0.3971 ms (0.0004 s)\n",
"[+] inertia: 4.6250 ms (0.0046 s)\n",
"[+] jma: 30.0011 ms (0.0300 s)\n",
"[+] kama: 16.3468 ms (0.0163 s)\n",
"[+] kc: 1.0322 ms (0.0010 s)\n",
"[+] kdj: 1.7615 ms (0.0018 s)\n",
"[+] kst: 1.7984 ms (0.0018 s)\n",
"[+] kurtosis: 0.4013 ms (0.0004 s)\n",
"[+] kvo: 3.6646 ms (0.0037 s)\n",
"[+] linreg: 0.2294 ms (0.0002 s)\n",
"[+] log_return: 0.2223 ms (0.0002 s)\n",
"[+] long_run: 0.0255 ms (0.0000 s)\n",
"[+] macd: 0.5045 ms (0.0005 s)\n",
"[+] mad: 15.2406 ms (0.0152 s)\n",
"[+] massi: 0.8263 ms (0.0008 s)\n",
"[+] mcgd: 2.4424 ms (0.0024 s)\n",
"[+] median: 0.8675 ms (0.0009 s)\n",
"[+] mfi: 0.5305 ms (0.0005 s)\n",
"[+] midpoint: 0.1971 ms (0.0002 s)\n",
"[+] midprice: 0.2916 ms (0.0003 s)\n",
"[+] mom: 0.1814 ms (0.0002 s)\n",
"[+] natr: 0.3781 ms (0.0004 s)\n",
"[+] nvi: 2.9630 ms (0.0030 s)\n",
"[+] obv: 0.3137 ms (0.0003 s)\n",
"[+] ohlc4: 0.4619 ms (0.0005 s)\n",
"[+] pdist: 1.2474 ms (0.0012 s)\n",
"[+] percent_return: 0.2060 ms (0.0002 s)\n",
"[+] pgo: 0.6143 ms (0.0006 s)\n",
"[+] ppo: 0.5673 ms (0.0006 s)\n",
"[+] psar: 110.0718 ms (0.1101 s)\n",
"[+] psl: 1.6052 ms (0.0016 s)\n",
"[+] pvi: 2.9368 ms (0.0029 s)\n",
"[+] pvo: 0.7872 ms (0.0008 s)\n",
"[+] pvol: 0.3260 ms (0.0003 s)\n",
"[+] pvr: 1.3928 ms (0.0014 s)\n",
"[+] pvt: 0.4209 ms (0.0004 s)\n",
"[+] pwma: 2.8796 ms (0.0029 s)\n",
"[+] qqe: 202.6627 ms (0.2027 s)\n",
"[+] qstick: 0.6878 ms (0.0007 s)\n",
"[+] quantile: 0.8532 ms (0.0009 s)\n",
"[+] reflex: 0.2722 ms (0.0003 s)\n",
"[+] remap: 0.2016 ms (0.0002 s)\n",
"[+] rma: 0.3881 ms (0.0004 s)\n",
"[+] roc: 0.2223 ms (0.0002 s)\n",
"[+] rsi: 0.2119 ms (0.0002 s)\n",
"[+] rsx: 10.3597 ms (0.0104 s)\n",
"[+] rvgi: 8.5408 ms (0.0085 s)\n",
"[+] rvi: 4.7764 ms (0.0048 s)\n",
"[+] short_run: 0.0288 ms (0.0000 s)\n",
"[+] sinwma: 11.0433 ms (0.0110 s)\n",
"[+] skew: 0.3478 ms (0.0003 s)\n",
"[+] slope: 0.2846 ms (0.0003 s)\n",
"[+] sma: 0.1960 ms (0.0002 s)\n",
"[+] smi: 1.1860 ms (0.0012 s)\n",
"[+] smma: 73.3924 ms (0.0734 s)\n",
"[+] squeeze: 3.2106 ms (0.0032 s)\n",
"[+] squeeze_pro: 5.7890 ms (0.0058 s)\n",
"[+] ssf: 0.2241 ms (0.0002 s)\n",
"[+] ssf3: 0.1953 ms (0.0002 s)\n",
"[+] stc: 25.6733 ms (0.0257 s)\n",
"[+] stdev: 0.2156 ms (0.0002 s)\n",
"[+] stoch: 0.6277 ms (0.0006 s)\n",
"[+] stochf: 0.6085 ms (0.0006 s)\n",
"[+] stochrsi: 1.4290 ms (0.0014 s)\n",
"[+] supertrend: 56.6423 ms (0.0566 s)\n",
"[+] swma: 2.4290 ms (0.0024 s)\n",
"[+] t3: 0.2316 ms (0.0002 s)\n",
"[+] td_seq: 943.5405 ms (0.9435 s)\n",
"[+] tema: 0.3132 ms (0.0003 s)\n",
"[+] thermo: 1.6780 ms (0.0017 s)\n",
"[+] tos_stdevall: 3.5226 ms (0.0035 s)\n",
"[+] trendflex: 0.2508 ms (0.0003 s)\n",
"[+] trima: 0.2124 ms (0.0002 s)\n",
"[+] trix: 0.9600 ms (0.0010 s)\n",
"[+] true_range: 0.4009 ms (0.0004 s)\n",
"[+] tsi: 0.8260 ms (0.0008 s)\n",
"[+] tsignals: 0.0260 ms (0.0000 s)\n",
"[+] ttm_trend: 2.2236 ms (0.0022 s)\n",
"[+] ui: 1.1523 ms (0.0012 s)\n",
"[+] uo: 0.4464 ms (0.0004 s)\n",
"[+] variance: 0.1921 ms (0.0002 s)\n",
"[+] vhf: 1.3115 ms (0.0013 s)\n",
"[+] vidya: 52.4157 ms (0.0524 s)\n",
"[+] vortex: 1.6645 ms (0.0017 s)\n",
"[+] vwap: 2.1985 ms (0.0022 s)\n",
"[+] vwma: 0.5217 ms (0.0005 s)\n",
"[+] wb_tsv: 4.3712 ms (0.0044 s)\n",
"[+] wcp: 0.4314 ms (0.0004 s)\n",
"[+] willr: 0.4010 ms (0.0004 s)\n",
"[+] wma: 0.1849 ms (0.0002 s)\n",
"[+] xsignals: 0.0256 ms (0.0000 s)\n",
"[+] zlma: 0.3768 ms (0.0004 s)\n",
"[+] zscore: 0.4050 ms (0.0004 s)\n",
"\n",
"============================================================\n",
" Slowest 10 Indicators [145]\n",
" Observations[talib]: 1260\n",
"============================================================\n",
" secs ms\n",
"Indicator \n",
"td_seq 0.94354 943.5405\n",
"alligator 0.22590 225.9000\n",
"qqe 0.20266 202.6627\n",
"psar 0.11007 110.0718\n",
"hilo 0.08558 85.5753\n",
"ha 0.07629 76.2901\n",
"smma 0.07339 73.3924\n",
"supertrend 0.05664 56.6423\n",
"vidya 0.05242 52.4157\n",
"ebsw 0.04006 40.0562\n",
"\n",
"============================================================\n",
"Time Stats:\n",
" secs ms\n",
"min 0.000030 0.025500\n",
"50% 0.000710 0.710900\n",
"mean 0.014868 14.867553\n",
"max 0.943540 943.540500\n",
"total 2.155790 2155.795200\n",
"\n",
"============================================================\n",
"\n"
]
}
],
"source": [
"tal_speedsdf, tal_statsdf = ta.performance(df, top=10, talib=True, stats=True, gradient=True, verbose=True)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "3fe877e5-b1eb-4e68-9720-67a1e7ee6827",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style type=\"text/css\">\n",
"#T_c947d_row0_col0, #T_c947d_row0_col1 {\n",
" background-color: #ff0000;\n",
" color: #f1f1f1;\n",
"}\n",
"#T_c947d_row1_col0, #T_c947d_row1_col1 {\n",
" background-color: #ffcb00;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row2_col0, #T_c947d_row2_col1 {\n",
" background-color: #ffd100;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row3_col0, #T_c947d_row3_col1 {\n",
" background-color: #ffec00;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row4_col0, #T_c947d_row4_col1 {\n",
" background-color: #fff300;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row5_col0, #T_c947d_row5_col1 {\n",
" background-color: #fff500;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row6_col0, #T_c947d_row6_col1 {\n",
" background-color: #fff600;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row7_col0, #T_c947d_row7_col1 {\n",
" background-color: #fffb00;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row8_col0, #T_c947d_row8_col1 {\n",
" background-color: #fffc00;\n",
" color: #000000;\n",
"}\n",
"#T_c947d_row9_col0, #T_c947d_row9_col1 {\n",
" background-color: #ffff00;\n",
" color: #000000;\n",
"}\n",
"</style>\n",
"<table id=\"T_c947d_\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th class=\"col_heading level0 col0\" >secs</th>\n",
" <th class=\"col_heading level0 col1\" >ms</th>\n",
" </tr>\n",
" <tr>\n",
" <th class=\"index_name level0\" >Indicator</th>\n",
" <th class=\"blank col0\" >&nbsp;</th>\n",
" <th class=\"blank col1\" >&nbsp;</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row0\" class=\"row_heading level0 row0\" >td_seq</th>\n",
" <td id=\"T_c947d_row0_col0\" class=\"data row0 col0\" >0.943540</td>\n",
" <td id=\"T_c947d_row0_col1\" class=\"data row0 col1\" >943.540500</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row1\" class=\"row_heading level0 row1\" >alligator</th>\n",
" <td id=\"T_c947d_row1_col0\" class=\"data row1 col0\" >0.225900</td>\n",
" <td id=\"T_c947d_row1_col1\" class=\"data row1 col1\" >225.900000</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row2\" class=\"row_heading level0 row2\" >qqe</th>\n",
" <td id=\"T_c947d_row2_col0\" class=\"data row2 col0\" >0.202660</td>\n",
" <td id=\"T_c947d_row2_col1\" class=\"data row2 col1\" >202.662700</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row3\" class=\"row_heading level0 row3\" >psar</th>\n",
" <td id=\"T_c947d_row3_col0\" class=\"data row3 col0\" >0.110070</td>\n",
" <td id=\"T_c947d_row3_col1\" class=\"data row3 col1\" >110.071800</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row4\" class=\"row_heading level0 row4\" >hilo</th>\n",
" <td id=\"T_c947d_row4_col0\" class=\"data row4 col0\" >0.085580</td>\n",
" <td id=\"T_c947d_row4_col1\" class=\"data row4 col1\" >85.575300</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row5\" class=\"row_heading level0 row5\" >ha</th>\n",
" <td id=\"T_c947d_row5_col0\" class=\"data row5 col0\" >0.076290</td>\n",
" <td id=\"T_c947d_row5_col1\" class=\"data row5 col1\" >76.290100</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row6\" class=\"row_heading level0 row6\" >smma</th>\n",
" <td id=\"T_c947d_row6_col0\" class=\"data row6 col0\" >0.073390</td>\n",
" <td id=\"T_c947d_row6_col1\" class=\"data row6 col1\" >73.392400</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row7\" class=\"row_heading level0 row7\" >supertrend</th>\n",
" <td id=\"T_c947d_row7_col0\" class=\"data row7 col0\" >0.056640</td>\n",
" <td id=\"T_c947d_row7_col1\" class=\"data row7 col1\" >56.642300</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row8\" class=\"row_heading level0 row8\" >vidya</th>\n",
" <td id=\"T_c947d_row8_col0\" class=\"data row8 col0\" >0.052420</td>\n",
" <td id=\"T_c947d_row8_col1\" class=\"data row8 col1\" >52.415700</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_c947d_level0_row9\" class=\"row_heading level0 row9\" >ebsw</th>\n",
" <td id=\"T_c947d_row9_col0\" class=\"data row9 col0\" >0.040060</td>\n",
" <td id=\"T_c947d_row9_col1\" class=\"data row9 col1\" >40.056200</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x151557f70>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tal_speedsdf"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "bf35b59d-4253-41e3-895e-432a824789fb",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>secs</th>\n",
" <th>ms</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000030</td>\n",
" <td>0.025500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>0.000710</td>\n",
" <td>0.710900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.014868</td>\n",
" <td>14.867553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>0.943540</td>\n",
" <td>943.540500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>total</th>\n",
" <td>2.155790</td>\n",
" <td>2155.795200</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" secs ms\n",
"min 0.000030 0.025500\n",
"50% 0.000710 0.710900\n",
"mean 0.014868 14.867553\n",
"max 0.943540 943.540500\n",
"total 2.155790 2155.795200"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tal_statsdf"
]
},
{
"cell_type": "markdown",
"id": "c33c37fa-8062-4258-90ba-0c19d115698d",
"metadata": {},
"source": [
"# Comparisons"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "35454271-cee2-4bc0-84b7-4099730bb0ed",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1260, 7)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th>min</th>\n",
" <th>50%</th>\n",
" <th>mean</th>\n",
" <th>max</th>\n",
" <th>total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">TA Lib</th>\n",
" <th>secs</th>\n",
" <td>0.00003</td>\n",
" <td>0.00071</td>\n",
" <td>0.014868</td>\n",
" <td>0.94354</td>\n",
" <td>2.15579</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ms</th>\n",
" <td>0.02550</td>\n",
" <td>0.71090</td>\n",
" <td>14.867553</td>\n",
" <td>943.54050</td>\n",
" <td>2155.79520</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">Pandas TA</th>\n",
" <th>secs</th>\n",
" <td>0.00003</td>\n",
" <td>0.00147</td>\n",
" <td>0.015382</td>\n",
" <td>0.93716</td>\n",
" <td>2.23046</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ms</th>\n",
" <td>0.02520</td>\n",
" <td>1.47220</td>\n",
" <td>15.382661</td>\n",
" <td>937.15830</td>\n",
" <td>2230.48580</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" min 50% mean max total\n",
"TA Lib secs 0.00003 0.00071 0.014868 0.94354 2.15579\n",
" ms 0.02550 0.71090 14.867553 943.54050 2155.79520\n",
"Pandas TA secs 0.00003 0.00147 0.015382 0.93716 2.23046\n",
" ms 0.02520 1.47220 15.382661 937.15830 2230.48580"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(df.shape)\n",
"compdf = concat([tal_statsdf, pta_statsdf], keys=[\"TA Lib\", \"Pandas TA\"], axis=1).T\n",
"compdf"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "167b311f-5180-4abf-95e7-1b41a96a6a1d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>Differences</th>\n",
" <th>min</th>\n",
" <th>50%</th>\n",
" <th>mean</th>\n",
" <th>max</th>\n",
" <th>total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>secs</th>\n",
" <td>0.0000</td>\n",
" <td>0.00076</td>\n",
" <td>0.000515</td>\n",
" <td>0.00638</td>\n",
" <td>0.07467</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ms</th>\n",
" <td>0.0003</td>\n",
" <td>0.76130</td>\n",
" <td>0.515108</td>\n",
" <td>6.38220</td>\n",
" <td>74.69060</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Differences min 50% mean max total\n",
"secs 0.0000 0.00076 0.000515 0.00638 0.07467\n",
"ms 0.0003 0.76130 0.515108 6.38220 74.69060"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diffdf = (tal_statsdf - pta_statsdf).abs().T\n",
"diffdf.columns.name = \"Differences\"\n",
"diffdf"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "25dc4fbc-9c04-4530-ae2d-283522ec8179",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
}
},
"nbformat": 4,
"nbformat_minor": 5
}