# 2【PY从0到1】 一文掌握Pandas量化基础

# Numpy和pandas是什么关系呢?
# 在我看来,np偏向于数据细节处理,pd更偏向于表格整体的处理。
# 要记住的pd内部的数据结构采用的是array,所以np是pd地基。
# 下面就让我们来看看pandas的基本使用方法。 # 导入库:
import numpy as np
import pandas as pd
import warnings; warnings.simplefilter('ignore') # 1> Series的构建与使用
# Series是最简单的pd里的数据结构。 # 用pd.Series建立。
# 这与np.array有异曲同工之处。
# 要注意的是pd支持列表,也支持传入字典。
df = pd.Series([1,2,3,4,5,6])
df2 = pd.Series({'a':1,'b':2,'c':3})
print(type(df.values))
# 我们可以看到df的类型是ndarray:<class 'numpy.ndarray'> # 两个查看DataFrame的方法:
df.head() # 查看前五个
df.tail() # 查看后五个 # pd的索引和表格名称
df.name = 'Series1'
df.index.name = '序号'
print(df.head())
# 序号
# 0 1
# 1 2
# 2 3
# 3 4
# 4 5
# Name: Series1, dtype: int64 # 我们在生成Series时也可以指定索引名称。
df = pd.Series(range(3,9),
index = ['a', 'b', 'c', 'd', 'e','f']) # 2> Series切片
# Series里的切片全部根据索引进行的。
df[0]
df['a']
df[1:3]
df[['a','d']]
print(df['c':'d']) # 注意用索引切片是有头有尾的。
# c 5
# d 6
# dtype: int64 # 2> DataFrame的构建
# DataFrame可以看成是无数个Series组成的表格。 # ① 用np.DataFrame()建立
# 这里同样可以给pd传入列表或字典。
np.random.seed(10)
df = np.random.randint(-5,6,size=(5,6))
df = pd.DataFrame(df,
columns = ['a', 'b', 'c', 'd','e','f'],
index = [1,2,3,4,5])
print(df.head(2))
# a b c d e f
# 1 -1 1 5 4 -5 -1
# 2 5 1 -1 4 3 -5 # 3> DaraFram的切片 # ① 通过标签获取
df['a',axis=1] # 获取a列。*也可以写成df.a
df[['a']] # 返回值可以包括列标签。
# df.ix[0] # 新版pandas已经删除。
df.loc[1] # 获取行标签为1的行。
df.loc[[1]] # 返回值可以包括行标签。
df.loc[[1,3,5]] # 获取第1,3,5行。
df.loc[1:5] # 获取1到5行,有头有尾。
df.loc[[1,3],['b']] # 选取一三行和b列
# **做切片时,用索引切就是有头无尾,用标签切就是有头有尾。 # ② 按索引位置切片
df.iloc[1:3] # 按索引从0到3(不包括3)
df.iloc[0:2,0] #三行索引0到2,列索引0 # 4> DataFrame重要属性与修改
print(df.index) # 获取索引名
# 输出如下:Int64Index([1, 2, 3, 4, 5], dtype='int64')
df.columns # 获取列名
df.sum() # 按列求和,axis=1为按行求和。
df.mean() # 求平均数。
df.cumsum() # 按列累计求和。
df.describe() # 求常用统计量。
df.rename(columns={'a':'A',
'b':'B',
'c':'C',
'd':'D',
'e':'E',
'f':'F'},index={1:'one'},
inplace=True) # 对列和行标签修改,并替换原df
print(df)
# A B C D E F
# one -5 1 -4 -2 4 4
# 2 1 -1 0 5 5 3
# 3 5 5 -5 -3 4 -3
# 4 2 3 -4 -2 5 -4
# 5 3 0 0 3 -1 1 df[:] = df[:].astype('f') # 数据改为浮点数。 df['G'] = pd.DataFrame(np.arange(5,dtype='f'),
index=['one',2,5,4,3]) # 增加一列
del(df['G']) # 删除一列 np.random.seed(100)
df1 = pd.DataFrame(np.random.random((6,3)),
columns = ['a', 'b','c'])
df2 = pd.DataFrame(np.random.random((3,3)),
columns = ['a', 'b', 'c'])
df3 = df1 + df2
print(df3)
# a b c
# 0 1.359630 0.552443 0.856222
# 1 1.784806 0.822368 0.457681
# 2 0.846160 1.198685 0.142395
# 3 NaN NaN NaN
# 4 NaN NaN NaN
# 5 NaN NaN NaN
# 出错的地方pd会自动补齐NaN
df3.fillna(0, inplace=True) # 将NaN的值替换为0。 # 5> DataFrame条件选值
print(df)
# A B C D E F
# one 4.0 -1.0 -5.0 -4.0 4.0 -5.0
# 2 -4.0 5.0 3.0 4.0 -5.0 5.0
# 3 3.0 1.0 -1.0 -2.0 -5.0 -1.0
# 4 1.0 3.0 5.0 -4.0 3.0 -1.0
# 5 -4.0 -2.0 1.0 0.0 -2.0 4.0 print(df[df.A > 0]) # 选出A列大于零的所有行。相同的写法:df[df[A]>0]
# A B C D E F
# one 4.0 -1.0 -5.0 -4.0 4.0 -5.0
# 3 3.0 1.0 -1.0 -2.0 -5.0 -1.0
# 4 1.0 3.0 5.0 -4.0 3.0 -1.0 # 多条件选行:
df[(df.A > 0)|(df.B > 0)|(df.C > 0)]
df[(df.A > 0) * 1 + (df.B > 0) * 1 == 2] # A和B都大于0的行
df[(df.A > 0) * 1 + (df.B > 0) * 1 >= 1] # A和B只要有一个大于0的行 # 6> DataFrame的Apply函数
np.random.seed(12) # 随机种子
a = np.random.randn(9, 6) # 生成九行六列的Ndarray
a.round(5) # 保留五位小数
df = pd.DataFrame(a) # 建立DataFrame
dates = pd.date_range('2017-1-1', periods=9, freq='5D') # 生成时间,periods为数据量,freq为数据间隔。
column = ['a','b','c','d','e','f'] #行标签
df.index = dates # 指定索引
df.columns = column # 指定行标签 def square_fun(x):
a = x**2
return a df.apply(square_fun,axis=0) # 将df数据全部用square_fun函数计算。或 df.apply(lambda x: x ** 0.5)
# axis=0为按列,axis=1为按行。 # 7> DataFrame的排序 df.sort_index(ascending=False) # 按索引升序排列,将ascending改为True是降序。
df.sort_index(axis=1,ascending=False) # 按行标签升序排列。
df.sort_values(by= 'b', ascending= False) # 按b列升序排列。 # 8> DataFrame 处理缺失值 df_nan = np.sqrt(df).head()
print(df_nan) # 对df元素开方。
# a b c d e f
# 2017-01-01 0.687740 NaN 0.492381 NaN 0.867838 NaN
# 2017-01-06 0.071604 NaN NaN 1.694644 NaN 0.687355
# 2017-01-11 1.046879 NaN 1.158601 NaN 1.006238 NaN
# 2017-01-16 NaN 1.099907 0.708429 0.372621 0.800476 0.726177
# 2017-01-21 NaN NaN NaN NaN NaN NaN # df_nan.isnull() # 判断df_nan中的空值。
# df_nan.dropna() # 删除df_nan中的空值(行中有空值就会删除这一行)。axis=1(列中有空值就会删除这一列)
df_nan.fillna(0,inplace=True) # 空值用0填充,并替换df_nan.
print(df_nan.round(3))
# a b c d e f
# 2017-01-01 0.688 0.0 0.492 0.000 0.868 0.000
# 2017-01-06 0.072 0.0 0.000 1.695 0.000 0.687
# 2017-01-11 1.047 0.0 1.159 0.000 1.006 0.000
# 2017-01-16 0.000 1.1 0.708 0.373 0.800 0.726
# 2017-01-21 0.000 0.0 0.000 0.000 0.000 0.000

