110 lines
3.9 KiB
Python
110 lines
3.9 KiB
Python
import requests
|
||
import json
|
||
import pandas as pd
|
||
import matplotlib.pyplot as plt
|
||
|
||
# 设置 Matplotlib 使用的中文字体
|
||
plt.rcParams['font.sans-serif'] = ['SimHei'] # 选择合适的中文字体
|
||
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
|
||
|
||
def get_fund_flow_data():
|
||
"""获取资金流向数据"""
|
||
url = "https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery112309006219872217847_1740232310161&fid=f62&po=1&pz=50&pn=1&np=1&fltt=2&invt=2&ut=8dec03ba335b81bf4ebdf7b29ec27d15&fs=m%3A90+t%3A2&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124%2Cf1%2Cf13"
|
||
|
||
headers = {
|
||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
||
}
|
||
|
||
try:
|
||
response = requests.get(url, headers=headers)
|
||
# 去除 JSONP 格式中的回调函数部分
|
||
response_text = response.text[response.text.find('(') + 1: response.text.rfind(')')]
|
||
data = json.loads(response_text)
|
||
|
||
if 'data' not in data or 'diff' not in data['data']:
|
||
raise Exception("未能获取到数据")
|
||
|
||
items = data['data']['diff']
|
||
|
||
parsed_data = []
|
||
for item in items:
|
||
# 获取增仓数据
|
||
increase_position = item['f72']
|
||
# 假设你想加入的另一个数据项,比如资金流入(这里只做示范)
|
||
fund_inflow = item['f62'] # 可以根据实际需要更改为其他数据字段
|
||
parsed_data.append({
|
||
'板块': item['f14'], # 板块名称
|
||
'增仓': increase_position, # 增仓值
|
||
'资金流入': fund_inflow # 假设另一个对比数据
|
||
})
|
||
|
||
# 将数据转为DataFrame
|
||
df = pd.DataFrame(parsed_data)
|
||
# 按增仓排序
|
||
df_sorted = df.sort_values(by='增仓', ascending=False)
|
||
|
||
return df_sorted
|
||
|
||
except Exception as e:
|
||
print(f"获取数据时发生错误: {str(e)}")
|
||
return None
|
||
|
||
|
||
def plot_combined_chart(data):
|
||
"""绘制增仓排名的柱状图与折线图结合"""
|
||
# 获取前10个板块及其增仓数据
|
||
sectors = data['板块'].tolist()[:10]
|
||
increase_positions = data['增仓'].tolist()[:10]
|
||
fund_inflows = data['资金流入'].tolist()[:10] # 资金流入作为对比数据
|
||
|
||
# 创建一个图形
|
||
fig, ax1 = plt.subplots(figsize=(12, 7))
|
||
|
||
# 绘制增仓值的柱状图
|
||
ax1.bar(sectors, increase_positions, color='b', alpha=0.6, label='增仓值', width=0.4)
|
||
|
||
# 设置柱状图的Y轴标签
|
||
ax1.set_xlabel('板块', fontsize=14)
|
||
ax1.set_ylabel('增仓值', fontsize=14, color='b')
|
||
ax1.tick_params(axis='y', labelcolor='b')
|
||
|
||
# 创建第二个Y轴来绘制折线图
|
||
ax2 = ax1.twinx()
|
||
ax2.plot(sectors, increase_positions, color='r', marker='o', label='增仓趋势', linewidth=2)
|
||
|
||
# 添加资金流入的折线
|
||
ax2.plot(sectors, fund_inflows, color='g', marker='^', label='资金流入', linewidth=2)
|
||
|
||
# 设置折线图的Y轴标签
|
||
ax2.set_ylabel('趋势值', fontsize=14, color='r')
|
||
ax2.tick_params(axis='y', labelcolor='r')
|
||
|
||
# 设置标题
|
||
plt.title('增仓与资金流入对比 - 柱状图与折线图结合', fontsize=16)
|
||
|
||
# 显示图形
|
||
plt.xticks(rotation=45) # 使X轴标签旋转,防止重叠
|
||
fig.tight_layout() # 自动调整布局,防止标签被遮挡
|
||
|
||
# 添加图例
|
||
ax1.legend(loc='upper left')
|
||
ax2.legend(loc='upper right')
|
||
|
||
plt.show()
|
||
|
||
|
||
def main():
|
||
# 获取数据并计算
|
||
print("正在获取资金流向数据...")
|
||
data = get_fund_flow_data()
|
||
|
||
if data is not None:
|
||
print("正在生成增仓与资金流入对比的柱状图与折线图结合...")
|
||
plot_combined_chart(data)
|
||
else:
|
||
print("获取数据失败,请检查网络连接或接口可用性。")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|