请选择 进入手机版 | 继续访问电脑版

tag 标签: python经管大学堂:名校名师名课

相关帖子

版块 作者 回复/查看 最后发表
实证产业组织(Empirical Industrial Organization)BLP;R/matlab/Python代码 产业经济学 U8i1542180030 2023-12-20 0 214 U8i1542180030 2023-12-20 11:48:17
【邢不行|量化小讲堂系列44】历年排名前10的基金,在第2年表现如何?Python告诉你 attach_img 量化投资 邢不行 2019-4-25 52 7150 0532changri 2023-12-6 08:28:06
python下载安装后sklearn步骤 机器学习 希岛L 2023-10-29 0 225 希岛L 2023-10-29 19:10:51
[Download] Python Programming for the Absolute Beginner attachment python论坛 at2046 2011-5-4 6 4869 illdownload 2023-7-9 10:55:36
Python Cookbook attachment python论坛 xkdog 2013-6-7 7 5141 Myty383 2021-12-5 20:59:55
python的一些2013新书 attachment python论坛 xkdog 2013-8-7 17 6052 tianwk 2021-9-22 23:23:38
小白想问一下这种图是用么软件做出来的?谢谢 attach_img 新手入门区 yjw7958 2021-7-26 6 856 yjw7958 2021-8-6 11:09:09
python初学很好的一本书籍(适合小白) 新手入门区 18292986727 2021-7-27 0 1111 18292986727 2021-7-27 16:14:06
原文 python for data analysis pdf attachment python论坛 dgg32 2013-8-3 28 19475 AuHunter 2021-2-9 22:54:15
[Book] Financial Modelling in Python attachment python论坛 suzzon 2011-2-26 34 13329 联谊会 2020-12-7 14:03:54
抛弃matlab,直接使用python做量化分析 attach_img python论坛 nettoobad 2013-2-17 122 99105 zjjbevan 2020-5-21 15:35:41
python相关书籍 为了没有论坛币的朋友们 白送一周 尽情的下吧 attach_img python论坛 binok11 2013-2-25 264 37143 Lovesleepcat 2018-11-26 22:24:22
Bioinformatics Programming Using Python attachment python论坛 sunjijia 2011-1-4 4 4914 wmqy2004 2018-8-26 13:36:47
python 的统计模块也做得很好了,有人用python吗? python论坛 ilikeyahoo 2013-2-22 8 11964 幸运符 2018-6-28 22:29:50
悬赏 【1000币酬谢】如何用Python或者Perl抓取文本? - [悬赏 1 个论坛币] 悬赏大厅 pertain 2010-12-30 6 5105 树下千万年 2016-12-22 21:23:33
book 可爱的python attachment python论坛 cathycui 2013-2-26 5 3652 joesrd 2016-8-2 10:49:28
sax basic 和 python python论坛 rwxrwx 2009-1-31 1 5742 DM小菜鸟 2015-2-15 16:24:04
我在2012版的matlab里安装上了libsvm工具包,还要安装python吗? python论坛 butter212139 2013-3-16 3 4254 乙酰胆碱缺乏者 2015-2-4 02:59:01

相关日志

