1、时间序列相关操作
pd的date_range中的基本时间序列频率
|
Alias |
Description(偏移量类型) |
说明 |
|
B |
business day frequency |
每工作日 |
|
C |
custom business day frequency |
自定义工作日频率 |
|
D |
calendar day frequency |
每日历日 |
|
W |
weekly frequency |
每周 |
|
M |
month end frequency |
每个月最后一个日历日 |
|
SM |
semi-month end frequency (15th and end of month) |
每月第一个日历日 |
|
BM |
business month end frequency |
每月最后一个工作日 |
|
CBM |
custom business month end frequency |
自定义每月最后一个工作日 |
|
MS |
month start frequency |
每月第一个日历日 |
|
SMS |
semi-month start frequency (1st and 15th) |
|
|
BMS |
business month start frequency |
每个月第一个工作日 |
|
CBMS |
custom business month start frequency |
自定义每个月第一个工作日 |
|
Q |
quarter end frequency |
对于以指定月份结束的年度,每季度最后一月的最后一个日历日 |
|
BQ |
business quarter end frequency |
对于以指定月份结束的年度,每季度最后一个月的最后一个工作日 |
|
QS |
quarter start frequency |
对于以指定月份结束的年度,每季度最后一个月的第一个工作日 |
|
BQS |
business quarter start frequency |
自定义对于以指定月份结束的年度,每季度最后一个月的第一个工作日 |
|
A, Y |
year end frequency |
|
|
BA, BY |
business year end frequency |
|
|
AS, YS |
year start frequency |
|
|
BAS, BYS |
business year start frequency |
|
|
BH |
business hour frequency |
工作每小时 |
|
H |
hourly frequency |
每小时 |
|
T, min |
minutely frequency |
每分 |
|
S |
secondly frequency |
每秒 |
|
L, ms |
milliseconds |
每毫秒 |
|
U, us |
microseconds |
每微秒 |
|
N |
nanoseconds |

