1.导入数据

  1. df = pd.read_csv(
  2. # 该参数为数据在电脑中的路径,可以不填写
  3. filepath_or_buffer='/Users/Weidu/Desktop/sz000002.csv',
  4. # 该参数代表数据的分隔符,csv文件默认是逗号。其他常见的是'\t'
  5. sep=',',
  6. # 该参数代表跳过数据文件的的第1行不读入
  7. skiprows=1,
  8. # nrows,只读取前n行数据,若不指定,读入全部的数据
  9. nrows=15,
  10. # 将指定列的数据识别为日期格式。若不指定,时间数据将会以字符串形式读入。一开始先不用。
  11. # parse_dates=['交易日期'],
  12. # 将指定列设置为index。若不指定,index默认为0, 1, 2, 3, 4...
  13. # index_col=['交易日期'],
  14. # 读取指定的这几列数据,其他数据不读取。若不指定,读入全部列
  15. usecols=['交易日期', '股票代码', '股票名称', '收盘价', '涨跌幅', '成交量', '新浪概念', 'MACD_金叉死叉'],
  16. # 当某行数据有问题时,报错。设定为False时即不报错,直接跳过该行。当数据比较脏乱的时候用这个。
  17. error_bad_lines=False,
  18. # 将数据中的null识别为空值
  19. na_values='NULL',
  20. )

2.查看数据

  1. print(df.shape) # 输出dataframe有多少行、多少列。
  2. print(df.shape[0]) # 取行数量,相应的列数量就是df.shape[1]
  3. print(df.columns) # 顺序输出每一列的名字,演示如何for语句遍历。
  4. print(df.index) # 顺序输出每一行的名字,可以for语句遍历。
  5. print(df.dtypes) # 数据每一列的类型不一样,比如数字、字符串、日期等。该方法输出每一列变量类型
  6. print(df.head(3)) # 看前3行的数据,默认是5。与自然语言很接近
  7. print(df.tail(3)) # 看最后3行的数据,默认是5。
  8. print(df.sample(n=3)) # 随机抽取3行,想要去固定比例的话,可以用frac参数
  9. print(df.describe()) # 非常方便的函数,对每一列数据有直观感受;只会对数字类型的列有效

3.选取制定的行

  1. print(df['股票代码']) # 根据列名称来选取,读取的数据是Series类型
  2. print(df[['股票代码', '收盘价']]) # 同时选取多列,需要两个括号,读取的数据是DataFrame类型
  3. print(df[[0, 1, 2]]) # 也可以通过列的position来选取

4.loc操作:通过label(columns和index的名字)来读取数据

  1. print(df.loc['12/12/2016']) # 选取指定的某一行,读取的数据是Series类型
  2. print(df.loc['13/12/2016': '06/12/2016']) # 选取在此范围内的多行,和在list中slice操作类似,读取的数据是DataFrame类型
  3. print(df.loc[:, '股票代码':'收盘价']) # 选取在此范围内的多列,读取的数据是DataFrame类型
  4. print(df.loc['13/12/2016': '06/12/2016', '股票代码':'收盘价']) # 读取指定的多行、多列。逗号之前是行的范围,逗号之后是列的范围。读取的数据是DataFrame类型
  5. print(df.loc[:, :]) # 读取所有行、所有列,读取的数据是DataFrame类型
  6. print(df.at['12/12/2016', '股票代码']) # 使用at读取指定的某个元素。loc也行,但是at更高效。

5.iloc操作:通过position来读取数据

  1. print(df.iloc[0]) # 以index选取某一行,读取的数据是Series类型
  2. print(df.iloc[1:3]) # 选取在此范围内的多行,读取的数据是DataFrame类型
  3. print(df.iloc[:, 1:3]) # 选取在此范围内的多列,读取的数据是DataFrame类型
  4. print(df.iloc[1:3, 1:3]) # 读取指定的多行、多列,读取的数据是DataFrame类型
  5. print(df.iloc[:, :]) # 读取所有行、所有列,读取的数据是DataFrame类型
  6. print(df.iat[1, 1]) # 使用iat读取指定的某个元素。使用iloc也行,但是iat更高效。

6.列操作

  1. # 行列加减乘除
  2.  
  3. print(df['股票名称'] + '_地产') # 字符串列可以直接加上字符串,对整列进行操作
  4. print(df['收盘价'] * 100) # 数字列直接加上或者乘以数字,对整列进行操作。
  5. print(df['收盘价'] * df['成交量']) # 两列之间可以直接操作。收盘价*成交量计算出的是什么?

  6. # 新增一列
  7. df['股票名称+行业'] = df['股票名称'] + '_地产'

