Skip to content

Instantly share code, notes, and snippets.

@kngwyu
Last active July 13, 2021 13:15
Show Gist options
  • Save kngwyu/1284feaffd15d7a8b2a5d9e9f9a2bcdb to your computer and use it in GitHub Desktop.
Save kngwyu/1284feaffd15d7a8b2a5d9e9f9a2bcdb to your computer and use it in GitHub Desktop.
Plot returns from D4RL datasets
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "45183aa7-15f1-4800-8aad-f8c3325ed1e7",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Warning: Flow failed to import. Set the environment variable D4RL_SUPPRESS_IMPORT_ERROR=1 to suppress this message.\n",
"No module named 'flow'\n",
"Warning: CARLA failed to import. Set the environment variable D4RL_SUPPRESS_IMPORT_ERROR=1 to suppress this message.\n",
"No module named 'carla'\n"
]
}
],
"source": [
"# Plot returns of D4RL datasets\n",
"# Author: Yuji Kanagawa (yuji.kanagawa@oist.jp)\n",
"# License: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0.html)\n",
"import typing as t\n",
"\n",
"import d4rl\n",
"import gym\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"\n",
"from matplotlib import pyplot as plt\n",
"\n",
"sns.set_theme(style=\"whitegrid\")\n",
"DataDict = t.Dict[str, np.ndarray]"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "6065160c-3d2c-4878-8752-e9ec7b2a15b2",
"metadata": {},
"outputs": [],
"source": [
"def get_d4rl_data(envname: str) -> DataDict:\n",
" env = gym.make(envname)\n",
" return env.get_dataset()\n",
"\n",
"def compute_return(data: DataDict) -> np.ndarray:\n",
" res = []\n",
" sum_ = 0.0\n",
" for reward, terminal in zip(data[\"rewards\"], data[\"terminals\"]):\n",
" sum_ += reward\n",
" if terminal:\n",
" res.append(sum_)\n",
" sum_ = 0.0\n",
" return res"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7a648925-49a4-4e1a-ab23-637edb2a79be",
"metadata": {},
"outputs": [],
"source": [
"LEVELS = [\"random\", \"medium\", \"expert\", \"medium-expert\", \"medium-replay\", \"full-replay\"]\n",
"\n",
"def get_all_level_returns(envprefix: str = \"hopper\", envsuffix: str = \"v1\") -> pd.DataFrame:\n",
" df = pd.DataFrame()\n",
" for level in LEVELS:\n",
" envname = f\"{envprefix}-{level}-{envsuffix}\"\n",
" env = gym.make(envname)\n",
" return_arr = compute_return(env.get_dataset())\n",
" levels = [level] * len(return_arr)\n",
" df = df.append(pd.DataFrame(dict(returns=return_arr, level=levels)))\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9870167e-1985-4333-a103-6e1e08ad4cd1",
"metadata": {},
"outputs": [],
"source": [
"def plot_return(env: str) -> None:\n",
" df = get_all_level_returns(env)\n",
" fig = plt.figure(f\"d4rl-{env}\", (10.0, 6.0))\n",
" ax = fig.subplots(1, 1)\n",
" sns.boxenplot(x=\"level\", y=\"returns\", color=\"b\", scale=\"linear\", data=df, ax=ax)\n",
" ax.set_title(f\"D4RL {env} Return distrib.\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "aa7a88af-53fb-4bc6-aa38-de3b11a6552e",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"load datafile: 100%|██████████| 9/9 [00:01<00:00, 7.54it/s]\n",
"load datafile: 100%|██████████| 21/21 [00:01<00:00, 17.15it/s]\n",
"load datafile: 100%|██████████| 21/21 [00:01<00:00, 17.55it/s]\n",
"load datafile: 100%|██████████| 9/9 [00:02<00:00, 3.80it/s]\n",
"load datafile: 100%|██████████| 11/11 [00:00<00:00, 17.07it/s]\n",
"load datafile: 100%|██████████| 11/11 [00:02<00:00, 5.40it/s]\n"
]
},
{
"data": {
"image/png": "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tGvXDvn5+U0aYyL6Pwx5RNRsJ06cQF5eHvr06YOsrCxcuXIFzz33HACgoqICJSUlGDRoED799FN07txZep1KpcKIESPw9ddfY+3atTa9DIdGo4GnpyeuXr2K+++/HwCQk5ODoKAg6Tl5eXkQRVEKejk5OYiIiJD6a84W5eTkwNPTExqNBlqtFtHR0dLybV1qhsfG9O/fH3/+85+RmJiIdevWNWn7NbVu3RoAUF5eLs2aXbt27Y7ruV1gYCAyMjKkx7du3bJa1q7J09MTM2bMwIwZM3D58mVMmTIF9913X4Nn1DZWW82l4Zs3b+L69esIDAxs3psgIi7XElHTlZaW4ttvv8XcuXMRFRWFnj174oEHHsChQ4ewe/du7N69G0uXLkVAQAB2795d78zLlClT8Nlnn1kFE4vFApPJJP1XUVHRrNrUajUiIyOxcuVKlJaW4sqVK9i4cSOioqKk5xQVFWHz5s2oqKjAl19+iYyMDISHh0v9e/bswfnz53Hr1i18+OGHGD58ONRqNaKiovDtt9/iyJEjEAQBJpMJx44dq/c4taaYNGkSjh49itOnTze6/fbt21udzOHv74+goCCkpaVBEARs37690ZM9mmP48OE4dOgQfvrpJ5jNZqxatareM4a///57nDlzBoIgoG3btvDw8JAujXN73U1lMBikfX/44Yd4+OGHOYtHdAcY8oioUVOnTpWOJUtOTsbkyZPxzjvvAKg6JqtDhw7Sf+3atUOLFi3QoUMH6R/72/Xs2RP9+vXDhg0bpLaFCxfioYcekv6bP39+s+t8++230apVKzz22GOIiYmBTqfDmDFjpP6HHnoIWVlZeOSRR5CUlIRVq1ZBo9FI/dHR0YiPj8egQYNgNpulmUatVot169bho48+wsCBAxEeHo4NGzbUG3yawt/fH9HR0dJMXkPbnzhxIg4cOIB+/fpJs31LlizBhg0bMGDAAJw/fx69e/e+41pu98ADD2DBggWIi4vD4MGD4evrW+fyL1B1IszMmTPRp08f6XjL6mBdV91NodPpsHbtWgwYMACnTp3C+++/L/WNHDnS6jhLIqqfShRFUe4iiIjsbefOnfj888+xbdu2Ovud7YLDRER3izN5RERERArEkEdERESkQFyuJSIiIlIgzuQRERERKRCvk3ebyspK3Lx5E56ennd1nSkiIiIiexNFERUVFWjTpk2tO9Mw5N3m5s2bVjddJyIiInJ2PXr0gI+Pj1UbQ95tqm/F06NHjzu65RIRERGRo5jNZpw9e7bOWwky5N2meonWy8sL3t7eMldDRERE1Li6DjHjiRdERERECsSQR0RERKRADHlERERECsSQR0RERKRADgl5RqMRL7/8MoYPH45Ro0ZhxowZKCoqAgBcuHAB48ePx/DhwzF+/HhcvHhRep09+oiIiIjcgUNCnkqlwksvvYQDBw5g79696NKlC1asWAEASEhIQExMDA4cOICYmBgsWLBAep09+oiIiIjcgUNCnp+fHwYMGCA97tWrF65evYrCwkKkp6dDp9MBAHQ6HdLT01FUVGSXPiIiIiJ34fDr5FVWVmLbtm2IiIhATk4OgoKCoFarAQBqtRqBgYHIycmBKIo27/P393f02yUiIiIXUFhYiICAALnLsCmHh7wlS5agdevWiI2NRXp6uqN332QnT56UuwQiIiJygKysLGzcuBGTJ0/GvffeK3c5NuPQkJeYmIisrCwkJyejRYsW0Gq1yMvLgyAIUKvVEAQB+fn50Gq1EEXR5n3NERYWxjteEBERKZwgCEhOTgYAfPnll0hOTpZWA12ByWSqd2LKYZdQWblyJU6ePIm1a9dK94QNCAhASEgI9Ho9AECv1yMkJAT+/v526SMiIiKqSa/Xw2g0AgCKi4ul/KAEKlEURXvv5Ny5c9DpdOjatStatmwJAOjcuTPWrl2LjIwMxMfH48aNG/D19UViYiK6desGAHbpa0x1IuZMHhERkbIZjUZMmTIF5eXlUlvLli2xfv16aDQaGStruoZyi0NCnithyCMiInIPu3fvxubNm1FRUSG1eXp6YtKkSYiOjpaxsqZrKLfwjhdERETklsLDw2sdf6dWqzFkyBCZKrIthjwiIiJySxqNBrGxsdIMmLe3N2JjY11mqbYxDHlERETktnQ6nRTqNBqNdDMFJWDIIyIiIrelVqsxe/ZsAMDs2bNd6vIpjXH4xZCJiIiInEloaCg2bdqkuDtecCaPiIiI3J7SAh7AkEdERESkSAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArEkEdERESkQAx5RERERArk4YidJCYm4sCBA7hy5Qr27t2LHj164PLly5g+fbr0nJKSEpSWluKHH34AAERERMDLywve3t4AgLi4OAwePBgAcOHCBcTHx6O4uBh+fn5ITExE165dG+0jIiIichcOCXnDhg3DxIkT8dxzz0ltnTt3RlpamvR42bJlEATB6nWrVq1Cjx49am0vISEBMTExiI6ORlpaGhYsWIDNmzc32kdERETkLhyyXNu3b19otdp6+81mM/bu3YsxY8Y0uq3CwkKkp6dDp9MBAHQ6HdLT01FUVNRgHxEREZE7cchMXmO++eYbBAUFITQ01Ko9Li4OoiiiT58+mDt3Lnx9fZGTk4OgoCCo1WoAgFqtRmBgIHJyciCKYr19/v7+Dn9fRERERHJxipC3Y8eOWrN4qamp0Gq1MJvNWLZsGRYvXowVK1Y4rKaTJ086bF9EREREtiZ7yMvLy8OPP/6I9957z6q9ennXy8sLMTExmDZtmtSel5cHQRCgVqshCALy8/Oh1WohimK9fc0VFhYmnfRBRERE5IxMJlO9E1OyX0Jl165dCA8Ph0ajkdrKyspQUlICABBFEfv27UNISAgAICAgACEhIdDr9QAAvV6PkJAQ+Pv7N9hHRERE5E5UoiiK9t7J0qVLcfDgQRQUFECj0cDPzw9ffPEFAGD48OF48803MWTIEOn52dnZeOWVVyAIAiorK9G9e3e89dZbCAwMBABkZGQgPj4eN27cgK+vLxITE9GtW7dG+5qiOhFzJo+IiIicXUO5xSEhz5Uw5BEREZGraCi3yL5cS0RERES2x5BHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeUREREQKxJBHREREpEAMeURERE6msLBQ7hLcjhLH3CEhLzExEREREejZsyfOnj0rtUdERCAyMhLR0dGIjo7GkSNH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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_return(\"hopper\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "67a92a4b-486a-4cb5-bd5c-4dbf044cbb57",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment