写再最前面
最近再实现我的RFTrader量化工具的时候,使用pandas.DataFrame的类来封装我的标的数据,在使用的过程中有许多不清晰的地方,我在这里做一个整理,希望在我之后的编程过程中,如果有不熟悉的地方,可以考虑翻过头来看看,到底是什么问题,并且总结一下,看看还存在哪些问题,方便之后在编程过程中,少犯错误。
Intro to DataFrames
这里的内容源自于https://www.youtube.com/watch?v=e60ItwlZTKM,这个视频中,详细讲解了12个实用的pandas.DataFrame案例,我看完之后觉得之前很多的问题都明确了,并且有所收获,这里记录一下。
pandas与NumPy的关系
pandas是基于NumPy实现的,所有pandas库会引用NumPy的包。
![pandas与NumPy的关系](/2023/01/17/pandasdataframe-shi-yong-jian-jie/5336a731f4bdc63724e989c073aa7b4a6b2f45022856160dd901a2ee272e00b0.png)
pandas与NumPy的区别
![pandas与NumPy的区别](/2023/01/17/pandasdataframe-shi-yong-jian-jie/08f07d2ac12fa5d5e3db3a2b79062511f8d0ea6d2c992b86094e9c23fa367aa2.png)
pandas的官方链接
pandas cheatsheet链接
https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf
从csv文件中读取数据并打包为DataFrame对象
file_name = "Data.txt"
df.pd.read_csv(file_name)
获取前几个数据、后几个数据
df.head() # 获取前5个数据
df.tail(3) # 获取后3个数据
获取DataFrame的数据类型信息、索引信息、列名信息、值信息
print(df.dtypes)
print(df.index)
print(df.columns)
print(df.values) # 一般不会这样获取DataFrame的值
获取数据的统计信息
df.describe() # 会返回均值、标准差、最小值、最大值等统计信息,很有用
排序
df.sort_values('record_high',ascending=False) # 对列名为record_high的数据进行降序排序
对数据进行裁剪
df.avg_low # 返回列名为avg_low的数据
df['avg_low'] # 返回列名为avg_low的数据,同上
df[2:4] # 返回第3行和第4行数据
df[['avg_low','avg_high']] # 返回列名为'avg_low','avg_high'的两列数据
df.loc[:,['avg_low','avg_high']] # 返回列名为'avg_low','avg_high'的两列数据,同上
df.loc[9,['avg_precipitation']] # 返回列名为'avg_precipitation'以及第10行的数据
df.iloc[3:5,[0,3]] # 返回第4行和第5行数据,返回第0行~第2行数据 loc. by index
对数据进行过滤筛选(filtering)
df[df.avg_low > 1.0] # 返回df中avg_low中比1大的数据
df[df['month'].isin(['Jun','Jul','Aug'])] # 返回列month中数据为'Jun','Jul','Aug'的数据
对DataFrame中的数据进行赋值操作(Assignment)
df.loc[9,['avg_precipitation']] = 101.3 # 将列名为'avg_precipitation',第10行的单元格赋值为101.3
df.loc[9,['avg_precipitation']] = np.nan # 将列名为'avg_precipitation',第10行的单元格赋值为nan(Not A Number)
df.loc[:,'avg_low'] = np.array([5]*len(df)) # 将列名为'avg_low'下的所有数据赋值为5
df['avg_day'] = (df.avg_low+df.avg_high)/2 # 新增列,列名为'avg_day',其值为avg_high列与avg_low的均值
对列进行重命名
df.rename(columns = {'avg_precipitation':'avg_rain'}, inplace=True) # 将原名为'avg_precipitation'新命名为'avg_rain',并且在原df中生效更改
df = df.rename(columns = {'avg_precipitation':'avg_rain'}) # 功能同上,inplace=True相当于df = df.rename()
将数据写入csv文件
df.to_csv('Data.csv')