# 2【PY从0到1】 一文掌握Pandas量化基础
# Numpy和pandas是什么关系呢?# 在我看来,np偏向于数据细节处理,pd更偏向于表格整体的处理。# 要记住的pd内部的数据结构采用的是array,所以np是pd地基。# 下面就让我们来看看pandas的基本使用方法。
# 导入库:import numpy as npimport pandas as pdimport warnings; warnings.simplefilter('ignore') 

# 1> Series的构建与使用# Series是最简单的pd里的数据结构。
# 用pd.Series建立。# 这与np.array有异曲同工之处。# 要注意的是pd支持列表,也支持传入字典。df = pd.Series([1,2,3,4,5,6])df2 = pd.Series({'a':1,'b':2,'c':3})print(type(df.values))   # 我们可以看到df的类型是ndarray:<class 'numpy.ndarray'>
# 两个查看DataFrame的方法:df.head() # 查看前五个df.tail() # 查看后五个
# pd的索引和表格名称df.name = 'Series1'df.index.name = '序号'print(df.head())# 序号# 0    1# 1    2# 2    3# 3    4# 4    5# Name: Series1, dtype: int64
# 我们在生成Series时也可以指定索引名称。df = pd.Series(range(3,9),               index = ['a', 'b', 'c', 'd', 'e','f'])
# 2> Series切片# Series里的切片全部根据索引进行的。df[0]df['a']df[1:3]df[['a','d']]print(df['c':'d']) # 注意用索引切片是有头有尾的。# c    5# d    6# dtype: int64

