Setup

  1. Install R. Digital Ocean has a nice guide on this (and many other things Linux-related, they are one of my preferred documentation sources)
  2. Install RStudio. The RStudio Downloads Page has a Debian package you can download. Install with sudo dpkg -i <pkgname>.deb
  3. Add data.table with Tools->Install Packages…, enter data.table
  4. Install texlive full with sudo apt install texlive-full to enable PDF output

Datasets

Load profiles come from http://wzy.ece.iastate.edu/Testsystem.html

Analysis

Load Data

feeder_a <- read.csv("feeder_a_data.csv")
names(feeder_a)
 [1] "Time"          "Year"          "Month"         "Day.of.Week"   "Hour"          "Elapsed.Days"  "Elapsed.Hours"
 [8] "Total.Power"   "Bus.1001"      "Bus.1002"      "Bus.1003"      "Bus.1004"      "Bus.1005"      "Bus.1006"     
[15] "Bus.1007"      "Bus.1008"      "Bus.1009"      "Bus.1010"      "Bus.1011"      "Bus.1012"      "Bus.1013"     
[22] "Bus.1014"      "Bus.1015"      "Bus.1016"      "Bus.1017"     

There’s a lot of columns here from the different smart meters. Let’s just take the total power

fa <- feeder_a[,c("Month","Day.of.Week","Hour","Elapsed.Days","Total.Power")]

Take a quick look at the loaded data. You can also use the “Environment” tab, but this won’t show up in the notebook

head(fa)

Visualize Data

hist(fa$Total.Power)

How to do arithmetic with data frame columns

fa$b12 <- feeder_a$Bus.1001 + feeder_a$Bus.1002
mean(fa$Total.Power)
[1] 105.8696

There’s a convenient command to print summary stastics for each column

summary(fa)
     Month         Day.of.Week         Hour        Elapsed.Days     Total.Power          b12   
 Min.   : 1.000   Min.   :1.000   Min.   : 0.00   Min.   :  0.00   Min.   : 42.68   Min.   :0  
 1st Qu.: 4.000   1st Qu.:2.000   1st Qu.: 5.75   1st Qu.: 91.24   1st Qu.: 68.07   1st Qu.:0  
 Median : 7.000   Median :4.000   Median :11.50   Median :182.48   Median : 94.11   Median :0  
 Mean   : 6.526   Mean   :3.992   Mean   :11.50   Mean   :182.48   Mean   :105.87   Mean   :0  
 3rd Qu.:10.000   3rd Qu.:6.000   3rd Qu.:17.25   3rd Qu.:273.72   3rd Qu.:141.18   3rd Qu.:0  
 Max.   :12.000   Max.   :7.000   Max.   :23.00   Max.   :364.96   Max.   :284.09   Max.   :0  
                                                                                    NA's   :1  

Plot the power over time. Yikes! There’s a lot of data here? Just how long is it?

plot(fa$Total.Power,type="l")

A whole year! That’s too much!

max(fa$Elapsed.Days)
[1] 364.96

We can plot just the first week by taking a subset of rows

plot(fa[fa$Elapsed.Days<=7,"Total.Power"],type="l")

names(fa)
[1] "Month"        "Day.of.Week"  "Hour"         "Elapsed.Days" "Total.Power"  "b12"         

How to Replace Excel Pivot Tables with R Data Tables

require(data.table)
Loading required package: data.table
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.0 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********
ta <- as.data.table(fa)

Let’s look at how much power is used per day of week (1 = Sunday). People are a little lazy on Mondays

ta[,mean(Total.Power),by=Day.of.Week]

Now let’s look at power vs month. It looks like air conditioning loads cause a peak in July

ta[,mean(Total.Power),by=Month]

Finally, let’s look at power vs time of day. The peak is at noon, though in some regions/seasons it is common two have two peaks in mornings/evenings

