利用Python进行数据分析_Pandas_时间序列
时间序列
1.日期和时间数据类型及工具
# 日期和时间数据类型及工具
from datetime import datetime
d=datetime.now()
d
datetime.datetime(2023, 12, 18, 14, 58, 7, 750689)
# datetime.datetime(2023, 12, 18, 10, 2, 26, 974645),datetime.后面的datetime是一种数据类型。datetime还有其他的数据类型:
# date 以公历形式存储日历日期(年、月、日)
# time 以时间存储为时、分、秒、毫秒
# datetime 存储日期和时间
# timedelta 表示2个时间值的差(日、秒、毫秒)
1.1 数据类型
1.1.1 date
d.date()
datetime.date(2023, 12, 18)
1.1.2 time
d.time()
datetime.time(14, 58, 7, 750689)
1.1.3 datetime
1.1.4 timedelta
start = datetime(2023,12,18)
end = datetime(1986,12,11)
delta = start-end
delta
datetime.timedelta(days=13521)
1.2 类
1.2.1 datetime 类
# datetime 类:
# datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]):创建一个表示日期和时间的对象。
current_datetime = datetime.now()
current_datetime
datetime.datetime(2023, 12, 18, 14, 58, 10, 358578)
1.2.2 date 类
# date 类:
# date(year, month, day):创建一个表示日期的对象。
from datetime import date
specific_date = date(2023, 1, 1)
specific_date
datetime.date(2023, 1, 1)
1.2.3 time 类
# time 类:
# time([hour[, minute[, second[, microsecond[, tzinfo]]]]]):创建一个表示时间的对象。
from datetime import time
specific_time = time(12, 30, 0)
specific_time
datetime.time(12, 30)
1.2.4 datetime 类
from datetime import datetime
# 将字符串转换为 datetime 对象
date_string = "2023-01-01 12:30:00"
formatted_datetime = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
formatted_datetime
datetime.datetime(2023, 1, 1, 12, 30)
# datetime 模块的常用函数:
# datetime.now([tz]):返回当前日期和时间。
# datetime.combine(date, time):将日期和时间合并为一个 datetime 对象。
# datetime.strptime(date_string, format):根据指定的格式将字符串转换为 datetime 对象。
# datetime.strftime(format):将 datetime 对象格式化为字符串。
1.2.5 timedelta 类
# timedelta 类:
# timedelta(days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]):表示两个日期或时间之间的差异。
from datetime import datetime, timedelta
# 计算两个日期之间的差异
start_date = datetime(2023, 1, 1)
end_date = datetime(2023, 1, 10)
difference = end_date - start_date
difference
datetime.timedelta(days=9)
# 使用 timedelta 类的方法获取天数和总秒数
days_difference = difference.days
seconds_difference = difference.seconds
days_difference
9
seconds_difference
0
# 创建一个 timedelta 对象表示一段时间
custom_timedelta = timedelta(days=5, hours=3, minutes=30)
# 使用 timedelta 对象进行日期时间运算
new_date = start_date + custom_timedelta
new_date
datetime.datetime(2023, 1, 6, 3, 30)
1.2.6 timezone 类
# timezone 类:
# timezone(offset, name=None):表示时区信息,可以与 datetime 对象一起使用。
from datetime import datetime, timezone, timedelta
# 创建带有时区信息的 datetime 对象
dt_with_timezone = datetime(2023, 1, 1, tzinfo=timezone(timedelta(hours=8)))
dt_with_timezone
datetime.datetime(2023, 1, 1, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
2.时间序列基础
pandas最基本的时间序列类型就是时间戳
from datetime import datetime
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import pymysql
import pandas as pd
db = pymysql.connect(
host='000.000.000.000',
port=3306,
user='root',
password='root',
database='rating_data'
)
sql = "SELECT * from t_pca_fi_report"
df_1 = pd.read_sql(sql,db)
C:\Users\hspcadmin\AppData\Local\Temp\ipykernel_820\2659158565.py:1: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
df_1 = pd.read_sql(sql,db)
df_1
id | emerald_id | entity_name | sector | report_date | update_time | operation_tag | doc_version | doc | anchor | sacp | icr | analyst_name | create_datetime | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 3579_entity | 上海华培动力科技(集团)股份有限公司 | 金融机构 | 2023-07-17 | 2023-09-04 17:25:19 | v2.4.0 | {"entityName":"上海华培动力科技(集团)股份有限公司","entityShor... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:41 | |
1 | 2 | 4987_entity | 上海国盛(集团)有限公司 | 金融机构 | 2023-08-08 | 2023-08-08 11:42:40 | v2.4.0 | {"entityName":"上海国盛(集团)有限公司","entityShortName"... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:42 | |
2 | 3 | 3192_entity | 上工申贝(集团)股份有限公司 | 金融机构 | 2023-05-30 | 2023-08-03 11:46:15 | DELETE | v2.4.0 | {"entityName":"上工申贝(集团)股份有限公司","entityShortNam... | bb+ | a+ | aa+ | 金融机构总经理 | 2023-10-17 14:33:46 |
3 | 4 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-07-28 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
4 | 5 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-08-02 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
60 | 61 | 6_entity | 三井住友银行股份有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三井住友银行股份有限公司","entityShortName"... | aa+ | aaa | aa- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
61 | 62 | 4845_entity | 三一集团有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三一集团有限公司","entityShortName":"三一... | a | aa | a- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
62 | 63 | 7126_entity | 中国农业发展银行 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"中国农业发展银行","entityShortName":"中国... | 不适用 | 不适用 | aaa | 金融机构评级总监 | 2023-12-05 12:00:15 | |
63 | 64 | 2_entity | 泸州银行股份有限公司 | 金融机构 | 2023-10-31 | 2023-12-13 16:14:24 | F1 | {"entityName":"泸州银行股份有限公司","entityShortName":"... | bbb+ | bb- | a | 金融机构总经理 | 2023-12-13 17:00:37 | |
64 | 65 | 41_entity | 万达控股集团有限公司 | 金融机构 | 2023-12-18 | 2023-12-18 09:13:38 | F1 | {"entityName":"万达控股集团有限公司","entityShortName":"... | bb+ | aaa | aaa | 金融机构总经理 | 2023-12-18 10:00:34 |
65 rows × 14 columns
dates = df_1['report_date']
dates
0 2023-07-17
1 2023-08-08
2 2023-05-30
3 2023-07-28
4 2023-08-02
...
60 2023-11-01
61 2023-11-01
62 2023-11-01
63 2023-10-31
64 2023-12-18
Name: report_date, Length: 65, dtype: object
dates[1]
datetime.date(2023, 8, 8)
type(dates[1])
datetime.date
type(dates)
pandas.core.series.Series
ts = df_1['report_date']
type(ts)
pandas.core.series.Series
ts
0 2023-07-17
1 2023-08-08
2 2023-05-30
3 2023-07-28
4 2023-08-02
...
60 2023-11-01
61 2023-11-01
62 2023-11-01
63 2023-10-31
64 2023-12-18
Name: report_date, Length: 65, dtype: object
ts.values
array([datetime.date(2023, 7, 17), datetime.date(2023, 8, 8),
datetime.date(2023, 5, 30), datetime.date(2023, 7, 28),
datetime.date(2023, 8, 2), datetime.date(2023, 5, 30),
datetime.date(2023, 5, 31), datetime.date(2023, 5, 31),
datetime.date(2023, 5, 31), datetime.date(2023, 5, 30),
datetime.date(2023, 7, 17), datetime.date(2023, 10, 17),
datetime.date(2023, 5, 30), datetime.date(2023, 5, 30),
datetime.date(2023, 3, 27), datetime.date(2022, 12, 23),
datetime.date(2023, 9, 18), datetime.date(2023, 9, 14),
datetime.date(2023, 8, 1), datetime.date(2023, 2, 13),
datetime.date(2023, 5, 8), datetime.date(2023, 5, 30),
datetime.date(2023, 9, 4), datetime.date(2023, 1, 18),
datetime.date(2023, 5, 30), datetime.date(2023, 7, 5),
datetime.date(2023, 5, 4), datetime.date(2023, 5, 30),
datetime.date(2023, 9, 5), datetime.date(2023, 5, 7),
datetime.date(2023, 5, 8), datetime.date(2023, 6, 1),
datetime.date(2023, 5, 31), datetime.date(2023, 1, 17),
datetime.date(2023, 5, 30), datetime.date(2023, 7, 30),
datetime.date(2023, 5, 30), datetime.date(2023, 5, 30),
datetime.date(2023, 7, 17), datetime.date(2023, 10, 17),
datetime.date(2023, 9, 10), datetime.date(2023, 8, 18),
datetime.date(2023, 10, 1), datetime.date(2023, 10, 27),
datetime.date(2023, 10, 27), datetime.date(2023, 10, 1),
datetime.date(2023, 10, 29), datetime.date(2021, 11, 7),
datetime.date(2023, 10, 24), datetime.date(2022, 6, 6),
datetime.date(2023, 7, 18), datetime.date(2023, 8, 24),
datetime.date(2023, 10, 3), datetime.date(2023, 2, 7),
datetime.date(2023, 1, 18), datetime.date(2021, 3, 4),
datetime.date(2023, 11, 27), datetime.date(2023, 11, 28),
datetime.date(2023, 10, 29), datetime.date(2023, 10, 30),
datetime.date(2023, 11, 1), datetime.date(2023, 11, 1),
datetime.date(2023, 11, 1), datetime.date(2023, 10, 31),
datetime.date(2023, 12, 18)], dtype=object)
# 将 'update_time' 列转换为日期时间格式
df_1['date_index'] = pd.to_datetime(ts)
df_1.set_index('date_index', inplace=True)
df_1
id | emerald_id | entity_name | sector | report_date | update_time | operation_tag | doc_version | doc | anchor | sacp | icr | analyst_name | create_datetime | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
date_index | ||||||||||||||
2023-07-17 | 1 | 3579_entity | 上海华培动力科技(集团)股份有限公司 | 金融机构 | 2023-07-17 | 2023-09-04 17:25:19 | v2.4.0 | {"entityName":"上海华培动力科技(集团)股份有限公司","entityShor... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:41 | |
2023-08-08 | 2 | 4987_entity | 上海国盛(集团)有限公司 | 金融机构 | 2023-08-08 | 2023-08-08 11:42:40 | v2.4.0 | {"entityName":"上海国盛(集团)有限公司","entityShortName"... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:42 | |
2023-05-30 | 3 | 3192_entity | 上工申贝(集团)股份有限公司 | 金融机构 | 2023-05-30 | 2023-08-03 11:46:15 | DELETE | v2.4.0 | {"entityName":"上工申贝(集团)股份有限公司","entityShortNam... | bb+ | a+ | aa+ | 金融机构总经理 | 2023-10-17 14:33:46 |
2023-07-28 | 4 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-07-28 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
2023-08-02 | 5 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-08-02 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2023-11-01 | 61 | 6_entity | 三井住友银行股份有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三井住友银行股份有限公司","entityShortName"... | aa+ | aaa | aa- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
2023-11-01 | 62 | 4845_entity | 三一集团有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三一集团有限公司","entityShortName":"三一... | a | aa | a- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
2023-11-01 | 63 | 7126_entity | 中国农业发展银行 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"中国农业发展银行","entityShortName":"中国... | 不适用 | 不适用 | aaa | 金融机构评级总监 | 2023-12-05 12:00:15 | |
2023-10-31 | 64 | 2_entity | 泸州银行股份有限公司 | 金融机构 | 2023-10-31 | 2023-12-13 16:14:24 | F1 | {"entityName":"泸州银行股份有限公司","entityShortName":"... | bbb+ | bb- | a | 金融机构总经理 | 2023-12-13 17:00:37 | |
2023-12-18 | 65 | 41_entity | 万达控股集团有限公司 | 金融机构 | 2023-12-18 | 2023-12-18 09:13:38 | F1 | {"entityName":"万达控股集团有限公司","entityShortName":"... | bb+ | aaa | aaa | 金融机构总经理 | 2023-12-18 10:00:34 |
65 rows × 14 columns
df_restored = df_1.reset_index()
df_restored
date_index | id | emerald_id | entity_name | sector | report_date | update_time | operation_tag | doc_version | doc | anchor | sacp | icr | analyst_name | create_datetime | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2023-07-17 | 1 | 3579_entity | 上海华培动力科技(集团)股份有限公司 | 金融机构 | 2023-07-17 | 2023-09-04 17:25:19 | v2.4.0 | {"entityName":"上海华培动力科技(集团)股份有限公司","entityShor... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:41 | |
1 | 2023-08-08 | 2 | 4987_entity | 上海国盛(集团)有限公司 | 金融机构 | 2023-08-08 | 2023-08-08 11:42:40 | v2.4.0 | {"entityName":"上海国盛(集团)有限公司","entityShortName"... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:42 | |
2 | 2023-05-30 | 3 | 3192_entity | 上工申贝(集团)股份有限公司 | 金融机构 | 2023-05-30 | 2023-08-03 11:46:15 | DELETE | v2.4.0 | {"entityName":"上工申贝(集团)股份有限公司","entityShortNam... | bb+ | a+ | aa+ | 金融机构总经理 | 2023-10-17 14:33:46 |
3 | 2023-07-28 | 4 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-07-28 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
4 | 2023-08-02 | 5 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-08-02 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
60 | 2023-11-01 | 61 | 6_entity | 三井住友银行股份有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三井住友银行股份有限公司","entityShortName"... | aa+ | aaa | aa- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
61 | 2023-11-01 | 62 | 4845_entity | 三一集团有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三一集团有限公司","entityShortName":"三一... | a | aa | a- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
62 | 2023-11-01 | 63 | 7126_entity | 中国农业发展银行 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"中国农业发展银行","entityShortName":"中国... | 不适用 | 不适用 | aaa | 金融机构评级总监 | 2023-12-05 12:00:15 | |
63 | 2023-10-31 | 64 | 2_entity | 泸州银行股份有限公司 | 金融机构 | 2023-10-31 | 2023-12-13 16:14:24 | F1 | {"entityName":"泸州银行股份有限公司","entityShortName":"... | bbb+ | bb- | a | 金融机构总经理 | 2023-12-13 17:00:37 | |
64 | 2023-12-18 | 65 | 41_entity | 万达控股集团有限公司 | 金融机构 | 2023-12-18 | 2023-12-18 09:13:38 | F1 | {"entityName":"万达控股集团有限公司","entityShortName":"... | bb+ | aaa | aaa | 金融机构总经理 | 2023-12-18 10:00:34 |
65 rows × 15 columns
2.1 索引、选取、子集构造
# df索引指定行
df_1.iloc[0]
id 1
emerald_id 3579_entity
entity_name 上海华培动力科技(集团)股份有限公司
sector 金融机构
report_date 2023-07-17
update_time 2023-09-04 17:25:19
operation_tag
doc_version v2.4.0
doc {"entityName":"上海华培动力科技(集团)股份有限公司","entityShor...
anchor bbb+
sacp aaa
icr aaa
analyst_name 金融机构总经理
create_datetime 2023-10-17 14:33:41
Name: 2023-07-17 00:00:00, dtype: object
# df索引指定列
df_1['id']
date_index
2023-07-17 1
2023-08-08 2
2023-05-30 3
2023-07-28 4
2023-08-02 5
..
2023-11-01 61
2023-11-01 62
2023-11-01 63
2023-10-31 64
2023-12-18 65
Name: id, Length: 65, dtype: int64
ts = df_1['report_date']
ts
date_index
2023-07-17 2023-07-17
2023-08-08 2023-08-08
2023-05-30 2023-05-30
2023-07-28 2023-07-28
2023-08-02 2023-08-02
...
2023-11-01 2023-11-01
2023-11-01 2023-11-01
2023-11-01 2023-11-01
2023-10-31 2023-10-31
2023-12-18 2023-12-18
Name: report_date, Length: 65, dtype: object
ts.index[1]
Timestamp('2023-08-08 00:00:00')
ts.index[2]
Timestamp('2023-05-30 00:00:00')
# 确保索引已排序
ts.sort_index(inplace=True)
# 使用 truncate 截取某个日期之后的数据
ts.truncate(after='2023/08/11')
date_index
2021-03-04 2021-03-04
2021-11-07 2021-11-07
2022-06-06 2022-06-06
2022-12-23 2022-12-23
2023-01-17 2023-01-17
2023-01-18 2023-01-18
2023-01-18 2023-01-18
2023-02-07 2023-02-07
2023-02-13 2023-02-13
2023-03-27 2023-03-27
2023-05-04 2023-05-04
2023-05-07 2023-05-07
2023-05-08 2023-05-08
2023-05-08 2023-05-08
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-30 2023-05-30
2023-05-31 2023-05-31
2023-05-31 2023-05-31
2023-05-31 2023-05-31
2023-05-31 2023-05-31
2023-06-01 2023-06-01
2023-07-05 2023-07-05
2023-07-17 2023-07-17
2023-07-17 2023-07-17
2023-07-17 2023-07-17
2023-07-18 2023-07-18
2023-07-28 2023-07-28
2023-07-30 2023-07-30
2023-08-01 2023-08-01
2023-08-02 2023-08-02
2023-08-08 2023-08-08
Name: report_date, dtype: object
2.2 带有重复索引的时间序列
# 通过检查索引是否唯一不重复,如果是False,则表示存在重复索引
ts.index.is_unique
False
# 通过group by进行聚合
grouped = ts.groupby(level=0)
grouped
<pandas.core.groupby.generic.SeriesGroupBy object at 0x000001EA43158AD0>
grouped.count()
date_index
2021-03-04 1
2021-11-07 1
2022-06-06 1
2022-12-23 1
2023-01-17 1
2023-01-18 2
2023-02-07 1
2023-02-13 1
2023-03-27 1
2023-05-04 1
2023-05-07 1
2023-05-08 2
2023-05-30 11
2023-05-31 4
2023-06-01 1
2023-07-05 1
2023-07-17 3
2023-07-18 1
2023-07-28 1
2023-07-30 1
2023-08-01 1
2023-08-02 1
2023-08-08 1
2023-08-18 1
2023-08-24 1
2023-09-04 1
2023-09-05 1
2023-09-10 1
2023-09-14 1
2023-09-18 1
2023-10-01 2
2023-10-03 1
2023-10-17 2
2023-10-24 1
2023-10-27 2
2023-10-29 2
2023-10-30 1
2023-10-31 1
2023-11-01 3
2023-11-27 1
2023-11-28 1
2023-12-18 1
Name: report_date, dtype: int64
ts
date_index
2021-03-04 2021-03-04
2021-11-07 2021-11-07
2022-06-06 2022-06-06
2022-12-23 2022-12-23
2023-01-17 2023-01-17
...
2023-11-01 2023-11-01
2023-11-01 2023-11-01
2023-11-27 2023-11-27
2023-11-28 2023-11-28
2023-12-18 2023-12-18
Name: report_date, Length: 65, dtype: object
3 日期的范围、频率及移动
df_restored = df_1.reset_index()
df_restored
date_index | id | emerald_id | entity_name | sector | report_date | update_time | operation_tag | doc_version | doc | anchor | sacp | icr | analyst_name | create_datetime | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2023-07-17 | 1 | 3579_entity | 上海华培动力科技(集团)股份有限公司 | 金融机构 | 2021-03-04 | 2023-09-04 17:25:19 | v2.4.0 | {"entityName":"上海华培动力科技(集团)股份有限公司","entityShor... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:41 | |
1 | 2023-08-08 | 2 | 4987_entity | 上海国盛(集团)有限公司 | 金融机构 | 2021-11-07 | 2023-08-08 11:42:40 | v2.4.0 | {"entityName":"上海国盛(集团)有限公司","entityShortName"... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:42 | |
2 | 2023-05-30 | 3 | 3192_entity | 上工申贝(集团)股份有限公司 | 金融机构 | 2022-06-06 | 2023-08-03 11:46:15 | DELETE | v2.4.0 | {"entityName":"上工申贝(集团)股份有限公司","entityShortNam... | bb+ | a+ | aa+ | 金融机构总经理 | 2023-10-17 14:33:46 |
3 | 2023-07-28 | 4 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2022-12-23 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
4 | 2023-08-02 | 5 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-01-17 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
60 | 2023-11-01 | 61 | 6_entity | 三井住友银行股份有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三井住友银行股份有限公司","entityShortName"... | aa+ | aaa | aa- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
61 | 2023-11-01 | 62 | 4845_entity | 三一集团有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三一集团有限公司","entityShortName":"三一... | a | aa | a- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
62 | 2023-11-01 | 63 | 7126_entity | 中国农业发展银行 | 金融机构 | 2023-11-27 | 2023-12-05 11:09:54 | F1 | {"entityName":"中国农业发展银行","entityShortName":"中国... | 不适用 | 不适用 | aaa | 金融机构评级总监 | 2023-12-05 12:00:15 | |
63 | 2023-10-31 | 64 | 2_entity | 泸州银行股份有限公司 | 金融机构 | 2023-11-28 | 2023-12-13 16:14:24 | F1 | {"entityName":"泸州银行股份有限公司","entityShortName":"... | bbb+ | bb- | a | 金融机构总经理 | 2023-12-13 17:00:37 | |
64 | 2023-12-18 | 65 | 41_entity | 万达控股集团有限公司 | 金融机构 | 2023-12-18 | 2023-12-18 09:13:38 | F1 | {"entityName":"万达控股集团有限公司","entityShortName":"... | bb+ | aaa | aaa | 金融机构总经理 | 2023-12-18 10:00:34 |
65 rows × 15 columns
df_1
id | emerald_id | entity_name | sector | report_date | update_time | operation_tag | doc_version | doc | anchor | sacp | icr | analyst_name | create_datetime | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
date_index | ||||||||||||||
2023-07-17 | 1 | 3579_entity | 上海华培动力科技(集团)股份有限公司 | 金融机构 | 2021-03-04 | 2023-09-04 17:25:19 | v2.4.0 | {"entityName":"上海华培动力科技(集团)股份有限公司","entityShor... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:41 | |
2023-08-08 | 2 | 4987_entity | 上海国盛(集团)有限公司 | 金融机构 | 2021-11-07 | 2023-08-08 11:42:40 | v2.4.0 | {"entityName":"上海国盛(集团)有限公司","entityShortName"... | bbb+ | aaa | aaa | 金融机构总经理 | 2023-10-17 14:33:42 | |
2023-05-30 | 3 | 3192_entity | 上工申贝(集团)股份有限公司 | 金融机构 | 2022-06-06 | 2023-08-03 11:46:15 | DELETE | v2.4.0 | {"entityName":"上工申贝(集团)股份有限公司","entityShortNam... | bb+ | a+ | aa+ | 金融机构总经理 | 2023-10-17 14:33:46 |
2023-07-28 | 4 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2022-12-23 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
2023-08-02 | 5 | 2337_entity | 一品红药业股份有限公司 | 金融机构 | 2023-01-17 | 2023-08-03 11:46:15 | v2.4.0 | {"entityName":"一品红药业股份有限公司","entityShortName":... | bb+ | bbb+ | aaa | 金融机构总经理 | 2023-10-17 14:33:48 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2023-11-01 | 61 | 6_entity | 三井住友银行股份有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三井住友银行股份有限公司","entityShortName"... | aa+ | aaa | aa- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
2023-11-01 | 62 | 4845_entity | 三一集团有限公司 | 金融机构 | 2023-11-01 | 2023-12-05 11:09:54 | F1 | {"entityName":"三一集团有限公司","entityShortName":"三一... | a | aa | a- | 金融机构评级总监 | 2023-12-05 12:00:15 | |
2023-11-01 | 63 | 7126_entity | 中国农业发展银行 | 金融机构 | 2023-11-27 | 2023-12-05 11:09:54 | F1 | {"entityName":"中国农业发展银行","entityShortName":"中国... | 不适用 | 不适用 | aaa | 金融机构评级总监 | 2023-12-05 12:00:15 | |
2023-10-31 | 64 | 2_entity | 泸州银行股份有限公司 | 金融机构 | 2023-11-28 | 2023-12-13 16:14:24 | F1 | {"entityName":"泸州银行股份有限公司","entityShortName":"... | bbb+ | bb- | a | 金融机构总经理 | 2023-12-13 17:00:37 | |
2023-12-18 | 65 | 41_entity | 万达控股集团有限公司 | 金融机构 | 2023-12-18 | 2023-12-18 09:13:38 | F1 | {"entityName":"万达控股集团有限公司","entityShortName":"... | bb+ | aaa | aaa | 金融机构总经理 | 2023-12-18 10:00:34 |
65 rows × 14 columns
3.1 生成日期范围
index = pd.date_range('2023-05-30','2023-11-01')
index
DatetimeIndex(['2023-05-30', '2023-05-31', '2023-06-01', '2023-06-02',
'2023-06-03', '2023-06-04', '2023-06-05', '2023-06-06',
'2023-06-07', '2023-06-08',
...
'2023-10-23', '2023-10-24', '2023-10-25', '2023-10-26',
'2023-10-27', '2023-10-28', '2023-10-29', '2023-10-30',
'2023-10-31', '2023-11-01'],
dtype='datetime64[ns]', length=156, freq='D')
- start: 起始日期,可以是字符串、datetime 对象或 Timestamp。如果没有指定,则默认为当前日期。
- end: 结束日期,可以是字符串、datetime 对象或 Timestamp。如果没有指定,则默认为当前日期。
- periods: 生成日期范围的长度,与 end 参数互斥。如果指定了 periods,那么 end 将被忽略。
- freq: 频率,表示时间间隔。可以是字符串(如 'D' 表示天,'H' 表示小时)或 DateOffset 对象。默认为 'D',即按天间隔。
- tz: 时区,表示生成的日期范围的时区。
- normalize: 如果设置为 True,生成的日期范围将会被规范化,将时分秒等时间部分设为 00:00:00。
- name: 为返回的索引对象指定一个名称。
- closed: 控制区间的开闭,可以是 'right'、'left'、'both' 或 'neither'。默认为 'right',表示右闭区间。
- freq: 字符串别名或 DateOffset 对象,表示频率。例如,'B' 表示工作日频率。
- normalize: 如果为 True,则规范化时间戳,将时分秒等部分设置为 00:00:00。
3.2 频率和日期偏移量
index = pd.date_range('2023-05-30','2023-11-01',freq='4H')
index
DatetimeIndex(['2023-05-30 00:00:00', '2023-05-30 04:00:00',
'2023-05-30 08:00:00', '2023-05-30 12:00:00',
'2023-05-30 16:00:00', '2023-05-30 20:00:00',
'2023-05-31 00:00:00', '2023-05-31 04:00:00',
'2023-05-31 08:00:00', '2023-05-31 12:00:00',
...
'2023-10-30 12:00:00', '2023-10-30 16:00:00',
'2023-10-30 20:00:00', '2023-10-31 00:00:00',
'2023-10-31 04:00:00', '2023-10-31 08:00:00',
'2023-10-31 12:00:00', '2023-10-31 16:00:00',
'2023-10-31 20:00:00', '2023-11-01 00:00:00'],
dtype='datetime64[ns]', length=931, freq='4H')
from pandas.tseries.offsets import Hour
# 设置便宜时间
datel_time = Hour(4)
index = pd.date_range('2023-05-30','2023-11-01',freq=datel_time)
index
DatetimeIndex(['2023-05-30 00:00:00', '2023-05-30 04:00:00',
'2023-05-30 08:00:00', '2023-05-30 12:00:00',
'2023-05-30 16:00:00', '2023-05-30 20:00:00',
'2023-05-31 00:00:00', '2023-05-31 04:00:00',
'2023-05-31 08:00:00', '2023-05-31 12:00:00',
...
'2023-10-30 12:00:00', '2023-10-30 16:00:00',
'2023-10-30 20:00:00', '2023-10-31 00:00:00',
'2023-10-31 04:00:00', '2023-10-31 08:00:00',
'2023-10-31 12:00:00', '2023-10-31 16:00:00',
'2023-10-31 20:00:00', '2023-11-01 00:00:00'],
dtype='datetime64[ns]', length=931, freq='4H')
index = pd.date_range('2023-05-30','2023-11-01',freq='2h30min')
index
DatetimeIndex(['2023-05-30 00:00:00', '2023-05-30 02:30:00',
'2023-05-30 05:00:00', '2023-05-30 07:30:00',
'2023-05-30 10:00:00', '2023-05-30 12:30:00',
'2023-05-30 15:00:00', '2023-05-30 17:30:00',
'2023-05-30 20:00:00', '2023-05-30 22:30:00',
...
'2023-10-31 01:30:00', '2023-10-31 04:00:00',
'2023-10-31 06:30:00', '2023-10-31 09:00:00',
'2023-10-31 11:30:00', '2023-10-31 14:00:00',
'2023-10-31 16:30:00', '2023-10-31 19:00:00',
'2023-10-31 21:30:00', '2023-11-01 00:00:00'],
dtype='datetime64[ns]', length=1489, freq='150T')
时间序列的基础频率:
3.3 移动(超前和滞后)数据
移动指的是沿着时间轴将数据前移或者后移。Series和DataFrame都有shift方法,用于执行单纯的前移和后移操作,保持索引不变。
import akshare as ak
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="600570", period="daily", start_date="20230101", end_date='20231218', adjust="qfq")
stock_zh_a_hist_df
日期 | 开盘 | 收盘 | 最高 | 最低 | 成交量 | 成交额 | 振幅 | 涨跌幅 | 涨跌额 | 换手率 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2023-01-03 | 40.22 | 41.77 | 42.04 | 39.98 | 188785 | 7.876238e+08 | 5.11 | 3.57 | 1.44 | 0.99 |
1 | 2023-01-04 | 41.94 | 42.63 | 42.92 | 41.24 | 257842 | 1.088131e+09 | 4.02 | 2.06 | 0.86 | 1.36 |
2 | 2023-01-05 | 42.19 | 41.96 | 42.61 | 41.57 | 99206 | 4.184562e+08 | 2.44 | -1.57 | -0.67 | 0.52 |
3 | 2023-01-06 | 42.30 | 42.08 | 43.87 | 41.57 | 218465 | 9.297619e+08 | 5.48 | 0.29 | 0.12 | 1.15 |
4 | 2023-01-09 | 41.45 | 42.40 | 42.98 | 40.77 | 191544 | 8.106186e+08 | 5.25 | 0.76 | 0.32 | 1.01 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
228 | 2023-12-12 | 30.17 | 29.72 | 30.24 | 29.56 | 223229 | 6.644768e+08 | 2.25 | -1.62 | -0.49 | 1.17 |
229 | 2023-12-13 | 29.78 | 29.34 | 30.16 | 29.33 | 235863 | 7.014522e+08 | 2.79 | -1.28 | -0.38 | 1.24 |
230 | 2023-12-14 | 29.60 | 29.17 | 29.87 | 29.15 | 155482 | 4.586276e+08 | 2.45 | -0.58 | -0.17 | 0.82 |
231 | 2023-12-15 | 29.32 | 28.77 | 29.36 | 28.71 | 185556 | 5.368904e+08 | 2.23 | -1.37 | -0.40 | 0.98 |
232 | 2023-12-18 | 28.55 | 28.49 | 29.18 | 28.30 | 160454 | 4.597516e+08 | 3.06 | -0.97 | -0.28 | 0.84 |
233 rows × 11 columns
上面的例子中,存在一个涨跌幅,我们现在通过shift方法,看看是不是也能计算出这个数值来。
# shift通常用于计算一个时间序列或者多个时间序列(如DataFrame的列)中的百分比变化。
# 新增一个“涨跌幅—新计算”列
# shift(1)向后移动
# stock_zh_a_hist_df['涨跌幅-新计算'] = (stock_zh_a_hist_df['收盘']/stock_zh_a_hist_df.shift(1)['收盘']-1)*100
stock_zh_a_hist_df['涨跌幅-新计算'] = (stock_zh_a_hist_df['收盘']-stock_zh_a_hist_df.shift(1)['收盘'])*100/stock_zh_a_hist_df.shift(1)['收盘']
stock_zh_a_hist_df
日期 | 开盘 | 收盘 | 最高 | 最低 | 成交量 | 成交额 | 振幅 | 涨跌幅 | 涨跌额 | 换手率 | 涨跌幅-新计算 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2023-01-03 | 40.22 | 41.77 | 42.04 | 39.98 | 188785 | 7.876238e+08 | 5.11 | 3.57 | 1.44 | 0.99 | NaN |
1 | 2023-01-04 | 41.94 | 42.63 | 42.92 | 41.24 | 257842 | 1.088131e+09 | 4.02 | 2.06 | 0.86 | 1.36 | 2.058894 |
2 | 2023-01-05 | 42.19 | 41.96 | 42.61 | 41.57 | 99206 | 4.184562e+08 | 2.44 | -1.57 | -0.67 | 0.52 | -1.571663 |
3 | 2023-01-06 | 42.30 | 42.08 | 43.87 | 41.57 | 218465 | 9.297619e+08 | 5.48 | 0.29 | 0.12 | 1.15 | 0.285987 |
4 | 2023-01-09 | 41.45 | 42.40 | 42.98 | 40.77 | 191544 | 8.106186e+08 | 5.25 | 0.76 | 0.32 | 1.01 | 0.760456 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
228 | 2023-12-12 | 30.17 | 29.72 | 30.24 | 29.56 | 223229 | 6.644768e+08 | 2.25 | -1.62 | -0.49 | 1.17 | -1.621979 |
229 | 2023-12-13 | 29.78 | 29.34 | 30.16 | 29.33 | 235863 | 7.014522e+08 | 2.79 | -1.28 | -0.38 | 1.24 | -1.278600 |
230 | 2023-12-14 | 29.60 | 29.17 | 29.87 | 29.15 | 155482 | 4.586276e+08 | 2.45 | -0.58 | -0.17 | 0.82 | -0.579414 |
231 | 2023-12-15 | 29.32 | 28.77 | 29.36 | 28.71 | 185556 | 5.368904e+08 | 2.23 | -1.37 | -0.40 | 0.98 | -1.371272 |
232 | 2023-12-18 | 28.55 | 28.49 | 29.18 | 28.30 | 160454 | 4.597516e+08 | 3.06 | -0.97 | -0.28 | 0.84 | -0.973236 |
233 rows × 12 columns
3.4 通过偏移量对日期进行位移
from pandas.tseries.offsets import Day,MonthEnd
now = datetime.now()
now
datetime.datetime(2023, 12, 18, 16, 12, 47, 706090)
now.strftime('%Y-%m-%d')
'2023-12-18'
now_new = now+3*Day()
now_new
Timestamp('2023-12-21 16:12:47.706090')
now_new.strftime('%Y-%m-%d')
'2023-12-21'
4 时区处理
import pytz
# 略,以后用到了再学习。
5 时期及其算术运算
# DataFrame的Period类表示时间区间,比如数日、数月、数季、数年
p = pd.Period(2023,freq='A-DEC')
p
Period('2023', 'A-DEC')
p+5
Period('2028', 'A-DEC')
p-2
Period('2021', 'A-DEC')
v = pd.Period('2028', 'A-DEC')-p
v
<5 * YearEnds: month=12>
5.1 时间的频率转换
# asfreq方法
p = pd.Period(2021,freq='A-DEC')
p.asfreq('M',how='start')
Period('2021-01', 'M')
p.asfreq('M',how='end')
Period('2021-12', 'M')
5.1.1 案例分析
import pandas as pd
# 创建一个示例 DataFrame
data = {
'date': pd.to_datetime(['2023-01-01', '2023-01-21','2023-02-01', '2023-03-01']),
'sales': [100, 120, 150, 200]
}
df = pd.DataFrame(data)
# 将日期列转换为时期对象
# df.dt.to_period() 是 Pandas 中用于将日期时间列转换为时期(Period)的方法。它允许你改变日期时间的表示形式,从而更方便地进行时期性的分析。
# 详细解释,见下面
df['month'] = df['date'].dt.to_period(freq='M')
# 输出原始 DataFrame
print("原始 DataFrame:")
print(df)
# 将月份时期调整为日频率,使用最后一天表示整个月的销售额
df['last_day_of_month'] = df['month'].apply(lambda x: x.asfreq('D', 'e'))
print("\n调整频率后的 DataFrame:")
print(df)
原始 DataFrame:
date sales month
0 2023-01-01 100 2023-01
1 2023-01-21 120 2023-01
2 2023-02-01 150 2023-02
3 2023-03-01 200 2023-03
调整频率后的 DataFrame:
date sales month last_day_of_month
0 2023-01-01 100 2023-01 2023-01-31
1 2023-01-21 120 2023-01 2023-01-31
2 2023-02-01 150 2023-02 2023-02-28
3 2023-03-01 200 2023-03 2023-03-31
df.dt 是 DataFrame 对象上的属性
- df['date'].dt.year: 提取年份。
- df['date'].dt.month: 提取月份。
- df['date'].dt.day: 提取日期。
- df['date'].dt.hour: 提取小时。
- df['date'].dt.minute: 提取分钟。
- df['date'].dt.second: 提取秒数。
- df['date'].dt.microsecond: 提取微秒。
- df['date'].dt.quarter: 提取季度信息。
- df['date'].dt.is_leap_year: 检查是否是闰年。
- df['date'].dt.is_month_start: 检查是否是月初。
- df['date'].dt.is_month_end: 检查是否是月末。
- df['date'].dt.is_quarter_start: 检查是否是季度初。
- df['date'].dt.is_quarter_end: 检查是否是季度末。
- df['date'].dt.is_year_start: 检查是否是年初。
- df['date'].dt.is_year_end: 检查是否是年末。
- df['date'].dt.to_period(freq='M'): 将日期时间列转换为时期对象,可以指定频率,例如 'M' 表示月份。
5.1.2 季节性销售分析
假设你有一份销售数据,日期以月为单位。你想要进行季节性分析,找出每年同一季度的销售趋势。
import pandas as pd
# 创建一个示例 DataFrame
data = {
'date': pd.to_datetime(['2022-01-01', '2022-01-21', '2022-04-15', '2022-08-20', '2023-01-05', '2023-04-10']),
'sales': [100, 110, 120, 150, 110, 130]
}
df = pd.DataFrame(data)
# 将日期列转换为季度时期对象
df['quarter'] = df['date'].dt.to_period(freq='Q')
# 输出原始 DataFrame
print("原始 DataFrame:")
print(df)
# 计算每个季度的总销售额
quarterly_sales = df.groupby('quarter')['sales'].sum()
print("\n每个季度的总销售额:")
print(quarterly_sales)
原始 DataFrame:
date sales quarter
0 2022-01-01 100 2022Q1
1 2022-01-21 110 2022Q1
2 2022-04-15 120 2022Q2
3 2022-08-20 150 2022Q3
4 2023-01-05 110 2023Q1
5 2023-04-10 130 2023Q2
每个季度的总销售额:
quarter
2022Q1 210
2022Q2 120
2022Q3 150
2023Q1 110
2023Q2 130
Freq: Q-DEC, Name: sales, dtype: int64
5.1.3 数据可视化
假设你有一份每日的气温数据,但你想在图表上显示每周的平均温度,以平滑曲线显示趋势。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import WeekdayLocator
from matplotlib.ticker import MaxNLocator
# 设置中文字体为SimHei
plt.rcParams['font.family'] = 'SimHei'
# 创建一个示例 DataFrame
date_rng = pd.date_range('2022-01-01', '2022-12-31', freq='D')
temperature = np.random.randint(20, 30, size=len(date_rng))
df = pd.DataFrame({'date': date_rng, 'temperature': temperature})
# 将日期列转换为周时期对象
df['week'] = df['date'].dt.to_period(freq='W')
# 输出原始 DataFrame
print("原始 DataFrame:")
print(df.head())
# 计算每周的平均温度
weekly_avg_temperature = df.groupby('week')['temperature'].mean().reset_index()
# 调整图表大小
fig, ax = plt.subplots(figsize=(8, 4))
# 绘制图表
ax.plot(weekly_avg_temperature['week'].dt.strftime('%m-%d'), weekly_avg_temperature['temperature'], marker='o')
ax.set_title('周平均气温')
ax.set_xlabel('日期')
ax.set_ylabel('气温(°C)')
# 设置每隔N周显示一个刻度
N = 1 # 每隔2周显示一个刻度
ax.xaxis.set_major_locator(WeekdayLocator(interval=N))
ax.xaxis.set_major_locator(MaxNLocator(integer=True)) # 设置为整数刻度
plt.xticks(rotation=45, ha='right') # 旋转刻度标签
plt.tight_layout() # 调整布局以防止重叠
plt.show()
原始 DataFrame:
date temperature week
0 2022-01-01 26 2021-12-27/2022-01-02
1 2022-01-02 25 2021-12-27/2022-01-02
2 2022-01-03 25 2022-01-03/2022-01-09
3 2022-01-04 26 2022-01-03/2022-01-09
4 2022-01-05 24 2022-01-03/2022-01-09
5.1.4 数据聚合:按季度计算总销售额
假设你有一个包含每日销售数据的 DataFrame,你想按季度聚合数据并计算每个季度的总销售额。
import pandas as pd
# 创建一个示例 DataFrame
date_rng = pd.date_range('2022-01-01', '2022-12-31', freq='D')
sales_data = {'date': date_rng, 'sales': np.random.randint(50, 200, size=len(date_rng))}
df = pd.DataFrame(sales_data)
# 将日期列转换为季度时期对象
df['quarter'] = df['date'].dt.to_period(freq='Q')
# 输出原始 DataFrame
print("原始 DataFrame:")
print(df.head())
# 按季度聚合数据并计算总销售额
quarterly_sales_total = df.groupby('quarter')['sales'].sum().reset_index()
print("\n每个季度的总销售额:")
print(quarterly_sales_total)
原始 DataFrame:
date sales quarter
0 2022-01-01 173 2022Q1
1 2022-01-02 118 2022Q1
2 2022-01-03 78 2022Q1
3 2022-01-04 109 2022Q1
4 2022-01-05 76 2022Q1
每个季度的总销售额:
quarter sales
0 2022Q1 11392
1 2022Q2 12454
2 2022Q3 11402
3 2022Q4 11234
5.1.5 数据切片和选择:选择特定季度的销售数据
假设你想选择特定季度的销售数据进行进一步分析,你可以使用布尔索引来选择特定季度的数据。
# 选择特定季度的销售数据
target_quarter = '2022Q2'
sales_in_target_quarter = df[df['quarter'] == target_quarter]
print(f"\n{target_quarter} 的销售数据:")
print(sales_in_target_quarter)
2022Q2 的销售数据:
date sales quarter
1 2022-04-15 120 2022Q2
5.2 通过数组创建PeiodIndex
import pandas as pd
import random
def generate_sales_data(start_year, end_year):
data = {'Year': [], 'Quarter': [], 'Sales': []}
for year in range(start_year, end_year + 1):
for quarter in range(1, 5):
data['Year'].append(year)
data['Quarter'].append(quarter)
# 生成随机销售数据,这里使用了 random 模块,你可以根据实际情况修改生成规则
data['Sales'].append(random.randint(100000, 500000))
df = pd.DataFrame(data)
return df
# 指定起始年份和结束年份,比如从 2020 年到 2022 年
start_year = 2020
end_year = 2022
sales_data = generate_sales_data(start_year, end_year)
# 打印生成的销售数据
sales_data
Year | Quarter | Sales | |
---|---|---|---|
0 | 2020 | 1 | 144418 |
1 | 2020 | 2 | 244268 |
2 | 2020 | 3 | 425860 |
3 | 2020 | 4 | 439691 |
4 | 2021 | 1 | 403592 |
5 | 2021 | 2 | 495826 |
6 | 2021 | 3 | 223561 |
7 | 2021 | 4 | 156590 |
8 | 2022 | 1 | 346261 |
9 | 2022 | 2 | 209534 |
10 | 2022 | 3 | 268904 |
11 | 2022 | 4 | 191569 |
sales_data.Year
0 2020
1 2020
2 2020
3 2020
4 2021
5 2021
6 2021
7 2021
8 2022
9 2022
10 2022
11 2022
Name: Year, dtype: int64
sales_data.Quarter
0 1
1 2
2 3
3 4
4 1
5 2
6 3
7 4
8 1
9 2
10 3
11 4
Name: Quarter, dtype: int64
# 现在将两个数组以及一个频率传入PeriodIndex,就可以将他们合并成DataFrame的一个索引
index = pd.PeriodIndex(year=sales_data.Year,quarter=sales_data.Quarter,freq='Q-DEC')
index
PeriodIndex(['2020Q1', '2020Q2', '2020Q3', '2020Q4', '2021Q1', '2021Q2',
'2021Q3', '2021Q4', '2022Q1', '2022Q2', '2022Q3', '2022Q4'],
dtype='period[Q-DEC]')
sales_data.index = index
sales_data
Year | Quarter | Sales | |
---|---|---|---|
2020Q1 | 2020 | 1 | 144418 |
2020Q2 | 2020 | 2 | 244268 |
2020Q3 | 2020 | 3 | 425860 |
2020Q4 | 2020 | 4 | 439691 |
2021Q1 | 2021 | 1 | 403592 |
2021Q2 | 2021 | 2 | 495826 |
2021Q3 | 2021 | 3 | 223561 |
2021Q4 | 2021 | 4 | 156590 |
2022Q1 | 2022 | 1 | 346261 |
2022Q2 | 2022 | 2 | 209534 |
2022Q3 | 2022 | 3 | 268904 |
2022Q4 | 2022 | 4 | 191569 |
6 重采样及频率转换
# 重采样,指将时间序列从一个频率转换到另一个频率的处理过程。
# 高频率-》低频率:降采样
# 低频率-》高频率:升采样
s = sales_data['Sales']
s
2020Q1 144418
2020Q2 244268
2020Q3 425860
2020Q4 439691
2021Q1 403592
2021Q2 495826
2021Q3 223561
2021Q4 156590
2022Q1 346261
2022Q2 209534
2022Q3 268904
2022Q4 191569
Freq: Q-DEC, Name: Sales, dtype: int64
6.1 低频转高频
# 低频转高频
s.resample('M').sum()
2020-01 144418.0
2020-02 NaN
2020-03 NaN
2020-04 244268.0
2020-05 NaN
2020-06 NaN
2020-07 425860.0
2020-08 NaN
2020-09 NaN
2020-10 439691.0
2020-11 NaN
2020-12 NaN
2021-01 403592.0
2021-02 NaN
2021-03 NaN
2021-04 495826.0
2021-05 NaN
2021-06 NaN
2021-07 223561.0
2021-08 NaN
2021-09 NaN
2021-10 156590.0
2021-11 NaN
2021-12 NaN
2022-01 346261.0
2022-02 NaN
2022-03 NaN
2022-04 209534.0
2022-05 NaN
2022-06 NaN
2022-07 268904.0
2022-08 NaN
2022-09 NaN
2022-10 191569.0
2022-11 NaN
2022-12 NaN
Freq: M, Name: Sales, dtype: float64
6.2 高频转低频
# 高频转低频
s.resample('Y').sum()
2020 1254237
2021 1279569
2022 1016268
Freq: A-DEC, Name: Sales, dtype: int64
6.3 OHLC重采样
s.resample('5min').ohlc()
open | high | low | close | |
---|---|---|---|---|
2020-01-01 00:00 | 144418.0 | 144418.0 | 144418.0 | 144418.0 |
2020-01-01 00:05 | NaN | NaN | NaN | NaN |
2020-01-01 00:10 | NaN | NaN | NaN | NaN |
2020-01-01 00:15 | NaN | NaN | NaN | NaN |
2020-01-01 00:20 | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... |
2022-12-31 23:35 | NaN | NaN | NaN | NaN |
2022-12-31 23:40 | NaN | NaN | NaN | NaN |
2022-12-31 23:45 | NaN | NaN | NaN | NaN |
2022-12-31 23:50 | NaN | NaN | NaN | NaN |
2022-12-31 23:55 | NaN | NaN | NaN | NaN |
315648 rows × 4 columns
6.4 通过groupby进行重采样
s.groupby(lambda x:x.month).mean()
3 298090.333333
6 316542.666667
9 306108.333333
12 262616.666667
Name: Sales, dtype: float64
7 时间序列绘图
import akshare as ak
stock_zh_a_tick_tx_js_df = ak.stock_zh_a_tick_tx_js(symbol="sh600570")
D:\Program Files\Python\Python311\Lib\site-packages\akshare\stock\stock_zh_a_tick_tx.py:27: UserWarning: 正在下载数据,请稍等
warnings.warn("正在下载数据,请稍等")
stock_zh_a_tick_tx_js_df
成交时间 | 成交价格 | 价格变动 | 成交量 | 成交金额 | 性质 | |
---|---|---|---|---|---|---|
0 | 09:25:00 | 28.48 | 0.00 | 371 | 1056608 | 卖盘 |
1 | 09:30:00 | 28.48 | 0.00 | 1 | 2848 | 买盘 |
2 | 09:30:03 | 28.46 | -0.02 | 102 | 290291 | 卖盘 |
3 | 09:30:06 | 28.45 | -0.01 | 160 | 454700 | 中性盘 |
4 | 09:30:09 | 28.47 | 0.02 | 203 | 577846 | 买盘 |
... | ... | ... | ... | ... | ... | ... |
2057 | 11:29:42 | 28.60 | 0.00 | 3 | 8580 | 卖盘 |
2058 | 11:29:45 | 28.61 | 0.01 | 20 | 57220 | 买盘 |
2059 | 11:29:51 | 28.60 | -0.01 | 41 | 117260 | 卖盘 |
2060 | 11:29:57 | 28.60 | 0.00 | 22 | 62925 | 卖盘 |
2061 | 11:30:00 | 28.60 | 0.00 | 3 | 8580 | 卖盘 |
2062 rows × 6 columns
import matplotlib.pyplot as plt
stock_zh_a_tick_tx_js_df['成交价格'].plot()
<Axes: >
# 将“成交时间”作为index
stock_zh_a_tick_tx_js_df.set_index('成交时间',inplace=True)
stock_zh_a_tick_tx_js_df
成交价格 | 价格变动 | 成交量 | 成交金额 | 性质 | |
---|---|---|---|---|---|
成交时间 | |||||
09:25:00 | 28.48 | 0.00 | 371 | 1056608 | 卖盘 |
09:30:00 | 28.48 | 0.00 | 1 | 2848 | 买盘 |
09:30:03 | 28.46 | -0.02 | 102 | 290291 | 卖盘 |
09:30:06 | 28.45 | -0.01 | 160 | 454700 | 中性盘 |
09:30:09 | 28.47 | 0.02 | 203 | 577846 | 买盘 |
... | ... | ... | ... | ... | ... |
11:29:42 | 28.60 | 0.00 | 3 | 8580 | 卖盘 |
11:29:45 | 28.61 | 0.01 | 20 | 57220 | 买盘 |
11:29:51 | 28.60 | -0.01 | 41 | 117260 | 卖盘 |
11:29:57 | 28.60 | 0.00 | 22 | 62925 | 卖盘 |
11:30:00 | 28.60 | 0.00 | 3 | 8580 | 卖盘 |
2062 rows × 5 columns
# 设置中文字体为SimHei
plt.rcParams['font.family'] = 'SimHei'
stock_zh_a_tick_tx_js_df.plot()
<Axes: xlabel='成交时间'>
# 调整图表大小
fig, ax = plt.subplots(figsize=(15, 5))
stock_zh_a_tick_tx_js_df['成交价格'].plot()
<Axes: xlabel='成交时间'>
8 移动窗口函数
8.1 移动窗口函数
a = stock_zh_a_tick_tx_js_df['成交价格'].plot()
import akshare as ak
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="600570", period="daily", start_date="20170301", end_date='20231218', adjust="qfq")
stock_zh_a_hist_df
日期 | 开盘 | 收盘 | 最高 | 最低 | 成交量 | 成交额 | 振幅 | 涨跌幅 | 涨跌额 | 换手率 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2017-03-01 | 14.30 | 14.58 | 14.79 | 14.30 | 173340 | 816668656.0 | 3.40 | 1.11 | 0.16 | 2.81 |
1 | 2017-03-02 | 14.57 | 14.39 | 14.77 | 14.38 | 120562 | 565992768.0 | 2.67 | -1.30 | -0.19 | 1.95 |
2 | 2017-03-03 | 14.35 | 14.23 | 14.35 | 14.14 | 77551 | 356441088.0 | 1.46 | -1.11 | -0.16 | 1.26 |
3 | 2017-03-06 | 14.21 | 14.35 | 14.39 | 14.14 | 68147 | 314819696.0 | 1.76 | 0.84 | 0.12 | 1.10 |
4 | 2017-03-07 | 14.37 | 14.44 | 14.46 | 14.25 | 79670 | 369579360.0 | 1.46 | 0.63 | 0.09 | 1.29 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1651 | 2023-12-12 | 30.17 | 29.72 | 30.24 | 29.56 | 223229 | 664476820.0 | 2.25 | -1.62 | -0.49 | 1.17 |
1652 | 2023-12-13 | 29.78 | 29.34 | 30.16 | 29.33 | 235863 | 701452200.0 | 2.79 | -1.28 | -0.38 | 1.24 |
1653 | 2023-12-14 | 29.60 | 29.17 | 29.87 | 29.15 | 155482 | 458627579.0 | 2.45 | -0.58 | -0.17 | 0.82 |
1654 | 2023-12-15 | 29.32 | 28.77 | 29.36 | 28.71 | 185556 | 536890405.0 | 2.23 | -1.37 | -0.40 | 0.98 |
1655 | 2023-12-18 | 28.55 | 28.49 | 29.18 | 28.30 | 160454 | 459751589.0 | 3.06 | -0.97 | -0.28 | 0.84 |
1656 rows × 11 columns
stock_zh_a_hist_df.set_index('日期',inplace=True)
# 调整图表大小
fig, ax = plt.subplots(figsize=(15, 5))
stock_zh_a_hist_df['收盘'].plot()
<Axes: xlabel='日期'>
# DataFrame.rolling(window, min_periods=None, axis=0, win_type=None, on=None, center=False, closed=None)
# 参数说明:
# window: 滚动窗口的大小,表示在每个窗口中包含的观测值数量。
# min_periods: 可选参数,指定要执行滚动计算的最小观测值数量。默认为窗口大小。
# axis: 指定滚动操作的轴。默认为0,表示在行方向上执行滚动操作。
# win_type: 可选参数,指定窗口类型,例如平均窗口、高斯窗口等。默认为None,表示使用均匀窗口。
# on: 可选参数,如果你的DataFrame具有多个时间列,并且要在特定的时间列上执行滚动操作,则可以使用此参数指定列的名称。
# center: 布尔值,表示是否在窗口的中心执行计算。默认为False,表示在窗口的右侧执行计算。
# closed: 指定窗口的开闭方式。可以是'right'、'left'、'both'或'neither'。默认为'right',表示右闭左开。
rolling_mean = stock_zh_a_hist_df['收盘'].rolling(window=1).mean()
stock_zh_a_hist_df['rolling_mean'] = rolling_mean
stock_zh_a_hist_df
开盘 | 收盘 | 最高 | 最低 | 成交量 | 成交额 | 振幅 | 涨跌幅 | 涨跌额 | 换手率 | rolling_mean | |
---|---|---|---|---|---|---|---|---|---|---|---|
日期 | |||||||||||
2017-03-01 | 14.30 | 14.58 | 14.79 | 14.30 | 173340 | 816668656.0 | 3.40 | 1.11 | 0.16 | 2.81 | 14.58 |
2017-03-02 | 14.57 | 14.39 | 14.77 | 14.38 | 120562 | 565992768.0 | 2.67 | -1.30 | -0.19 | 1.95 | 14.39 |
2017-03-03 | 14.35 | 14.23 | 14.35 | 14.14 | 77551 | 356441088.0 | 1.46 | -1.11 | -0.16 | 1.26 | 14.23 |
2017-03-06 | 14.21 | 14.35 | 14.39 | 14.14 | 68147 | 314819696.0 | 1.76 | 0.84 | 0.12 | 1.10 | 14.35 |
2017-03-07 | 14.37 | 14.44 | 14.46 | 14.25 | 79670 | 369579360.0 | 1.46 | 0.63 | 0.09 | 1.29 | 14.44 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2023-12-12 | 30.17 | 29.72 | 30.24 | 29.56 | 223229 | 664476820.0 | 2.25 | -1.62 | -0.49 | 1.17 | 29.72 |
2023-12-13 | 29.78 | 29.34 | 30.16 | 29.33 | 235863 | 701452200.0 | 2.79 | -1.28 | -0.38 | 1.24 | 29.34 |
2023-12-14 | 29.60 | 29.17 | 29.87 | 29.15 | 155482 | 458627579.0 | 2.45 | -0.58 | -0.17 | 0.82 | 29.17 |
2023-12-15 | 29.32 | 28.77 | 29.36 | 28.71 | 185556 | 536890405.0 | 2.23 | -1.37 | -0.40 | 0.98 | 28.77 |
2023-12-18 | 28.55 | 28.49 | 29.18 | 28.30 | 160454 | 459751589.0 | 3.06 | -0.97 | -0.28 | 0.84 | 28.49 |
1656 rows × 11 columns
# 计算滚动窗口的标准差
rolling_std = stock_zh_a_hist_df['收盘'].rolling(window=3).std()
# 将滚动窗口的标准差添加到DataFrame
stock_zh_a_hist_df['rolling_std'] = rolling_std
stock_zh_a_hist_df
开盘 | 收盘 | 最高 | 最低 | 成交量 | 成交额 | 振幅 | 涨跌幅 | 涨跌额 | 换手率 | rolling_mean | rolling_std | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
日期 | ||||||||||||
2017-03-01 | 14.30 | 14.58 | 14.79 | 14.30 | 173340 | 816668656.0 | 3.40 | 1.11 | 0.16 | 2.81 | 14.58 | NaN |
2017-03-02 | 14.57 | 14.39 | 14.77 | 14.38 | 120562 | 565992768.0 | 2.67 | -1.30 | -0.19 | 1.95 | 14.39 | NaN |
2017-03-03 | 14.35 | 14.23 | 14.35 | 14.14 | 77551 | 356441088.0 | 1.46 | -1.11 | -0.16 | 1.26 | 14.23 | 0.175214 |
2017-03-06 | 14.21 | 14.35 | 14.39 | 14.14 | 68147 | 314819696.0 | 1.76 | 0.84 | 0.12 | 1.10 | 14.35 | 0.083267 |
2017-03-07 | 14.37 | 14.44 | 14.46 | 14.25 | 79670 | 369579360.0 | 1.46 | 0.63 | 0.09 | 1.29 | 14.44 | 0.105357 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2023-12-12 | 30.17 | 29.72 | 30.24 | 29.56 | 223229 | 664476820.0 | 2.25 | -1.62 | -0.49 | 1.17 | 29.72 | 0.380832 |
2023-12-13 | 29.78 | 29.34 | 30.16 | 29.33 | 235863 | 701452200.0 | 2.79 | -1.28 | -0.38 | 1.24 | 29.34 | 0.436157 |
2023-12-14 | 29.60 | 29.17 | 29.87 | 29.15 | 155482 | 458627579.0 | 2.45 | -0.58 | -0.17 | 0.82 | 29.17 | 0.281603 |
2023-12-15 | 29.32 | 28.77 | 29.36 | 28.71 | 185556 | 536890405.0 | 2.23 | -1.37 | -0.40 | 0.98 | 28.77 | 0.292632 |
2023-12-18 | 28.55 | 28.49 | 29.18 | 28.30 | 160454 | 459751589.0 | 3.06 | -0.97 | -0.28 | 0.84 | 28.49 | 0.341760 |
1656 rows × 12 columns
# 调整图表大小
fig, ax = plt.subplots(figsize=(15, 5))
stock_zh_a_hist_df['rolling_std'].plot()
<Axes: xlabel='日期'>
8.2 指数加权函数
在 pandas 中,可以使用 ewm 方法来执行指数加权平均。ewm 表示“指数加权移动”,其基本语法如下:
DataFrame.ewm(span=None, alpha=None, min_periods=1, adjust=True, ignore_na=False, axis=0)
参数说明:
- span: 指定指数加权平均的窗口大小,它表示观测值的半衰期(half-life)。与窗口大小有关,通常与 alpha 中的一个参数有关。可以在 span 和 alpha 中选择一个来指定权重。
- alpha: 控制指数加权平均的平滑度。如果选择使用 alpha,则不需要指定 span。alpha 取值范围在 0 到 1 之间。
- min_periods: 可选参数,指定要执行指数加权计算的最小观测值数量。
- adjust: 控制是否应用校正。默认为 True,表示应用校正以考虑观测值的数量。
- ignore_na: 布尔值,表示是否忽略缺失值。默认为 False,表示不忽略缺失值。
- axis: 指定操作的轴。默认为 0,表示在行方向上执行指数加权操作。
import pandas as pd
# 创建一个示例DataFrame
data = {'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
df = pd.DataFrame(data)
# 计算指数加权平均
ewma = df['value'].ewm(span=3).mean()
# 将指数加权平均添加到DataFrame
df['ewma'] = ewma
df
value | ewma | |
---|---|---|
0 | 1 | 1.000000 |
1 | 2 | 1.666667 |
2 | 3 | 2.428571 |
3 | 4 | 3.266667 |
4 | 5 | 4.161290 |
5 | 6 | 5.095238 |
6 | 7 | 6.055118 |
7 | 8 | 7.031373 |
8 | 9 | 8.017613 |
9 | 10 | 9.009775 |
# 调整图表大小
fig, ax = plt.subplots(figsize=(15, 5))
stock_zh_a_hist_df['收盘'].plot()
<Axes: xlabel='日期'>
# ma5 = stock_zh_a_hist_df['收盘'].ewm(span=5).mean()
# ma10 = stock_zh_a_hist_df['收盘'].ewm(span=10).mean()
# ma30 = stock_zh_a_hist_df['收盘'].ewm(span=30).mean()
ma60 = stock_zh_a_hist_df['收盘'].ewm(span=60).mean()
ma60_mean = stock_zh_a_hist_df['收盘'].rolling(60).mean()
# ma120 = stock_zh_a_hist_df['收盘'].ewm(span=120).mean()
# ma180 = stock_zh_a_hist_df['收盘'].ewm(span=180).mean()
# 调整图表大小
fig, ax = plt.subplots(figsize=(15, 5))
# ma5.plot()
# ma10.plot()
# ma30.plot()
ma60.plot()
ma60_mean.plot()
# ma120.plot()
# ma180.plot()
stock_zh_a_hist_df['收盘'].plot()
<Axes: xlabel='日期'>
8.3 二元移动窗口函数
import akshare as ak
stock_zh_a_hist_df_600570 = ak.stock_zh_a_hist(symbol="600570", period="daily", start_date="20170301", end_date='20231218', adjust="qfq")
stock_zh_a_hist_df_600570.set_index('日期',inplace=True)
stock_zh_a_hist_df_600570
开盘 | 收盘 | 最高 | 最低 | 成交量 | 成交额 | 振幅 | 涨跌幅 | 涨跌额 | 换手率 | |
---|---|---|---|---|---|---|---|---|---|---|
日期 | ||||||||||
2017-03-01 | 14.30 | 14.58 | 14.79 | 14.30 | 173340 | 816668656.0 | 3.40 | 1.11 | 0.16 | 2.81 |
2017-03-02 | 14.57 | 14.39 | 14.77 | 14.38 | 120562 | 565992768.0 | 2.67 | -1.30 | -0.19 | 1.95 |
2017-03-03 | 14.35 | 14.23 | 14.35 | 14.14 | 77551 | 356441088.0 | 1.46 | -1.11 | -0.16 | 1.26 |
2017-03-06 | 14.21 | 14.35 | 14.39 | 14.14 | 68147 | 314819696.0 | 1.76 | 0.84 | 0.12 | 1.10 |
2017-03-07 | 14.37 | 14.44 | 14.46 | 14.25 | 79670 | 369579360.0 | 1.46 | 0.63 | 0.09 | 1.29 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2023-12-12 | 30.17 | 29.72 | 30.24 | 29.56 | 223229 | 664476820.0 | 2.25 | -1.62 | -0.49 | 1.17 |
2023-12-13 | 29.78 | 29.34 | 30.16 | 29.33 | 235863 | 701452200.0 | 2.79 | -1.28 | -0.38 | 1.24 |
2023-12-14 | 29.60 | 29.17 | 29.87 | 29.15 | 155482 | 458627579.0 | 2.45 | -0.58 | -0.17 | 0.82 |
2023-12-15 | 29.32 | 28.77 | 29.36 | 28.71 | 185556 | 536890405.0 | 2.23 | -1.37 | -0.40 | 0.98 |
2023-12-18 | 28.55 | 28.49 | 29.18 | 28.30 | 160454 | 459751589.0 | 3.06 | -0.97 | -0.28 | 0.84 |
1656 rows × 10 columns
stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol="sh510300")
stock_zh_index_daily_df.set_index('date',inplace=True)
stock_zh_index_daily_df.index = pd.to_datetime(stock_zh_index_daily_df.index)
start_date = "2017-03-01"
end_date = "2023-12-18"
stock_zh_index_daily_df = stock_zh_index_daily_df.loc[start_date:end_date]
stock_zh_index_daily_df
open | high | low | close | volume | |
---|---|---|---|---|---|
date | |||||
2017-03-01 | 3.447 | 3.472 | 3.441 | 3.449 | 135589767 |
2017-03-02 | 3.455 | 3.503 | 3.427 | 3.437 | 95548529 |
2017-03-03 | 3.427 | 3.428 | 3.407 | 3.424 | 77837516 |
2017-03-06 | 3.424 | 3.444 | 3.418 | 3.441 | 99993926 |
2017-03-07 | 3.439 | 3.447 | 3.434 | 3.446 | 76185403 |
... | ... | ... | ... | ... | ... |
2023-12-12 | 3.476 | 3.495 | 3.473 | 3.493 | 640724215 |
2023-12-13 | 3.482 | 3.486 | 3.432 | 3.435 | 708815211 |
2023-12-14 | 3.451 | 3.465 | 3.414 | 3.419 | 741533123 |
2023-12-15 | 3.430 | 3.454 | 3.405 | 3.412 | 899976785 |
2023-12-18 | 3.398 | 3.419 | 3.380 | 3.398 | 847303752 |
1656 rows × 5 columns
# 调整图表大小
fig, ax = plt.subplots(figsize=(15, 5))
stock_zh_a_hist_df_600570['收盘'].plot()
stock_zh_index_daily_df['close'].plot()
<Axes: xlabel='date'>
import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt
# 获取股票“600570”数据
stock_zh_a_hist_df_600570 = ak.stock_zh_a_hist(symbol="600570", period="daily", start_date="20170301", end_date='20231218', adjust="qfq")
stock_zh_a_hist_df_600570.set_index('日期', inplace=True)
# 获取上证深证300指数数据
stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol="sh510300")
stock_zh_index_daily_df.set_index('date', inplace=True)
stock_zh_index_daily_df.index = pd.to_datetime(stock_zh_index_daily_df.index)
start_date = "2017-03-01"
end_date = "2023-12-18"
stock_zh_index_daily_df = stock_zh_index_daily_df.loc[start_date:end_date]
# 创建两个子图
fig, ax1 = plt.subplots(figsize=(10, 5))
# 在第一个子图上绘制股票数据
color = 'tab:red'
ax1.set_xlabel('日期')
ax1.set_ylabel('股票600570收盘价', color=color)
ax1.plot(stock_zh_a_hist_df_600570.index, stock_zh_a_hist_df_600570['收盘'], color=color)
ax1.tick_params(axis='y', labelcolor=color)
# 创建第二个子图,并共享x轴
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('上证深证300指数收盘价', color=color)
ax2.plot(stock_zh_index_daily_df.index, stock_zh_index_daily_df['close'], color=color)
ax2.tick_params(axis='y', labelcolor=color)
# 调整布局
fig.tight_layout()
plt.show()
8.4 用户定义的移动窗口函数
import pandas as pd
import numpy as np
# 创建一个示例的DataFrame
data = {'value': [1, 2, 3, 4, 5, 6, 7, 8, 9]}
df = pd.DataFrame(data)
# 定义一个自定义的移动窗口函数
def custom_window_function(window):
# 示例:计算窗口内元素的平均值
return np.mean(window)
# 使用rolling和apply应用自定义窗口函数
window_size = 3 # 移动窗口的大小
df['rolling_mean'] = df['value'].rolling(window=window_size).apply(custom_window_function, raw=True)
# 打印结果
print(df)
value rolling_mean
0 1 NaN
1 2 NaN
2 3 2.0
3 4 3.0
4 5 4.0
5 6 5.0
6 7 6.0
7 8 7.0
8 9 8.0
df.plot()
<Axes: >
本文来自博客园,作者:江雪独钓翁,转载请注明原文链接:https://www.cnblogs.com/zhouwp/p/17913863.html