# 2> DataFrame的构建# DataFrame可以看成是无数个Series组成的表格。
# ① 用np.DataFrame()建立# 这里同样可以给pd传入列表或字典。np.random.seed(10)df = np.random.randint(-5,6,size=(5,6))df = pd.DataFrame(df,                  columns = ['a', 'b', 'c', 'd','e','f'],                   index = [1,2,3,4,5])print(df.head(2))#    a  b  c  d  e  f# 1 -1  1  5  4 -5 -1# 2  5  1 -1  4  3 -5

# 3> DaraFram的切片
# ① 通过标签获取df['a',axis=1] # 获取a列。*也可以写成df.adf[['a']] # 返回值可以包括列标签。# df.ix[0] # 新版pandas已经删除。df.loc[1] # 获取行标签为1的行。df.loc[[1]] # 返回值可以包括行标签。df.loc[[1,3,5]] # 获取第1,3,5行。df.loc[1:5] # 获取1到5行,有头有尾。df.loc[[1,3],['b']] # 选取一三行和b列# **做切片时,用索引切就是有头无尾,用标签切就是有头有尾。
# ② 按索引位置切片df.iloc[1:3] # 按索引从0到3(不包括3)df.iloc[0:2,0] #三行索引0到2,列索引0

# 4> DataFrame重要属性与修改print(df.index) # 获取索引名# 输出如下:Int64Index([1, 2, 3, 4, 5], dtype='int64')df.columns # 获取列名df.sum() # 按列求和,axis=1为按行求和。df.mean() # 求平均数。 df.cumsum() # 按列累计求和。df.describe() # 求常用统计量。df.rename(columns={'a':'A',                   'b':'B',                   'c':'C',                   'd':'D',                   'e':'E',                   'f':'F'},index={1:'one'},          inplace=True) # 对列和行标签修改,并替换原dfprint(df)#      A  B  C  D  E  F# one -5  1 -4 -2  4  4# 2    1 -1  0  5  5  3# 3    5  5 -5 -3  4 -3# 4    2  3 -4 -2  5 -4# 5    3  0  0  3 -1  1
df[:] = df[:].astype('f') # 数据改为浮点数。
df['G'] = pd.DataFrame(np.arange(5,dtype='f'),                       index=['one',2,5,4,3]) # 增加一列del(df['G']) # 删除一列
np.random.seed(100)df1 = pd.DataFrame(np.random.random((6,3)),                   columns = ['a', 'b','c'])df2 = pd.DataFrame(np.random.random((3,3)),                   columns = ['a', 'b', 'c'])df3 = df1 + df2     print(df3)#           a         b         c# 0  1.359630  0.552443  0.856222# 1  1.784806  0.822368  0.457681# 2  0.846160  1.198685  0.142395# 3       NaN       NaN       NaN# 4       NaN       NaN       NaN# 5       NaN       NaN       NaN# 出错的地方pd会自动补齐NaNdf3.fillna(0, inplace=True) # 将NaN的值替换为0。
# 5> DataFrame条件选值print(df)#        A    B    C    D    E    F# one  4.0 -1.0 -5.0 -4.0  4.0 -5.0# 2   -4.0  5.0  3.0  4.0 -5.0  5.0# 3    3.0  1.0 -1.0 -2.0 -5.0 -1.0# 4    1.0  3.0  5.0 -4.0  3.0 -1.0# 5   -4.0 -2.0  1.0  0.0 -2.0  4.0
print(df[df.A > 0]) # 选出A列大于零的所有行。相同的写法:df[df[A]>0]#        A    B    C    D    E    F# one  4.0 -1.0 -5.0 -4.0  4.0 -5.0# 3    3.0  1.0 -1.0 -2.0 -5.0 -1.0# 4    1.0  3.0  5.0 -4.0  3.0 -1.0
# 多条件选行:df[(df.A > 0)|(df.B > 0)|(df.C > 0)]df[(df.A > 0) * 1  + (df.B > 0) * 1  == 2] # A和B都大于0的行df[(df.A > 0) * 1  + (df.B > 0) * 1  >= 1] # A和B只要有一个大于0的行
# 6> DataFrame的Apply函数np.random.seed(12) # 随机种子a = np.random.randn(9, 6) # 生成九行六列的Ndarraya.round(5) # 保留五位小数df = pd.DataFrame(a) # 建立DataFramedates = pd.date_range('2017-1-1', periods=9, freq='5D') # 生成时间,periods为数据量,freq为数据间隔。column = ['a','b','c','d','e','f'] #行标签df.index = dates # 指定索引df.columns = column # 指定行标签
def square_fun(x):    a = x**2    return a
df.apply(square_fun,axis=0) # 将df数据全部用square_fun函数计算。或 df.apply(lambda x: x ** 0.5)# axis=0为按列,axis=1为按行。

