catálogo de conocimientos
prefacio
1. Cargar datos
En el pasado, cuando practicábamos, básicamente usábamos los datos que simulamos, pero en escenarios comerciales reales, los datos generalmente ya existen y algunos necesitan usar tecnología de rastreo para obtenerlos. Los datos que ya existen generalmente tienen
CSV
formato,Excel
format y数据库中存储的数据
.
A continuación, daremos pandas
una breve introducción sobre cómo cargar y almacenar datos en estos formatos.
Tips⭐️
: almacenar datos en un archivo es una llamada de objeto de marco de datos, y leer un archivo es una llamada de pandas.
1 - Cargar archivo CSV
Los archivos CSV (valores separados por comas) se pueden transferir y leer fácilmente entre diferentes sistemas operativos, software y plataformas, por lo que a menudo se utilizan para el almacenamiento y el intercambio de datos.
Por ejemplo, los datos de registro de usuarios del sitio web, los datos de estudios de mercado, etc., pueden almacenarse y transmitirse en forma de archivos CSV.
- Guardar en archivo CSV
df.to_csv(path_or_buf=None,
sep=',',
columns=None,
header=True,
index=True
)
parámetro | significado |
---|---|
camino_o_buf | Ruta de almacenamiento y nombre de archivo |
sep | delimitador, coma por defecto |
columnas | Columnas para almacenar, o todas las columnas si no se especifica |
encabezamiento | Ya sea para mantener los nombres de las columnas |
índice | Ya sea para mantener el índice de fila |
Aquí hay un ejemplo de código:
# 导入模块
import numpy as np
import pandas as pd
# 创建要存储到csv文件的dataframe对象
data = np.random.randint(0,100,(5,3))
df = pd.DataFrame(data,columns=['Python','Java','BigData'])
# 存入到当前目录下的07.csv文件中
df.to_csv(path_or_buf='./07.csv',sep=',',header=True,index=False)
- leer archivo CSV
pd.read_csv(
filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]],
sep=',',
header='infer',
names=None,
index_col=None,
usecols=None,
)
parámetro | efecto |
---|---|
ruta_archivo_o_búfer | ruta de archivo y nombre de archivo, o un objeto IO |
sep | delimitador, el valor predeterminado es coma |
encabezamiento | Predeterminado = 0, significa usar la primera fila como nombre de columna |
nombres | Tipo de lista, si no se especifica ningún encabezado, si se especifican nombres, los nombres se utilizarán como nombres de columna |
index_col | Especificar una columna como índice de fila |
usecols | Leer solo ciertas columnas, por defecto leer todo |
Aquí hay un ejemplo de código:
# 读取当前路径下的07.csv的Java列
pd.read_csv(filepath_or_buffer='./07.csv',sep=',',header=0,usecols=['Java'])
2 - Cargar archivo Excel
Para las personas que no conocen la programación (como contadores, oficinistas y otras ocupaciones que no están relacionadas con la experiencia informática), los
excel
archivos son el formato de almacenamiento de archivos de datos que más utilizan.
- Guardar en archivo de Excel
df.to_excel(
excel_writer,
sheet_name='Sheet1',
columns=None,
header=True,
index=True,
)
parámetro | significado |
---|---|
excelente_escritor | ruta de archivo y nombre de archivo |
nombre_hoja | sheet El nombre de la página actual al escribir en excel |
columnas | columna de atributos para escribir |
encabezamiento | Qué fila del objeto df se usa como nombre de columna |
índice | Ya sea para mantener el índice de fila |
Ejemplo de código:
df.to_excel('./07.xlsx',sheet_name='Program Language',index=False)
- leer archivo de excel
pd.read_excel(
io,
sheet_name=0,
header=0,
names=None,
index_col=None,
usecols=None,
El significado del parámetro es similar al de leer el archivo CSV, así que no lo explicaré aquí~
3 - Cargar datos de la base de datos
La carga de datos de la base de datos es un escenario comercial que involucra muchos datos de almacenamiento de back-end. Aquí hay
MySQL
un ejemplo de datos.
La carga de datos de la base de datos MySQL primero requiere la instalación de dos paquetes ( pymysql
y sqlalchemy
)
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
- Almacenar en MySQL
df.to_sql(
name,
con,
schema=None,
if_exists='fail',
index=True,
)
parámetro | significado |
---|---|
nombre | Especifique el nombre de la tabla para almacenar |
estafa | objeto de conexión |
esquema | Motor de base de datos, si no se especifica, se utilizará el motor predeterminado del tipo de base de datos, como MySQLinnoDB |
si_existe | La operación cuando la tabla ya existe, hay {'fail', 'replace', 'append'} tres valores, que indican respectivamente el informe de errores, el reemplazo y la adición |
índice | Ya sea para escribir el índice de fila |
Ejemplo de código:
# 导入创建数据库连接的引擎
from sqlalchemy import create_engine
# 获取连接对象
conn = create_engine("mysql+pymysql://root:123456!!!!@localhost:3306/pytest")
# 保存到MySQL数据库
df.to_sql(name='program_language',con=conn,if_exists='append',index=False)
Nota: En la cadena para crear el objeto de conexión, solo es necesario modificar la cuenta y la contraseña de la base de datos (
root:123456!!!!
,IP
, ).端口
- leer de mysql
pd.read_sql(
sql,
con,
index_col=None,
coerce_float=True,
parse_dates=None
)
parámetro | significado |
---|---|
sql | cadena de comando SQL |
estafa | El motor conectado a la base de datos sql generalmente se puede construir con paquetes como SQLalchemy o pymysql |
index_col | Seleccionar una columna como índice |
coaccionar_flotar | Es muy útil leer la cadena en forma de número directamente como un flotante |
parse_dates | Convierta una columna de cadenas de fecha en datos de fecha y hora |
Ejemplo de código:
sql = 'SELECT Python FROM program_language;'
pd.read_sql(sql,conn)
dos, boxeo
La operación de binning se refiere a la división
连续数据离散化
(hablando comúnmente, dividir los datos en varios intervalos, como 100 números del 1 al 100, divididos en 0-25, 25-50, 50-75, 75-100, esta es la operación de binning) . Los métodos comunes de agrupamiento incluyen el método de igual ancho y el método de igual frecuencia.
Método de ancho igual : la diferencia de cada intervalo después de la discretización es igual.
La desventaja de esto es que el número de elementos contenidos en diferentes intervalos puede variar mucho.
Método de igual frecuencia : el número de elementos contenidos en cada intervalo después de la discretización es igual.
La desventaja de esto es que los mismos elementos pueden dividirse en diferentes intervalos.
1 - Agrupación monoespaciada
cut()
El agrupamiento de igual ancho se realiza a través de la función de pandas .
# 待分箱数据
year = [1992, 1983, 1922, 1932, 1973]
# 指定箱子的分界点
bins = [1900, 1950, 2000]
# 分箱操作
result = pd.cut(year, bins)
# 结果显示的是每个数据在哪个区间内
print(result)
# 对不同箱子中的数进行计数
print(pd.value_counts(result))
# labels参数为False时,返回结果中用不同的整数作为箱子的标签
result2 = pd.cut(year, bins,labels=False)
# 输出结果中的数字对应着不同的箱子
print(result2)
# 对不同箱子中的数进行计数
print(pd.value_counts(result2))
# 给箱子指定标签
group_names = [ '50_before', '50_after']
result3 = pd.cut(year, bins, labels=group_names)
print(pd.value_counts(result3))
2 - Agrupación de igual frecuencia
Use la función en pandas
qcut
para realizar un agrupamiento de igual frecuencia. Después del agrupamiento, la cantidad de datos en cada cuadro es la misma.
# 待分箱数据
year2 = [1992, 1983, 1922, 1932, 1973, 1999, 1993, 1995]
# 参数q指定所分箱子的数量
result4 = pd.qcut(year2,q=4)
# 从输出结果可以看到每个箱子中的数据量时相同的
print(result4)
print(pd.value_counts(result4))
3. Serie temporal
Al realizar análisis de datos relacionados con series temporales, el procesamiento de series temporales es algo natural, y pandas proporciona muchos métodos para procesar series temporales. Nota : este artículo solo presenta brevemente los métodos relacionados con el procesamiento de series temporales de pandas. Para obtener más información, consulte otros materiales.
Antes de introducir series de tiempo, necesitamos introducir dos conceptos: marca de tiempo pd.Timestamp
y período de tiempo pd.Period
.
Marca de tiempo: La marca de tiempo es la serie de datos de tiempo más básica, utilizada para asociar valores con puntos de tiempo. Los objetos pandas llaman a datos de un punto en el tiempo por marca de tiempo.
Período de tiempo: el período de tiempo representado por Período es más intuitivo y también se puede inferir con una cadena en formato de fecha y hora.
Tanto la marca de tiempo como el período de tiempo se pueden sumar y restar con números enteros, con freq
el parámetro especificado como unidad.
1 - Creación de Marca de tiempo y Período
# 创建时间戳
ts1 = pd.Timestamp('2023-8-5')
# 创建时间段
pd1 = pd.Period('2023-8-5',freq='M')
# 创建时间戳范围(periods表示数据量,freq 表示精确到年/月/日)
ts2 = pd.date_range('2022-02-7',periods=4,freq='M')
# 创建时间段范围
pd2 = pd.period_range('2023-8-5',periods=4,freq='M')
display(ts1,ts2,pd1,pd2)
# 时间戳索引
index = pd.date_range('2023-8-5',periods=4,freq='D')
s = pd.Series(np.random.randint(0,10,4),index=index)
s
Además, hay algunas conversiones relacionadas con las marcas de tiempo. pd.to_datetime: convierte la cadena o la marca de tiempo al formato de hora, pd.DateOffset: calcula la diferencia horaria.
# 字符串转日期
pd.to_datetime(['2023-8-4','2023/8/4','08/04/2023','2023.8.4'])
# 时间戳转日期
pd.to_datetime([1233123123],unit='ms')
# 计算时间差
ts = pd.Timestamp('2023-8-5')
ts + pd.DateOffset(hours=1,days=-1)
2 - Indexación y corte
La indexación y división de marcas de tiempo, de forma similar a la indexación y división de matrices, utiliza corchetes.
# 首先创建时间戳对象
index = pd.date_range('2023-8-5',periods=100,freq='D')
ts = pd.Series(range(len(index)),index)
# 索引
ts['2023-8-12'] # 取一天
ts['2023-8'] # 取8月整个月
ts['2023'] # 取一年
ts[pd.Timestamp('2023-8-20')] # 时间戳索引
# 切片
ts['2023-8-7':'2023-8-20']
ts[pd.Timestamp('2023-8-10'):pd.Timestamp('2023-8-20')] # 时间戳切片
ts[pd.date_range('2023-8-10',periods=4,freq='D')]
3 - Propiedades y Movimiento
# 属性
ts.index # 索引
ts.index.year # 年份
ts.index.month # 月份
ts.index.dayofweek # 星期
# shift方法
index = pd.date_range('2023-1-20',periods=365,freq='D')
ts = pd.Series(np.random.randint(0,100,len(index)),index)
ts.shift() # 向下移动1位
ts.shift(2) # 向下移动两位
ts.shift(-2) # 向上移动两位
4 - Conversión de frecuencia
La conversión de frecuencia es la operación de cambiar el intervalo de fechas.
# 频率转换
# 由天变为星期,由少变多,去掉了一些数据
ts.asfreq(pd.tseries.offsets.Week())
# 由天变小时,多了一些空数据
ts.asfreq(pd.tseries.offsets.Hour())
# 使用 fill_value 填充
ts.asfreq(pd.tseries.offsets.Hour(),fill_value=0)
5 - Agregación de datos
# 首先查看 ts
ts
# 将两天的日期合并,数据相加
ts.resample('2D').sum()
# 将两周的日期合并,数据相加
ts.resample('2W').sum()
d = {
'price':np.random.randint(0,50,8),
'score':range(10,90,10),
'week':pd.date_range('2023-8-5',periods=8,freq='w')
}
df = pd.DataFrame(d)
df
# 对week列按月汇总
df.resample('M',on='week').sum()
# 按照月汇总,price求平均值,score求和
df.resample('M',on='week').agg({
'price':np.mean,'score':np.sum})
Cuarto, los pandas dibujan gráficos.
Pandas es una poderosa herramienta para el procesamiento de datos. De hecho, también puede dibujar rápidamente gráficos simples basados en él
matplotlib
. Para gráficos complejos , necesita usar matplotlib u otras bibliotecas . pandas dibuja varios gráficos a través de funciones.plot()
Debido a que pandas dibuja gráficos basados en matplotlib, es necesario importar el paquete matplotlib.
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
Hay dos formas de escribir gráficos en pandas, que son formas equivalentes de escribir, donde pd
se refiere a objetos Series u objetos DataFrame.
Las siguientes dos formas de escribir
pd.plot.图象类型()
pd.plot(kind = '图象类型')
Por ejemplo
df = pd.DataFrame(np.random.randint(0,100,(4,2)),columns=list('AB'))
df.plot(kind = 'line')
# =====等价于=====
df.plot.line()
# =====都表示绘制折线图,饼图、直方图等都是这样=====
1 - Gráfico de líneas
El gráfico de la serie se muestra a continuación.
data = np.random.randint(0,50,20)
s = pd.Series(data=data)
# 等价于 s.plot(),s.plot(kind='line'),kind默认等于line,所以可以省略
s.plot.line()
Debido a que los datos se generan aleatoriamente, el gráfico de líneas que dibuje puede ser diferente al mío.
A continuación se muestra la trama de DataFrame
data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','English'])
df.T.plot(kind='line') # 转置后绘制折线图
2 - Histograma
Serie para dibujar un histograma
data = np.random.randint(0,100,5)
s = pd.Series(data=data,index=['Chinese','Math','English','history','computer'])
s.plot(kind='bar')
DataFrame dibuja histograma
data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','English'])
df.plot(kind='bar')
gráfico de columnas apiladas
df.plot(kind = 'bar',stacked = True)
# 条形图
df.plot(kind='barh')
# ====== df.plot.barh()
3 - Histograma
data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','Englist'])
df.plot(kind='hist',density=True)
4 - Gráfico circular
data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','Englist'])
df['Chinese'].plot(kind='pie',autopct='%.1f%%')
Si desea dibujar un gráfico circular en el objeto del marco de datos, debe agregar subplots=True
el parámetro.
df.plot(kind='pie',autopct='%.2f%%',subplots=True) # 绘制子图
5 - Diagrama de dispersión
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')
6 - Diagrama de caja
df.plot(kind='box')
El significado de los números en la figura: 1 representa el valor máximo, 2 es 75% mayor, 3 es 1/2 mayor, 4 es 25% mayor y 5 es el mínimo.
7 - Gráfico de áreas
df.plot.area(stacked=True)
El área correspondiente a cada color representa su tamaño.
epílogo
Este artículo explica principalmente los pandas cargando datos, agrupando operaciones y series de tiempo, y dibujando varios gráficos.
⭐️Si hay algo que no entiende, discútalo conmigo~
Soy Xiangyanghuahuahuahua, en el camino de la ciencia de datos, caminaré contigo⭐️