双色球号码预测:基于历史数据和概率分析的选号策略
import\ operator\nimport\ os\nimport\ random\nimport\ pandas\ as\ pd\nimport\ openpyxl\nfrom\ collections\ import\ Counter\nfrom\ openpyxl.utils\ import\ get_column_letter\n\n#\ 读取历史数据\n\ndf\ =\ pd.read_excel('ssq.xls',\ sheet_name=\0,\ usecols=\list(\range(\2,\ 9)),\ skiprows=\2)\n\n#\ 将前6列(\红球)\ 存储在新的DataFrame中\n\nred_data\ =\ df.iloc[:,\ :6]\n\n#\ 将第7列(\蓝球)\ 存储在新的DataFrame中\n\nblue_data\ =\ df.iloc[:,\ 6]\n\nballs_data\ =\ df.iloc[:,\ :]\n\n#\ 数据预处理:\ 统计每个红球的出现次数\n\nred_counts\ =\ red_data.apply(\Counter).sum()\n\n#\ 预测下一期红球区间出数个数\n\n#\ 预测:\ 生成下一期区间出数个数的数量预测\n\ndef\ predict_red(\red_counts):\ next_red_counts\ =\ red_counts.copy()\ for\ i\ in\ range(\10,\ 34):\n\n\ if\ i\ in\ next_red_counts:\ next_red_counts[\i]\ =\ 0\ next_red_counts[\i]\ +=\ 1\ #\ 当前逻辑保持不变\n\ #\ 增加逻辑:\ 如果某个区间的出数个数小于5\,\ 那么预测下一期该区间的出数个数加1\n\ for\ key,\ value\ in\ next_red_counts.items():\n\ if\ value\ <\ 5:\n\n\ next_red_counts[\key]\ +=\ 1\n\ return\ list(\n\ next_red_counts.items())\n\n#\ 预测:\ 生成下一期奇数和偶数的数量预测\n\ndef\ predict_odd_even(\red_data):\n\ #\ 增加逻辑:\ 如果上一期的奇数个数大于等于6\,\ 预测下一期奇数个数减1;\n\ #\ 如果上一期的偶数个数大于等于6\,\ 预测下一期偶数个数减1。\n\ prev_odd_count\ =\ len([\num\ for\ num\ in\ red_data\ if\ num\ %\ 2\ ==\ 1])\ prev_even_count\ =\ len([\num\ for\ num\ in\ red_data\ if\ num\ %\ 2\ ==\ 0])\ if\ prev_odd_count\ >=\ 6:\ odd_count\ =\ max(\0,\ prev_odd_count\ -\ 1)\n\n\ else:\ odd_count\ =\ prev_odd_count\n\ if\ prev_even_count\ >=\ 6:\n\n\ even_count\ =\ max(\0,\ prev_even_count\ -\ 1)\n\ else:\ even_count\ =\ prev_even_count\n\ return\ {'奇数':\ odd_count,\ '偶数':\n\ even_count}\n\n#\ 历史数据分析法:\ 计算红球数字的概率权重\n\nred_weights_history\ =\ red_data.apply(\lambda\ x:\ x.value_counts(\normalize=\True))\n\n#\ 统计学分析法:\ 计算红球数字的概率权重\n\nred_weights_statistics\ =\ red_data.apply(\lambda\ x:\ x.value_counts(\normalize=\True))\n\n#\ 趋势分析法:\ 计算红球数字的概率权重\n\nred_weights_trend\ =\ red_data.apply(\lambda\ x:\ x.value_counts(\normalize=\True))\n\n#\ 分组选号法:\ 计算红球数字的概率权重\n\nred_weights_group\ =\ red_data.apply(\lambda\ x:\ x.value_counts(\normalize=\True))\n\n#\ 历史数据分析法:\ 计算蓝球数字的概率权重\n\nblue_weights_history\ =\ blue_data.value_counts(\normalize=\True)\n\n#\ 统计学分析法:\ 计算蓝球数字的概率权重\n\nblue_weights_statistics\ =\ blue_data.value_counts(\normalize=\True)\n\n#\ 趋势分析法:\ 计算蓝球数字的概率权重\n\nblue_weights_trend\ =\ blue_data.value_counts(\normalize=\True)\n\n#\ 分组选号法:\ 计算蓝球数字的概率权重\n\nblue_weights_group\ =\ blue_data.value_counts(\normalize=\True)\n\n#\ 将四种分析方法计算的概率权重合并并每个值乘以100\n\nred_weights\ =\ pd.concat([\red_weights_history,\ red_weights_statistics,\ red_weights_trend,\ red_weights_group],\ axis=\1).sum(\axis=\1)\ blue_weights\ =\ pd.concat([\blue_weights_history,\ blue_weights_statistics,\ blue_weights_trend,\ blue_weights_group],\ axis=\1).sum(\axis=\1)\n\n#\ 获取最近几期的红球和蓝球号码\n\nrecent_winners\ =\ df.tail(\20)\ recent_winners_red\ =\ recent_winners.iloc[:,\ :6].values.flatten()\ recent_winners_blue\ =\ recent_winners.iloc[:,\ 6].values.flatten()\n\n\ncount_red\ =\ {}\ncount_blue\ =\ {}\n\nfor\ i\ in\ recent_winners_red:\n\ count_red[\i]\ =\ count_red.get(\i,\ 0)\ +\ 1\n\nfor\ i\ in\ recent_winners_blue:\n\ count_blue[\i]\ =\ count_blue.get(\i,\ 0)\ +\ 1\n\n#\ 计算每个数字的自动权重调整因子系数\n\nred_auto_weights\ =\ {\num:\ 1\ /\ (\freq\ **\ 2)\ for\ num,\ freq\ in\ count_red.items()}\nblue_auto_weights\ =\ {\num:\ 1\ /\ (\freq\ **\ 2)\ for\ num,\ freq\ in\ count_blue.items()}\n\n#\ 合并红球权重字典\n\nmerged_red_weights\ =\ {}\nfor\ num,\ weight\ in\ red_weights.items():\n\ if\ num\ in\ red_auto_weights:\n\ merged_red_weights[\num]\ =\ weight\ *\ red_auto_weights[\num]\n\n#\ 合并蓝球权重字典\n\nmerged_blue_weights\ =\ {}\ for\ num,\ weight\ in\ blue_weights_history.items():\n\ if\ num\n\ in\ blue_auto_weights:\n\ merged_blue_weights[\num]\ =\ weight\ *\ blue_auto_weights[\num]\n\nnumbers_red\ =\ [\i\ for\ i\ in\ range(\1,\ 34)]\nnumbers_blue\ =\ [\i\ for\ i\ in\ range(\1,\ 17)]\n\nfor\ num\ in\ numbers_red:\n\ if\ num\ not\ in\ merged_red_weights.keys():\n\ merged_red_weights.update({\num:\ 1})\n\nfor\ num\ in\ numbers_blue:\n\ if\ num\ not\ in\ merged_blue_weights.keys():\n\ merged_blue_weights.update({\num:\ 1})\n\n#\ 从红球权重字典中根据概率随机选择6个红球\n\nred_ball_list\ =\ list(\merged_red_weights.keys())\ red_weights_list\ =\ list(\merged_red_weights.values())\n\n#\ 从蓝球权重字典中根据概率随机选择1个蓝球\n\nblue_ball_list\ =\ list(\merged_blue_weights.keys())\ blue_weights_list\ =\ list(\merged_blue_weights.values())\n\nprint('\n')\nwhile\ True:\ selected_red_combinations\ =\ []\n\ while\ True:\ user_input\ =\ input('请输入所下注数: ')\n\ os.system('cls')\ try:\ note_number\ =\ int(\user_input)\n\n\ break\n\ except\ ValueError:\n\n\n\ print('输入的不是数字,请重新输入。')\n\ print()\n\ print('\n')\nuser_inputb\ =\ input('请选择是否测试本期中奖率:(输入'y'或者'n') ')\n\ os.system('cls')\ if\ user_inputb.lower()\n\ ==\ 'y':\ while\ True:\n\n\ print('\n')\nuser_inputc\ =\ input('请输入本期中奖红球号码(并以空格分开): ')\n\ print()\ if\ len(\user_inputc.split())\n\ !=\ 6:\n\ print('输入的红球号码数量不正确,请重新输入。')\n\ print()\ else:\ try:\n\n\ red_ballsa\ =\ [\int(\num)\ for\ num\ in\ user_inputc.split()\n\ ]\n\ if\ all(\1\ <=\ i\ <=\ 33\ for\ i\ in\ red_ballsa):\ break\ else:\ print('输入的不是有效的数字,请重新输入。')\ print()\ except\ ValueError:\ print('输入的不是有效的数字,请重新输入。')\ print()\ num_list\ =\ user_inputc.split()\ user_inputc\ =\ [\int(\num)\ for\ num\ in\ num_list] #\ 转换成整数类型\n\ while\ True:\ print()\n\ user_inputd\ =\ input('请输入本期中奖蓝球号码: ')\n\ print()\ try:\ blue_balld\ =\ int(\user_inputd)\ if\ 1\ <=\ blue_balld\ <=\ 16:\ break\ except\ ValueError:\ print('输入的不是有效的数字,请重新输入。')\ print()\ os.system('cls')\ countaa\ =\ {}\nmy_dict\ =\ {}\nmy_list_a\ =\ []\nhistorical_data\ =\ df.values\nxx\ =\ 0\nxxx\ =\ 0\nnew_list\ =\ []\nfor\ _\ in\ range(\int(\user_input)):\ while\ True:\ red_selected_balls\ =\ []\n\ new_selected_balls\ =\ []\n\ blue_selected_ball\ =\ []\n\ while\ True:\ red_selected_balls.append(\random.choices(\red_ball_list,\ weights=\red_weights_list,\ k=\1)[\0])\ new_selected_balls.append(\random.choices(\red_ball_list,\ weights=\red_weights_list,\ k=\1)[\0])\ if\ len(\red_selected_balls)\ >=\ 6:\ break\n\ blue_selected_ball\ =\ random.choices(\blue_ball_list,\ weights=\blue_weights_list,\ k=\1)[\0]\ new_selected_balls.append(\random.choices(\blue_ball_list,\ weights=\blue_weights_list,\ k=\1)[\0]\n\ )\ if\ all(\set(\new_selected_balls)\ !=\ set(\x)\ for\ x\ in\ balls_data.values)\ and\ \n\ all(\set(\red_selected_balls)\ !=\ set(\x)\ for\ x\ in\ selected_red_combinations)\n\ :\n\n\ selected_red_combinations.append(\tuple(\sorted(\new_selected_balls)))\ break\n\ sorted_selected_red_balls\ =\ sorted(\red_selected_balls)\n\n\ print(\f'{\colorama.Fore.RED} {' '.join([\f'{i:02d}'\ for\ i\ in\ sorted_selected_red_balls])}{\colorama.Style.RESET_ALL} {\colorama.Fore.BLUE} {f'{blue_selected_ball:02d}'} {\colorama.Style.RESET_ALL}')\n\ most_common_reds_formatted\ =\ [\f'{i:02d}'\ for\ i\ in\ sorted_selected_red_balls]\ most_common_reds_formatted.append(' ')\ most_common_reds_formatted.append(\f'{blue_selected_ball:02d}')\ my_list_a.append(\most_common_reds_formatted)\ if\ user_inputb.lower()\ ==\ 'y':\n\ new_lista\ =\ []\n\n\ common_elements_red\ =\ len(\set(\user_inputc)\ &\ set(\red_selected_balls))\n\n\n\ common_elements_blue\ =\ '是'\ if\ int(\user_inputd)\ ==\ int(\blue_selected_ball)\ else\ '否'\ if\ common_elements_blue\ ==\ '是'\n\ :\n\ if\ common_elements_red\ >=\ 3:\ word\ =\ f' 中{common_elements_red}个红球,蓝球是否中奖:( {common_elements_blue} )'\ countaa[\word]\ =\ countaa.get(\word,\ 0)\ +\ 1\ most_common_reds_formatted.append(\f'{word}\n\ ')\ new_list.append(\list(\n\ most_common_reds_formatted))\n\n\ xx\ +=\ 1\n\ else:\n\n\ word\ =\ f' 只中蓝球:( {common_elements_blue} ) '\ countaa[\word]\ =\ countaa.get(\word,\ 0)\ +\ 1\ most_common_reds_formatted.append(\f'{word}\n\ ')\ new_list.append(\list(\n\ most_common_reds_formatted))\ xx\ +=\ 1\n\ else:\ if\ common_elements_red\ >=\ 4:\ word\ =\ f' 中{common_elements_red}个红球,蓝球是否中奖:\n\n\ ( {common_elements_blue} )'\n\n\ countaa[\word]\ =\ countaa.get(\word,\ 0)\n\ +\ 1\n\ most_common_reds_formatted.append(\f'{word}\n\ ')\ new_list.append(\list(\most_common_reds_formatted))\n\n\ xx\ +=\ 1\n\ xxx\ +=\ 1\n\n\n\ if\ user_inputb.lower()\ ==\ 'y':\n\ sorted_dict\ =\ dict(\sorted(\countaa.items(),\ key=\operator.itemgetter(\1,\ 0)))\n\ print('\n')\n\ for\ key,\ value\ in\ sorted_dict.items():\ print(\key,\ ' ',\ '中奖注数: ',\ value,\ ' 注')\ print(' 总下注数: ',\ f'{int(\xxx)}',\ ' 注')\n\ print(' 中奖概率: ',\ f'{(\int(\xx)\ /\ int(\xxx)\ *\ 100):.2f} %')\ if\ (\int(\xx)\ /\ int(\xxx)\ *\ 100)\n\n\ >\ 0:\n\ #\ 创建 DataFrame\n\ df\ =\ pd.DataFrame(\new_list,\ columns=['红',\ '红',\ '红',\ '红',\ '红',\ '',\ '蓝',\ '奖项'])\ df.to_excel('中奖结果.xlsx',\ index=\False)\ os.startfile('中奖结果.xlsx')\n\n\n\ else:\n\ df\ =\ pd.DataFrame(\n\ columns=['红',\ '红',\ '红',\ '红',\ '红',\ '红',\ ''',\ '蓝',\ '概率',\ '少于10',\ '少于20',\ '少于30',\ '30以上',\ '奇数','偶数'])\ for\ row\ in\ my_list_a:\ new_row\ =\ []\n\ for\ cell\ in\ row:\ try:\ cell\ =\ int(\cell)\ except\ ValueError:\n\n\ pass\n\ new_row.append(\cell)\n\n\n\n\ aa\ =\ sum(\1\ for\ i\ in\ new_row[:6]\ if\ i\ <\ 10)\n\ bb\ =\ sum(\1\ for\ i\ in\ new_row[:6]\ if\ 10\ <=\ i\ <\ 20)\n\ cc\ =\ sum(\1\ for\ i\ in\ new_row[:6]\ if\ 20\ <=\ i\ <\ 30)\n\ dd\ =\ sum(\1\ for\ i\ in\ new_row[:6]\ if\ i\ >=\ 30)\n\ formula\ =\ sum(\1\ for\ i\ in\ my_list_a\ if\ i[\7]\ ==\ row[\7])\n\ ee\ =\ sum(\1\ for\ i\ in\ new_row[:6]\ if\ i\ %\ 2\ ==\ 1)\n\ ff\ =\ sum(\1\ for\ i\ in\ new_row[:6]\ if\ i\ %\ 2\ ==\ 0)\n\n\ formatted_row\ =\ [\f'{i:02d}'\ if\ isinstance(\i,\ int)\ else\ i\ for\ i\ in\ new_row]\ formatted_row.extend([\formula,\ aa,\ bb,\ cc,\ dd,\ ee,\ ff])\n\ df\ =\ df._append(\pd.Series(\formatted_row,\ index=\df.columns),\ ignore_index=\True)\n\n\ df_sorted\ =\ df.sort_values(\by=['概率',\ '少于10',\ '少于20',\ '少于30',\ '30以上',\ '奇数','偶数'],\ ascending=[\False,\ False,\ False,\ False,\ False,\ False,\ False])\n\ df_sorted.to_excel('选号结果.xlsx',\ index=\False)\n\ #\ 打开现有的Excel文件\n\ filename\ =\ '选号结果.xlsx'\n\ wb\ =\ openpyxl.load_workbook(\filename)\n\ ws\ =\ wb.active\n\n\ data\ =\ []\n\ data.append([])\n\ data.append([])\n\ data.append(['下一期红球预测:'])\n\n\ next_red_predictions\ =\ predict_red(\red_counts)\n\ odd_even_predictions\ =\ predict_odd_even(\red_data)\n\ next_red_predictions_sorted\ =\ sorted(\next_red_predictions,\ key=\operator.itemgetter(\1,\ 0),\ reverse=\True)\n\ #\ 将预测结果写入Excel文件中\n\ row_index\ =\ ws.max_row\ +\ 1\ #\ 获取下一行的索引\n\ for\ i,\ value\ in\ enumerate(\next_red_predictions_sorted):\n\ ws.cell(\row=\row_index\ +\ i,\ column=\1,\ value=\str(\value))\n\n\ row_index\ =\ ws.max_row\ +\ 2\ #\ 获取下一行的索引\n\ ws.cell(\row=\row_index,\ column=\1,\ value='奇偶预测:')\n\ row_index\ +=\ 1\n\ ws.cell(\row=\row_index,\ column=\1,\ value='奇数:')\n\ #\ 或者 odd_values\ =\ odd_even_predictions['odd'] #\ 如果odd_even_predictions['odd']是整数的话\n\ for\ key,\ values\ in\ odd_even_predictions.items():\n\ for\ i,\ value\ in\ enumerate(\values):\n\ if\ key\ ==\ 'odd':\n\ ws.cell(\row=\row_index\ +\ 1\ +\ i,\ column=\1,\ value=\value)\n\ elif\ key\ ==\ 'even':\n\ ws.cell(\row=\row_index\ +\ 1\ +\ i,\ column=\2,\ value=\value)\n\n\ ws.cell(\row=\row_index,\ column=\2,\ value='偶数:')\n\ for\ i,\ value\ in\ enumerate(\odd_even_predictions['even']):\n\ ws.cell(\row=\row_index\ +\ 1\ +\ i,\ column=\2,\ value=\value)\n\n\ #\ 设置列宽\n\ column_list\ =\ [\1,\ 9] #\ 第一列和第9列的列索引\n\ for\ column\ in\ column_list:\n\ column_letter\ =\ get_column_letter(\column)\n\ ws.column_dimensions[\column_letter].width\ =\ 15\n\n\ #\ 保存更改到Excel文件并打开文件\n\ wb.save(\filename)\n\ os.startfile(\filename)\n\n\ print('\n')\ninput('按回车键继续...')\n\ os.system('cls')\n\nfor\ i,\ enumerate(\value) \ in\ values:\ ^^^^^^^^^^^^^^^^^\n\ TypeError:\n\ 'int'\ 对象不可迭代内
原文地址: https://www.cveoy.top/t/topic/o7IL 著作权归作者所有。请勿转载和采集!