【Python小知识】python 、pandas、numpy数据整理加工小技巧(避坑指南)

python 、pandas、numpy数据整理加工小技巧

  • 前言
  • 常用数据处理语句
    • 1. 采集数据整理
    • 2. Pandas数据整理
    • 3. 数据导出
    • 4. 行情加工
    • 5. AI智能运算
  • 总结


前言

数据整理决定了后期的业务处理效率和速度,而这里也是最容易踩坑的。如何把收集到的数据进行有效的整理,很多只是一行语句,可不知道很麻烦。为了节约时间,我将常用的一些技巧和语句整理如下,方便用的时候复制粘贴。

语句只是片段,仅作参考,正式使用需要根据需要修改哦。

常用数据处理语句

1. 采集数据整理

# 将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)

2. Pandas数据整理

# 检查列数据格式,有些时间是带时区的,如掘金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()

3. 数据导出

#导出execl
df.to_excel(r’filename.xlsx’)

4. 行情加工

# 剔除交易量为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')

5. AI智能运算

    # 修改列值,方便计算和验证
    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,这个家伙不正是我们梦寐以求,可以解决编程和数据加工的好帮手么?

只是,有了它,编程以后还有乐趣么?

你可能感兴趣的:(Python经验池,python,pandas,numpy)