数据整理决定了后期的业务处理效率和速度,而这里也是最容易踩坑的。如何把收集到的数据进行有效的整理,很多只是一行语句,可不知道很麻烦。为了节约时间,我将常用的一些技巧和语句整理如下,方便用的时候复制粘贴。
语句只是片段,仅作参考,正式使用需要根据需要修改哦。
# 将json格式字符串加载为json格式,方便转化为dataframe
kdata = json.loads(json_str)
#将列表转化为嵌套列表
df_kdata=[[i for i in ii.split(',') ] for ii in kdata['data']['trends']]
#将嵌套列表转化为df
df_data = pd.DataFrame(df_kdata, columns=['trade_time', 'open','close','high','low','volume','amount','avgline'])
# 将数值型的保留小数点2位
df_data.round(2)
# 检查列数据格式,有些时间是带时区的,如掘金datetime64[ns,UTC]
print(df.dtypes)
#nan替换为0,避免报错
df_data.fillna(0, inplace=True)
# 取当前时间作为一列
df_data['trade_time'] = str(datetime.now().strftime('%Y-%m-%d'))
# 去掉该列的时区,excel并不支持pandas带时区(timezones)的时间数据导出
df['date'] = df['date'].dt.tz_localize(None)
# 将trade_time设置为索引,inplace=False,表示该列不删除,为True则将其从数据里删除。
df_data.set_index(["trade_time"], inplace=False)
# 将某列设置为索引
df.index = df['trade_time']
# 将字符串时间改为日期时间格式
df.index = pd.DatetimeIndex(df.index)
# 重建索引,尤其是数据有重新计算的,有时候就是因为没有重建索引导致无法合并数据或是计算出错。
df = df.reset_index() # 直接将原索引清零,重新索引。
df = df.reindex(index=[0,2,5], columns=['A', 'C', 'B']) # 取index指定值,按colmuns列进行索引
# 索引降序
df = df.sort_index(ascending=False) # True为升序
# 多字段排序
df.sort_values(['name','score'], ascending = [True,False])
# 按列(在索引方向上排序)索引名排序:
df = df.sort_index(axis=1, ascending=False)
# 删除列
df.drop(['bob','eob'],axis=1,inplace=True)
# 获取分组里最大值所在的行方法
# 分为分组中有重复值和无重复值两种。无重复值的情况。
df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'Count':[3,2,5,10,10,6]})
df.iloc[df.groupby(['Mt']).apply(lambda x: x['Count'].idxmax())]
#先按Mt列进行分组,然后对分组之后的数据框使用idxmax函数取出Count最大值所在的列,再用iloc位置索引将行取出。有重复值的情况
df["rank"] = df.groupby("ID")["score"].rank(method="min", ascending=False).astype(np.int64)
df[df["rank"] == 1][["ID", "class"]]
#对ID进行分组之后再对分数应用rank函数,分数相同的情况会赋予相同的排名,然后取出排名为1的数据。
# 选择特定类型的列
drinks = pd.read_csv('data/drinks.csv')
# 选择所有数值型的列
drinks.select_dtypes(include=['number']).head()
# 选择所有字符型的列
drinks.select_dtypes(include=['object']).head()
drinks.select_dtypes(include=['number','object','category','datetime']).head()
# 用 exclude 关键字排除指定的数据类型
drinks.select_dtypes(exclude=['number']).head()
#导出execl
df.to_excel(r’filename.xlsx’)
# 剔除交易量为0的股票,可以有效避免停牌、摘牌股票。
df = df[df['volume']>0]
# 筛选列不是-的,因为有些数据展示出来就是-,表示无数据。
df_data = df_data[(df_data['f2'] != '-')]
# 将采集数据里的-,替换为0,因为-无法计算。
df_data = df_data.replace('-', 0)
# df_data['f9'] = df_data['f9'].replace({'-':'0'},regex=True)#如果存在“-”则替换为0%
# 修改数据格式为浮点型
df_data['f9'] = round(df_data['f9'].astype('float64'),2)
# 批量修改数据格式
df = df.astype({'列1':'float','列2':'float'})
# 把任意无效输入转为 NaN
df = df.apply(pd.to_numeric, errors='coerce').fillna(0)
# 将使用某列替换,或则没有次列,新增一列
df_data['close'] = df_data['new_p']
# 修改列名,可以分别设置cols中文一套,英文一套。方便切换。
cols = {'f2':'close','f3':'zhangfu','f4':'zhangdie','f5':'volume','f6':'amount','f7':'zhenfu','f8':'hs_l','f9':'pe_d','f10':'liangbi','f12':'code','f14':'name','f15':'high','f16':'low','f17':'open','f18':'pre_close','f20':'z_value','f21':'lt_value','f23':'sj_l'}
# 中文名称
cols_c = {'f2':'收盘价','f3':'涨幅','f4':'涨跌','f5':'交易量','f6':'交易额','f7':'振幅','f8':'换手率','f9':'pe(动态)','f10':'量比','f12':'code','f14':'name','f15':'最高','f16':'最低','f17':'开盘','f18':'昨收','f20':'总市值','f21':'流通市值','f23':'市净率'}
# 设置列的展示顺序
cols_sequence_list = ['f12','f14','f2','f15','f16','f17','f3','f4','f5','f6','f7','f8','f9','f10','f18','f20','f21','f23']
# 根据以上设置修改dataframe
df = df[cols_sequence_list].rename(index=str, columns=cols)
# name列包含字符
not_contain=['ST|PT|退']
contain=['']
code_prefix = ['']
if len(not_contain[0])>0:
df_code = df_code[~ df_code['name'].str.contains('|'.join(str(v) for v in not_contain))]
# name列不包含字符
if len(contain[0])>0:
df_code = df_code[df_code['name'].str.contains('|'.join(str(v) for v in contain))]
# code列以什么开头
if len(code_prefix[0])>0:
df_code = df_code[df_code['code'].str.startswith('|'.join(str(v) for v in tuple(code_prefix)))]
# 只提取指定列
cols = ['symbol','code','name']
df_code = df_code[cols]
# df_data.set_index("trade_time", inplace=True)
# df_data.index = pd.Timestamp(df_data.index)
# 将列转化为数值
df_data = df_data.apply(pd.to_numeric, errors='ignore')
# 修改列值,方便计算和验证
XY['ZIGZAG_BUYSELL'] = XY['ZIGZAG_BUYSELL'].map({'buy':1,'sell':-1,np.nan:0},na_action=None)
df_table(XY.tail(10),'XY')
# 清洗数据固定操作
X = XY.dropna(how='any', axis='rows') # 去掉空值
y = X.pop('ZIGZAG_BUYSELL') # 标签把原来XY中'y'列去掉,赋值给y
后续还将不断补充,这个用起来就方便了后续的数据操作。
突然想到ChatGPT,这个家伙不正是我们梦寐以求,可以解决编程和数据加工的好帮手么?
只是,有了它,编程以后还有乐趣么?