这一周学习了更多关于数据分析的相关知识,知道了一些方法,解决了一些之前困惑我的东西。
我之前很缺乏数据进行相关操作,但这周我学习了如何从各个网页中爬取一定的数据资源。
我之前对这些数据不能直观的展现而感到枯燥,但学习了matplotlib之后,将一些数据通过图像展现出来也变得十分有趣。
同时也学习了数组矩阵的乘法,pandas中数据的增删改,数据抽取,数据清洗,索引的重新设置,数据的排序和排名。
例如抓取证监会披露的IPO数据
from pandas import DataFrame
import csv
pd.set_option('display.unicode.east_asian_width', True) # 对齐数据
df3 = pd.DataFrame(data=None, columns=['公司名称', '披露类型', '上市板块', '保荐机构', '披露时间', '公告'])
url = 'http://eid.csrc.gov.cn/ipo/1017/index.html'
df3_1 = pd.read_html(url, encoding='utf-8')[0]
print(df3_1)
df3_1.to_csv('证监会披露的IPO数据', index=False) #把数据存储到'证监会披露的IPO数据.csv'这个文件夹中
抓取NBA球员的薪水信息
url = 'http://www.espn.com/nba/salaries'
df = pd.DataFrame() # 创建一个空的DateFrame对象
# 给DataFrame对象添加对象
df = df.append(pd.read_html(url, header=0))
print(df)
# 将数据保存成CSV文件
df2 = df.to_csv('nba_salary.csv', index=False)
numpy中dot|@的用法 (向量点积和矩阵乘法)
向量点积
b1 = np.array([1, 2, 3, 4, 5, 6, 7])
b2 = np.array([2, 3, 4, 5, 6, 7, 8])
result = np.dot(b1, b2)
# 向量的内积
print(result)
原理:
矩阵乘法
x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[2, 3], [4, 5], [6, 7]])
result = np.dot(x, y)
print(result)
print('x阶数:' + str(x.shape))
print('y阶数:' + str(y.shape))
print('result阶数:' + str(result.shape))
结果为
原理
矩阵要是行等于列的两个矩阵
矩阵与向量相乘,向量往往要倒置。 通常使用array.T进行倒置 可一维数组不能使用,这时可以将数组转为matrix再进行倒置
x1 = np.array([[1, 2, 3], [4, 5, 6]])
y1 = np.matrix(np.array([1, 2, 3]))
result = np.dot(x1, y1.T)
print(result)
矩阵相乘的得到的矩阵形状规律就是(a,b)*(c,d) = (a,d)
关于pandas处理数据的一些基础操作
import pandas as pd
data = [[45, 65, 100], [56, 45, 50], [67, 67, 76]]
t = pd.DataFrame(data, columns=['数学', '语文', '英语'],
index=['张三', '李四', '王五'])
# 数据的修改
print(t)
# 直接使用columns属性
t.columns = ['数学(上)', '语文(上)', '英语(上)']
print(t)
# rename 重新赋值
# 修改列索引
t.rename(columns={'数学(上)': '数学(下)', '语文(上)': '语文(下)', '英语(上)': '英语(下)'}, inplace=True)
print(t)
# 修改行索引
t.index = list('abc')
print(t)
t.rename(index={'a': '一一', 'b': '二二', 'c': '三三'}, inplace=True)
print(t)
# 修改一整行数据
t.loc['一一'] = [100, 100, 120]
print(t)
t.iloc[0, :] = [90, 90, 90]
print(t)
# 修改所有行的数据
t.loc[:, '数学(下)'] = [90, 90, 90]
print(t)
# 修改某一处的数据
t.loc['二二', '语文(下)'] = 100
print(t)
t.iloc[1, 1] = 80
print(t)
# 删除数学列
print(t)
t.drop(['数学'], axis=1, inplace=True)
t.drop(columns='数学', inplace=True)
print(t)
# 删除数学成绩小于60的 (删除指定列)
t.drop(t[t['数学'] < 60].index, inplace=True)
print(t)
数据清洗
import pandas as pd
print('数据清洗--处理缺失值和重复值')
data = []
t = pd.DataFrame(data)
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('excel数据.xlsx') # 读取相关数据
print(df.info()) # 查看是否有缺失值
# 删除有缺失值的那一行数据
df = df.dropna()
print(df)
# 将数据中的nan赋值为零
df['列索引'] = df['列索引'].fillna(0)
print(df)
# 判断是否具有重复值 duplicated()
print(df.duplicated())
# 重复值就要删除
print('去除掉全部的重复数据, 指的是行内容全部要重复')
df = df.drop_duplicates()
print(df)
print('去除指定列的重复数据,保留重复行中的最后一行')
df = df.drop_duplicates(['列索引'])
print(df)
设置索引
行索引
pd.set_option('display.unicode.east_asian_width', True) #
print(df.reindex(['www', 'qqq', 'eee', 'rrr', 'ttt']))
# 列索引
print(df.reindex(columns=['数学', '语文', '英语', '政治', '历史']))
df1 = df.reindex(index=['www', 'qqq', 'eee', 'rrr', 'ttt'],
columns=['数学', '语文', '英语', '政治', '历史'],
fill_value=0)
print(df1)
# 主要是在数据清洗过后需要重新设置连续的索引
df = df.dropna().reset_index(drop=True)
print(df)
继续学习!