随着近几年大数据,云计算,机器学习,人工智能技术的发展以及在各种场景中的应用,本人根据平时工作中的实际需求针对数据中蕴藏的信息和规律进行了简单的探索.本人通过web服务器构建数据分析api,然后使用Pandas数据分析库来进行数据的分析,在前端页面使用echarts来将结果可视化.
本人根据网上公开的国家空气质量数据,开发了若干分析场景.连载几篇文章分别介绍这些场景以及具体代码实现细节.
分析场景二-空气质量日历热力图,最后结果如下图:
前端页面通过api 调用来从服务器获取数据:
http://localhost:8000/data/getDataByItem2Feature2Time?item=%E9%83%91%E5%B7%9E&feature=PM2DOT5&startDate=2017-01-01&endDate=2017-06-23&timeType=%25Y%25m%25d&statsType=Average
这里的查询参数有:item(城市名称),feature(因子名称),startDate(开始日期),endDate(结束日期),timeType(根据时间日期字段经格式字符串转化后的结果汇总数据),statsType(汇总函数)
利用pandas获取数据的代码和上文相同,使用的是同一段代码,由于数据也可以存于数据库中,这里展示一下当数据存在MongoDB中的查询和汇总代码:
def loadMongoDB(): global conn conn=pymongo.MongoClient() global dt_air dt_air=conn[\'air\'][\'national\'] def getStatsByCity2Time2Format2Factor_MongoDB(city,factor,startDate,endDate,timeFormat=\'%m\',statsType=\'Average\'): query=dt_air.find({\'type\':factor,\'city\':city}) if query.count()==0: return "{}" minDate_Mongo= query.sort([(\'date\',1)])[0][\'date\'] maxDate_Mongo=query.sort([(\'date\',-1)])[0][\'date\'] startDate=minDate_Mongo if pd.datetime.strptime(startDate,\'%Y-%m-%d\') <minDate_Mongo else pd.datetime.strptime(startDate,\'%Y-%m-%d\') endDate=maxDate_Mongo if pd.datetime.strptime(endDate,\'%Y-%m-%d\') >maxDate_Mongo else pd.datetime.strptime(endDate,\'%Y-%m-%d\') if startDate>maxDate_Mongo or endDate<minDate_Mongo: return "{}" print startDate print endDate query=dt_air.find({\'type\':factor,\'city\':city,\'date\':{\'$gte\':startDate,\'$lte\':endDate}}) dataFrame=pd.DataFrame(list(query)) df=dataFrame.set_index([\'date\']).sort_index(level=[\'date\']) groupedDF=df.groupby(lambda x:x.strftime(timeFormat)) result=groupedDF[\'value\'].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()
这里主要使用MongoDB中的查询,排序,pandas中DataFrame的建立索引,索引排序,索引查询,以及汇总聚合,以及时间字段转换,DataFrame连接等知识.