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


前言

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

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

常用数据处理语句

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()

# 是否包含某列
if 'BOLL_MID' in kdata.columns:

# 将列名改为首字母大写
df.columns = [col.capitalize() for col in df.columns]

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 = df_data.copy()[(df_data['volume']>0) & (df_data['zhangfu']>15)]

# 批量重命名,适应df.copy()复制一个,避免与原数据冲突
columns = {'close':'最新价','zhangfu':'涨幅','zhangdie':'涨跌','volume':'成交量','amount':'成交额','zhenfu':'振幅','hs_l':'换手率','pe_d':'动态PE','liangbi':'量比','code':'代码','name':'名称','high':'最高价','low':'最低价','open':'开盘价','pre_close':'昨收','z_value':'总市值','lt_value':'流通市值','sj_l':'换手率'}
df = df.copy().rename(index=str, columns=columns)

# 提取指定列
cols = ['代码','名称','最新价']
df = df[cols]

# 将使用某列替换,或则没有次列,新增一列
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')

# 计算顾比均线指标
short_window = [3, 5, 8, 10, 12, 15]
long_window = [30, 35, 40, 45, 50, 60]

for window in short_window:
    df[f'SMA_{window}'] = talib.EMA(df['Close'], timeperiod=window)

for window in long_window:
    df[f'SMA_{window}'] = talib.EMA(df['Close'], timeperiod=window)
# 获取短期、长期均线组
for i in range(len(data)):
    short_term = [data[f'SMA_{window}'].iloc[i] for window in short_window]
    long_term = [data[f'SMA_{window}'].iloc[i] for window in long_window]

5. 判断

1、判断dataframe是否为空
如果df为空,则 df.empty 返回 True,反之 返回False。

if df.empty:

2、判断list是否为空

 if len(all)=0 为空,否则为非空

3、判断dict是否为空

 if dict: # dict为空的,值未False

6. 遍历

1、遍历list

for i in list:
	print(i)

2、遍历dict

for code, values in hd_dict.items():
	print(code,values)

7. 分拆

  1. 将字典拆分为key和value两个列表
    初始化字典
_dict = {'a' : '啊啊啊啊啊', 'b' : '帮帮芭比吧', 'c': '常常常常出差'}

将字典拆分为键和值的列表

keys = _dict.keys()
values =_dict.values()
  1. 将dict按某个条件分拆成2个dict
hd_dict_y = {code: values for code, values in hd_dict.items() if int(values['证券余额']) > 0}
print('hd_dict_y',hd_dict_y)
hd_dict_n = {code: values for code, values in hd_dict.items() if int(values['证券余额']) == 0}
print('hd_dict_n',hd_dict_n)

7. 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,这个家伙不正是我们梦寐以求,可以解决编程和数据加工的好帮手么?

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python有许多用于数据整理的库和工具。以下是一些常用的方法: 1. 使用Pandas库:Pandas是一个强大的数据处理和分析库,提供了各种灵活的功能来处理和整理数据。你可以使用Pandas来读取、过滤、转换和合并数据。可以使用`DataFrame`对象来表示和操作数据。 2. 使用NumPy库:NumPyPython的一个科学计算库,它提供了高效的多维数组对象和广播功能,可以用于处理和转换数据NumPy数组可以方便地进行向量化操作。 3. 使用正则表达式:正则表达式是一种强大的模式匹配工具,可以帮助你从文本中提取所需的数据Python的re模块提供了正则表达式的功能,可以用于搜索、替换和分割文本。 4. 使用字符串操作:Python提供了丰富的字符串操作方法,比如切片、拼接、替换和分割等,这些方法可以帮助你对字符串数据进行整理。 5. 使用列表推导式或生成器表达式:列表推导式和生成器表达式是Python中快速生成新列表或生成器的方法,可以在数据整理过程中使用它们来过滤、转换或组合数据。 6. 使用字典和集合:字典和集合是Python中的两个重要的数据结构,可以用于存储和整理数据。你可以使用它们来进行数据的唯一性检查、数据的分组和聚合等操作。 以上是一些常用的方法,当然还有其他许多方法和工具可以用于数据整理,具体选择取决于你的需求和数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT里的交易员

分享是一种快乐,打赏是一种肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值