1.版本不同,语法不同
print 'Hello World' 2+
print('Hello World') 3+
2.编码
Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。
解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了。
3.pass
#!/usr/bin/python # -*- coding: UTF-8 -*- # 输出 Python 的每个字母 for letter in 'Python': if letter == 'h': pass print '这是 pass 块' print '当前字母 :', letter print "Good bye!"
pass与return ''的不同在于,pass是个空语句,还可以继续执行与之并列并且在pass后面的数据
4.python中字典和json的异同:
我们会发现,从形式来讲,这两者的确很像,都为 key : value 的形式,那么它们两者的异同是什么呢?
简单来说,python 字典的数据格式就json的数据格式。
但本质上来讲,字典是一种数据结构,json是一种格式;字典有很多内置函数,有多种调用方法,而json是数据打包的一种格式,并不像字典具备操作性,并且是格式就会有一些形式上的限制,比如json的格式要求必须且只能使用双引号作为key或者值的边界符号,不能使用单引号,而且“key”必须使用边界符(双引号),但字典就无所谓了。
形式上的相近也让python提供了json.loads()转换函数,方便json数据的调用。
使用方法如下:
import json a=json.loads('{"a":"1","b":"2"}') print a
5.模块不等于函数
例如,要导入模块 fib 的 fibonacci 函数,使用如下语句:
from fib import fibonacci
这个声明不会把整个 fib 模块导入到当前的命名空间中,它只会将 fib 里的 fibonacci 单个引入到执行这个声明的模块的全局符号表。
6.drop_duplicates()
返回一个去重之后的DataFrame
7.在centos中运行*.py文件,使用python *.py即可
8.list extend
extend()函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
aList=[123,"xyz"]
bList=["shellerine","abc",5]
aList.extend(bList)
print(aList)
#[123,"xyz","shellerine","abc",5]
补充1
-
defaultdict,set,list好用: 因为set可以取唯一值,还可以做交并补等操作,list可以直接判断某个元素是否在list中,用if xx in yy:的形式
-
sort与sorted的区别: sort是排序list的,sorted排序可以迭代的
-
format(): 使用{}和:来操作,控制小数位,对齐方式,显示形式,进制等
-
读写tsv,txt与csv: 写,直接fwrite.write(line)即可,读是for line in fread:,在写csv的时候一般csv.write(f).writerow(xxxx);注意换行符这些的处理
-
readlines(): "b",代表二进制格式,使用with keyword去打开文件的好处是,会自动在不用了的时候关闭文件,不用自己写f.closed,即使打开文件出错,也可以关闭文件,比try-finally这种写法简单
-
datetime https://docs.python.org/3.6/library/datetime.html#module-datetime 真的是太多函数了,到用的时候再去看吧 datetime中包含date,time,datetime等,还有求时差,时区的,strftime() and strptime()
delta = datetime(2017, 11, 25) - rcall['create_time'] #第一单与20171125之间的时间间隔天数 span = delta.days enddate=datetime.datetime.strptime('2018-04-01','%Y-%m-%d')
-
openpyxl https://openpyxl.readthedocs.io/en/stable/ 注意sheet的名字不要有特殊符号,例如"/"
-
统计每个销售每天的电话数量(第一行为日期,第一列为各个销售的姓名,这个表当时思考了半天如何实现):
# coding: utf-8
# In[1]:
from openpyxl import Workbook, load_workbook
from collections import defaultdict as dd
import datetime
import sys
from collections import defaultdict as dd
#staff_date2core=dd(list)
staff_date2core=dd(set)
staff2group = dd(str)
staffs=[]
sale_resulst=dd(list)
#data2core=dd(list)
data2core=dd(set)
feature_value=dd(set)
with open('entity_feature_competitor_20180301-20180401.tsv', 'r') as fread:
numbers = []
for line in fread:
staff_date, group, callId, _, number, feature, _ = line.strip().split('\t')
staff,date=staff_date.split('@')
staff2group[staff] = group
#遍历电话,把每个销售每天的电话加到dd(set)中,key是staff_date
staff_date2core[staff_date].add(callId)
data2core[date].add(number)
if staff not in staffs:
staffs.append(staff)
enddate=datetime.datetime.strptime('2018-04-01','%Y-%m-%d')
for staff in staffs:
startdate=datetime.datetime.strptime('2018-03-01','%Y-%m-%d')
sale_resulst[staff].append(staff)
sale_resulst[staff].append(staff2group[staff])
while startdate<enddate:
staff_date=staff+"@"+str(startdate.strftime('%Y-%m-%d'))
sale_resulst[staff].append(len(staff_date2core[staff_date]))
#对应list的第三个元素是每个销售当天的电话数量
startdate+=datetime.timedelta(days=1)
##找到每个销售每一天的电话数量
pos = 1
from openpyxl import Workbook, load_workbook
wb = Workbook()
ws = wb.active
ws.title = "销售人员情况分析"
###表头
tabletitle=["销售","部门"]
startdate=datetime.datetime.strptime('2018-03-01','%Y-%m-%d')
while startdate<enddate:
tabletitle.append(str(startdate.strftime('%Y-%m-%d')))
startdate+=datetime.timedelta(days=1)
row_cnt = 1
for col_cnt in range(1, len(tabletitle) + 1):
cell = ws.cell(row=row_cnt, column=col_cnt)
cell.value = tabletitle[col_cnt - 1]
###主要内容
for staff in staffs:
row_cnt += 1
for col_cnt in range(1, len(sale_resulst[staff]) + 1):
cell = ws.cell(row=row_cnt, column=col_cnt)
cell.value = sale_resulst[staff][col_cnt - 1]
#这里就是存到excel里对应位置,staff是dict的key,确定行,[col_cnt-1]对应list的第几个元素,对应列;要明白这里是事先将列名固定,并且list中的数据与列名位置对应好
sum_result=[]
#写入excel的数据一般是list,如果一行有多个值
sum_result.append("提到竞品提及的总数")
sum_result.append("xx网")
startdate=datetime.datetime.strptime('2018-03-01','%Y-%m-%d')
while startdate<enddate:
sum_result.append(len(data2core[str(startdate.strftime('%Y-%m-%d'))]))
startdate+=datetime.timedelta(days=1)
row_cnt += 1
for col_cnt in range(1, len(sum_result) + 1):
cell = ws.cell(row=row_cnt, column=col_cnt)
cell.value = sum_result[col_cnt - 1]
avg_result=[]
avg_result.append("平均")
avg_result.append("xx网")
startdate=datetime.datetime.strptime('2018-03-01','%Y-%m-%d')
while startdate<enddate:
avg_date_result='%.2f' % (len(data2core[str(startdate.strftime('%Y-%m-%d'))])/len(staffs))
avg_result.append(avg_date_result)
startdate+=datetime.timedelta(days=1)
row_cnt += 1
for col_cnt in range(1, len(avg_result) + 1):
cell = ws.cell(row=row_cnt, column=col_cnt)
cell.value = avg_result[col_cnt - 1]
#ws2 = wb.create_sheet(title="Pi")
wb.save('competitor_20180301_20180401.xlsx')
- 读excel:
# coding: utf-8
from openpyxl import Workbook, load_workbook
from collections import defaultdict as dd
from datetime import datetime
# 第一阶段: 读数据到3个字典
wb = load_workbook('20170101-20180228业绩明细.xlsx') # workbook名字
ws_revenue = wb["Sheet3"] # worksheet名字
max_row = 124421 # excel总行数
deal_closed_numbers = []
staff2n_deal = dd(int)
number2closed_staff = dd(str)
with open('number2deal_closed.train.tsv', 'w') as fwrite_train, open('number2deal_closed.test.tsv', 'w') as fwrite_test:
#读取excel的第二行到最后一行的下一行
for row in range(2, max_row + 1):
core_id = str(ws_revenue.cell(row=row, column=1).value)
#取excel对应行的第1列数据
transaction_date = ws_revenue.cell(row=row, column=2).value
sname = ws_revenue.cell(row=row, column=3).value
product_type = ws_revenue.cell(row=row, column=4).value
money=ws_revenue.cell(row=row,column=5).value
#if product_type != "VIP":
# continue
if product_type=="VIP"||money>=1000{
line = '{}\t{}\n'.format(core_id, sname)
if transaction_date < datetime(2017, 12, 1): ###以这个时间作为训练集和测试集的分割点
fwrite_train.write(line)
else:
fwrite_test.write(line)
}
- 定时发送邮件(smtplib):
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email():
# 第三方 SMTP 服务
mail_host = "smtp.163.com" # SMTP服务器
mail_user = "shellerine" # 用户名
mail_pass = "xxxx" # 密码
sender = 'shellerine@163.com' # 发件人邮箱(最好写全, 不然会失败)
receivers = ['xxx@xxx.com','xxx@xxx.com.cn'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
#创建一个带附件的实例
message = MIMEMultipart()
title = '访问记录' # 邮件主题
message['From'] = "{}".format(sender)
message['To'] = ",".join(receivers)
message['Subject'] = title
#邮件正文内容
message.attach(MIMEText('您好!此邮件的附件为访问记录,请查收!', 'plain', 'utf-8'))
#构造附件1,传送当前目录下的event_records.xlsx文件
att1=MIMEText(open('event_records.xlsx','rb').read(),'base64','utf-8')
att1['Content-Type']='application/octet-stream'
#这里的filename可以任意写,
att1["Content-Disposition"]='attachment;filename="event_records.xlsx"'
message.attach(att1)
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用SSL发信, 端口一般是465
smtpObj.login(mail_user, mail_pass) # 登录验证
smtpObj.sendmail(sender, receivers, message.as_string()) # 发送
print("mail has been send successfully.")
except smtplib.SMTPException as e:
print(e)
import time
import schedule
def job():
baixing_event()
time.sleep(1)
send_email()
schedule.every().day.at("9:30").do(job)
while True:
schedule.run_pending()
time.sleep(1)
11.tensorflow求特征权重: 这个流程,拿到数据,处理特征列,将特征列分割成可以需要的特征,按正负样本比例分数据,进行模型训练,就是逻辑回归分类,然后看每个特征的的系数
12.pycharm整体移动代码: 1.pycharm使多行代码同时缩进 鼠标选中多行代码后,按下Tab键,一次缩进四个字符 2、pycharm使多行代码同时左移 鼠标选中多行代码后,同时按住shift+Tab键,一次左移四个字符
补充2.
1.os.getcwd()
file="C:/Users/Shellerine/Documents/iris.csv"
import pandas as pd
import os
pwd=os.getcwd()
os.chdir(os.path.dirname(file))
df=pd.read_csv(os.path.basename(file),header=1)
os.chdir(pwd)
df.head(10)
pwd=os.getcwd() 获得当前目录,指的是运行脚本的目录
os.chdir()用于改变当前工作目录到指定的路径
os.path.basename() 返回文件名
在这个过程中,先保留当前工作目录,中间改成指定路径获取数据之后,再将工作路径改回来