机器学习的编程语言,相较于R,python好像更容易一些,函数式编程也挺形象。
但是,每一门语言都有一些自己约定俗成的特点,更别说那些接口、包的使用。这些在具体的使用中,会让人焦头烂额。
这篇博客是总结我这段时间使用python的一些经验,并不是python的特点总结,只是总结一些我遇到的坑和解决方法,以及我对于python的理解。
1.将时间戳转成格式化的时间表示(datetime)
timeArr=datetime.datetime.utcfromtimestamp(param)
return timeArr.strftime('%Y-%m-%d %H:%M:%S')
timeArr 是转化过来的时间数组,param是时间戳数组。
想要了解更详细的内容,请参考官方文档
2.列出文件夹下的所有目录(os.listdir)
list = os.listdir(dir)
for i in range(0, len(list)):
path = os.path.join(dir, list[i])
if os.path.isfile(path):
do something with file
3.分组统计DataFrame的值(groupby)
info_stat=data.groupby('info')
for info,group in info_stat:
print(info)
print(group)
4.计算两个数据集的交集,并用图表示(plt)
plt.figure()
#plt.subplot(121)
ip_set=set(ip_data['suning']) & set(ip_data['vip'])
venn2([set(ip_data['suning']),set(ip_data['vip'])],set_labels=('suning','vip'))
plt.show()
5.用柱状图表示各类别占比(plt.bar)
s = ['Android', 'Linux', 'Mac', 'Windows', 'iPad', 'iPhone']
ua_su = df_suning.groupby('ua').size()
ua_vip = df_vip.groupby('ua').size()
print(ua_su, ua_vip)
x = list(range(len(ua_su)))
total_width, n = 0.8, 2
width = total_width / n
plt.bar(x, ua_su, width=width, label='suning', fc='y')
for i in range(len(x)):
x[i] = x[i] + width
plt.bar(x, ua_vip, width=width, label='vip', tick_label=s, fc='r')
plt.legend()
plt.show()
6.计算字符串之间的编辑距离(Levenshtein)
# LD 最短编辑距离
name1=list(str1)
name2=list(str2)
#print(name2)
if len(name1)==0 | len(name2)==0:
return max(len(name1),len(name2))
dp=np.zeros((len(name1)+1,len(name2)+1))
for i in range(len(name1)):
dp[i][0]=i
for i in range(len(name2)):
dp[0][i]=i
temp=0
#print(temp)
for k in range(len(name1)):
for r in range(len(name2)):
if name1[k]==name2[r]:
temp=0
else:
temp=1
#print(temp,name1[k],name2[r])
dp[k+1][r+1]=min(dp[k][r],dp[k+1][r],dp[k][r+1])+temp
利用动态规划的思想,
dp[k+1][r+1]=min(dp[k][r],dp[k+1][r],dp[k][r+1])+temp
7.通过计算最长公共子序列,求字符串的相似度(LCS)
name1=list(str1)
name2=list(str2)
if len(name1)==0 | len(name2)==0:
return max(len(name1),len(name2))
dp=np.zeros((len(name1)+1,len(name2)+1))
dp_dir=np.zeros((len(name1)+1,len(name2)+1))
for k in range(len(name1)):
for r in range(len(name2)):
if name1[k]==name2[r]:
dp[k+1][r+1]=dp[k][r]+1
dp_dir[k+1][r+1]=1
else:
dp[k+1][r+1]=max(dp[k+1][r],dp[k][r+1])
if dp[k+1][r+1]==dp[k+1][r]:
dp_dir[k+1][r+1]=2 # left
else:
dp_dir[k+1][r+1]=3 # up
len_lcs=dp[len(name1),len(name2)]
str_lcs=''
k=len(name1);r=len(name2)
while k>0 and r>0:
if dp_dir[k][r]==1:
str_lcs=name1[k-1]+str_lcs
k-=1;r-=1
elif dp_dir[k][r]==2:
r-=1
else:
k-=1
#print(len_lcs,str_lcs)
return len_lcs,str_lcs
8.循环计算字符串的LCS
len1 = len(str1)
len2 = len(str2)
cn=0
sum_lcs_len=0
lcs_len,lcs_str=LCS_diff(str1,str2)
while lcs_len>0:
sum_lcs_len += lcs_len
cn += 1
lcs_list=list(lcs_str)
k=0;r=0
name1=list(str1)
name2=list(str2)
str1='';str2=''
for i in range(len(lcs_list)):
# delete LCS of str1 & str2
while name1[k]!=lcs_list[i]:
str1+=name1[k]
k+=1
while name2[r]!=lcs_list[i]:
str2+=name2[r]
r+=1
k+=1;r+=1
#print(i, lcs_list[i], str1, str2)
while k<len(name1):
str1+=name1[k]
k+=1
while r<len(name2):
str2+=name2[r]
r+=1
len1 = len(str1)
len2 = len(str2)
#print('====',cn,str1,str2)
if len1==0 and len2==0:
break
lcs_len,lcs_str=LCS_diff(str1,str2)
if cn==0:
cn=1
return (sum_lcs_len-cn+1)/(len1+len2+sum_lcs_len)
9.求ip信息(requests)
URL='http://ip.taobao.com/service/getIpInfo.php'
try:
r=requests.get(URL,params=ip,timeout=3)
except requests.RequestException as e:
print(e)
else:
json_data=r.json()
#print(json_data)
if json_data[u'code']==0:
print('country :',json_data[u'data'][u'country'])
print('region :', json_data[u'data'][u'region'])
print('area :', json_data[u'data'][u'area'])
print('city :', json_data[u'data'][u'city'])
print('isp :', json_data[u'data'][u'isp'])
else:
print('error !')
ip地址输入如下:
ip={'ip':'117.64.26.9'}
ip_belongs(ip))
10.求手机号信息(phone)
def phone_beongs(phone):
t=Phone().find(phone)
print('area_code :',t['area_code'])
print('province :',t['province'])
print('zip_code :',t['zip_code'])
print('phone :',t['phone'])
print('phone_type :',t['phone_type'])
print('city :',t['city'])
return t