AWorksLP嵌入式开发:基于FatFs的SD卡文件系统操作全解析
2026/5/17 1:15:44
时间偏移和重采样是时间序列分析的核心操作:
importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt# 设置中文字体plt.rcParams['font.sans-serif']=['SimHei','Arial Unicode MS']plt.rcParams['axes.unicode_minus']=False# 创建示例数据np.random.seed(42)dates=pd.date_range('2024-01-01',periods=30,freq='D')df=pd.DataFrame({'日期':dates,'销售额':np.random.randint(100,500,30),'广告费':np.random.randint(50,200,30)})df.set_index('日期',inplace=True)print("原始数据:")print(df.head(10))shift将数据向前或向后移动。
# 向后移动(昨天的数据)df['昨日销售额']=df['销售额'].shift(1)print("昨日销售额:")print(df[['销售额','昨日销售额']].head(10))# 向前移动(明天的数据)df['明日销售额']=df['销售额'].shift(-1)print("\n明日销售额:")print(df[['销售额','明日销售额']].head(10))# 移动多期df['7日前销售额']=df['销售额'].shift(7)print("\n7日前销售额:")print(df[['销售额','7日前销售额']].head(15))diff计算当前值与之前值的差值。
# 一阶差分(日变化)df['日变化']=df['销售额'].diff()print("日销售额变化:")print(df[['销售额','日变化']].head(10))# 多阶差分df['7日变化']=df['销售额'].diff(7)print("\n7日销售额变化:")print(df[['销售额','7日变化']].head(15))# 日增长率df['日增长率']=df['销售额'].pct_change()*100print("日增长率(%):")print(df[['销售额','日增长率']].head(10))# 周增长率df['周增长率']=df['销售额'].pct_change(7)*100print("\n周增长率(%):")print(df[['销售额','周增长率']].head(15))# 创建分钟级数据np.random.seed(42)minute_dates=pd.date_range('2024-01-01 09:30:00',periods=60,freq='T')minute_data=pd.DataFrame({'价格':100+np.random.randn(60).cumsum(),'成交量':np.random.randint(100,1000,60)},index=minute_dates)print("分钟数据(前10行):")print(minute_data.head(10))# 降采样为小时(取平均值)hourly_mean=minute_data.resample('H').mean()print("\n小时均值:")print(hourly_mean)# 降采样为小时(取最高价)hourly_high=minute_data.resample('H').max()print("\n小时最高价:")print(hourly_high)# 降采样为小时(多种聚合)hourly_agg=minute_data.resample('H').agg({'价格':['first','max','min','last'],'成交量':'sum'})print("\n小时多种聚合:")print(hourly_agg)# 创建日数据daily_data=pd.DataFrame({'销售额':[100,150,200,180,220]},index=pd.date_range('2024-01-01',periods=5,freq='D'))print("日数据:")print(daily_data)# 升采样为小时hourly_data=daily_data.resample('H').asfreq()print("\n小时数据(升采样):")print(hourly_data.head(10))# 升采样并填充hourly_filled=daily_data.resample('H').ffill()print("\n小时数据(向前填充):")print(hourly_filled.head(10))# 升采样并插值hourly_interp=daily_data.resample('H').interpolate()print("\n小时数据(线性插值):")print(hourly_interp.head(10))# 创建日销售数据np.random.seed(42)dates=pd.date_range('2024-01-01',periods=90,freq='D')sales=pd.DataFrame({'销售额':10000+np.random.randn(90).cumsum()*100,'广告费':np.random.randint(500,1500,90),'访客数':500+np.random.randn(90).cumsum()*20},index=dates)# 确保数值为正sales['销售额']=sales['销售额'].abs()sales['访客数']=sales['访客数'].abs().astype(int)print("="*60)print("销售数据分析")print("="*60)print("\n原始数据:")print(sales.head(10))# 1. 计算日变化print("\n1. 日销售额变化:")sales['日变化']=sales['销售额'].diff()sales['日增长率']=sales['销售额'].pct_change()*100print(sales[['销售额','日变化','日增长率']].head(10))# 2. 计算周同比print("\n2. 周同比(7天前对比):")sales['周同比']=(sales['销售额']-sales['销售额'].shift(7))/sales['销售额'].shift(7)*100print(sales[['销售额','周同比']].head(15))# 3. 移动平均线print("\n3. 移动平均:")sales['MA7']=sales['销售额'].rolling(7).mean()sales['MA30']=sales['销售额'].rolling(30).mean()print(sales[['销售额','MA7','MA30']].head(15))# 4. 月度汇总print("\n4. 月度销售汇总:")monthly=sales.resample('M').agg({'销售额':['sum','mean','max'],'广告费':'sum','访客数':'mean'}).round(2)print(monthly)# 5. 周度汇总print("\n5. 周度销售汇总:")weekly=sales.resample('W').agg({'销售额':'sum','广告费':'sum'})print(weekly.head())# 6. 广告效果分析(滞后相关性)print("\n6. 广告滞后效果:")forlagin[0,1,2,3,7]:iflag==0:corr=sales['广告费'].corr(sales['销售额'])else:corr=sales['广告费'].shift(lag).corr(sales['销售额'])print(f"广告滞后{lag}天与销售额的相关性:{corr:.3f}")| 方法 | 公式 | 用途 |
|---|---|---|
shift(n) | x_t = x_{t-n} | 获取历史值 |
diff(n) | x_t - x_{t-n} | 计算绝对变化 |
pct_change(n) | (x_t - x_{t-n}) / x_{t-n} | 计算相对变化 |
# 对比示例test=pd.Series([10,20,30,40,50])print("原始:",test.values)print("shift(1):",test.shift(1).values)print("diff(1):",test.diff(1).values)print("pct_change(1):",test.pct_change(1).values)| 方法 | 说明 | 示例 |
|---|---|---|
mean() | 平均值 | df.resample('M').mean() |
sum() | 求和 | df.resample('M').sum() |
max() | 最大值 | df.resample('M').max() |
min() | 最小值 | df.resample('M').min() |
first() | 第一个值 | df.resample('M').first() |
last() | 最后一个值 | df.resample('M').last() |
ohlc() | OHLC(开高低收) | df.resample('M').ohlc() |
asfreq() | 仅改变频率 | df.resample('H').asfreq() |
ffill() | 向前填充 | df.resample('H').ffill() |
bfill() | 向后填充 | df.resample('H').bfill() |
interpolate() | 线性插值 | df.resample('H').interpolate() |
| 操作 | 方法 | 示例 |
|---|---|---|
| 数据移位 | shift(n) | df['col'].shift(1) |
| 一阶差分 | diff() | df['col'].diff() |
| 百分比变化 | pct_change() | df['col'].pct_change() |
| 降采样 | resample('M').mean() | df.resample('M').mean() |
| 升采样 | resample('H').asfreq() | df.resample('H').asfreq() |
| 升采样+填充 | resample('H').ffill() | df.resample('H').ffill() |
| 多聚合 | resample('M').agg() | df.resample('M').agg({'A':'sum','B':'mean'}) |