pandas有很多数学和统计方法。大部分可以归类为降维或汇总统计,这些方法是用来从series中提取单个值(比如sum或mean)。还有一些方法来处理缺失值:
import pandas as pd
import numpy as np
df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],
[np.nan, np.nan], [0.75, -1.3]],
index=['a', 'b', 'c', 'd'],
columns=['one', 'two'])
df
使用sum的话,会返回一个series:
df.sum()
one 9.25
two -5.80
dtype: float64
使用axis='columns' or axis=1,计算列之间的和:
df.sum(axis='columns')
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
计算的时候,NA(即缺失值)会被除外,除非整个切片全是NA。我们可以用skipna来跳过计算NA:
df.mean(axis='columns', skipna=False)
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
一些方法,比如idxmin和idxmax,能返回间接的统计值,比如index value:
df
df.idxmax()
one b
two d
dtype: object
还能计算累加值:
df.cumsum()
另一种类型既不是降维,也不是累加。describe能一下子产生多维汇总数据:
df.describe()
/Users/xu/anaconda/envs/py35/lib/python3.5/site-packages/numpy/lib/function_base.py:4116: RuntimeWarning: Invalid value encountered in percentile
interpolation=interpolation)
对于非数值性的数据,describe能产生另一种汇总统计:
obj = pd.Series(['a', 'a', 'b', 'c'] * 4)
obj
0 a
1 a
2 b
3 c
4 a
5 a
6 b
7 c
8 a
9 a
10 b
11 c
12 a
13 a
14 b
15 c
dtype: object
obj.describe()
count 16
unique 3
top a
freq 8
dtype: object
假设DataFrame时股价和股票数量。这些数据取自yahoo finance,用pandas-datareader包能加载。如果没有的话,用conda或pip来下载这个包:
conda install pandas-datareader
import pandas_datareader.data as web
all_data = {ticker: web.get_data_yahoo(ticker)
for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']}
price = pd.DataFrame({ticker: data['Adj Close']
for ticker, data in all_data.items()})
volumn = pd.DataFrame({ticker: data['Volumn']
for ticker, data in all_data.items()})
上面的代码无法直接从yahoo上爬取数据,因为yahoo被verizon收购后,好像是不能用了。于是这里我们直接从下好的数据包里加载。
ls ../examples/
5.1 Introduction to pandas Data Structures(pandas的数据结构).ipynb
5.2 Essential Functionality(主要功能).ipynb
5.3 Summarizing and Computing Descriptive Statistics(总结和描述性统计).ipynb
nb
price = pd.read_pickle('../examples/yahoo_price.pkl')
volume = pd.read_pickle('../examples/yahoo_volume.pkl')
price.head()
volume.head()
pct_change(): 这个函数用来计算同colnums两个相邻的数字之间的变化率
现在我们计算一下价格百分比的变化:
returns = price.pct_change()
returns.tail()
series的corr方法计算两个,重合的,非NA的,通过index排列好的series。cov计算方差:
returns['MSFT'].corr(returns['IBM'])
0.4997636114415116
returns['MSFT'].cov(returns['IBM'])
8.8706554797035489e-05
因为MSFT是一个有效的python属性,我们可以通过更简洁的方式来选中columns:
returns.MSFT.corr(returns.IBM)
0.4997636114415116
dataframe的corr和cov方法,能返回一个完整的相似性或方差矩阵:
returns.corr()
returns.cov()
用Dataframe的corrwith方法,我们可以计算dataframe中不同columns之间,或row之间的相似性。传递一个series:
returns.corrwith(returns.IBM)
AAPL 0.386817
GOOG 0.405099
IBM 1.000000
MSFT 0.499764
dtype: float64
传入一个dataframe能计算匹配的column names质监局的相似性。这里我计算vooumn中百分比变化的相似性:
returns.corrwith(volume)
AAPL -0.075565
GOOG -0.007067
IBM -0.204849
MSFT -0.092950
dtype: float64
传入axis='columns'能做到row-by-row计算。在correlation被计算之前,所有的数据会根据label先对齐。
这里介绍另一种从一维series中提取信息的方法:
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
第一个函数时unique,能告诉我们series里unique values有哪些:
uniques = obj.unique()
uniques
array(['c', 'a', 'd', 'b'], dtype=object)
返回的unique values不是有序的,但我们可以排序,uniques.sort()。相对的,value_counts能计算series中值出现的频率:
obj.value_counts()
a 3
c 3
b 2
d 1
dtype: int64
返回的结果是按降序处理的。vaule_counts也是pandas中的方法,能用在任何array或sequence上:
pd.value_counts(obj.values, sort=False)
d 1
c 3
b 2
a 3
dtype: int64
isin 能实现一个向量化的集合成员关系检查,能用于过滤数据集,检查一个子集,是否在series的values中,或在dataframe的column中:
obj
0 c
1 a
2 d
3 a
4 a
5 b
6 b
7 c
8 c
dtype: object
mask = obj.isin(['b', 'c'])
mask
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
obj[mask]
0 c
5 b
6 b
7 c
8 c
dtype: object
与isin相对的另一个方法是Index.get_indexer,能返回一个index array,告诉我们有重复值的values(to_match),在非重复的values(unique_vals)中对应的索引值:
to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
unique_vals = pd.Series(['c', 'b', 'a'])
pd.Index(unique_vals).get_indexer(to_match)
array([0, 2, 1, 1, 0, 2])
在某些情况下,你可能想要计算一下dataframe中多个column的柱状图:
data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
'Qu2': [2, 3, 1, 2, 3],
'Qu3': [1, 5, 2, 4, 4]})
data
把pandas.value_counts传递给dataframe的apply函数:
result = data.apply(pd.value_counts)
result
每一行的laebls(即1,2,3,4,5)其实就是整个data里出现过的值,从1到5。而对应的每个方框里的值,则是表示该值在当前列中出现的次数。比如,(2, Qu1)的值是Nan,说明2这个数字没有在Qu1这一列出现过。(2, Qu2)的值是2,说明2这个数字在Qu2这一列出现过2次。(2, Qu3)的值是1,说明2这个数字在Qu3这一列出现过1次。
阅读量:1654
点赞量:0
收藏量:0