一、python基本操作
1、jupyter快捷键:a和b添加新行;m是转换为Markdown模式,y是code模式。执行:shift+enter;自动补全:tab;帮助文档:shift+tab。
2、三剑客:numpy/pandas/matplotlib【最好管理员模式安装,此时jupyter notebook出来是英文,且很卡;以普通用户身份打开,为中文版,且很顺畅】
3、数组和列表的区别:①字符串》浮点型》整型;②数组中存储的数据元素必须是统一类型。
4、三种方式返回数组:
① array();
② matplotlib.pyplot 【读取图片使用.imread(读入)和.imshow(显示)】;
③ zero()、one()、linspace()、arange()、random系列。
5、numpy的常用属性:shape(行数,列数,颜色数)/ndim/size/dtype('元素类型')
6、切片操作:切前两行/列 =》将图片上下左右翻转,arr[行切片,列切片],arr[::-1,::-1] #将数组的行列倒置;
7、reshape(行数,列数):数组内数据行列变形。
8、级联操作:将多个numpy数组进行横向或纵向的拼接 =》将图片上下左右拼接,numpy.concatenate((数组1,数组2),axis=1),为横向拼接;axis=0,为纵向拼接。若有数组3,即三维数组,则有axis=2。必须同一维度!
9、常用的聚合操作:sum、max、min、mean
10、常用的数学函数:三角函数(sin/cos/tan)、numpy.around(数组,decimals),返回指定数字的四舍五入值,decimals:舍入的小数位数(默认为0,若为负,整数将四舍五入到小数点左侧的位置)。
11、矩阵相关
① numpy.eye() 返回一个单位矩阵。
② array.T 返回该数组转置后的矩阵。
③ numpy.dot(数组1,数组2) 返回数组乘法之后的矩阵。
二、pandas基本操作
(1) Series(values, index), values:一组数据;index:相关数据的索引标签。由列表/numpy/字典创建。仅为一维数据源。
(2) DataFrame(values,columes,index)是一个表格型的数据结构,按照一定顺序排列的多列数据组成。有行和列索引及值,以此扩展series,是多维。 由ndarray或字典创建。
DataFrame的属性:values、columns、index、shape,无dtype。
DataFrame的索引操作:对行、队列、元素进行索引。iloc:隐式索引;loc:显式索引。
DataFrame的切片操作:对行、列进行切片。
- 索引:
- df[col]:取列
- df.loc[index]:取行
- df.iloc[index,col]:取元素
- 切片:
- df[index1:index3]:切行
- df.iloc[:,col1:col3]:切列
(3) 时间数据类型的转换:pd.to_datetime(col);将某一列设置为行索引:df.set_index()。
三、实践
1、需求:股票分析
① 使用tushare包(财经类)获取某股票的历史行情数据。
df=tushare.get_k_data(code,start) #获取网上数据,股票代码和开始时间
df.to_XXX # 将网上数据存到本地
df=pd.read_csv('./XXX.xxx') #将本地数据读入到df
② 输出该股票所有收盘比开盘上涨3%以上的日期。
df[(df['close']-df['open'])/df['open']>=0.03].index
③ 输出该股票所有开盘比前日收盘跌幅超过2%的日期。
df[(df['open']-df['close'].shift(1))/df['close'].shift(1)<=-0.02].index
④ 假如从2010年1日1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,收益如何?
df.resample('M').first() #数据重新取样,每月第一个交易日
2、双均线策略
① 均线的计算分析
② 金叉&死叉
③ 练习:假如我从2010年1月1日开始,厨师资金为10万元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?
3、清洗缺失值、空值、重复值、异常值
① 处理丢失数据:None和np.nan(NaN),区别:np.nan是float类型;None是NoneType类型。
注:数据分析中常常使用某些形式的运算来处理原始数据,若原数据中的空值为NAN的形式,则不会干扰或中断运算;NAN可以参与运算;None不可以参与运算。在pandas中,若遇到None形式的空值,则会强制转换成NAN形式。
② 处理空值:isnull连用any,notnull连用all,dropna(可直接删除缺失的行或列),fillna(覆盖缺失值)。
③ 去重:df[列索引].unique,该列中有哪些不同的元素。
④ 处理异常值:若占比小,则删除;若样本量很小,可考虑使用均值或其他统计量取代;将其视为缺失值,利用统计模型填补。
4、DateFrame的级联&合并操作
区别:merge需要依据某一共同列来合并,使用pd.merge()时,会自动根据两者相同column名称的那一列,作为key来进行合并;注:每一列元素的顺序不要求一致。
map是series的方法,只能被series调用。
排序实现的随机抽样:take()【只能使用隐式索引】、np.random.permutation() 【随机排列序列】。
四、pandas的高级操作:
① 映射:创建一个映射关系列表,把values元素和一个特定的标签或字符串绑定(给一个元素值提供不同的表现形式)。
② 分组聚合:groupby()函数,查看分组情况;
高级数据聚合:使用groupby分组后,也可使用transform和apply提供的自定义函数实现更多的运算。
df.groupby('item')['price'].sum() === df.groupby('item')['price'].apply(sum)
③ 透视表:一种可以对数据动态排布并分类汇总的表格格式。
pivot_table(index,values,columns,aggfunc),index参数是分类汇总的分类条件。
优点:灵活性高,操作性强,脉络清晰易理解。
练习:查看哈登对阵每个队伍的得分,则需对每个队伍进行分类并计算其各类得分的平均值;想看对阵同一对手在不同主客场下的数据,分类条件为对手和主客场。
④ 交叉表:是一种用于计算分组的特殊透视图,对数据进行汇总。
pd.crosstab(index,colums),index:分类数据,交叉表的行索引;columns:列索引。
df.describ(),将有数据的列统计出均值,最大最小值等数据。
df[列索引].value_counts():统计列中各元素出现的次数。
⑤ plt.plot(x,y):绘制线性图(单条/多条),设置坐标系的比例plt.figure(figsize=(a,b)),设置图例legend()和轴的标识;图例保存,figure.savefig()。
柱状图:plt.bar(索引,数据值,条形宽度);
散点图:scatter(x,y,s,c),s指标量,c指颜色;
饼图:pie(x);
直方图:hist(bins,normed,color,orientation)。