加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

初学pandas与seaborn(三)回归曲线生成以及csv数据导入

(2016-12-30 09:42:38)
标签:

anaconda

pandas

pycharm

seaborn

数据分析

分类: 【python与Anaconda科学计算】
  看个坐标图、点图的曲线啥的,seaborn还是比较方便的。这里可以用seaborn自带的样板库数据来写,也可以导入外部数据。外部数据是自己编的,点点不够多,不过能体会下pandas调用文件数据并用seaborn显示出来的全过程,对整个数据处理编程应该会有一些启发。上图:

自己编的数据点,时间关系数据点少了点,嘿嘿

http://s15/orignal/001nffw9zy77zoSgh4i6e
可以发现,刻意构造的相关性被显示出来了

好了,这是数据文件:
tips.csv
total_bill,tip,sex,smoker,day,time,size
16.99,1.01,Female,No,Sun,Dinner,2
10.34,1.66,Male,No,Sun,Dinner,3
21.01,3.5,Male,No,Sun,Lunch,3
23.68,3.31,Male,Yes,Sat,Dinner,2
24.59,3.61,Female,No,Sun,Dinner,4
30,5,Female,No,Sat,Dinner,6
29,3,Male,Yes,Sat,Dinner,5
28,3.5,Male,No,Sun,Lunch,6
10,3.31,Male,No,Sun,Dinner,1
9,3.61,Female,Yes,Sat,Dinner,1
64,10,Female,Yes,Sun,Dinner,8
30,4,Male,Yes,Sat,Lunch,5
20,5,Male,Yes,Sun,Dinner,3
24,4,Male,No,Sat,Lunch,4
18,3,Female,No,Sun,Dinner,2
17,1,Female,No,Sat,Dinner,3
16,2,Male,No,Sat,Dinner,2
19,2,Male,No,Sun,Lunch,2
23,4,Male,No,Sun,Dinner,3
22,2,Female,Yes,Sat,Dinner,3
30,1.01,Female,No,Sun,Dinner,5
40,1.66,Male,No,Sun,Dinner,5
33,3.5,Male,No,Sun,Lunch,5
35,18,Male,Yes,Sat,Dinner,6
36,3.61,Female,No,Sun,Dinner,5
38,5,Female,No,Sat,Dinner,5
42,15,Male,Yes,Sat,Dinner,6
44,3.5,Male,No,Sun,Lunch,6
49,3.31,Male,No,Sun,Dinner,5
46,10,Female,Yes,Sat,Dinner,6
47,20,Female,Yes,Sun,Dinner,6
43,11,Male,Yes,Sat,Lunch,7
61,12,Male,Yes,Sun,Dinner,5
51,6,Male,No,Sat,Lunch,8
52,8,Female,No,Sun,Dinner,7
58,8,Female,No,Sat,Dinner,7
55,8,Male,No,Sat,Dinner,8
57,5,Male,No,Sun,Lunch,7
53,6,Male,No,Sun,Dinner,8
62,14,Female,Yes,Sat,Dinner,10
复制到记事本并存为csv扩展名即可,tips.csv存储在python文件相同目录下

接下来是程序本体
# encoding:utf-8
import seaborn as sns
import pandas as pd

tips = pd.read_csv("tips.csv")
print tips
sns.jointplot("total_bill", "tip", tips, kind='reg')
sns.plt.show()
sns.plt.close()  # 用于清空之前的图表。若不清空,那么下一个图表会残留上一个图表的点

sns.lmplot("total_bill", "tip", tips, col="smoker")
sns.plt.show()
程序分析:

  我们用pandas库导入了tips.csv文件,然后选择total_bill(总账单)作为横坐标,tip(小费)作为纵坐标,tips对象作为panda数据集合。第一个图生成类型为reg,第二个图我们用是否smoker作为区分,生成了对比图。


  学习过程中还遇到一些莫名其妙的bug,一开始一个叫tips没有扩展名的文件是这样的……好吧,我醉了,这居然是一个build-in的测试数据,seaborn直接自己自带的?!我居然漏看了红色部分的注释:
# Load one of the data sets that come with seaborn
tips = sns.load_dataset("tips")
print tips
  看来我惯性思维,认为这个语句一定是导入外部测试数据的。然后就极其傻逼地在网上找啊找。言归正传,我将其打印出来,直接发现有243行数据:

Name: D, dtype: int32
     total_bill   tip     sex smoker   day    time  size
0         16.99  1.01  Female     No   Sun  Dinner     2
1         10.34  1.66    Male     No   Sun  Dinner     3
2         21.01  3.50    Male     No   Sun  Dinner     3
3         23.68  3.31    Male     No   Sun  Dinner     2
4         24.59  3.61  Female     No   Sun  Dinner     4
5         25.29  4.71    Male     No   Sun  Dinner     4
6          8.77  2.00    Male     No   Sun  Dinner     2
7         26.88  3.12    Male     No   Sun  Dinner     4
8         15.04  1.96    Male     No   Sun  Dinner     2
9         14.78  3.23    Male     No   Sun  Dinner     2
10        10.27  1.71    Male     No   Sun  Dinner     2
11        35.26  5.00  Female     No   Sun  Dinner     4
12        15.42  1.57    Male     No   Sun  Dinner     2
13        18.43  3.00    Male     No   Sun  Dinner     4
14        14.83  3.02  Female     No   Sun  Dinner     2
15        21.58  3.92    Male     No   Sun  Dinner     2
16        10.33  1.67  Female     No   Sun  Dinner     3
17        16.29  3.71    Male     No   Sun  Dinner     3
18        16.97  3.50  Female     No   Sun  Dinner     3
19        20.65  3.35    Male     No   Sat  Dinner     3
20        17.92  4.08    Male     No   Sat  Dinner     2
21        20.29  2.75  Female     No   Sat  Dinner     2
22        15.77  2.23  Female     No   Sat  Dinner     2
23        39.42  7.58    Male     No   Sat  Dinner     4
24        19.82  3.18    Male     No   Sat  Dinner     2
25        17.81  2.34    Male     No   Sat  Dinner     4
26        13.37  2.00    Male     No   Sat  Dinner     2
27        12.69  2.00    Male     No   Sat  Dinner     2
28        21.70  4.30    Male     No   Sat  Dinner     2
29        19.65  3.00  Female     No   Sat  Dinner     2
..          ...   ...     ...    ...   ...     ...   ...
214       28.17  6.50  Female    Yes   Sat  Dinner     3
215       12.90  1.10  Female    Yes   Sat  Dinner     2
216       28.15  3.00    Male    Yes   Sat  Dinner     5
217       11.59  1.50    Male    Yes   Sat  Dinner     2
218        7.74  1.44    Male    Yes   Sat  Dinner     2
219       30.14  3.09  Female    Yes   Sat  Dinner     4
220       12.16  2.20    Male    Yes   Fri   Lunch     2
221       13.42  3.48  Female    Yes   Fri   Lunch     2
222        8.58  1.92    Male    Yes   Fri   Lunch     1
223       15.98  3.00  Female     No   Fri   Lunch     3
224       13.42  1.58    Male    Yes   Fri   Lunch     2
225       16.27  2.50  Female    Yes   Fri   Lunch     2
226       10.09  2.00  Female    Yes   Fri   Lunch     2
227       20.45  3.00    Male     No   Sat  Dinner     4
228       13.28  2.72    Male     No   Sat  Dinner     2
229       22.12  2.88  Female    Yes   Sat  Dinner     2
230       24.01  2.00    Male    Yes   Sat  Dinner     4
231       15.69  3.00    Male    Yes   Sat  Dinner     3
232       11.61  3.39    Male     No   Sat  Dinner     2
233       10.77  1.47    Male     No   Sat  Dinner     2
234       15.53  3.00    Male    Yes   Sat  Dinner     2
235       10.07  1.25    Male     No   Sat  Dinner     2
236       12.60  1.00    Male    Yes   Sat  Dinner     2
237       32.83  1.17    Male    Yes   Sat  Dinner     2
238       35.83  4.67  Female     No   Sat  Dinner     3
239       29.03  5.92    Male     No   Sat  Dinner     3
240       27.18  2.00  Female    Yes   Sat  Dinner     2
241       22.67  2.00    Male    Yes   Sat  Dinner     2
242       17.82  1.75    Male     No   Sat  Dinner     2
243       18.78  3.00  Female     No  Thur  Dinner     2

好吧问题其实解决了。如果需要导入自己写的csv,请一定用pandas库。直接用seaborn的load_dataset函数是不行的,会报错:
tips = sns.load_dataset("tips.csv")
pandas.io.common.CParserError: Error tokenizing data. C error: Expected 1 fields in line 13, saw 2

按照stackoverflow提示的方法加了error_bad_lines=False后,
tips = sns.load_dataset("tips.csv", error_bad_lines=False)
又报错:
TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('S3') dtype('S3') dtype('S3')

最终解决办法,还是用回pandas库的read_csv方法:
tips = pd.read_csv("tips.csv")

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有