<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Max Myroshnychenko</title>
    <description>The latest articles on DEV Community by Max Myroshnychenko (@mmyros).</description>
    <link>https://dev.to/mmyros</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F342289%2F6d6359e2-e4e9-4be0-8d1b-62f8b5cd85a0.png</url>
      <title>DEV Community: Max Myroshnychenko</title>
      <link>https://dev.to/mmyros</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mmyros"/>
    <language>en</language>
    <item>
      <title>Jupyter notebooks on gitlab pages</title>
      <dc:creator>Max Myroshnychenko</dc:creator>
      <pubDate>Fri, 30 Sep 2022 15:52:16 +0000</pubDate>
      <link>https://dev.to/mmyros/jupyter-notebooks-on-gitlab-pages-4p8e</link>
      <guid>https://dev.to/mmyros/jupyter-notebooks-on-gitlab-pages-4p8e</guid>
      <description>&lt;h2&gt;
  
  
  Problems
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Some plotting packages' output (holoviews, Altair) are currently not always saved as a part of the notebook itself.&lt;/li&gt;
&lt;li&gt;Sharing results with collaborators takes an extra step of extracting plots and putting them together in something like pdf or html
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Solution: jupyter-book plus gitlab pages
&lt;/h2&gt;

&lt;p&gt;Automatically save the output of a notebook in a common, shareable format. Figures are included, and not just matplotlib based ones! &lt;a href="https://mmyros-project-chirp.netlify.app/vanderpol_coupled_standalone.html"&gt;Here is a small demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up jupyter-book on your computer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Initialize &lt;a href="//jupyterbook.org"&gt;jupyterbook&lt;/a&gt; in your &lt;code&gt;projects&lt;/code&gt; folder. Be in the folder above the &lt;code&gt;projects&lt;/code&gt; folder:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; jupyter-book cookiecutter sphinx myst_nb
jupyter-book create projects &lt;span class="nt"&gt;--cookiecutter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Type through the prompts. Example is in screenshot above &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Daily use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create some jupyter notebooks in your &lt;code&gt;my_cool_project&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Add your newly created notebooks' names to the file &lt;code&gt;toc.yml&lt;/code&gt; in the folder &lt;code&gt;my_cool_project&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Compile jupyter code to html locally:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;projects/my_cool_project
jb build my_cool_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Set up for jupyter-book on gitlab
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create an empty repository &lt;code&gt;my_cool_project&lt;/code&gt; in gitlab&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upload the newly created folder &lt;code&gt;my_cool_project&lt;/code&gt; to gitlab &lt;code&gt;my_cool_project&lt;/code&gt; repository&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Follow the section "Push an existing directory" that appears on gitlab when you create an empty project&lt;/li&gt;
&lt;li&gt;You may have to substitute the &lt;code&gt;git init&lt;/code&gt; step with:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;git init                              
git symbolic-ref HEAD refs/heads/main
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sync to gitlab&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; git add &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'I did some work'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A blue build icon should appear on gitlab and then change to a green checkmark. That means your pages are available at https://&amp;lt;YourUsername&amp;gt;.gitlab.io/&amp;lt;RepoName&amp;gt; (e.g. &lt;a href="https://mmyros.gitlab.io/my_cool_project/"&gt;https://mmyros.gitlab.io/my_cool_project/&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Gitlab pages CI debug
&lt;/h3&gt;

&lt;p&gt;If a green checkmark never appears, or https://.gitlab.io/RepoName does not work, edit &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; to contain the following, then commit and push like usual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python:3.7&lt;/span&gt;                                                                                                                                                                                                  

&lt;span class="na"&gt;pages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                                                                                                                                                                                                             
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                                                                                                                                                                                                          
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mv my_cool_project/_build/html/ public/&lt;/span&gt;                                                                                                                                                                      
  &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                                                                                                                                                                                                       
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                                                                                                                                                                                                         
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;public&lt;/span&gt;                                                                                                                                                                                               

