python读取csv数据

目录

  • 背景
    • 1. 读取csv文件
    • 2.判断文件是否存在
    • 3.打印当前时间
    • 4. 生成随机指定维度指定范围的tensor
    • 5. pytorch计算欧氏距离,曼哈顿距离
    • 6. pytorch 18种损失函数
    • 7. 对一个tensor 做行标准化
    • 8. 随机数据集分隔,可复现
    • 9. 更新optuna产生的study
    • 9. 使用正则表达式re替换字符串

背景

总结经常用到的python函数

1. 读取csv文件

    data = pd.read_csv(fname, encoding="gbk",keep_default_na=False)# 读取空字符串而不是nan了
    # data.iloc[1]          得第2行的数据
    # data.iloc[1][1]       第2行第2个数据
    # data.iloc[:, 1]       # 第2列,即列名称为'B'的列,1 4 9 13
    # data.iloc[:, 0:3]     # 前3列
    # data.iloc[:, [0, 3]]  # 第1第4列
    # data.to_excel('test.xlsx')
    slice_data = data.iloc[:,[0,16,9,10,14,15]]
    # slice_data = data.iloc[:,[0,16]]
    for i in range(len(slice_data)):
        segment_id = slice_data.iloc[i][0]
# 读取xlsx文件   
data = pd.read_excel(fname)
# 取出第一行第二个元素eg: '我要办理给家人的流量共享'
data.iloc[0][1]
# 以array形式返回第一行的数据eg: array([0, '我要办理给家人的流量共享'], dtype=object)
data.iloc[0].values

读取其他格式文件参考

2.判断文件是否存在

判断进入python环境的当前目录,或者ide打开的文件目录下是否存在test.txt文件。
在程序循环的过程中,适用于文件存在则省去生成过程,反之则生成文件。

import os
os.path.isfile('test.txt') #如果不存在就返回False

3.打印当前时间

在输出log文件的时候可用作拼接字符串操作,形成文件名

import time
time.strftime('%Y_%m_%d_%H_%M_%S',time.localtime(time.time()))

output

'2021_05_07_20_00_28'

4. 生成随机指定维度指定范围的tensor

import torch
a = torch.normal(mean = 1,std = torch.arange(1.0,6.0).float())
print(a)
std = torch.arange(1,6)
print(std)

#输出
tensor([1.0243, 2.7108, 4.2406, 0.8341, 4.0412])
tensor([1, 2, 3, 4, 5])

5. pytorch计算欧氏距离,曼哈顿距离

import torch.nn.functional as F
distance = F.pairwise_distance(rep_a, rep_b, p=2) # p=1 曼哈顿距离
torch.cosine_similarity( positive_embedding, cur_embedding, dim=-1) # 计算余弦相似度

其中rep_a和rep_b为[batch_size,hidden_dim]

>>> import torch
>>> import torch.nn.functional as F
>>> import numpy as np
>>> t1=torch.ones(2,3)
>>> t1
tensor([[1., 1., 1.],
        [1., 1., 1.]])
>>> t2=torch.tensor(np.arange(6).reshape(2,3)+0.0)
>>> t2
tensor([[0., 1., 2.],
        [3., 4., 5.]], dtype=torch.float64)
>>> F.pairwise_distance(t1,t2)
tensor([1.4142, 5.3852], dtype=torch.float64)
>>> F.pairwise_distance(t1,t2,p=1)
tensor([2.0000, 9.0000], dtype=torch.float64)

各种距离和相似度计算方式

6. pytorch 18种损失函数

参考和应用

7. 对一个tensor 做行标准化

>>> import torch
>>> import numpy as np
>>> t1=torch.tensor(np.arange(6).reshape(2,3))+0.
>>> t1
tensor([[0., 1., 2.],
        [3., 4., 5.]])
>>> row_sum = torch.sum(t1,dim=1)
tensor([ 3., 12.])

>>> r_inv = np.power(row_sum, -1).flatten()
>>> r_inv
tensor([0.3333, 0.0833])
>>> r_inv[torch.isinf(r_inv)] = 0.
>>> r_inv
tensor([0.3333, 0.0833])
>>>r_mat_inv = torch.diag(r_inv) # 区别于np.diags(r_inv)
>>> r_mat_inv
tensor([[0.3333, 0.0000],
        [0.0000, 0.0833]])
  # r_mat_inv.mul(t1) 是点乘,matmul是矩阵相乘
>>> r_mat_inv.matmul(t1)
tensor([[0.0000, 0.3333, 0.6667],
        [0.2500, 0.3333, 0.4167]])

8. 随机数据集分隔,可复现

为了分隔数据集为训练集测试集,且保证可复现通过随机数种子设置,

# 要分割的数据集以dict方式存储
def preprocess_split_data(normed_ways_segment_volume_dict):
	'''
	normed_ways_segment_volume_dict=dict  k=int	v=[1,2,3...]
	return ways_segment_list = 单层 list 
	ways_slice_volume_list   = 双层的list 
	'''
    ways_segment_list = []
    ways_slice_volume_list  = []
    # 如果不做排序的话,可能导致返回的list 每次次序不不一样
    # 即使设置了seed,导致实验结果也不可复线
    normed_ways_segment_volume_dict = sorted(normed_ways_segment_volume_dict.items(), key=lambda item:item[0], reverse = False)

    for ways_volume_truple in normed_ways_segment_volume_dict:
        ways_segment_list.append(ways_volume_truple[0])
        ways_slice_volume_list.append(ways_volume_truple[1])
    return ways_slice_volume_list  , ways_segment_list

if __name__ == '__main_':
	from sklearn.model_selection import train_test_split

    data_feature, data_target = preprocess_split_data(unnormed_ways_segment_volume_dict) # TODO: 划分数据集总是随机,不可复现,normed_ways_segment_volume_dict->unnormed_ways_segment_volume_dict
    train_volume_arr, test_volume_arr, train_leida_id_arr, test_leida_id_arr = \
            train_test_split(data_feature, data_target, test_size=args.percent, random_state=args.seed)

9. 更新optuna产生的study

产时间不运行的话,如果使用好久之前的.db文件会报如下错误:

Exception has occurred: RuntimeError
The runtime optuna version 2.7.0 is no longer compatible with the table schema (set up by optuna 2.0.0). Please execute `$ optuna storage upgrade --storage $STORAGE_URL` for upgrading the storage.
  File "G:\我的坚果云\paper\hangzhou_traffic_flow_forcast\GCN_hangzhou\gcn_hangzhou_optuna.py", line 395, in <module>
    study = optuna.create_study(study_name='hangzhou_study', storage='sqlite:///hangzhou/log/hangzhou_study.db', load_if_exists=True)

解决方案,首先在命令行进入存放.db文件的指定路径,按照提示再次编译.db文件,即可解决

(py3.6) G:\我的坚果云\paper\hangzhou_traffic_flow_forcast\GCN_hangzhou\hangzhou\log>optuna storage upgrade --storage sqlite:///hangzhou_study.db
[I 2021-05-27 23:12:54,272] Upgrading the storage schema to the latest version.
[I 2021-05-27 23:12:54,819] Completed to upgrade the storage.

(py3.6) G:\我的坚果云\paper\hangzhou_traffic_flow_forcast\GCN_hangzhou\hangzhou\log>

9. 使用正则表达式re替换字符串

re函数的使用

 t=('adksaljdlk' '123453')
>>> re.sub("123+", '*', t.lower()) # re+ 表示一个或多个表达式
'adksaljdlk*453'

你可能感兴趣的:(笔记,python,开发语言)