文章目录
Python数据分析
一、读取CSV、TSV、TXT中的数据
1、读取CSV文件
原始数据
import pandas as pd
students1=pd.read_csv('D:/Temp/Students.csv',index_col='ID')
print(students1)
注意:无论是读取csv文件还是读取TSV 、TXT文件都需要用pd.read_csv进行读取
2、读取TSV文件
import pandas as pd
students2=pd.read_csv('D:/Temp/Students.tsv',sep='\t',index_col='ID')
print(students2)
3、读取TXT文件
import pandas as pd
students3=pd.read_csv('D:/Temp/Students.txt',sep='|',index_col='ID')
print(students3)
二、透视表、分组、聚合
1、透视表
a、原始数据
数据很多,只截图前面和后面的
ID:销售ID
Total:销售总额
Date:销售时间
Product:卖的什么产品
Subcategor:这个产品隶属于那个子类
Category:这个产品隶属于那个大类
b、打印前5行数据
import pandas as pd
pd.options.display.max_columns=999
orders=pd.read_excel('D:/Temp/Orders.xlsx')
print(orders.head())
import pandas as pd
pd.options.display.max_columns=999
orders=pd.read_excel('D:/Temp/Orders.xlsx')
orders['Year'] = pd.DatetimeIndex(orders.Date).year
print(orders.head())
import pandas as pd
import numpy as np
pd.options.display.max_columns=999
orders=pd.read_excel('D:/Temp/Orders.xlsx')
orders['Year'] = pd.DatetimeIndex(orders.Date).year
pt1=orders.pivot_table(index='Category',columns='Year',values='Total')
print(pt1)
c、对数据进行分组整合
其中对表中提取到每个产品的销售时间、卖了多少件和钱数
import pandas as pd
pd.options.display.max_columns=999
orders=pd.read_excel('D:/Temp/Orders.xlsx')
orders['Year'] = pd.DatetimeIndex(orders.Date).year
groups = orders.groupby(['Category', 'Year'])#对数据进行分组
s = groups['Total'].sum() #买了多少钱
c = groups['ID'].count() #买了多少件
pt2 = pd.DataFrame({'Sum': s, 'Count': c}) #把两列放在一块
print(pt2)
三、线性回归、数据预测
1、线性回归
a、原始数据
import pandas as pd
import matplotlib.pyplot as plt
sales = pd.read_excel('D:/Temp/Sales.xlsx', dtype={'Month': str})
print(sales)
plt.bar(sales.index,sales.Revenue)#柱状图
plt.title('Sales')
plt.xticks(sales.index,sales.Month,rotation=90)
plt.tight_layout()#紧凑布局
plt.show()
b、画趋势线
线性回归方程
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import linregress #引用科学计算库,关于统计相关的库,linregress线性回归的缩写
sales = pd.read_excel('D:/Temp/Sales.xlsx', dtype={'Month': str})
print(sales)
#slope:坡度、斜率;
# intercept:在y轴的截距
#r:
#p:
#std_err:标准差
#sales.index, sales.Revenue对应得分别是X轴,Y轴
slope, intercept, r, p, std_err = linregress(sales.index, sales.Revenue)
#exp:期望值,
exp = sales.index * slope + intercept
plt.scatter(sales.index,sales.Revenue)#柱状图
plt.plot(sales.index,exp,color='orange')
plt.title('Sales')
plt.xticks(sales.index,sales.Month,rotation=90)
plt.tight_layout()#紧凑布局
plt.show()
线性回归方程的值
把
plt.title('Sales')
换成
plt.title(f"y={slope}*X+{intercept}")
2、数据预测
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import linregress #引用科学计算库,关于统计相关的库,linregress线性回归的缩写
sales = pd.read_excel('D:/Temp/Sales.xlsx', dtype={'Month': str})
print(sales)
#slope:坡度、斜率;
# intercept:在y轴的截距
#r:
#p:
#std_err:标准差
#sales.index, sales.Revenue对应得分别是X轴,Y轴
slope, intercept, r, p, std_err = linregress(sales.index, sales.Revenue)
#exp:期望值,
exp = sales.index * slope + intercept
print(slope*35+intercept)#数据预测的值,35的值是指编号为35的列,也是2019的一年12月,从23往后开始
plt.scatter(sales.index,sales.Revenue)#柱状图
plt.plot(sales.index,exp,color='orange')
plt.title(f"y={slope}*X+{intercept}")
plt.xticks(sales.index,sales.Month,rotation=90)
plt.tight_layout()#紧凑布局
plt.show()
数据预测2019一年的值
四、行操作、列操作
1、行操作
a、原始数据
# 追加已有
students = page_001.append(page_002).reset_index(drop=True)
# 追加新建
stu = pd.Series({'ID': 41, 'Name': 'Abel', 'Score': 90})
students = students.append(stu, ignore_index=True)
# 删除(可切片)
students = students.drop(index=[39, 40])
# 插入
stu = pd.Series({'ID': 100, 'Name': 'Bailey', 'Score': 100})
part1 = students[:21] # .iloc[] is the same
part2 = students[21:]
students = part1.append(stu, ignore_index=True).append(part2).reset_index(drop=True)
# 更改
stu = pd.Series({'ID': 101, 'Name': 'Danni', 'Score': 101})
students.iloc[39] = stu
# 设置空值
for i in range(5, 15):
students['Name'].at[i] = ''
# 去掉空值
missing = students.loc[students['Name'] == '']
students.drop(missing.index, inplace=True)
print(students)
2、列操作
a、原始数据
import pandas as pd
import numpy as np
page_001=pd.read_excel('D:/Temp/Students.xlsx',sheet_name='Page_001')
page_002=pd.read_excel('D:/Temp/Students.xlsx',sheet_name='Page_002')
#两张表放在一起
students=pd.concat([page_001,page_002])
print(students)
两张一样的表放在一起(串联)
#两张表放在一起(串联)
students=pd.concat([page_001,page_002]).reset_index(drop=True)
两张表放在一起(并联):
students=pd.concat([page_001,page_002],axis=1)
追加列:
import pandas as pd
import numpy as np
page_001=pd.read_excel('D:/Temp/Students.xlsx',sheet_name='Page_001')
page_002=pd.read_excel('D:/Temp/Students.xlsx',sheet_name='Page_002')
#两张表放在一起(并联)
students=pd.concat([page_001,page_002]).reset_index(drop=True)
students['Age']=25 #追加一列年龄25
print(students)
students['Age']=np.arange(0,len(students)) #追加一列年龄25
删除列:
students.drop(columns=['Age','Score'],inplace=True)#删除Age和score两列
在ID和Name中间插入一列
# 插入列
students.insert(1, column='Foo', value=np.repeat('foo', len(students)))
# 改列名
students.rename(columns={'Foo': 'FOO', 'Name': 'NAME'}, inplace=True)
设置空值
students['ID'] = students['ID'].astype(float)
for i in range(5, 15):
students['ID'].at[i] = np.nan
# 去掉空值
students.dropna(inplace=True)
五、复杂计算列
1、原始数据
第一种方法
import pandas as pd
import numpy as np
#计算外接圆的面积
def get_circumcircle_area(l, h): #两个边长
r = np.sqrt(l ** 2 + h ** 2) / 2
return r ** 2 * np.pi
#填充计算列只是一行,现在填取多列
def wrapper(row):
return get_circumcircle_area(row['Length'], row['Height'])
rects = pd.read_excel('D:/Temp/Rectangles.xlsx', index_col='ID')
rects['C A'] = rects.apply(wrapper, axis=1)
print(rects)
第二种方法
import pandas as pd
import numpy as np
#计算外接圆的面积
def get_circumcircle_area(l, h): #两个边长
r = np.sqrt(l ** 2 + h ** 2) / 2
return r ** 2 * np.pi
rects = pd.read_excel('D:/Temp/Rectangles.xlsx', index_col='ID')
rects['C A'] = rects.apply(lambda row: get_circumcircle_area(row['Length'], row['Height']), axis=1)
print(rects)