
Project Python – Free Interactive Book That Introduces Python Programming and CS - WoodenChair
http://projectpython.net/chapter00/
======
znpy
In my humble opinion there really is no need for ANOTHER introductory book on
python.

But there is a great, great need for REALLY well done books on intermediate
python and advanced python.

~~~
doublewaffle
There's one "Fluent python" by Luciano Ramalho

~~~
rhizome31
+1 for this excellent book on core Python

It can be complemented by:

    
    
        - The Python 3 Standard Library by Example
        - Python Cookbook

------
treyfitty
I've been trying to learn python for a while now, and I have a grasp of it in
a similar way that I have a grasp of golf- I know what to do, but I'm still
missing a few fundamentals.

All these intro to X things seem to gloss over the high level stuff, but I've
hit a few walls in certain concepts that I just can't possibly Google. Maybe
HN could help me out:

take a pandas dataframe. There's a .describe() method that I can chain to get
the mean of the columns in the data frame grouped by var1:

df.groupby(df.var1).describe().mean

But then, there's also:

df.describe(df.var1).mean()

They largely do the same thing, but one gives me the mean across all
variables, and the other one doesn't.

Now, how do I possibly Google this question? One method has parentheses, the
other doesn't.... but It's clear I'm missing something fundamental here that I
thought an intro online resource should address... but none do.

~~~
llao
Ok, this was more complex than I thought. I hope I got it right and this gives
you some pointers how I investigated. :)

Use type() to see what you are getting:

    
    
        >>> type(df.describe().mean())
        <class 'pandas.core.series.Series'>
        >>> type(df.describe().mean)
        <class 'method'>
    

Something without parenthesis cannot be a method _call_ , at least not from a
normal viewpoint. Instead you are trying to access the attribute "mean" of the
result of describe() if you run df.groupby(df.var1).describe().mean. This
attribute might very well be a method itself (a method object).

Last in that chain was describe(), so let's look at that:
[https://pandas.pydata.org/pandas-
docs/stable/generated/panda...](https://pandas.pydata.org/pandas-
docs/stable/generated/pandas.DataFrame.describe.html)

It returns a "summary: Series/DataFrame of summary statistics", so calling
.mean() on that, will call [https://pandas.pydata.org/pandas-
docs/stable/generated/panda...](https://pandas.pydata.org/pandas-
docs/stable/generated/pandas.DataFrame.mean.html#pandas.DataFrame.mean)

Accessing .mean will instead return that method object itself.

By default pandas will return a string describing the data itself when
printing a method:

    
    
        >>> df.describe()
               numeric   n2
        count      3.0  3.0
        mean       2.0  3.0
        std        1.0  1.0
        min        1.0  2.0
        25%        1.5  2.5
        50%        2.0  3.0
        75%        2.5  3.5
        max        3.0  4.0
        >>> df.describe().mean
        <bound method DataFrame.mean of        numeric   n2
        count      3.0  3.0
        mean       2.0  3.0
        std        1.0  1.0
        min        1.0  2.0
        25%        1.5  2.5
        50%        2.0  3.0
        75%        2.5  3.5
        max        3.0  4.0>
        >>> df.describe().mean()
        numeric    2.00
        n2         2.75
        dtype: float64
    

I assume this is what threw you off? You are not using the "results" of .mean
in further code but were just looking at them, right?

~~~
treyfitty
That’s right, I was using notebooks for a project and luckily, didn’t have to
actually extract the mean. Thanks for such an insightful answer

~~~
llao
Glad to, as I need to learn Pandas in more depth than I currently know.

Also, I noticed something very very dangerous you did:

.describe() will return a DataFrame with all those statistics. One column per
numeric column of the input. One row per statistical value (like mean, std,
etc). If you call .mean() on THAT DataFrame, you will get the mean of the
statistical values per column, so e.g. the mean of columnA's count, mean, std,
etc values. Definitely not what you want!

Instead, use either .mean() directly on your "data DataFrame" (not the one
returned by .describe()). Or access the specific value from the result via
.describe()['columnname']['mean'].

------
volkisch
How different is this from composing programs?

[http://composingprograms.com/](http://composingprograms.com/)

------
rambojazz
What's the license though?

~~~
WoodenChair
Since there is no license listed, the default is they retain full
copyright/all rights reserved.

------
cassianoleal
If you try to access this via HTTPS you get a self-signed cert whose CN is set
to www.example.com