# 7> DataFrame的排序
df.sort_index(ascending=False) # 按索引升序排列,将ascending改为True是降序。df.sort_index(axis=1,ascending=False) # 按行标签升序排列。df.sort_values(by= 'b', ascending= False) # 按b列升序排列。

# 8> DataFrame 处理缺失值
df_nan = np.sqrt(df).head()print(df_nan) # 对df元素开方。#                    a         b         c         d         e         f# 2017-01-01  0.687740       NaN  0.492381       NaN  0.867838       NaN# 2017-01-06  0.071604       NaN       NaN  1.694644       NaN  0.687355# 2017-01-11  1.046879       NaN  1.158601       NaN  1.006238       NaN# 2017-01-16       NaN  1.099907  0.708429  0.372621  0.800476  0.726177# 2017-01-21       NaN       NaN       NaN       NaN       NaN       NaN
# df_nan.isnull() # 判断df_nan中的空值。# df_nan.dropna() # 删除df_nan中的空值(行中有空值就会删除这一行)。axis=1(列中有空值就会删除这一列)df_nan.fillna(0,inplace=True) # 空值用0填充,并替换df_nan.print(df_nan.round(3))#                 a    b      c      d      e      f# 2017-01-01  0.688  0.0  0.492  0.000  0.868  0.000# 2017-01-06  0.072  0.0  0.000  1.695  0.000  0.687# 2017-01-11  1.047  0.0  1.159  0.000  1.006  0.000# 2017-01-16  0.000  1.1  0.708  0.373  0.800  0.726# 2017-01-21  0.000  0.0  0.000  0.000  0.000  0.000

