1.Python数据处理和分析常用语句数据分析的一般步骤包括数据获取、数据整理、数据描述、数据分析1.1数据获取1.1.1数据获取方式1.1.2查看数据属性Data.shape查看数据多少行、多少列Data.columns查看数据列Data.dtypes查看各数据字段的属性1.2数据整理#第二步:做一些数据的基本处理:1.2.1数据基本处理(类excel)#0.数据类型的转换例如:如果要做时间序列分析,首先要将交易日期从通用对象(object)转换为日期对象(datetime)df['date']=pd.to_datetime(df['date'])#1.如何获取导入的数据有几行几列?直接用df.shape,返回一个维度(几行,几列)的元组;df.columns.size#获取列数df.iloc[:,0].size#获取行数#2.如何查看指定行、列、子集?#df=pandas.read_excel('1.xls',sheetname='店铺分析日报')df=df.loc[:,['股票代码','股票名称','营业总收入']]#访问指定的列#df=df['股票代码']#查看指定列#DataFrame.ix['index_name']#查看指定行#dataframe[m:n]#选择多行#dataframe[dataframe['col3'5]]#条件筛选#dataframe.ix[0:3,0:5]#选择子集#3.如何添加新的列例1:添加一个总和栏来显示Jan、Feb和Mar三个月的销售总额df['total']=df['Jan']+df['Feb']+df['Mar']例2:把计算结果添加为一个新的列df['P/E']=df.收盘价/df.基本每股收益#新的列名,后面是对应的数值例3:在excel表最后加一行求各列和sum_row=df[['Jan','Feb','Mar','total']].sum()#4.如何删除行列#df_delete=df.drop(['result'],axis=1)#删除列#DataFrame.drop(['index1','index2'...])#删除行#5.如何对数据进行排序?df['P/E'].size#获取‘P/E’这列共有多少行newdf=df_delete.sort('P/E')#默认升序排列sort_index也可以进行排序#6.如何对数据进行筛选?#1.筛选出predictaqi_norm1这一列大于100的行;aqicsv[aqicsv[predictaqi_norm1]100]也可以写为:data[data.收盘价100]#2.使用&(并)与|(或)实现多条件筛选aqicsv[(aqicsv[FID]37898)&(aqicsv[FID]38766)]aqicsv[(aqicsv.predictaqi_norm1150)|(aqicsv.predictaqi_norm1100)]#3.筛选后取另外两列数据如果只需要其中两列数据,而同时利用另外两列进行筛选时可以这样.如果只需要其中的某几列可以写为aqicsv[['FID','x','y']]aqicsv[['x','y']][(aqicsv.FID10000)|(aqicsv.predictaqi_norm1150)]#4.isin()用法:筛选某一列数据符合等于规定值(它使得我们可以定义一个列表,里面包含我们所希望查找的值);data7=data[data['股票代码'].isin(['sh600141','sh600754','sh603017','sh603198'])]#同样,以上这个语句可以用query()函数来查询,需要安装numexpr;data8=data.query('股票代码==['sh600141','sh600754','sh603017','sh603198']')#map()函数也有这个功能,样式如下:df[df[sku].map(lambdax:x.startswith('B1'))&(df[quantity]>22)].head()#5.字符串方法:筛选某一列内容包含特定值例如找出MA金叉死叉列所有含金叉的行,但列不能含空值data8=data7[data7['MA金叉死叉'].str.contains('金叉')]#6.如果列中存在空值,空值处理方法:#6.1用fillna()方法将空值填充data7=data.fillna(value='你好')#6.2或者将列中的空值删除;stock_data=stock_data[stock_data['市盈率TTM'].notnull()]#或6.2用dropna删除缺失值stock_data.dropna(subset=['下个月涨跌幅'],inplace=True)#7.pandas能够理解日期,在对日期数据筛选方面可以对某年、某月进行筛选;data[data['交易日期']='2014-03']data[data['交易日期']='2015']data[(data['交易日期']='20140701')&(data['交易日期']='20140715')].head()#8.对时间序列数据,设置交易日期为新的索引df2=data.set_index(['交易日期'])#通过切分来获得一段区间df2[20140101:20140201]df2['2014']df2['2014-Dec']#9.用unique()函数来获取一个不含重复项的小列表df[name].unique()#如果这个小列表同时要包含其他列信息,可以用drop_duplicates()函数df.drop_duplicates(subset=[accountnumber,name]).head()#7.数据转置df_sum=pd.DataFrame(data=sum_row).T#8.简单的统计与筛选1.2.2将分割数据读取到一张DataFrame#第五步:数据跟文件夹的交互——读取、保存#1.用for循环和append函数将文件夹中不同表格的数据经过筛选后加载到同一张表格importpandasaspdimportosstock_code_list=[]forroot,dirs,filesinos.walk('overview-data-sh/'):iffiles:forfinfiles:if'sh6'inf:stock_code_list.append(f.split('.csv')[0])all_stock_sh=pd.DataFrame()forcodeinstock_code_list:stock_data=pd.read_csv('overview-data-sh/'+code+'.csv',encoding='gbk')stock_data=stock_data[['交易日期','股票代码','股票名称','涨跌幅','成交额','换手率','流通市值','市盈率TTM','市销率TTM','市现率TTM','市净率','MA_5','MA_10','MA_20','MA_30','MA_60','MA金叉死叉','MACD_金叉死叉','KDJ_金叉死叉','收盘价','开盘价']]stock_data['交易日期']=pd.to_datetime(stock_data['交易日期'])stock_data=stock_data[stock_data['交易日期']=='2016/9/30']all_stock_sh=all_stock_sh.append(stock_data,ignore_index=True)all_stock_sh.shape#2.用pd.concat将不同文件夹中数据加载到一个DateFrame#3.数据保存all_stock_sh.to_csv('全部股票当天市场数据20160930sh.csv',encoding='gbk')1.3数据描述1.3.1绘图与可视化%pylabimportmatplotlib.pyplotaspltimportnumpyasnpimportpandasaspddata=pd.read_csv('sh600000.csv',encoding='gbk')data1=data['收盘价']data2=data['交易日期']#在一张figure里面画多张图fig=plt.figure()ax1=fig.add_subplot(221)ax1.plot(data1,'g')#设置X轴,Y轴,标题ax1.set_xlabel('Time')ax1.set_ylabel('Price')ax1.set_title('myfirstmatplotlibplot')ax1.set_xlim([data['交易日期']])#时间序列趋势图-设置label如果要在同一个图中显示多个label,可以用plt.legend()函数代码:%pylabimportmatplotlib.pyplotaspltimportpandasaspddata=pd.read_csv('overview-data-sh/sh600005.csv',encoding='gbk')data.交易日期=pd.to_datetime(data.交易日期)data1=data.set_index('交易日期')['收盘价'].ix['2009']data2=data.set_index('交易日期')['开盘价'].ix['2009']plt.title('Trend')plt.xlabel('Time')plt.ylabel('Price')plt.plot(data1,'k',label='1')plt.plot(data2,'g',label='2')plt.legend()#用legend()函数可以在一张图里显示多个labelplt.show()#饼图plt.subplot(233)x=[1,2,3,4,5]y=[2.3,3.4,1.2,6.6,7.0]scatter(x,y)#保存savefig(demo.png)例子:绘制股价的时间序列图Pandas最基本的时间序列类型是以时间戳(Datatimeindex,Periodindex)为索引的Series。Set_index()方法将时间列(column)设置为indexdata=data.set_index(['Unnamed:0'])data.index.name='time'将index转为datatimeindexdata.index=pd.to_datetime(data.index)data=data.resample('B',fill_method='ffill')代码:#利用Python绘制时间序列图%pylabimportmatplotlib.pyplotaspltimportnumpyasnpimportpandasaspddata=pd.read_csv('sh600000.csv',encoding='gbk')data=data[['收盘价','交易日期']]data=data.set_index(['交易日期'])data.index=pd.to_datetime(data.index)data=data.resample('M',fill_method='ffill')fig=plt.figure()ax1=fig.add_subplot(211)ax1.plot(data,'g')ax1.set_xlable('Time')ax1.set_ylable('Price')ax1.set_title('myfirstmatplotlibplot')1.4数据分析1.4.1数据聚合与分组运算#1.groupby技术frompandasimportDataFrame,Seriesimportnumpyasnpdf=DataFr