工作中常用到的python数据处理

1.获取工作目录和设置工作目录

import os
# 查看目录下的文件
print(os.listdir(PATH) l
# 查看当前工作目录
retval = os.getcwd()
print ("当前工作目录为 %s" % retval)
# 修改当前工作目录
os.chdir( path )
# 查看修改后的工作目录
retval = os.getcwd()

2.获取日期处理

#获取毫秒级别的时间
from  datetime  import  *   
dt = datetime.now()
dt.strftime('%Y-%m-%d-%H-%M-%S.%f') 


import time,datetime
#字符串转化为时间类型
end_date = datetime.datetime.strptime('2018-07-01', '%Y-%m-%d')

# 获取当前时间
today = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  #方法一

from datetime import datetime, date, timedelta
# 今天
today = (datetime.today()).strftime('%Y%m%d') #方法2
print(today);
# 明天
data_next= (datetime.today() + timedelta(1)).strftime('%Y%m%d');
print(data_next);
# 30天后
data_30= (datetime.today() + timedelta(30)).strftime('%Y%m%d');
print(data_30);

train_periods = pd.read_csv('../input/periods_train.csv', parse_dates=['date_from', 'date_to'])
# 两个日期差多少天
all_periods['days_up'] = all_periods['date_to'].dt.dayofyear - all_periods['date_from'].dt.dayofyear

3.列表的倒排序

List= [1,2,3,4,5,6]
List[::-1] 

4.使用apply处理 两个值的代码

import numpy as  np
import pandas as pd
df = pd.DataFrame ({
        'a' : np.random.randn(6),
        'b' : ['foo', 'bar'] * 3,
        'c' : np.random.randn(6)}
        )
print(df)
def my_test(a, b):
    return a + b
df['Value'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1)
print (df)
如何判断True or False    np.NaN 默认为False
if  valus:
    print('yes')
else:
    print('no')

5.断言函数 assert

x = 23
assert x < 0
assert x%2== 0

6.yield生成器

 def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b 

7.获取程序运行时间 

import time
from datetime import timedelta

def get_time_dif(start_time):
    """获取已使用时间"""
    end_time = time.time()
    time_dif = end_time - start_time
    return timedelta(seconds=int(round(time_dif)))

start_time = time.time()
main() # 运行程序
time_dif = get_time_dif(start_time)
print("Time usage:", time_dif)

# 时间的形式:Time usage: 0:09:35

8.动态生成变量

也可以用字典来代替变量

names = locals()
for i in range(1, 5):
    names['x%s' % i] = i
    if i ==1:
        X_end  = names['x%s' % i]
    else:
        X_end  = X_end + names['x%s' % (i)]

9.数据可持续化操作

import pickle
def main():
    hjp_list = [123, 456, 789, 'test']
    with open('hjp_list.pkl', 'wb') as pickle_file: # 导入本地
        pickle.dump(hjp_list, pickle_file)
    with open('hjp_list.pkl', 'rb') as pickle_file: # 加载本地数据
        my_new_list = pickle.load(pickle_file)
        print(my_new_list)
if __name__ == '__main__':
    main()

10.数据运行时间2

#建模固定模块
import gc
from contextlib import contextmanager
import time
@contextmanager
def timer(title):
    t0 = time.time()
    yield
    print("{}:使用时间为{:.0f}s".format(title, time.time() - t0))

#用法:
with timer("导入数据"):
   main()  '''这样就可以看到这段代码运行的时'''

11.创建目录

if not os.path.exists('gen_data'):
    os.mkdir('gen_data')

12.删除无用的数据

# 删除缺失率超过90%的列
good_cols = list(train.columns)
for col in train.columns:
    rate = train[col].value_counts(normalize=True, dropna=False).values[0]
    if rate > 0.9:
        print(col)

13.字符串格式化

name = 'hjp';name1 = 'python'
# 三种方式 推荐第三种
text1 = 'hello %s' %(name )
text2 = 'hello {}'.format(name )
text2 = 'hello {0},{1}'.format(name,name1  )
text3 = f'hello {name}'

14.zip自动生成字典

x=['bob','tom','kitty']
y=[80,90,95]
d=dict(zip(x,y))
print(d)

15.各种包的离线下载地址

各种包的下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/  在谷歌浏览器中下载

16.路径的设置

root_dir = 'data/cnews'

path_dir = os.path.join(base_dir, 'train.csv')

17.数据添加ignore_index的使用技巧

data=pd.concat([train, test], ignore_index=True)
res = res.append(count, ignore_index=True)

18.删除nan的总结

#删除NaN值得汇总

df.dropna()
df.dropna(axis='columns')
df.dropna(how='all')
df.dropna(thresh=2)
df.dropna(subset=['name', 'born'])
df.dropna(inplace=True)

 19.批量重命名

#字段名称重命名
print('Compute average')
avg_cc_bal = cc_bal.groupby('SK_ID_CURR').mean()
avg_cc_bal.columns = ['cc_bal_' + f_ for f_ in avg_cc_bal.columns]

20.nohup的使用

1.例子:
nohup python test.py &
2.查看守护进程
ps -ef | grep python
3.kill进程
kill -s 9 xxxxx

 21.reset_index的使用

reset_index(drop=True)

22.列表推导式的高级用法

list_sample1 =[['我','喜欢','你'],['我','爱','你'],['我','疼着','你']]
flattened1 =[x for tup in list_sample1 for x in tup]

flist = [[x for x in tup] for tup in list_sample1 ]

23 linux 和window 系统路径编辑统一问题

import os
os.path.join('xxxx','xxxx','xxxx')

24.map和filter的用法

seq =[1,2,3,4,5]
result =list(map(lambda var:var*2,seq))
print(result)

seq =[1,2,3,4,5]
result =list(filter(lambda var:var>2,seq))
print(result)

25.刷LeetCode用到的操作

nums.pop(nums[i])

max(nums)

nums.count(nums[i])

26.if else的高级用法

#普通用法
a, b, c = 1, 2, 3
if a>b:
    c = a
else:
    c = b
#高级用法
c = a if a>b else b

27字典的高级用法  python字典的常见增删改查操作_liucy113的博客-CSDN博客

#字典的键若存在,则对应得值加1,若不存在,则赋值为0,然后加1
dict_kv['val'] = dict_kv.get('val',0)+1
#输出的是key
for i  in dict_kv:
    print(i)
#遍历
for i  in dict_kv.keys()
for i  in dict_kv.values()
for i  in dict_kv.items()
#排序
dict1={'a':2,'e':3,'f':8,'d':4}
sorted(dict1,reverse=True)
sorted(dict1.keys(),reverse=True)
sorted(dict1.values(),reverse=True)
sorted(dict1.items(),key=lambda x:x[1]) # 0:key,1:value

from operator import itemgetter	
sorted(dict1.items(),key=itemgetter(0),reverse=True)
sorted(dict1.items(),key=itemgetter(1),reverse=True)	

28 集合的用法

# 增加
set_d.add(value)
# 删除
set_d.remove(value)

29.argparse

import argparse

parser = argparse.ArgumentParser(description='用于test和online开发')
parser.add_argument('--online', action='store_true',default=False ,help ='False 为测试,True 为生产运行')
args = parser.parse_args()

online = args.online
if online:
    print('=====生产发送=====')
else:
    print('=====测试发送=====')

30 crontab操作

 >  意思是保存最新的日志输出信息,>> 仪式递增保存日志输出信息

2>&1: 将标准错误输出重定向到标准输出

& :后台执行

可以简化操作: python test.py >> test.log 2>&1 &   改为  python  test.py &>>test.log  & 

 */1 * * * * /home/user/nlpconda/bin/python /home/user/hjp/cl_regular_report_project/log_test.py > /home/user/hjp/cl_regular_report_project/log_file/oad.log 2>&1 &

31 指标重新赋值

import pandas as pd
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['1', '2', '3'],
columns=['col1', 'col2'])

