diff --git a/notebooks/strategy_analysis_example.ipynb b/notebooks/strategy_analysis_example.ipynb deleted file mode 100644 index 3eb015b..0000000 --- a/notebooks/strategy_analysis_example.ipynb +++ /dev/null @@ -1,455 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Strategy analysis example\n", - "\n", - "Debugging a strategy can be time-consuming. Freqtrade offers helper functions to visualize raw data.\n", - "The following assumes you work with SampleStrategy, data for 5m timeframe from Binance and have downloaded them into the data directory in the default location." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "ename": "OperationalException", - "evalue": "Directory `/home/sucess/10-academy/week-8/backtesting/notebooks/user_data` does not exist. Please use `freqtrade create-userdir` to create a user directory", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mOperationalException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# Initialize empty configuration object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mconfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mConfiguration\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_files\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;31m# Optionally, use existing configuration file\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m# config = Configuration.from_files([\"config.json\"])\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/algo/lib/python3.8/site-packages/freqtrade/configuration/configuration.py\u001b[0m in \u001b[0;36mfrom_files\u001b[0;34m(files)\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;31m# Keep this method as staticmethod, so it can be used from interactive environments\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mConfiguration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'config'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfiles\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mRunMode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOTHER\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_config\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mload_config\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/algo/lib/python3.8/site-packages/freqtrade/configuration/configuration.py\u001b[0m in \u001b[0;36mget_config\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 41\u001b[0m \"\"\"\n\u001b[1;32m 42\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfig\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 43\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload_config\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/algo/lib/python3.8/site-packages/freqtrade/configuration/configuration.py\u001b[0m in \u001b[0;36mload_config\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_trading_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 93\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_optimize_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 94\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_plot_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/algo/lib/python3.8/site-packages/freqtrade/configuration/configuration.py\u001b[0m in \u001b[0;36m_process_optimize_options\u001b[0;34m(self, config)\u001b[0m\n\u001b[1;32m 252\u001b[0m logstring='Parameter --timerange detected: {} ...')\n\u001b[1;32m 253\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 254\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_process_datadir_options\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 255\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m self._args_to_config(config, argname='strategy_list',\n", - "\u001b[0;32m~/anaconda3/envs/algo/lib/python3.8/site-packages/freqtrade/configuration/configuration.py\u001b[0m in \u001b[0;36m_process_datadir_options\u001b[0;34m(self, config)\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;31m# reset to user_data_dir so this contains the absolute path.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 185\u001b[0;31m \u001b[0mconfig\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'user_data_dir'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcreate_userdata_dir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'user_data_dir'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_dir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 186\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Using user-data directory: %s ...'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfig\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'user_data_dir'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/algo/lib/python3.8/site-packages/freqtrade/configuration/directory_operations.py\u001b[0m in \u001b[0;36mcreate_userdata_dir\u001b[0;34m(directory, create_dir)\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'Created user-data directory: {folder}'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m raise OperationalException(\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0;34mf\"Directory `{folder}` does not exist. \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \"Please use `freqtrade create-userdir` to create a user directory\")\n", - "\u001b[0;31mOperationalException\u001b[0m: Directory `/home/sucess/10-academy/week-8/backtesting/notebooks/user_data` does not exist. Please use `freqtrade create-userdir` to create a user directory" - ] - } - ], - "source": [ - "from pathlib import Path\n", - "from freqtrade.configuration import Configuration\n", - "\n", - "# Customize these according to your needs.\n", - "\n", - "# Initialize empty configuration object\n", - "config = Configuration.from_files([])\n", - "# Optionally, use existing configuration file\n", - "# config = Configuration.from_files([\"config.json\"])\n", - "\n", - "# Define some constants\n", - "config[\"timeframe\"] = \"5m\"\n", - "# Name of the strategy class\n", - "config[\"strategy\"] = \"SampleStrategy\"\n", - "# Location of the data\n", - "data_location = Path(config['user_data_dir'], 'data', 'binance')\n", - "# Pair to analyze - Only use one pair here\n", - "pair = \"BTC/USDT\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Load data using values set above\n", - "from freqtrade.data.history import load_pair_history\n", - "\n", - "candles = load_pair_history(datadir=data_location,\n", - " timeframe=config[\"timeframe\"],\n", - " pair=pair,\n", - " data_format = \"hdf5\",\n", - " )\n", - "\n", - "# Confirm success\n", - "print(\"Loaded \" + str(len(candles)) + f\" rows of data for {pair} from {data_location}\")\n", - "candles.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load and run strategy\n", - "* Rerun each time the strategy file is changed" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Load strategy using values set above\n", - "from freqtrade.resolvers import StrategyResolver\n", - "from freqtrade.data.dataprovider import DataProvider\n", - "strategy = StrategyResolver.load_strategy(config)\n", - "strategy.dp = DataProvider(config, None, None)\n", - "\n", - "# Generate buy/sell signals using strategy\n", - "df = strategy.analyze_ticker(candles, {'pair': pair})\n", - "df.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Display the trade details\n", - "\n", - "* Note that using `data.head()` would also work, however most indicators have some \"startup\" data at the top of the dataframe.\n", - "* Some possible problems\n", - " * Columns with NaN values at the end of the dataframe\n", - " * Columns used in `crossed*()` functions with completely different units\n", - "* Comparison with full backtest\n", - " * having 200 buy signals as output for one pair from `analyze_ticker()` does not necessarily mean that 200 trades will be made during backtesting.\n", - " * Assuming you use only one condition such as, `df['rsi'] < 30` as buy condition, this will generate multiple \"buy\" signals for each pair in sequence (until rsi returns > 29). The bot will only buy on the first of these signals (and also only if a trade-slot (\"max_open_trades\") is still available), or on one of the middle signals, as soon as a \"slot\" becomes available. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Report results\n", - "print(f\"Generated {df['buy'].sum()} buy signals\")\n", - "data = df.set_index('date', drop=False)\n", - "data.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load existing objects into a Jupyter notebook\n", - "\n", - "The following cells assume that you have already generated data using the cli. \n", - "They will allow you to drill deeper into your results, and perform analysis which otherwise would make the output very difficult to digest due to information overload." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load backtest results to pandas dataframe\n", - "\n", - "Analyze a trades dataframe (also used below for plotting)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from freqtrade.data.btanalysis import load_backtest_data, load_backtest_stats\n", - "\n", - "# if backtest_dir points to a directory, it'll automatically load the last backtest file.\n", - "backtest_dir = config[\"user_data_dir\"] / \"backtest_results\"\n", - "# backtest_dir can also point to a specific file \n", - "# backtest_dir = config[\"user_data_dir\"] / \"backtest_results/backtest-result-2020-07-01_20-04-22.json\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# You can get the full backtest statistics by using the following command.\n", - "# This contains all information used to generate the backtest result.\n", - "stats = load_backtest_stats(backtest_dir)\n", - "\n", - "strategy = 'SampleStrategy'\n", - "# All statistics are available per strategy, so if `--strategy-list` was used during backtest, this will be reflected here as well.\n", - "# Example usages:\n", - "print(stats['strategy'][strategy]['results_per_pair'])\n", - "# Get pairlist used for this backtest\n", - "print(stats['strategy'][strategy]['pairlist'])\n", - "# Get market change (average change of all pairs from start to end of the backtest period)\n", - "print(stats['strategy'][strategy]['market_change'])\n", - "# Maximum drawdown ()\n", - "print(stats['strategy'][strategy]['max_drawdown'])\n", - "# Maximum drawdown start and end\n", - "print(stats['strategy'][strategy]['drawdown_start'])\n", - "print(stats['strategy'][strategy]['drawdown_end'])\n", - "\n", - "\n", - "# Get strategy comparison (only relevant if multiple strategies were compared)\n", - "print(stats['strategy_comparison'])\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Load backtested trades as dataframe\n", - "trades = load_backtest_data(backtest_dir)\n", - "\n", - "# Show value-counts per pair\n", - "trades.groupby(\"pair\")[\"sell_reason\"].value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting daily profit / equity line" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Plotting equity line (starting with 0 on day 1 and adding daily profit for each backtested day)\n", - "\n", - "from freqtrade.configuration import Configuration\n", - "from freqtrade.data.btanalysis import load_backtest_data, load_backtest_stats\n", - "import plotly.express as px\n", - "import pandas as pd\n", - "\n", - "# strategy = 'SampleStrategy'\n", - "# config = Configuration.from_files([\"user_data/config.json\"])\n", - "# backtest_dir = config[\"user_data_dir\"] / \"backtest_results\"\n", - "\n", - "stats = load_backtest_stats(backtest_dir)\n", - "strategy_stats = stats['strategy'][strategy]\n", - "\n", - "dates = []\n", - "profits = []\n", - "for date_profit in strategy_stats['daily_profit']:\n", - " dates.append(date_profit[0])\n", - " profits.append(date_profit[1])\n", - "\n", - "equity = 0\n", - "equity_daily = []\n", - "for daily_profit in profits:\n", - " equity_daily.append(equity)\n", - " equity += float(daily_profit)\n", - "\n", - "\n", - "df = pd.DataFrame({'dates': dates,'equity_daily': equity_daily})\n", - "\n", - "fig = px.line(df, x=\"dates\", y=\"equity_daily\")\n", - "fig.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load live trading results into a pandas dataframe\n", - "\n", - "In case you did already some trading and want to analyze your performance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from freqtrade.data.btanalysis import load_trades_from_db\n", - "\n", - "# Fetch trades from database\n", - "trades = load_trades_from_db(\"sqlite:///tradesv3.sqlite\")\n", - "\n", - "# Display results\n", - "trades.groupby(\"pair\")[\"sell_reason\"].value_counts()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Analyze the loaded trades for trade parallelism\n", - "This can be useful to find the best `max_open_trades` parameter, when used with backtesting in conjunction with `--disable-max-market-positions`.\n", - "\n", - "`analyze_trade_parallelism()` returns a timeseries dataframe with an \"open_trades\" column, specifying the number of open trades for each candle." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from freqtrade.data.btanalysis import analyze_trade_parallelism\n", - "\n", - "# Analyze the above\n", - "parallel_trades = analyze_trade_parallelism(trades, '5m')\n", - "\n", - "parallel_trades.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot results\n", - "\n", - "Freqtrade offers interactive plotting capabilities based on plotly." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from freqtrade.plot.plotting import generate_candlestick_graph\n", - "# Limit graph period to keep plotly quick and reactive\n", - "\n", - "# Filter trades to one pair\n", - "trades_red = trades.loc[trades['pair'] == pair]\n", - "\n", - "data_red = data['2019-06-01':'2019-06-10']\n", - "# Generate candlestick graph\n", - "graph = generate_candlestick_graph(pair=pair,\n", - " data=data_red,\n", - " trades=trades_red,\n", - " indicators1=['sma20', 'ema50', 'ema55'],\n", - " indicators2=['rsi', 'macd', 'macdsignal', 'macdhist']\n", - " )\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Show graph inline\n", - "# graph.show()\n", - "\n", - "# Render graph in a seperate window\n", - "graph.show(renderer=\"browser\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot average profit per trade as distribution graph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import plotly.figure_factory as ff\n", - "\n", - "hist_data = [trades.profit_ratio]\n", - "group_labels = ['profit_ratio'] # name of the dataset\n", - "\n", - "fig = ff.create_distplot(hist_data, group_labels,bin_size=0.01)\n", - "fig.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Feel free to submit an issue or Pull Request enhancing this document if you would like to share ideas on how to best analyze the data." - ] - } - ], - "metadata": { - "file_extension": ".py", - "kernelspec": { - "display_name": "Python 3.8.8 ('algo')", - "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.8.8" - }, - "mimetype": "text/x-python", - "name": "python", - "npconvert_exporter": "python", - "pygments_lexer": "ipython3", - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - }, - "varInspector": { - "cols": { - "lenName": 16, - "lenType": 16, - "lenVar": 40 - }, - "kernels_config": { - "python": { - "delete_cmd_postfix": "", - "delete_cmd_prefix": "del ", - "library": "var_list.py", - "varRefreshCmd": "print(var_dic_list())" - }, - "r": { - "delete_cmd_postfix": ") ", - "delete_cmd_prefix": "rm(", - "library": "var_list.r", - "varRefreshCmd": "cat(var_dic_list()) " - } - }, - "types_to_exclude": [ - "module", - "function", - "builtin_function_or_method", - "instance", - "_Feature" - ], - "window_display": false - }, - "version": 3, - "vscode": { - "interpreter": { - "hash": "5c195208d85e33e610b646febdb8bf2a4830da0f45305cf92c296216c18ddbb8" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}