2、三种透视图操作方法
import pandas as pd
import numpy as np
v = [1, 2, 3, 3, 3]
a = pd.DataFrame({'v': v})
d = [2 , 4, 4, 5, 4]
a['d'] = d
c = ['c' , 'h', 'd', 'e', 'c']
a['c'] = c
a.head()
####a的数据状况为:
v d c
0 1 2 c
1 2 4 h
2 3 4 d
3 3 5 e
4 3 4 c
# df用两个列进行分组groupby
a.groupby(['v','d'])['c'].count()
### 分组结果为:
v d
1 2 1
2 4 1
3 4 2
5 1
Name: c, dtype: int64
将上步得到的数据行列转换:v列的值做index, d列的值做columns,将数据对应填入
以下为三种操作方法
2.1 crosstab
cpd = pd.crosstab(a['v'], a['d'], a['c'], aggfunc='count') cpd ## 结果为: d 2 4 5 v 1 1.0 NaN NaN 2 NaN 1.0 NaN 3 NaN 2.0 1.0 # 将上步所得结果空值填充为0 cpb.fillna(0,inplace=True)
2.2 pivot_tabel
a.groupby(['v', 'd'], as_index=False)['c'].count().pivot_table(
index=['v'],
columns=['d'],
values='c',
aggfunc='count').fillna(0)
## 结果为:
d 2 4 5
v
1 1.0 0.0 0.0
2 0.0 1.0 0.0
3 0.0 1.0 1.0
2.3 pivot
a.groupby(['v', 'd'], as_index=False)['c'].count()
## 结果为:
v d c
0 1 2 1
1 2 4 1
2 3 4 2
3 3 5 1
a.groupby(['v', 'd'], as_index=False)['c'].count().pivot("v","d","c").fillna(0)
### 结果为:
d 2 4 5
v
1 1.0 0.0 0.0
2 0.0 1.0 0.0
3 0.0 2.0 1.0
3、groupby后接各种便利操作
3.1 groupby本体
for ind,data in a.groupby(['v','d']):
print(ind,data)
3.2 groupby--agg
a.groupby(['v','d']).agg({"c":["count"]})
# 哪些列所需的函数操作只需要列为key, 函数作为value,或value list
# 结果为:
c
count
v d
1 2 1
2 4 1
3 4 2
5 1
# 常用的函数有:count,min,max,median,mean,sum,cumsum
3.3 groupby--transform
transform可使groupby的结果去索引化一一填充,作用类似a.groupby(['v', 'd'], as_index=False)['c'].count()
a.groupby(['v','d'])['c'].transform('count')
## 结果为:
0 1
1 1
2 2
3 1
4 2
Name: c, dtype: int64
4、apply
def func(x):
if x=="c":
x = 3
elif x=="d":
x = 4
elif x=="e":
x = 5
else:
x = 6
return x
a['c'].apply(func)
## 结果为:
0 3
1 6
2 4
3 5
4 3
a['c'].apply(lambda x: 1 if x=="c" else 0)
5、多个sheet写入excel
pd.ExcelWriter(path) as fp:
df1.to_excel(fp,sheet_name="")
df2.to_excel(fp,sheet_name="")
df3.to_excel(fp,sheet_name="")
6、大数据加速处理Tips
6.1 分块读取
def get_df(file):
mylist = list()
for chunk in pd.read_csv(file,sep=',',chunksize=1000000):
mylist.append(chunk)
temp_df = pd.concat(mylist,axis=0)
del mylist
return temp_df
6.2 swifter--针对apply的加速包
# Swifter可以检查你的函数是否可以向量化,如果可以,就使用向量化计算 # 直接在apply在前面加上swifter就行 df.swifter.apply()
6.3 category
Pandas中有一种特殊的数据类型叫做category。它表示的是一个类别,一般用在统计分类中,比如性别,血型,分类,级别等等。
- Categories是从数据中推断出来的。
- Categories是没有大小顺序的。
会比原始数据类型占用的内存少。
但是category数据类型后续操作不方便,比如填充空值就会报错,可将其转化成对应的code
.astype('category').cat.codes---->直接将series分类后映射成数值。
6.4 glob--读取批量数据
glob包,这个包将一次处理多个csv文件。可以使用data/*. CSV模式来获取data文件夹中的所有csv文件。
pandas没有本地的glob支持,因此我们需要循环读取文件。
import glob
all_files = glob.glob('data/*.csv')
dfs = []
for fname in all_files:
dfs.append(pd.read_csv(fname, parse_dates=['Date']))
df = pd.concat(dfs, axis=0)
dfsum = df.groupby(df['Date'].dt.year).sum()
6.5 Vaex
- Vaex 是一个开源的DataFrame库(类似于Pandas),对和你硬盘空间一样大小的表格数据集,它可以有效进行可视化、探索、分析甚至进行实践机器学习。
- Vaex 采用内存映射、高效的核外算法和延迟计算等概念。
- Vaex 要求将CSV转换为HDF5格式,才能看到Vaex的优点。
HDF5是一种全新的分层数据格式产品,由数据格式规范和支持库实现组成。 HDF5旨在解决较旧的HDF产品的一些限制,满足现代系统和应用需求。 HDF5文件以分层结构组织,其中包含两个主要结构:组和数据集。 HDF5 group:分组结构包含零个或多个组或数据集的实例,以及支持元数据(metadata)。 HDF5 dataset:数据元素的多维数组,以及支持元数据。 但HDF5文件会比较大
import glob
import vaex
# csv_files = glob.glob('csv_files/*.csv')
csv_files = glob.glob('train.csv')
for i, csv_file in enumerate(csv_files, 1):
for j, dv in enumerate(vaex.from_csv(csv_file, convert=True, chunk_size=5_000_000), 1):
print('Exporting %d %s to hdf5 part %d' % (i, csv_file, j))
dv.export_hdf5(f'hdf5_files/analysis_{i:02}_{j:02}.hdf5')
dv = vaex.open('hdf5_files/*.hdf5')
### Vaex实际上并没有读取文件,因为延迟加载。###
quantile = dv.percentile_approx('col1', 10)
dv['col1_plus_col2'] = dv.col1 + dv.col2
dv['col1_binary'] = dv.col1> dv.percentile_approx('col1',10)






