整个过程就是看别人代码,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:表示数据中有一个为空,则删除;