【PY从0到1】 一文掌握Pandas量化基础的更多相关文章

  1. 【PY从0到1】 一文掌握Pandas量化进阶

    # 一文掌握Pandas量化进阶 # 这节课学习Pandas更深的内容. # 导入库: import numpy as np import pandas as pd # 制作DataFrame np. ...

  2. IIS6(Win2003) 使用.net 4.0 后,默认文档失效解决方案。

    IIS6(Win2003) 使用.net framework 4.0 后,默认文档失效解决方案. 用.net framework 4.0 开发的WEB项目,但放到iis6 中无法使用默认文档,状况如下 ...

  3. 智表ZCELL产品V1.4.0开发API接口文档 与 产品功能清单

    为了方便大家使用ZCELL,应网友要求,整理编写了相关文档,现与产品一起同步发布,供大家下载使用,使用过程中如有疑问,请与我QQ联系. 智表(ZCELL)V1.4.0版本  功能清单文档下载地址: 功 ...

  4. python manage.py runserver 0.0.0.0:8000

    python manage.py runserver 这种命令行,可以在服务器端输入IP:8000直接访问 在 python manage.py runserver 127.0.01:8000 在服务 ...

  5. 第一篇——第一文 SQL Server 备份基础

    原文:第一篇--第一文 SQL Server 备份基础 当看这篇文章之前,请先给你的所有重要的库做一次完整数据库备份.下面正式开始备份还原的旅程. 原文出处: http://blog.csdn.net ...

  6. pyhton pandas数据分析基础入门(一文看懂pandas)

    //2019.07.17 pyhton中pandas数据分析基础入门(一文看懂pandas), 教你迅速入门pandas数据分析模块(后面附有入门完整代码,可以直接拷贝运行,含有详细的代码注释,可以轻 ...

  7. HTML结构文档中那些基础又重要又容易被忽略的事?

    HTML结构文档中那些基础又重要又容易被忽略的事? 大部分的人,总是会做出这样下意识地判断:简单就是不重要,容易就可以直接忽略掉!其实不然,简有精髓,基石必重,岂能略而不顾!HTML结构文档的编写,可 ...

  8. 06 Zabbix4.0系统CISCO交换机告警模板规划信息(基础)

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 06 Zabbix4.0系统CISCO交换机告警模板规划信息(基础) 1. Host groups ...

  9. windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭

    windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭,错误的解决方法 在 ...

随机推荐

  1. Windows搭建TestLink环境

    环境准备: 搭建php5.4.39+apache2.2+mysq5.5.28l环境 (可参考http://www.cnblogs.com/yangxia-test/p/4414161.html) (注 ...

  2. Flutter环境搭建遇坑小结(一)

    对flutter的了解与开发也有一段时间了,总的来说,搭建开发环境遇到的各种坑也是很多,尤其对于初次接触Android开发的人员来说 一.flutter运行提示Running Gradle task ...

  3. C/C++ New与Delete (小例子)

    转自:http://blog.csdn.net/chenzujie/article/details/7011639   先来看两段小程序: 1). #include <iostream.h> ...

  4. 浅聊ARP

    今天借用思科公司的Cisco Packet Tracer Student这款软件浅聊ARP 什么是ARP? ARP即地址解析协议(Address Resolution Protocol),是根据Ip地 ...

  5. sql语句定义和执行顺序

    sql语句定义的顺序 (1) SELECT (2)DISTINCT<select_list> (3) FROM <left_table> (4) <join_type&g ...

  6. CF-1328 F. Make k Equal

    F. Make k Equal 题目链接 题意 长度为n的序列,每次可以选择一个最大的数字将其减一或者选择一个最小的数字将其加一,问最少操作多少次可以使得序列中至少存在 k 个一样的数字 分析 官方题 ...

  7. 2019牛客暑期多校训练营(第四场)A-meeting(树的直径)

    >传送门< 题意:n给城市有n-1条路相连,每两个城市之间的道路花费为1,有k个人在k个城市,问这k个人聚集在同一个城市的最小花费 思路:(官方给的题解写的挺好理解的) 考虑距离最远的两个 ...

  8. CF 1288 E. Messenger Simulator

    CF 1288 E. Messenger Simulator 题目传送门 官方题解 题意想必大家都明白了这里就不赘述了,这里只想重点记录一下几种实现方法 分析 设向前移动的序列为\(a\)序列 对于没 ...

  9. 2020 ICPC Asia Taipei-Hsinchu Regional Problem H Optimization for UltraNet (二分,最小生成树,dsu计数)

    题意:给你一张图,要你去边,使其成为一个边数为\(n-1\)的树,同时要求树的最小边权最大,如果最小边权最大的情况有多种,那么要求总边权最小.求生成树后的所有简单路径上的最小边权和. 题解:刚开始想写 ...

  10. Codeforces Round #498 (Div. 3) D. Two Strings Swaps (思维)

    题意:给你两个长度相同的字符串\(a\)和\(b\),你可以将相同位置上的\(a\)和\(b\)的字符交换,也可以将\(a\)或\(b\)中某个位置和对应的回文位置上的字符交换,这些操作是不统计的,你 ...