{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Scikit-oTree Tutorial\n", "\n", "\n", "Welcome to the Scikit-oTree tutorial. This package aims to integrate\n", "any experiment developed on-top of [oTree](otree.org), with the \n", "[Python Scientific-Stack](https://www.scipy.org/about.html); alowing\n", "the scientists to access a big collection of tools for analyse the\n", "experimental data." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'0.5'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import skotree\n", "skotree.VERSION" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Philosophy\n", "\n", "### 1. The data must be processed only by the oTree deployment.\n", "\n", "Scikit-oTree don't preprocess any data from the experiment. All the information\n", "are preserved exactly as any traditional export from oTree; the project only\n", "take this data and present it.\n", "\n", "### 2. The environment for analysis must not be modified.\n", "\n", "oTree uses some global configuration to make it run. Scikit-oTree don't store\n", "any global configuration alowwing to load data from different experiments\n", "without problems. All the oTree related processing always happen in an\n", "external process.\n", "\n", "### 3. Only one data type for the data.\n", "\n", "The data are always presented as a \n", "[Pandas DataFrame](https://pandas.pydata.org/pandas-docs/stable/overview.html)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Installation\n", "\n", "To install Scikit-oTree you must has Python and PIP. You can found\n", "a comprensive tutorial to install it [here](http://otree.readthedocs.io/en/latest/install.html#step-1-install-python).\n", "\n", "After that you only need to run\n", "\n", "```bash\n", "pip install -U scikit-otree\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Local - Loading the experiment\n", "\n", "To load your experiment you need to provide \n", "the location of the oTree deployment. This is the \n", "same location where the `setting.py` lives." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# this load the library\n", "import skotree\n", "\n", "# this load the experiment located\n", "# in the directory tests and\n", "experiment = skotree.oTree(\"./tests\")\n", "experiment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The previous code make a lot of things in background:\n", "\n", "1. First create an extra process deatached from the local one\n", " to extract all oTree related settings.\n", "2. Wait until the process to end.\n", "3. Check the result of the process and store the settings as\n", " atrribute for `experiment` object.\n", " \n", "Let's check the result" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "experiment.settings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the traditional object that you\n", "obtain in any oTree experiment if you\n", "write \n", "\n", "```python\n", "from django.conf import settings\n", "```\n", "Now let's check some information about the experiment, for example\n", "all the exiting oTree apps." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['matching_pennies']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "experiment.lsapps()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or maybe you want to see all the sessiong configured\n", "that uses all this apps" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['matching_pennies']" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "experiment.lssessions()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yikes! the app and the session has the same name. Let's check the full session configuration." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'app_sequence': ['matching_pennies'],\n", " 'display_name': 'Matching Pennies',\n", " 'doc': '',\n", " 'mturk_hit_settings': {'description': 'Description for your experiment',\n", " 'expiration_hours': 168,\n", " 'frame_height': 500,\n", " 'keywords': ['bonus', 'study'],\n", " 'minutes_allotted_per_assignment': 60,\n", " 'preview_template': 'global/MTurkPreview.html',\n", " 'qualification_requirements': [],\n", " 'title': 'Title for your experiment'},\n", " 'name': 'matching_pennies',\n", " 'num_demo_participants': 2,\n", " 'participation_fee': 0.0,\n", " 'real_world_currency_per_point': 0.0}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "experiment.session_config(\"matching_pennies\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Finally you can access any content of the *settings* object ussing the attribute showed before. For example, maybe you want to see the \"**currency code**\"" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'USD'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "experiment.settings.REAL_WORLD_CURRENCY_CODE" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Data\n", "\n", "Lets check the oTree server data tab\n", "\n", "![oTree Server Data Export](res/export.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see 4 kind of data can be exported from any experiment. \n", "\n", "### 1. All app\n", "\n", "This generates one DataFrame with one row per participant, and all rounds are stacjed horizontally. For Scikit-oTree this functionallity are exposed as `all_data()` method" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant.id_in_sessionparticipant.codeparticipant.labelparticipant._is_botparticipant._index_in_pagesparticipant._max_page_indexparticipant._current_app_nameparticipant._round_numberparticipant._current_page_nameparticipant.ip_address...matching_pennies.3.player.is_winnermatching_pennies.3.player.payoffmatching_pennies.3.group.id_in_subsessionmatching_pennies.3.subsession.round_numbermatching_pennies.4.player.id_in_groupmatching_pennies.4.player.penny_sidematching_pennies.4.player.is_winnermatching_pennies.4.player.payoffmatching_pennies.4.group.id_in_subsessionmatching_pennies.4.subsession.round_number
01bqkfd73tNaN0012NaNNaNNaNNaN...NaN0132NaNNaN014
125cznwllyNaN0012NaNNaNNaNNaN...NaN0131NaNNaN014
215b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...0.00132Tails1.010014
32x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...1.00131Tails0.0014
\n", "

4 rows × 49 columns

\n", "
" ], "text/plain": [ " participant.id_in_session participant.code participant.label \\\n", "0 1 bqkfd73t NaN \n", "1 2 5cznwlly NaN \n", "2 1 5b8zc5hr NaN \n", "3 2 x1f4ua8y NaN \n", "\n", " participant._is_bot participant._index_in_pages \\\n", "0 0 0 \n", "1 0 0 \n", "2 0 12 \n", "3 0 12 \n", "\n", " participant._max_page_index participant._current_app_name \\\n", "0 12 NaN \n", "1 12 NaN \n", "2 12 matching_pennies \n", "3 12 matching_pennies \n", "\n", " participant._round_number participant._current_page_name \\\n", "0 NaN NaN \n", "1 NaN NaN \n", "2 4.0 ResultsSummary \n", "3 4.0 ResultsSummary \n", "\n", " participant.ip_address ... \\\n", "0 NaN ... \n", "1 NaN ... \n", "2 127.0.0.1 ... \n", "3 127.0.0.1 ... \n", "\n", " matching_pennies.3.player.is_winner matching_pennies.3.player.payoff \\\n", "0 NaN 0 \n", "1 NaN 0 \n", "2 0.0 0 \n", "3 1.0 0 \n", "\n", " matching_pennies.3.group.id_in_subsession \\\n", "0 1 \n", "1 1 \n", "2 1 \n", "3 1 \n", "\n", " matching_pennies.3.subsession.round_number \\\n", "0 3 \n", "1 3 \n", "2 3 \n", "3 3 \n", "\n", " matching_pennies.4.player.id_in_group matching_pennies.4.player.penny_side \\\n", "0 2 NaN \n", "1 1 NaN \n", "2 2 Tails \n", "3 1 Tails \n", "\n", " matching_pennies.4.player.is_winner matching_pennies.4.player.payoff \\\n", "0 NaN 0 \n", "1 NaN 0 \n", "2 1.0 100 \n", "3 0.0 0 \n", "\n", " matching_pennies.4.group.id_in_subsession \\\n", "0 1 \n", "1 1 \n", "2 1 \n", "3 1 \n", "\n", " matching_pennies.4.subsession.round_number \n", "0 4 \n", "1 4 \n", "2 4 \n", "3 4 \n", "\n", "[4 rows x 49 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_data = experiment.all_data()\n", "all_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Per-App Data\n", "\n", "These data-frame contain a row for each player in the given app. If there are multiple rounds, there will be multiple rows for the same participant. To access this information you need to provide the application name to the method `app_data()`" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant.id_in_sessionparticipant.codeparticipant.labelparticipant._is_botparticipant._index_in_pagesparticipant._max_page_indexparticipant._current_app_nameparticipant._round_numberparticipant._current_page_nameparticipant.ip_address...player.payoffgroup.id_in_subsessionsubsession.round_numbersession.codesession.labelsession.experimenter_namesession.mturk_HITIdsession.mturk_HITGroupIdsession.commentsession.is_demo
01bqkfd73tNaN0012NaNNaNNaNNaN...011nvnpimbfNaNNaNNaNNaNNaN0
125cznwllyNaN0012NaNNaNNaNNaN...011nvnpimbfNaNNaNNaNNaNNaN0
21bqkfd73tNaN0012NaNNaNNaNNaN...012nvnpimbfNaNNaNNaNNaNNaN0
325cznwllyNaN0012NaNNaNNaNNaN...012nvnpimbfNaNNaNNaNNaNNaN0
41bqkfd73tNaN0012NaNNaNNaNNaN...013nvnpimbfNaNNaNNaNNaNNaN0
525cznwllyNaN0012NaNNaNNaNNaN...013nvnpimbfNaNNaNNaNNaNNaN0
61bqkfd73tNaN0012NaNNaNNaNNaN...014nvnpimbfNaNNaNNaNNaNNaN0
725cznwllyNaN0012NaNNaNNaNNaN...014nvnpimbfNaNNaNNaNNaNNaN0
815b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...011gh84ltglNaNNaNNaNNaNNaN1
92x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...011gh84ltglNaNNaNNaNNaNNaN1
1015b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...012gh84ltglNaNNaNNaNNaNNaN1
112x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...012gh84ltglNaNNaNNaNNaNNaN1
1215b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...013gh84ltglNaNNaNNaNNaNNaN1
132x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...013gh84ltglNaNNaNNaNNaNNaN1
1415b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...10014gh84ltglNaNNaNNaNNaNNaN1
152x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...014gh84ltglNaNNaNNaNNaNNaN1
\n", "

16 rows × 28 columns

\n", "
" ], "text/plain": [ " participant.id_in_session participant.code participant.label \\\n", "0 1 bqkfd73t NaN \n", "1 2 5cznwlly NaN \n", "2 1 bqkfd73t NaN \n", "3 2 5cznwlly NaN \n", "4 1 bqkfd73t NaN \n", "5 2 5cznwlly NaN \n", "6 1 bqkfd73t NaN \n", "7 2 5cznwlly NaN \n", "8 1 5b8zc5hr NaN \n", "9 2 x1f4ua8y NaN \n", "10 1 5b8zc5hr NaN \n", "11 2 x1f4ua8y NaN \n", "12 1 5b8zc5hr NaN \n", "13 2 x1f4ua8y NaN \n", "14 1 5b8zc5hr NaN \n", "15 2 x1f4ua8y NaN \n", "\n", " participant._is_bot participant._index_in_pages \\\n", "0 0 0 \n", "1 0 0 \n", "2 0 0 \n", "3 0 0 \n", "4 0 0 \n", "5 0 0 \n", "6 0 0 \n", "7 0 0 \n", "8 0 12 \n", "9 0 12 \n", "10 0 12 \n", "11 0 12 \n", "12 0 12 \n", "13 0 12 \n", "14 0 12 \n", "15 0 12 \n", "\n", " participant._max_page_index participant._current_app_name \\\n", "0 12 NaN \n", "1 12 NaN \n", "2 12 NaN \n", "3 12 NaN \n", "4 12 NaN \n", "5 12 NaN \n", "6 12 NaN \n", "7 12 NaN \n", "8 12 matching_pennies \n", "9 12 matching_pennies \n", "10 12 matching_pennies \n", "11 12 matching_pennies \n", "12 12 matching_pennies \n", "13 12 matching_pennies \n", "14 12 matching_pennies \n", "15 12 matching_pennies \n", "\n", " participant._round_number participant._current_page_name \\\n", "0 NaN NaN \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 4.0 ResultsSummary \n", "9 4.0 ResultsSummary \n", "10 4.0 ResultsSummary \n", "11 4.0 ResultsSummary \n", "12 4.0 ResultsSummary \n", "13 4.0 ResultsSummary \n", "14 4.0 ResultsSummary \n", "15 4.0 ResultsSummary \n", "\n", " participant.ip_address ... player.payoff \\\n", "0 NaN ... 0 \n", "1 NaN ... 0 \n", "2 NaN ... 0 \n", "3 NaN ... 0 \n", "4 NaN ... 0 \n", "5 NaN ... 0 \n", "6 NaN ... 0 \n", "7 NaN ... 0 \n", "8 127.0.0.1 ... 0 \n", "9 127.0.0.1 ... 0 \n", "10 127.0.0.1 ... 0 \n", "11 127.0.0.1 ... 0 \n", "12 127.0.0.1 ... 0 \n", "13 127.0.0.1 ... 0 \n", "14 127.0.0.1 ... 100 \n", "15 127.0.0.1 ... 0 \n", "\n", " group.id_in_subsession subsession.round_number session.code \\\n", "0 1 1 nvnpimbf \n", "1 1 1 nvnpimbf \n", "2 1 2 nvnpimbf \n", "3 1 2 nvnpimbf \n", "4 1 3 nvnpimbf \n", "5 1 3 nvnpimbf \n", "6 1 4 nvnpimbf \n", "7 1 4 nvnpimbf \n", "8 1 1 gh84ltgl \n", "9 1 1 gh84ltgl \n", "10 1 2 gh84ltgl \n", "11 1 2 gh84ltgl \n", "12 1 3 gh84ltgl \n", "13 1 3 gh84ltgl \n", "14 1 4 gh84ltgl \n", "15 1 4 gh84ltgl \n", "\n", " session.label session.experimenter_name session.mturk_HITId \\\n", "0 NaN NaN NaN \n", "1 NaN NaN NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN \n", "5 NaN NaN NaN \n", "6 NaN NaN NaN \n", "7 NaN NaN NaN \n", "8 NaN NaN NaN \n", "9 NaN NaN NaN \n", "10 NaN NaN NaN \n", "11 NaN NaN NaN \n", "12 NaN NaN NaN \n", "13 NaN NaN NaN \n", "14 NaN NaN NaN \n", "15 NaN NaN NaN \n", "\n", " session.mturk_HITGroupId session.comment session.is_demo \n", "0 NaN NaN 0 \n", "1 NaN NaN 0 \n", "2 NaN NaN 0 \n", "3 NaN NaN 0 \n", "4 NaN NaN 0 \n", "5 NaN NaN 0 \n", "6 NaN NaN 0 \n", "7 NaN NaN 0 \n", "8 NaN NaN 1 \n", "9 NaN NaN 1 \n", "10 NaN NaN 1 \n", "11 NaN NaN 1 \n", "12 NaN NaN 1 \n", "13 NaN NaN 1 \n", "14 NaN NaN 1 \n", "15 NaN NaN 1 \n", "\n", "[16 rows x 28 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = experiment.app_data(\"matching_pennies\")\n", "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the power of *pandas.DataFrame* you can easily filter the data" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant.codeplayer.penny_sideplayer.payoff
0bqkfd73tNaN0
15cznwllyNaN0
2bqkfd73tNaN0
35cznwllyNaN0
4bqkfd73tNaN0
55cznwllyNaN0
6bqkfd73tNaN0
75cznwllyNaN0
85b8zc5hrHeads0
9x1f4ua8yHeads0
105b8zc5hrHeads0
11x1f4ua8yTails0
125b8zc5hrHeads0
13x1f4ua8yTails0
145b8zc5hrTails100
15x1f4ua8yTails0
\n", "
" ], "text/plain": [ " participant.code player.penny_side player.payoff\n", "0 bqkfd73t NaN 0\n", "1 5cznwlly NaN 0\n", "2 bqkfd73t NaN 0\n", "3 5cznwlly NaN 0\n", "4 bqkfd73t NaN 0\n", "5 5cznwlly NaN 0\n", "6 bqkfd73t NaN 0\n", "7 5cznwlly NaN 0\n", "8 5b8zc5hr Heads 0\n", "9 x1f4ua8y Heads 0\n", "10 5b8zc5hr Heads 0\n", "11 x1f4ua8y Tails 0\n", "12 5b8zc5hr Heads 0\n", "13 x1f4ua8y Tails 0\n", "14 5b8zc5hr Tails 100\n", "15 x1f4ua8y Tails 0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filtered = data[[\"participant.code\", \"player.penny_side\", \"player.payoff\"]]\n", "filtered" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Describe the data" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
player.payoff
count16.00
mean6.25
std25.00
min0.00
25%0.00
50%0.00
75%0.00
max100.00
\n", "
" ], "text/plain": [ " player.payoff\n", "count 16.00\n", "mean 6.25\n", "std 25.00\n", "min 0.00\n", "25% 0.00\n", "50% 0.00\n", "75% 0.00\n", "max 100.00" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filtered.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "group by participant" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
player.payoff
countmeanstdmin25%50%75%max
participant.code
5b8zc5hr4.025.050.00.00.00.025.0100.0
5cznwlly4.00.00.00.00.00.00.00.0
bqkfd73t4.00.00.00.00.00.00.00.0
x1f4ua8y4.00.00.00.00.00.00.00.0
\n", "
" ], "text/plain": [ " player.payoff \n", " count mean std min 25% 50% 75% max\n", "participant.code \n", "5b8zc5hr 4.0 25.0 50.0 0.0 0.0 0.0 25.0 100.0\n", "5cznwlly 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "bqkfd73t 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "x1f4ua8y 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "group = filtered.groupby(\"participant.code\")\n", "group.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or check all the columns availables" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['participant.id_in_session', 'participant.code', 'participant.label',\n", " 'participant._is_bot', 'participant._index_in_pages',\n", " 'participant._max_page_index', 'participant._current_app_name',\n", " 'participant._round_number', 'participant._current_page_name',\n", " 'participant.ip_address', 'participant.time_started',\n", " 'participant.visited', 'participant.mturk_worker_id',\n", " 'participant.mturk_assignment_id', 'participant.payoff',\n", " 'player.id_in_group', 'player.penny_side', 'player.is_winner',\n", " 'player.payoff', 'group.id_in_subsession', 'subsession.round_number',\n", " 'session.code', 'session.label', 'session.experimenter_name',\n", " 'session.mturk_HITId', 'session.mturk_HITGroupId', 'session.comment',\n", " 'session.is_demo'],\n", " dtype='object')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Per-App Documentation\n", "\n", "The code \n", "\n", "```python\n", " experiment.app_doc(\"matching_pennies\")\n", "``` \n", "\n", "returns the full documentation about the data retrieved by `app_data()`\n", "\n", "### 4. Time spent on each page\n", "\n", "Time spent on each page" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
session_idparticipant__id_in_sessionparticipant__codepage_indexapp_namepage_nametime_stampseconds_on_pagesubsession_pkauto_submitted
0215b8zc5hr1matching_penniesChoice150951468145False
1215b8zc5hr2matching_penniesResultsWaitPage150951468655False
2215b8zc5hr4matching_penniesChoice150951469266False
3215b8zc5hr5matching_penniesResultsWaitPage150951469316False
4215b8zc5hr7matching_penniesChoice150951469637False
5215b8zc5hr8matching_penniesResultsWaitPage150951470157False
6215b8zc5hr10matching_penniesChoice150951470658False
7215b8zc5hr11matching_penniesResultsWaitPage150951470718False
822x1f4ua8y1matching_penniesChoice150951468575False
922x1f4ua8y2matching_penniesResultsWaitPage150951468505False
1022x1f4ua8y4matching_penniesChoice150951468946False
1122x1f4ua8y5matching_penniesResultsWaitPage150951469456False
1222x1f4ua8y7matching_penniesChoice150951469957False
1322x1f4ua8y8matching_penniesResultsWaitPage150951470017False
1422x1f4ua8y10matching_penniesChoice150951470228False
1522x1f4ua8y11matching_penniesResultsWaitPage150951470758False
\n", "
" ], "text/plain": [ " session_id participant__id_in_session participant__code page_index \\\n", "0 2 1 5b8zc5hr 1 \n", "1 2 1 5b8zc5hr 2 \n", "2 2 1 5b8zc5hr 4 \n", "3 2 1 5b8zc5hr 5 \n", "4 2 1 5b8zc5hr 7 \n", "5 2 1 5b8zc5hr 8 \n", "6 2 1 5b8zc5hr 10 \n", "7 2 1 5b8zc5hr 11 \n", "8 2 2 x1f4ua8y 1 \n", "9 2 2 x1f4ua8y 2 \n", "10 2 2 x1f4ua8y 4 \n", "11 2 2 x1f4ua8y 5 \n", "12 2 2 x1f4ua8y 7 \n", "13 2 2 x1f4ua8y 8 \n", "14 2 2 x1f4ua8y 10 \n", "15 2 2 x1f4ua8y 11 \n", "\n", " app_name page_name time_stamp seconds_on_page \\\n", "0 matching_pennies Choice 1509514681 4 \n", "1 matching_pennies ResultsWaitPage 1509514686 5 \n", "2 matching_pennies Choice 1509514692 6 \n", "3 matching_pennies ResultsWaitPage 1509514693 1 \n", "4 matching_pennies Choice 1509514696 3 \n", "5 matching_pennies ResultsWaitPage 1509514701 5 \n", "6 matching_pennies Choice 1509514706 5 \n", "7 matching_pennies ResultsWaitPage 1509514707 1 \n", "8 matching_pennies Choice 1509514685 7 \n", "9 matching_pennies ResultsWaitPage 1509514685 0 \n", "10 matching_pennies Choice 1509514689 4 \n", "11 matching_pennies ResultsWaitPage 1509514694 5 \n", "12 matching_pennies Choice 1509514699 5 \n", "13 matching_pennies ResultsWaitPage 1509514700 1 \n", "14 matching_pennies Choice 1509514702 2 \n", "15 matching_pennies ResultsWaitPage 1509514707 5 \n", "\n", " subsession_pk auto_submitted \n", "0 5 False \n", "1 5 False \n", "2 6 False \n", "3 6 False \n", "4 7 False \n", "5 7 False \n", "6 8 False \n", "7 8 False \n", "8 5 False \n", "9 5 False \n", "10 6 False \n", "11 6 False \n", "12 7 False \n", "13 7 False \n", "14 8 False \n", "15 8 False " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tspent = experiment.time_spent()\n", "tspent" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['session_id', 'participant__id_in_session', 'participant__code',\n", " 'page_index', 'app_name', 'page_name', 'time_stamp', 'seconds_on_page',\n", " 'subsession_pk', 'auto_submitted'],\n", " dtype='object')" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check the available columns\n", "tspent.columns " ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant__codepage_indexseconds_on_page
05b8zc5hr14
15b8zc5hr25
25b8zc5hr46
35b8zc5hr51
45b8zc5hr73
55b8zc5hr85
65b8zc5hr105
75b8zc5hr111
8x1f4ua8y17
9x1f4ua8y20
10x1f4ua8y44
11x1f4ua8y55
12x1f4ua8y75
13x1f4ua8y81
14x1f4ua8y102
15x1f4ua8y115
\n", "
" ], "text/plain": [ " participant__code page_index seconds_on_page\n", "0 5b8zc5hr 1 4\n", "1 5b8zc5hr 2 5\n", "2 5b8zc5hr 4 6\n", "3 5b8zc5hr 5 1\n", "4 5b8zc5hr 7 3\n", "5 5b8zc5hr 8 5\n", "6 5b8zc5hr 10 5\n", "7 5b8zc5hr 11 1\n", "8 x1f4ua8y 1 7\n", "9 x1f4ua8y 2 0\n", "10 x1f4ua8y 4 4\n", "11 x1f4ua8y 5 5\n", "12 x1f4ua8y 7 5\n", "13 x1f4ua8y 8 1\n", "14 x1f4ua8y 10 2\n", "15 x1f4ua8y 11 5" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# filter only the most important columns\n", "tspent = tspent[[\"participant__code\", \"page_index\", \"seconds_on_page\"]]\n", "tspent" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seconds_on_page
countmeanstdmin25%50%75%max
page_index
12.05.52.1213204.04.755.56.257.0
22.02.53.5355340.01.252.53.755.0
42.05.01.4142144.04.505.05.506.0
52.03.02.8284271.02.003.04.005.0
72.04.01.4142143.03.504.04.505.0
82.03.02.8284271.02.003.04.005.0
102.03.52.1213202.02.753.54.255.0
112.03.02.8284271.02.003.04.005.0
\n", "
" ], "text/plain": [ " seconds_on_page \n", " count mean std min 25% 50% 75% max\n", "page_index \n", "1 2.0 5.5 2.121320 4.0 4.75 5.5 6.25 7.0\n", "2 2.0 2.5 3.535534 0.0 1.25 2.5 3.75 5.0\n", "4 2.0 5.0 1.414214 4.0 4.50 5.0 5.50 6.0\n", "5 2.0 3.0 2.828427 1.0 2.00 3.0 4.00 5.0\n", "7 2.0 4.0 1.414214 3.0 3.50 4.0 4.50 5.0\n", "8 2.0 3.0 2.828427 1.0 2.00 3.0 4.00 5.0\n", "10 2.0 3.5 2.121320 2.0 2.75 3.5 4.25 5.0\n", "11 2.0 3.0 2.828427 1.0 2.00 3.0 4.00 5.0" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# lets describe the time expent by page\n", "tspent.groupby(\"page_index\").describe()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD8CAYAAABXe05zAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xl81NW9//HXmZns+2RjCZBhzQRQ\nZJmIcSXBDQXsda3axSpal2rtT22rKBZ7vbW9rdfr0uJSN1yqVXFXQFxAZAmLhCRAgABhS0L2PZk5\nvz8IXGtZZsjMfOc7+TwfDx5sk+/3rUk+nPmc8z1Haa0RQghhHhajAwghhPCNFG4hhDAZKdxCCGEy\nUriFEMJkpHALIYTJSOEWQgiTkcIthBAmI4VbCCFMRgq3EEKYjC0QF01LS9PZ2dmBuLQQQoSloqKi\nGq11ujevDUjhzs7OZvXq1YG4tBBChCWl1A5vXyutEiGEMBkp3EIIYTJSuIUQwmQC0uMWQvimq6uL\nyspK2tvbjY4iAiw6OpqsrCwiIiJO+BpSuIUIAZWVlSQkJJCdnY1Syug4IkC01hw4cIDKykocDscJ\nX8erVolSKlkp9aZSqkwpVaqUmnzCdxRC/Jv29nZSU1OlaIc5pRSpqam9fmfl7Yj7f4CPtdaXKqUi\ngdhe3VUI8W+kaPcN/vg8H3fErZRKAs4EngXQWndqret7fWfhd+VVTSwq2W90DCFEgHnTKnEA1cDf\nlVJrlVLPKKXivv8ipdQspdRqpdTq6upqvwcVx/bJxn1Mf3wZ17+4mrqWTqPjCCECyJvCbQPGA09p\nrU8BWoBff/9FWut5WuuJWuuJ6elePbUp/EBrzRNLyrnxpSJSYiMBWL2jzuBUQvju888/56KLLjI6\nhil4U7grgUqt9Yqe37/JwUIuDNbe5eb219bxx082MWPcAD68/QwibRZWbj9gdDQhRAAdd3JSa71P\nKbVLKTVKa70JKABKAh9NHMv+xnZueHE131Y2cNd5o7j57GEopRg3KJmV22uNjid64cH3NlKyp9Gv\n18wdkMgDF48+5mtaWlq4/PLLqaysxO12M3v2bIYPH86dd95Jc3MzaWlpPP/88/Tv35/y8nJuuukm\nqqursVqtvPHGGwwdOpS7776bjz76CKUU9913H1dccQWff/45c+bMIS0tjeLiYiZMmMDLL7+MUoqP\nP/6YO+64g9jYWE4//fTDWb744gtuv/124OBk3pdffklCQsK/ZdZa+3zPI8nOzubyyy/no48+IiYm\nhldeeYXhw4fz3nvv8dBDD9HZ2Ulqairz588nMzOT6upqfvjDH7Jnzx4mT57MwoULKSoqIi0tjZdf\nfpnHHnuMzs5O8vLyePLJJ7Farb347P07b5+cvA2Yr5T6FhgH/KdfUwifrN9Vz/THl1Je1cy8aydw\nyznDD39B5jnsFO9ppLmj2+CUwmw+/vhjBgwYwPr16ykuLub888/ntttu480336SoqIjrrruOe++9\nF4Crr76aW265hfXr1/P111/Tv39/3nrrLdatW8f69etZtGgRd911F3v37gVg7dq1PProo5SUlLBt\n2zaWLVtGe3s7N9xwA++99x5FRUXs27fvcJY//elPPPHEE6xbt46vvvqKmJiYI2b29Z7HkpSUxIYN\nG7j11lu54447ADj99NP55ptvWLt2LVdeeSWPPPIIAA8++CBTpkxh48aNXHrppezcuROA0tJSXn/9\ndZYtW8a6deuwWq3Mnz+/F5+VI/NqOaDWeh0w0e93Fz5bsG43d7/5LekJUbx182nk9Ev8l793Oez8\n72flrNlRx5kjZa7BjI43Mg6UsWPH8qtf/Yp77rmHiy66iJSUFIqLi5k6dSoAbreb/v3709TUxO7d\nu7nkkkuAg08CAixdupSrrroKq9VKZmYmZ511FqtWrSIxMRGXy0VWVhYA48aNo6Kigvj4eBwOByNG\njADgmmuuYd68eQDk5+dz5513cvXVV/ODH/zg8Md+n6/3/O6o/vuuuuqqwz//8pe/BA4+GHXFFVew\nd+9eOjs7Dz80s3TpUt5++20Azj//fFJSUgBYvHgxRUVFTJo0CYC2tjYyMjJ8/lwcjzw5aRIej+bP\nCzfz+JJyXNl2nrpmPKnxUf/2uvGDU7BaFCu310rhFj4ZOXIka9as4cMPP+S+++5jypQpjB49muXL\nl//L65qamny+dlTU/32tWq1WuruP/Y7w17/+NdOmTePDDz8kPz+fTz75hJycnIDe87ttlEO/vu22\n27jzzjuZPn364fbLsWit+fGPf8zDDz/sU1ZfySZTJtDS0c1NLxfx+JJyrpw0iJevzzti0QaIi7Ix\nZmCS9LmFz/bs2UNsbCzXXHMNd911FytWrKC6uvpw4e7q6mLjxo0kJCSQlZXFO++8A0BHRwetra2c\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# and lets make a plot but grouped by participant\n", "%matplotlib inline \n", "tspent.groupby(\"participant__code\")[[\"seconds_on_page\"]].plot();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Note

\n", "
\n", " This only show a simple example in how to use pandas.DataFrame to understand more, please check \n", "
\n", " \n", " https://pandas.pydata.org/pandas-docs/stable/tutorials.html\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simulate with bots\n", "\n", "Scikit-oTree offers out of the box the posibility to run the *oTree bot-based-tests* and retrieve all the data generated by them. \n", "\n", "The method `bot_data()` consume two arguments:\n", "\n", "1. The name of the session to simulate\n", "2. The number of participant \n", "\n", "And the return a dict like object (called `CSVStorage`) whith the same attributes as application has the session in the `app_sequence` key." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Running bots, please wait...\n", "[INFO|2017-11-01 05:38:44,513] skotree > Running bots, please wait...\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "storage = experiment.bot_data(\"matching_pennies\", 4)\n", "storage" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "as you can see the only available app (as we see before) is the `matching_pennies`.\n", "\n", "Lets extract the data" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant.id_in_sessionparticipant.codeparticipant.labelparticipant._is_botparticipant._index_in_pagesparticipant._max_page_indexparticipant._current_app_nameparticipant._round_numberparticipant._current_page_nameparticipant.ip_address...player.payoffgroup.id_in_subsessionsubsession.round_numbersession.codesession.labelsession.experimenter_namesession.mturk_HITIdsession.mturk_HITGroupIdsession.commentsession.is_demo
01n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...011fiezcoi1NaNNaNNaNNaNNaN0
12hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...011fiezcoi1NaNNaNNaNNaNNaN0
23gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...021fiezcoi1NaNNaNNaNNaNNaN0
34x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...021fiezcoi1NaNNaNNaNNaNNaN0
41n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...012fiezcoi1NaNNaNNaNNaNNaN0
52hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...012fiezcoi1NaNNaNNaNNaNNaN0
63gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...022fiezcoi1NaNNaNNaNNaNNaN0
74x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...022fiezcoi1NaNNaNNaNNaNNaN0
81n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...10013fiezcoi1NaNNaNNaNNaNNaN0
92hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...013fiezcoi1NaNNaNNaNNaNNaN0
103gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...10023fiezcoi1NaNNaNNaNNaNNaN0
114x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...023fiezcoi1NaNNaNNaNNaNNaN0
121n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...014fiezcoi1NaNNaNNaNNaNNaN0
132hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...014fiezcoi1NaNNaNNaNNaNNaN0
143gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...024fiezcoi1NaNNaNNaNNaNNaN0
154x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...024fiezcoi1NaNNaNNaNNaNNaN0
\n", "

16 rows × 28 columns

\n", "
" ], "text/plain": [ " participant.id_in_session participant.code participant.label \\\n", "0 1 n66opzy5 NaN \n", "1 2 hjvqfo1o NaN \n", "2 3 gq6vxupy NaN \n", "3 4 x80f6pv3 NaN \n", "4 1 n66opzy5 NaN \n", "5 2 hjvqfo1o NaN \n", "6 3 gq6vxupy NaN \n", "7 4 x80f6pv3 NaN \n", "8 1 n66opzy5 NaN \n", "9 2 hjvqfo1o NaN \n", "10 3 gq6vxupy NaN \n", "11 4 x80f6pv3 NaN \n", "12 1 n66opzy5 NaN \n", "13 2 hjvqfo1o NaN \n", "14 3 gq6vxupy NaN \n", "15 4 x80f6pv3 NaN \n", "\n", " participant._is_bot participant._index_in_pages \\\n", "0 1 12 \n", "1 1 12 \n", "2 1 12 \n", "3 1 12 \n", "4 1 12 \n", "5 1 12 \n", "6 1 12 \n", "7 1 12 \n", "8 1 12 \n", "9 1 12 \n", "10 1 12 \n", "11 1 12 \n", "12 1 12 \n", "13 1 12 \n", "14 1 12 \n", "15 1 12 \n", "\n", " participant._max_page_index participant._current_app_name \\\n", "0 12 matching_pennies \n", "1 12 matching_pennies \n", "2 12 matching_pennies \n", "3 12 matching_pennies \n", "4 12 matching_pennies \n", "5 12 matching_pennies \n", "6 12 matching_pennies \n", "7 12 matching_pennies \n", "8 12 matching_pennies \n", "9 12 matching_pennies \n", "10 12 matching_pennies \n", "11 12 matching_pennies \n", "12 12 matching_pennies \n", "13 12 matching_pennies \n", "14 12 matching_pennies \n", "15 12 matching_pennies \n", "\n", " participant._round_number participant._current_page_name \\\n", "0 4 ResultsSummary \n", "1 4 ResultsSummary \n", "2 4 ResultsSummary \n", "3 4 ResultsSummary \n", "4 4 ResultsSummary \n", "5 4 ResultsSummary \n", "6 4 ResultsSummary \n", "7 4 ResultsSummary \n", "8 4 ResultsSummary \n", "9 4 ResultsSummary \n", "10 4 ResultsSummary \n", "11 4 ResultsSummary \n", "12 4 ResultsSummary \n", "13 4 ResultsSummary \n", "14 4 ResultsSummary \n", "15 4 ResultsSummary \n", "\n", " participant.ip_address ... player.payoff \\\n", "0 127.0.0.1 ... 0 \n", "1 127.0.0.1 ... 0 \n", "2 127.0.0.1 ... 0 \n", "3 127.0.0.1 ... 0 \n", "4 127.0.0.1 ... 0 \n", "5 127.0.0.1 ... 0 \n", "6 127.0.0.1 ... 0 \n", "7 127.0.0.1 ... 0 \n", "8 127.0.0.1 ... 100 \n", "9 127.0.0.1 ... 0 \n", "10 127.0.0.1 ... 100 \n", "11 127.0.0.1 ... 0 \n", "12 127.0.0.1 ... 0 \n", "13 127.0.0.1 ... 0 \n", "14 127.0.0.1 ... 0 \n", "15 127.0.0.1 ... 0 \n", "\n", " group.id_in_subsession subsession.round_number session.code \\\n", "0 1 1 fiezcoi1 \n", "1 1 1 fiezcoi1 \n", "2 2 1 fiezcoi1 \n", "3 2 1 fiezcoi1 \n", "4 1 2 fiezcoi1 \n", "5 1 2 fiezcoi1 \n", "6 2 2 fiezcoi1 \n", "7 2 2 fiezcoi1 \n", "8 1 3 fiezcoi1 \n", "9 1 3 fiezcoi1 \n", "10 2 3 fiezcoi1 \n", "11 2 3 fiezcoi1 \n", "12 1 4 fiezcoi1 \n", "13 1 4 fiezcoi1 \n", "14 2 4 fiezcoi1 \n", "15 2 4 fiezcoi1 \n", "\n", " session.label session.experimenter_name session.mturk_HITId \\\n", "0 NaN NaN NaN \n", "1 NaN NaN NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN \n", "5 NaN NaN NaN \n", "6 NaN NaN NaN \n", "7 NaN NaN NaN \n", "8 NaN NaN NaN \n", "9 NaN NaN NaN \n", "10 NaN NaN NaN \n", "11 NaN NaN NaN \n", "12 NaN NaN NaN \n", "13 NaN NaN NaN \n", "14 NaN NaN NaN \n", "15 NaN NaN NaN \n", "\n", " session.mturk_HITGroupId session.comment session.is_demo \n", "0 NaN NaN 0 \n", "1 NaN NaN 0 \n", "2 NaN NaN 0 \n", "3 NaN NaN 0 \n", "4 NaN NaN 0 \n", "5 NaN NaN 0 \n", "6 NaN NaN 0 \n", "7 NaN NaN 0 \n", "8 NaN NaN 0 \n", "9 NaN NaN 0 \n", "10 NaN NaN 0 \n", "11 NaN NaN 0 \n", "12 NaN NaN 0 \n", "13 NaN NaN 0 \n", "14 NaN NaN 0 \n", "15 NaN NaN 0 \n", "\n", "[16 rows x 28 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "storage[\"matching_pennies\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "also for convenience the sintax `storage.matching_pennied` are available" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant.id_in_sessionparticipant.codeparticipant.labelparticipant._is_botparticipant._index_in_pagesparticipant._max_page_indexparticipant._current_app_nameparticipant._round_numberparticipant._current_page_nameparticipant.ip_address...player.payoffgroup.id_in_subsessionsubsession.round_numbersession.codesession.labelsession.experimenter_namesession.mturk_HITIdsession.mturk_HITGroupIdsession.commentsession.is_demo
01n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...011fiezcoi1NaNNaNNaNNaNNaN0
12hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...011fiezcoi1NaNNaNNaNNaNNaN0
23gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...021fiezcoi1NaNNaNNaNNaNNaN0
34x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...021fiezcoi1NaNNaNNaNNaNNaN0
41n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...012fiezcoi1NaNNaNNaNNaNNaN0
52hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...012fiezcoi1NaNNaNNaNNaNNaN0
63gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...022fiezcoi1NaNNaNNaNNaNNaN0
74x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...022fiezcoi1NaNNaNNaNNaNNaN0
81n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...10013fiezcoi1NaNNaNNaNNaNNaN0
92hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...013fiezcoi1NaNNaNNaNNaNNaN0
103gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...10023fiezcoi1NaNNaNNaNNaNNaN0
114x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...023fiezcoi1NaNNaNNaNNaNNaN0
121n66opzy5NaN11212matching_pennies4ResultsSummary127.0.0.1...014fiezcoi1NaNNaNNaNNaNNaN0
132hjvqfo1oNaN11212matching_pennies4ResultsSummary127.0.0.1...014fiezcoi1NaNNaNNaNNaNNaN0
143gq6vxupyNaN11212matching_pennies4ResultsSummary127.0.0.1...024fiezcoi1NaNNaNNaNNaNNaN0
154x80f6pv3NaN11212matching_pennies4ResultsSummary127.0.0.1...024fiezcoi1NaNNaNNaNNaNNaN0
\n", "

16 rows × 28 columns

\n", "
" ], "text/plain": [ " participant.id_in_session participant.code participant.label \\\n", "0 1 n66opzy5 NaN \n", "1 2 hjvqfo1o NaN \n", "2 3 gq6vxupy NaN \n", "3 4 x80f6pv3 NaN \n", "4 1 n66opzy5 NaN \n", "5 2 hjvqfo1o NaN \n", "6 3 gq6vxupy NaN \n", "7 4 x80f6pv3 NaN \n", "8 1 n66opzy5 NaN \n", "9 2 hjvqfo1o NaN \n", "10 3 gq6vxupy NaN \n", "11 4 x80f6pv3 NaN \n", "12 1 n66opzy5 NaN \n", "13 2 hjvqfo1o NaN \n", "14 3 gq6vxupy NaN \n", "15 4 x80f6pv3 NaN \n", "\n", " participant._is_bot participant._index_in_pages \\\n", "0 1 12 \n", "1 1 12 \n", "2 1 12 \n", "3 1 12 \n", "4 1 12 \n", "5 1 12 \n", "6 1 12 \n", "7 1 12 \n", "8 1 12 \n", "9 1 12 \n", "10 1 12 \n", "11 1 12 \n", "12 1 12 \n", "13 1 12 \n", "14 1 12 \n", "15 1 12 \n", "\n", " participant._max_page_index participant._current_app_name \\\n", "0 12 matching_pennies \n", "1 12 matching_pennies \n", "2 12 matching_pennies \n", "3 12 matching_pennies \n", "4 12 matching_pennies \n", "5 12 matching_pennies \n", "6 12 matching_pennies \n", "7 12 matching_pennies \n", "8 12 matching_pennies \n", "9 12 matching_pennies \n", "10 12 matching_pennies \n", "11 12 matching_pennies \n", "12 12 matching_pennies \n", "13 12 matching_pennies \n", "14 12 matching_pennies \n", "15 12 matching_pennies \n", "\n", " participant._round_number participant._current_page_name \\\n", "0 4 ResultsSummary \n", "1 4 ResultsSummary \n", "2 4 ResultsSummary \n", "3 4 ResultsSummary \n", "4 4 ResultsSummary \n", "5 4 ResultsSummary \n", "6 4 ResultsSummary \n", "7 4 ResultsSummary \n", "8 4 ResultsSummary \n", "9 4 ResultsSummary \n", "10 4 ResultsSummary \n", "11 4 ResultsSummary \n", "12 4 ResultsSummary \n", "13 4 ResultsSummary \n", "14 4 ResultsSummary \n", "15 4 ResultsSummary \n", "\n", " participant.ip_address ... player.payoff \\\n", "0 127.0.0.1 ... 0 \n", "1 127.0.0.1 ... 0 \n", "2 127.0.0.1 ... 0 \n", "3 127.0.0.1 ... 0 \n", "4 127.0.0.1 ... 0 \n", "5 127.0.0.1 ... 0 \n", "6 127.0.0.1 ... 0 \n", "7 127.0.0.1 ... 0 \n", "8 127.0.0.1 ... 100 \n", "9 127.0.0.1 ... 0 \n", "10 127.0.0.1 ... 100 \n", "11 127.0.0.1 ... 0 \n", "12 127.0.0.1 ... 0 \n", "13 127.0.0.1 ... 0 \n", "14 127.0.0.1 ... 0 \n", "15 127.0.0.1 ... 0 \n", "\n", " group.id_in_subsession subsession.round_number session.code \\\n", "0 1 1 fiezcoi1 \n", "1 1 1 fiezcoi1 \n", "2 2 1 fiezcoi1 \n", "3 2 1 fiezcoi1 \n", "4 1 2 fiezcoi1 \n", "5 1 2 fiezcoi1 \n", "6 2 2 fiezcoi1 \n", "7 2 2 fiezcoi1 \n", "8 1 3 fiezcoi1 \n", "9 1 3 fiezcoi1 \n", "10 2 3 fiezcoi1 \n", "11 2 3 fiezcoi1 \n", "12 1 4 fiezcoi1 \n", "13 1 4 fiezcoi1 \n", "14 2 4 fiezcoi1 \n", "15 2 4 fiezcoi1 \n", "\n", " session.label session.experimenter_name session.mturk_HITId \\\n", "0 NaN NaN NaN \n", "1 NaN NaN NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN \n", "5 NaN NaN NaN \n", "6 NaN NaN NaN \n", "7 NaN NaN NaN \n", "8 NaN NaN NaN \n", "9 NaN NaN NaN \n", "10 NaN NaN NaN \n", "11 NaN NaN NaN \n", "12 NaN NaN NaN \n", "13 NaN NaN NaN \n", "14 NaN NaN NaN \n", "15 NaN NaN NaN \n", "\n", " session.mturk_HITGroupId session.comment session.is_demo \n", "0 NaN NaN 0 \n", "1 NaN NaN 0 \n", "2 NaN NaN 0 \n", "3 NaN NaN 0 \n", "4 NaN NaN 0 \n", "5 NaN NaN 0 \n", "6 NaN NaN 0 \n", "7 NaN NaN 0 \n", "8 NaN NaN 0 \n", "9 NaN NaN 0 \n", "10 NaN NaN 0 \n", "11 NaN NaN 0 \n", "12 NaN NaN 0 \n", "13 NaN NaN 0 \n", "14 NaN NaN 0 \n", "15 NaN NaN 0 \n", "\n", "[16 rows x 28 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "storage.matching_pennies" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If for some reason the experiment fails, this method returns an exception. for example if we provide a invalid number of participants" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Running bots, please wait...\n", "[INFO|2017-11-01 05:38:46,546] skotree > Running bots, please wait...\n" ] }, { "ename": "RuntimeError", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m----------------------------------------------------------------\u001b[0m", "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mexperiment\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbot_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"matching_pennies\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36mbot_data\u001b[0;34m(self, session_name, num_participants)\u001b[0m\n\u001b[1;32m 689\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 690\u001b[0m \"\"\"\n\u001b[0;32m--> 691\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_middleware\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbot_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_participants\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 692\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 693\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36mbot_data\u001b[0;34m(self, session_name, num_participants)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mfps\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 400\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 401\u001b[0;31m \u001b[0mfps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_bot_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 402\u001b[0m \u001b[0mstore\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCSVStore\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 403\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self, func)\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mBaseException\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 263\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Remote procees raises an exception!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 264\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 265\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 266\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mRuntimeError\u001b[0m: " ] } ], "source": [ "experiment.bot_data(\"matching_pennies\", 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Connect to a remote experiment\n", "\n", "
\n", " New in version 0.4\n", "
\n", "\n", "\n", "To connect to a remote oTree location instead of given the `settings.py` path, you need to\n", "provide the URL where the experiment is running." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "remote = skotree.oTree(\"http://localhost:8000\")\n", "remote" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['matching_pennies']" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "remote.lsapps()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['matching_pennies']" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "remote.lssessions()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant.id_in_sessionparticipant.codeparticipant.labelparticipant._is_botparticipant._index_in_pagesparticipant._max_page_indexparticipant._current_app_nameparticipant._round_numberparticipant._current_page_nameparticipant.ip_address...player.payoffgroup.id_in_subsessionsubsession.round_numbersession.codesession.labelsession.experimenter_namesession.mturk_HITIdsession.mturk_HITGroupIdsession.commentsession.is_demo
01bqkfd73tNaN0012NaNNaNNaNNaN...011nvnpimbfNaNNaNNaNNaNNaN0
125cznwllyNaN0012NaNNaNNaNNaN...011nvnpimbfNaNNaNNaNNaNNaN0
21bqkfd73tNaN0012NaNNaNNaNNaN...012nvnpimbfNaNNaNNaNNaNNaN0
325cznwllyNaN0012NaNNaNNaNNaN...012nvnpimbfNaNNaNNaNNaNNaN0
41bqkfd73tNaN0012NaNNaNNaNNaN...013nvnpimbfNaNNaNNaNNaNNaN0
525cznwllyNaN0012NaNNaNNaNNaN...013nvnpimbfNaNNaNNaNNaNNaN0
61bqkfd73tNaN0012NaNNaNNaNNaN...014nvnpimbfNaNNaNNaNNaNNaN0
725cznwllyNaN0012NaNNaNNaNNaN...014nvnpimbfNaNNaNNaNNaNNaN0
815b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...011gh84ltglNaNNaNNaNNaNNaN1
92x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...011gh84ltglNaNNaNNaNNaNNaN1
1015b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...012gh84ltglNaNNaNNaNNaNNaN1
112x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...012gh84ltglNaNNaNNaNNaNNaN1
1215b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...013gh84ltglNaNNaNNaNNaNNaN1
132x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...013gh84ltglNaNNaNNaNNaNNaN1
1415b8zc5hrNaN01212matching_pennies4.0ResultsSummary127.0.0.1...10014gh84ltglNaNNaNNaNNaNNaN1
152x1f4ua8yNaN01212matching_pennies4.0ResultsSummary127.0.0.1...014gh84ltglNaNNaNNaNNaNNaN1
\n", "

16 rows × 28 columns

\n", "
" ], "text/plain": [ " participant.id_in_session participant.code participant.label \\\n", "0 1 bqkfd73t NaN \n", "1 2 5cznwlly NaN \n", "2 1 bqkfd73t NaN \n", "3 2 5cznwlly NaN \n", "4 1 bqkfd73t NaN \n", "5 2 5cznwlly NaN \n", "6 1 bqkfd73t NaN \n", "7 2 5cznwlly NaN \n", "8 1 5b8zc5hr NaN \n", "9 2 x1f4ua8y NaN \n", "10 1 5b8zc5hr NaN \n", "11 2 x1f4ua8y NaN \n", "12 1 5b8zc5hr NaN \n", "13 2 x1f4ua8y NaN \n", "14 1 5b8zc5hr NaN \n", "15 2 x1f4ua8y NaN \n", "\n", " participant._is_bot participant._index_in_pages \\\n", "0 0 0 \n", "1 0 0 \n", "2 0 0 \n", "3 0 0 \n", "4 0 0 \n", "5 0 0 \n", "6 0 0 \n", "7 0 0 \n", "8 0 12 \n", "9 0 12 \n", "10 0 12 \n", "11 0 12 \n", "12 0 12 \n", "13 0 12 \n", "14 0 12 \n", "15 0 12 \n", "\n", " participant._max_page_index participant._current_app_name \\\n", "0 12 NaN \n", "1 12 NaN \n", "2 12 NaN \n", "3 12 NaN \n", "4 12 NaN \n", "5 12 NaN \n", "6 12 NaN \n", "7 12 NaN \n", "8 12 matching_pennies \n", "9 12 matching_pennies \n", "10 12 matching_pennies \n", "11 12 matching_pennies \n", "12 12 matching_pennies \n", "13 12 matching_pennies \n", "14 12 matching_pennies \n", "15 12 matching_pennies \n", "\n", " participant._round_number participant._current_page_name \\\n", "0 NaN NaN \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN \n", "6 NaN NaN \n", "7 NaN NaN \n", "8 4.0 ResultsSummary \n", "9 4.0 ResultsSummary \n", "10 4.0 ResultsSummary \n", "11 4.0 ResultsSummary \n", "12 4.0 ResultsSummary \n", "13 4.0 ResultsSummary \n", "14 4.0 ResultsSummary \n", "15 4.0 ResultsSummary \n", "\n", " participant.ip_address ... player.payoff \\\n", "0 NaN ... 0 \n", "1 NaN ... 0 \n", "2 NaN ... 0 \n", "3 NaN ... 0 \n", "4 NaN ... 0 \n", "5 NaN ... 0 \n", "6 NaN ... 0 \n", "7 NaN ... 0 \n", "8 127.0.0.1 ... 0 \n", "9 127.0.0.1 ... 0 \n", "10 127.0.0.1 ... 0 \n", "11 127.0.0.1 ... 0 \n", "12 127.0.0.1 ... 0 \n", "13 127.0.0.1 ... 0 \n", "14 127.0.0.1 ... 100 \n", "15 127.0.0.1 ... 0 \n", "\n", " group.id_in_subsession subsession.round_number session.code \\\n", "0 1 1 nvnpimbf \n", "1 1 1 nvnpimbf \n", "2 1 2 nvnpimbf \n", "3 1 2 nvnpimbf \n", "4 1 3 nvnpimbf \n", "5 1 3 nvnpimbf \n", "6 1 4 nvnpimbf \n", "7 1 4 nvnpimbf \n", "8 1 1 gh84ltgl \n", "9 1 1 gh84ltgl \n", "10 1 2 gh84ltgl \n", "11 1 2 gh84ltgl \n", "12 1 3 gh84ltgl \n", "13 1 3 gh84ltgl \n", "14 1 4 gh84ltgl \n", "15 1 4 gh84ltgl \n", "\n", " session.label session.experimenter_name session.mturk_HITId \\\n", "0 NaN NaN NaN \n", "1 NaN NaN NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN \n", "5 NaN NaN NaN \n", "6 NaN NaN NaN \n", "7 NaN NaN NaN \n", "8 NaN NaN NaN \n", "9 NaN NaN NaN \n", "10 NaN NaN NaN \n", "11 NaN NaN NaN \n", "12 NaN NaN NaN \n", "13 NaN NaN NaN \n", "14 NaN NaN NaN \n", "15 NaN NaN NaN \n", "\n", " session.mturk_HITGroupId session.comment session.is_demo \n", "0 NaN NaN 0 \n", "1 NaN NaN 0 \n", "2 NaN NaN 0 \n", "3 NaN NaN 0 \n", "4 NaN NaN 0 \n", "5 NaN NaN 0 \n", "6 NaN NaN 0 \n", "7 NaN NaN 0 \n", "8 NaN NaN 1 \n", "9 NaN NaN 1 \n", "10 NaN NaN 1 \n", "11 NaN NaN 1 \n", "12 NaN NaN 1 \n", "13 NaN NaN 1 \n", "14 NaN NaN 1 \n", "15 NaN NaN 1 \n", "\n", "[16 rows x 28 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "remote.app_data(\"matching_pennies\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Connect to a remote experiment With Authentication\n", "\n", "
\n", " New in version 0.5\n", "
\n", "\n", "\n", "If you are trying to connect to server in auth level mode `DEMO` or `STUDY` ([More Information about modes](http://otree.readthedocs.io/en/latest/settings.html?highlight=AUTH_LEVEL#auth-level)) without credentials an error will be shown:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "ename": "NoLoggedin", "evalue": "You are not authenticated in experiment located at http://localhost:9000", "output_type": "error", "traceback": [ "\u001b[0;31m----------------------------------------------------------------\u001b[0m", "\u001b[0;31mNoLoggedin\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mskotree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moTree\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"http://localhost:9000\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, path, middleware, **kwargs)\u001b[0m\n\u001b[1;32m 596\u001b[0m \u001b[0mmiddleware\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"remote\"\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_url\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"local\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 597\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_path\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mabspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmiddleware\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"local\"\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 598\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_middleware\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMIDDLEWARES\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmiddleware\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 599\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 600\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, url, **kwargs)\u001b[0m\n\u001b[1;32m 426\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_client\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrequests\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 427\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 428\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_loggedin\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 429\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mabsurl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36mcheck_loggedin\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 458\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m\"/accounts/login/?next=\"\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 459\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"You are not authenticated in experiment located at {}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 460\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNoLoggedin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_url\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 461\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 462\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mlsapps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNoLoggedin\u001b[0m: You are not authenticated in experiment located at http://localhost:9000" ] } ], "source": [ "skotree.oTree(\"http://localhost:9000\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this cases you need to provide the parameters `username` and `password`" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# the credential are not stored internally\n", "exp = skotree.oTree(\"http://localhost:9000\", username=\"admin\", password=\"skotree\")\n", "exp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and now all works as before" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
participant.id_in_sessionparticipant.codeparticipant.labelparticipant._is_botparticipant._index_in_pagesparticipant._max_page_indexparticipant._current_app_nameparticipant._round_numberparticipant._current_page_nameparticipant.ip_address...matching_pennies.3.player.is_winnermatching_pennies.3.player.payoffmatching_pennies.3.group.id_in_subsessionmatching_pennies.3.subsession.round_numbermatching_pennies.4.player.id_in_groupmatching_pennies.4.player.penny_sidematching_pennies.4.player.is_winnermatching_pennies.4.player.payoffmatching_pennies.4.group.id_in_subsessionmatching_pennies.4.subsession.round_number
01wxcd26g1NaN0012NaNNaNNaNNaN...NaN0132NaNNaN014
12akfa88o8NaN0012NaNNaNNaNNaN...NaN0131NaNNaN014
\n", "

2 rows × 49 columns

\n", "
" ], "text/plain": [ " participant.id_in_session participant.code participant.label \\\n", "0 1 wxcd26g1 NaN \n", "1 2 akfa88o8 NaN \n", "\n", " participant._is_bot participant._index_in_pages \\\n", "0 0 0 \n", "1 0 0 \n", "\n", " participant._max_page_index participant._current_app_name \\\n", "0 12 NaN \n", "1 12 NaN \n", "\n", " participant._round_number participant._current_page_name \\\n", "0 NaN NaN \n", "1 NaN NaN \n", "\n", " participant.ip_address ... \\\n", "0 NaN ... \n", "1 NaN ... \n", "\n", " matching_pennies.3.player.is_winner matching_pennies.3.player.payoff \\\n", "0 NaN 0 \n", "1 NaN 0 \n", "\n", " matching_pennies.3.group.id_in_subsession \\\n", "0 1 \n", "1 1 \n", "\n", " matching_pennies.3.subsession.round_number \\\n", "0 3 \n", "1 3 \n", "\n", " matching_pennies.4.player.id_in_group matching_pennies.4.player.penny_side \\\n", "0 2 NaN \n", "1 1 NaN \n", "\n", " matching_pennies.4.player.is_winner matching_pennies.4.player.payoff \\\n", "0 NaN 0 \n", "1 NaN 0 \n", "\n", " matching_pennies.4.group.id_in_subsession \\\n", "0 1 \n", "1 1 \n", "\n", " matching_pennies.4.subsession.round_number \n", "0 4 \n", "1 4 \n", "\n", "[2 rows x 49 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exp.all_data()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Some methods not work in a remote experiment

\n", "
\n", "\n", "- `session_config()`\n", "- `bot_data()`\n", "\n", "Raises an `NotImplementedError` when are called." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "ename": "NotImplementedError", "evalue": "Remote oTree can't run bots", "output_type": "error", "traceback": [ "\u001b[0;31m----------------------------------------------------------------\u001b[0m", "\u001b[0;31mNotImplementedError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mremote\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbot_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"matching_pennies\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36mbot_data\u001b[0;34m(self, session_name, num_participants)\u001b[0m\n\u001b[1;32m 689\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 690\u001b[0m \"\"\"\n\u001b[0;32m--> 691\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_middleware\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbot_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_participants\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 692\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 693\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/proyectos/skotree/src/skotree.py\u001b[0m in \u001b[0;36mbot_data\u001b[0;34m(self, session_name, num_participants)\u001b[0m\n\u001b[1;32m 501\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 502\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mbot_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msession_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnum_participants\u001b[0m\u001b[0;34m=\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--> 503\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Remote oTree can't run bots\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 504\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 505\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNotImplementedError\u001b[0m: Remote oTree can't run bots" ] } ], "source": [ "remote.bot_data(\"matching_pennies\", 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Also the *settings* attribute always returns `None`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

Advanced Analysis

\n", "
\n", "\n", "The *pandas.DataFrame* itself is a great tool for data analysis, but also can be easily adapted to feed a lot of libraries like:\n", "\n", "- [Scipy](https://www.scipy.org/): general scientific Computation.\n", "- [Matplotlib](http://matplotlib.org/) or [Bokeh](https://bokeh.pydata.org) for plotting.\n", "- [Scikit-Learn](http://scikit-learn.org/): Simple and efficient tools for data mining and data analysis\n", "- [StatsModels]() statsmodels is a Python module that provides classes and functions for the estimation of many different statistical models, as well as for conducting statistical tests, and statistical data exploration. An extensive list of result statistics are available for each estimator. \n", "- [PyMC](https://pymc-devs.github.io) is a python module that implements Bayesian statistical models and fitting algorithms, including Markov chain Monte Carlo. Its flexibility and extensibility make it applicable to a large suite of problems. Along with core sampling functionality, PyMC includes methods for summarizing output, plotting, goodness-of-fit and convergence diagnostics.\n", "- Deep-Learning with [TensorFlow](https://www.tensorflow.org/) or [Keras](https://keras.io/)\n", "\n", "[And much more](https://www.scipy.org/about.html)...\n" ] } ], "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.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }