天池离线赛——移动推荐算法学习笔记1_数据预处理

整个过程就是看别人代码,https://blog.csdn.net/snoopy_yuan

然后弄懂每个步骤及相关方法;在此记录。

附一个关于DataFrame的基础操作的网址:https://www.cnblogs.com/zuizui1204/p/6423069.html

Part 1 读取数据中的问题:

1. 关于pandas中的dataframe和series:


Series:https://www.cnblogs.com/linux-wangkun/p/5903380.html

DataFrame:https://www.cnblogs.com/linux-wangkun/p/5903945.html

总结:Series只能有一列,多行;DataFrame相当于数据库中的表,多列多行;

基础知识:

python中的字典:

http://www.runoob.com/python/python-variable-types.html


2. os.path.split('path')[1]:

首先,os.path.split('path'),是获得路径为path的文件的位置,并切分split;输出结果是一个数组,第一个为路径,第二个为文件名;

参考:https://blog.csdn.net/sxingming/article/details/51475382

os.path.split(__file__)[1]:

参考:http://blog.chinaunix.net/uid-21961132-id-159389.html

__file__获得当前.py文件的完整路径;之后操作同上。


3. print函数:

pritn(''ran for %.2f m" % ((endtime-starttime)/60.)) ;m是后面的字符;跟格式化输出没关系;

%f,打印浮点数;%6.2f,小数点后打印两位;6,表示指定占位符宽度,即打印出来的这个数占几个字符的宽度;

参考:https://blog.csdn.net/qq_37482544/article/details/63720726 

及 https://www.cnblogs.com/plwang1990/p/3757549.html


Part 2 数据预分析中的问题

1. pandas中的get_chunk:

get_chunk可用于处理大批量数据,每次读取一部分;

使用:

data_user=pd.read_csv('path')

chunkSize=100

chunk=data_user.get_chunk(chunkSize)#即每次读取100条数据;

另外,read_csv方法也可设置chunkSize,如:data_user=pd.read_csv('path',chunkSize=100000)

适用于,有的csv文件巨大,读文件时出现异常;可使用上述两种方法;

参考:https://blog.csdn.net/zm714981790/article/details/51375475

https://blog.csdn.net/github_33934628/article/details/69938788


2. pd.value_counts():

该方法是个计数方法,输入参数为series类型数据,输出参数为series;其中索引为series中出现过的所有值,其值为频率。

且默认按值排序,默认升序;

参考:https://ask.csdn.net/questions/450194?sort=id

https://www.cnblogs.com/sunbigdata/p/7907674.html

如,df=DataFrame({'Q1':[1,3,4,3,4],

                                'Q2':[2,3,1,2,3],

                                'Q3':[1,5,2,4,4]})

count=df['Q2'].value_counts()

count为:

值 出现频率

1       1

2      2

3       2


4. pd.read_csv()方法的一些参数:

这里是为了将用户的每天的商品操作总次数进行可视化表示;

dateparse=lambda dates: pd.datetime.strptime(dates,'%Y%M%D %H')#设置日期格式

pd.read_csv('path',parse_dates=['times'],date_parser=dateparser,index_col=['times'],chunkSize=100000)

各参数含义:

parse_dates,将指定列解析为日期格式;

date_parser,用于解析日期的函数;

index_col,将指定列作为索引;

参考:https://www.jianshu.com/p/366aa5daaba9

https://www.cnblogs.com/datablog/p/6127000.html

https://blog.csdn.net/qq_18433441/article/details/56664505


5. DataFrame.shape:

df=pd.read_csv('path',chunkSize=100000)#读取数据,这里不重复写上面的了,假装已经设日期times列为索引;

rowCount=df[date].shape[0]

解释:

df[date],获得指定date的行数,形成一个临时的DataFrame;

df[date].shape,获得DateFrame的行数和列数,输出为(a,b)形式,a是行数,b是列数;(问:这个形式是叫元祖么?)

df[date].shape[0],就是获得第一个元素;

参考:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shape.html


6. import 与 from xx import xx:

import,导入模块,可出现在任何位置;

from module import name,从模块a中导入b函数;

from module import *,从模块a中导入所有函数;

则之后可以直接使用相应的函数;


7. Series.plot:

功能是作图;通过matplotlib.pyplot.show(),展示;


8. 导入自定义模块:

参考:https://blog.csdn.net/devil_2009/article/details/15816237

三种不同位置的导入方式:

1)需要引用的文件和当前文件在同一个文件夹下:

---folder

------data_analysis.py

------dict_csv.py


在data_analysis中引入dicti_csv中的row_dict2csv方法,可直接写作:import dict_csv 或 from dict_csv import * 


或 from dict_csv import row_dict2csv


(但其实我的文件结构就是这样的,但不知道为啥显示导入不了= =)

注意:一个项目是两个.py文件都在主项目下,就是项目下直接创建了两个.py文件,如上import,成功;

另一个项目是两个.py文件在主项目下的一个文件夹内,如上import,失败。

莫名成功:

from data_preanalysis.dict_csv import * #该种导入方式成功,其中data_preanalysis是两个.py文件所在的文件夹;

另外创建了__init__.py文件,不知道是不是也有影响。

2)两个文件不能放在同一个目录下:

---folder

------dict_csv.py

------otherfile.py

---data_preanalysis.py

方法:在folder下创建__init__.py文件,此时folder成为一个package而不是文件夹;

---folder

------dict_csv.py

------otherfile.py

------__init__.py

---data_preanalysis.py

导入方式:from folder.dict_csv import * 或 import folder.dict_csv 都可以;

3)两个文件不在同一个目录下,而是如下结构:

---folderA

------dict_csv.py

------otherfile.py

---folderB

------data_preanalysis.py

方法:同2)的处理方法;(未试验)

导入方式:同2)


9. pandas的merge方法:

实现将两个DataFrame的连接,功能相当于SQL中的各种连接;

使用:df1=DataFrame({'userId':[1,2,3,4],'classId':[5,6,7,8]})

          df2=DataFrame({'userId':[1,2,3,4],'userName':['adam','bob','cindy','david']})

          df3=pd.merge(df1,df2,on='userId',how='inner')

参数解释:on:表示以两个DataFram的哪个属性进行连接;当两个DataFrame的列名不同时,可使用left_on,right_on;

how:连接方式;默认值为inner,即内连接。(可复习数据库中的内连接,左连接,右连接的含义)

参考:https://blog.csdn.net/zhouwenyuan1015/article/details/77334889

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html


Part 3 基于规则的预测

1. DataFrame.isin(values)方法:

该方法实现比较dataframe中的数据是否在values中出现;若出现,则为true;否则为false。

针对values是不同的数据类型,比较方式有所不同,分为以下三种情况;

1)values是list类型:

则判断dataFrame中的数据是否有在values中出现过(不考虑出现位置);出现过,则为true。

举例:

a=pd.DataFrame({'A':[1,2,3],'B':['a','b','c']})

a.isin([1,3,'b'])

输出结果是:

      A        B

0  true  false

1  false false

2  true  true

2)values是dictionary类型:

则判断DataFrame在对应的列是否出现过;

举例:

a=pd.DataFrame({'A':[1,2,3],'B':['a','b','c']})

b={'A':[2,4],'B':['a','b','d']}

a.isin(b)

输出结果是:

      A        B

0  false  true

1  true   true

2  false  false

3)values是Series或DataFrame类型:

则判断DataFrame的元素是否在values中对应的位置(对应的行,对应的列)出现过;

举例:

a=pd.DataFrame({'A':[1,2,3],'B':['a','b','c']})

b=pd.DataFrame({'A':[1,4],'B':['a','b','d']})

a.isin(b)

输出结果是:

      A        B

0  true   true

1  false  true

2  false  false

参考:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html

利用isin方法,可对数据实现筛选;isin后结果为true、false组成的数据列;

如:df_34=df[df['behavior_type'].isin([3,4])],则得到结果为true的对应行;

参考:https://blog.csdn.net/qq_34264472/article/details/53195940


2. DataFrame.to_csv()方法:

把DataFrame文件写入到逗号分隔的csv文件中;一些参数说明:

path:即保存csv的位置;

columns:保留DataFrame的哪些列;

header:是否保留列名,默认为true;

index:是否保留索引,默认为true;

mode:写入方式,默认为'w';'a'表示append,即追加写入;

参考:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html

https://blog.csdn.net/toshibahuai/article/details/79034829


3. DataFrame.drop_duplicates()方法:

删除重复项;可指定列,意思是,这些列的值如果都一样,则删除;

参数:

keep:删除数据的方式,默认是first,表示保留第一个出现的,其后出现的都删除;

参考:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html


4. 这里写一个小问题,总是忘;

a=pd.DataFrame({'userId':[1,2],'userName':['alice','bob'],'userSex':['male','female']})

b=a['userId','userName']#表示保留指定列;


5. DataFrame.dropna()方法:

删除重复数据;

axis:取0或'index',1或'columns',表示如果是空数据,是删除行还是删除列;

how:取all或any,默认为any;any:表示数据中有一个为空,则删除;

猜你喜欢

转载自blog.csdn.net/shelly_Chestnut/article/details/80555479
今日推荐