You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
soil/notebooks/soil_tutorial.ipynb

1913 lines
252 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-02T16:44:14.120953Z",
"start_time": "2017-07-02T18:44:14.117152+02:00"
}
},
"source": [
"# Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {
"cell_style": "center",
"collapsed": true
},
"source": [
"This notebook is an introduction to the soil agent-based social network simulation framework.\n",
"In particular, we will focus on a specific use case: studying the propagation of news in a social network.\n",
"\n",
"The steps we will follow are:\n",
"\n",
"* Modelling the behavior of agents\n",
"* Running the simulation using different configurations\n",
"* Analysing the results of each simulation"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T13:38:48.052876Z",
"start_time": "2017-07-03T15:38:48.044762+02:00"
}
},
"source": [
"But before that, let's import the soil module and networkx."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:51.679937Z",
"start_time": "2017-07-03T16:42:51.185463+02:00"
},
"collapsed": true
},
"outputs": [],
"source": [
"import soil\n",
"import networkx as nx"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:51.690373Z",
"start_time": "2017-07-03T16:42:51.682644+02:00"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"%pylab inline\n",
"# To display plots in the notebook"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T13:41:19.788717Z",
"start_time": "2017-07-03T15:41:19.785448+02:00"
}
},
"source": [
"# Basic concepts"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are three main elements in a soil simulation:\n",
" \n",
"* The network topology. A simulation may use an existing NetworkX topology, or generate one on the fly\n",
"* Agents. There are two types: 1) network agents, which are linked to a node in the topology, and 2) environment agents, which are freely assigned to the environment.\n",
"* The environment. It assigns agents to nodes in the network, and stores the environment parameters (shared state for all agents).\n",
"\n",
"Soil is based on ``simpy``, which is an event-based network simulation library.\n",
"Soil provides several abstractions over events to make developing agents easier.\n",
"This means you can use events (timeouts, delays) in soil, but for the most part we will assume your models will be step-based.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-02T15:55:12.933978Z",
"start_time": "2017-07-02T17:55:12.930860+02:00"
}
},
"source": [
"# Modeling behaviour"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T13:49:31.269687Z",
"start_time": "2017-07-03T15:49:31.257850+02:00"
}
},
"source": [
"Our first step will be to model how every person in the social network reacts when it comes to news.\n",
"We will follow a very simple model (a finite state machine).\n",
"\n",
"There are two types of people, those who have heard about a newsworthy event (infected) or those who have not (neutral).\n",
"A neutral person may heard about the news either on the TV (with probability **prob_tv_spread**) or through their friends.\n",
"Once a person has heard the news, they will spread it to their friends (with a probability **prob_neighbor_spread**).\n",
"Some users do not have a TV, so they only rely on their friends.\n",
"\n",
"The spreading probabilities will change over time due to different factors.\n",
"We will represent this variance using an environment agent."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Network Agents"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:03:07.171127Z",
"start_time": "2017-07-03T16:03:07.165779+02:00"
}
},
"source": [
"A basic network agent in Soil should inherit from ``soil.agents.BaseAgent``, and define its behaviour in every step of the simulation by implementing a ``run(self)`` method.\n",
"The most important attributes of the agent are:\n",
"\n",
"* ``agent.state``, a dictionary with the state of the agent. ``agent.state['id']`` reflects the state id of the agent. That state id can be used to look for other networks in that specific state. The state can be access via the agent as well. For instance:\n",
"```py\n",
"a = soil.agents.BaseAgent(env=env)\n",
"a['hours_of_sleep'] = 10\n",
"print(a['hours_of_sleep'])\n",
"```\n",
" The state of the agent is stored in every step of the simulation:\n",
" ```py\n",
" print(a['hours_of_sleep', 10]) # hours of sleep before step #10\n",
" print(a[None, 0]) # whole state of the agent before step #0\n",
" ```\n",
"\n",
"* ``agent.env``, a reference to the environment. Most commonly used to get access to the environment parameters and the topology:\n",
" ```py\n",
" a.env.G.nodes() # Get all nodes ids in the topology\n",
" a.env['minimum_hours_of_sleep']\n",
"\n",
" ```\n",
"\n",
"Since our model is a finite state machine, we will be basing it on ``soil.agents.FSM``.\n",
"\n",
"With ``soil.agents.FSM``, we do not need to specify a ``step`` method.\n",
"Instead, we describe every step as a function.\n",
"To change to another state, a function may return the new state.\n",
"If no state is returned, the state remains unchanged.[\n",
"It will consist of two states, ``neutral`` (default) and ``infected``.\n",
"\n",
"Here's the code:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:51.715535Z",
"start_time": "2017-07-03T16:42:51.692301+02:00"
},
"collapsed": true
},
"outputs": [],
"source": [
"import random\n",
"\n",
"class NewsSpread(soil.agents.FSM):\n",
" @soil.agents.default_state\n",
" @soil.agents.state\n",
" def neutral(self):\n",
" r = random.random()\n",
" if self['has_tv'] and r < self.env['prob_tv_spread']:\n",
" return self.infected\n",
" return\n",
" \n",
" @soil.agents.state\n",
" def infected(self):\n",
" prob_infect = self.env['prob_neighbor_spread']\n",
" for neighbor in self.get_neighboring_agents(state_id=self.neutral.id):\n",
" r = random.random()\n",
" if r < prob_infect:\n",
" neighbor.state['id'] = self.infected.id\n",
" return\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-02T12:22:53.931963Z",
"start_time": "2017-07-02T14:22:53.928340+02:00"
}
},
"source": [
"## Environment agents"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Environment agents allow us to control the state of the environment.\n",
"In this case, we will use an environment agent to simulate a very viral event.\n",
"\n",
"When the event happens, the agent will modify the probability of spreading the rumor."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:51.727938Z",
"start_time": "2017-07-03T16:42:51.717828+02:00"
},
"collapsed": true
},
"outputs": [],
"source": [
"NEIGHBOR_FACTOR = 0.9\n",
"TV_FACTOR = 0.5\n",
"class NewsEnvironmentAgent(soil.agents.BaseAgent):\n",
" def step(self):\n",
" if self.now == self['event_time']:\n",
" self.env['prob_tv_spread'] = 1\n",
" self.env['prob_neighbor_spread'] = 1\n",
" elif self.now > self['event_time']:\n",
" self.env['prob_tv_spread'] = self.env['prob_tv_spread'] * TV_FACTOR\n",
" self.env['prob_neighbor_spread'] = self.env['prob_neighbor_spread'] * NEIGHBOR_FACTOR"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-02T11:23:18.052235Z",
"start_time": "2017-07-02T13:23:18.047452+02:00"
}
},
"source": [
"## Testing the agents"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-02T16:14:54.572431Z",
"start_time": "2017-07-02T18:14:54.564095+02:00"
}
},
"source": [
"Feel free to skip this section if this is your first time with soil."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Testing agents is not easy, and this is not a thorough testing process for agents.\n",
"Rather, this section is aimed to show you how to access internal pats of soil so you can test your agents."
]
},
{
"cell_type": "markdown",
"metadata": {
"cell_style": "split"
},
"source": [
"First of all, let's check if our network agent has the states we would expect:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:51.816465Z",
"start_time": "2017-07-03T16:42:51.811222+02:00"
},
"cell_style": "split"
},
"outputs": [
{
"data": {
"text/plain": [
"{'infected': <function __main__.NewsSpread.infected>,\n",
" 'neutral': <function __main__.NewsSpread.neutral>}"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"NewsSpread.states"
]
},
{
"cell_type": "markdown",
"metadata": {
"cell_style": "split"
},
"source": [
"Now, let's run a simulation on a simple network. It is comprised of three nodes:\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:52.106636Z",
"start_time": "2017-07-03T16:42:51.904738+02:00"
},
"cell_style": "split",
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\nkwiJKtZwD8+dmIqKoGt
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd08276d978>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"G = nx.Graph()\n",
"G.add_edge(0, 1)\n",
"G.add_edge(0, 2)\n",
"G.add_edge(2, 3)\n",
"G.add_node(4)\n",
"pos = nx.spring_layout(G)\n",
"nx.draw_networkx(G, pos, node_color='red')\n",
"nx.draw_networkx(G, pos, nodelist=[0], node_color='blue')"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T11:53:30.997756Z",
"start_time": "2017-07-03T13:53:30.989609+02:00"
},
"cell_style": "split"
},
"source": [
"Let's run a simple simulation that assigns a NewsSpread agent to all the nodes in that network.\n",
"Notice how node 0 is the only one with a TV."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:52.136477Z",
"start_time": "2017-07-03T16:42:52.108729+02:00"
},
"cell_style": "split"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.014928102493286133 seconds\n",
"Finished simulation in 0.015764951705932617 seconds\n"
]
}
],
"source": [
"env_params = {'prob_tv_spread': 0,\n",
" 'prob_neighbor_spread': 0}\n",
"\n",
"MAX_TIME = 100\n",
"EVENT_TIME = 10\n",
"\n",
"sim = soil.simulation.SoilSimulation(topology=G,\n",
" num_trials=1,\n",
" max_time=MAX_TIME,\n",
" environment_agents=[{'agent_type': NewsEnvironmentAgent,\n",
" 'state': {\n",
" 'event_time': EVENT_TIME\n",
" }}],\n",
" network_agents=[{'agent_type': NewsSpread,\n",
" 'weight': 1}],\n",
" states={0: {'has_tv': True}},\n",
" default_state={'has_tv': False},\n",
" environment_params=env_params)\n",
"env = sim.run_simulation()[0]"
]
},
{
"cell_type": "markdown",
"metadata": {
"cell_style": "split"
},
"source": [
"Now we can access the results of the simulation and compare them to our expected results"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:52.160856Z",
"start_time": "2017-07-03T16:42:52.138976+02:00"
},
"cell_style": "split",
"collapsed": true,
"scrolled": false
},
"outputs": [],
"source": [
"agents = list(env.network_agents)\n",
"\n",
"# Until the event, all agents are neutral\n",
"for t in range(10):\n",
" for a in agents:\n",
" assert a['id', t] == a.neutral.id\n",
"\n",
"# After the event, the node with a TV is infected, the rest are not\n",
"assert agents[0]['id', 11] == NewsSpread.infected.id\n",
"\n",
"for a in agents[1:4]:\n",
" assert a['id', 11] == NewsSpread.neutral.id\n",
"\n",
"# At the end, the agents connected to the infected one will probably be infected, too.\n",
"assert agents[1]['id', MAX_TIME] == NewsSpread.infected.id\n",
"assert agents[2]['id', MAX_TIME] == NewsSpread.infected.id\n",
"\n",
"# But the node with no friends should not be affected\n",
"assert agents[4]['id', MAX_TIME] == NewsSpread.neutral.id\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-02T16:41:09.110652Z",
"start_time": "2017-07-02T18:41:09.106966+02:00"
},
"cell_style": "split"
},
"source": [
"Lastly, let's see if the probabilities have decreased as expected:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:52.193918Z",
"start_time": "2017-07-03T16:42:52.163476+02:00"
},
"cell_style": "split",
"collapsed": true
},
"outputs": [],
"source": [
"assert abs(env.environment_params['prob_neighbor_spread'] - (NEIGHBOR_FACTOR**(MAX_TIME-1-10))) < 10e-4\n",
"assert abs(env.environment_params['prob_tv_spread'] - (TV_FACTOR**(MAX_TIME-1-10))) < 10e-6"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Running the simulation"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T11:20:28.566944Z",
"start_time": "2017-07-03T13:20:28.561052+02:00"
},
"cell_style": "split"
},
"source": [
"To run a simulation, we need a configuration.\n",
"Soil can load configurations from python dictionaries as well as JSON and YAML files.\n",
"For this demo, we will use a python dictionary:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:52.219072Z",
"start_time": "2017-07-03T16:42:52.196203+02:00"
},
"cell_style": "split",
"collapsed": true
},
"outputs": [],
"source": [
"config = {\n",
" 'name': 'ExampleSimulation',\n",
" 'max_time': 20,\n",
" 'interval': 1,\n",
" 'num_trials': 1,\n",
" 'network_params': {\n",
" 'generator': 'complete_graph',\n",
" 'n': 500,\n",
" },\n",
" 'network_agents': [\n",
" {\n",
" 'agent_type': NewsSpread,\n",
" 'weight': 1,\n",
" 'state': {\n",
" 'has_tv': False\n",
" }\n",
" },\n",
" {\n",
" 'agent_type': NewsSpread,\n",
" 'weight': 2,\n",
" 'state': {\n",
" 'has_tv': True\n",
" }\n",
" }\n",
" ],\n",
" 'states': [ {'has_tv': True} ],\n",
" 'environment_params':{\n",
" 'prob_tv_spread': 0.01,\n",
" 'prob_neighbor_spread': 0.5\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T11:57:34.219618Z",
"start_time": "2017-07-03T13:57:34.213817+02:00"
},
"cell_style": "split"
},
"source": [
"Let's run our simulation:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:42:55.366288Z",
"start_time": "2017-07-03T16:42:52.295584+02:00"
},
"cell_style": "split"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using config(s): ExampleSimulation\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 1.4140360355377197 seconds\n",
"Finished simulation in 2.4056642055511475 seconds\n"
]
}
],
"source": [
"soil.simulation.run_from_config(config, dump=False)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T12:03:32.183588Z",
"start_time": "2017-07-03T14:03:32.167797+02:00"
},
"cell_style": "split",
"collapsed": true
},
"source": [
"In real life, you probably want to run several simulations, varying some of the parameters so that you can compare and answer your research questions.\n",
"\n",
"For instance:\n",
" \n",
"* Does the outcome depend on the structure of our network? We will use different generation algorithms to compare them (Barabasi-Albert and Erdos-Renyi)\n",
"* How does neighbor spreading probability affect my simulation? We will try probability values in the range of [0, 0.4], in intervals of 0.1."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:43:15.488799Z",
"start_time": "2017-07-03T16:42:55.368021+02:00"
},
"cell_style": "split",
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using config(s): Spread_erdos_renyi_graph_prob_0.0\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.2691483497619629 seconds\n",
"Finished simulation in 0.3650345802307129 seconds\n",
"Using config(s): Spread_erdos_renyi_graph_prob_0.1\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.34261059761047363 seconds\n",
"Finished simulation in 0.44017767906188965 seconds\n",
"Using config(s): Spread_erdos_renyi_graph_prob_0.2\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.34417223930358887 seconds\n",
"Finished simulation in 0.4550771713256836 seconds\n",
"Using config(s): Spread_erdos_renyi_graph_prob_0.3\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.3237779140472412 seconds\n",
"Finished simulation in 0.42307496070861816 seconds\n",
"Using config(s): Spread_erdos_renyi_graph_prob_0.4\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.3507683277130127 seconds\n",
"Finished simulation in 0.45061564445495605 seconds\n",
"Using config(s): Spread_barabasi_albert_graph_prob_0.0\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.19115304946899414 seconds\n",
"Finished simulation in 0.20927715301513672 seconds\n",
"Using config(s): Spread_barabasi_albert_graph_prob_0.1\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.22086191177368164 seconds\n",
"Finished simulation in 0.2390913963317871 seconds\n",
"Using config(s): Spread_barabasi_albert_graph_prob_0.2\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.21225976943969727 seconds\n",
"Finished simulation in 0.23252630233764648 seconds\n",
"Using config(s): Spread_barabasi_albert_graph_prob_0.3\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.2853121757507324 seconds\n",
"Finished simulation in 0.30568504333496094 seconds\n",
"Using config(s): Spread_barabasi_albert_graph_prob_0.4\n",
"Trial: 0\n",
"\tRunning\n",
"Finished trial in 0.21434736251831055 seconds\n",
"Finished simulation in 0.23370599746704102 seconds\n"
]
}
],
"source": [
"network_1 = {\n",
" 'generator': 'erdos_renyi_graph',\n",
" 'n': 500,\n",
" 'p': 0.1\n",
"}\n",
"network_2 = {\n",
" 'generator': 'barabasi_albert_graph',\n",
" 'n': 500,\n",
" 'm': 2\n",
"}\n",
"\n",
"\n",
"for net in [network_1, network_2]:\n",
" for i in range(5):\n",
" prob = i / 10\n",
" config['environment_params']['prob_neighbor_spread'] = prob\n",
" config['network_params'] = net\n",
" config['name'] = 'Spread_{}_prob_{}'.format(net['generator'], prob)\n",
" s = soil.simulation.run_from_config(config)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T11:05:18.043194Z",
"start_time": "2017-07-03T13:05:18.034699+02:00"
},
"cell_style": "split"
},
"source": [
"The results are conveniently stored in pickle (simulation), csv (history of agent and environment state) and gexf format."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:43:15.721720Z",
"start_time": "2017-07-03T16:43:15.490854+02:00"
},
"cell_style": "split",
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[01;34msoil_output\u001b[00m\n",
"├── \u001b[01;34mSim_prob_0\u001b[00m\n",
"│   ├── Sim_prob_0.dumped.yml\n",
"│   ├── Sim_prob_0.simulation.pickle\n",
"│   ├── Sim_prob_0_trial_0.environment.csv\n",
"│   └── Sim_prob_0_trial_0.gexf\n",
"├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.0\u001b[00m\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.0.dumped.yml\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.0.simulation.pickle\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.0_trial_0.environment.csv\n",
"│   └── Spread_barabasi_albert_graph_prob_0.0_trial_0.gexf\n",
"├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.1\u001b[00m\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.1.dumped.yml\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.1.simulation.pickle\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.1_trial_0.environment.csv\n",
"│   └── Spread_barabasi_albert_graph_prob_0.1_trial_0.gexf\n",
"├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.2\u001b[00m\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.2.dumped.yml\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.2.simulation.pickle\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.2_trial_0.environment.csv\n",
"│   └── Spread_barabasi_albert_graph_prob_0.2_trial_0.gexf\n",
"├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.3\u001b[00m\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.3.dumped.yml\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.3.simulation.pickle\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.3_trial_0.environment.csv\n",
"│   └── Spread_barabasi_albert_graph_prob_0.3_trial_0.gexf\n",
"├── \u001b[01;34mSpread_barabasi_albert_graph_prob_0.4\u001b[00m\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.4.dumped.yml\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.4.simulation.pickle\n",
"│   ├── Spread_barabasi_albert_graph_prob_0.4_trial_0.environment.csv\n",
"│   └── Spread_barabasi_albert_graph_prob_0.4_trial_0.gexf\n",
"├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.0\u001b[00m\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.0.dumped.yml\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.0.simulation.pickle\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.0_trial_0.environment.csv\n",
"│   └── Spread_erdos_renyi_graph_prob_0.0_trial_0.gexf\n",
"├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.1\u001b[00m\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.1.dumped.yml\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.1.simulation.pickle\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.1_trial_0.environment.csv\n",
"│   └── Spread_erdos_renyi_graph_prob_0.1_trial_0.gexf\n",
"├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.2\u001b[00m\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.2.dumped.yml\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.2.simulation.pickle\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.2_trial_0.environment.csv\n",
"│   └── Spread_erdos_renyi_graph_prob_0.2_trial_0.gexf\n",
"├── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.3\u001b[00m\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.3.dumped.yml\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.3.simulation.pickle\n",
"│   ├── Spread_erdos_renyi_graph_prob_0.3_trial_0.environment.csv\n",
"│   └── Spread_erdos_renyi_graph_prob_0.3_trial_0.gexf\n",
"└── \u001b[01;34mSpread_erdos_renyi_graph_prob_0.4\u001b[00m\n",
" ├── Spread_erdos_renyi_graph_prob_0.4.dumped.yml\n",
" ├── Spread_erdos_renyi_graph_prob_0.4.simulation.pickle\n",
" ├── Spread_erdos_renyi_graph_prob_0.4_trial_0.environment.csv\n",
" └── Spread_erdos_renyi_graph_prob_0.4_trial_0.gexf\n",
"\n",
"11 directories, 44 files\n",
"1.8M\tsoil_output/Sim_prob_0\n",
"652K\tsoil_output/Spread_barabasi_albert_graph_prob_0.0\n",
"684K\tsoil_output/Spread_barabasi_albert_graph_prob_0.1\n",
"692K\tsoil_output/Spread_barabasi_albert_graph_prob_0.2\n",
"692K\tsoil_output/Spread_barabasi_albert_graph_prob_0.3\n",
"688K\tsoil_output/Spread_barabasi_albert_graph_prob_0.4\n",
"1.8M\tsoil_output/Spread_erdos_renyi_graph_prob_0.0\n",
"1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.1\n",
"1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.2\n",
"1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.3\n",
"1.9M\tsoil_output/Spread_erdos_renyi_graph_prob_0.4\n"
]
}
],
"source": [
"!tree soil_output\n",
"!du -xh soil_output/*"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-02T10:40:14.384177Z",
"start_time": "2017-07-02T12:40:14.381885+02:00"
}
},
"source": [
"# Analysing the results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once the simulations are over, we can use soil to analyse the results."
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:44:30.978223Z",
"start_time": "2017-07-03T16:44:30.971952+02:00"
}
},
"source": [
"First, let's load the stored results into a pandas dataframe."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:43:15.987794Z",
"start_time": "2017-07-03T16:43:15.724519+02:00"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/lib/python3.6/site-packages/IPython/core/magics/pylab.py:160: UserWarning: pylab import has clobbered these variables: ['random']\n",
"`%matplotlib` prevents importing * from pylab and numpy\n",
" \"\\n`%matplotlib` prevents importing * from pylab and numpy\"\n"
]
}
],
"source": [
"%pylab inline\n",
"from soil import analysis"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:43:16.590910Z",
"start_time": "2017-07-03T16:43:15.990320+02:00"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>agent_id</th>\n",
" <th>tstep</th>\n",
" <th>attribute</th>\n",
" <th>value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>env</td>\n",
" <td>0</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>env</td>\n",
" <td>0</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>env</td>\n",
" <td>1</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>env</td>\n",
" <td>1</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>env</td>\n",
" <td>2</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>env</td>\n",
" <td>2</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>env</td>\n",
" <td>3</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>env</td>\n",
" <td>3</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>env</td>\n",
" <td>4</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>env</td>\n",
" <td>4</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>env</td>\n",
" <td>5</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>env</td>\n",
" <td>5</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>env</td>\n",
" <td>6</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>env</td>\n",
" <td>6</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>env</td>\n",
" <td>7</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>env</td>\n",
" <td>7</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>env</td>\n",
" <td>8</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>env</td>\n",
" <td>8</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>env</td>\n",
" <td>9</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>env</td>\n",
" <td>9</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>env</td>\n",
" <td>10</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>env</td>\n",
" <td>10</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>env</td>\n",
" <td>11</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>env</td>\n",
" <td>11</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>env</td>\n",
" <td>12</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>env</td>\n",
" <td>12</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>env</td>\n",
" <td>13</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>env</td>\n",
" <td>13</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>env</td>\n",
" <td>14</td>\n",
" <td>prob_tv_spread</td>\n",
" <td>0.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>env</td>\n",
" <td>14</td>\n",
" <td>prob_neighbor_spread</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21012</th>\n",
" <td>499</td>\n",
" <td>6</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21013</th>\n",
" <td>499</td>\n",
" <td>6</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21014</th>\n",
" <td>499</td>\n",
" <td>7</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21015</th>\n",
" <td>499</td>\n",
" <td>7</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21016</th>\n",
" <td>499</td>\n",
" <td>8</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21017</th>\n",
" <td>499</td>\n",
" <td>8</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21018</th>\n",
" <td>499</td>\n",
" <td>9</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21019</th>\n",
" <td>499</td>\n",
" <td>9</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21020</th>\n",
" <td>499</td>\n",
" <td>10</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21021</th>\n",
" <td>499</td>\n",
" <td>10</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21022</th>\n",
" <td>499</td>\n",
" <td>11</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21023</th>\n",
" <td>499</td>\n",
" <td>11</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21024</th>\n",
" <td>499</td>\n",
" <td>12</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21025</th>\n",
" <td>499</td>\n",
" <td>12</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21026</th>\n",
" <td>499</td>\n",
" <td>13</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21027</th>\n",
" <td>499</td>\n",
" <td>13</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21028</th>\n",
" <td>499</td>\n",
" <td>14</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21029</th>\n",
" <td>499</td>\n",
" <td>14</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21030</th>\n",
" <td>499</td>\n",
" <td>15</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21031</th>\n",
" <td>499</td>\n",
" <td>15</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21032</th>\n",
" <td>499</td>\n",
" <td>16</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21033</th>\n",
" <td>499</td>\n",
" <td>16</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21034</th>\n",
" <td>499</td>\n",
" <td>17</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21035</th>\n",
" <td>499</td>\n",
" <td>17</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21036</th>\n",
" <td>499</td>\n",
" <td>18</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21037</th>\n",
" <td>499</td>\n",
" <td>18</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21038</th>\n",
" <td>499</td>\n",
" <td>19</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21039</th>\n",
" <td>499</td>\n",
" <td>19</td>\n",
" <td>id</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21040</th>\n",
" <td>499</td>\n",
" <td>20</td>\n",
" <td>has_tv</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21041</th>\n",
" <td>499</td>\n",
" <td>20</td>\n",
" <td>id</td>\n",
" <td>infected</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>21042 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" agent_id tstep attribute value\n",
"0 env 0 prob_tv_spread 0.01\n",
"1 env 0 prob_neighbor_spread 0.1\n",
"2 env 1 prob_tv_spread 0.01\n",
"3 env 1 prob_neighbor_spread 0.1\n",
"4 env 2 prob_tv_spread 0.01\n",
"5 env 2 prob_neighbor_spread 0.1\n",
"6 env 3 prob_tv_spread 0.01\n",
"7 env 3 prob_neighbor_spread 0.1\n",
"8 env 4 prob_tv_spread 0.01\n",
"9 env 4 prob_neighbor_spread 0.1\n",
"10 env 5 prob_tv_spread 0.01\n",
"11 env 5 prob_neighbor_spread 0.1\n",
"12 env 6 prob_tv_spread 0.01\n",
"13 env 6 prob_neighbor_spread 0.1\n",
"14 env 7 prob_tv_spread 0.01\n",
"15 env 7 prob_neighbor_spread 0.1\n",
"16 env 8 prob_tv_spread 0.01\n",
"17 env 8 prob_neighbor_spread 0.1\n",
"18 env 9 prob_tv_spread 0.01\n",
"19 env 9 prob_neighbor_spread 0.1\n",
"20 env 10 prob_tv_spread 0.01\n",
"21 env 10 prob_neighbor_spread 0.1\n",
"22 env 11 prob_tv_spread 0.01\n",
"23 env 11 prob_neighbor_spread 0.1\n",
"24 env 12 prob_tv_spread 0.01\n",
"25 env 12 prob_neighbor_spread 0.1\n",
"26 env 13 prob_tv_spread 0.01\n",
"27 env 13 prob_neighbor_spread 0.1\n",
"28 env 14 prob_tv_spread 0.01\n",
"29 env 14 prob_neighbor_spread 0.1\n",
"... ... ... ... ...\n",
"21012 499 6 has_tv True\n",
"21013 499 6 id neutral\n",
"21014 499 7 has_tv True\n",
"21015 499 7 id neutral\n",
"21016 499 8 has_tv True\n",
"21017 499 8 id neutral\n",
"21018 499 9 has_tv True\n",
"21019 499 9 id neutral\n",
"21020 499 10 has_tv True\n",
"21021 499 10 id neutral\n",
"21022 499 11 has_tv True\n",
"21023 499 11 id neutral\n",
"21024 499 12 has_tv True\n",
"21025 499 12 id neutral\n",
"21026 499 13 has_tv True\n",
"21027 499 13 id neutral\n",
"21028 499 14 has_tv True\n",
"21029 499 14 id neutral\n",
"21030 499 15 has_tv True\n",
"21031 499 15 id neutral\n",
"21032 499 16 has_tv True\n",
"21033 499 16 id neutral\n",
"21034 499 17 has_tv True\n",
"21035 499 17 id neutral\n",
"21036 499 18 has_tv True\n",
"21037 499 18 id neutral\n",
"21038 499 19 has_tv True\n",
"21039 499 19 id neutral\n",
"21040 499 20 has_tv True\n",
"21041 499 20 id infected\n",
"\n",
"[21042 rows x 4 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"config_file, df, config = list(analysis.get_data('soil_output/Spread_barabasi*prob_0.1*', process=False))[0]\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:43:17.192030Z",
"start_time": "2017-07-03T16:43:16.601046+02:00"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>value</th>\n",
" <th>0.01</th>\n",
" <th>0.1</th>\n",
" <th>False</th>\n",
" <th>True</th>\n",
" <th>infected</th>\n",
" <th>neutral</th>\n",
" </tr>\n",
" <tr>\n",
" <th>tstep</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>0.0</td>\n",
" <td>500.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>3.0</td>\n",
" <td>497.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>6.0</td>\n",
" <td>494.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>12.0</td>\n",
" <td>488.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>23.0</td>\n",
" <td>477.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>36.0</td>\n",
" <td>464.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>53.0</td>\n",
" <td>447.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>79.0</td>\n",
" <td>421.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>119.0</td>\n",
" <td>381.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>164.0</td>\n",
" <td>336.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>204.0</td>\n",
" <td>296.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>254.0</td>\n",
" <td>246.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>293.0</td>\n",
" <td>207.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>336.0</td>\n",
" <td>164.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>365.0</td>\n",
" <td>135.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>391.0</td>\n",
" <td>109.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>407.0</td>\n",
" <td>93.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>424.0</td>\n",
" <td>76.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>442.0</td>\n",
" <td>58.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>452.0</td>\n",
" <td>48.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>1.0</td>\n",
" <td>1.0</td>\n",
" <td>163.0</td>\n",
" <td>337.0</td>\n",
" <td>464.0</td>\n",
" <td>36.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"value 0.01 0.1 False True infected neutral\n",
"tstep \n",
"0 1.0 1.0 163.0 337.0 0.0 500.0\n",
"1 1.0 1.0 163.0 337.0 3.0 497.0\n",
"2 1.0 1.0 163.0 337.0 6.0 494.0\n",
"3 1.0 1.0 163.0 337.0 12.0 488.0\n",
"4 1.0 1.0 163.0 337.0 23.0 477.0\n",
"5 1.0 1.0 163.0 337.0 36.0 464.0\n",
"6 1.0 1.0 163.0 337.0 53.0 447.0\n",
"7 1.0 1.0 163.0 337.0 79.0 421.0\n",
"8 1.0 1.0 163.0 337.0 119.0 381.0\n",
"9 1.0 1.0 163.0 337.0 164.0 336.0\n",
"10 1.0 1.0 163.0 337.0 204.0 296.0\n",
"11 1.0 1.0 163.0 337.0 254.0 246.0\n",
"12 1.0 1.0 163.0 337.0 293.0 207.0\n",
"13 1.0 1.0 163.0 337.0 336.0 164.0\n",
"14 1.0 1.0 163.0 337.0 365.0 135.0\n",
"15 1.0 1.0 163.0 337.0 391.0 109.0\n",
"16 1.0 1.0 163.0 337.0 407.0 93.0\n",
"17 1.0 1.0 163.0 337.0 424.0 76.0\n",
"18 1.0 1.0 163.0 337.0 442.0 58.0\n",
"19 1.0 1.0 163.0 337.0 452.0 48.0\n",
"20 1.0 1.0 163.0 337.0 464.0 36.0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(analysis.get_data('soil_output/Spread_barabasi*prob_0.1*', process=True))[0][1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you don't want to work with pandas, you can also use some pre-defined functions from soil to conveniently plot the results:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:43:20.937324Z",
"start_time": "2017-07-03T16:43:17.193845+02:00"
},
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\nepvSiJ7tQjC5BWDFihW
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd082247198>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nFCkRGGOO2H+Pi8h3WEM
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd082126630>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nubCY4wUl1nNhCccKrOe
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd082126b00>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nJ1jLK9XF1Dc0UnKoluK
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd08206ef98>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n1VBxuO7oSbyuoZG6+uN
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd081e8d860>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"analysis.plot_all('soil_output/Spread_barabasi*', attributes=['id'])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2017-07-03T14:43:49.238790Z",
"start_time": "2017-07-03T16:43:20.939175+02:00"
}
},
"outputs": [
{
"data": {
"image/png": "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\ns4genUdY/lkzu43oUXO
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd081c96978>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nLnikinPQ3eaTw5tvfz7
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd081c99f60>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nZNaB47jmzMM55fB9KC9
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd081b4e7f0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcXFWZ//HP01vSXVl7AQJhSHQygBESICCKDsxEVlmc\nMWjGDJso4wquP1B/juiMMww4MqK4oDiIRhbDIBl+OAMDiVFANEEI+yTRIIGQpCsh6epOesvz++Oe\n6tx0autOV1VX9ff9etWrbt176tZTt2/fp865955j7o6IiIxdNeUOQEREykuJQERkjFMiEBEZ45QI\nRETGOCUCEZExTolARGSMUyKQAWZ2i5n9Y7V8TrGZ2efM7PvljiPOzC42s1+NgjjWm9nbyx2HFEaJ\noAzM7K1m9oiZbTezrWb2sJkdX+64ZGjc/Z/c/f3ljqOamNl8M3vezLrMbJmZHZaj7DIz22JmO8zs\nSTM7r5SxVhMlghIzs0nAvcA3gGbgEOBLQPcQ12NmNqr/fmZWNwpiqC13DEMxGrZZPsWK0cxagf8A\nvkD0v7ESuCPHW64Aprn7JOAy4MdmNq0YsVW7UX0gqVJ/BuDut7l7v7vvdPf73X11qNY/bGbfCLWF\n581sfvqNZrbczL5iZg8DXcDrzGyymd1sZhvN7GUz+8f0wc/MXm9mD5lZ0szazWyxmU2Jre8YM3vc\nzDrM7A5gfCFfwMzONrMnzOy1ULM5OrZsvZldaWargU4zq8v3OWb2ATNbG2pHS83s4DDfzOx6M9sc\ntsdqM3tjnthuMbNvm9l9ZtYJ/IWZjTOzr5rZH81sk5l9x8waQ/lTzGyDmX0qfM5GM7skLDs+lK+L\nrf9dZvZEmL7azH5cwPa60MxeDH+HL8SbTcI6lpjZj81sB3CxmZ1gZo+G7bvRzL5pZg2x9bmZXW5m\nvw9/1+sG/ygI33ebmf3BzM4sIMblZvbPZvabsK3vMbPmsGxG+MxLzeyPwENh/rlm9kyIc7mZHTlo\ntceb2bMhjn83s3z7118Dz7j7T919F3A1MMfMjshU2N1Xu3tf+iVQDxya77tKBu6uRwkfwCQgCfwQ\nOBOYGlt2MdAHfIJop34PsB1oDsuXA38EZgN1oczPgO8CCeAA4DfA34XyfwqcCowD2oAVwL+FZQ3A\ni7HPWgD0Av+YJ/5jgc3Am4Ba4CJgPTAuLF8PPEH0D9mY73OAvwTaw3rHEdWUVoRlpwOrgCmAAUcS\n/QLMFd8tYZudRPRDZzzwb8BSol+ZE4H/BP45lD8lbPMvh/jOIkqyU8PyZ4EzY+u/G/hUmL4a+HGe\neN4ApIC3hm3x1fD93x5bRy/wzhBvI3AccGL4G88AngM+HlunA8vC9/kT4H+B98f2oV7gA+Hv8yHg\nFcDyxLkceBl4I9G+dFf6u4UYHLg1LGsk+kHTSbR/1QP/B1gLNMT2g6fDftAMPEz+fevrwLcHzXsa\neFeO99wL7Arx/RdQU+7/8Up8lD2AsfgIB7RbgA3hILQUODD8E+/1T0t0YL8gTC8HvhxbdiBRk1Jj\nbN7fAMuyfO47gd+F6T/P8FmPFPDP+m3gHwbNewE4OUyvB94XW5bzc4CbgWtjyyaEA9kMoiTxv+Gg\nWNA/eNiut8ZeWzhgvT42783AH8L0KcBOoC62fDNwYpi+ElgcppuJksS08Ppq8ieCvwdui71uAnrY\nOxGsyLOOjwN3x147cEbs9YeBB8P0xcDaQZ/nwEF5PmM5cE3s9RtCnLXsSQSviy3/AnBn7HUNUSI5\nJbYffDC2/CxgXZ4Ybo7HEOY9DFyc5331RD+qPrG//5tj9THq2yOrkbs/R/QPS6j2/pjoV+t/Ay97\n2LuDF4GDY69fik0fRvRPsNHM0vNq0mXM7ADgBuBtRL+Ea4BtodzBWT4rn8OAi8zsY7F5DTlizPc5\nBwOPp1+4e8rMksAh7v6QmX0TuBH4EzO7G/i0u+/IE2P889uIDoarYtvIiA5waUnf08QA0cF+Qpj+\nMfCcmU0A3g380t035vn8uIPj8bh7V/h+2eLFzP4M+BowL8ReR1QzyvaewfvIq4M+j9j3yWXwOuuB\n1izLDyb2d3T33Wb2EtE5r0JizCRFVGOOmwR05HqTu/cCPzezK8xsnbsvzfM5MojOEZSZuz9P9Cs2\n3fZ9iMWOWERV/1fib4lNv0RUI2h19ynhMcndZ4fl/xzKH+3RCbW/JToIAmzM8ln5vAR8JfZ5U9y9\nyd1vyxJjvs95hSi5AGBmCaCF6Ncl7n6Dux9H1Bz2Z8BnCogx/vntRL/4Z8finezuhRwYcfeXgUeB\nvwIuAH5UyPtiNgLT0y/CuYmWHPFCVOt6HpgV/m6fY8/fLS3eFj54HxmuwevsJdp+meIc/Hez8P6X\n9yPGZ4A5sXUmgNeH+YWoC+VliJQISszMjggnJqeH14cSNef8OhQ5ALjczOrN7HyiZqT7Mq0r/DK9\nH/hXM5tkZjUWnSA+ORSZSPQr6zUzO4S9D6KPEjVLXR5O6P41cEIBX+F7wAfN7E3hZG7CzN5hZhOz\nlM/3OT8BLjGzuWY2Dvgn4DF3Xx9O1r7JzOqJmnd2Af0FxDjA3XeHmK8PNSTM7BAzO30Iq7mVqA38\nKKJzBEOxBDjHzN4STvh+iX0P6oNNBHYAqVBj/FCGMp8xs6lh/7mC3FfXFOpvzewNZtZEdM5kibtn\n2953Au+w6HLPeuBTRD9KHomV+YiZTQ8nnT9XQIx3A28MJ+THEzWrrQ4/lvYS/o/ONLPG8L/yt0TN\nkL8YyheWiBJB6XUQnWh9zKKrWn5NdELsU2H5Y8Asol9iXwEWuPvgpoS4C4maZp4lavZZAqQvofsS\n0UnY7cD/I7o0DwB37yG6SuPi8L73xJdn4+4riU5EfjO8b21YR7byOT/H3R8kam++i+jX8+uBhWHx\nJKKD+DaipoUk0cnWoboyxPnrcGXO/wCHD+H9dxP9+r3b3TuH8sHu/gzwMeB2ou/XQXQOItflwp8G\n3hvKfo/MB9B7iJqLniD62948lLiy+BFR7fRVopPsl2cr6O4vENUwv0G0r54DnBP+3mk/Ifqh8vvw\nyHkTobtvAd5FtN9vI/o/Se8LWHS113fSL4nOr2wGthAlw/e4++PIkNneTbdSTmZ2MdHVH28tdyyy\nNzNbR3Q11v/s53omAK8RNfv8YZjr8PD+tfsTy6B1Lic68T2q7pSW0lCNQCQPM3sXUfv4Q8N8/zlm\n1hTavL8KPEV0VY3IqKBEIPuwqA+dVIbHz8sdG0C4iSlTfIuK8FnLiU7efiScb8hUZlGWeNInOc8j\nOlH6ClGz30IvQ1U8S4wpM3tbCWMY1fvWWKWmIRGRMU41AhGRMW5U3FDW2trqM2bMKHcYIiIVZdWq\nVe3u3ra/6xkViWDGjBmsXLmy3GGIiFQUMyukN4C81DQkIjLGKRGIiIxxSgQiImOcEoGIyBinRCAi\nMsYVlAgsGlrvKYuGJ1wZ5jWb2QNmtiY8Tw3zzcxusGjowdVmdmwxv4CIiOyfodQI/sLd57r7vPD6\nKqJRkWYBD4bXEI0UNCs8LiO6PV9EREap/bmP4DyiYf4gGn93OVF3v+cRDRXoRN3+TjGzaTlHderY\nCA99ZT9CAerGQcMEaEiER4bpcROgPgE15W8R273b2drVw5aO7j2PVDdd3X353ywiMoIKTQQO3B+6\nv/2uu98EHJg+uLv7xvSgH0RD1cWHqNsQ5u2VCMzsMqIaA8dNq4UV1w3/W+wzwFMe9U37JommFnjH\n12DStPzvz6Gzu2/goJ4+wG/u2LXXwX5LRzftqR76d2eO2/INWyIiMoIKTQQnufsr4WD/gJntM2JQ\nTKbD2D5HvJBMbgKYN2+ec/V+3lnc1wM9KejpzPA8aLq7Iza/E7ra4YX74I3vgqMWDOvjl72wmct/\n8js6Mvyir60xWic00DZxHG0TxjF72uRoOv6YED0nxo2Km71FpALYNSOznoKOOu7+SnjebNEA4icA\nm9JNPmY2jWikIIhqAPG
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd0822186a0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nSKXk7SwO96SdkFoGTiK
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd0814fb898>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"analysis.plot_all('soil_output/Spread_erdos*', attributes=['id'])"
]
}
],
"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.6.1"
},
"toc": {
"colors": {
"hover_highlight": "#DAA520",
"navigate_num": "#000000",
"navigate_text": "#333333",
"running_highlight": "#FF0000",
"selected_highlight": "#FFD700",
"sidebar_border": "#EEEEEE",
"wrapper_background": "#FFFFFF"
},
"moveMenuLeft": true,
"nav_menu": {
"height": "31px",
"width": "252px"
},
"navigate_menu": true,
"number_sections": true,
"sideBar": true,
"threshold": 4,
"toc_cell": false,
"toc_section_display": "block",
"toc_window_display": true,
"widenNotebook": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}