1.导入数据

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

2.查看数据

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

3.选取制定的行

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

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

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

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

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

6.列操作

# 行列加减乘除

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

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

7.统计函数

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

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

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

9.其他列函数

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

10. 筛选操作

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

11.缺省值处理

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

12.排序

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

13.去重

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

14. 字符串操作

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

15. 时间处理

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

16. rolling、expanding操作

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

17.输出

print(df)
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. gnuplot设置字体及大小

    set term png font 'times.ttf,14'set fontpath '/home/peter/.fonts'set output 'vel-cost.eps'set gridse ...

  2. MySQL03-多表&事务

    1.多表查询 1.1 笛卡尔积 有两个集合A,B .取这两个集合的所有组成情况. 要完成多表查询,需要消除无用的数据 1.2 多表查询分类 1.2.1 内连接查询: 1.隐式内连接:使用where条件 ...

  3. js上 三、数据类型

    3.1.什么是数据类型 a. 什么是数据类型? 想从生活中出发: 考验智商的时刻到了: 1(只)+1(只)=1(双) 3(天)+4(天)=1(周) 5(月)+7(月)=1(年) 4(时)+9(时)=1 ...

  4. Mongodb分布式集群副本集+分片

    目录 简介 1. 副本集 1.1 MongoDB选举的原理 1.2 复制过程 2. 分片技术 2.1 角色 2.2 分片的片键 2.3 片键分类 环境介绍 1.获取软件包 2.创建路由.配置.分片等的 ...

  5. 2021年第一个flag

    2021年开始更新本文列出的系列文章,根据书籍和自己的理解整理出spring框架的相关的学习 Spring 的设计理念和整体架构 学习目标 Spring的各个子项目 Spring的设计目标 Sprin ...

  6. Zookeeper一致性协议——ZAB

    ZAB协议简介 Zookeeper通过ZAB保证分布式事务的最终一致性. ZAB全称Zookeeper Atomic Broadcast(ZAB,Zookeeper原子消息广播协议) ZAB是一种专门 ...

  7. 推荐系统中的nlp知识

    都是转自其他博客,好好学习! 概述: https://blog.csdn.net/starzhou/article/details/73930117 tf-idf https://blog.csdn. ...

  8. Raft算法系列教程4:日志不一致的解决

    网络不可能一直处于正常情况,因为Leader或者某个Follower有可能会崩溃,从而导致日志不能一直保持一致.因此存在以下三种情况: (1)Follower缺失当前Leader上存在的日志条目.(2 ...

  9. java Stream学习笔记

    1.Stream与io无关. 2.Stream和用普通的循环没有太大区别,甚至时间复杂度更高,代码可读性差(通常代码行数更少). 3.流操作就是把循环要做的任务单独抽取出来,最终通过编译在一起. 来看 ...

  10. CentOs 7 安装mysql5.7.18(二进制版本)

    1.下载二进制版本安装包.搜狐开源镜像站:http://mirrors.sohu.com/mysql/MySQL-5.7/   , 找 mysql-5.7.18-linux-glibc2.5-x86_ ...