正文共: 6791字 5 图 预计阅读时间: 17 分钟
Attitude is a little thing that makes a big difference.
态度是件小事,但却意义重大。
小闫语录:
一个态度端正,对事认真的人,即使能力欠佳,最后的成果肯定不会太差。一个能力突出,但是态度不端,眼高手低的人,即使完成了任务,效果也未必见好。用人,做人,态度须为第一。
答:Numpy是一个科学计算库,用于计算,提高计算效率。Pandas是专门用于数据挖掘的开源python库,也可用于数据分析。Pandas以Numpy为基础,借力Numpy模块在计算方面性能高的优势;同时基于matplotlib,能够简便的画图。Pandas对二者进行封装,使数据处理更加的便捷。
pd.DataFrame(ndarry, index=xx, columns=xx)
# index:行索引
# columns:列索引
date_range(start=xx, end=xx, periods=xx, freq='B')
# start:开始时间
# end:结束时间
# periods:时间天数
# freq:递进单位,默认1天,'B'默认略过周末
类似于数组中的二维数组。或者简单的理解为一张表。DataFrame对象既有行索引,又有列索引。
a.行索引,表明不同行,横向索引,叫index,0轴,axis=0。
b.列索引,表名不同列,纵向索引,叫columns,1轴,axis=1。
修改行索引:xx.index = xx
重设索引:xx.reset_index(drop=False)
设置新的下标索引。
drop:默认为False,不删除原来索引,如果为True,删除原来的索引值。
以某列值设置为新的索引:set_index(keys, drop=True)
keys:列索引名称或者列索引名称的列表。如果是多列,变为multindex
drop:布尔值,默认是True。当做新的索引,删除原来的列。
MultiIndex是多级或者分层索引对象。它是新的三维数组存储方式,通过index获取所有的索引。
index属性:
在Pandas版本0.20.0之前使用Panel结构存储三维数组。它有很大的缺点,比如生成的对象无法直接看到数据,如果需要看到数据,需要进行索引。
pandas.Panel(data=None, items=None, major_axis=None, minor_axis=None, copy=False, dtype=None)
# 介绍几个常用的参数
# items - axis 0,每个项目对应于内部包含的数据帧(DataFrame)。
# major_axis - axis 1,它是每个数据帧(DataFrame)的索引(行)。
# minor_axis - axis 2,它是每个数据帧(DataFrame)的列。
Series类似于前面的一维数组,它只有行索引。
创建Series:
pd.Series()
# 可以指定内容,默认索引,如下:
pd.Series(np.arange(10))
# 也可以指定索引
pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5])
# 还可以通过字典数据创建
pd.Series({'red':100, ''blue':200, 'green': 500, 'yellow':1000})
获取索引和值:
读取文件:
pd.read_csv()
可以直接使用行列索引,注意是先列后行,如下:
data['ethanyan']['2019-04-12']
对象.loc[]
-- 先行后列, 通过索引字符串索引。
data.loc['2018-02-27':'2018-02-22', 'ethanyan']
对象.iloc[]
-- 先行后列, 通过索引下标获取。
data.iloc[0:100, 0:2]
对象.ix[]
-- 先行后列, 下标和字符串都OK。
需求:对DataFrame当中的Ethanyan列进行重新赋值为1
# 直接修改原来的值
data['Ethanyan'] = 1
# 或者
data.Ethanyan = 1
对内容进行排序:
对象.sort_values(by=**, ascending=**)
by -- "x" 按照一个值排序
["x","x"] 按照多值排序
ascending -- True(升序), False(降序)
对索引进行排序:
对象.sort_index()
同DataFrame一样,可以通过索引和内容进行排序,只是Series只有一列,所以不需要指定参数。
对象.sort_values(ascending=)
ascending=False:降序
ascending=True:升序
对象.sort_index()
直接使用 +-
,是OK的;也可以使用 对象.add()
和 对象.sub()
。
如:对列open进行 +1
操作:
data['open'].add(1)
如:列close减去open列:
data['close'].sub(data['open'])
< > | &
:例如筛选p_change > 2的日期数据:
data['p_change'] > 2
2018-02-27 True
2018-02-26 True
2018-02-23 True
2018-02-22 False
2018-02-14 True
例如完成多个逻辑判断, 筛选p_change > 2并且open > 15:
data[(data['p_change'] > 2) & (data['open'] > 15)]
open high close low volume price_change p_change turnover my_price_change
2017-11-14 28.00 29.89 29.34 27.68 243773.23 1.10 3.90 6.10 1.34
2017-10-31 32.62 35.22 34.44 32.20 361660.88 2.38 7.42 9.05 1.82
2017-10-27 31.45 33.20 33.11 31.45 333824.31 0.70 2.16 8.35 1.66
2017-10-26 29.30 32.70 32.41 28.92 501915.41 2.68 9.01 12.56 3.11
对象.query(expr)
通过query使得刚才的过程更加方便简单
data.query("p_change > 2 & turnover > 15")
对象.isin(values)
例如判断'turnover'是否为4.19, 2.39
# 可以指定值进行一个判断,从而进行筛选操作
data[data['turnover'].isin([4.19, 2.39])]
open high close low volume price_change p_change turnover my_price_change
2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 2.68 2.39 0.63
2017-07-25 23.07 24.20 23.70 22.64 167489.48 0.67 2.91 4.19 0.63
2016-09-28 19.88 20.98 20.86 19.71 95580.75 0.98 4.93 2.39 0.98
2015-04-07 16.54 17.98 17.54 16.50 122471.85 0.88 5.28 4.19 1.00
综合分析: 能够直接得出很多统计结果, count
, mean
, std
, min
, max
等
# 计算平均值、标准差、最大值、最小值
data.describe()
单独的统计函数,我们需要了解一下。例如:min(最小值), max(最大值), mean(平均值), median(中位数), var(方差), std(标准差),mode(众数)。
# 使用统计函数:0 代表列求结果,1 代表行求统计结果
data.max(0)
对象.median() -- 中位数
对象.idxmax(axis=) -- 最大值的索引值
对象.idxmin(axis=)
总结如下:
count | Number of non-NA observations |
---|---|
sum | Sum of values |
mean | Mean of values |
median | Arithmetic median of values |
min | Minimum |
max | Maximum |
mode | Mode |
abs | Absolute Value |
prod | Product of values |
std | Bessel-corrected sample standard deviation |
var | Unbiased variance |
idxmax | compute the index labels with the maximum |
idxmin | compute the index labels with the minimum |
函数 | 作用 |
---|---|
cumsum | 计算前1/2/3/…/n个数的和 |
cummax | 计算前1/2/3/…/n个数的最大值 |
cummin | 计算前1/2/3/…/n个数的最小值 |
cumprod | 计算前1/2/3/…/n个数的积 |
对象.apply(func, axis=0)
例如:我们定义一个函数,对列的最大值与最小值做差。
data.apply(lambda x: x.max() - x.min(), axis=0)
对象.plot()
x -- x轴坐标的值
y -- y轴坐标的值
kind -- 画什么样的图
line -- 折线图
bar(barh) -- 柱状图
hist -- 直方图
pie -- 饼图
scatter -- 散点图
读取read_csv:
pandas.read_csv(filepath_or_buffer, sep =',' )
写入to_csv:
DataFrame.to_csv(path_or_buf=None, sep=', ’, columns=None, header=True, index=True, mode='w', encoding=None)
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame
读取read_hdf:
pandas.read_hdf(path_or_buf,key =None,** kwargs)
写入to_hdf:
DataFrame.to_hdf(path_or_buf, key, **kwargs)
注意:最后保存内容是 xx.h5 官方推荐使用
优先选择使用HDF5文件存储
JSON是我们常用的一种数据交换格式,前面在前后端的交互经常用到,也会在存储的时候选择这种格式。所以我们需要知道Pandas如何进行读取和存储JSON格式。
读取read_json:
pandas.read_json(path_or_buf=None, orient=None, typ='frame', lines=False)
columns:values
的形式输出。写入to_json:
DataFrame.to_json(path_or_buf=None, orient=None, lines=False)
首先需要判断是否有缺失值,也就是是否为NaN:
pd.isnull()
pd.notnull()
如果有,需要进行进行处理:
a.缺失值是nan,直接处理
b.缺失值不是nan,替换成nan再处理
np.replace(to_replace="?", value=np.nan)
答:连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。
答:连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。
简单的说,就是对数据进行分类。
pd.qcut(data, bins):
series.value_counts():
pd.cut(data, bins):
答:把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1。其又被称为热编码。
pandas.get_dummies(data, prefix=None)
pd.concat([], axis=)
pd.merge()
pd.crosstab(*, *)
pd.pivot_table([], index="")
对象.groupby(key, as_index=False).max()
注意:分组聚合一般放到一起使用,抛开聚合,只说分组,没有意义.
优质文章推荐: