第一部分
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time
# 数据加载
# pd.read_"文件类型"("./文件名称.后缀",header=None) #如果第一行不是列索引,header=None
# 参数:sep="\t" 指定读取文件时的分隔符,常用于txt文件 还有sep="," 逗号分隔符
# name=list("ABC") 如果第一行不是列名,用name属性可以为读进来的数据设置列名
# sqlite3数据库数据加载
# import sqlite3
# con = sqlite3.Connection("./data.sqlite") # 连接数据库
# df = pd.read_sql("sql语句(select * from Weather_2017)", con) # 读取数据库中的数据
# df = pd.read_sql("sql语句(select ~Date/Time~ from Weather_2017)", con) # 单个属性列名两个词或/ 用~括起来
# df.shape
# df.to_sql("数据表名称",con,index=Fales(不写入index),chunksize=1024(一次性写入多少数据)) 具体参数看源码介绍
# 保存数据到剪贴板
# df.to_clipboard()
# 根据url获取网络上的数据
# 虚假例子:pd.read_csv("https://www.baidu.com/data.csv") 直接获取网上的csv数据
# 读写mysql数据
import pymysql
con = pymysql.Connection(host="127.0.0.1", port=3306, user="root", password="root", database="books", charset="utf-8")
pd.read_sql("sql语句", con=con) # 读取数据
# 向mysql中写入数据,需要使用sql引擎,需要安装两个库 mysqlclient和sqlalchemy
from sqlalchemy import create_engine
# 创建引擎连接数据库
engine = create_engine("mysql+pymysql://root:root@localhost:3306/books?charset=utf8")
# df.to_sql("表名",engine)
start = time.perf_counter()
print()
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")
第二部分
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time
# 全局配置pandas
pd.set_option('display.max_columns', None) # None显示所有列
pd.set_option('display.max_rows', 100) # None显示所有行
pd.set_option('display.width', None) # 无限宽度
pd.set_option('display.max_colwidth', 100) # 设置value的显示长度为100,默认为50
pd.set_option("display.float_format", lambda x: "%0.2f" % (x)) # 保留两位小数
# 用pandas展示数据输出时列名不能对齐,是列名用了中文的缘故
# 用下面两个参数 它们的默认设置都是False
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df1 = DataFrame(np.random.randint(0, 150, size=(6, 3)), columns=["Python", "Math", "En"],
index=pd.MultiIndex.from_product([["张三", "李四", "A活宝"], ["期中", "期末"]]))
# dd = df1.loc["张三":"A活宝"] # 切片 如果是单层索引切片没有问题
# 如果是多层索引这样切片会报错,没有排序,因为排序后A_到了第一行
# dd = df1.loc["张三":"A活宝"] # 切片 这一行会报错
df1 = df1.sort_index()
# dd = df1.loc["A活宝":"张三"] # 排序之后再重新切片
# 删除重复元素
# 使用duplicated()方法检测重复的行,返回元素为布尔类型的Series对象,
# 每个元素对应一行,如果该行不是第一次出现,则元素为True
df2 = DataFrame({"color": ["red", "blue", "yellow", "red"], "price": [10, 15, 20, 10]}, index=list("ABCD"))
# drop_duplicates()直接删除重复数据 dropna()删除空数据 drop()删除行和列
# dd = df2.drop_duplicates()
# 映射
# 映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
# 需要时会用字典:
# map = {"label1": "value1", "label2": "value2", ...}
# 包含三种操作:
# 1、replace()函数:替换元素
# 2、最重要-->map()函数:新建一列
# 3、rename()函数:替换索引
# dd = df2.replace(to_replace={10: 18, 15: 19})
df3 = DataFrame(np.random.randint(0, 150, size=(150, 3)), columns=["Python", "Math", "En"])
df3["Python"] = df3["Python"].map(lambda x: x + 10) # Python列下面每一个元素加10
# 把平均分数转换成等级 x就是df3["level"]这一列中的每一个元素
def convert_level(x):
if x < 60:
return "不及格"
elif x < 90:
return "及格"
else:
return "优秀"
df3["level"] = df3.mean(axis=1).map(convert_level)
df3["Java"] = df3["Python"].map(lambda x: x + 10) # Java是Python+10创建,相关性很强
# 使用相关性系数才好看数据
# method:可选值为{‘pearson’, ‘kendall’, ‘spearman’}
# pearson:Pearson相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性 数据便会有误差。
# kendall:用于反映分类变量相关性的指标,即针对无序序列的相关系数,非正太分布的数据
# spearman:非线性的,非正太分析的数据的相关系数
# min_periods:样本最少的数据量
# dd = df3.corr(method="pearson", min_periods=1)
# 灵活的map()和transform()用法基本一样
# dd = df3["Python"].map(lambda x: x / 2) + df3["Java"].transform(lambda x: x / 2)
# 替换索引
# dd = df3.rename({0: "A", 3: "B"}) # 行索引替换
dd = df3.rename({"En": "英语", "Java": "程序"}, axis=1) # 行索引替换
start = time.perf_counter()
print(dd)
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")
第三部分
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time
# 全局配置pandas
pd.set_option('display.max_columns', None) # None显示所有列
pd.set_option('display.max_rows', 100) # None显示所有行
pd.set_option('display.width', None) # 无限宽度
pd.set_option('display.max_colwidth', 100) # 设置value的显示长度为100,默认为50
pd.set_option("display.float_format", lambda x: "%0.2f" % (x)) # 保留两位小数
# 用pandas展示数据输出时列名不能对齐,是列名用了中文的缘故
# 用下面两个参数 它们的默认设置都是False
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 随机数学习地址https://blog.csdn.net/u012149181/article/details/78913167
# randn()函数返回一个或一组样本,具有标准正态分布
df1 = DataFrame(np.random.randn(100000, 3), columns=["red", "green", "blue"])
cond = df1.abs() - df1.mean() > 3 * df1.std() # 过滤异常值的条件
cond = cond.any(axis=1) # 一个Series的bool值条件
# dd = df1[cond] # 所有的异常值行 df1[cond].index异常值行索引
# drop中的labels是按照索引删除,默认是行索引
# dd = df1.drop(labels=df1[cond].index)
# print(df1.shape, dd.shape) 查看前后形状变化
# 随机抽样 take就是取,拿的意思
# dd = df1.take(indices="index数组") 根据index随机抽样
# 分层抽样 比如:老人,孩子 男人,女人 工人,农民等层级
# 随机排序 np.random.permutation()
dd = df1.sort_values(by="red", ascending=False) # 按照列的值降序排序
# 将一列日期的数据对象,转换为时间格式 假设该列为2020-02-02的数据 纳秒
# df1["red"] = pd.to_datetime(df1["red"]) 转化日期格式datatime64[ns]
# 重采样,根据时间进行划分,划分成天D,月M,年Y
# grouped = df1.groupby("red")
# grouped.resample("M")
# 时间是一个非常重要的结构化数据 在绘图时,会自动检测时间
start = time.perf_counter()
print(dd)
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")
第四部分
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time
# 数据分析,大多数的时候都是分组聚合操作 groupby()操作很频繁
# 选取候选人A,B的自己数据
# cand_nm 是候选人的名单
# 方式一:
# cond1 = df1["cand_nm"] == "A" # 找到子集A的条件
# cond2 = df1["cand_nm"] == "B" # 找到子集B的条件
# cond = cond1 | cond2 # 两个条件合在一起 是或者的关系
# dd = df1[cond] # 根据条件找到数据
# 方式二
# dd = df1.query("cand_nm" == "A" or "cand_nm" == "B")
# 方式三
# cond = df1["cand_nm"].isin(["A","B"]) # 可以向列表中继续追加条件 isin适用于==的条件
# df2 = df1[cond]
# 使用cut()函数 面圆化数据 类似把数据规划分组
# bins = [0, 1, 10, 100, 1000, 10000]
# labels = pd.cun(df1["列名"], bins)
# 透视表pivot_table分析党派和职业
# 按照党派、职业队赞助金额进行汇总
# 汇总的列名 每行职业不同 两个党派为列索引 汇总用聚合函数sum NaN为0
# ret = df1.pivot_table("金额列名", index="职业", columns="党派", aggfunc="sum",fill_value=0)
# 过滤掉金额小于200的数据
# cond = ret["总金额"] < 200 条件对象 是一个bool的数组
# index = ret[cond].index 根据条件找到索引
# dd = ret.drop(labels=index) 根据索引删除行数据
# 如果在ply中绘图,没法改变图的尺寸,绘制一个子图,让数据在子图中显示
# plt.figure(figsize=(12, 9))
# ax = plt.subplot(1, 1, 1)
# ret.plot(kind="bar", ax=ax)
# 在分组运算时,可以先分组得到一个grouped分好组的对象,这个对象可以继续分组
# def get_top_amounts(grouped, key, n):
# 按照key分组之后,在按照amt求和 排序 返回前n行数据
# return grouped.groupby(key)["amt"].sum.sort_values(ascending=False)[:n]
#
#
# grouped = df1.groupby("name") 行索引变列索引
# grouped.apply(get_top_amounts, "key", 5).unstack(level=0) 应用上面的行数,回调函数后面传参
# 重采样和频度转换 只要行索引是时间类型,就可以重采样,就是每秒转一小时,每天转一个月
# 重采样(resampling)指的是把时间序列的频度变为另一个频度的过程
# 把高频度的数据变为低频度叫做 降采样downsampling,resampling会对数据进行分组,然后再调用聚合函数。
# 把频率从每日转为每月,属于高频转低频的降采样
# df1_time.groupby(["分组列名"]).resample("M")["mat"].sum()
# 绘制地图
# basemape 工具包 用来绘制地图 无法安装时--》https://www.lfd.uci.edu/~gohlke/pythonlibs/
# from mpl_toolkits.basemap import Basemap
# plt.figure(figsize=(12,9))
# m = Basemap(各种参数)
# m.drawciastlines(linewidth=1.5)
# m.drawcountries(linewidth=1.5)
# m.drawstates() m.shapefile("./文件名",name="名字") 下载文件https://gadm.org/download_country_v3.html
# plt.show()
# 颜色 cm支持的颜色 https://matplotlib.org/gallery/color/colormap_reference.html
# 绘制热地图https://www.bilibili.com/video/av87390006?p=40
cmap = plt.cm.ocean
for i in range(10):
plt.plot(np.arange(10) + i, c=cmap((i + 1) / 10))
pyplot.show()