分享 使用python绘制简单的图表
auto_water 2017-4-5 15:19
本文介绍如果使用python汇总常用的图表,与Excel的点选操作相比,用python绘制图表显得比较比较繁琐,尤其提现在对原始数据的处理上。但两者在绘制图表过程中的思路大致相同,Excel中能完成的工作python大多也能做到。为了更清晰的说明使用python绘制图表的过程,我们在汇总图表的代码中进行注解,说明每一行代码的具体作用。并在文章的最后给出了自定义字体和图表配色的对应表。 准备工作 1 2 3 4 5 import numpy as np import pandas as pd #导入图表库以进行图表绘制 import matplotlib.pyplot as plt loandata=pd.DataFrame(pd.read_excel('loan_data.xlsx')) 折线图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #设置日期字段issue_d为loandata数据表索引字段 loandata = loandata.set_index('issue_d') #按月对贷款金额loan_amnt求均值,以0填充空值 loan_plot=loandata .resample('M').fillna(0) #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #创建一个一维数组赋值给a a=np.array( ) #创建折线图,数据源为按月贷款均值,标记点,标记线样式,线条宽度,标记点颜色和透明度 plt.plot(loan_plot,'g^',loan_plot,'g-',color='#99CC01',linewidth=3,markeredgewidth=3,markeredgecolor='#99CC01',alpha=0.8) #添加x轴标签 plt.xlabel('月份') #添加y周标签 plt.ylabel('贷款金额') #添加图表标题 plt.title('分月贷款金额分布') #添加图表网格线,设置网格线颜色,线形,宽度和透明度 plt.grid( color='#95a5a6',linestyle='--', linewidth=1 ,axis='y',alpha=0.4) #设置数据分类名称 plt.xticks(a, ('1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月') ) #输出图表 plt.show() 柱状图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #按用户等级grade字段对贷款金额进行求和汇总 loan_grade=loandata.groupby('grade') .agg(sum) #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #创建一个一维数组赋值给a a=np.array( ) #创建柱状图,数据源为按用户等级汇总的贷款金额,设置颜色,透明度和外边框颜色 plt.bar( ,loan_grade,color='#99CC01',alpha=0.8,align='center',edgecolor='white') #设置x轴标签 plt.xlabel('用户等级') #设置y周标签 plt.ylabel('贷款金额') #设置图表标题 plt.title('不同用户等级的贷款金额分布') #设置图例的文字和在图表中的位置 plt.legend( , loc='upper right') #设置背景网格线的颜色,样式,尺寸和透明度 plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4) #设置数据分类名称 plt.xticks(a,('A级','B级','C级','D级','E级','F级')) #显示图表 plt.show() 条形图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #创建一个一维数组赋值给a a=np.array( ) #创建条形图,数据源为分等级贷款金额汇总,设置颜色,透明度和图表边框 plt.barh( ,loan_grade,color='#99CC01',alpha=0.8,align='center',edgecolor='white') #添加x轴标题 plt.xlabel('贷款金额') #添加y轴标题 plt.ylabel('用户等级') #添加图表标题 plt.title('不同用户等级的贷款金额分布') #添加图例,并设置在图表中的显示位置 plt.legend( , loc='upper right') #设置背景网格线的颜色,样式,尺寸和透明度 plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4) #设置数据分类名称 plt.yticks(a,('A级','B级','C级','D级','E级','F级')) #显示图表 plt.show() 饼图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #设置饼图中每个数据分类的颜色 colors = #设置饼图中每个数据分类的名称 name= #创建饼图,设置分类标签,颜色和图表起始位置等 plt.pie(loan_grade,labels=name,colors=colors,explode=(0, 0, 0.15, 0, 0, 0),startangle=60,autopct='%1.1f%%') #添加图表标题 plt.title('不同用户等级的贷款金额占比') #添加图例,并设置显示位置 plt.legend( , loc='upper left') #显示图表 plt.show() 散点图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #按月汇总贷款金额,以0填充空值 loan_x=loandata .resample('M',how=sum).fillna(0) #按月汇总利息金额,以0填充空值 loan_y=loandata .resample('M',how=sum).fillna(0) #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #创建散点图,贷款金额为x,利息金额为y,设置颜色,标记点样式和透明度等 plt.scatter(loan_x,loan_y,60,color='white',marker='o',edgecolors='#0D8ECF',linewidth=3,alpha=0.8) #添加x轴标题 plt.xlabel('贷款金额') #添加y轴标题 plt.ylabel('利息收入') #添加图表标题 plt.title('贷款金额与利息收入') #设置背景网格线的颜色,样式,尺寸和透明度 plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='both',alpha=0.4) #显示图表 plt.show() 气泡图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #按月汇总贷款金额及利息 loan_x=loandata .resample('M',how=sum).fillna(0) loan_y=loandata .resample('M',how=sum).fillna(0) loan_z=loandata .resample('M',how=sum).fillna(0) #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #设置气泡图颜色 colors = #创建气泡图贷款金额为x,利息金额为y,同时设置利息金额为气泡大小,并设置颜色透明度等。 plt.scatter(loan_x,loan_y,s=loan_z,color=colors,alpha=0.6) #添加x轴标题 plt.xlabel('贷款金额') #添加y轴标题 plt.ylabel('利息收入') #添加图表标题 plt.title('贷款金额与利息收入') #设置背景网格线的颜色,样式,尺寸和透明度 plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='both',alpha=0.4) #显示图表 plt.show() 箱线图 1 2 3 4 5 6 7 8 9 10 11 12 #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #创建箱线图,数据源为贷款来源,设置横向显示 plt.boxplot(loandata ,1,'rs',vert=False) #添加x轴标题 plt.xlabel('贷款金额') #添加图表标题 plt.title('贷款金额分布') #设置背景网格线的颜色,样式,尺寸和透明度 plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='both',alpha=0.4) #显示图表 plt.show() 直方图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #图表字体为华文细黑,字号为15 plt.rc('font', family='STXihei', size=15) #创建直方图,数据源为贷款金额,将数据分为8等份显示,设置颜色和显示方式,透明度等 plt.hist(loandata ,8,normed=1, histtype='stepfilled',facecolor='#99CC01', rwidth=0.9,alpha=0.6,edgecolor='white') #添加x轴标题 plt.xlabel('贷款金额') #添加y轴标题 plt.ylabel('概率') #添加图表标题 plt.title('贷款金额概率密度') #设置背景网格线的颜色,样式,尺寸和透明度 plt.grid(color='#95a5a6',linestyle='--', linewidth=1,axis='y',alpha=0.4) #显示图表 plt.show() 自定义字体及配色 图表中所使用的字体,可以使用下面的字体名称替换family=后面的内容以改变图表中所显示的字体。 图表中的颜色,可以直接使用颜色名称,也可以使用简称来设置图表中使用的颜色,本文中没有使用默认的颜色,而是使用了自定义颜色。 自定义颜色的色号,本文中使用的是Hex色号,下面给出了Hex和RGB的对应关系,以及相应的颜色。可以使用下面的Hex色号替换本文中图表的颜色。 Read more: http://bluewhale.cc/2016-08-26/draw-a-simple-chart-using-python.html#ixzz4dMDKaHkE
13 次阅读|0 个评论
分享 使用python进行数据清洗
auto_water 2017-4-5 15:09
数据清洗是一项复杂且繁琐(kubi)的工作,同时也是整个数据分析过程中最为重要的环节。有人说一个分析项目80%的时间都是在清洗数据,这听起来有些匪夷所思,但在实际的工作中确实如此。数据清洗的目的有两个,第一是通过清洗让数据可用。第二是让数据变的更适合进行后续的分析工作。换句话说就是有”脏”数据要洗,干净的数据也要洗。本篇文章将介绍几种简单的使用python进行数据清洗的方法。 开始之前还是先在python中导入需要使用的库文件,然后进行数据读取,并创建名为loandata的数据表。这里为了更好的展示清洗的步骤和结果,我们使用的是lendingclub公开数据中的一小部分。 1 2 3 import numpy as np import pandas as pd loandata=pd.DataFrame(pd.read_excel('loandata.xlsx')) 数据清洗的目的有两个,第一是通过清洗让脏数据变的可用。这也是我们首先要解决的问题。无论是线下人工填写的手工表,还是线上通过工具收集到的数据,又或者是CRM系统中导出的数据。很多数据源都有一些这样或者那样的问题,例如:数据中的重复值,异常值,空值,以及多余的空格和大小写错误的问题。下面我们逐一进行处理。 数据表中的重复值 第一个要处理的问题是数据表中的重复值,pandas中有两个函数是专门用来处理重复值的,第一个是duplicated函数。Duplicated函数用来查找并显示数据表中的重复值。下面是使用这个函数对数据表进行重复值查找后的结果。 1 loandata.duplicated() 这里有两点需要说明:第一,数据表中两个条目间所有列的内容都相等时duplicated才会判断为重复值。(Duplicated也可以单独对某一列进行重复值判断)。第二,duplicated支持从前向后(first),和从后向前(last)两种重复值查找模式。默认是从前向后进行重复值的查找和判断。换句话说就是将后出现的相同条件判断为重复值。在前面的表格中索引为4的1311748和索引为1的条目相同。默认情况下后面的条目在重复值判断中显示为True。 Pandas中的drop_duplicates函数用来删除数据表中的重复值,判断标准和逻辑与duplicated函数一样。使用drop_duplicates函数后,python将返回一个只包含唯一值的数据表。下面是使用drop_duplicates函数后的结果。与原始数据相比减少了3行,仔细观察可以发现,drop_duplicates默认也是使用了first模式删除了索引为4的重复值,以及后面的另外两个重复值。 1 loandata.drop_duplicates() 数据表中的空值 第二个要处理的问题是数据表中的空值,在python中空值被显示为NaN。在处理空值之前我们先来检查下数据表中的空值数量。对于一个小的数据表,我们可以人工查找,但对于较为庞大的数据表,就需要寻找一个更为方便快捷的方法了。首先,对关键字段进行空值查找。这里我们分别选择了对loan_amnt字段和annual_inc字段查找空值。 Pandas中查找数据表中空值的函数有两个,一个是函数isnull,如果是空值就显示True。另一个函数notnull正好相反,如果是空值就显示False。以下两个函数的使用方法以及通过isnull函数获得的空值数量。 1 loandata.isnull() 1 loandata.notnull() 通过isnull函数和value_counts函数分别获得了loan_amnt列和annual_inc列中的空值数据量。 对于空值有两种处理的方法,第一种是使用fillna函数对空值进行填充,可以选择填充0值或者其他任意值。第二种方法是使用dropna函数直接将包含空值的数据删除。 1 loandata.fillna(0) 1 loandata.dropna() 这里我们选择对空值数据进行填充,首先处理loan_amnt列中的空值。通过totalpymnt字段和total_tec_int字段值相减计算出loan_amnt列中的近似值。因为这里除了利息以外还可能包括一些逾期费,手续费和罚息等,所以只能获得一个实际贷款金额近似值。由于贷款金额通常是一个整数,因此我们在代码的最后对格式进行了转换。 1 loandata =loandata .fillna(loandata -loandata ).astype(np.int64) 对于annual_inc列,在原始数据表中没有可用的辅助列进行计算,因此我们选择用现有数据的均值进行填充。这里可以看到贷款用户的收入均值为50060美金。使用这个值对annual_inc中的空值进行填充。 1 loandata =loandata .fillna(loandata .mean()) 数据间的空格 第三个要处理的是数据中的空格。空格会影响我们后续会数据的统计和计算。从下面的结果中就可以看出空格对于常规的数据统计造成的影响。 查看数据中的空格 我们再对loan_status列进行频率统计时,由于空格的问题,相同的贷款状态被重复计算。造成统计结果不可用。因此,我们需要解决字段中存在的空格问题。 1 loandata .value_counts() 去除数据中的空格 Python中去除空格的方法有三种,第一种是去除数据两边的空格,第二种是单独去除左边的空格,第三种是单独去除右边的空格。 1 loandata =loandata .map(str.strip) 1 loandata =loandata .map(str.lstrip) 1 loandata =loandata .map(str.rstrip) 这里我们使用去除两边的空格来处理loan_status列中的空格。以下是具体的代码和去除空格后的结果。 重新查看loan_status列中每种贷款状态的频率,之前空格造成的影响已经没有了,但这里还有个问题,就是大小写的问题。因此,我们还需要对每种贷款状态的大小写进行统一化处理。这是我们第四个要处理的问题。 大小写转换 大小写转换的方法也有三种可以选择,分别为全部转换为大写,全部转换为小写,和转换为首字母大写。 1 loandata =loandata .map(str.upper) 1 loandata =loandata .map(str.lower) 1 loandata =loandata .map(str.title) 这里我们将所有贷款状态转换为首字母大写模式,并再次进行频率统计。从下面的结果中可以看出,结果以及消除了空格和大小写字母混乱的影响。清晰的显示了贷款的三种状态出现的频率。 最后我们还需要对数据表中关键字段的内容进行检查,确保关键字段中内容的统一。主要包括数据是否全部为字符,或数字。下面我们对emp_length列进行检验,此列内容由数字和字符组成,如果只包括字符,说明可能存在问题。下面的代码中我们检查该列是否全部为字符。答案全部为False。 1 loandata .apply(lambda x: x.isalpha()) 除此之外,还能检验该列的内容是否全部为字母或数字。或者是否全部为数字。 1 loandata .apply(lambda x: x. isalnum ()) 1 loandata .apply(lambda x: x. isdigit ()) 数据中的异常和极端值 第五个要处理的问题是数据中的异常值和极端值,发现异常值和极端值的方法是对数据进行描述性统计。使用describe函数可以生成描述统计结果。其中我们主要关注最大值(max)和最小值(min)情况。 检查异常和极端值 下面是对数据表进行描述统计的结果,其中loan_amnt的最大值和最小值分别为100000美金和36美金,这不符合业务逻辑,因此可以判断为异常值。 1 loandata.describe().astype(np.int64).T 异常数据替换 对于异常值数据我们这里选择使用replace函数对loan_amnt的异常值进行替换,这里替换值选择为loan_amnt的均值。下面是具体的代码和替换结果。 1 loandata.replace( ,loandata .mean()) 数据清洗的第二个目的是让数据更加适合后续的分析工作。提前对数据进行预处理,后面的挖掘和分析工作会更加高效。这些预处理包括数据格式的处理,数据分组和对有价值信息的提取。下面我们逐一来介绍这部分的操作过程和使用到的函数。 更改数据格式 第一步是更改和规范数据格式,所使用的函数是astype。下面是更改数据格式的代码。对loan_amnt列中的数据,由于贷款金额通常为整数,因此我们数据格式改为int64。如果是利息字段,由于会有小数,因此通常设置为float64。 1 loandata =loandata .astype(np.int64) 在数据格式中还要特别注意日期型的数据。日期格式的数据需要使用to_datatime函数进行处理。下面是具体的代码和处理后的结果。 1 loandata =pd.to_datetime(loandata ) 格式更改后可以通过dtypes函数来查看,下面显示了每个字段的数据格式。 1 loandata.dtypes 数据分组 第二步是对数据进行分组处理,在数据表的open_acc字段记录了贷款用户的账户数量,这里我们可以根据账户数量的多少对用户进行分级,5个账户以下为A级,5-10个账户为B级,依次类推。下面是具体的代码和处理结果。 1 2 3 bins = group_names = loandata = pd.cut(loandata , bins, labels=group_names) 首先设置了数据分组的依据,然后设置每组对应的名称。最后使用cut函数对数据进行分组并将分组后的名称添加到数据表中。 数据分列 第四步是数据分列,这个操作和Excel中的分列功能很像,在原始数据表中grade列中包含了两个层级的用户等级信息,现在我们通过数据分列将分级信息进行拆分。数据分列操作使用的是split函数,下面是具体的代码和分列后的结果。 1 grade_split = pd.DataFrame((x.split('-') for x in loandata.grade),index=loandata.index,columns= ) 完成数据分列操作后,使用merge函数将数据匹配会原始数据表,这个操作类似Excel中的Vlookup函数的功能。通过匹配原始数据表中包括了分列后的等级信息。以下是具体的代码和匹配后的结果。 1 loandata=pd.merge(loandata,grade_split,right_index=True, left_index=True) Read more: http://bluewhale.cc/2016-08-21/python-data-cleaning.html#ixzz4dMAdrcGL
14 次阅读|0 个评论
分享 使用python进行简单的数据分析
auto_water 2017-4-5 14:30
1.开始前的准备工作 使用Python进行数据分析之前,需要预先导入相对应的功能库。数据分析最常用的库包括用于数值计算的numpy,基于numpy构建的用于科学计算的Pandas库,用于数据可视化的matplotlib和提供各种操作系统功能接口的OS库。我们将这几个库导入到python中, import后是导入库的名称 as后是库的简称。例如pandas库 的简称是pd,在后面的代码中看到pd就表示这个操作使用了pandas库。具体代码如下: 1 2 3 4 import os as os import pandas as pd import numpy as np import matplotlib.pyplot as plt 导入功能库后,就可以开始读取数据了。这里需要注意的是如果数据文件没有保存在Jupyter Notebook的工作目录中,在导入的过程中需要说明数据所在的路径。如果你觉得输入路径太麻烦的话,可以使用OS库查看或更高操作系统中的工作目录。将数据文件直接拷到Jupyter Notebook的工作目录中,通过下面的代码可 以查看Jupyter Notebook的工作目录位置。 1 os.getcwd() 或者将数据所在位置的路径设置为工作目录。具体方法如下: 1 os.chdir('C:\\Users\\cliffwang\\Desktop\\python') 我们将Lending Club的数据保存在Jupyter Notebook工作目录开始读取数据。Python可以读取多种数据格式,如csv,xls和txt等等。Lending Club的数据源是csv格式的。我们通过下面的代码完成读取数据和创建数据表的工作。 1 lc=pd.DataFrame(pd.read_csv('LoanStats3a.csv',header=1)) 在上面读取数据的代码中,使用了pandas库(pd)中的功能,首先读取LoanStats3a.csv文件,并设置标题行header=1。然后将读取的csv文件转成DataFrame并将这个数据表取名lc。 2.数据内容预览 数据读取工作完成后,可以开始对数据进行简单的预览。预览内容主要包括了解数据表的大小,字段的名称,数据格式等等。为接下来的数据分析工作做准备。 首先查看我们刚刚读取数据表的大小。通过下面的的结果可以看到Lending Club的数据表有4万多行,111个字段。想要进一步查看数据表中更具体的内容可以通过后面的代码来实现。 1 lc.shape Columns是查看表中各个字段名称的代码,以方便后续的分析工作。这里由于字段数量较多,python只列出了一部分字段的名称。 1 lc.columns 我们继续查看数据表中具体的数据内容,由于这个数据表行数较多我们不查看所有数据,只查看开始和结束的几行。下面的的结果中显示了数据表前5行的数据内容。head后面的()括号中可以输入要查看的具体行数,为空时默认只显示前5行的数据。在前5行的数据表中可以发现,很多字段中都是NaN值,这可能导致后面 的字段不可用。不过到底包含多少NaN值,我们在后面的数据清洗部门会进行详细的统计。 1 lc.head() tail显示数据表尾部的数据,和head一样tail后面的()中可以输入要查看的具体行数,这里我们输入3表示查看数据表后3行的数据。为空时默认显示最后5行的数据。下面的结果中可以看出id字段最后两行包含了一些其他的信息,而其他字段中并不包含这些信息是NaN值。 1 lc.tail(3) 最后查看数据表中各个字段的类型,确定数据表中包含哪些类型的数据,是否需要进行格式转换等等。这里发现日期字段的格式为object,需要转换为日期格式。 1 lc.dtypes 在数据内容概览部分我们大致了解了数据表中的信息,同时也发现表中包含很多NaN值,以及日期格式转换的问题。这些问题将在后面的数据清洗部分进行解决。 3,数据清洗 在数据概览部分中发现的问题需要通过数据清洗进行解决。这部分主要解决前面发现的NaN值和日期格式转换问题。通过查看数据表中的空值情况可以发现,前面的字段中NaN值较少,NaN值主要集中在后面的一些字段中。 1 lc.isnull() 对前面查看的NaN值情况使用SUM进行汇总,可以获得每个字段中具体的NaN值数量。在下面的结果中,除了id字段以外,几乎每个字段都有NaN值。在数据预览的部分,我们发现id值后面有两行汇总数据,因此判断Member,loan_amnt等前面的大部分字段的NaN值是由于这最后这两行信息造成的。而后面字段NaN值达到了4 万多条,几乎与数据表总行数一致,因此我们舍弃这些字段,只对前面的字段进行统计。 1 lc.isnull().sum() 在python中解决NaN值有两个方法,可以统一填充为0,也可以将包含NaN值的行删除。我们先保留这些字段,在后面的使用过程中再进行填充。 对于日期字段我们使用to_datetime来进行日期格式的转换。下面的命令中将数据表中的issue_d字段更改为日期格式并重新赋给issue_d字段。从查看的结果中可以看出通过格式转换issue_d字段的格式已经从object变成了datetime64。 1 lc =pd.to_datetime(lc ) 4,关键指标概览 清洗后的数据表可以开始进行分析工作,首先是对一些关键汇总指标的统计,对于Lending Club这些关键指标包括总贷款次数,总贷款金额,总利息收入等等。 对数据表中member_id字段进行计数,获得总的贷款次数。这与Excel中的count函数基本一致。 1 lc .count() 对数据表中member_id字段进行唯一值计数,获得总贷款人数。这里贷款次数与人数基本一致。猜测这个值应为贷款次数。 1 len(lc .unique()) 对数据表中loan_amnt字段进行求和,获得总贷款金额。这与Excel中的sum函数基本一致。 1 lc .sum() 将贷款金额分布绘制成箱线图可以看出,贷款均值为10000元。大部分贷款的金额都集中在5000到15000之间。 plt.boxplot(lc ) plt.show() 换成直方图再看下,5000美金一个区间,与之前的结果类似,15000以下的贷款居多,其中最多的是5000到10000的区间。大额的贷款也有但笔数较少,最高的一笔35000美金。这些绘图功能我们使用了matplotlib库(plt)。 1 2 3 bins = plt.hist(lc ,bins,normed=1, histtype='bar', rwidth=1) plt.show() 从2017到2011年贷款笔数增长趋势看,虽然中间贷款笔数整体呈快速增长趋势,并且增长速度非常快,从开始每月几十笔到近2500笔。这应该与美国人的理财观念有关系。在后面的贷款用途分析中也可以发现,他们的贷款目的和用途非常广泛,有些甚至有点奇怪。贷款目的可能是为了一次旅行,结婚,甚至还有一个贷 款目的写的是为了自由。 1 2 3 4 lc.sort(columns='issue_d',ascending=False) issue_date=lc.groupby('issue_d').count() plt.plot(issue_date ,linewidth=3) plt.show() 继续对数据表中total_rec_in字段进行求和,获得总利息收入金额。除了利息收入以外,Lending Club还有一部分收入是罚息和类似手续费的收入。这里我们并没有包括这些收入,只是简单sum了贷款利息收入。 1 lc .sum() 最后再对表中各个字段做个描述统计,看下数据的集中度与离散情况,这里主要关注最大值,最小值和标准差等。由于字段较多,我们在描述统计的命令后面加了一个.T,对数据进行转置,这相当于Excel中的TRANSPOSE函数。 1 lc.describe().T 从描述统计的结果可以发现,贷款的最小金额为500美金,最大金额为35000美金。用户收入最少为1896美金,最多为6000000美金。 5,用户属性分析 Lending Club的数据表中包含很多与用户相关的字段,例如用户收入,贷款用途,用户等级,职位,所在地区等等。我们可以通过这些字段从多个维度做个贷款用户画像。 首先是收入情况,Lending Club的贷款用户收入差距还是挺高的,从1-2万美金/年到30-40万美金/年的都有。我们以5万美金/年对贷款用户的收入分布进行了统计。从下面的直方图中可以看出,大部分贷款用户收入在10万美金/年以下。高收入的贷款用户数量很少。 1 2 3 bins = plt.hist(lc ,bins, histtype='bar', rwidth=1) plt.show() 前面的贷款金额分布与用户收入非常相似,小额贷款高于大额贷款。那么贷款金额的大小与贷款用户的收入之间是否有联系呢?我们对用户收入和贷款金额进行相关分析。从下面的结果中可以看出两者的相关系数仅为0.27,推翻了我们之前的假设,也就是说并不是收入越高的人贷款金额也越高。 1 2 c=lc ] c.corr() 了解了用户的收入分布情况后,我们再来逐一看下其他维度的用户属性。贷款目的分布中,debt_consolidation(债务合并)的数量最高,也就是借新还旧。其次是credit_card(还信用卡)。第三名是其他,第四名的是home_improvement(家装)。后面还有婚礼,医疗,教育和度假等等。贷款目的非常多元化。下面的这些 贷款目的是Lending Club整理并汇总后的信息。 1 lc .value_counts() 再细一级的贷款目的内容就更加庞杂和有意思了。真的能感觉到美国人做什么事情都通过贷款来实现。 1 lc .value_counts() 从信用等级分布来看,Lending Club中大部分用户为B和A级,G级用户数量较少。大部分用户都拥有较高的信用等级。 1 lc .value_counts() 数据表中的emp_title字段记录了用户的职位名称,简单的统计后发现贷款用户的职业分布非常广泛。其中排第一的是US Army。其次为Bank of America。后面还包括IBM,ATT,UPS的用户。 1 lc .value_counts() 在工作年限上贷款用户的分布非常极端,数量排名第一的是工作10年以上,第二名是工作小于1年。第三名是工作2年。可见刚毕业的年轻人和30岁以上的人是贷款的主要人群。年轻人刚开始工作,欲望大于收入,需要贷款来实现需求。岁数大一些的人竞争力逐渐下降,负担变重,也需要靠贷款来周转。 1 lc .value_counts() 从贷款人的房屋情况来看,大部分用户在租房,其次排名第二的用户房屋进行了抵押贷款,自己拥有房屋的仅为3251人,排名第三。 1 lc .value_counts() 从地域的分布来看排名第一个的是加利福尼亚州,第二是纽约州,第三是佛罗里达州 。对美国地理不太熟悉,不清楚为什么是这三个州的贷款用户数较高。据说Lending Club为了降低坏账率有一套投资人与贷款人的职能匹配系统,里面包含地理位置的匹配,我猜测也许这三个州的投资人较多吧。 1 lc .value_counts() 6,产品数据分析 了解完贷款用户的属性后再来看下Lending Club产品。这里我们主要关注Lending Club的贷款利率和贷款期限情况。 从贷款利率的角度来看,Lending Club的贷款利率从5%到25%跨度较大,并且每个人的利率都不一样,即使同样借款金额和期限的两个贷款人,也可能有不同的贷款利率,这些利息是Lending Club对贷款人评估后计算出来的。粗略来看贷款利息依据用户的信用等级变化而变化,A级用户贷款利率低,D和E级或者更低的等 级用户贷款利率普遍较高。 1 lc .value_counts() 从贷款期限角度来看,Lending Club的贷款都为长期贷款,分为36个月和60个月两类。很难想象美国人借500美金还要分36个月还清贷款。 1 lc .value_counts() 从饼图上可以更清楚的看到两类贷款期限的占比情况,约75%的贷款为36个月的,25%为60个月的期限。 1 2 3 4 labels = '36 months', '60 months ' colors = plt.pie(lc .value_counts(),labels=labels,colors=colors,shadow=True,startangle=90) plt.show() 两个贷款期限对应的金额和笔数情况来看,60个月的贷款金额占比要高于笔数的占比,可见60个月中应该有一部分为大金额贷款。 1 lc.groupby('term') .agg( ) 7,运营数据分析 从运营的角度来分析,Lending Club的贷款都放给了那类用户,又从哪些用户身上获得了最多的利息收入呢?从用户信用等级维度下来看贷款与利息的对比。在贷款金额和笔数上Lending Club主要贷款给信用等级较高的客户,因此A,B,C三个等级的贷款用户无论是从获得的贷款笔数和金额上都是较高的,随着等级的下 降获得的贷款笔数和金额逐渐减少。而从收取的总利息上来看,Lending Club从中间和较低信用等级用户身上获得的利息收入要明显高于信用等级较高的用户。这也是Lending Club一贯的策略,对信用等级较差的人收取较高的利息来补偿可能的违约风险。这里需要说明的是Lending Club是的收益来自于收取贷款及投资 方的贷款交易的手续费和管理费,而并非息差。 以下是分等级贷款金额和利息收入金额笔数对比情况,具体代码如下:这里使用了分类汇总功能,将数据表中的loan_amnt和total_rec_int按grade维度进行汇总,并分别进行计数和求和。 1 lc.groupby('grade') .agg( ) 换个角度从贷款期限维度来分析,60个月的贷款笔数和金额明显小于36个月。但从获得的利息收入情况来看正好相反,Lending Club从60个月的贷款中获得的利息收入要明显高于36个月。贷款期限越长,对于投资人的风险越大,但相应的收益也越高。 以下是分期限贷款金额和利息收入金额及笔数对比情况,具体代码如下:这里同样使用了分类汇总功能。 1 lc.groupby('term') .agg( ) 8,风控数据分析 从风险控制的角度分析,随着Lending Club贷款笔数的增长,Charged Off的数量也随之增加,以下是Charged Off的变化趋势图。 1 2 3 4 5 6 x=lc.loc =="Charged Off")] x x.groupby('issue_d').count() y=x.groupby('issue_d').count() plt.plot(y ) plt.show() 从贷款状态的角度分析,共有约6000笔贷款出现Charged Off的情况。另外还有20单在宽恕期限内还款,8笔贷款延迟半个月到1一个月还款,24比贷款延迟1-3个月还款。 以下是分贷款状态金额和笔数对比情况,具体代码如下:这里使用了类似Excel数据透视表的功能,行为贷款状态,数值为贷款的金额和笔数汇总值。 1 pd.pivot_table(lc,index= ,values= ,aggfunc= ) 在上面数据表的基础上增加用户信用等级维度再来看下,信用等级较高的用户Charged Off情况较少,信用等级低的用户由于获得贷款的笔数相对较低,所以看起来Charged Off的数量也较低,但占比却较高。 以下是分等级贷款状况金额和笔数对比的情况,具体代码如下:这里依然使用了类似Excel数据透视表的功能,在之前的基础上增加了列字段,并设定贷款用户等级为列字段的值。 1 pd.pivot_table(lc,index= ,values= ,columns= ,aggfunc= ,fill_value=0) 再从贷款用途的维度来分析,Charged Off最高的是debt_consolidation(债务合并),也就是借新债还旧债的情况,这种属于风险较高的一种贷款目的。这是一种比较粗糙的推测结果,更准确的情况还需要看每类贷款目的自身Charged Off的比率情况才能准确判断。 以下是分贷款用途的贷款状况金额和笔数对比情况,具体代码如下: 1 pd.pivot_table(lc,index= ,values= ,columns= ,aggfunc= ,fill_value=0) 【所有文章及图片版权归 蓝鲸(王彦平)所有
13 次阅读|0 个评论
分享 python工具下载
xulimei1986 2017-3-23 21:08
Anaconda-2.2.0-Windows-x86_64
0 个评论
分享 日常组合监控
不诉 2017-2-10 13:53
用python取sqlserver实时行情数据,与产品组合匹配后,推送给influxdb 事件模块代码: # encoding: UTF-8 # 系统模块 from Queue import Queue , Empty from threading import * ######################################################################## class EventManager : #---------------------------------------------------------------------- def __init__ ( self ): """初始化事件管理器""" # 事件对象列表 self .__eventQueue = Queue() # 事件管理器开关 self .__active = False # 事件处理线程 self .__thread = Thread( target = self .__Run) # 这里的__handlers是一个字典,用来保存对应的事件的响应函数 # 其中每个键对应的值是一个列表,列表中保存了对该事件监听的响应函数,一对多 self .__handlers = {} #---------------------------------------------------------------------- def __Run ( self ): """引擎运行""" while self .__active == True : try : # 获取事件的阻塞时间设为1秒 event = self .__eventQueue.get( block = True , timeout = 1 ) self .__EventProcess(event) except Empty: pass #---------------------------------------------------------------------- def __EventProcess ( self , event): """处理事件""" # 检查是否存在对该事件进行监听的处理函数 if event.type_ in self .__handlers: # 若存在,则按顺序将事件传递给处理函数执行 for handler in self .__handlers : handler(event) #---------------------------------------------------------------------- def Start ( self ): """启动""" # 将事件管理器设为启动 self .__active = True # 启动事件处理线程 self .__thread.start() #---------------------------------------------------------------------- def Stop ( self ): """停止""" # 将事件管理器设为停止 self .__active = False # 等待事件处理线程退出 self .__thread.join() #---------------------------------------------------------------------- def AddEventListener ( self , type_ , handler): """绑定事件和监听器处理函数""" # 尝试获取该事件类型对应的处理函数列表,若无则创建 try : handlerList = self .__handlers except KeyError : handlerList = = handlerList # 若要注册的处理器不在该事件的处理器列表中,则注册该事件 if handler not in handlerList: handlerList.append(handler) #---------------------------------------------------------------------- def RemoveEventListener ( self , type_ , handler): """移除监听器的处理函数""" #读者自己试着实现 #---------------------------------------------------------------------- def SendEvent ( self , event): """发送事件,向事件队列中存入事件""" self .__eventQueue.put(event) ######################################################################## """事件对象""" class Event : def __init__ ( self , type_= None ): self .type_ = type_ # 事件类型 self .list = 主程序代码 #!/usr/bin/python # -*- coding: UTF-8 -*- import pymssql import time import datetime #import numpy import decimal #import threading from influxdb import InfluxDBClient #from datetime import datetime #from threading import * from EventManager import * dbhost = '192.168.1.101' dbuser = 'jiyang.wang' dbuser_password = 'Amc_0001' dbhost1 = '10.200.66.125' user = 'root' password = 'root' TradingDB = 'TradingDB' TShengYunDB = 'TShengYunDB' HBTG = 'HBTG' indbname = 'DailyPositionDB' host = 'localhost' port = 8086 StatArb2_Target_500 = dObPV8hL27H26 = dObPV10hL24H23 = GE_PE = Sig_1 = H8 = PVI = V2 = VM1 = E2 = tick_IF = * num client = InfluxDBClient(host , port , user , password , indbname) #事件名称 行情 EVENT_Tick = 'tick' #事件源 公众号 class PublicAccounts : def __init__ ( self , eventManager): self .__eventManager = eventManager def Get_Tick ( self ): #事件对象,新行情进来 var = 1 event = Event( type_ =EVENT_Tick) con = pymssql.connect(dbhost , dbuser , dbuser_password , TShengYunDB , charset = 'utf8' ) while var == 1 : current_timestamp = datetime.datetime.now() current_timestamp = current_timestamp - datetime.timedelta( minutes = 2 ) current_timestamp = current_timestamp.strftime( "%H:%M:%S" ) # current_timestamp = '14:55:00' if current_timestamp '15:00:00' : break if (current_timestamp '11:30:00' and current_timestamp '13:00:00' ) or current_timestamp '09:30:00' : time.sleep( 3 ) continue sql1 = '''select AA. * from HB_lnk.HBTG.dbo.Tick_SH AA join(select max (id) as id from HB_lnk.HBTG.dbo.Tick_SH A where %s group by tkr ) BB on AA.id=BB.id union all select AA. * from HB_lnk.HBTG.dbo.Tick_SZ AA join( select max (id) as id from HB_lnk.HBTG.dbo.Tick_SZ A where %s group by tkr ) BB on AA.id=BB.id''' try : cur1 = con.cursor() cur1.execute(sql1 , (current_timestamp , current_timestamp)) global tick tick = cur1.fetchall() except Exception , err: print "error: %s" % str (err) event.list = tick print ( "Tick is coming!" ) #发送事件 #sql1 = '''select AA.* from HB_lnk.HBTG.dbo.Tick_SH AA join(select max(id) as id from HB_lnk.HBTG.dbo.Tick_SH A where %s group by tkr ) BB on AA.id=BB.id union all select AA.* from HB_lnk.HBTG.dbo.Tick_SZ AA join( select max(id) as id from HB_lnk.HBTG.dbo.Tick_SZ A where %s group by tkr ) BB on AA.id=BB.id''' #cur1 = con.cursor() #cur1.execute(sql1, (current_timestamp, current_timestamp)) #global tick_IF #tick_IF = cur1.fetchall() #event.list_IF = tick_IF #print("Tick is coming!") self .__eventManager.SendEvent(event) time.sleep( 3 ) #print u'公众号发送新文章\n' #监听器 订阅者 class Listener : def __init__ ( self , username): self .__username = username #监听器的处理函数 读文章 def StatArb2_Target_500 ( self , event): self .__username current_tick = event.list a = len (StatArb2_Target_500) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == StatArb2_Target_500 : b = round (StatArb2_Target_500 , 4 ) c = current_tick d = StatArb2_Target_500 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) # portfolio = (StatArb2_Target_500 , StatArb2_Target_500 , StatArb2_Target_500 , current_tick ) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "StatArb2_Target_500 working working!" ) # dObPV8hL27H26 def dObPV8hL27H26 ( self , event): self .__username current_tick = event.list a = len (dObPV8hL27H26) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == dObPV8hL27H26 : b = round (dObPV8hL27H26 , 4 ) c = current_tick d = dObPV8hL27H26 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "dObPV8hL27H26 working working!" ) #dObPV9hL23H22 def dObPV9hL23H22 ( self , event): self .__username current_tick = event.list a = len (dObPV9hL23H22) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == dObPV9hL23H22 : b = round (dObPV9hL23H22 , 4 ) c = current_tick d = dObPV9hL23H22 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "dObPV9hL23H22 working working!" ) # dObPV10hL24H23 def dObPV10hL24H23 ( self , event): self .__username current_tick = event.list a = len (dObPV10hL24H23) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == dObPV10hL24H23 : b = round (dObPV10hL24H23 , 4 ) c = current_tick d = dObPV10hL24H23 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "dObPV10hL24H23 working working!" ) # PVIL10H9 def PVIL10H9 ( self , event): self .__username current_tick = event.list a = len (PVIL10H9) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == PVIL10H9 : b = round (PVIL10H9 , 4 ) c = current_tick d = PVIL10H9 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "PVIL10H9 working working!" ) # GE_PE def GE_PE ( self , event): self .__username current_tick = event.list a = len (GE_PE) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == GE_PE : b = round (GE_PE , 4 ) c = current_tick d = GE_PE portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "GE_PE working working!" ) # cumR1L2ToL5 def cumR1L2ToL5 ( self , event): self .__username current_tick = event.list a = len (cumR1L2ToL5) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == cumR1L2ToL5 : b = round (cumR1L2ToL5 , 4 ) c = current_tick d = cumR1L2ToL5 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "cumR1L2ToL5 working working!" ) # Sig_1 def Sig_1 ( self , event): self .__username current_tick = event.list a = len (Sig_1) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == Sig_1 : b = round (Sig_1 , 4 ) c = current_tick d = Sig_1 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "Sig_1 working working!" ) # Sig_2 def Sig_2 ( self , event): self .__username current_tick = event.list a = len (Sig_2) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == Sig_2 : b = round (Sig_2 , 4 ) c = current_tick d = Sig_2 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "Sig_2 working working!" ) # H8 def H8 ( self , event): self .__username current_tick = event.list a = len (H8) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == H8 : b = round (H8 , 4 ) c = current_tick d = H8 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "H8 working working!" ) # H10 def H10 ( self , event): self .__username current_tick = event.list a = len (H10) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == H10 : b = round (H10 , 4 ) c = current_tick d = H10 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "H10 working working!" ) # PVI def PVI ( self , event): self .__username current_tick = event.list a = len (PVI) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == PVI : b = round (PVI , 4 ) c = current_tick d = PVI portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "PVI working working!" ) # V1 def V1 ( self , event): self .__username current_tick = event.list a = len (V1) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == V1 : b = round (V1 , 4 ) c = current_tick d = V1 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "V1 working working!" ) # V2 def V2 ( self , event): self .__username current_tick = event.list a = len (V2) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == V2 : b = round (V2 , 4 ) c = current_tick d = V2 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "V2 working working!" ) # D1 def D1 ( self , event): self .__username current_tick = event.list a = len (D1) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == D1 : b = round (D1 , 4 ) c = current_tick d = D1 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "D1 working working!" ) # VM1 def VM1 ( self , event): self .__username current_tick = event.list a = len (VM1) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == VM1 : b = round (VM1 , 4 ) c = current_tick d = VM1 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "VM1 working working!" ) # E1 def E1 ( self , event): self .__username current_tick = event.list a = len (E1) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == E1 : b = round (E1 , 4 ) c = current_tick d = E1 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "E1 working working!" ) # E2 def E2 ( self , event): self .__username current_tick = event.list a = len (E2) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == E2 : b = round (E2 , 4 ) c = current_tick d = E2 portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "E2 working working!" ) # StatFM def StatFM ( self , event): self .__username current_tick = event.list a = len (StatFM) portfolio = * a for i in range (a): for j in range ( len (current_tick)): if current_tick == StatFM : b = round (StatFM , 4 ) c = current_tick d = StatFM portfolio = ((c / d) - 1 ) * decimal.Decimal(b) portfoliomove = sum (portfolio) json_body = client.write_points(json_body) print ( "StatFM working working!" ) """权重函数""" def Get_TargetWeight (): sql2 = 'select CONVERT (varchar(10), MAX (TradingDate),23) from JYDB.dbo.QT_TradingDayNew where IfTradingDay=1 and TradingDate( CONVERT (varchar(10), GETDATE(), 23)) and SecuMarket=83' con2 = pymssql.connect(dbhost , dbuser , dbuser_password , TShengYunDB , charset = 'utf8' ) cur2 = con2.cursor() cur2.execute(sql2) day = cur2.fetchone() tradingday = '' .join(day) ################################################################## sql3 = '''select B.SecuCode,A.model_target,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.model_target0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) #roww = cur3.fetchall() global StatArb2_Target_500 StatArb2_Target_500 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.dObPV8hL27H26,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.dObPV8hL27H260 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global dObPV8hL27H26 dObPV8hL27H26 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.dObPV9hL23H22,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.dObPV9hL23H220 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global dObPV9hL23H22 dObPV9hL23H22 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.dObPV10hL24H23,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.dObPV10hL24H230 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global dObPV10hL24H23 dObPV10hL24H23 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.PVIL10H9,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.PVIL10H90 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global PVIL10H9 PVIL10H9 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.GE_PE,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.GE_PE0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global GE_PE GE_PE = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.cumR1L2ToL5,b.ClosePrice from ShengYunDB.dbo.StatArb_TargetPortfolios A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.cumR1L2ToL50 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global cumR1L2ToL5 cumR1L2ToL5 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.Sig_1,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.Sig_10 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global Sig_1 Sig_1 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.Sig_2,b.ClosePrice from ShengYunDB.dbo.StatArb2_Target_500 A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.Sig_20 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global Sig_2 Sig_2 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.H8_w,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.H8_w0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global H8 H8 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.H10_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.H10_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global H10 H10 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.PVI_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.PVI_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global PVI PVI = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.V1_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.V1_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global V1 V1 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.V2_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.V2_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global V2 V2 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.D1_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.D1_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global D1 D1 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.VM1_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.VM1_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global VM1 VM1 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.E1_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.E1_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global E1 E1 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.E2_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.E2_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global E2 E2 = cur3.fetchall() ################################################################## sql3 = '''select B.SecuCode,A.Total_W,b.ClosePrice from ShengYunDB.dbo.StatFM_Info A left join ShengYunDB.dbo.StockDailyTrading B on A.InnerCode=B.InnerCode where A.Total_W0 and A.TradingDay=%s and b.TradingDay=%s''' cur3 = con2.cursor() cur3.execute(sql3 , (tradingday , tradingday)) # roww = cur3.fetchall() global StatFM StatFM = cur3.fetchall() """主函数""" #-------------------------------------------------------------------- def main (): Get_TargetWeight() listner1 = Listener( "StatArb2_Target_500" ) #订阅者1 listner2 = Listener( "dObPV8hL27H26" ) #订阅者2 listner3 = Listener( "dObPV9hL23H22" ) # 订阅者2 listner4 = Listener( "dObPV10hL24H23" ) # 订阅者2 listner5 = Listener( "PVIL10H9" ) # 订阅者2 listner6 = Listener( "GE_PE" ) # 订阅者2 listner7 = Listener( "cumR1L2ToL5" ) # 订阅者2 listner8 = Listener( "Sig_1" ) # 订阅者2 listner9 = Listener( "Sig_2" ) # 订阅者2 listner10 = Listener( "H8" ) # 订阅者2 listner11 = Listener( "H10" ) # 订阅者2 listner12 = Listener( "PVI" ) # 订阅者2 listner13 = Listener( "V1" ) # 订阅者2 listner14 = Listener( "V2" ) # 订阅者2 listner15 = Listener( "D1" ) # 订阅者2 listner16 = Listener( "VM1" ) # 订阅者2 listner17 = Listener( "E1" ) # 订阅者2 listner18 = Listener( "E2" ) # 订阅者2 listner19 = Listener( "StatFM" ) # 订阅者2 eventManager = EventManager() #绑定事件和监听器响应函数(新文章) eventManager.AddEventListener(EVENT_Tick , listner1.StatArb2_Target_500) eventManager.AddEventListener(EVENT_Tick , listner2.dObPV8hL27H26) eventManager.AddEventListener(EVENT_Tick , listner3.dObPV9hL23H22) eventManager.AddEventListener(EVENT_Tick , listner4.dObPV10hL24H23) eventManager.AddEventListener(EVENT_Tick , listner5.PVIL10H9) eventManager.AddEventListener(EVENT_Tick , listner6.GE_PE) eventManager.AddEventListener(EVENT_Tick , listner7.cumR1L2ToL5) eventManager.AddEventListener(EVENT_Tick , listner8.Sig_1) eventManager.AddEventListener(EVENT_Tick , listner9.Sig_2) eventManager.AddEventListener(EVENT_Tick , listner10.H8) eventManager.AddEventListener(EVENT_Tick , listner11.H10) eventManager.AddEventListener(EVENT_Tick , listner12.PVI) eventManager.AddEventListener(EVENT_Tick , listner13.V1) eventManager.AddEventListener(EVENT_Tick , listner14.V2) eventManager.AddEventListener(EVENT_Tick , listner15.D1) eventManager.AddEventListener(EVENT_Tick , listner16.VM1) eventManager.AddEventListener(EVENT_Tick , listner17.E1) eventManager.AddEventListener(EVENT_Tick , listner18.E2) eventManager.AddEventListener(EVENT_Tick , listner19.StatFM) eventManager.Start() publicAcc = PublicAccounts(eventManager) #timer = Timer(2, publicAcc.Get_Tick) #timer.start() publicAcc.Get_Tick() if __name__ == '__main__' : main()
个人分类: 日常监控|0 个评论
分享 python小技巧2_任意起点按顺序读4个字符
xulimei1986 2016-9-1 11:49
a='abcdefghi' d=len(a) for i in range(0,d-3): j=i+3 print a +a +a +a
1 次阅读|0 个评论
分享 python小技巧1_当月1日、上月1日等
xulimei1986 2016-9-1 11:47
当月1日:datetime.date(datetime.date.today().year,datetime.date.today().month,1) 当月1日:datetime.date.today().replace(day=1) 上月1日:(datetime.date.today().replace(day=1)-datetime.timedelta(1)).replace(day=1)
0 个评论
分享 python 调用sas脚本的例子_20160809
xulimei1986 2016-8-9 15:47
#将下面的脚本存在 update.sas文件中 data master; /*建立主数据集*/ input id name $ sex age weight; cards; 11 jones 1 46 117.2 14 milier 2 59 132.2 30 parker 1 29 111.3 49 smith 1 34 209.1 87 wilson 2 30 98.3 ; run; data trans; /*建立处理数据集*/ input id age weight name $@@; cards; 11 47 . . 30 . 108.4 . 49 35 215.1 . 87 . . cameron 87 . 104.1 . ; run; data new; /*利用处理数据集修改主数据集*/ update master trans;by id;run; proc export data=new outfile='E:\learn\result.txt' replace;run; -- python调用SAS import subprocess,time,datetime sas_file='E:\learn\update.sas' while 1: try: print time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())),':', print u'执行SAS文件 '%sas_file sas_code=subprocess.check_call(sas_file,shell=True) except Exception,e: print 'SAS ERROR:',subprocess.CalledProcessError break
0 个评论
分享 python 在工作中的应用_2
xulimei1986 2015-7-8 14:41
-- 提取 # -*- coding: cp936 -*- f=open('无标题1.txt') trlist=f.readlines() f.close() f=open('out11.txt','w+') for tr in trlist: if not ' .split(']') item=tr.split(']个') .split(' iType=tr.split('iType:') .split(']') amount=tr.split('] .split(']') if 'price' in tr: price=tr.split('price .split(']') else: price='' f.write('%s,%s,%s,%s,%s,\n'%(time,iType,price,item,amount)) f.close() -- 数据转换:两个空格分行 SOURCE_FILE_PATH = 'e:\intest.txt' OBJECT_FILE_PATH = 'e:\outtest.txt' PREFIX_COLUMNS = 7 def write_line(file_object, prefix_list, suffix_list): full_list = prefix_list + suffix_list line = '\t'.join(full_list) + '\n' file_object.write(line) def split_data(src_file_path, obj_file_path): sf = open(src_file_path) of = open(obj_file_path, 'w') for line in sf.readlines(): spl_line = line.split() suf_col = spl_line while(True): spl_len = len(suf_col) if spl_len 2: break else: write_line(of, spl_line , suf_col ) suf_col = suf_col sf.close() of.close() if __name__ == '__main__': split_data(SOURCE_FILE_PATH, OBJECT_FILE_PATH) print 'Run OK' -- 单个文件筛选: # -*- coding: cp936 -*- f=open('dianka.dat') trlist=f.readlines() f.close() f=open('dianka_jieguo.dat','w+') for tr in trlist: if '点卡=虚拟(150点)' in tr: f.write(tr) f.close() -- 多个文件筛选后再合并文件 # -*- coding: cp936 -*- filelist= f1=open('jieguo.txt','w') for file in filelist: f=open(file) trlist=f.readlines() f.close() for tr in trlist: if '完成制药' in tr: f1.write(tr) f1.close() -- 复解析多个文件到一个文件中 # -*- coding: cp936 -*- filelist= f1=open('out.txt','w') for file in filelist: f=open(file) trlist=f.readlines() f.close() for tr in trlist: if 'ClientInfo' in tr: Id=tr.split('Id=') .split(',') Ip=tr.split('Ip=') .split(',') URS=tr.split('URS=') .split(',') f1.write('%s,%s,%s,%s\n'%(file,Id,Ip,URS)) f1.close()
0 个评论
分享 python在工作中的应用
xulimei1986 2015-7-8 14:26
-- 定位换行代码 op=open('temp.txt','r') reop=open('outtemp1.txt','w') d={} for i in op: l=i.split('\t') hostnum=l name=l twtime=l level=l uid=l lb=l log=lb.strip().split(',') for logs in log: reop.write('%s\t%s\t%s\t%s\t%s\t%s\n'%(hostnum,name,twtime,level,uid,logs)) op.close() reop.close() -- 根据批量条件筛选数据 # -*- coding: cp936 -*- import glob f1=open('1.条件.txt')#打开条件文件 d={} for i in f1: d =''#将条件信息记录为字典 f1.close() files_all=glob.glob('.\\2012-02\\*.txt') #files_all= #制作多个目标文件列表 for files in files_all:#循环打开目标文件 f=open(files) w=open('2012-02.txt','a')#输出结果 for i in f: l=i.split('') urs=l .strip()#确定用于匹配的列 if d.has_key(urs):#如果用于匹配的列在字典内,即目标文件内信息在条件文件内 w.write(i)#书写结果 w.close() f.close() -- 数据分行处理 # -*- coding: cp936 -*- f = open('ouT.txt') rf = f.readlines() f.close() ff = open('comb2.txt','w+') for i in rf: si = i.split('\t') wf = si .split(',') for x in wf: xx = x.replace(" ",'').replace("'",'').replace('"','') sxx = xx.split(':') try: ff.write('%s\t%s\t%s\t%s\t%s\t%s\t%s\n'%(si ,si ,si ,si ,si ,sxx .strip(),sxx .strip())) except: print i ff.close() 数据示例: 三潭印2012/4/9ljlovems_mil乄暮灬晨顔78" " 九天揽2012/3/30q12345r5御剑乄星辰76" " -- 将一个文件夹下的文件合并为一个文件 # -*- coding: cp936 -*- import glob files=glob.glob('*-*.txt')#这个改文件格式 w=open('comb.txt','w')#这个改输出结果 #w.write('推广员编号,姓名,申请ip,地址,玩家id,服务器id,昵称,等级,激活ip,地址,激活时间,消费\n') for wenjian in files: f=open(wenjian) for i in f: #if '推广员编号' in i: #continue w.write(i) f.close() w.close() -- stat_farm #!/usr/bin/env python # coding: utf-8 IN_FILE = 'test.txt' OUT_FILE = 'out_data.txt' FARM_NAME_PREFIX = '工作室' def where_is_data(farms, data): for index, farm in enumerate( farms ): if data in farm: return index return None def stat_farm(): fi = open( IN_FILE ) farms = ) farms.append( farm ) elif (data1_loc is None) and (data2_loc is not None): farms .update( ) elif (data1_loc is not None) and (data2_loc is None): farms .update( ) elif data1_loc != data2_loc: farms .update( farms.pop( data1_loc ) ) else: # data1_loc == data2_loc, do nothing pass line_num += 1 fi.close() fo = open( OUT_FILE, 'w' ) for index, farm in enumerate( farms ): for member in farm: fo.write( '%s%d\t%s\n' % (FARM_NAME_PREFIX, index+1, member) ) fo.close() #print sorted( map( lambda x: len(x), farms ) ) return farms def run_test( farms ): fi = open( IN_FILE ) line_num = 1 succ = True for line in fi: line = line.strip() if not line: continue spl_line = line.split() if len(spl_line) != 2: print 'Error: line #%d parameters error' % line_num data1, data2 = spl_line data1_loc = where_is_data( farms, data1 ) data2_loc = where_is_data( farms, data2 ) if data1_loc != data2_loc: print 'Error: data1 and data2 on line #%d not in the same farm' succ = False break line_num += 1 if succ: print 'Test pass' fi.close() if __name__ == '__main__': farms = stat_farm() if farms: run_test( farms )
0 个评论
分享 python 特殊语法:filter、map 、reduce、lambda
xulimei1986 2015-6-25 17:38
Python特殊语法:filter、map、reduce、lambda Python内置了一些非常有趣但非常有用的函数,充分体现了Python的语言魅力! filter(function, sequence) :对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回: def f(x): return x % 2 != 0 and x % 3 != 0 filter(f, range(2, 25)) def f(x): return x != 'a' filter(f, "abcdef") 'bcdef' map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回: def cube(x): return x*x*x map(cube, range(1, 11)) def cube(x) : return x + x ... map(cube , "abcde") 另外map也支持多个sequence,这就要求function也支持相应数量的参数输入: def add(x, y): return x+y map(add, range(8), range(8)) reduce(function, sequence, starting_value) :对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和: def add(x,y): return x + y reduce(add, range(1, 11)) 55 (注:1+2+3+4+5+6+7+8+9+10) reduce(add, range(1, 11), 20) 75 (注:1+2+3+4+5+6+7+8+9+10+20) lambda :这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方: g = lambda x: x * 2 g(3) 6 (lambda x: x * 2)(3) 6 我们也可以 把filter map reduce 和lambda结合起来 用,函数就可以简单的写成一行。 例如 kmpathes = filter(lambda kmpath: kmpath, map(lambda kmpath: string.strip(kmpath), string.split(l, ':'))) 看起来麻烦,其实就像用语言来描述问题一样,非常优雅。 对 l 中的所有元素以':'做分割,得出一个列表。对这个列表的每一个元素做字符串strip,形成一个列表。对这个列表的每一个元素做直接返回操作(这个地方可以加上过滤条件限制),最终获得一个字符串被':'分割的列表,列表中的每一个字符串都做了strip,并可以对特殊字符串过滤。 http://hi.baidu.com/black/item/307001d18715fc322a35c747 --------------------------------------------------------------- lambda表达式 返回一个函数对象 例子: func = lambda x,y:x+y func相当于下面这个函数 def func(x,y): return x+y 注意def是语句而lambda是表达式 下面这种情况下就只能用lambda而不能用def map,reduce,filter中的function都可以用lambda表达式来生成! map(function,sequence) 把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。 如果function有两个参数,即map(function,sequence1,sequence2)。 例子: 求1*1,2*2,3*3,4*4 map(lambda x:x*x,range(1,5)) 返回值是 reduce(function,sequence) function接收的参数个数只能为2 先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给 function,然后只返回一个结果。 例子: 求1到10的累加 reduce(lambda x,y:x+y,range(1,11)) 返回值是55。 filter(function,sequence) function的返回值只能是True或False 把sequence中的值逐个当参数传给function,如果function(x)的返回值是True,就把x加到filter的返回值里面。一般来说filter的返回值是list,特殊情况如sequence是string或tuple,则返回值按照sequence的类型。 例子: 找出1到10之间的奇数 filter(lambda x:x%2!=0,range(1,11)) 返回值 如果sequence是一个string filter(lambda x:len(x)!=0,'hello')返回'hello' filter(lambda x:len(x)==0,'hello')返回''
0 个评论
分享 python 抓网页数据不需要帐户及密码
xulimei1986 2015-5-22 16:00
#!/usr/bin/env python #-*- coding:utf-8 -*- import urllib2 import urllib urllib.getproxies_registry = lambda : {} # 用代理时加上这句 def geturl ( url ) : res = urllib2.urlopen ( url,timeout = 15 ) html = res.read () res.close () return html zb_anchor = for uid in zb_anchor : zb_mes = {} url = 'http://uid.cc.163.com/userprofile?uid=%d' % uid info = geturl ( url ) nick_name = info.split ( '"nickname":' ) .split ( ',"hiskin":' ) urs = info.split ( '"urs":' ) .split ( '}}' ) print nick_name,urs
0 个评论
分享 python 安装第三方库
山久丰 2015-4-22 13:40
windows系统下安装python第三方模块时确保在安装python时勾选了pip和Add python.exe to Path 找到该库的名称,比如比如Python Imaging Library的名称叫PIL,因此,安装Python Imaging Library的命令(在CMD下直接输入)就是: pip install PIL (上述模块在64位系统上测试安装无效) 或者下载好第三放模块(存放路径?),然后在CMD下输入 easy_install pip 然后输入(比如安装web.py): pip install web.py
18 次阅读|0 个评论
分享 python的Bunch pattern
allenjiang 2014-9-23 20:52
Bunch Pattern 很适合用来构造树: class Bunch(dict): def __init__(self, *args, **kwds): super(Bunch, self).__init__(*args, **kwds) self.__dict__ = self 具体的解释请见: http://stackoverflow.com/questions/2641484/class-dict-self-init-args
13 次阅读|0 个评论
分享 python for data analysis学习笔记
allenjiang 2014-9-20 15:45
题记:个人懒,看到那,想写就写。 chapter 5: 1、原书139页 all_data = {} for ticker in : all_data = web.get_data_yahoo(ticker, '1/1/2000', '1/1/2010') 此处股票编码发生变化,应改为如下代码: all_data = {} for ticker in : all_data = web.get_data_yahoo(ticker, '1/1/2000', '1/1/2010')
个人分类: 笔记|12 次阅读|0 个评论
分享 Python正则表达式
Nicolle 2014-8-3 21:06
就个人而言,主要用它来做一些复杂字符串分析,提取想要的信息 学习原则:够用就行,需要的时候在深入 现总结如下: 正则表达式中特殊的符号: "." 表任意字符 "^ " 表string起始 "$" 表string 结束 “*” “+” “?” 跟在字符后面表示,0个——多个, 1个——多个, 0个或者1个 *?, +?, ?? 符合条件的情况下,匹配的尽可能少//限制*,+,?匹配的贪婪性 {m} 匹配此前的字符,重复m次 {m,n} m到n次,m,n可以省略 举个例子 ‘a.*b’ 表示a开始,b结束的任意字符串 a{5} 匹配连续5个a 表a,b,c,d 表示非a | A|B 表示A或者B , AB为任意的正则表达式 另外|是非贪婪的如果A匹配,则不找B (…) 这个括号的作用要结合实例才能理解, 用于提取信息 /d /D 非 /d /s 表示空字符 /S 非空字符 /w /W 非 /w 一:re的几个函数 1: compile(pattern, ) 根据正则表达式字符串 pattern 和可选的flags 生成正则表达式 对象 生成正则表达式 对象(见二) 其中flags有下面的定义: I 表示大小写忽略 L 使一些特殊字符集,依赖于当前环境 M 多行模式 使 ^ $ 匹配除了string开始结束外,还匹配一行的开始和结束 S “.“ 匹配包括‘/n’在内的任意字符,否则 . 不包括‘/n’ U Make /w, /W, /b, /B, /d, /D, /s and /S dependent on the Unicode character properties database X 这个主要是表示,为了写正则表达式,更可毒,会忽略一些空格和#后面的注释 其中S比较常用, 应用形式如下 import re re.compile(……,re.S) 2: match(pattern,string, ) 让string匹配,pattern,后面分flag同compile的参数一样 返回MatchObject 对象(见三) 3: split( pattern, string ) 用pattern 把string 分开 re.split('/W+', 'Words, words, words.') 括号‘()’在pattern内有特殊作用,请查手册 4:findall( pattern, string ) 比较常用, 从string内查找不重叠的符合pattern的表达式,然后返回list列表 5:sub( pattern, repl, string ) repl可以时候字符串,也可以式函数 当repl是字符串的时候, 就是把string 内符合pattern的子串,用repl替换了 当repl是函数的时候,对每一个在string内的,不重叠的,匹配pattern 的子串,调用repl(substring),然后用返回值替换substring re.sub(r'def/s+( *)/s*/(/s*/):', ... r'static PyObject*/npy_/1(void)/n{', ... 'def myfunc():') 'static PyObject*/npy_myfunc(void)/n{' def dashrepl(matchobj): ... if matchobj.group(0) == '-': return ' ' ... else: return '-' re.sub('-{1,2}', dashrepl, 'pro----gram-files') 'pro--gram files' 二:正则表达式对象 (Regular Expression Objects ) 产生方式:通过 re.compile(pattern, )回 match( string ]) ;返回string 匹配 pattern的MatchObject(见三) split( string ) findall( string ]) sub( repl, string ) 这几个函数和re模块内的相同,只不过是调用形式有点差别 re.几个函数和 正则表达式对象的几个函数,功能相同,但同一程序如果 多次用的这些函数功能,正则表达式对象的几个函数效率高些 三:matchobject 通过 re.match(……) 和 re.compile(……).match返回 该对象有如下方法和属性: 方法: group( ) groups( ) groupdict( ) start( ) end( ) 说明这几个函数的最好方法,就是举个例子 matchObj = re.compile(r"(?Pint/d+)/.(/d*)") m = matchObj.match('3.14sss') #m = re.match(r"(?Pint/d+)/.(/d*)", '3.14sss') print m.group() print m.group(0) print m.group(1) print m.group(2) print m.group(1,2) print m.group(0,1,2) print m.groups() print m.groupdict() print m.start(2) print m.string 输出如下: 3.14 3.14 3 14 ('3', '14') ('3.14', '3', '14') ('3', '14') {'int': '3'} 2 3.14sss 所以group() 和group(0)返回,匹配的整个表达式的字符串 另外group(i) 就是正则表达式中用第i个“()” 括起来的匹配内容 ('3.14', '3', '14')最能说明问题了。
个人分类: Python|1 次阅读|0 个评论
分享 python 中取某指定列数据的代码
xulimei1986 2014-7-31 11:07
#coding:gb2312 import os import sys """ #取指定列的数据方法一 #coding:gb2312 fopen=open("大话3(经典版)12期_0731.txt") out=open("out.txt","a") for s in fopen: line=s.split("\t") #空格为分隔符 out.write('\t'.join(line )) out.close() print("Done!") """ """ #取指定列的数据方法二 #coding:gb2312 fopen=open("大话3(经典版)12期_0731.txt") out=open("out.txt","a") for s in fopen: line=s.split("\t") out.write("\t".join( for i in ])+"\n") out.close() print("Done!") """ #取指定列的数据方法三 #coding:gb2312 fopen=open("大话3(经典版)12期_0731.txt") out=open("out.txt","a") for s in fopen: line=s.strip().split("\t") jhzq,urs,xfsj,dysj,jssj,lstype,yg,dyje1,dyjg2,ygzzzt= for i in xrange(len(line))] line2=jhzq+"\t"+urs+"\t"+jssj+"\t"+"\n" out.write(line2) out.close() print("Done!")
0 个评论
分享 PYTHON 学习文档(一)
daydayup81 2013-1-22 17:16
基本的数据类型有三种:逻辑、数值、字符串。 1、 逻辑值有三种: True 、 False 、 None 。 2、 if 或者 while 可以直接对对象进行测试: 如果对象为逻辑值,那么 False 或者 None 会被判定为假; 如果对象为数值,那么 0 会判定为假,非 0 值会被判定为真; 如果对象为字符串,那么空字符串会被判定为假; 如果对象为列表或者字典,那么空列表或者空字典会被判定为假。 3、 逻辑操作有三种: or 、 and 、 not 。 4、 比较操作有八种: 小于、小于等于、大于、大于等于、等于、不等于、是、不是。 5、 数值类型有三种:整数、浮点数、复数。 6、 类型转换函数为: int() 、 float() 、 complex() 。 7、 数值运算符有:加、减、乘、除、整除、求余、幂。 8、 数字化运算函数有:求整、舍入、符号、绝对值、有理化、指数、对数、三角函数、。 9、 字符类型有三种:单引号括起的字符串、双引号括起的字符串和三引号括起的字符串。 10、 字符串运算符主要是:加、乘。 11、 字符串运算函数较多,比如说:分割、大小写转化、查找、替换、模式匹配,在这里不再一一列出。 12 、 print 语句可以用来打印各种类型的对象,具体参数略过。 Normal 0 7.8 pt 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;}
个人分类: Python|18 次阅读|0 个评论
分享 python字典操作
418766417 2013-1-15 12:21
mytuple=(1,2,3) 02 printlist(mytuple)# Tuple to list 03 04 05 mylist= # List to tuple 06 printtuple(mylist) 07 (1,2,3) 08 09 mylist2= 10 printdict(mylist2)# List to dictionnary 11 {'blue':5,'yellow':7,'red':3} 12 13 mystring='hello' 14 printlist(mystring)# String to list 15 16 17 mylist3= 18 print''.join(mylist3)# List to string 19 world 20 21 #该代码片段来自于: http://www.sharejs.com/codes/python/834 一.创建字典 方法①: dict1={} dict2={ 'name' : 'earth' , 'port' : 80 } dict1,dict2 ({},{ 'port' : 80 , 'name' : 'earth' }) 方法②:从Python 2.2 版本起 fdict=dict(( , )) fdict { 'y' : 2 , 'x' : 1 } 方法③: 从Python 2.3 版本起,可以用一个很方便的内建方法fromkeys()来创建一个 "默认" 字典,字 典中元素具有相同的值(如果没有给出,默认为 None ): ddict={}.fromkeys(( 'x' , 'y' ),- 1 ) ddict { 'y' :- 1 , 'x' :- 1 } edict={}.fromkeys(( 'foo' , 'bar' )) edict { 'foo' : None , 'bar' : None } 二.如何访问字典中的值 ①要想遍历一个字典(一般用键),你只需要循环查看它的键,像这样: dict2={ 'name' : 'earth' , 'port' : 80 } for key in dict2.keys(): ... print 'key=%s,value=%s' %(key,dict2 ) ... key=name,value=earth key=port,value= 80 ②从Python 2.2 开始 在 for 循环里遍历字典。 dict2={ 'name' : 'earth' , 'port' : 80 } for key in dict2: ... print 'key=%s,value=%s' %(key,dict2 ) ... key=name,value=earth key=port,value= 80 要得到字典中某个元素的值,可以用你所熟悉的字典键加上中括号来得到: dict2 'earth' print 'host%sisrunningonport%d' %\ ...(dict2 ,dict2 ) hostearth is runningonport 80 ③字典所有的方法。方法has_key()和 in 以及 not in 操作符都是布尔类型的 'server' in dict2 #或dict2.has_key('server') False 'name' in dict #或dict2.has_key('name') True dict2 'earth' 一个字典中混用数字和字符串的例子: dict3={} dict3 = 'abc' dict3 = 3.14159 dict3 = 'xyz' dict3 { 3.2 : 'xyz' , 1 : 'abc' , '1' : 3.14159 } 三.更新字典 采取覆盖更新 上例中dict2 = 'earth' ; 更新dict2 = 'abc' ; 四.删除字典元素和字典 del dict2 #删除键为“name”的条目 dict2.clear() #删除dict2中所有的条目 del dict2 #删除整个dict2字典 dict2.pop( 'name' ) #删除并返回键为“name”的条目 dict2={ 'name' : 'earth' , 'port' : 80 } dict2.keys() dict2.values() dict2.items() for eachKey in dict2.keys(): ... print 'dict2key' ,eachKey, 'hasvalue' ,dict2 ... dict2keyporthasvalue 80 dict2keynamehasvalueearth update()方法可以用来将一个字典的内容添加到另外一个字典中 { 'server' : 'http' , 'port' : 80 , 'host' : 'venus' } dict3.clear() dict3 dict3 五.映射类型相关的函数 dict(x= 1 ,y= 2 ) { 'y' : 2 , 'x' : 1 } dict8=dict(x= 1 ,y= 2 ) dict8 { 'y' : 2 , 'x' : 1 } dict9=dict(**dict8) dict9 { 'y' : 2 , 'x' : 1 } dict9=dict8.copy() 字典内建方法: 字典key值:dict9.keys() 字典值:dict9.values() 字典所有项:dict9.items() 返回字典值:dict9.get( 'y' ) 表 7.2 字典类型方法 方法名字操作 dict.cleara()删除字典中所有元素 dict.copya()返回字典(浅复制)的一个副本 dict.fromkeysc(seq,val= None )创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值(如果不提供此值,则默认为 None ) dict.get(key,default= None )对字典dict中的键key,返回它对应的值value,如果字典中不存在此键,则返回default的值(注意,参数default的默认值为 None ) dict.has_key(key)如果键(key)在字典中存在,返回 True ,否则返回 False .在Python2. 2 版本引入 in 和 not in 后,此方法几乎已废弃不用了,但仍提供一个 可工作的接口。 dict.items()返回一个包含字典中(键,值)对元组的列表 dict.keys()返回一个包含字典中键的列表 dict.iter()方法iteritems(),iterkeys(),itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表。 dict.popc(key )和方法get()相似,如果字典中key键存在,删除并返回dict ,如果key键不存在,且没有给出default的值,引发KeyError异常。 dict.setdefault(key,default= None )和方法set()相似,如果字典中不存在key键,由dict =default为它赋值。 dict.update(dict2)将字典dict2的键-值对添加到字典dict dict.values()返回一个包含字典中所有值的列表 ①②③④⑤⑥⑦⑧⑨⑩ 六.集合类型 ①用集合的工厂方法set()和frozenset(): s=set( 'cheeseshop' ) s set( ) t=frozenset( 'bookshop' ) t frozenset( ) type(s) type 'set' type(t) type 'frozenset' ②如何更新集合 用各种集合内建的方法和操作符添加和删除集合的成员: s.add( 'z' ) s set( ) s.update( 'pypi' ) s set( ) s.remove( 'z' ) s set( ) s-=set( 'pypi' ) s set( ) ③删除集合 del s ④成员关系( in , not in ) s=set( 'cheeseshop' ) t=frozenset( 'bookshop' ) 'k' in s False 'k' in t True 'c' not in t True ⑤集合等价/不等价 s==t False s!=t True u=frozenset(s) s==u True set( 'posh' )==set( 'shop' ) True ⑥差补/相对补集(–) 两个集合(s和t)的差补或相对补集是指一个集合C,该集合中的元素,只属于集合s,而不属 于集合t。差符号有一个等价的方法,difference(). s-t set( ) 对称差分(^):对称差分是集合的XOR
个人分类: python 编程学习|8 次阅读|0 个评论
分享 python 内置函数fliter
418766417 2013-1-10 18:26
ilter函数,是用来过滤列表的。简单的说就是用一个函数来过滤一个列表,把列表的每一项传递进入过滤函数,过滤函数返回false就从这个列表中 删除 该项。 Python代码 def add1(a): if a 2 : return True return False a1= b=filter(add1,a1) print b 其实这个filter函数相当于这个: Python代码 c= print c
个人分类: python 编程学习|20 次阅读|0 个评论

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-18 20:12