&lt;span class="na"&gt;workflow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                                                                                                                                                                                                          
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;                                                                                                                                                                                                           
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$CI_COMMIT_REF_NAME =~ /-wip$/&lt;/span&gt;  &lt;span class="c1"&gt;# Pipelines for branch or tag names that include -wip don't run                                                                                                          &lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;never&lt;/span&gt;                                                                                                                                                                                                  
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;$CI_PIPELINE_SOURCE&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;==&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"push"'&lt;/span&gt;                                                                                                                                                                          

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>datascience</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My pycharm setup</title>
      <dc:creator>Max Myroshnychenko</dc:creator>
      <pubDate>Fri, 30 Sep 2022 14:34:21 +0000</pubDate>
      <link>https://dev.to/mmyros/my-pycharm-setup-1ndk</link>
      <guid>https://dev.to/mmyros/my-pycharm-setup-1ndk</guid>
      <description>&lt;h1&gt;
  
  
  Debugger
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Check Drop into debugger on failed tests
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ng1we19xjpbq26l8nr5.jpg" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you can use debugger:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftkdlla4394e1kw76c6qn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftkdlla4394e1kw76c6qn.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use left panel to go up and down the stack of your functions&lt;/li&gt;
&lt;li&gt;Click Console to type and debug as if you were inside your functions
# Console startup&lt;/li&gt;
&lt;li&gt;Settings -&amp;gt; Console, uncheck &lt;code&gt;Show console variables by default&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Settings -&amp;gt; Console-&amp;gt; Python Console:

&lt;ul&gt;
&lt;li&gt;in Starting script, add your database connection:
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import sys

print('Python %s on %s' % (sys.version, sys.platform))

sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
from can_dj import *
import logging
logging.getLogger("datajoint").setLevel(logging.ERROR)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Disable reader mode
&lt;/h1&gt;

&lt;p&gt;in Editor-&amp;gt; Reader Mode, uncheck &lt;code&gt;Enable reader mode&lt;/code&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>ide</category>
    </item>
    <item>
      <title>Things I wish I knew before starting a relational database</title>
      <dc:creator>Max Myroshnychenko</dc:creator>
      <pubDate>Mon, 10 Jan 2022 19:43:33 +0000</pubDate>
      <link>https://dev.to/mmyros/things-i-wish-i-knew-before-starting-a-dag-database-3hhh</link>
      <guid>https://dev.to/mmyros/things-i-wish-i-knew-before-starting-a-dag-database-3hhh</guid>
      <description>&lt;h1&gt;
  
  
  Why relational DAG
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Checks on data inegrity means you can pass your project to the maintainers&lt;/li&gt;
&lt;li&gt;Lower barrier to try out ideas on old data &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ability to try new features without breaking existing workflow&lt;/p&gt;

&lt;p&gt;No-code parallization with linear scaling (up to n channels sppedup for preprocessing)&lt;/p&gt;

&lt;p&gt;Workflow graphics&lt;/p&gt;

&lt;p&gt;No-extra-work unit testing (in theory) &lt;/p&gt;

&lt;p&gt;No extra work for usage documentation. This frees up devs to document features/science &lt;/p&gt;

&lt;h1&gt;
  
  
  Engineering process pointers
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Write two schemas at a time, one you're thinking about now and its child&lt;/li&gt;
&lt;li&gt;First, populate a few recording sessions, not all datasets&lt;/li&gt;
&lt;li&gt;Once the current schema and its child seem to work fine, get them populating and move on the the next node. &lt;/li&gt;
&lt;li&gt;Work on whole analysis simultaneously - no need to wait for all step to finish. &lt;/li&gt;
&lt;li&gt;Can start next as soon as a few keys have populated. &lt;/li&gt;
&lt;li&gt;My data entry stage is during recording when I make the filename &lt;/li&gt;
&lt;li&gt;Keep Datetime as primary key for restrictions on populate calls (Not so sure anymore)&lt;/li&gt;
&lt;li&gt;If you work on children and parents simultaneously,  parents may not show up for a while. Wait until mysql processes them first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Organizational principles
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Separate phases of analysis: ingestion/condensing, chunking, computation, organization, plotting&lt;/li&gt;
&lt;li&gt;&lt;p&gt;baby steps at the top, cram many at the bottom - bottom is high overhead due to multiplication of keys (eg events), whereas dropping top nodes means recalculate all children&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For populate calls, restrict by list of sessions if you suspect that some are not populating due to errors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;if not all items are showing up at the end of populate, repeat with reserve=False&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;start with reserve=False for schemas that require little cpu&lt;/p&gt;
&lt;h1&gt;
  
  
  Gotchas
