Fork me on GitHub

pandasNote4

1
2
3
4
import numpy as np
import pandas as pd
from pandas import Series, DataFramei
import pandas_datareader.data as web

协方差和相关系数

  • corr()
  • cov()
  • corrwith()
1
2
3
4
5
6
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()})
volume = pd.DataFrame({ticker: data['Volume']
for ticker, data in all_data.items()})
1
2
3
# 计算价格的百分变化
returns = price.pct_change()
returns.head()
AAPL IBM MSFT GOOG
Date
2009-12-31 NaN NaN NaN NaN
2010-01-04 0.015565 0.011841 0.015420 0.010920
2010-01-05 0.001729 -0.012080 0.000323 -0.004404
2010-01-06 -0.015906 -0.006496 -0.006137 -0.025209
2010-01-07 -0.001849 -0.003461 -0.010400 -0.023280
1
2
3
# 计算相关系数和协方差
print(returns["MSFT"].corr(returns["IBM"])) # 通过标签的形式
print(returns["MSFT"].cov(returns["IBM"]))
1
2
0.49161308372179857
8.80330763108205e-05
1
returns.MSFT.corr(returns.IBM)  # 通过属性的形式
1
0.49161308372179857
1
2
3
# 协方差和相关系数矩阵
print(returns.corr())
print(returns.cov())
1
2
3
4
5
6
7
8
9
10
          AAPL       IBM      MSFT      GOOG
AAPL 1.000000 0.387306 0.458039 0.463707
IBM 0.387306 1.000000 0.491613 0.407577
MSFT 0.458039 0.491613 1.000000 0.539243
GOOG 0.463707 0.407577 0.539243 1.000000
AAPL IBM MSFT GOOG
AAPL 0.000267 0.000078 0.000108 0.000118
IBM 0.000078 0.000154 0.000088 0.000079
MSFT 0.000108 0.000088 0.000209 0.000121
GOOG 0.000118 0.000079 0.000121 0.000242
1
2
# corrwith():计算某列或者行和另一个S或者DF数据之间的相关系数
returns.corrwith(returns.IBM)
1
2
3
4
5
AAPL    0.387306
IBM 1.000000
MSFT 0.491613
GOOG 0.407577
dtype: float64

唯一值、值计数和成员资格

  • unique():返回未排序的值
  • value_counts():计算出现的频率,降序
    • pd.value_counts(obj.values, sort=False)
  • isin()判断成员资格
1
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
1
2
3
# 值计数功能
uniques=obj.unique()
uniques
1
array(['c', 'a', 'd', 'b'], dtype=object)
1
obj.value_counts()  # 默认是降序通过sort=False关闭降序功能pd.value_counts(obj.values, sort=False)
1
2
3
4
5
a    3
c 3
b 2
d 1
dtype: int64
1
2
3
# 成员资格
mask = obj.isin(['b', 'c'])
mask
1
2
3
4
5
6
7
8
9
10
0     True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
1
obj[mask]
1
2
3
4
5
6
0    c
5 b
6 b
7 c
8 c
dtype: object

相关列的柱状图

将pandas.value_counts传给该DataFrame的apply函数

1
2
3
4
data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
'Qu2': [2, 3, 1, 2, 3],
'Qu3': [1, 5, 2, 4, 4]})
data
Qu1 Qu2 Qu3
0 1 2 1
1 3 3 5
2 4 1 2
3 3 2 4
4 4 3 4
1
2
result = data.apply(pd.value_counts).fillna(0)
result
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 0.0
4 2.0 0.0 2.0
5 0.0 0.0 1.0
1
data.apply(pd.value_counts)
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 NaN 2.0 1.0
3 2.0 2.0 NaN
4 2.0 NaN 2.0
5 NaN NaN 1.0
Stay Foolish Stay Hungry

本文标题:pandasNote4

发布时间:2019年09月11日 - 15:09

原始链接:http://www.renpeter.cn/2019/09/11/pandasNote4.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea