python 小知识点

1、获取当前文件路径

now_file_path = os.path.dirname(file)

2、对列表删除重复元素,且不改变原有顺序

list = sorted(set(list_data), key=list_data.index)
data1 = list(OrderedDict.fromkeys(data1))

3、pandas数据可以矩阵乘法

pd.mean()求平均;.min();.max()

4、字典按某值排序,并取前几个

sort_data = dict(sorted(dict_data.items(), key=lambda x: x[1], reverse=True))
most_near = list(sort_data .keys())[0:choose_num]
#reverse=True是升序

5、pd按条件删除

df = df.drop(df[(df[‘a’] >= “500000”) & (df[‘b’] < “600000”)].index)

6、list交集、并、差

print list(set(a).intersection(set(b)))
print list(set(a).union(set(b)))
print list(set(b).difference(set(a))) # b中有而a中没有的

7、pandas按条件去重,不改变原始数据

data = pd_data.drop_duplicates(subset=[‘井1’, ‘井2’])
#去重后变数组,不能用list
data= np.array(pd_data.drop_duplicates(subset=[‘井1’, ‘井2’])[[‘井1’, ‘井2’]])
#去除重复列
curves_datas = curves_datas.loc[:, ~curves_datas.columns.duplicated()]
#去除重复列,列不相同时去除失败
curves_datas = curves_datas.T.drop_duplicates().T

#pd按指定顺序排序

    # 直接设置分类及顺序
    data['Pick_Name'] = pd.Categorical(data['Pick_Name'], categories=all_dc_name, ordered=True)
    # 按照分类排序
    data.sort_values('Pick_Name', inplace=True)

        list_custom = ["CON_Cal_标准测井", 'CON1_标准测井', "CON_Cal_3700测井", 'CAL_标准测井', 'Cs_标准测井']
        n_sort_all_curve_sim_k_split['Service_Name'] = n_sort_all_curve_sim_k_split['Service_Name'].astype('category')
        n_sort_all_curve_sim_k_split['Service_Name'].cat.reorder_categories(list_custom, inplace=True)
        n_sort_all_curve_sim_k_split.sort_values('Service_Name', inplace=True)

8、pd按条件搜索

#这样会令其他字段都为NAN
part_data = big_sim_choose_curve[big_sim_choose_curve[[‘井1’, ‘井2’]] == two_well_name]
#这样是正确的
part_data = big_sim_choose_curve[(big_sim_choose_curve[‘井1’] == two_well_name[0]) & (big_sim_choose_curve[‘井2’] == two_well_name[1])]
#pd某列为列表,在列表中查找符合要求的所有pd
pd_data = each_split_ref[each_split_ref[‘对应参考井’].apply(lambda x: well_i == x)]

#搜索某列开头字符为P1的所有数据

dc_data = dc_data[dc_data['Pick_Name'].str.startswith('P1')]

#删除为’‘的数据
pds = pd.DataFrame([[1,2,3],[1,2,“”],[1,“b”,1],[2,3,4]],columns=[“a”,“b”,“c”])
t = np.frompyfunc(lambda x:not isinstance(x,str),1,1)(pds.values)
or t = np.frompyfunc(lambda x: not x==’', 1, 1)(data.values)
new_pds = pds.iloc[t.sum(axis=1)==t.shape[1]]

#统计每行为空的个数
null_sum = file_data.isna().sum(axis=1) + (file_data == ‘’).sum(axis=1)
#null_sum= file_data.apply(lambda x: x.value_counts().get(0, 0), axis=1)#value_counts统计每个元素出现的次数,get0,0第一个0是获取0的个数,第二个是将其它的个数置为0–如果有’',处理会有问题

#统计有空的行的索引,并在元数据中删除
null_index = null_sum[null_sum>0].index
file_data = file_data.drop(null_index)

9、字典按key删除

dict_data.pop(key)
new_data = {k:v for k, v in data_ori.items() if v < 0}

10、嵌套list展开

def flatten(li):
return sum(([x] if not isinstance(x, list) else flatten(x) for x in li), [])
#把二维矩阵展开
from itertools import chain # 嵌套list展开为一维向量
all_dc_sim_array = list(chain.from_iterable(all_dc_sim))

11、pandas按条件搜索在某list中的值

choose_part_data = pd_data[pd_data[‘井1’].isin(list_data)]
choose_part_data = pd_data[~(pd_data[‘井1’].isin(list_data))]#不在list中的
data = data[~data[‘fc_name’].str.contains(‘油层底深|井底|岩’)]#模糊按条件搜索

12、获取字典中某些key对应的值

list2 = list(map(dict_data.get, keys))

13、字典拼接

a.update(b)

14.pd按某字段排序

f_c = list(curves_datas.columns)
curves_datas = curves_datas.sort_values(by=f_c[0], ascending=True) # 按depth排序

15、读取xls的sheet

wb = load_workbook(now_path + “/7.2交流拿到的数据/229-80.块分层数据.xlsx”)
sheetnames = wb.sheetnames
dc_data = list(wb[choose_sheet_name].values)
dc_data = pd.DataFrame(dc_data[1:], columns=dc_data[0])#对应井的地层数据

data = xlrd.open_workbook(‘E:\电网故障数据1.xlsx’) # 获取数据
table = data.sheet_by_name(‘Sheet1’)
rownum = table.nrows
colnum = table.ncols - 1
x = np.zeros((rownum, colnum))
for i in range(rownum):
    for j in range(colnum):
         x[i, j] = table.cell(i, j).value

16.pd中所有数据转为float

df.convert_objects(convert_numeric=True)
final_mark_dc_combine = final_mark_dc_combine.apply(pd.to_numeric, errors=‘ignore’)

def trans(x):
try:
return float(x)
except:
return x
curves_datas = curves_datas.applymap(trans)

17、安装第三方库

例如:通过清华的镜像安装requests
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
pip uninstall xlrd
pip install xlrd==1.1.0

pip install scikit-learn --index-url=http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
linux下下载指定的安装包

pip download msgpack==1.0.0 -d /soft --index-url=http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

18、pd修改某值

curve_dc_data.loc[i:i, (‘z’)] = 10
curve_dc_data[‘z’].iloc[i] = 10
pd_data.loc[pd_data[‘a’] == 1, ‘b’] = 100

19、pd修改列名

pd.rename(columns = {‘C’:‘change_c’}, inplace = True)

20、pd按行列删除

#删除深度重复的地方
file_data = file_data.drop_duplicates(subset=‘DEPT’)
#删除每行不为0.125整数的数据,保存
file_data = file_data[(file_data[co] % 0.125) == 0]
#删除任意有空的列
file_data = file_data.dropna(axis=1, how=“all”)
#删除任意有空的行
file_data = file_data.dropna(axis=0, how=“all”)
#删除垂深为空的部分
file_data.dropna(subset=[‘z’], inplace=True)

21、查看文件的编码格式,打开文件,防止中文乱码

f = open(path, ‘rb’)
f_charinfo = chardet.detect(f.read())[‘encoding’]
print(“f_charinfo”, f_charinfo)
f = open(path, encoding=f_charinfo)
lines = f.readlines()

lines[i] = lines[i].encode(f_charinfo).decode(‘gbk’).encode(‘utf-8’).decode(‘utf-8’)#防止中文乱码

22、迭代器产生索引对

product(*loop_val1)
——[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1)…]

23、str变字典

obj_predict = eval(obj_predict)

24、字符串型列表转成真正的列表

读取csv文件,里面的列表为str型
from ast import literal_eval
new_list = literal_eval(c_data)

25、str从第index位开始查找指定值

str.index(‘|’, index)

26、对列表用某字符连接,形成字符串str

final_data = ‘;’.join(data_list)

26、pd重置行索引

pd_data= pd_data.reset_index(drop=True)#重置索引

27、linux后台运行python

nohup python -u flush.py > flush.log 2>&1 &#后台执行
nohup python -u flush.py > flush.out 2>&1 &#后台执行
其中-u为无缓冲输出
ps -ef | grep python#查看进程
killall -9 python
kill -s 9 125936#关闭进程 125936为进程号
ps aux|grep python|grep -v grep|cut -c 9-15|xargs kill -9 #关闭全部python进程

#查找并关闭某些进程
ps -ef | grep python | grep “第三个加权模型.py”
ps -ef | grep python | grep “第三个加权模型.py” | awk ‘{print $2}’ | xargs kill -9

pkill -f “第三个加权模型.py”
killall -9 第三个加权模型.py

tail -f flush.log # 实时输出
cat # 全部输出
free -h#查看内存
top #查看cpu
lscpu #查看cpu个数
在这里插入图片描述
#tf和torch是否调用GPU
tf.config.experimental.list_physical_devices(‘GPU’)
tf.test.is_gpu_available()
torch.cuda.is_available()

查看GPU占用情况nvidia-smi
在这里插入图片描述

28、pd转json存redis

redisClient = redis.StrictRedis(host=‘10.1.1.120’, port=6379, db=15, decode_responses=True, charset=‘UTF-8’,
encoding=‘UTF-8’)
modelStratums = modelStratums.to_dict(orient=‘index’)#orient='index’横向转
modelStratums = json.dumps(modelStratums)
redisClient.hset(modelData_token, ‘modelStratums’, modelStratums)

29、redis读数据转pd

load1 = redisClient.hget(‘modelData:token:’, ‘modelCrv’) # 从redis中获取
load1 = json.loads(load1)
data = pd.DataFrame(load1)
data = pd.DataFrame(data.values.T, columns=data.index)#转置

30、字典中按找到某些key对应的值

#字典:crv_id_name;某些key:final_choose_curve_id
final_choose_curve = list(itemgetter(*final_choose_curve_id)(crv_id_name))

31、随机选择list中的几个数

population = [‘s’, ‘as’, ‘saf’, ‘ss’, ‘12’, ‘d2’]
k = 5
b = sample(population, k)
list = sorted(set(b), key=population.index)

32、存csv防止中文乱码

well_curve_data_new.to_csv(save_path + well_name_csv, encoding=‘utf_8_sig’, index=False)

33、转码

well_name = well_name.encode(‘’ISO-8859-1).decode(‘gbk’).encode(‘utf-8’).decode(‘utf-8’)

33、plt将y坐标翻转

plt.gca().invert_yaxis()

34、正则表达式判断字符串中的中英数字

letter_num=re.findall(‘[a-zA-Z]’,str)
digit_num = re.findall(‘[0-9]’,str)
chinese_num = re.findall(‘([\u4e00-\u9fa5])’,str)
re.findall(‘[1’, data)#中文数字,找到中文后的数字

35、嵌套list长度不一致,补齐,转为np.array

#如果行数不足,则用0补齐
max_line = max(list(map(lambda x: len(x), file)))#列表中行数最多的个数
file = list(map(lambda x: x + [0] * (max_line - len(x)), file))
file = np.array(file)

36、嵌套list补齐,转为np.array

#如果行数不足,则补齐
max_line = max(list(map(lambda x: len(x), file)))#列表中行数最多的个数
file = list(map(lambda x: x + [0] * (max_line - len(x)), file))

37、读取excel中某行,拼成str

#要用map,因为读取的时候,会把数字变成浮点型,而不是str
line_str = ‘’.join(map(str, line))

38、处理pd读excel的nan

pandas默认读取空字符串时读出的是nan,在使用 pandas.read_excel(file)这个方法时可以在后面加上keep_default_na=False,这样读取到空字符串时读出的就是’'而不是nan了:
one_d = [a_ for a_ in one_d if a_ == a_]#删除列表中空值

39、去除list中的NAT时间格式

将整个list转换为str,再删除NAT
u_data = [str(i) for i in data[1] if (i != ‘’)]
u_data = [i for i in u_data if (i != ‘NaT’)]

40、字典删除部分数据

have_del_data = list(set(list(final_mark_dc_dict.keys())).difference(set(all_choose_dc)))
list(map(final_mark_dc_dict.pop, have_del_data))

41、根据倾斜角方位角获取偏移和垂深

如果为第一行则默认上一层数据为0
X偏移=上一层x偏移+(当前测深-上一层测深)*Math.sin(Math.toRadians(倾斜角))*Math.cos(Math.toRadians(方位角));
Y偏移=上一层Y偏移+(当前测深-上一层测深)*Math.sin(Math.toRadians(倾斜角))*Math.sin(Math.toRadians(方位角));
垂深=上一层垂深+(当前测深-上一层测深)*Math.cos(Math.toRadians(倾斜角));

42、获取sdk接口数据

url = "http://188.188.65.31:9000/well/getDirSurveyListByWellListID"
headers = {"token":"757c0c66-c21d-4d5f-8a67-9f5f65770936","Content-Type":"application/json"}#不加Content-Type会报错
datas = json.dumps({
"wellListId": 3531
})
r = requests.post(url, data=datas, headers=headers)#获取请求
# print(r.text)
# print(r.content.decode("utf-8"))  #decode解压缩展示中文
deviation_data = json.loads(r.content.decode("utf-8"))
deviation_data = pd.DataFrame(deviation_data)

43、获取字典中最大值对应的key

max_key = max(data, key=lambda k: data[k])

44、统计list中元素出现的字数

1)b = dict(zip(*np.unique(lst, return_counts=True)))
2)from collections import Counter
dict(Counter(lst))

45、监控日志

tail -f nohup.out

46、忽略nan求均值

mean = np.nanmean(data)
std = np.nanstd(data)

47、根据某函数过滤序列

def is_odd(n):
return n % 2 == 1
#过滤奇数
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

48、启动tf

source activate tensorflow35
source deactivate tensorflow35

50、Xshell滚屏

Ctrl+S:锁定当前屏幕
Ctrl+Q:解锁当前屏幕

51、tf读模型参数

file_name = “./第三个模型/”
model_name = “three_model.ckpt-160”
checkpoint_path = os.path.join(file_name, model_name)
reader = tf.train.NewCheckpointReader(checkpoint_path) # 读取参数
var_to_shape_map = reader.get_variable_to_shape_map()
print(“w1”, reader.get_tensor(‘w1’))
print(“w2”, reader.get_tensor(‘w2’))
for key in var_to_shape_map:
  print("tensor_name: ", key)
  print(reader.get_tensor(key))

52、数据one_hot编码

    from sklearn.preprocessing import LabelEncoder
    from sklearn.preprocessing import OneHotEncoder
    # define example
    # integer encode
    label_encoder = LabelEncoder()
    integer_encoded = label_encoder.fit_transform(label)
    print(integer_encoded)
    # binary encode
    onehot_encoder = OneHotEncoder(sparse=False)
    integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
    onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
    print("onehot_encoded", onehot_encoded)

53、判断数据类型

#判断是否为某类型
if isinstance(all_data_trajectory_dict[k], pd.DataFrame):
  print('ok)
#判断是否为NoneType
if data is None:
  print(“is_none”)

54、linux环境下发送post请求 curl

curl --location --request POST ‘填写url’
–header ‘xxxx: xxxxxxxxxxxxx’
–header ‘Content-Type: application/json’
–data ‘JSON格式’

例子:

curl --location --request POST ‘http://188.188.65.31:9000/proj/getPickDataByWellIDSchemeID’
–header ‘token: ff1c5fe0-6942-4935-a227-a909e96a0178’
–header ‘Content-Type: application/json’
–data ‘{
“wellId”: 20839,
“schemeId”: 327
}’
右键->检查
在这里插入图片描述

55、pd错位

df.shift(1)#向下错一位
df.shift(-1)#向上错一位
df.shift(axis=1, periods=1)#向右错一位(列错位)

56、LabelEncoder编码

encoder = LabelEncoder()
values[:, 4] = encoder.fit_transform(values[:, 4])#组合风向改变编码方式

57、pycharm自动填充import

Alt+Enter

58、list/pd切片,取奇数偶数位

df.iloc[1::2]取偶数位
df.iloc[::2]取奇数位
df.iloc[::3]每隔两位取一个数

59、文件读取

a = file.readlines()
file.seek(0)#把文件指针指向头,不然b会为空
b = file.read()

60、paddle安装命令

python -m pip install paddlepaddle-gpu==2.2.1 -i https://mirror.baidu.com/pypi/simple

pip install paddlepaddle -i https://pypi.douban.com/simple

61、打乱数据集

train_random_index = np.random.permutation(len(final_data)) # 对训练集生成无序的数字
#对数据集打乱(如果数据集可以转成np.array,直接参考标签的打乱方式)
r = list(tuple(zip(final_data,train_random_index)))
r.sort(key=lambda final_data:final_data[1])
x = list(np.array®[:,0])
#对标签打乱
label_data = np.array(final_label)[train_random_index]

62、重采样

# 重采样,解决数据不平衡

# print("采样前:", Counter(y_train))
# over_samples = SMOTE(random_state=0)
# x_train, y_train = over_samples.fit_resample(x_train, y_train)
# print("采样后", Counter(y_train))

63、linux没有GUI下作图

#-- coding: utf-8 --
import matplotlib
matplotlib.use(‘agg’)
import matplotlib.pyplot as plt

64、sklearn归一化 反归一化

from sklearn import preprocessing
import joblib
x = np.array([[2, 2, 2, 2]])
x = x.reshape([x.shape[1], 1])
print(“x”, x)
min_max_scaler = preprocessing.MinMaxScaler()#默认为范围0~1,拷贝操作
#min_max_scaler = preprocessing.MinMaxScaler(feature_range = (1,3),copy = False)#范围改为1~3,对原数组操作
x_minmax = min_max_scaler.fit_transform(x)
joblib.dump(min_max_scaler, ‘./scalar01.m’)
print(“x_minmax”, x_minmax)
min_max_scaler = joblib.load(os.path.join(sys.path[0], “scalar01.m”))
#X = min_max_scaler.fit_transform(x_minmax)
origin_data = min_max_scaler.inverse_transform(x_minmax)

65、linux下缺少SimHei字体

在这里插入图片描述
参考:https://www.cnblogs.com/muchi/articles/11946852.html

66 获取文件下的所有xlsx文件路径

path = os.path.join(sys.path[0], ‘petrel预处理数据’)
data = glob.glob(os.path.join(path, ‘*.xlsx’))
获取上级目录
self.path = os.path.join(os.path.abspath(os.path.dirname(os.getcwd())), ‘projFile’, wellListId) # 平台调用时路径有问题
self.path = os.path.join(os.path.abspath(os.path.join(file, “…”, “…”)), ‘projFile’, wellListId)

67 linux conda

查看conda环境:conda env list
创建环境:conda create -n 环境名 python==3.8
切换conda环境:source activate 环境名

68 linux redis

1、redis服务器所在位置,查看是否有在这里插入图片描述
#ps -ef | grep redis (检测是否启动Redis);
2、# /opt/dcp/redis/src/redis-server /opt/dcp/redis/redis.conf尝试执行redis的启动命令

69、获取当前ip

# 正确获取当前ip
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
# 获取的ip不准确
# hostname = socket.gethostname()
# ip = socket.gethostbyname(hostname)
# #server_addr = '10.1.1.113'    # 230130注释

70、conda环境

1、建立conda环境
在这里插入图片描述
2、复制一个conda环境到另一个环境
如果要跨服务器拷贝环境,可以把yml文件scp到另外一台服务器上,再执行后续操作
conda env export > ~/my_envs/env_name.yml
scp env_name.yml user@target_server:/path/to/destination/
conda env update --file /path/to/destination/env_name.yml

在这里插入图片描述

复制conda到另外一个conda环境第二种方法
在这里插入图片描述
5、conda env export --name source_env | conda env update --name target_env --file -

71、正则匹配删除数据

pycharm删除以print开头的一行数据,
“^# print.\n”
“^\s
# print.*\n” (允许开头有空格)

在这里插入图片描述

72、模糊替换

如果你只想将等号后紧跟的"append"替换为"._append",而保持等号和中间的字符串不变,你可以使用正则表达式进行替换。以下是一些简单的步骤:

打开你的PyCharm项目。
使用快捷键Ctrl + Shift + R(Windows/Linux)或Command + Shift + R(Mac)打开全局替换。
在"Find"字段中输入(?<.*)append。
(?<
.*)是一个正向回溯断言,用于匹配等号后的任意字符,确保只替换等号后紧跟的"append"。
append表示要搜索的关键字。
在"Replace with"字段中输入._append。
._append表示替换后的字符串。

73、pd作为传参

仅适用于windows
linux传参有问题,linux可以用
subprocess.run(['python', os.path.join(sys.path[0], "test1.py"), json_data])
正常传参,但是不能转回pd数据

test.py

data = pd.DataFrame({'a':[1, 2], 'b':[[1, 2], [4, 5]]})
json_data = data.to_json(orient='records')
print(json_data)
command = 'python ' + os.path.join(sys.path[0], 'test1.py') + ' %s' % (json_data)
os.system(command)

test1.py

import json
import re
import sys

import pandas as pd

data = sys.argv[1]
def change_str_to_pd(pd_json_str):
    """
    pd转为json的传参,逆向转换为pd
    :return:
    """
    pd_json_str = re.sub(r"([{,])([^{:,]+?):", r'\1"\2":', pd_json_str)
    pd_data = pd.DataFrame(json.loads(pd_json_str))
    return pd_data
data = change_str_to_pd(data)
print("data\n", data, type(data))

74、找到pd内索引连续的数据

创建示例 DataFrame

    data = {'A': [1, 2, 3, 4, 5], 'B': [5, 6, 7, 8, 9]}
    df = pd.DataFrame(data, index=[1, 2, 4, 6, 7])

    # 找到索引不连续的位置
    discontinuous_index = df.index.to_series().diff().fillna(1).ne(1).cumsum()
    # 分割 DataFrame 成多个 DataFrame
    dfs = [group for _, group in df.groupby(discontinuous_index)]
   

75 pd内全局搜索某值/某列表

# 创建示例数据
data = {'a': [31, 2, None, 4],
        'b': [None, None, None, None],
        'c': [None, 2, None, None],
        'd': [5, 6, 7, 8]}
data = pd.DataFrame(data)
# search_value = 7
# data = data[data.eq(search_value).any(axis=1)]

search_value = [31, 7]
data = data[data.isin(search_value).any(axis=1)]
print(data)

76 dict转为json作为传参,调另外一个脚本

    import json
    import subprocess
    # 定义字典
    data = {
        'key': 'value'
    }
    # 将字典转换为JSON字符串
    json_str = json.dumps(data)
    # 传递JSON字符串给另一个脚本 os.system会报错
    subprocess.call(['python', 'test2.py', json_str])

    # test2.py
    data = sys.argv[1]
    data = json.loads(data)

76 如果多次调用plt.figure()报错,则在开头加入

"D:\software\software\anaconda3\envs\wellTestInterpretation\lib\tkinter_init.py", line 2156, in wm_iconphoto
self.tk.call('wm', 'iconphoto', self._w, *args)
_tkinter.TclError: failed to create icon for "pyimage4421"

Process finished with exit code 1

修改图形后端:尝试切换到不同的图形后端,例如agg或TkAgg,
import matplotlib
matplotlib.use(‘agg’) # 或者使用 ‘TkAgg’

77、决策树的可视化

77、结果可视化

linux下安装graphviz
sudo yum install graphviz

    def visualize_tree(self):
        if self.model is None:
            print("Please train the model first.")
            return
        plt.figure(figsize=(20, 10))
        tree.plot_tree(self.model, filled=True)
        plt.show()

    def save_tree_to_pdf(self, filename):
        if self.model is None:
            print("Please train the model first.")
            return
        dot_data = export_graphviz(self.model, out_file=None, filled=True)
        graph = pydotplus.graph_from_dot_data(dot_data)
        graph.write_pdf(filename)
        # 

78 plt色卡

在这里插入图片描述

end


  1. \u4e00-\u9fa5 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值