3 months ago

Pandas selecting rows and columns

The behavior of passing an integer, string, slicing, list of integers, list of strings to a DataFrame:

Summary

• If a slicing or a list is passed, a DataFrame object is returned

• If a slicing is passed, a DataFrame of rows are returned
• If a list is passed, a DataFrame of cols are turned
• If a String is passed, a Series of a column is returned

3 months ago

Pandas loc vs iloc

The general format of selecting items within a Dataframe looks like this:

When both row_index and col_index are specified, the methods loc and iloc differ in the following ways:

• You cannot use slicing or a list of integers for the col_index in the loc method.
• You cannot use labels (i.e. string) for the col_index in the iloc method.

You can use slicing or a list of integers for the row_index in both loc and iloc, but they differ:

Returned data type

Depending on what you passed into the methods, you get different data types back:

The same rule applies to the loc method. So to sum it up:

• If both row_index and col_index are a list or slicing, then you will get a DataFrame back
• If either row_index or col_index is a list or slicing, then you will get a Series back
• If none of row_index or col_index is a list or slicing, then you will get whatever is stored in that cell back

If only the row_index is specified, the same rule applies, an integer will return a Series object, a list or slicing will return a DataFrame object:

When to use which method

• If all of your indexes are integers, slicing or a list of integers, use iloc (that is perceisily what the i stands for)
• If you want to use Strings for the column names, use loc

The only caveat is when using slicing for the row_index in loc is that 0:2 yeilds 0,1,2, but for the iloc methods, it yeilds 0,1 (which is how slicing works everywhere else in python)

7 months ago

Python3's pass more than one parameter to lambda function

I was trying to do this in Python 3:

It turns out that in Python 3, tuple parameter unpacking is not supported anymore.

So if more than one parameter is passed into a lambda function, we have to access it like a list:

So for the issues I have, the correct code would be:

10 months ago

Matplotlib display Chinese characters

When I was trying to use Chinese characters for a chart's title, matplotlib displayed a bunch of squares. Here are the steps to solve it.

Step 1: Find matplotlibrc

I am using virtualenv, so for me the path is:

~/.envs/edge/lib/python3.5/site-packages/matplotlib/mpl-data

The key part is /lib/python3.5/site-packages/matplotlib/mpl-data

Step 2: Modify matplotlibrc

Uncomment font.family and font.sans-serif, then add the following fonts before Bitstream Vera Sans:

PingFang SC, Hiragino Sans GB, Microsoft YaHei,

It should look like this:

If you have a ipyton notebook open, you have to close and reopen it to make this change effective. Otherwise this is it :D

11 months ago

Install Python3 and virtualenv on Mac

Install Python3

1. Install brew: http://brew.sh/
2. Install Python3 via brew: brew install python3
3. Vertify Python3 is installed: which python3 (should be located at: /usr/local/Cellar/python3/)

Install virtualenv and virtualenvwrapper

1. pip3 install virtualenv virtualenvwrapper
2. create a fold to store all of the virtual environments:

3. setup virtualenvwrapper by putting the following into .bash_profile:

Then run .bash_profile to reflect the chagnes:

Now everythiing should be set to go:

DONE.

11 months ago

I have actually found a bug in Django:

Here is the issue: You cannot have a cookie which key contains either the character '[' or ']'

I discovered the solution following @Todor's link, then I found out about this SO post. Basically there was a bug in python 2.7.x that does not parse cookies with ']' in the value. The bug was fixed in 2.7.10.

I thought it would be good to just confirm this issue. So I dug through all of the cookies and found one with the following key/value:

So I inserted the following cookie locally and submitted to the server:

The login page worked, which means 2.7.10 indeed fixed the bug.

But then I realized that the square brackets are actually in the key name not in the value, so I did the following tests:

and

If a invalid cookie comes before the csrftoken cookie in the Cookie field of the http request header, then Django will ignore everything after the invalid cookie, which makes Django think that the CSRF cookie is not set

I filed a bug report to Django. This bug is fixed in version 1.10 so make sure you update Django when 1.10 is released.

12 months ago

JavaScript what happens when newing an object

Found a great SO post on this topic:

When the [[Construct]] property for a Function object F is called, the following steps are taken:

1. Create a new native ECMAScript object.
2. Set the [[Class]] property of Result(1) to "Object".
3. Get the value of the prototype property of F.
4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).
5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the originalObject prototype object as described in 15.2.3.1.
6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument list passed into [[Construct]] as the argument values.
7. If Type(Result(6)) is Object then return Result(6).
8. Return Result(1).

Let me translate that into code:

You can add an return statement in the constructor to hijack what it returns:

If the returned object is not an object, then step 8 kicks in:

12 months ago

JavaScript __proto___ and Function.prototype

Originally, I thought there is only one prototype property per function until I read about __proto__. Take a look here:

I was totally confused until I read this stackoverflow post. First of all, this graph helps to clarify things a bit:

__proto__ is the actual object that is used in the lookup chain to resolve methods, etc. prototype is the object that is used to build __proto__ when you create an object with new:

As one of the users commented:

Ah! So prototype is not available on the instances themselves, but only on the constructor functions.

Here is a table to summarize the idea, considering the code blow:

__proto__ prototype
obj Object undefined
Person() Function Object {
constructor: function Person()
__proto__: Object
}
p1 Object {
constructor: function Person()
__proto__: Object
}
undefined

Note: obj.__proto__ is the Object.prototype and Person._proto__ is Function.prototype

12 months ago

JavaScript the value of this inside a function

The value of this depends on how the function is called. There are four ways to call a function:

• function invocation
• method invocation
• constructor invocation
• apply/call invocation

Function Invocation

In this case, this inside the function add is always bound to the global variable of the environment. (It is the Window object in this case because I run the code inside a browser)

A special case of function invocation is closure:

It is tempting to think the this value inside the plus() function is tied to add. However, that is not the case as it is explained in this post. plus is still triggered via function invocation, so this still points to the global variable.

Method Invocation

When ever the dot notation is used, a method invocation happens. In this case, the value of this equals to the object before the dot. So in this case, this == person. Because person.name = "John", this.name == "John".

A special case is nested objects:

whoever is closest to the function call is the value of this.

Constructor Invocation

In this case, a new object has been created. The keyword this points to the newly created object. The function setName() is equivelent to the following code:

Apply/Call Invocation

By using Apply or Call (or bind), you can specify the value of this:

When setName() is called the first time, name is created on the window object. If we want to attach the name property to a different object, we can use apply or call (or bind).

12 months ago

JavaScript bind, call and apply

Found a really good example that explains the differences among bind, call and apply.

Both call and apply attaches this into function and executes the function immediately:

The difference is that apply can take in an array as the parameters but call has to list them individually:

bind only attaches this with a function but id does not execute the function:

You can also pass parameters to bind:

bind is often used to express the intention of "this function is invoked with a particular this".