随着近几年大数据,云计算,机器学习,人工智能技术的发展以及在各种场景中的应用,本人根据平时工作中的实际需求针对数据中蕴藏的信息和规律进行了简单的探索.本人通过web服务器构建数据分析api,然后使用Pandas数据分析库来进行数据的分析,在前端页面使用echarts来将结果可视化.
本人根据网上公开的国家空气质量数据,开发了若干分析场景.连载几篇文章分别介绍这些场景以及具体代码实现细节.
分析场景一-空气质量监测因子历史曲线站点比较和因子比较,最后结果如下图:
从网站上下载的数据解压缩后是文件名为日期的csv文件,其中每个文件内容为这天各个时辰全国各个城市各个空气质量因子的监测值:
关于Pandas的学习请自己查阅学习.这里的代码假设大家已经掌握了Pandas的初步知识:
首先将表格中的数据加载到一个DataFrame中,代码如下:
def loadData(): global citysDF global df global maxDate_CSV global minDate_CSV cityLatLngFilePath=u\'F:\BaiduNetdiskDownload\全国空气质量\站点列表(含经纬度)-新-1497个.csv\' df=pd.read_csv(cityLatLngFilePath) print df citysDF=df.groupby(\'城市\').mean().reset_index().rename(columns={"城市":\'city\', \'经度\': "longitude",\'纬度\': "latitude"}) print citysDF baseDirs=[u\'F:\BaiduNetdiskDownload\全国空气质量\城市_20140513-20141231\城市_20140513-20141231\',u\'F:\BaiduNetdiskDownload\全国空气质量\城市_20150101-20151231\城市_20150101-20151231\', u\'F:\BaiduNetdiskDownload\全国空气质量\城市_20160101-20161231\城市_20160101-20161231\',u\'F:\BaiduNetdiskDownload\全国空气质量\城市_20170101-20171118\城市_20170101-20171118\'] baseDirs=baseDirs[-1:] datas=[] for baseDir in baseDirs: filePaths=os.listdir(baseDir) for filePath in filePaths[-4:]: filePath=os.path.join(baseDir,filePath) if os.path.splitext(filePath)[1]==".csv": print filePath data=pd.read_csv(filePath) if np.any(data.columns==\'date\',axis=0): data[\'date\']=pd.to_datetime(data[\'date\'].astype(\'S8\')+data[\'hour\'].astype(\'S8\'), format=\'%Y%m%d%H\') del data[\'hour\'] datas.append(data) dataFrame=pd.concat(datas) #dataFrame[\'date\']=pd.to_datetime(dataFrame[\'date\'].astype(\'S8\')+dataFrame[\'hour\'].astype(\'S8\'), format=\'%Y%m%d%H\') df=dataFrame.set_index([\'date\']).sort_index(level=[\'date\']) maxDate_CSV=df.index.get_level_values(\'date\').max() minDate_CSV=df.index.get_level_values(\'date\').min()
前端页面通过api 调用来从服务器获取数据:
http://localhost:8000/data/getDataByItem2Feature2Time?item=%E9%83%91%E5%B7%9E&feature=PM2DOT5&startDate=2017-11-01&endDate=2017-12-21&timeType=%25Y%25m%25d%25H&statsType=Average
这里的查询参数有:item(城市名称),feature(因子名称),startDate(开始日期),endDate(结束日期),timeType(根据时间日期字段经格式字符串转化后的结果汇总数据),statsType(汇总函数)
利用pandas获取数据的代码如下:
def getStatsByCity2Time2Format2Factor_CSV(city,factor,startDate,endDate,timeFormat=\'%Y%m\',statsType=\'Average\'): startDate=minDate_CSV.strftime(\'%Y-%m-%d\') if pd.datetime.strptime(startDate,\'%Y-%m-%d\')<minDate_CSV else startDate endDate=maxDate_CSV.strftime(\'%Y-%m-%d\') if pd.datetime.strptime(endDate,\'%Y-%m-%d\')>maxDate_CSV else endDate if pd.datetime.strptime(startDate,\'%Y-%m-%d\')>maxDate_CSV or pd.datetime.strptime(endDate,\'%Y-%m-%d\')<minDate_CSV: return "{}" print startDate print endDate dataFrame=df.loc[startDate:endDate] groupedDF=dataFrame[dataFrame[\'type\']==factor].groupby(lambda x:x.strftime(timeFormat)) result=groupedDF[city].agg({\'Total\':np.sum,\'Average\':np.mean,\'StandardDeviation\':np.std,\'SquareDeviation\':np.var,\'Max\':np.max,\'Min\':np.min,\'Median\':np.median}) return result[statsType].to_json()
这里主要使用pandas中DataFrame的建立索引,索引排序,索引查询,以及汇总聚合,以及时间字段转换,DataFrame连接等知识.