7.统计函数

  1. print(df['收盘价'].mean()) # 求一整列的均值,返回一个数。会自动排除空值。
  2. print(df[['收盘价', '成交量']].mean()) # 求两列的均值,返回两个数,Series
  3. print(df[['收盘价', '成交量']])
  4. print(df[['收盘价', '成交量']].mean(axis=1)) # 求两列的均值,返回DataFrame。axis=0或者1要搞清楚。
  5. #axis=1,代表对整几列进行操作。axis=0(默认)代表对几行进行操作。实际中弄混很正常,到时候试一下就知道了。
  6. print(df['收盘价'].max()) # 最大值
  7. print(df['收盘价'].min()) # 最小值
  8. print(df['收盘价'].std()) # 标准差
  9. print(df['收盘价'].count()) # 非空的数据的数量
  10. print(df['收盘价'].median()) # 中位数
  11. print(df['收盘价'].quantile(0.25)) # 25%分位数

8.shift类函数、删除列的方式

  1. df['昨天收盘价'] = df['收盘价'].shift(-1) # 读取上一行的数据,若参数设定为3,就是读取上三行的数据;若参数设定为-1,就是读取下一行的数据;
  2. print(df[['收盘价', '昨天收盘价']])
  3. del df['昨天收盘价'] # 删除某一列的方法
  4.  
  5. df['涨跌'] = df['收盘价'].diff(-1) # 求本行数据和上一行数据相减得到的值
  6. print(df[['收盘价', '涨跌']])
  7. df.drop(['涨跌'], axis=1, inplace=True) # 删除某一列的另外一种方式,inplace参数指是否替代原来的df
  8. print(df)
  9. df['涨跌幅_计9.算'] = df['收盘价'].pct_change(-1) # 类似于diff,但是求的是两个数直接的比例,相当于求涨跌幅

9.其他列函数

  1. df['成交量_cum'] = df['成交量'].cumsum() # 该列的累加值
  2. print(df[['成交量', '成交量_cum']])
  3. print((df['涨跌幅'] + 1.0).cumprod()) # 该列的累乘值,此处计算的就是资金曲线,假设初始1元钱。
  4.  
  5. df['收盘价_排名'] = df['收盘价'].rank(ascending=True, pct=False) # 输出排名。ascending参数代表是顺序还是逆序。pct参数代表输出的是排名还是排名比例
  6. print(df[['收盘价', '收盘价_排名']])
  7. del df['收盘价_排名']
  8. print(df['股票代码'].value_counts()) # 计数。统计该列中每个元素出现的次数。返回的数据是Series

10. 筛选操作

  1. print(df['股票代码'] == 'sh000002') # 判断股票代码是否等于sz000002
  2. print(df[df['股票代码'] == 'sz000002']) # 将判断为True的输出:选取股票代码等于sz000002的行
  3. print(df[df['股票代码'].isin(['sz000002', 'sz000003 ', 'sz000004'])]) # 选取股票代码等于sz000002的行
  4. print(df[df['收盘价'] >= 24.0]) # 选取收盘价大于24的行
  5. print(df[(df.index >= '03/12/2016') & (df.index <= '06/12/2016')]) # 两个条件,或者的话就是|

11.缺省值处理

  1. print(df.dropna(how='any')) # 将带有空值的行删除。how='any'意味着,该行中只要有一个空值,就会删除,可以改成all。
  2. print(df.dropna(subset=['MACD_金叉死叉', '涨跌幅'], how='all')) # subset参数指定在特定的列中判断空值。
  3. #all代表全部为空,才会删除该行;any只要一个为空,就删除该行。
  4.  
  5. # 补全缺失值
  6. print(df.fillna(value='没有金叉死叉')) # 直接将缺失值赋值为固定的值
  7. df['MACD_金叉死叉'].fillna(value=df['收盘价'], inplace=True) # 直接将缺失值赋值其他列的数据
  8. print(df.fillna(method='ffill')) # 向上寻找最近的一个非空值,以该值来填充缺失的位置,全称forward fill,非常有用
  9. print(df.fillna(method='bfill')) # 向下寻找最近的一个非空值,以该值来填充确实的位置,全称backward fill
  10.  
  11. # 找出缺失值
  12. print(df.notnull()) # 判断是否为空值,反向函数为isnull()
  13. print(df[df['MACD_金叉死叉'].notnull()]) # 将'MACD_金叉死叉'列为空的行输出

