miaojiyao

  随着近几年大数据,云计算,机器学习,人工智能技术的发展以及在各种场景中的应用,本人根据平时工作中的实际需求针对数据中蕴藏的信息和规律进行了简单的探索.本人通过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连接等知识.

 

分类:

技术点:

相关文章:

  • 2022-01-25
  • 2022-12-23
  • 2021-10-31
  • 2021-10-28
  • 2022-01-18
  • 2022-01-01
猜你喜欢
  • 2022-12-23
  • 2021-09-26
  • 2021-12-05
  • 2021-06-21
  • 2021-12-02
  • 2021-12-13
  • 2021-12-06
相关资源
相似解决方案