&lt;/h1&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fractional primary keys must be stored as decimal  (10,30)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Organizing jupyter notebooks (OLD)</title>
      <dc:creator>Max Myroshnychenko</dc:creator>
      <pubDate>Tue, 01 Sep 2020 23:08:52 +0000</pubDate>
      <link>https://dev.to/mmyros/organizing-jupyter-notebooks-51ci</link>
      <guid>https://dev.to/mmyros/organizing-jupyter-notebooks-51ci</guid>
      <description>&lt;p&gt;Jupyter notebooks are great, but I hit a few grave problems once I accumulated a handful.&lt;/p&gt;

&lt;h1&gt;
  
  
  Some problems you may encounter:
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Remembering what was in each one is a chore &lt;/li&gt;
&lt;li&gt;It's tempting to pile on more and more code into the same notebook. They grow in complexity and  size&lt;/li&gt;
&lt;li&gt;They break overtime. If they rely on my outside functions, changes in these functions will break the notebooks. &lt;/li&gt;
&lt;li&gt;Since they are not typically included in an IDE, spotting errors such as those in problem 3 is nearly impossible unless you re-run them regularly&lt;/li&gt;
&lt;li&gt;Notebook anxiety. As consequence of problems 3 and 4, you are not likely to rerun them, because something surely broke down while you weren't looking!&lt;/li&gt;
&lt;li&gt;Some plotting packages' output (holoviews, Altair) are not always saved as a part of the notebook&lt;/li&gt;
&lt;li&gt;Sharing results with collaborators takes an extra step of extracting plots and putting them together in something like pdf or html
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Ideal solution would:
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Automatically save the output of a notebook in a common, shareable format&lt;/li&gt;
&lt;li&gt;Include figures, and not just matplotlib based ones &lt;/li&gt;
&lt;li&gt;Keep a running list of what's in each notebook&lt;/li&gt;
&lt;li&gt;Re-run changed notebooks from scratch to make sure all cells are still runable&lt;/li&gt;
&lt;li&gt;Make it easy and stress-free to re-run even ones that didn't change&lt;/li&gt;
&lt;li&gt;One command to rerun all relevant notebooks in a project. &lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Solution: jupyter-book
&lt;/h1&gt;

&lt;p&gt;Jupyter book addresses all of these problems and then some. &lt;br&gt;
For example output, see my &lt;a href="https://mmyros-project-chirp.netlify.app/intro.html"&gt;small demo&lt;/a&gt;. It's very easy to set up - really it's just two commands: &lt;code&gt;jupyter-book create coolproject&lt;/code&gt; and &lt;code&gt;jupyter-book build coolproject&lt;/code&gt;, but let's go through them in more detail.&lt;/p&gt;
&lt;h1&gt;
  
  
  How-to
&lt;/h1&gt;