# 重新赋值
df['col1'][df['col2']>4]    =50  # 方法1
df.loc[df['col2']>4,'col2'] =50  # 方法2

32.pandas 多行转一行

# 第一个col1 是将多个数据合并到一起,用逗号隔开的字符
# 第二个col2 是将多个数据用列表的形式,放到一起
# 第三个col3 是只去第一个字符
df2 = df.groupby(['user_id']).agg({'col1': [', '.join],
                                         'col2': lambda x: list(x),
                                         'col3': 'first'}).reset_index()

33.分割和替换操作

str = "abc d832。fs,as;da:"
# 1.1分隔一个用  
str.split(',')      
# 1.2分隔多个字符串    
re.split(',|;|:',str)
# 2.1替换一个   
str.replace(' ','')         
# 2.2替换多个         
re.sub(r"[‘’“”ˇ\n\s,。]", "", str)  # "[  要替换的内容 ]"

34.tranform (pandas)的使用

df.groupby('order')['exitprice'].transform('sum')
# 得到结果
order exitprice sum
a 1 6
a 2 6
a 3 6
b 3 15
b 5 15
b 7 15
df['exitprice']/df.groupby('order')['ext price'].transform('sum')
# 得到的是百分比

35环比和同比

import pandas as pd
import random

date_M = list(pd.date_range('1/1/2019', periods=24, freq='M')) #生成日期
mony = [random.randint(18000,20000) for i in range(0,24)] #随机生成销售额
data = pd.DataFrame({'date_M':date_M,'mony':mony}) #构建一个dataframe
'''
使用pct_change()求环比
----------------------------------------------------------
'''
data['huanbi_03'] = data.mony.pct_change()

data.fillna(0,inplace=True) #Null值填充

'''
----------------------------------------------------------
使用一阶差分函数diff()求同比
----------------------------------------------------------
'''
data['tongbi_data'] = data.mony.diff(12) #按月同比,12正好是12个月。
data.fillna(0,inplace=True)
data['tongbi_01'] = data['tongbi_data']/(data['mony'] - data['tongbi_data'])

36 打印数据

from tabulate import tabulate
print(tabulate(df.head(100),headers=df.columns,tablefmt='grid'))

37 将一个函数持久化

import pickle
def talk():
    print('say hejipei')
path_name = '/home/lpz/jupyternotebook/hejipei/test_function.pickle'
with open(path_name, 'wb') as pickle_file: # 导入本地
    pickle.dump(talk, pickle_file)
with open(path_name, 'rb') as pickle_file: # 加载本地数据
    test = pickle.load(pickle_file)   
test()

38 装饰器的用法

def debug(func):
    def wrapper():
        print ("[DEBUG]: enter {}()".format(func.__name__))
        return func()
    return wrapper

@debug
def say_hello():
    print("hello!")

39 __init__的高级用法

这样在导入一个模块的时候就可以把多个不同文件的函数合并并初始化到一个模块下面,方便快捷。

'''文件夹结构'''
-----------------
test
    __init__.py
    test1.py
    test2.py
-----------------
# __init__里面的内容
from ._test1 import test11,test12
from ._test2 import test21,test22,test23
__all__ =[test11,test12,test21,test22,test23]

# 使用方法
from test import test11,test12,test21,test22,test23

40 返回函数本身的用法 在写模型算法时候会用的到

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    return self

f = Foo()
f.bar().bar().bar()
print(f.myattr)

41 从不同目录下导入文件(没走通)

. 为当前文件夹下导入文件

.. 为从上一次文件夹下导入文件

from ._base import LinearModel, _rescale_data
from ..base import RegressorMixin

 42.异常值的处理

try :
    a = b
except NameError as n:
    print(n)

try :
    a = b
except NameError as n:
    print(n)
else:
    print('hello,world')

try :
    a = b
finally:
    print('hw')

a =1
raise ValueError('dad')

43 输出的字符带颜色


def color_utils(value):
    '''
    :param value:
    :return:
    example
        print(color_utils('hello,world'))
    '''
    if not isinstance (value,(str,int,float)):
        raise ValueError('请输入字符或者数字')
    return f"\033[31m{str(value)}\033[0m"

# 输出带颜色
print(color_utils('hello,world'))
NameError(f"\033[31m{warn_output}\033[0m")


a = color_utils

print(a(1))

44  装饰器的用法  @property 

将一个函数变成一种属性,使用的时候不需要加括号

class DataSet(object):
  @property
  def method_with_property(self): ##含有@property
      return 15
  def method_without_property(self): ##不含@property
      return 15

