近期,互联网技术领域出现了一个新现象,即微博热搜数据被转化为视频形式,这一做法引起了广泛关注。在此之前,热搜数据的收集和保存已得以实现,而现在数据视频化的技术又取得了新的突破。那么,这一过程是如何进行的?我们来深入了解一番。
热度椭圆图思路
确定热度椭圆图是微博热搜数据视频化的初始步骤。依据预设,需根据热度数值来设定椭圆的具体参数。技术人员需确立热搜词条热度量的具体标准,例如以具体数字来表示热度。接着,他们基于这些数据建立椭圆模型,并将热搜词条纳入其中。通过这种方式,一个能够直观展示热搜词条热度关系的椭圆图得以初步构建。
将椭圆图中的热门词汇整合至单一图表,便形成了一个集众多热点信息于一体的可视化呈现。这种呈现并非单纯的列表排列,其中蕴含着一定的逻辑关系。通过精心设计布局,可以更直观地展现不同热门词汇之间的相互联系,为视频制作提供坚实的基础。
不同时间图片制作
椭圆图确定之后,需制作反映不同时段热搜数据的相关图片。技术人员将依据既定的时间节点,如每小时或每日,搜集对应时间段的微博热搜信息。随后,他们依照既定的热度椭圆图制作流程,为每个时间节点生成一张包含热搜关键词的图片。
数据处理量巨大,且需生成精确图像。需注重数据提取的精确度,保证各时间节点的数据真实无误。此外,图像制作的精确性亦不可忽视,唯有确保图像质量,后续视频制作方能达到预期效果。
视频生成过程
获取到不同时点的图像资料后,需将它们整合为视频内容。专业人士运用专业视频编辑软件,依时间线对图像进行编排,并调整过渡效果,确保画面转换自然且连贯。通过这一过程,便初步构建出展示微博热搜数据随时间演变的视频资料。
在制作过程中,必须严格控制视频的时长与节奏。若时间分配不当,视频节奏可能变得过快或过慢。同时,过渡效果的选择同样至关重要,它直接关系到观众的整体观看感受。
BGM添加效果
<p><pre> <code class="prism language-python"><span class="token comment"># -*- coding: utf-8 -*-</span>
<span class="token keyword">import</span> pandas <span class="token keyword">as</span> pd
<span class="token keyword">import</span> random
<span class="token keyword">from</span> tqdm <span class="token keyword">import</span> tqdm
<span class="token keyword">import</span> datetime
<span class="token keyword">import</span> time
<span class="token keyword">import</span> math
<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np
<span class="token keyword">import</span> pygame <span class="token comment">#采用pygame绘制图片</span>
<span class="token keyword">import</span> sys
<span class="token keyword">from</span> pygame<span class="token punctuation">.</span><span class="token builtin">locals</span> <span class="token keyword">import</span> <span class="token operator">*</span>
<span class="token keyword">import</span> cv2
<span class="token keyword">from</span> PIL <span class="token keyword">import</span> ImageGrab <span class="token comment">#截屏获取图片形成视频</span>
<span class="token keyword">import</span> moviepy<span class="token punctuation">.</span>editor <span class="token keyword">as</span> mpe
<span class="token keyword">import</span> My_Email <span class="token keyword">as</span> my
<span class="token keyword">class</span> <span class="token class-name">WeiboHotnessVideo</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> date<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''
初始化对象
Parameters
----------
date : str
日期,如20200202.
Returns
-------
None.
'''</span>
self<span class="token punctuation">.</span>folder_path <span class="token operator">=</span> <span class="token string">r'XXXXXXXXXXXX\weibo_hotness'</span>
self<span class="token punctuation">.</span>date <span class="token operator">=</span> date <span class="token comment">#当前天日期</span>
self<span class="token punctuation">.</span>next_date <span class="token operator">=</span> datetime<span class="token punctuation">.</span>date<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>date<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>date<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">:</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>date<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> datetime<span class="token punctuation">.</span>timedelta<span class="token punctuation">(</span>days<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment">#下一天日期</span>
self<span class="token punctuation">.</span>next_date <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span>self<span class="token punctuation">.</span>next_date<span class="token punctuation">,</span> <span class="token string">'%Y%m%d'</span><span class="token punctuation">)</span>
self<span class="token punctuation">.</span>starttime <span class="token operator">=</span> <span class="token string">'0430'</span> <span class="token comment">#每天的开始和结束时间</span>
self<span class="token punctuation">.</span>frame_number <span class="token operator">=</span> <span class="token number">10</span> <span class="token comment">#每列数据间帧数</span>
self<span class="token punctuation">.</span>fps <span class="token operator">=</span> <span class="token number">60</span> <span class="token comment">#pygame帧率</span>
self<span class="token punctuation">.</span>video_fps <span class="token operator">=</span> <span class="token number">60</span> <span class="token comment">#生成的视频帧率</span>
self<span class="token punctuation">.</span>background_color <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span> <span class="token comment">#视频背景颜色</span>
self<span class="token punctuation">.</span>hotness_video<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">#数据视频化</span>
self<span class="token punctuation">.</span>add_BGM<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">#配音</span>
<span class="token keyword">def</span> <span class="token function">hotness_video</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''
Returns
-------
None.
'''</span>
all_frame_data <span class="token operator">=</span> self<span class="token punctuation">.</span>hotness_data_settle<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">#处理热度数据</span>
<span class="token comment">#重置文件夹地址</span>
self<span class="token punctuation">.</span>folder_path <span class="token operator">=</span> <span class="token string">r'D:\weibo_hotness_video'</span>
<span class="token comment">#录屏初始化</span>
p <span class="token operator">=</span> ImageGrab<span class="token punctuation">.</span>grab<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment">#获得当前屏幕</span>
a<span class="token punctuation">,</span>b<span class="token operator">=</span>p<span class="token punctuation">.</span>size<span class="token comment">#获得当前屏幕的大小</span>
self<span class="token punctuation">.</span>screen_width <span class="token operator">=</span> a
self<span class="token punctuation">.</span>screen_height <span class="token operator">=</span> b
self<span class="token punctuation">.</span>screen_ratio <span class="token operator">=</span> self<span class="token punctuation">.</span>screen_height<span class="token operator">/</span>self<span class="token punctuation">.</span>screen_width
fourcc <span class="token operator">=</span> cv2<span class="token punctuation">.</span>VideoWriter_fourcc<span class="token punctuation">(</span><span class="token operator">*</span><span class="token string">'XVID'</span><span class="token punctuation">)</span><span class="token comment">#编码格式</span>
<span class="token comment">#输出文件命名为test.mp4,帧率为60,可以自己设置</span>
video <span class="token operator">=</span> cv2<span class="token punctuation">.</span>VideoWriter<span class="token punctuation">(</span>self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">'\VIDEO\%s.avi'</span><span class="token operator">%</span>self<span class="token punctuation">.</span>date<span class="token punctuation">,</span> fourcc<span class="token punctuation">,</span> self<span class="token punctuation">.</span>video_fps<span class="token punctuation">,</span> <span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment"># pygame 初始化</span>
pygame<span class="token punctuation">.</span>init<span class="token punctuation">(</span><span class="token punctuation">)</span>
FPSClock <span class="token operator">=</span> pygame<span class="token punctuation">.</span>time<span class="token punctuation">.</span>Clock<span class="token punctuation">(</span><span class="token punctuation">)</span>
screen <span class="token operator">=</span> pygame<span class="token punctuation">.</span>display<span class="token punctuation">.</span>set_mode<span class="token punctuation">(</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>screen_width<span class="token punctuation">,</span> self<span class="token punctuation">.</span>screen_height<span class="token punctuation">)</span><span class="token punctuation">)</span>
hotness_title_number <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>all_frame_data<span class="token punctuation">)</span>
previous_frame_data <span class="token operator">=</span> <span class="token boolean">None</span>
<span class="token comment">#制作片头</span>
movie_start_text <span class="token operator">=</span> <span class="token string">'%s年%s月%s日微博热搜动态'</span><span class="token operator">%</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>date<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>date<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">:</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>date<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">:</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token comment">#设置片头背景图片</span>
background <span class="token operator">=</span> pygame<span class="token punctuation">.</span>image<span class="token punctuation">.</span>load<span class="token punctuation">(</span>self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">'\movie_start.jpg'</span><span class="token punctuation">)</span>
<span class="token comment">#确定文字格式和大小</span>
my_font <span class="token operator">=</span> pygame<span class="token punctuation">.</span>font<span class="token punctuation">.</span>Font<span class="token punctuation">(</span>self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">r'\STXINGKA.TTF'</span><span class="token punctuation">,</span><span class="token number">120</span><span class="token punctuation">)</span>
<span class="token comment">#新建文本图章</span>
textImage <span class="token operator">=</span> my_font<span class="token punctuation">.</span>render<span class="token punctuation">(</span>movie_start_text<span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">153</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">#文本框尺寸</span>
text_size_x<span class="token punctuation">,</span> text_size_y <span class="token operator">=</span> textImage<span class="token punctuation">.</span>get_size<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token number">1.5</span><span class="token operator">*</span>self<span class="token punctuation">.</span>video_fps<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
screen<span class="token punctuation">.</span>blit<span class="token punctuation">(</span>background<span class="token punctuation">,</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#对齐的坐标</span>
<span class="token comment">#绘制文本</span>
pos_x <span class="token operator">=</span> <span class="token number">0.5</span><span class="token operator">*</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>screen_width<span class="token operator">-</span>text_size_x<span class="token punctuation">)</span> <span class="token comment">#横坐标</span>
pos_y <span class="token operator">=</span> <span class="token number">0.5</span><span class="token operator">*</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>screen_height<span class="token operator">-</span>text_size_y<span class="token punctuation">)</span> <span class="token comment">#纵坐标</span>
<span class="token keyword">if</span> i <span class="token operator"><</span> self<span class="token punctuation">.</span>video_fps<span class="token punctuation">:</span>
visible_area <span class="token operator">=</span> pygame<span class="token punctuation">.</span>Rect<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span> text_size_x<span class="token operator">*</span>i<span class="token operator">/</span>self<span class="token punctuation">.</span>video_fps<span class="token punctuation">,</span> text_size_y<span class="token punctuation">)</span> <span class="token comment">#可见区域</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
visible_area <span class="token operator">=</span> pygame<span class="token punctuation">.</span>Rect<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span> text_size_x<span class="token punctuation">,</span> text_size_y<span class="token punctuation">)</span>
screen<span class="token punctuation">.</span>blit<span class="token punctuation">(</span>textImage<span class="token punctuation">,</span> <span class="token punctuation">(</span>pos_x<span class="token punctuation">,</span> pos_y<span class="token punctuation">)</span><span class="token punctuation">,</span> visible_area<span class="token punctuation">)</span>
pygame<span class="token punctuation">.</span>display<span class="token punctuation">.</span>update<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">#刷新显示</span>
<span class="token comment">#录屏</span>
im <span class="token operator">=</span> ImageGrab<span class="token punctuation">.</span>grab<span class="token punctuation">(</span><span class="token punctuation">)</span>
imm<span class="token operator">=</span>cv2<span class="token punctuation">.</span>cvtColor<span class="token punctuation">(</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>im<span class="token punctuation">)</span><span class="token punctuation">,</span> cv2<span class="token punctuation">.</span>COLOR_RGB2BGR<span class="token punctuation">)</span><span class="token comment">#转为opencv的BGR格式</span>
video<span class="token punctuation">.</span>write<span class="token punctuation">(</span>imm<span class="token punctuation">)</span>
<span class="token comment">#帧率</span>
FPSClock<span class="token punctuation">.</span>tick<span class="token punctuation">(</span>self<span class="token punctuation">.</span>fps<span class="token punctuation">)</span>
<span class="token comment"># pygame.quit()</span>
<span class="token comment"># sys.exit()</span>
<span class="token comment">#循环跌打绘制每帧数据</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'开始循环跌打绘制每帧数据!!!'</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> frame <span class="token keyword">in</span> tqdm<span class="token punctuation">(</span>all_frame_data<span class="token punctuation">.</span>columns<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">for</span> event <span class="token keyword">in</span> pygame<span class="token punctuation">.</span>event<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> event<span class="token punctuation">.</span><span class="token builtin">type</span> <span class="token operator">==</span> QUIT<span class="token punctuation">:</span>
pygame<span class="token punctuation">.</span>quit<span class="token punctuation">(</span><span class="token punctuation">)</span>
sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment">#背景颜色为白色</span>
screen<span class="token punctuation">.</span>fill<span class="token punctuation">(</span>self<span class="token punctuation">.</span>background_color<span class="token punctuation">)</span>
<span class="token comment">#当前帧数据</span>
current_frame_data <span class="token operator">=</span> all_frame_data<span class="token punctuation">[</span><span class="token punctuation">[</span>frame<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sort_values<span class="token punctuation">(</span>by <span class="token operator">=</span> frame<span class="token punctuation">,</span> ascending<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
<span class="token comment">#当前帧时间</span>
frame_time <span class="token operator">=</span> current_frame_data<span class="token punctuation">.</span>columns<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">]</span>
frame_time <span class="token operator">=</span> frame_time<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">'/'</span><span class="token operator">+</span>frame_time<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">:</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">'/'</span><span class="token operator">+</span>frame_time<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">:</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">' '</span> <span class="token operator">+</span> frame_time<span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">:</span><span class="token number">10</span><span class="token punctuation">]</span><span class="token operator">+</span><span class="token string">':'</span><span class="token operator">+</span>frame_time<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">:</span><span class="token punctuation">]</span>
<span class="token comment">#temp_previous_frame_data记录位置数据</span>
temp_index <span class="token operator">=</span> current_frame_data<span class="token punctuation">[</span>current_frame_data<span class="token punctuation">[</span>frame<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>index
temp_previous_frame_data <span class="token operator">=</span> pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span>index <span class="token operator">=</span> temp_index<span class="token punctuation">,</span> columns <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'pos_x'</span><span class="token punctuation">,</span><span class="token string">'pos_y'</span><span class="token punctuation">,</span> <span class="token string">'size_x'</span><span class="token punctuation">,</span> <span class="token string">'size_y'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> hotness_title_number<span class="token punctuation">)</span><span class="token punctuation">:</span>
text <span class="token operator">=</span> current_frame_data<span class="token punctuation">.</span>index<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token comment">#热搜文本</span>
hotness_number <span class="token operator">=</span> current_frame_data<span class="token punctuation">.</span>iloc<span class="token punctuation">[</span>i<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span> <span class="token comment">#热度</span>
<span class="token keyword">if</span> hotness_number <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>
<span class="token keyword">continue</span>
<span class="token comment">#设置字体颜色,默认黑色</span>
text_color <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
<span class="token comment">#设置图元颜色以及椭圆尺寸</span>
<span class="token keyword">if</span> hotness_number <span class="token operator"><</span> <span class="token number">1E4</span><span class="token punctuation">:</span>
color <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">#椭圆填充颜色</span>
size_x <span class="token operator">=</span> <span class="token number">40</span> <span class="token comment">#确定椭圆尺寸,size是椭圆的矩形尺寸</span>
<span class="token keyword">elif</span> hotness_number <span class="token operator">>=</span> <span class="token number">1E4</span> <span class="token keyword">and</span> hotness_number <span class="token operator"><</span> <span class="token number">2E5</span><span class="token punctuation">:</span>
R_color <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>hotness_number<span class="token operator">-</span><span class="token number">1E4</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">1.9E5</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">128</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
color <span class="token operator">=</span> <span class="token punctuation">(</span>R_color<span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
size_x <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>math<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>hotness_number<span class="token operator">/</span><span class="token number">25000000</span><span class="token punctuation">)</span><span class="token operator">*</span>self<span class="token punctuation">.</span>screen_width<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment">#确定椭圆尺寸,size_x是椭圆的矩形长边尺寸</span>
<span class="token keyword">elif</span> hotness_number <span class="token operator">>=</span> <span class="token number">2E5</span> <span class="token keyword">and</span> hotness_number <span class="token operator"><</span> <span class="token number">1E6</span><span class="token punctuation">:</span>
R_color <span class="token operator">=</span> <span class="token number">127</span> <span class="token operator">+</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>hotness_number<span class="token operator">-</span><span class="token number">2E5</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">8E5</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">128</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
color <span class="token operator">=</span> <span class="token punctuation">(</span>R_color<span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
size_x <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>math<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>hotness_number<span class="token operator">/</span><span class="token number">25000000</span><span class="token punctuation">)</span><span class="token operator">*</span>self<span class="token punctuation">.</span>screen_width<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
<span class="token keyword">elif</span> hotness_number <span class="token operator">>=</span> <span class="token number">1E6</span> <span class="token keyword">and</span> hotness_number <span class="token operator"><</span><span class="token number">5E6</span><span class="token punctuation">:</span>
G_color <span class="token operator">=</span> <span class="token number">128</span> <span class="token operator">-</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>hotness_number<span class="token operator">-</span><span class="token number">1E6</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">4E6</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">128</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
color <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> G_color<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
size_x <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>math<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>hotness_number<span class="token operator">/</span><span class="token number">25000000</span><span class="token punctuation">)</span><span class="token operator">*</span>self<span class="token punctuation">.</span>screen_width<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
<span class="token keyword">elif</span> hotness_number <span class="token operator">>=</span> <span class="token number">5E6</span> <span class="token keyword">and</span> hotness_number <span class="token operator"><</span> <span class="token number">1.5E7</span><span class="token punctuation">:</span>
R_color <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>hotness_number<span class="token operator">-</span><span class="token number">5E6</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">1E7</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">128</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
color <span class="token operator">=</span> <span class="token punctuation">(</span>R_color<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
size_x <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>math<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>hotness_number<span class="token operator">/</span><span class="token number">25000000</span><span class="token punctuation">)</span><span class="token operator">*</span>self<span class="token punctuation">.</span>screen_width<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
<span class="token keyword">elif</span> hotness_number <span class="token operator">>=</span> <span class="token number">1.5E7</span> <span class="token keyword">and</span> hotness_number <span class="token operator"><</span> <span class="token number">2E8</span><span class="token punctuation">:</span>
R_color <span class="token operator">=</span> <span class="token number">128</span> <span class="token operator">-</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>hotness_number<span class="token operator">-</span><span class="token number">1.5E7</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">1.85E8</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">128</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
color <span class="token operator">=</span> <span class="token punctuation">(</span>R_color<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
text_color <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">)</span>
size_x <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token number">0.775</span><span class="token operator">+</span>math<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>hotness_number<span class="token operator">/</span><span class="token number">2E8</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">*</span>self<span class="token punctuation">.</span>screen_width<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
color <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
text_color <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">)</span>
size_x <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>self<span class="token punctuation">.</span>screen_width<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
size_y <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>size_x<span class="token operator">*</span>self<span class="token punctuation">.</span>screen_ratio<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
<span class="token comment">#确定椭圆位置</span>
<span class="token keyword">if</span> previous_frame_data <span class="token keyword">is</span> <span class="token boolean">None</span><span class="token punctuation">:</span>
pos_x<span class="token punctuation">,</span> pos_y <span class="token operator">=</span> self<span class="token punctuation">.</span>calculate_localtion<span class="token punctuation">(</span>temp_previous_frame_data<span class="token punctuation">,</span> <span class="token number">0.8</span><span class="token punctuation">,</span> size_x<span class="token punctuation">,</span> size_y<span class="token punctuation">)</span>
<span class="token comment">#创建previous_frame_data</span>
temp_previous_frame_data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>text<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span>pos_x<span class="token punctuation">,</span> pos_y<span class="token punctuation">,</span> size_x<span class="token punctuation">,</span> size_y<span class="token punctuation">]</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
<span class="token comment">#如果前一帧有则位置不变</span>
<span class="token keyword">if</span> text <span class="token keyword">in</span> previous_frame_data<span class="token punctuation">.</span>index<span class="token punctuation">:</span>
pos_x <span class="token operator">=</span> previous_frame_data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>text<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'pos_x'</span><span class="token punctuation">]</span>
pos_y <span class="token operator">=</span> previous_frame_data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>text<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'pos_y'</span><span class="token punctuation">]</span>
<span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token comment">#没有则随机位置</span>
pos_x<span class="token punctuation">,</span> pos_y <span class="token operator">=</span> self<span class="token punctuation">.</span>calculate_localtion<span class="token punctuation">(</span>previous_frame_data<span class="token punctuation">,</span> <span class="token number">0.8</span><span class="token punctuation">,</span> size_x<span class="token punctuation">,</span> size_y<span class="token punctuation">)</span>
<span class="token comment">#temp_previous_frame_data记录位置数据</span>
temp_previous_frame_data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>text<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span>pos_x<span class="token punctuation">,</span> pos_y<span class="token punctuation">,</span> size_x<span class="token punctuation">,</span> size_y<span class="token punctuation">]</span>
<span class="token comment">#绘制椭圆</span>
pygame<span class="token punctuation">.</span>draw<span class="token punctuation">.</span>ellipse<span class="token punctuation">(</span>screen<span class="token punctuation">,</span> color<span class="token punctuation">,</span> <span class="token punctuation">[</span>pos_x<span class="token operator">-</span><span class="token number">0.5</span><span class="token operator">*</span>size_x<span class="token punctuation">,</span> pos_y<span class="token operator">-</span><span class="token number">0.5</span><span class="token operator">*</span>size_y<span class="token punctuation">,</span> size_x<span class="token punctuation">,</span> size_y<span class="token punctuation">]</span><span class="token punctuation">)</span>
pygame<span class="token punctuation">.</span>draw<span class="token punctuation">.</span>ellipse<span class="token punctuation">(</span>screen<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>pos_x<span class="token operator">-</span><span class="token number">0.5</span><span class="token operator">*</span>size_x<span class="token punctuation">,</span> pos_y<span class="token operator">-</span><span class="token number">0.5</span><span class="token operator">*</span>size_y<span class="token punctuation">,</span> size_x<span class="token punctuation">,</span> size_y<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span>
<span class="token comment">#绘制文字,首先根据长度切割文本</span>
<span class="token keyword">if</span> <span class="token builtin">len</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token operator"><</span><span class="token number">7</span><span class="token punctuation">:</span> <span class="token comment">#根据字数划分text,长于7个字符则分割</span>
text_top <span class="token operator">=</span> <span class="token boolean">None</span>
text_center <span class="token operator">=</span> text
text_bottom <span class="token operator">=</span> <span class="token boolean">None</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
split <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>math<span class="token punctuation">.</span>ceil<span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">3</span><span class="token operator">/</span><span class="token number">7</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#中间字段字数</span>
first <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>math<span class="token punctuation">.</span>ceil<span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token operator">-</span>split<span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">)</span>
text_top <span class="token operator">=</span> text<span class="token punctuation">[</span><span class="token punctuation">:</span>first<span class="token punctuation">]</span>
text_center <span class="token operator">=</span> text<span class="token punctuation">[</span>first<span class="token punctuation">:</span>first<span class="token operator">+</span>split<span class="token punctuation">]</span>
text_bottom <span class="token operator">=</span> text<span class="token punctuation">[</span>first<span class="token operator">+</span>split<span class="token punctuation">:</span><span class="token punctuation">]</span>
<span class="token comment">#根据热度和是否分割字符串确定字符显示大小</span>
<span class="token keyword">if</span> text_top <span class="token keyword">is</span> <span class="token boolean">None</span><span class="token punctuation">:</span>
text_size <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>size_x<span class="token operator">/</span><span class="token builtin">len</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> <span class="token builtin">len</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">9</span><span class="token punctuation">:</span>
text_size <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token number">0.6</span><span class="token operator">*</span>size_x<span class="token operator">/</span><span class="token builtin">len</span><span class="token punctuation">(</span>text_center<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">elif</span> <span class="token builtin">len</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">11</span><span class="token punctuation">:</span>
text_size <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token number">0.7</span><span class="token operator">*</span>size_x<span class="token operator">/</span><span class="token builtin">len</span><span class="token punctuation">(</span>text_center<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
text_size <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">round</span><span class="token punctuation">(</span>size_x<span class="token operator">/</span><span class="token builtin">len</span><span class="token punctuation">(</span>text_center<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">#确定文字格式和大小</span>
my_font <span class="token operator">=</span> pygame<span class="token punctuation">.</span>font<span class="token punctuation">.</span>Font<span class="token punctuation">(</span>self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">r'\STXINGKA.TTF'</span><span class="token punctuation">,</span>text_size<span class="token punctuation">)</span>
<span class="token comment">#绘制文本</span>
<span class="token keyword">if</span> text_top <span class="token keyword">is</span> <span class="token keyword">not</span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token comment">#新建文本图章</span>
textImage <span class="token operator">=</span> my_font<span class="token punctuation">.</span>render<span class="token punctuation">(</span>text_top<span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">,</span> text_color<span class="token punctuation">)</span>
<span class="token comment">#文本框尺寸</span>
text_size_x<span class="token punctuation">,</span> text_size_y <span class="token operator">=</span> textImage<span class="token punctuation">.</span>get_size<span class="token punctuation">(</span><span class="token punctuation">)</span>
screen<span class="token punctuation">.</span>blit<span class="token punctuation">(</span>textImage<span class="token punctuation">,</span> <span class="token punctuation">(</span>pos_x <span class="token operator">-</span> <span class="token number">0.5</span><span class="token operator">*</span>text_size_x<span class="token punctuation">,</span> pos_y <span class="token operator">-</span> <span class="token number">1.3</span><span class="token operator">*</span>text_size_y<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> text_bottom <span class="token keyword">is</span> <span class="token keyword">not</span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token comment">#新建文本图章</span>
textImage <span class="token operator">=</span> my_font<span class="token punctuation">.</span>render<span class="token punctuation">(</span>text_bottom<span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">,</span> text_color<span class="token punctuation">)</span>
<span class="token comment">#文本框尺寸</span>
text_size_x<span class="token punctuation">,</span> text_size_y <span class="token operator">=</span> textImage<span class="token punctuation">.</span>get_size<span class="token punctuation">(</span><span class="token punctuation">)</span>
screen<span class="token punctuation">.</span>blit<span class="token punctuation">(</span>textImage<span class="token punctuation">,</span> <span class="token punctuation">(</span>pos_x <span class="token operator">-</span> <span class="token number">0.5</span><span class="token operator">*</span>text_size_x<span class="token punctuation">,</span> pos_y <span class="token operator">+</span> <span class="token number">0.3</span><span class="token operator">*</span>text_size_y<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">#新建文本图章</span>
textImage <span class="token operator">=</span> my_font<span class="token punctuation">.</span>render<span class="token punctuation">(</span>text_center<span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">,</span> text_color<span class="token punctuation">)</span>
<span class="token comment">#文本框尺寸</span>
text_size_x<span class="token punctuation">,</span> text_size_y <span class="token operator">=</span> textImage<span class="token punctuation">.</span>get_size<span class="token punctuation">(</span><span class="token punctuation">)</span>
screen<span class="token punctuation">.</span>blit<span class="token punctuation">(</span>textImage<span class="token punctuation">,</span> <span class="token punctuation">(</span>pos_x <span class="token operator">-</span> <span class="token number">0.5</span><span class="token operator">*</span>text_size_x<span class="token punctuation">,</span> pos_y <span class="token operator">-</span> <span class="token number">0.5</span><span class="token operator">*</span>text_size_y<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment">#确定备注文字格式和大小</span>
my_font <span class="token operator">=</span> pygame<span class="token punctuation">.</span>font<span class="token punctuation">.</span>Font<span class="token punctuation">(</span>self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">'\STXINGKA.TTF'</span><span class="token punctuation">,</span><span class="token number">40</span><span class="token punctuation">)</span>
<span class="token comment">#确定文本框背景颜色</span>
<span class="token keyword">if</span> text_color <span class="token operator">==</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
bcolor <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">)</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
bcolor <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span>
textImage <span class="token operator">=</span> my_font<span class="token punctuation">.</span>render<span class="token punctuation">(</span>frame_time<span class="token punctuation">,</span> <span class="token boolean">True</span><span class="token punctuation">,</span> text_color<span class="token punctuation">,</span> bcolor<span class="token punctuation">)</span>
<span class="token comment">#文本框尺寸</span>
text_size_x<span class="token punctuation">,</span> text_size_y <span class="token operator">=</span> textImage<span class="token punctuation">.</span>get_size<span class="token punctuation">(</span><span class="token punctuation">)</span>
screen<span class="token punctuation">.</span>blit<span class="token punctuation">(</span>textImage<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>screen_height<span class="token operator">-</span><span class="token number">44</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
previous_frame_data <span class="token operator">=</span> temp_previous_frame_data
pygame<span class="token punctuation">.</span>display<span class="token punctuation">.</span>update<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment">#录屏</span>
im <span class="token operator">=</span> ImageGrab<span class="token punctuation">.</span>grab<span class="token punctuation">(</span><span class="token punctuation">)</span>
imm<span class="token operator">=</span>cv2<span class="token punctuation">.</span>cvtColor<span class="token punctuation">(</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>im<span class="token punctuation">)</span><span class="token punctuation">,</span> cv2<span class="token punctuation">.</span>COLOR_RGB2BGR<span class="token punctuation">)</span><span class="token comment">#转为opencv的BGR格式</span>
video<span class="token punctuation">.</span>write<span class="token punctuation">(</span>imm<span class="token punctuation">)</span>
<span class="token comment">#帧率</span>
FPSClock<span class="token punctuation">.</span>tick<span class="token punctuation">(</span>self<span class="token punctuation">.</span>fps<span class="token punctuation">)</span>
video<span class="token punctuation">.</span>release<span class="token punctuation">(</span><span class="token punctuation">)</span>
pygame<span class="token punctuation">.</span>quit<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">hotness_data_settle</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''
根据输入日期将数据划分, 插值为对应的帧数,输出插值后的整合数据
Returns
-------
DataFrame, 整理合并后的热度数据.
'''</span>
<span class="token keyword">try</span><span class="token punctuation">:</span>
data_current <span class="token operator">=</span> pd<span class="token punctuation">.</span>read_csv<span class="token punctuation">(</span>self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">r'\data\%s.csv'</span><span class="token operator">%</span>self<span class="token punctuation">.</span>date<span class="token punctuation">,</span> index_col<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">#前一天热度数据</span>
data_next <span class="token operator">=</span> pd<span class="token punctuation">.</span>read_csv<span class="token punctuation">(</span>self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">'\data\%s.csv'</span><span class="token operator">%</span>self<span class="token punctuation">.</span>next_date<span class="token punctuation">,</span> index_col<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">#后一天热度数据</span>
<span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span>
sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment">#截取需要的时间段热度数据</span>
data_current <span class="token operator">=</span> data_current<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>data_current<span class="token punctuation">.</span>index <span class="token operator">>=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>starttime<span class="token punctuation">)</span><span class="token punctuation">]</span>
data_next <span class="token operator">=</span> data_next<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>data_next<span class="token punctuation">.</span>index <span class="token operator"><=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>starttime<span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token comment">#热度数据时间标准化</span>
data_current<span class="token punctuation">.</span>index <span class="token operator">=</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>date<span class="token operator">+</span><span class="token string">'0'</span><span class="token operator">*</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token operator">-</span><span class="token builtin">len</span><span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token builtin">str</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token keyword">for</span> x <span class="token keyword">in</span> data_current<span class="token punctuation">.</span>index<span class="token punctuation">]</span>
data_next<span class="token punctuation">.</span>index <span class="token operator">=</span> <span class="token punctuation">[</span>self<span class="token punctuation">.</span>next_date<span class="token operator">+</span><span class="token string">'0'</span><span class="token operator">*</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token operator">-</span><span class="token builtin">len</span><span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token builtin">str</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token keyword">for</span> x <span class="token keyword">in</span> data_next<span class="token punctuation">.</span>index<span class="token punctuation">]</span>
all_data <span class="token operator">=</span> data_current<span class="token punctuation">.</span>append<span class="token punctuation">(</span>data_next<span class="token punctuation">)</span> <span class="token comment">#合并热度数据</span>
all_frame_data <span class="token operator">=</span> pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'开始进行数据整理合并!!!'</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token keyword">in</span> tqdm<span class="token punctuation">(</span><span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>all_data<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
data_early <span class="token operator">=</span> <span class="token builtin">list</span><span class="token punctuation">(</span>all_data<span class="token punctuation">.</span>iloc<span class="token punctuation">[</span>i<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">#前一帧数据</span>
data_latter <span class="token operator">=</span> <span class="token builtin">list</span><span class="token punctuation">(</span>all_data<span class="token punctuation">.</span>iloc<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">#后一帧数据</span>
time_early <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>all_data<span class="token punctuation">.</span>index<span class="token punctuation">[</span>i<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">#前一帧时间</span>
time_latter <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>all_data<span class="token punctuation">.</span>index<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment">#后一帧时间</span>
time_early <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>strptime<span class="token punctuation">(</span>time_early<span class="token punctuation">,</span> <span class="token string">'%Y%m%d%H%M'</span><span class="token punctuation">)</span>
time_latter <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>strptime<span class="token punctuation">(</span>time_latter<span class="token punctuation">,</span> <span class="token string">'%Y%m%d%H%M'</span><span class="token punctuation">)</span>
time_difference <span class="token operator">=</span> time_latter <span class="token operator">-</span> time_early <span class="token comment">#时间差</span>
time_list <span class="token operator">=</span> <span class="token punctuation">[</span>time_early<span class="token operator">+</span>datetime<span class="token punctuation">.</span>timedelta<span class="token punctuation">(</span>seconds<span class="token operator">=</span><span class="token number">30</span><span class="token operator">*</span>x<span class="token punctuation">)</span> <span class="token keyword">for</span> x <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>time_difference<span class="token punctuation">.</span>total_seconds<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
time_list <span class="token operator">=</span> <span class="token punctuation">[</span>datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span>x<span class="token punctuation">,</span> <span class="token string">'%Y%m%d%H%M%S'</span><span class="token punctuation">)</span> <span class="token keyword">for</span> x <span class="token keyword">in</span> time_list<span class="token punctuation">]</span>
data_frame <span class="token operator">=</span> pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span>columns<span class="token operator">=</span>time_list<span class="token punctuation">)</span>
<span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
text_early <span class="token operator">=</span> data_early<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>j<span class="token punctuation">]</span>
hotness_early <span class="token operator">=</span> data_early<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span>
<span class="token keyword">if</span> text_early <span class="token keyword">in</span> data_latter<span class="token punctuation">:</span> <span class="token comment">#前后都有一样的text的话插值,每5min10帧</span>
hotness_latter <span class="token operator">=</span> data_latter<span class="token punctuation">[</span>data_latter<span class="token punctuation">.</span>index<span class="token punctuation">(</span>text_early<span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span>
frame_increment <span class="token operator">=</span> <span class="token punctuation">(</span>hotness_latter <span class="token operator">-</span> hotness_early<span class="token punctuation">)</span><span class="token operator">/</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>time_list<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">#每帧增加的热度 </span>
data_frame<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>text_early<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span>hotness_early <span class="token operator">+</span> x<span class="token operator">*</span>frame_increment <span class="token keyword">for</span> x <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token builtin">len</span><span class="token punctuation">(</span>time_list<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token comment">#后面没有则10,8,6,4,2,0插值</span>
frame_increment <span class="token operator">=</span> <span class="token number">2</span><span class="token operator">*</span>hotness_latter<span class="token operator">/</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>time_list<span class="token punctuation">)</span><span class="token punctuation">)</span>
middle_point <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token number">0.5</span><span class="token operator">*</span><span class="token builtin">len</span><span class="token punctuation">(</span>time_list<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">1</span> <span class="token comment">#分割中间点</span>
list_head <span class="token operator">=</span> <span class="token punctuation">[</span>hotness_early <span class="token operator">+</span> x<span class="token operator">*</span>frame_increment <span class="token keyword">for</span> x <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> middle_point<span class="token punctuation">)</span><span class="token punctuation">]</span>
data_frame<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>text_early<span class="token punctuation">]</span> <span class="token operator">=</span> list_head <span class="token operator">+</span> <span class="token punctuation">[</span><span class="token number">0</span> <span class="token keyword">for</span> x <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> middle_point<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
<span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
text_latter <span class="token operator">=</span> data_latter<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>j<span class="token punctuation">]</span>
<span class="token keyword">if</span> text_latter <span class="token keyword">in</span> data_frame<span class="token punctuation">.</span>index<span class="token punctuation">:</span>
<span class="token keyword">pass</span>
<span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token comment">#前面没有的话则后面插值</span>
hotness_latter <span class="token operator">=</span> data_latter<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span>
frame_increment <span class="token operator">=</span> <span class="token number">2</span><span class="token operator">*</span>hotness_latter<span class="token operator">/</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>time_list<span class="token punctuation">)</span><span class="token punctuation">)</span>
middle_point <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token number">0.5</span><span class="token operator">*</span><span class="token builtin">len</span><span class="token punctuation">(</span>time_list<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">1</span> <span class="token comment">#分割中间点</span>
list_tail <span class="token operator">=</span> <span class="token punctuation">[</span>x<span class="token operator">*</span>frame_increment <span class="token keyword">for</span> x <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> middle_point<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
data_frame<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>text_latter<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span> <span class="token keyword">for</span> x <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> middle_point<span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator">+</span> list_tail
all_frame_data <span class="token operator">=</span> pd<span class="token punctuation">.</span>concat<span class="token punctuation">(</span><span class="token punctuation">[</span>all_frame_data<span class="token punctuation">,</span> data_frame<span class="token punctuation">]</span><span class="token punctuation">,</span> axis <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> join<span class="token operator">=</span><span class="token string">'outer'</span><span class="token punctuation">,</span> sort<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">)</span>
all_frame_data<span class="token punctuation">.</span>fillna<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
<span class="token keyword">return</span><span class="token punctuation">(</span>all_frame_data<span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">calculate_localtion</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> data<span class="token punctuation">,</span> space_level<span class="token punctuation">,</span> size_x<span class="token punctuation">,</span> size_y<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''
根据给定的已存在图元的x/y坐标数据计算新图元的坐标数据
Parameters
----------
data : DataFrame
已存在图元的x/y坐标数据.
space_level : DataFrame
图元间间距等级.
size_x : Float
当前图元x坐标.
size_y : Float
当前图元y坐标.
Returns
-------
pos_x : float
新图元的x坐标.
pos_y : float
新图元的y坐标.
'''</span>
<span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
pos_x <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>random<span class="token punctuation">.</span>uniform<span class="token punctuation">(</span>self<span class="token punctuation">.</span>screen_width<span class="token operator">*</span><span class="token number">0.1</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>screen_width<span class="token operator">*</span><span class="token number">0.9</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
pos_y <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>random<span class="token punctuation">.</span>uniform<span class="token punctuation">(</span>self<span class="token punctuation">.</span>screen_height<span class="token operator">*</span><span class="token number">0.1</span><span class="token punctuation">,</span> self<span class="token punctuation">.</span>screen_height<span class="token operator">*</span><span class="token number">0.9</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>
flag <span class="token operator">=</span> <span class="token number">0</span> <span class="token comment">#flag</span>
<span class="token keyword">for</span> index <span class="token keyword">in</span> data<span class="token punctuation">.</span>index<span class="token punctuation">:</span>
previous_pos_x <span class="token operator">=</span> data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'pos_x'</span><span class="token punctuation">]</span>
previous_pos_y <span class="token operator">=</span> data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'pos_y'</span><span class="token punctuation">]</span>
previous_size_x <span class="token operator">=</span> data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'size_x'</span><span class="token punctuation">]</span>
previous_size_y <span class="token operator">=</span> data<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>index<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'size_y'</span><span class="token punctuation">]</span>
<span class="token keyword">if</span> <span class="token builtin">abs</span><span class="token punctuation">(</span>pos_x<span class="token operator">-</span>previous_pos_x<span class="token punctuation">)</span> <span class="token operator"><</span> space_level<span class="token operator">*</span><span class="token builtin">abs</span><span class="token punctuation">(</span>previous_size_x<span class="token operator">+</span>size_x<span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token builtin">abs</span><span class="token punctuation">(</span>pos_y<span class="token operator">-</span>previous_pos_y<span class="token punctuation">)</span> <span class="token operator"><</span> space_level<span class="token operator">*</span><span class="token builtin">abs</span><span class="token punctuation">(</span>previous_size_y<span class="token operator">+</span>size_y<span class="token punctuation">)</span><span class="token punctuation">:</span>
flag <span class="token operator">=</span> <span class="token number">1</span> <span class="token comment">#如果间距过近则flag=1,终止迭代</span>
<span class="token keyword">break</span>
<span class="token keyword">if</span> flag <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> pos_x<span class="token punctuation">,</span> pos_y
<span class="token keyword">return</span> pos_x<span class="token punctuation">,</span> pos_y <span class="token comment">#迭代后依旧未找到合适的值则返回随机值</span>
<span class="token keyword">def</span> <span class="token function">add_BGM</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token triple-quoted-string string">'''
为hotness_video函数生成的视频添加BGM
Returns
-------
None.
'''</span>
video_path <span class="token operator">=</span> self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">'\VIDEO\%s.avi'</span><span class="token operator">%</span>self<span class="token punctuation">.</span>date
BGM_path <span class="token operator">=</span> self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">'\BGM\专题片纪录片常用流行音乐-大气恢弘有气质-公司介绍(Corp_爱给网_aigei_com.mp3'</span>
video <span class="token operator">=</span> mpe<span class="token punctuation">.</span>VideoFileClip<span class="token punctuation">(</span>video_path<span class="token punctuation">)</span>
video_duration <span class="token operator">=</span> video<span class="token punctuation">.</span>duration
audio_clip <span class="token operator">=</span> mpe<span class="token punctuation">.</span>AudioFileClip<span class="token punctuation">(</span>BGM_path<span class="token punctuation">)</span><span class="token punctuation">.</span>set_end<span class="token punctuation">(</span>video_duration<span class="token punctuation">)</span>
video <span class="token operator">=</span> video<span class="token punctuation">.</span>set_audio<span class="token punctuation">(</span>audio_clip<span class="token punctuation">)</span>
export_video_path <span class="token operator">=</span> self<span class="token punctuation">.</span>folder_path <span class="token operator">+</span> <span class="token string">'\VIDEO\%sX.mp4'</span><span class="token operator">%</span>self<span class="token punctuation">.</span>date
video<span class="token punctuation">.</span>write_videofile<span class="token punctuation">(</span>export_video_path<span class="token punctuation">)</span>
<span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span>
yesterday <span class="token operator">=</span> datetime<span class="token punctuation">.</span>datetime<span class="token punctuation">.</span>today<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> datetime<span class="token punctuation">.</span>timedelta<span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>
yesterday <span class="token operator">=</span> yesterday<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">'%Y%m%d'</span><span class="token punctuation">)</span>
video <span class="token operator">=</span> WeiboHotnessVideo<span class="token punctuation">(</span>yesterday<span class="token punctuation">)</span>
</code></pre></p>
为了提升视频的吸引力,必须加入背景音乐。需依据视频所传达的氛围与主题,挑选恰当的乐曲。例如,选用欢快的旋律可映衬热门且有趣的搜索动态,而柔和的曲调则适宜表现较为庄重的搜索状况。
引入背景音乐不仅可提升视频的吸引力,同时亦有助于观众更深入地沉浸在观看体验中。音乐与视频画面的协调配合,能够更加形象地展示微博热搜数据动态所传递的信息。
最终视频效果
经过一系列处理,所生成的视频直观呈现了微博热搜数据的动态走向。观众能够明确观察到,在各个时间点,哪些热搜词条的热度在上升,哪些则在下降。相较于仅观察文字数据,这种视觉化的展示方法更为直观且易于理解。
生成的视频不仅可被保存,便于后续的查阅与剖析,而且对于研究社交媒体的热门动态和记录特定时间点的网络焦点均具有重要意义。
实际案例分析
2021年12月30日的微博热搜中,数据通过视频形式呈现,使我们能够全面把握当天的热搜动态。视频揭示,众多明星相关话题热度显著,与此同时,社会热点事件的热度亦呈现波动。
通过具体案例分析,我们深刻体会到视频化热搜数据的实际效用。这一方式有助于媒体更精准地把握舆论走向,同时让大众对网络热点趋势有更深入的认识。
您认为将微博热门话题数据转化为视频形式,对洞察网络热点有何益处?欢迎在评论区发表您的看法。同时,请不要忘记点赞并转发本篇文章。 |
|