ta[,mean(Total.Power),by=Hour]
LS0tCnRpdGxlOiAiRGF0YSBBbmFseXNpcyBpbiBSU3R1ZGlvIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyBTZXR1cAoKMS4gSW5zdGFsbCBSLiBbRGlnaXRhbCBPY2Vhbl0oaHR0cHM6Ly93d3cuZGlnaXRhbG9jZWFuLmNvbS9jb21tdW5pdHkvdHV0b3JpYWxzL2hvdy10by1pbnN0YWxsLXItb24tdWJ1bnR1LTIwLTA0KSBoYXMgYSBuaWNlIGd1aWRlIG9uIHRoaXMgKGFuZCBtYW55IG90aGVyIHRoaW5ncyBMaW51eC1yZWxhdGVkLCB0aGV5IGFyZSBvbmUgb2YgbXkgcHJlZmVycmVkIGRvY3VtZW50YXRpb24gc291cmNlcykKMi4gSW5zdGFsbCBSU3R1ZGlvLiBUaGUgW1JTdHVkaW8gRG93bmxvYWRzIFBhZ2VdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvKSBoYXMgYSBEZWJpYW4gcGFja2FnZSB5b3UgY2FuIGRvd25sb2FkLiBJbnN0YWxsIHdpdGggYHN1ZG8gZHBrZyAtaSA8cGtnbmFtZT4uZGViYAozLiBBZGQgZGF0YS50YWJsZSB3aXRoIFRvb2xzLT5JbnN0YWxsIFBhY2thZ2VzLi4uLCBlbnRlciBgZGF0YS50YWJsZWAKNC4gSW5zdGFsbCB0ZXhsaXZlIGZ1bGwgd2l0aCBgc3VkbyBhcHQgaW5zdGFsbCB0ZXhsaXZlLWZ1bGxgIHRvIGVuYWJsZSBQREYgb3V0cHV0CgojIERhdGFzZXRzCkxvYWQgcHJvZmlsZXMgY29tZSBmcm9tIFtodHRwOi8vd3p5LmVjZS5pYXN0YXRlLmVkdS9UZXN0c3lzdGVtLmh0bWxdKGh0dHA6Ly93enkuZWNlLmlhc3RhdGUuZWR1L1Rlc3RzeXN0ZW0uaHRtbCkKCiMgQW5hbHlzaXMKCiMjIExvYWQgRGF0YQpgYGB7cn0KZmVlZGVyX2EgPC0gcmVhZC5jc3YoImZlZWRlcl9hX2RhdGEuY3N2IikKbmFtZXMoZmVlZGVyX2EpCmBgYAoKVGhlcmUncyBhIGxvdCBvZiBjb2x1bW5zIGhlcmUgZnJvbSB0aGUgZGlmZmVyZW50IHNtYXJ0IG1ldGVycy4gCkxldCdzIGp1c3QgdGFrZSB0aGUgdG90YWwgcG93ZXIKCmBgYHtyfQpmYSA8LSBmZWVkZXJfYVssYygiTW9udGgiLCJEYXkub2YuV2VlayIsIkhvdXIiLCJFbGFwc2VkLkRheXMiLCJUb3RhbC5Qb3dlciIpXQpgYGAKClRha2UgYSBxdWljayBsb29rIGF0IHRoZSBsb2FkZWQgZGF0YS4gWW91IGNhbiBhbHNvIHVzZSB0aGUgIkVudmlyb25tZW50IiB0YWIsIApidXQgdGhpcyB3b24ndCBzaG93IHVwIGluIHRoZSBub3RlYm9vawoKYGBge3J9CmhlYWQoZmEpCmBgYAoKIyMgVmlzdWFsaXplIERhdGEKYGBge3J9Cmhpc3QoZmEkVG90YWwuUG93ZXIpCmBgYApIb3cgdG8gZG8gYXJpdGhtZXRpYyB3aXRoIGRhdGEgZnJhbWUgY29sdW1ucwoKYGBge3J9CmZhJGIxMiA8LSBmZWVkZXJfYSRCdXMuMTAwMSArIGZlZWRlcl9hJEJ1cy4xMDAyCmBgYAoKYGBge3J9Cm1lYW4oZmEkVG90YWwuUG93ZXIpCmBgYAoKVGhlcmUncyBhIGNvbnZlbmllbnQgY29tbWFuZCB0byBwcmludCBzdW1tYXJ5IHN0YXN0aWNzIGZvciBlYWNoIGNvbHVtbgoKYGBge3J9CnN1bW1hcnkoZmEpCmBgYAoKUGxvdCB0aGUgcG93ZXIgb3ZlciB0aW1lLiBZaWtlcyEgVGhlcmUncyBhIGxvdCBvZiBkYXRhIGhlcmU/IEp1c3QgaG93IGxvbmcgaXMgaXQ/CgpgYGB7cn0KcGxvdChmYSRUb3RhbC5Qb3dlcix0eXBlPSJsIikKYGBgCkEgd2hvbGUgeWVhciEgVGhhdCdzIHRvbyBtdWNoIQoKYGBge3J9Cm1heChmYSRFbGFwc2VkLkRheXMpCmBgYAoKV2UgY2FuIHBsb3QganVzdCB0aGUgZmlyc3Qgd2VlayBieSB0YWtpbmcgYSBzdWJzZXQgb2Ygcm93cwoKYGBge3J9CnBsb3QoZmFbZmEkRWxhcHNlZC5EYXlzPD03LCJUb3RhbC5Qb3dlciJdLHR5cGU9ImwiKQpgYGAKCgpgYGB7cn0KbmFtZXMoZmEpCmBgYAoKIyMgSG93IHRvIFJlcGxhY2UgRXhjZWwgUGl2b3QgVGFibGVzIHdpdGggUiBEYXRhIFRhYmxlcwoKYGBge3J9CnJlcXVpcmUoZGF0YS50YWJsZSkKYGBgCgoKYGBge3J9CnRhIDwtIGFzLmRhdGEudGFibGUoZmEpCmBgYAoKTGV0J3MgbG9vayBhdCBob3cgbXVjaCBwb3dlciBpcyB1c2VkIHBlciBkYXkgb2Ygd2VlayAoMSA9IFN1bmRheSkuIFBlb3BsZQphcmUgYSBsaXR0bGUgbGF6eSBvbiBNb25kYXlzCgpgYGB7cn0KdGFbLG1lYW4oVG90YWwuUG93ZXIpLGJ5PURheS5vZi5XZWVrXQpgYGAKCk5vdyBsZXQncyBsb29rIGF0IHBvd2VyIHZzIG1vbnRoLiBJdCBsb29rcyBsaWtlIGFpciBjb25kaXRpb25pbmcgbG9hZHMgCmNhdXNlIGEgcGVhayBpbiBKdWx5CgpgYGB7cn0KdGFbLG1lYW4oVG90YWwuUG93ZXIpLGJ5PU1vbnRoXQpgYGAKRmluYWxseSwgbGV0J3MgbG9vayBhdCBwb3dlciB2cyB0aW1lIG9mIGRheS4gVGhlIHBlYWsgaXMgYXQgbm9vbiwgdGhvdWdoCmluIHNvbWUgcmVnaW9ucy9zZWFzb25zIGl0IGlzIGNvbW1vbiB0d28gaGF2ZSB0d28gcGVha3MgaW4gbW9ybmluZ3MvZXZlbmluZ3MKCmBgYHtyfQp0YVssbWVhbihUb3RhbC5Qb3dlciksYnk9SG91cl0KYGBgCgo=