12.排序

  1. df.reset_index(inplace=True)
  2. df1 = df.iloc[0:10][['交易日期', '股票代码', '收盘价', '涨跌幅']]
  3. print(df1)
  4. df2 = df.iloc[5:15][['交易日期', '股票名称', '收盘价', '涨跌幅']]
  5. print(df2)
  6. print(df1.append(df2)) # append操作,将df1和df2上下拼接起来。注意观察拼接之后的index
  7. df3 = df1.append(df2, ignore_index=True) # ignore_index参数,用户重新确定index
  8. print(df3)

13.去重

  1. #df3中有重复的行数,我们如何将重复的行数去除?
  2. df3.drop_duplicates(
  3. subset=['收盘价', '交易日期'], # subset参数用来指定根据哪类类数据来判断是否重复。若不指定,则用全部列的数据来判断是否重复
  4. keep='first', # 在去除重复值的时候,我们是保留上面一行还是下面一行?first保留上面一行,last保留下面一行,False就是一行都不保留
  5. inplace=True
  6. )
  7. print(df3)

14. 字符串操作

  1. print(df['股票代码'])
  2. print('sz000002'[:2])
  3. print(df['股票代码'].str[:2])
  4. print(df['股票代码'].str.upper()) # 加上str之后可以使用常见的字符串函数对整列进行操作
  5. print(df['股票代码'].str.lower())
  6. print(df['股票代码'].str.len()) # 计算字符串的长度,length
  7. df['股票代码'].str.strip() # strip操作,把字符串两边的空格去掉
  8. print(df['股票代码'].str.contains('sh')) # 判断字符串中是否包含某些特定字符
  9. print(df['股票代码'].str.replace('sz', 'sh')) # 进行替换,将sz替换成sh
  10.  
  11. print(df['新浪概念'].str.split(';')) # 对字符串进行分割
  12. print(df['新浪概念'].str.split(';').str[:2]) # 分割后取第一个位置
  13. print(df['新浪概念'].str.split(';', expand=True)) # 分割后并且将数据分列

15. 时间处理

  1. df['交易日期'] = pd.to_datetime(df['交易日期']) # 将交易日期由字符串改为时间变量
  2. print(df['交易日期'])
  3. print(df.iloc[0]['交易日期'])
  4. print(df.dtypes)
  5. print(pd.to_datetime('1999年01月01日')) # pd.to_datetime函数:将字符串转变为时间变量
  6. print(df.at[0, '交易日期'])
  7. print(df['交易日期'].dt.year) # 输出这个日期的年份。相应的month是月份,day是天数,还有hour, minute, second
  8. print(df['交易日期'].dt.week) # 这一天是一年当中的第几周
  9. print(df['交易日期'].dt.dayofyear) # 这一天是一年当中的第几天
  10. print(df['交易日期'].dt.dayofweek) # 这一天是这一周当中的第几天,0代表星期一
  11. print(df['交易日期'].dt.weekday) # 和上面函数相同,更加常用
  12. print(df['交易日期'].dt.weekday_name) # 和上面函数相同,返回的是星期几的英文,用于报表的制作。
  13. print(df['交易日期'].dt.days_in_month) # 这一天是这一月当中的第几天
  14. print(df['交易日期'].dt.is_month_end) # 这一天是否是该月的开头,是否存在is_month_end?
  15. print(df['交易日期'] + pd.Timedelta(days=1)) # 增加一天,Timedelta用于表示时间差数据
  16. print((df['交易日期'] + pd.Timedelta(days=1)) - df['交易日期']) # 增加一天然后再减去今天的日期

16. rolling、expanding操作

  1. #计算'收盘价'这一列的均值
  2. print(df['收盘价'].mean())
  3. #如何得到每一天的最近3天收盘价的均值呢?即如何计算常用的移动平均线?
  4. #使用rolling函数
  5. df['收盘价_3天均值'] = df['收盘价'].rolling(5).mean()
  6. print(df[['收盘价', '收盘价_3天均值']])
  7. #rolling(n)即为取最近n行数据的意思,只计算这n行数据。后面可以接各类计算函数,例如max、min、std等
  8. print(df['收盘价'].rolling(3).max())
  9. print(df['收盘价'].rolling(3).min())
  10. print(df['收盘价'].rolling(3).std())
  11. rolling可以计算每天的最近3天的均值,如果想计算每天的从一开始至今的均值,应该如何计算?
  12. #使用expanding操作
  13. df['收盘价_至今均值'] = df['收盘价'].expanding().mean()
  14. print(df[['收盘价', '收盘价_至今均值']])
  15. expanding即为取从头至今的数据。后面可以接各类计算函数
  16. print(df['收盘价'].expanding().max())
  17. print(df['收盘价'].expanding().min())
  18. print(df['收盘价'].expanding().std())
  19. rollingexpanding简直是为量化领域量身定制的方法,经常会用到。