l = DataSet()
print(l.method_with_property) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
print(l.method_without_property())  #没有加@property , 必须使用正常的调用方法的形式,即在后面加()

45 __call__的用法,

 类中一个非常特殊的实例方法,即 __call__()。该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用

class Person(object):
  def __init__(self, name, gender):
    self.name = name
    self.gender = gender
 
  def __call__(self, friend):
    print ('My name is %s...' % self.name)
    print ('My friend is %s...' % friend)
    
bz = Person('张三','man')
bz('李四') #直接使用类对象进行实例化

46 pandas 批量读取csv

使用 chunksize 只在访问数据的时候才真正把数据读入到内存

# 假如有1亿的数据量可以分为100万进行批量读取,这样就不占内存了
import pandas as pd
reader = pd.read_csv('tmp.sv',  chunksize=1000000)

for chunk in reader:
    print(chunk)

47 如何从新加载模块而不不无需重启python shell

# 在Ipython中
%load_ext autoreload
%autoreload 2
from test import example
example()

from test import example
example()
from importlib import reload
reload(test)
example()

48 类的使用

class A:
    def __init__(self):
        pass
    def process(self):
        self.test = 'hello new world'
if __name__ == "__main__":
    ca = A()
    ca.process()
    print(ca.test)

49 展示目录结构

import os
import os.path
def dfs_showdir(path, depth,limit_layer = 999):
    if depth == 0:
        print("root:[" + path + "]")
    for item in os.listdir(path) :
        if depth > limit_layer:
            continue
        newitem = path + '/' + item
        if os.path.isdir(newitem) and '__' not in item :
            print("| " * depth + "+--" + item)
            dfs_showdir(newitem, depth + 1)
if __name__ == '__main__':
    dfs_showdir('.', 0)

50 _iter__和 __next__的组合使用

调用iter()方法时,iter()仅会被调用一次,next()则会多调用多次。

class MyIter:
    def __init__(self):
        self._start = 0

    def __iter__(self):
        self._start += 2
        return self

    def __next__(self):
        if self._start < 10:
            self._start += 1
            return self._start
        else:
            raise StopIteration


if __name__ == '__main__':
    a = MyIter()
    for i in a:
        print(i)

获取命令行返回的结果

import subprocess
import numpy as np
nDevice = int(subprocess.getoutput("nvidia-smi -L | grep GPU |wc -l"))

  • 19
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Python是一种功能强大的编程语言,也被广泛用于数据处理和分析。以下是一些常用Python数据处理工具和技术: 1. Pandas:Pandas是一个开源的数据分析和处理库,提供了高效的数据结构和数据分析工具。它可以处理各种数据类型,包括表格数据、时间序列数据等。下面是一个使用Pandas进行数据处理的例子: ```python import pandas as pd # 读取CSV文件 data = pd.read_csv('data.csv') # 查看数据前几行 print(data.head()) # 进行数据筛选和过滤 filtered_data = data[data['age'] > 30] # 进行数据聚合和统计 grouped_data = filtered_data.groupby('gender').mean() # 输出结果 print(grouped_data) ``` 2. NumPy:NumPy是Python用于科学计算的基础库,提供了高性能的多维数组对象和各种数学函数。它可以用于处理和操作大型数据集。下面是一个使用NumPy进行数据处理的例子: ```python import numpy as np # 创建一个数组 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 计算数组的平均值 mean = np.mean(data) # 计算数组的标准差 std = np.std(data) # 输出结果 print("Mean:", mean) print("Standard Deviation:", std) ``` 3. Matplotlib:Matplotlib是一个用于绘制图表和可视化数据的库。它可以创建各种类型的图表,包括折线图、散点图、柱状图等。下面是一个使用Matplotlib绘制折线图的例子: ```python import matplotlib.pyplot as plt # 创建数据 x = [1, 2, 3, 4, 5] y = [10, 8, 6, 4, 2] # 绘制折线图 plt.plot(x, y) # 添加标题和标签 plt.title("Line Chart") plt.xlabel("X-axis") plt.ylabel("Y-axis") # 显示图表 plt.show() ``` 这些是Python常用数据处理工具和技术,它们可以帮助你处理和分析数据,提高数据分析的效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值