《封号码罗》数据分析与人工智能之pandas(四)

第一部分

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()

发布了30 篇原创文章 · 获赞 5 · 访问量 3321

猜你喜欢

转载自blog.csdn.net/Python_DJ/article/details/104335220
今日推荐