17.输出

  1. print(df)
  2. df.to_csv('output.csv', encoding='gbk', index=False)

未完待续。。。

https://www.cnblogs.com/weidu/p/9831807.html

http://pandas.pydata.org/pandas-docs/stable/api.html

pandas数据分析API常用操作的更多相关文章

  1. HDFS Java API 常用操作

    package com.luogankun.hadoop.hdfs.api; import java.io.BufferedInputStream; import java.io.File; impo ...

  2. Pandas 之 DataFrame 常用操作

    import numpy as np import pandas as pd This section will walk you(引导你) through the fundamental(基本的) ...

  3. etcd api常用操作

    如果需要使用v2 version api,启动etcd时候需要加入“ETCD_ENABLE_V2=true”参数,否则会报错“404 page not found” 获取etcd信息 版本信息 # c ...

  4. Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  5. 【JDK8】Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  6. pandas DataFrame 数据处理常用操作

    Xgboost调参: https://wuhuhu800.github.io/2018/02/28/XGboost_param_share/ https://blog.csdn.net/hx2017/ ...

  7. easyui api常用操作

    一.FORM表单类 一.textbox validatebox 验证 1.验证规则:validType : 验证规则,类型STRING|ARRAY:1个规则就直接一个字符串,多个规则写在数组里 例如: ...

  8. Elasticsearch(ES)API 增删查改常用操作

    常用操作 查询所有数据 POST http://192.168.97.173:27009/logstash_test_2018/doc/_search { "query": { & ...

  9. 『无为则无心』Python序列 — 18、Python列表概念及常用操作API

    目录 1.列表的概念 (1)列表的定义 (2)列表的应用场景 (3)列表的定义格式 2.列表的常用操作 (1)列表的查找 1)通过下标查找 2)通过方法查找 3)判断是否存在 (2)列表的增加 @1. ...

随机推荐

  1. JavaSE14-集合·其一

    1.Collection集合 1.1 集合体系结构 集合 (接口)Collection:单列 (接口)List:可重复 (实现类)ArrayList (实现类)LinkedList (接口)Set:不 ...

  2. Jmeter对数据库做压力测试

    一.环境:apache-jmeter-5.0,Oracle11g.windows7.jdk1.8.ojdbc14-10.2.0.2.0.jar二.操作配置:2.1.启动Jmeter Jmeter初始化 ...

  3. Unity状态机(Animator)

    状态机的状态(State) 每个Animator Controller都会自带三个状态:Any State, Entry和 Exit.  

  4. 来感受Linux命令行的“真香定律”

    Shell看起来只是一个黑黑的命令框,刚开始接触会觉得很丑,毕竟与Win/Mac的华丽界面比起来,命令行终端直接可以丑拒了.但是,实际上它的功能要强大得多,毕竟Linux一开始就是广泛应用于服务器,通 ...

  5. 2020-2021-1 20209307《Linux内核原理与分析》第四周作业

    一.Linux内核源代码简介 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断机制 2.操作系统两把宝剑 中断上下文的切换 进程上下文的切换 3.函数目录 Linux-3.18.6/arch/x ...

  6. [打基础]一些C++自带的库(持续更新)

    iomanip manip是manipulator(嗯,操作器?)的缩写,对应头文件就是 #include<iomanip> 在算法竞赛里用得到的应该是两个接口:进制转换(8,10,16) ...

  7. Restful API 接口设计标准及规范

    Restful API 接口设计标准以及规范 RESTful概念 理解和评估以网络为基础的应用软件的架构设计,得到一个功能强.性能好.适宜通信的架构.REST指的是一组架构约束条件和原则." ...

  8. .net下com调用支持x86/x64

    起因 项目涉及u3d/wpf端的渲染图形合成,采用了开源项目spout,为了便捷,采用了spout的com版本作为c#端的调用 项目调整后,细节已经捋清楚了. 但是考虑桌面应用采用anypc,根据运行 ...

  9. 中小学生的噩梦:怎样用Python检测抄袭行为?广大中小学生们的美梦就此结束

    本教程将介绍如何使用机器学习技术(如word2vec和余弦相似度等),在Python中用几行代码制作抄袭检测器.搭建完成后,抄袭检测器将会从文件中载入学生们的作业,然后通过计算相似度来判断学生有无相互 ...

  10. 给因特尔S2600CO服务器主板安装【SAS控制器】驱动

    给因特尔S2600CO服务器主板安装[SAS控制器]驱动 1:首先打开[设备管理器]找到未识别驱动的[SAS控制器]双击进入 2:在[详细信息]选项卡,选择[兼容Id]属性可以看到PCI\VEN_80 ...