preface:最近在整内比赛MDD。遇到一些数据处理方面的事情,用python pandas是最为方便的,远比我想象的强大。几行代码就完成了数据的处理,多个文件的融合,再用sklearn里面的模型跑一跑,就能得到结果。为此,经常记录下来,对数据处理的应用。

一、Pandas合集

  1. df = pd.read_csv('%s/%s' % (input_path, file_name)):read_csv()读入文件函数,文件以tab隔开则read_csv(fileName, sep="\t")。分两个变量:input_path和file_name传入更佳。
  2. poiLngNotNull = pd.notnull(df["poi_lng"]):notnull()筛选函数。数据预处理:取列名为poi_lng不为空的行。
  3. df.loc[poiLngNotNull, 'poi_lng']:loc()函数。定位到poiLngNotNull行,'poi_lng'列
  4. df.loc[poiLngNotNull, 'geohash'] = map(geo_hash, df.loc[poiLngNotNull,poi_lat], df.loc[poiLngNotNull, poi_lng]):loc()、map()、geo_hash()(见下面)函数的结合
  1. 取出经纬度,应用geo_hash函数,产生一个geohash,写到df新的列中
  2. 结果:df增加了一列,列名为geohash,其中每行的数据为每行对应的poilat、poilng通过python的geohash映射的值
  1. pd.get_dummies(df):将df中非数字类型的进行one-hot编码。参考: pandas使用get_dummies进行one-hot编码(题外PS:使用xgboost训练不好,One-hot编码适合LR、SVM之类的)
  2. 数据操作
  1. 读入数据
  1. df = pd.read_csv("fileName")
  2. df.columns = list('abcd')(读取无列名的时候,可用数组赋值)
  1. 打印数据
  1.  pandas.set_option('display.max_rows',None):
  1. 取数据loc
  1. 参考:python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix
  2. 取出某列数据:df["columns_name"]、df.loc[:, "columns_name"](第一个参数表示所有行,第二个参数表示某列)
  3. 取出某些列数据:df[["columns_name1", "columns_name2"]]、df.loc[:,["columns_name1", "columns_name2"]]
  4. 取出第N行数据:df.loc[N, :]
  5. 取出第2-N、第N+2到M行的数据:df.loc[[2:N, N+2LM], :]
  6. 取出第2-N行、某两列的数据:df.loc[2:N, ["columns_name1", "columns_name2"]]
  1. iloc:若已知道columns_name是具体哪一列,可直接用数值代替。
  2. data.irow(0)
  3. data.icol(0)
  4. data.head()、data.head(10)
  5. data.tail()、data.tail(10)
  6. data.iat[1, 1]
  1. 聚合
  1. df = df.groupby(['date', 'hour', 'area_id']).agg({'temperature': 'mean', 'wind': 'mean', 'rain': 'mean'}).reset_index()
  1. 根据天、时、区域id进行聚合,统计温度、风、雨量的平均值,然后用reset_index()重置

二、小函数

经纬度的计算

  • 计算两个经纬度之间的距离
  • 参考:
from math import radians, cos, sin, asin, sqrt  
  
def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)  
    """ 
    Calculate the great circle distance between two points  
    on the earth (specified in decimal degrees) 
    """  
    # 将十进制度数转化为弧度  
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])  
  
    # haversine公式  
    dlon = lon2 - lon1   
    dlat = lat2 - lat1   
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2  
    c = 2 * asin(sqrt(a))   
    r = 6371 # 地球平均半径,单位为公里  
    return c * r * 1000

geohash

import Geohash

input_path = '../data'
def geo_hash(lat, lng):
    if str(lat) == 'NaN' or str(lat) == 'nan' \
            or str(lat) == '' or str(lng) == '' \
            or str(lng) == 'nan' or str(lng) == 'NaN'\
            or float(lat) <= 0 or float(lng) <= 0:
        return 'aaaaa'
    if float(lat) > 60.0 > float(lng):
        tmp = lat
        lat = lng
        lng = tmp
    # print Geohash.encode(float(lat), float(lng), 5)

log_unix_time时间转化

  • 参考:
import sys
import time

def timeStamp_datatime(value):
    format = '%Y-%m-%d %H:%M:%S'
    #format = '%H'
    value = time.localtime(value)

    dt = time.strftime(format, value)
    return dt

if __name__=="__main__":
    if len(sys.argv)<2:
        print "再输入一个unix_tim参数:"
    value = sys.argv[1]
    print  timeStamp_datatime(float(value))

多级排序

  • 参考:
import sys, csv , operator  
data = csv.reader(open('C:\test.csv'),delimiter=',')  
sortedlist = sorted(data, key = lambda x: (x[0], int(x[1])))  
  
with open("C:\result_test.csv", "wb") as f:  
    fileWriter = csv.writer(f, delimiter=',')  
    for row in sortedlist:  
        fileWriter.writerow(row)  
f.close()

三、时间处理合集

  1. datatime
  1. 参考:python datetime处理时间
  2. 实现日期的加减:from datetime import timedelta.
  3. 时间戳转化:from datetime import *; date.fromtimestamp()
  4. string datetime互转
  1. str = '2012-11-19';date_time = datetime.datetime.strptime(str,'%Y-%m-%d')
  2. date_time.strftime('%Y-%m-%d');