1.单一文件数据量很大
1.
.chunksize()
在工作中数据量特别大的单独csv文件时,由于df.read_csv()读取的很慢,并且在进行数据处理的很繁琐。在网上看到read_csv()有.chunksize() 参数,括号里可以设置每一块的数据量,并且类似用groupby()的形式读取,后进行批量操作。
2.
无意中在知乎看到介绍数据hdf文件储存,并且介绍可以第一次读取csv文件后,将其导出为hdf文件格式保存,后续再读取时,读hdf文件(.h5)速度会快很多倍。
start_time = time.time()
df = pd.read_csv(r"C:\Users\yunda\Desktop\test.csv")
end_time = time.time()
print("用时%s秒"%(end_time - start_time))
#用时0.7988379001617432秒
df.to_hdf("C:\\Users\\yunda\\Desktop\\test.h5",key = "df")
start_time = time.time()
df1 = pd.read_hdf(r"C:\Users\yunda\Desktop\test.h5")
end_time = time.time()
print("用时%s秒"%(end_time - start_time))
用时0.04186892509460449秒
2.对dataframe进行迭代(遍历)的时候有三种iterrows(), iteritems(), itertuples()
iterrows(): 将DataFrame迭代为(index, Series)对。
itertuples(): 将DataFrame迭代为元祖。
iteritems(): 将DataFrame迭代为(列名, Series)对
其中速度最快的时.itertuples(),因此在使用的时候首先它
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11, 'c2':110}, {'c1':12, 'c2':123}]
df = pd.DataFrame(inp)
for row in df.itertuples():
print(row)
print(getattr(row, 'c1'), getattr(row, 'c2'))
for index,row in df.itterrows():
print(row["c2"])
3.pandas衍生库:pandas_profiling(在之前的博客中有此介绍)
其中可以一键生成数据相关报告
import pandas_profiling
data=pd.read_csv("")
file=data.profile_report(title="")
#转化成相应的Html文件
file.to_file(output_file="result.html")
4.更快的读取pandas文件,modin库它是一个多进程的数据帧(Dataframe)库,具有与 Pandas 相同的应用程序接口(API),使用户可以加速他们的 Pandas 工作流。
import numpy as np
import modin.pandas as pd
df = pd.read_csv("my_dataset.csv")
由于modin依赖于ray,而ray目前只支持linux和mac系统, 不支持windows,所以windows还无法使用,后续可能将模型部署在服务器LINUX上可以使用到。
具体底层可自行参照官方文档!
5.关于浮点数转化为二进制代码为:
可以直接乘以某个进制再转换
求负数十六进制的公式为:
负数十六进制 = hex ( 负数 & 0xFF…FF ) (注意:几个F取决于数据类型的范围,如int数据类型取0xFFFFFFFF)
neg十六进制 = hex(-45054 & 0xFFFFFFFF) = hex(4294922242) = 0xFFFF5002
二进制补码等相关可参考:链接
**6.**针对pandas中的Series或者某一列进行求标准差,直接df[" “].std()结果和np.std(df[” "])不一样的!其中np. 是正确的。因此在对列进行操作的时要使用第一种方法需要添加参数。
df[" "].std(ddof=0)
**7.**工作需要同时对一个DataFrame中的两列的每个元素进行操作时,运用apply时,给的参数需要是一个列表。
def test(x,y,z):
result = x + y +z
df["3"] = df[["1","2","3"]].apply(lambda x:test([x[0],x[1],x[2]]),axis=1)
**8.**如果需要对一个字符串中每2个数中加一个符号可以使用正则表达式:如果是奇数之类的需要添加判断
s="224466"
"/".join(re.findall(r".{2}",s))
9.将.py文件转换成exe文件可以使用python的Pyinstaller包:
1,先安装该包
2.通过cmd进入到.py文件的地址
3.输入pyinstaller -F *.py 就可以了
如果是一个工程项目的话,选择主文件进行main.py即可
打包好的exe就在目录下的dist文件夹里面
-icon=your path 加一个图标
-F 打包成一个文件
-w 无控制台运行界面
-D 创建一个目录,里面包含exe以及其他一些依赖性文件
pyinstaller -h 查看参数
**注:**需要提到的是直接在cmd下打包,打包出来的exe文件都很大,因为是吧很多不需要的库也给安装进去了。因此可以使用在虚拟环境中通过pyinstaller打包
主要用到的库是pipenv ,在使用安装他即可
安装好之后 在cmd下运行
pipenv shell#进入虚拟环境
exit#退出环境
然后在此环境安装相应需要的包就可以了。
出现"utf-8"编码错误则在命令行中先输入 chcp 65001 后运行编译
10.pycharm写代码文件头
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@FILE : ${NAME}.py
@IDE : ${PRODUCT_NAME}
@license: (C)Copyright 2019-2020, teddy
@Modify Time @Author @Version @Description
-------------- ----------- ----------- -----------------
${DATE} teddy 0.1 功能
"""
第一行作用:
在windows上,第一行有没有都不会造成影响(Windows更具扩展名来判断文件类型),Linux上执行文件时是 ./test.py 的形式,所以需要加上解释器的路径信息,告知用何种方式执行这个文件。
这种是为了防止用户并不是将python装在默认的/usr/bin路径里,当系统看到这行代码时,会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
可用的预定义文件模板变量为:
${PROJECT_NAME} - 当前项目的名称。
${NAME} - 在文件创建过程中在“新建文件”对话框中指定的新文件的名称。
${USER} - 当前用户的登录名。
${DATE} - 当前的系统日期。
${TIME} - 当前系统时间。
${YEAR} - 今年。
${MONTH} - 当月。
${DAY} - 当月的当天。
${HOUR} - 目前的小时。
${MINUTE} - 当前分钟。
${PRODUCT_NAME} - 将在其中创建文件的IDE的名称。
${MONTH_NAME_SHORT} - 月份名称的前3个字母。 示例:1月,2月等
${MONTH_NAME_FULL} - 一个月的全名。 示例:1月,2月等
11.读取csv文件报错编码错误
具体原理不做详细解释,由于本地通过excel打开新建列名(中文命名)之后读取read_csv会报错编码问题,可以添加 encoding="gb2312"
但是此用法在后续合并读取文件时候,需要自己添加encoding比较麻烦。因此推荐使用
encoding=“utf-8-sig”
12.python 读取.log文件然后操作
1.需要读取.log文件(类似txt文件)操作,如果使用pandas可以直接使用read_table()读取或者使用read_csv(,sep= “\t”)既可。具体格式要求需要查看文件类数据排版格式,读取出来是一个dataframe。
2.通过with open的形式读取,读取出来是一个列表。
filename = r"C:\Users\yunda\Desktop\rtms_20191201_20803_5.log"
with open (filename,"r") as f:
data = f.readlines()
13.关于DataFrame的纵向拼接和合并
1.工作中遇到需要把多个文件合并或者是多个数据框纵向合并目前考虑有三种方法
一:通过 to_csv()的形式进行凭借。先将首文件to_csv生成一个csv文件导出,然后后续的文件通过to_csv(mode= “a”)的形式导入。
缺点:会直接合并上去,不会根据列名自动进行分列拼接
df = pd.read_csv(r"")
df1 = pd.read_csv(r"")
df.to_csv(r"test.csv")
df1.to_csv(r"test.csv",mode="a",header=False,index=False)
二:通过.append()的形式进行数据框的拼接,数据会根据列名相同自动进行拼接,并且如果某一个数据框在没有某一列的情况下,会在合并的数据框中显示NAN
df = pd.read_csv(r"")
df1 = pd.read_csv(r"")
df_all = df.append(df1)
三:通过pd.concat()的形式进行拼接,效果和append相同
df = pd.read_csv(r"")
df1 = pd.read_csv(r"")
df_all = pd.concat([df,df1])
14.关于DataFrame,Series的横向拼接和合并
一:主要使用的是pd.merge()的方法进行凭借,和Mysql里面的Join类似。
df_all = pd.merge(left,right,on = "key")
表的组合都是两两合并
但是merge多表合并:可以用reduce+merge的方法
from functools import reduce
dfs = [df0, df1, df2, dfN]
df_final = reduce(lambda left,right: pd.merge(left,right,on=‘name’), dfs)
有时计算的结果需要将其结果直接append到空数据框中,在使用append的时候需要参数ignore_index=True
result = result.append({"90%":df[df["mins"]<i]["flag"].quantile(0.9),
"95%":df[df["mins"]<i]["flag"].quantile(0.95),
"99%":df[df["mins"]<i]["flag"].quantile(0.99)},ignore_index=True)
二:也可以通过使用concat(axis=1)的形式横向拼接
pd.concat([df1,df2,df3],axis=1)
三:如果是索引相同为键时,dataframe可以使用.join
df.join(df1,lsuffix="-x")
15.DataFrame的列进行交换(重新排列的顺序)
其实方法很多而且很简单,但是很容易突然在做数据框操作时候想使用方法去套用。因此在此做提醒
方法一:
直接进行选择即可 df[[cols]] 其中cols就是你重新排列的列名
方法二:
通过.loc或者.iloc进行选择 df.iloc[:,cols] 其中cols就是你重新排列的列名
**16.机器学习特征选择工具Yellowbrick
# Load the classification data set
data = load_data("occupancy")
# Specify the features of interest and the classes of the target
features = ["temperature", "relative humidity", "light", "C02", "humidity"]
classes = ["unoccupied", "occupied"]
# Extract the instances and target
X = data[features]
y = data.occupancy
# Import the visualizer
from yellowbrick.features import RadViz
# Instantiate the visualizer
visualizer = RadViz(classes=classes, features=features)
visualizer.fit(X, y) # Fit the data to the visualizer
visualizer.transform(X) # Transform the data
visualizer.poof() # Draw/show/poof the data
17.关于调用另外一个py文件
可以直接调用使用 import .py 前提是相同文件夹内,可以使用其函数。
如果要让其脚本运行,可以使用 os.system(“python a.py”) #记得冒号啊!
18.关于read_csv(4) 报错 have mixed types. Specify dtype option on import or set low_memory=False.
这里是由于某几列中的数据类型是混合在一起的了。所以有2种方式解决。
方法一:
读取文件的时候,将某一列的类型设置好。
pd.read_csv(r"",dtype={‘name’: ‘str’})
方法二:
读取文件时,设置参数 low_memory=False
pd.read_csv(r"",low_memory=False)
具体逻辑可以参考 链接
方法二中一旦csv文件过大,就会内存溢出;所以推荐用第1中解决方案
19.关于程序计时,以及使用global
Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global。
import time,datetime
startDtime = datetime.datetime.now() # 记录当前运行时间
print("Start time: " + str(startDtime))
start_time = time.time()
begin_time = time.time()
def time_count():
'''统计程序执行到此刻所耗时间'''
global start_time
print("Time elapse:%.3f s, total elapse:%.3f min" %(time.time() - start_time,(time.time() - begin_time)/60.0))
start_time = time.time()
20.关于if name ==“main”: 个人理解
当该.py文件自己单独运行的时候,会把if内外的代码都进行运行。即name后作为本身文件的名称
当该.py文件被其他程序使用Import导入的时候,其他程序中会自动运行该文件if以外的代码。即name后作为一个模块名称,比较好的是当你导入的时候if内其不会自动运行,其函数却可以调用。
21.关于Pandas读取数据优化,防止崩溃。
一.使用read_csv()的时候,如果当nrows读取行数超过800W条时,df_train占内存超过80G,在后续的步骤中涉及到切片和数据集复制时会直接崩溃,超过1200W条时会直接无法读取。首先考虑优化读取方式。
read_csv()参数:
na_values = #在读取的时候使用该参数,对数据集中的空值进行替换,比后续单独replace更快捷。
在1.中提到的chunksize= 读取数据后,分开后通过循环每次读取分块数据,再通过list拼接起来。
每次读取完一个chunk,都进行删除,释放对应内存
for chunk in pd.read_csv(path,header=None,sep=',',chunksize=200000,nrows=10000000,error_bad_lines=False,delimiter="\t",lineterminator="\n",
keep_default_na=True, na_values=na_vals):
df_tmp.append(chunk[1:])
del chunk
print("the chunk " + str(count) + " has been stored...")
count+=1
二.数据类型优化。
在读取数据的时候,可以提前对读取的数据列进行类型划定,并且相同数据类型也有大小内存之分,比如float型就有float16、float32和float64这些子类型,其分别使用了2、4、8个字节。dtype参数接受一个以列名(string型)为键字典、以Numpy类型对象为值的字典。
pd.read_csv(r" ",dtype={“age”:“np.float32”})