&lt;p&gt;= 1 = Make a new repository (let's call it &lt;code&gt;coolproject&lt;/code&gt;) and clone it. Navigate to it in a terminal and then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;jupyter-book
jupyter-book create coolproject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will make the &lt;code&gt;coolproject&lt;/code&gt; folder inside your repo. Navigate to it in your terminal and fire up jupyter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jupyter notebook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;= 2 = Work on some jupyter code. Say you made &lt;code&gt;awesome_code.ipynb&lt;/code&gt;, and it's related to the topic &lt;code&gt;wowtopic&lt;/code&gt;. Also create &lt;code&gt;wowtopic.ipynb&lt;/code&gt;that only has some text in a markdown cell. You'll use this to introduce the topic. It can be empty for now.&lt;br&gt;
= 3 = In addition to &lt;code&gt;awesome_code.ipynb&lt;/code&gt; you created in step 2, you'll find the file &lt;code&gt;toc.yml&lt;/code&gt; inside this new folder. Edit it to add &lt;code&gt;awesome_code.ipynb&lt;/code&gt;. Since it's related to &lt;code&gt;wowtopic&lt;/code&gt;, you'll want &lt;code&gt;toc.yml&lt;/code&gt; to have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wowtopic&lt;/span&gt;
  &lt;span class="na"&gt;sections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;awesome_code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;= 4 = Compile jupyter code to html: Go to the top folder of your repository and issue the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jb build coolproject 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Now, you have instantly shareable html representation of all your notebooks.&lt;/p&gt;

&lt;h1&gt;
  
  
  View results
&lt;/h1&gt;

&lt;p&gt;To recap, the top-level folder that contains your repo is called &lt;code&gt;coolproject&lt;/code&gt;. It has a subfolder &lt;code&gt;coolproject&lt;/code&gt;. In it, you have a bunch of jupyter files and &lt;code&gt;toc.yml&lt;/code&gt; that organizes them into topics. &lt;/p&gt;

&lt;p&gt;The last command above makes all of them into a shareable, interlinked group of html files. Open the file &lt;code&gt;coolproject/coolproject/_build/html/index.html&lt;/code&gt; with Chrome or Firefox and never get lost in jupyter files again! &lt;/p&gt;

&lt;p&gt;There is an html file in that folder for every jupyter file you put in &lt;code&gt;toc.yml&lt;/code&gt;. Share any of them with your collaborators. No need to save figures separately. You can even hide code so it doesn't get in the way. Perfection!&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>html</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Pandas tools you didn’t know you needed, part 2: Groupby</title>
      <dc:creator>Max Myroshnychenko</dc:creator>
      <pubDate>Thu, 19 Mar 2020 14:59:47 +0000</pubDate>
      <link>https://dev.to/mmyros/pandas-tools-you-didn-t-know-you-needed-part-3-groupby-4afc</link>
      <guid>https://dev.to/mmyros/pandas-tools-you-didn-t-know-you-needed-part-3-groupby-4afc</guid>
      <description>&lt;p&gt;Very often, you need to do something to groups of rows of a dataframe that match some condition, for instance a certain mouse or brain region. The most intuitive solution is to use a for loop.&lt;/p&gt;

&lt;p&gt;For instance, let's start with this dataframe:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;experiment&lt;/th&gt;
&lt;th&gt;brain_region&lt;/th&gt;
&lt;th&gt;neuron&lt;/th&gt;
&lt;th&gt;Mean ISI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3.08281&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8.37044&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;38.5265&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;31.795&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3.43186&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We can loop over experiments, brain regions, and neuron like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;log_mean_isi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;neuron&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'neuron'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;brain_region&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;experiment&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'experiment'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;sub_df&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'experiment'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; 
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;brain_region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; 
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'neuron'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;neuron&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
            &lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;log_mean_isi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'Mean ISI'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hstack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_mean_isi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mf"&gt;1.12584188&lt;/span&gt;  &lt;span class="mf"&gt;2.19215951&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.98074317&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.25722232&lt;/span&gt;  &lt;span class="mf"&gt;2.1247061&lt;/span&gt;   &lt;span class="mf"&gt;0.0063244&lt;/span&gt; &lt;span class="mf"&gt;0.92415014&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.93038317&lt;/span&gt;  &lt;span class="mf"&gt;3.6513468&lt;/span&gt;   &lt;span class="mf"&gt;2.28266164&lt;/span&gt;  &lt;span class="mf"&gt;1.39365976&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.23681353&lt;/span&gt;  &lt;span class="mf"&gt;3.459308&lt;/span&gt;    &lt;span class="mf"&gt;1.48402753&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.65003803&lt;/span&gt;  &lt;span class="mf"&gt;1.4140086&lt;/span&gt;   &lt;span class="mf"&gt;1.23310109&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.8740564&lt;/span&gt;  &lt;span class="mf"&gt;1.29957486&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.60594385&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.61921541&lt;/span&gt;  &lt;span class="mf"&gt;4.51176028&lt;/span&gt;  &lt;span class="mf"&gt;0.5622578&lt;/span&gt;   &lt;span class="mf"&gt;3.48668087&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.57394565&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.15482997&lt;/span&gt;  &lt;span class="mf"&gt;3.62078013&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.64878302&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.08398518&lt;/span&gt;  &lt;span class="mf"&gt;0.28354575&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.92326873&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.23523802&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.15944804&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.16315081&lt;/span&gt;  &lt;span class="mf"&gt;1.29454247&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.89566237&lt;/span&gt;  &lt;span class="mf"&gt;0.72300259&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.38527266&lt;/span&gt;  &lt;span class="mf"&gt;1.3694298&lt;/span&gt;   &lt;span class="mf"&gt;2.95919545&lt;/span&gt;  &lt;span class="mf"&gt;3.07555102&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.38317331&lt;/span&gt;  &lt;span class="mf"&gt;2.3510588&lt;/span&gt;  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.68488011&lt;/span&gt;  &lt;span class="mf"&gt;2.15864159&lt;/span&gt;  &lt;span class="mf"&gt;2.92067342&lt;/span&gt;  &lt;span class="mf"&gt;0.20249933&lt;/span&gt;  &lt;span class="mf"&gt;1.76685816&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.14606501&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.54545905&lt;/span&gt;  &lt;span class="mf"&gt;2.17651238&lt;/span&gt;  &lt;span class="mf"&gt;2.49333615&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.08762839&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.10690211&lt;/span&gt;  &lt;span class="mf"&gt;1.79675315&lt;/span&gt;  &lt;span class="mf"&gt;1.08438564&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.61687289&lt;/span&gt;  &lt;span class="mf"&gt;3.64009558&lt;/span&gt;  &lt;span class="mf"&gt;2.50376142&lt;/span&gt;  &lt;span class="mf"&gt;3.53577889&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.31447026&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.9560716&lt;/span&gt;  &lt;span class="p"&gt;...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, nested for loops are evil for many reasons. Let's use the &lt;code&gt;groupby&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;log_mean_isi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sub_df&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'neuron'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'experiment'&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="n"&gt;log_mean_isi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'Mean ISI'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hstack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_mean_isi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or even in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;mean_isi_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'Mean ISI'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sub_df&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'neuron'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'experiment'&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hstack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mean_isi_list&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much more readable and efficient! Furthermore, the &lt;code&gt;index&lt;/code&gt; part can be used for reconstructing the modified dataframe. I might make a post on that in the future.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Pandas tools you didn’t know you needed, part 1: Apply 
</title>
      <dc:creator>Max Myroshnychenko</dc:creator>
      <pubDate>Thu, 19 Mar 2020 14:59:07 +0000</pubDate>
      <link>https://dev.to/mmyros/pandas-tools-you-didn-t-know-you-needed-part-1-apply-2cla</link>
      <guid>https://dev.to/mmyros/pandas-tools-you-didn-t-know-you-needed-part-1-apply-2cla</guid>
      <description>&lt;p&gt;Dataframe rows can contain arrays rather than a single value. This is the case with Datajoint's "blobs." Let's examine an instance of such a dataframe I fetched from a datajoint table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;fid&lt;/th&gt;
&lt;th&gt;brain_region&lt;/th&gt;
&lt;th&gt;single_unit&lt;/th&gt;
&lt;th&gt;single_unit_phy&lt;/th&gt;
&lt;th&gt;spike_time&lt;/th&gt;
&lt;th&gt;waveform&lt;/th&gt;
&lt;th&gt;snr&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;[ 1.71006667  2.14576667  3.35306667  3.6982     22.4359     22.80743333&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;26.00536667 26.61663333 28.39046667 29.45536667]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;[17.8181     37.5422     37.90253333 39.36106667 46.77196667 60.7908&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;77.62783333 78.71806667 82.33186667 93.15203333]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;[  1.552      115.68683333 115.69416667 160.0344     342.9736&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;346.51526667 346.8301     348.25513333 348.2767     348.29066667]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;[ 64.1048     145.53183333 185.3421     187.57793333 281.31683333&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;304.80466667 326.5742     339.3119     348.08556667 350.2595    ]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;[ 0.66776667  3.9761      4.8187     16.72106667 22.01286667 25.6975&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;29.069      29.25703333 30.07223333 31.55446667]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We'd like to get the interspike intervals. &lt;br&gt;
In this case, &lt;br&gt;
&lt;code&gt;np.diff(df['spike_time'])&lt;/code&gt;&lt;br&gt;
will not work as it will attempt to work across rows:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;array([array([16.10803333, 35.39643333, 34.54946667, 35.66286667, 24.33606667,&lt;br&gt;
       37.98336667, 51.62246667, 52.10143333, 53.9414    , 63.69666667]),&lt;br&gt;
       array([-16.2661    ,  78.14463333,  77.79163333, 120.67333333,&lt;br&gt;
       296.20163333, 285.72446667, 269.20226667, 269.53706667,&lt;br&gt;
       265.94483333, 255.13863333]),&lt;br&gt;
       array([ 62.5528    ,  29.845     ,  69.64793333,  27.54353333,&lt;br&gt;
       -61.65676667, -41.7106    , -20.2559    ,  -8.94323333,&lt;br&gt;
        -0.19113333,   1.96883333]),&lt;br&gt;
       ...,&lt;br&gt;
       array([29.80516667, 38.70003333, 40.26796667, 53.5446    , 45.7118    ,&lt;br&gt;
       55.4116    , 55.9258    , 79.12003333, 77.03993333, 83.48073333]),&lt;br&gt;
       array([-11.45576667, -11.35606667,  -9.69276667, -23.187     ,&lt;br&gt;
       -22.03416667, -31.00213333, -29.06093333, -51.92653333,&lt;br&gt;
       -51.33696667, -57.59203333]),&lt;br&gt;
       array([ 72.3652    ,  92.1018    , 157.1723    , 173.74453333,&lt;br&gt;
       185.13646667, 188.13473333, 187.84116667, 187.3681    ,&lt;br&gt;
       206.6341    , 206.1082    ])], dtype=object)&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;You can use a &lt;code&gt;for&lt;/code&gt; loop, but there is an easier way.&lt;/p&gt;

&lt;p&gt;To get our operation of interest to work row by row without looping, use &lt;code&gt;apply&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'ISI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'spike_time'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nb"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'ISI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;fid&lt;/th&gt;
&lt;th&gt;brain_region&lt;/th&gt;
&lt;th&gt;single_unit&lt;/th&gt;
&lt;th&gt;single_unit_phy&lt;/th&gt;
&lt;th&gt;spike_time&lt;/th&gt;
&lt;th&gt;waveform&lt;/th&gt;
&lt;th&gt;snr&lt;/th&gt;
&lt;th&gt;ISI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;[ 1.71006667  2.14576667  3.35306667  3.6982     22.4359     22.80743333&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[ 0.4357      1.2073      0.34513333 18.7377      0.37153333  3.19793333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;26.00536667 26.61663333 28.39046667 29.45536667]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;0.61126667  1.77383333  1.0649    ]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;[17.8181     37.5422     37.90253333 39.36106667 46.77196667 60.7908&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[19.7241      0.36033333  1.45853333  7.4109     14.01883333 16.83703333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;77.62783333 78.71806667 82.33186667 93.15203333]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1.09023333  3.6138     10.82016667]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;[  1.552      115.68683333 115.69416667 160.0344     342.9736&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[1.14134833e+02 7.33333333e-03 4.43402333e+01 1.82939200e+02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;346.51526667 346.8301     348.25513333 348.2767     348.29066667]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;3.54166667e+00 3.14833333e-01 1.42503333e+00 2.15666667e-02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;1.39666667e-02]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;[ 64.1048     145.53183333 185.3421     187.57793333 281.31683333&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[81.42703333 39.81026667  2.23583333 93.7389     23.48783333 21.76953333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;304.80466667 326.5742     339.3119     348.08556667 350.2595    ]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;12.7377      8.77366667  2.17393333]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;bucket_1_m026_1568757659_&lt;/td&gt;
&lt;td&gt;pfc&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;[ 0.66776667  3.9761      4.8187     16.72106667 22.01286667 25.6975&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[]&lt;/td&gt;
&lt;td&gt;[ 3.30833333  0.8426     11.90236667  5.2918      3.68463333  3.3715&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;29.069      29.25703333 30.07223333 31.55446667]&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;0.18803333  0.8152      1.48223333]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This get the mean without having to resort to looping over rows. If you have a more complex procedure in mind, simply define it before using &lt;code&gt;apply&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inverse_isi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spikes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""
    Inverse mean ISI of spikes is an alternative measure of firing rate
    """&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spikes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then apply it in the same way&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'ISI-based firing rate'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'blob_column'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nb"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inverse_isi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>datascience</category>
      <category>analytics</category>
      <category>python</category>
    </item>
    <item>
      <title>Pandas tools you didn't know you needed, putting it together: groupby+from_records</title>
      <dc:creator>Max Myroshnychenko</dc:creator>
      <pubDate>Thu, 19 Mar 2020 14:55:29 +0000</pubDate>
      <link>https://dev.to/mmyros/pandas-tools-you-didn-t-know-you-needed-putting-it-together-apply-iterrows-5hb4</link>
      <guid>https://dev.to/mmyros/pandas-tools-you-didn-t-know-you-needed-putting-it-together-apply-iterrows-5hb4</guid>
      <description>&lt;p&gt;Say we are trying to fetch unique instances of several conditions:&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;index_cols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'stim_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'frequency'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'phase_delay_frac'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'stim_amplitude'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'phase_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'brain_region'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each of these dataframe columns contains several unique entries repeated multiple times. Eg &lt;code&gt;brain region&lt;/code&gt; takes the values of &lt;code&gt;pfc&lt;/code&gt; and &lt;code&gt;v_hpc&lt;/code&gt;. &lt;br&gt;
Let's use an example key to examine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Fetch an entire day's worth of events:
&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SpikePhase&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;MazeTrials&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'frame'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'bucket_5_m036_1570900150_'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;single_unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phase_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'theta_hilbert_bessel'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;brain_region&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stim_amplitude&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'stim_amplitude'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;phase_delay_frac&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'phase_delay_frac'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;frequency&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'frequency'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;phase_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'phase_type'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
          &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stim_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'stim_type'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
             &lt;span class="c1"&gt;# specify primary key for fetching and populating
&lt;/span&gt;             &lt;span class="n"&gt;group_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'stim_amplitude'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stim_amplitude&lt;/span&gt;
             &lt;span class="n"&gt;group_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'phase_delay_frac'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;phase_delay_frac&lt;/span&gt;
             &lt;span class="n"&gt;group_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'frequency'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frequency&lt;/span&gt;
             &lt;span class="n"&gt;group_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'stim_type'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stim_type&lt;/span&gt;
             &lt;span class="n"&gt;group_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'phase_type'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;phase_type&lt;/span&gt;
             &lt;span class="n"&gt;group_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain_region&lt;/span&gt;
&lt;span class="c1"&gt;# fetch specific to treatment
&lt;/span&gt;             &lt;span class="n"&gt;spikes_phases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MazeTrials&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
                              &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;EventRelatedSpikesAndPhases&lt;/span&gt; 
                              &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;group_key&lt;/span&gt;
                              &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'frame'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;becomes simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Iterate over indices of interest:
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dff&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_cols&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# make a dictionary holding values of index
&lt;/span&gt;    &lt;span class="n"&gt;group_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_cols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="c1"&gt;# fetch specific to treatment
&lt;/span&gt;    &lt;span class="n"&gt;spikes_phases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MazeTrials&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;EventRelatedSpikesAndPhases&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;group_key&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'frame'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the absence of nested for loops! &lt;br&gt;
Once we have all treatment-specific events, we can do some computation on them within this loop and build the list of computed results. In the last line of the snippet below, we will concatenate them into a dataframe:&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# ...continued from above
&lt;/span&gt;    &lt;span class="c1"&gt;# do some computation here
&lt;/span&gt;    &lt;span class="n"&gt;spikes_phases&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'log_stim_amplitude'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spikes_phases&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'stim_amplitude'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="c1"&gt;# add to our list of dataframes (preallocated outside the loop):
&lt;/span&gt;    &lt;span class="n"&gt;group_results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spikes_phases&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Concatenate dicts into a dataframe:
&lt;/span&gt;&lt;span class="n"&gt;group_df&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_records&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group_results&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;set_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_cols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The columns of group_df now have our index_cols, original data column, and our computed column:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;group_df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;
&lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'brain_region'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'stim_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'frequency'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'phase_delay_frac'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'stim_amplitude'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'phase_type'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'spike_phase'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;'log_spike_phase'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
